Annotation of researchv10no/cmd/lcc/ph/d49a.c, revision 1.1.1.1

1.1       root        1: /* The Plum Hall Validation Suite for C
                      2:  * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
                      3:  * VERSION: 4
                      4:  * DATE: 1993-01-01
                      5:  * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
                      6:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
                      7:  * without specific permission from Plum Hall Inc.
                      8:  */
                      9: 
                     10: /*
                     11:  * d49a - formatting tests
                     12:  */
                     13: 
                     14: #include "flags.h"
                     15: #ifndef SKIP49
                     16: #include <stdio.h>
                     17: #define LIB_TEST 1
                     18: #include "defs.h"
                     19: #if ANSI
                     20: #include <float.h>     /* to get DBL_MAX_10_EXP, which non-ANSI machine.h defines */
                     21: #else
                     22: #define remove unlink
                     23: #endif
                     24: char *save_name();
                     25: 
                     26: #define T_0 0          /* no data needed */
                     27: #define T_I1 1         /* int */
                     28: #define T_I2 2         /* int (negative) */
                     29: #define T_L1 3         /* long */
                     30: #define T_SI 4         /* short */
                     31: #define T_D1 5         /* double */
                     32: #define T_P 6          /* char * */
                     33: #define T_S 7          /* string */
                     34: #define T_STAR1 8      /* width as argument */
                     35: #define T_STAR2 9      /* precision as argument */
                     36: #define T_STAR3 10     /* width and precision as arguments */
                     37: #define T_C1 11                /* character */
                     38: #define T_C2 12                /* character */
                     39: #define T_F 13         /* float */
                     40: #define T_U 14         /* unsigned int */
                     41: #define T_D2 15                /* very large double */
                     42: #define T_D3 16                /* double with zero value */
                     43: #define T_D4 17                /* double with integral value */
                     44: #define T_D5 18                /* double with exponent < -4 */
                     45: #define T_D6 19                /* double with exponent == precision */
                     46: #define T_D7 20                /* double with exponent > precision */
                     47: #define T_D8 21                /* long double */
                     48: #define T_SU 22                /* unsigned short */
                     49: #define T_I0 23                /* integer arg with value of 0 */
                     50: #define T_STARD 24     /* width and precision as arguments */
                     51: #define T_STARN 25     /* width and precision with a neg number */
                     52: 
                     53: static int Ival1 = 77;
                     54: static int Ival2 = -77;
                     55: static long Lval1 = 65000;
                     56: static short Sval = 0x7fff;
                     57: static unsigned short Suval = 0x7fff;
                     58: static double Dval1 = 12.3456789;
                     59: static float Fval = 3.0;
                     60: static int *Pval = &Ival1;
                     61: static char *String = "this is a string\n";
                     62: static char Cval = 'a';
                     63: static unsigned int Ui = 65000;
                     64: static double Dval2 = 0.0;     /* assigned dynamically below */
                     65: static double Dval3 = 0.0;
                     66: static double Dval4 = 1.0;
                     67: static double Dval5 = 1.23e-6;
                     68: static double Dval6 = 9.876e+2;
                     69: static double Dval7 = 9.876e+3;
                     70: #if ANSI
                     71: static long double Dval8 = 98.7654L;
                     72: #endif
                     73: void fpsteq();
                     74: 
                     75: 
                     76: static struct output
                     77:        {
                     78:        int type;
                     79:        char *fmt;
                     80:        char *out;
                     81:        int line;
                     82:        } Output[] = 
                     83:                {
                     84:                /* %[-+ #][width|*][precision|*][h|l|L][diouxXfeEgGcspn%] */
                     85: 
                     86:                T_0,    "",                                     "",                                             __LINE__,
                     87:                T_0,    "no format chars",      "no format chars",              __LINE__,
                     88:                T_I1,   "%d",                           "77",                                   __LINE__,
                     89:                T_I1,   "%-3d",                         "77 ",                                  __LINE__,
                     90:                T_I1,   "%+d",                          "+77",                                  __LINE__,
                     91:                T_I2,   "%+d",                          "-77",                                  __LINE__,
                     92:                T_I2,   "%+4d",                         " -77",                                 __LINE__,
                     93:                T_I1,   "% 4d",                         "  77",                                 __LINE__,
                     94:                T_I2,   "% 4d",                         " -77",                                 __LINE__,
                     95:                T_I1,   "% +4d",                        " +77",                                 __LINE__,
                     96:                T_I1,   "%+ 4d",                        " +77",                                 __LINE__,
                     97:                T_I1,   "%+04d",                        "+077",                                 __LINE__, 
                     98:                T_I2,   "%04d",                         "-077",                                 __LINE__, 
                     99:                T_I1,   "%04.2d",                       "  77",                                 __LINE__, 
                    100:                T_I1,   "%.d",                          "77",                                   __LINE__, 
                    101:                T_I1,   "%04.d",                        "  77",                                 __LINE__, 
                    102:                T_I0,   "%.d",                          "",                                             __LINE__, 
                    103:                T_I1,   "%.4d",                         "0077",                                 __LINE__, 
                    104:                T_I1,   "%6.4d",                        "  0077",                               __LINE__, 
                    105:                T_I1,   "% 6.4d",                       "  0077",                               __LINE__, 
                    106:                T_I1,   "%06.4d",                       "  0077",                               __LINE__, 
                    107:                T_I1,   "%3d",                          " 77",                                  __LINE__,
                    108:                T_I1,   "%0d",                          "77",                                   __LINE__,
                    109:                T_I1,   "%1d",                          "77",                                   __LINE__,
                    110:                T_I1,   "%-1d",                         "77",                                   __LINE__,
                    111:                T_I1,   "%x",                           "4d",                                   __LINE__,
                    112:                T_I1,   "%#x",                          "0x4d",                                 __LINE__,
                    113:                T_I1,   "%#X",                          "0X4D",                                 __LINE__,
                    114:                T_I1,   "%o",                           "115",                                  __LINE__, 
                    115:                T_I1,   "%#o",                          "0115",                                 __LINE__,
                    116:                T_I1,   "%d",                           "77",                                   __LINE__,
                    117:                T_I1,   "%u",                           "77",                                   __LINE__,
                    118:                T_I1,   "%.6d",                         "000077",                               __LINE__,
                    119:                T_I1,   "%.d",                          "77",                                   __LINE__,
                    120:                T_I2,   "%.6d",                         "-000077",                              __LINE__,
                    121:                T_I1,   "%.1d",                         "77",                                   __LINE__,
                    122:                T_I1,   "%.6o",                         "000115",                               __LINE__,
                    123:                T_I1,   "%.d",                          "77",                                   __LINE__,
                    124:                T_I1,   "%4.6d",                        "000077",                               __LINE__,
                    125:                T_I1,   "%6.4d",                        "  0077",                               __LINE__,
                    126:                T_I1,   "%-6.4d",                       "0077  ",                               __LINE__,
                    127:                T_I1,   "%06d",                         "000077",                               __LINE__,
                    128:                T_I1,   "%-06d",                        "77    ",                               __LINE__,
                    129:                T_L1,   "%ld",                          "65000",                                __LINE__,
                    130:                T_D1,   "%f",                           "12.345679",                    __LINE__,
                    131:                T_D1,   "%6.3f",                        "12.346",                               __LINE__,
                    132:                T_D1,   "%.0f",                         "12",                                   __LINE__,
                    133:                T_D2,   "%e",                           "1.234568e+100",                __LINE__,
                    134:                T_D2,   "%E",                           "1.234568E+100",                __LINE__,
                    135:                T_D2,   "%.3e",                         "1.235e+100",                   __LINE__,
                    136:                T_D2,   "%.10e",                        "1.2345678900e+100",    __LINE__,
                    137:                T_D1,   "%e",                           "1.234568e+01",                 __LINE__,
                    138:                T_D1,   "%+e",                          "+1.234568e+01",                __LINE__, 
                    139:                T_D1,   "%15.4e",                       "     1.2346e+01",              __LINE__, 
                    140:                T_D1,   "%E",                           "1.234568E+01",                 __LINE__,
                    141:                T_D1,   "%.3e",                         "1.235e+01",                    __LINE__,
                    142:                T_D1,   "%.10e",                        "1.2345678900e+01",             __LINE__,
                    143:                T_D3,   "%e",                           "0.000000e+00",                 __LINE__,
                    144:                T_D1,   "%.0e",                         "1e+01",                                __LINE__,
                    145:                T_D1,   "%.e",                          "1e+01",                                __LINE__,
                    146:                T_D1,   "%#.0e",                        "1.e+01",                               __LINE__, 
                    147:                T_D5,   "%.2g",                         "1.2e-06",                              __LINE__,
                    148:                T_D6,   "%.2g",                         "9.9e+02",                              __LINE__,
                    149:                T_D7,   "%.2g",                         "9.9e+03",                              __LINE__,
                    150:                T_D7,   "%.2G",                         "9.9E+03",                              __LINE__,
                    151:                T_D4,   "%.0g",                         "1",                                    __LINE__,
                    152:                T_D1,   "%.1g",                         "1e+01",                                __LINE__,
                    153:                T_D4,   "%#.0g",                        "1.",                                   __LINE__,
                    154:                T_D1,   "%.2g",                         "12",                                   __LINE__,
                    155:                T_D4,   "%.2g",                         "1",                                    __LINE__,
                    156:                T_D4,   "%#.4g",                        "1.000",                                __LINE__,
                    157:                T_S,    "free form input",      "free form input",              __LINE__,
                    158:                T_S,    "%%%s%%d",                      "%this is a string\n%d",__LINE__,
                    159:                T_S,    "%-20s",                        "this is a string\n   ",__LINE__, 
                    160:                T_S,    "%20s",                         "   this is a string\n",__LINE__,
                    161:                T_S,    "%20.6s",                       "              this i", __LINE__,
                    162:                T_S,    "%.6s",                         "this i",                               __LINE__,
                    163:                T_C1,   "%c",                           "a",                                    __LINE__,
                    164:                T_C1,   "%2c",                          " a",                                   __LINE__,
                    165: #if ANSI
                    166:                T_STAR1,"%.*d",                         "000077",                               __LINE__,
                    167:                T_STAR1,"%*d",                          "    77",                               __LINE__,
                    168:                T_STAR1,"%-*d",                         "77    ",                               __LINE__,
                    169:                T_STAR2,"%.*d",                         "77",                                   __LINE__,
                    170:                T_STAR2,"%*d",                          "77    ",                               __LINE__,
                    171:                T_STAR3,"%*.*d",                        "  0077",                               __LINE__,
                    172:                T_STAR3,"%-*.*d",                       "0077  ",                               __LINE__,
                    173:                T_STARN,"%.*e",                         "1.234568e+01",                 __LINE__, 
                    174:                T_STARD,"%*.*e",                        "     1.2346e+01",              __LINE__, 
                    175:                T_I1,   "%06.4d",                       "  0077",                               __LINE__,
                    176:                T_I1,   "%i",                           "77",                                   __LINE__,
                    177:                T_SI,   "%#hx",                         "0x7fff",                               __LINE__,
                    178:                T_U,    "%u",                           "65000",                                __LINE__,
                    179:                T_SU,   "%ho",                          "77777",                                __LINE__,
                    180:                T_SU,   "%hu",                          "32767",                                __LINE__,
                    181:                T_SU,   "%hx",                          "7fff",                                 __LINE__,
                    182:                T_L1,   "%lo",                          "176750",                               __LINE__,
                    183:                T_L1,   "%lu",                          "65000",                                __LINE__,
                    184:                T_L1,   "%lx",                          "fde8",                                 __LINE__,
                    185:                T_D8,   "%Le",                          "9.876540e+01",                 __LINE__,
                    186:                T_D8,   "%Lf",                          "98.765400",                    __LINE__,
                    187:                T_D8,   "%Lg",                          "98.7654",                              __LINE__,
                    188: #endif
                    189:                0,              0,                                      0,                                              __LINE__,
                    190:                };
                    191: 
                    192: /*
                    193:  * PRINT - this test the printf, etc. scanf, etc. formatting.
                    194:  * We make the reasonable assumption that the formatting routines 
                    195:  * for sprintf are common with those for sprintf, fprintf, etc. and only
                    196:  * test one set.
                    197:  */
                    198: void print()
                    199:        {
                    200: #ifndef SKIP_PRINT
                    201:        int i;
                    202:        struct output *po;
                    203:        char buffer[64];
                    204: 
                    205:        Filename = "d49a.c";
                    206:        if (DBL_MAX_10_EXP >= 100)
                    207:                Dval2 = 1.23456789 * dpowu(10., 100);
                    208: 
                    209:        for (po = Output; po->fmt; ++po)
                    210:                {
                    211:                if (po->type == T_D2 && DBL_MAX_10_EXP < 100)
                    212:                        {
                    213:                        /* See update item #533, Review Board meeting 8/92 */
                    214:                        checkthat(__LINE__, 1); /* count one successful test */
                    215:                        continue;
                    216:                        }
                    217:                switch (po->type)
                    218:                        {
                    219:                case T_0:               sprintf(buffer, po->fmt);                               break;
                    220:                case T_U:               sprintf(buffer, po->fmt, Ui);                   break;
                    221:                case T_I0:              sprintf(buffer, po->fmt, 0);                    break;
                    222:                case T_I1:              sprintf(buffer, po->fmt, Ival1);                break;
                    223:                case T_I2:              sprintf(buffer, po->fmt, Ival2);                break;
                    224:                case T_L1:              sprintf(buffer, po->fmt, Lval1);                break;
                    225:                case T_SI:              sprintf(buffer, po->fmt, Sval);                 break;
                    226:                case T_SU:              sprintf(buffer, po->fmt, Suval);                break;
                    227:                case T_D1:              sprintf(buffer, po->fmt, Dval1);                break;
                    228:                case T_D2:              sprintf(buffer, po->fmt, Dval2);                break;
                    229:                case T_D3:              sprintf(buffer, po->fmt, Dval3);                break;
                    230:                case T_D4:              sprintf(buffer, po->fmt, Dval4);                break;
                    231:                case T_D5:              sprintf(buffer, po->fmt, Dval5);                break;
                    232:                case T_D6:              sprintf(buffer, po->fmt, Dval6);                break;
                    233:                case T_D7:              sprintf(buffer, po->fmt, Dval7);                break;
                    234: #if ANSI
                    235:                case T_D8:              sprintf(buffer, po->fmt, Dval8);                break;
                    236: #endif
                    237:                case T_P:               sprintf(buffer, po->fmt, Pval);                 break;
                    238:                case T_S:               sprintf(buffer, po->fmt, String);               break;
                    239:                case T_STAR1:   sprintf(buffer, po->fmt, 6, Ival1);     break;
                    240:                case T_STAR2:   sprintf(buffer, po->fmt, -6, Ival1);    break;
                    241:                case T_STAR3:   sprintf(buffer, po->fmt, 6, 4, Ival1);  break;
                    242:                case T_STARD:   sprintf(buffer, po->fmt, 15, 4, Dval1); break;
                    243:                case T_STARN:   sprintf(buffer, po->fmt, -4, Dval1);    break;
                    244:                case T_C1:              sprintf(buffer, po->fmt, Cval);                 break;
                    245:                        }
                    246:                
                    247:                switch (po->type)
                    248:                        {
                    249:                        case T_D1:
                    250:                        case T_D2:
                    251:                        case T_D3:
                    252:                        case T_D4:
                    253:                        case T_D5:
                    254:                        case T_D6:
                    255:                        case T_D7:
                    256:                        case T_D8:
                    257:                        case T_STARD:
                    258:                        case T_STARN:
                    259:                                fpsteq(po->line, buffer, po->out);
                    260:                                break;
                    261:                        default:
                    262:                                stequals(po->line, buffer, po->out);
                    263:                        }
                    264:                }
                    265: 
                    266: #if ANSI
                    267:        {
                    268:        char *buffer_p;
                    269:        int t1; short t2; long t3;
                    270:        /* some special cases not covered above */
                    271: 
                    272:        buffer[0] = 0;
                    273:        sprintf(buffer, "%p", buffer);
                    274:        /* implementation defined format, but it should have written something */
                    275:        inotequals(__LINE__, buffer[0], 0);
                    276:        sscanf(buffer, "%p", &buffer_p);
                    277:        aequals(__LINE__, buffer, buffer_p);
                    278: 
                    279: #if ANSI8712   /* added h and l modifiers to n */
                    280:        /* %.0d of 0 produces no characters */
                    281:        sprintf(buffer, "%.0d", 0);
                    282:        stequals(__LINE__, buffer, "");
                    283: #endif
                    284: 
                    285: #if ANSI8703   /* added h and l modifiers to n */
                    286:        sprintf(buffer, "%nabc%hn%d%ln", &t1, &t2, 123, &t3);
                    287:        stequals(__LINE__, buffer, "abc123");
                    288:        iequals(__LINE__, t1, 0);
                    289:        iequals(__LINE__, t2, 3);
                    290:        lequals(__LINE__, t3, 6L);
                    291: #endif /* ANSI8703 */
                    292:        }
                    293: #endif
                    294: #endif /* SKIP_PRINT */
                    295:        }
                    296: 
                    297: 
                    298: 
                    299: 
                    300: static struct input
                    301:        {
                    302:        int type;
                    303:        char *fmt;
                    304:        char *in;
                    305:        int line;
                    306:        } Input[] = 
                    307:                {
                    308:                T_I1,   "%d",                           "77",                                   __LINE__,
                    309:                T_I1,   "%d",                           "                 77",                  __LINE__,
                    310: #if ANSI
                    311:                T_I1,   "%d",                           "+77",                                  __LINE__,
                    312:                T_SI,   "%hd",                          "32767",                                __LINE__,
                    313: #endif
                    314:                T_I2,   "%d",                           "-77",                                  __LINE__,
                    315:                T_I1,   "abc%d",                        "abc77",                                __LINE__,
                    316:                T_L1,   "%ld",                          "65000",                                __LINE__,
                    317: #if ANSI
                    318:                T_I1,   "%i",                           "77",                                   __LINE__,
                    319:                T_I1,   "%i",                           "+77",                                  __LINE__,
                    320:                T_I2,   "%i",                           "-77",                                  __LINE__,
                    321:                T_I1,   "%i",                           "0115",                                 __LINE__,
                    322:                T_I1,   "%i",                           "0x4d",                                 __LINE__,
                    323:                T_I1,   "%i",                           "0X4d",                                 __LINE__,
                    324:                T_SI,   "%hi",                          "0x7fff",                               __LINE__,
                    325:                T_SU,   "%ho",                          "077777",                               __LINE__,
                    326:                T_SU,   "%hu",                          "32767",                                __LINE__,
                    327:                T_SU,   "%hx",                          "7fff",                                 __LINE__,
                    328:                T_L1,   "%lo",                          "0176750",                              __LINE__,
                    329:                T_L1,   "%lu",                          "65000",                                __LINE__,
                    330:                T_L1,   "%lx",                          "fde8",                                 __LINE__,
                    331: #endif
                    332:                T_I1,   "%o",                           "0115",                                 __LINE__,
                    333:                T_I1,   "%u",                           "77",                                   __LINE__,
                    334:                T_I1,   "%x",                           "4d",                                   __LINE__,
                    335:                T_I1,   "%x",                           "4D",                                   __LINE__,
                    336:                T_I1,   "%X",                           "4d",                                   __LINE__,
                    337:                T_I1,   "%X",                           "4D",                                   __LINE__,
                    338:                T_S,    "%s",                           " this is",                             __LINE__,
                    339:                T_C1,   "%c",                           "athis is",                             __LINE__,
                    340:                T_C2,   "%c",                           " this is",                             __LINE__,
                    341:                T_F,    "%f",                           "3.",                                   __LINE__,
                    342:                T_F,    "%e",                           "3.",                                   __LINE__,
                    343:                T_F,    "%f",                           ".3e+01",                               __LINE__,
                    344:                T_F,    "%e",                           ".3e+01",                               __LINE__,
                    345:                T_F,    "%f",                           "3.0",                                  __LINE__,
                    346:                T_F,    "%g",                           "3.0",                                  __LINE__,
                    347:                T_D1,   "%le",                          "12.3456789",                   __LINE__,
                    348:                T_D1,   "%lf",                          "12.3456789",                   __LINE__,
                    349:                T_D1,   "%lg",                          "1.23456789e+01",               __LINE__,
                    350: #if ANSI
                    351:                T_F,    "%E",                           ".3e+01",                               __LINE__,
                    352:                T_F,    "%G",                           "3.0",                                  __LINE__,
                    353:                T_D8,   "%Le",                          "98.7654",                              __LINE__,
                    354:                T_D8,   "%Lf",                          "98.7654",                              __LINE__,
                    355:                T_D8,   "%Lg",                          "9.87654e+01",                  __LINE__,
                    356: #endif
                    357:                0,              (char *)0,                      (char *)0,                              __LINE__,
                    358:                };
                    359: 
                    360: 
                    361: 
                    362: /*
                    363:  * SCAN - this test the scanf, etc. scanf, etc. number cracking.  
                    364:  * We make the reasonable assumption that the scanning routines
                    365:  * for sscanf are common with those for scanf, fscanf, etc. and only
                    366:  * test one set.
                    367:  */
                    368: void scan()
                    369:        {
                    370: #ifndef SKIP_SCAN
                    371:        int i, n;
                    372:        struct input *pi;
                    373:        char buffer[64];
                    374:        char ctmp;
                    375:        short stmp;
                    376:        unsigned short sutmp;
                    377:        int itmp;
                    378:        long ltmp;
                    379:        double dtmp;
                    380: #if ANSI
                    381:        long double ldtmp;
                    382: #endif
                    383:        float ftmp;
                    384:        int *ptmp;
                    385:        char *p = buffer;
                    386:        char *q = 0;
                    387: 
                    388:        Filename = "d49a.c";
                    389: 
                    390:        for (pi = Input; pi->fmt; ++pi)
                    391:                {
                    392:                switch (pi->type)
                    393:                        {
                    394:                        case T_I1 :
                    395:                                sscanf(pi->in, pi->fmt, &itmp);
                    396:                                iequals(pi->line, itmp, Ival1);
                    397:                                itmp = 0;
                    398:                                break;
                    399:                        case T_SI :
                    400:                                sscanf(pi->in, pi->fmt, &stmp);
                    401:                                iequals(pi->line, stmp, Sval);
                    402:                                stmp = 0;
                    403:                                break;
                    404:                        case T_SU :
                    405:                                sscanf(pi->in, pi->fmt, &sutmp);
                    406:                                iequals(pi->line, sutmp, Suval);
                    407:                                sutmp = 0;
                    408:                                break;
                    409:                        case T_L1 :
                    410:                                sscanf(pi->in, pi->fmt, &ltmp);
                    411:                                lequals(pi->line, ltmp, Lval1);
                    412:                                ltmp = 0;
                    413:                                break;
                    414:                        case T_D1 :
                    415:                                sscanf(pi->in, pi->fmt, &dtmp);
                    416:                                dequals(pi->line, dtmp, Dval1);
                    417:                                dtmp = 0;
                    418:                                break;
                    419: #if ANSI
                    420:                        case T_D8 :
                    421:                                sscanf(pi->in, pi->fmt, &ldtmp);
                    422:                                ldequals(pi->line, ldtmp, Dval8);
                    423:                                ldtmp = 0;
                    424:                                break;
                    425: #endif
                    426:                        case T_F :
                    427:                                sscanf(pi->in, pi->fmt, &ftmp);
                    428:                                dequals(pi->line, ftmp, Fval);
                    429:                                ftmp = 0;
                    430:                                break;
                    431:                        case T_S :
                    432:                                sscanf(pi->in, pi->fmt, buffer);
                    433:                                stequals(pi->line, buffer, "this");
                    434:                                buffer[0] = 0;
                    435:                                break;
                    436:                        case T_C1 :
                    437:                                sscanf(pi->in, pi->fmt, &ctmp);
                    438:                                iequals(pi->line, ctmp, 'a');
                    439:                                ctmp = 0;
                    440:                                break;
                    441:                        case T_C2 :
                    442:                                sscanf(pi->in, pi->fmt, &ctmp);
                    443:                                iequals(pi->line, ctmp, ' ');
                    444:                                ctmp = 0;
                    445:                                break;
                    446:                        }
                    447:                }
                    448: 
                    449:        /* special cases */
                    450: 
                    451:        /* if a directive fails, no more input is consumed */
                    452:                {
                    453:                char filename[256];
                    454:                FILE *fd;
                    455:                int tmp1 = 0;
                    456:                int tmp2 = 0;
                    457:                char c = 0;
                    458: 
                    459:                save_name(tmpnam(filename));
                    460:                fd = fopen(filename, "w+");
                    461:                fprintf(fd, "xxx 17 yyy 18");
                    462:                rewind(fd);
                    463:                fscanf(fd, "xxx %d zzz %d", &tmp1, &tmp2);
                    464:                iequals(__LINE__, tmp1, 17);
                    465:                iequals(__LINE__, tmp2, 0);
                    466:                fscanf(fd, "yyy %d", &tmp2);
                    467:                iequals(__LINE__, tmp2, 18);
                    468:                fscanf(fd, "%c", &c);
                    469:                iequals(__LINE__, c, 0);
                    470: 
                    471:                fclose(fd);
                    472:                remove(filename); 
                    473:                }
                    474: 
                    475: #if ANSI
                    476:        /* skip white space unless %c, %n, or %[ ] */
                    477:        sscanf(" \f\n\r\t\v10", "%d", &Ival1);
                    478:        iequals(__LINE__, Ival1, 10);
                    479:        sscanf(" \f\n\r\t\vA", "%c%c%c%c%c%c%c", p+0, p+1, p+2, p+3, p+4, p+5, p+6);
                    480:        iequals(__LINE__, p[0], ' ');
                    481:        iequals(__LINE__, p[1], '\f');
                    482:        iequals(__LINE__, p[2], '\n');
                    483:        iequals(__LINE__, p[3], '\r');
                    484:        iequals(__LINE__, p[4], '\t');
                    485:        iequals(__LINE__, p[5], '\v');
                    486:        iequals(__LINE__, p[6], 'A');
                    487: 
                    488:        sscanf("xxx yyy", "xxx%n%c", &Ival1, &Cval);
                    489:        iequals(__LINE__, Ival1, 3);
                    490:        iequals(__LINE__, Cval, ' ');
                    491: 
                    492:        p = " \f\n\r\t\vXXX";
                    493:        sscanf(p, "%s", buffer);
                    494:        stequals(__LINE__, buffer, "XXX");
                    495:        sscanf(p, "%[ \f\n\r\t\v]", buffer);
                    496:        stequals(__LINE__, buffer, " \f\n\r\t\v");
                    497: 
                    498:        /* assignment supression */
                    499:        Ival1 = 1;
                    500:        Ival2 = 2;
                    501:        sscanf("77 78", "%*d%d", &Ival1, &Ival2);
                    502:        iequals(__LINE__, Ival1, 78);
                    503:        iequals(__LINE__, Ival2, 2);
                    504: 
                    505:        /* field widths */
                    506:        sscanf("123456", "%3d%d", &Ival1, &Ival2);
                    507:        iequals(__LINE__, Ival1, 123);
                    508:        iequals(__LINE__, Ival2, 456);
                    509:        str_cpye(buffer+30, "XXXXXXX");
                    510:        sscanf("123456789", "%3d%3s%2c", &Ival2, buffer, buffer+30);
                    511:        iequals(__LINE__, Ival2, 123);
                    512:        stequals(__LINE__, buffer, "456");
                    513:        iequals(__LINE__, buffer[30], '7');
                    514:        iequals(__LINE__, buffer[31], '8');
                    515:        iequals(__LINE__, buffer[32], 'X');
                    516:        sscanf("abcabcabc", "%4[abc]", buffer);
                    517:        stequals(__LINE__, buffer, "abca");
                    518:        sscanf("xyzxyzxyz", "%4[^abc]", buffer);
                    519:        stequals(__LINE__, buffer, "xyzx");
                    520: 
                    521:        /* conversion count */
                    522:        sscanf("123 5", "%d%n", &i, &n);
                    523:        iequals(__LINE__, i, 123);
                    524:        iequals(__LINE__, n, 3);
                    525: 
                    526:        sscanf("123 5", "%d%hn", &i, &stmp);
                    527:        iequals(__LINE__, i, 123);
                    528:        iequals(__LINE__, stmp, 3);
                    529: 
                    530:        sscanf("123 5", "%d%ln", &i, &ltmp);
                    531:        iequals(__LINE__, i, 123);
                    532:        lequals(__LINE__, ltmp, 3L);
                    533: 
                    534:        /* '%%' is an  escape for '%' */
                    535:        str_cpye(buffer, "xxxxxx");
                    536:        sscanf("%%aaa", "%%%%%s", buffer);
                    537:        stequals(__LINE__, buffer, "aaa");
                    538: 
                    539:        /* scan sets */
                    540:        sscanf("ddccbbaaxxxxx", "%[abcd]", buffer);
                    541:        stequals(__LINE__, buffer, "ddccbbaa");
                    542: 
                    543:        sscanf("xxyyzzaabbccdd", "%[^abcd]", buffer);
                    544:        stequals(__LINE__, buffer, "xxyyzz");
                    545: 
                    546:        sscanf("dd]cc]bb]aaxxxxx", "%[]abcd]", buffer);
                    547:        stequals(__LINE__, buffer, "dd]cc]bb]aa");
                    548: 
                    549:        sscanf("xxyyzz]aabbccdd", "%[^]abcd]", buffer);
                    550:        stequals(__LINE__, buffer, "xxyyzz");
                    551: 
                    552:        /* exceptional behaviour of '-' is implementation defined */
                    553:        sscanf("-", "%[a-z]", buffer);
                    554:        stequals(- __LINE__, buffer, "-");
                    555: 
                    556:        /* %p should be idempotent */
                    557:        sprintf(buffer, "%p", p);
                    558:        sscanf(buffer, "%p", &q);
                    559:        aequals(__LINE__, p, q);
                    560: #endif
                    561: #endif /* SKIP_SCAN */
                    562:        }
                    563: 
                    564: #define IS_SPACE(c) ((c) == ' ')  /* Standard only allows space padding */
                    565: /*
                    566:  * fpsteq - When checking floating point output, the standard requires
                    567:  * a minimum of 2 digits for the exponent.  More is OK, so this routine
                    568:  * checks for conformance without being sensitive to the exact number
                    569:  * of digits.  When we know that the string is wrong, we call
                    570:  * stequals to create a meaningful error message. Also, compensate 
                    571:  * for differing number of white space in filling up the field width.
                    572:  */
                    573: void fpsteq(line, pval, pres)
                    574:        int line;
                    575:        char *pval;
                    576:        char *pres;
                    577:        {
                    578:        char result[32], value[32];
                    579:        int len;
                    580:        char *p, *q;
                    581: 
                    582:        /* check for field width (only on leading space) */
                    583:        if (IS_SPACE(*pval) && str_len(pres) != str_len(pval))
                    584:                {
                    585:                /* this will fail */
                    586:                stequals(line, pval, pres);
                    587:                return;
                    588:                }
                    589: 
                    590:        /* get rid of leading whitespace */
                    591:        while (IS_SPACE(*pval))
                    592:                ++pval;
                    593:        while (IS_SPACE(*pres))
                    594:                ++pres;
                    595:        if (str_str(pres, "E+") || str_str(pres, "E-") || 
                    596:                        str_str(pres, "e+") || str_str(pres, "e-"))
                    597:                {
                    598:                len = str_cspn(pres, "Ee");
                    599:                if (len != str_cspn(pval, "Ee"))
                    600:                        {
                    601:                        /* this will fail */
                    602:                        stequals(line, pval, pres);
                    603:                        return;
                    604:                        }
                    605:                st_ncpy(result, pres, len);
                    606:                result[len] = 0;
                    607:                st_ncpy(value, pval, len);
                    608:                value[len] = 0;
                    609:                if (str_cmp(result, value))
                    610:                        {
                    611:                        /* this will fail */
                    612:                        stequals(line, pval, pres);
                    613:                        }
                    614:                else /* OK so far, result matches value */
                    615:                        {
                    616:                        /* does pval have at least 2 digits of exponent? */
                    617:                        p = pval + len + 2;
                    618:                        if (str_len(p) < 2)
                    619:                                {
                    620:                                /* this will fail */
                    621:                                stequals(line, pval, pres);
                    622:                                }
                    623:                        else /* OK so far, exponent >= 2 digits */
                    624:                                {
                    625:                                while (*p == '0')
                    626:                                        ++p;
                    627:                                q = pres + len + 2;
                    628:                                while (*q == '0')
                    629:                                        ++q;
                    630:                                if (str_cmp(p, q))
                    631:                                        {
                    632:                                        /* this will fail */
                    633:                                        stequals(line, pval, pres);
                    634:                                        }
                    635:                                else /* complete success, exponents match numerically */
                    636:                                        stequals(line, pval, pval);     /* just to get trace */
                    637:                                }
                    638:                        }
                    639:                }
                    640:        else /* no exponent in output format */
                    641:                stequals(line, pval, pres);
                    642:        }
                    643: 
                    644: #endif /* !SKIP49 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.