Annotation of researchv10no/cmd/lcc/ph/d49a.c, revision 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.