Annotation of researchv10no/cmd/lcc/ph/c31.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: #include "flags.h"
        !            11: #ifndef SKIP31
        !            12: /*
        !            13:  * 3.1 - Lexical Elements
        !            14:  */
        !            15: #include "defs.h"
        !            16: #if ANSI
        !            17: #include <stddef.h>
        !            18: #endif
        !            19: /*
        !            20:  * 3.1.1 - Keywords. These are tested throughout.
        !            21:  */
        !            22: static void c3_1_1(){}
        !            23: 
        !            24: /*
        !            25:  * 3.1.2 - Identifiers.  A few checks for valid identifiers.
        !            26:  */
        !            27: static void c3_1_2()
        !            28:         {
        !            29:         int abcdefghijklmnopqrstuvwxyz = 1;
        !            30:         int ABCDEFGHIJKLMNOPQRSTUVWXYZ = 2;
        !            31:         int a23456789012345678901234567890a = 3;
        !            32: #if ANSI
        !            33:         int a23456789012345678901234567890b = 4;
        !            34: 
        !            35:        /* ANSI requires 31 characters of significance */
        !            36:        inotequals(__LINE__,
        !            37:                a23456789012345678901234567890b,
        !            38:                a23456789012345678901234567890a);
        !            39: #endif
        !            40: 
        !            41:        /* upper and lower cases are significant */
        !            42:        inotequals(__LINE__,
        !            43:                abcdefghijklmnopqrstuvwxyz,
        !            44:                ABCDEFGHIJKLMNOPQRSTUVWXYZ);
        !            45: 
        !            46: #if !(LONG_IDENTIFIERS || ANSI)
        !            47:        /* K&R/V7 declares that significance is ONLY to 8 characters */
        !            48:        iequals(__LINE__, a23456789, a2345678);
        !            49: #endif
        !            50:        }
        !            51: 
        !            52: 
        !            53: /*
        !            54:  * 3.1.2.1 - Scopes of Identifiers
        !            55:  */
        !            56: #if ANSI && HAS_PROTOTYPES
        !            57: /* function prototype scope */
        !            58: int nofunc(int i);
        !            59: #endif
        !            60: 
        !            61: /* file scope */
        !            62: static int i = 17;
        !            63: enum {AA, BB};
        !            64: #if ANSI
        !            65: static int f(enum {BB, AA} n) { iequals(__LINE__, BB, 0); return BB; }
        !            66: #endif /* ANSI */
        !            67: struct tag1 { int stuff; };    /* at file level */
        !            68: static void c3_1_2_1(i)
        !            69:        int i; /*  block scope (set to 19 from call above) */
        !            70:        {
        !            71:                {
        !            72:                /* block scope */
        !            73:                int i = ivalue(18);
        !            74:                iequals(__LINE__, i, 18);
        !            75:                }
        !            76:        iequals(__LINE__, i, 19);
        !            77:        iequals(__LINE__, BB, 1);
        !            78: #if ANSI8703
        !            79:        {
        !            80:        enum { A, B = A+7 } e = A;
        !            81:        int i;
        !            82:        static struct tag1 { struct tag1 *next; } s1 = {&s1};   /* new scope */
        !            83:        iequals(__LINE__, f(0), 0);
        !            84:        checkthat(__LINE__, s1.next == &s1);
        !            85:                {
        !            86: #if ANSI8809
        !            87:                void nonexist(union tag2 *junk);        /* tag2, in prototype scope, disappears */
        !            88: #endif
        !            89:                i = sizeof(struct tag2 { int stuff; }); /* declares tag2 */
        !            90:                        {
        !            91:                        struct tag2 s = {1};
        !            92:                        checkthat(__LINE__, s.stuff == 1);
        !            93:                        }
        !            94:                } 
        !            95:        } 
        !            96: #endif 
        !            97: #if ANSI 
        !            98:        goto a; 
        !            99:        { iequals(__LINE__, 1, 0); /* should not be reached */ a: ; } 
        !           100: #endif 
        !           101:        } 
        !           102: 
        !           103: /*
        !           104:  * 3.1.2.2 - Linkages of identifiers
        !           105:  */
        !           106: static int s11 = 11;           /* "lex 1st decl w file scope" says "static" --> internal */
        !           107:                int g13 = 13;           /* no "static" -->  external */
        !           108:         int g13;                       /* no sc --> external */
        !           109: extern int s11;                                /* same linkage as previous --> internal */
        !           110: extern int g13;                                /* same linkage as previous --> external */
        !           111: static int s16();                      /* internal linkage */
        !           112:        int s16();                      /* no sc (on fn) --> as though "extern" (same as previous) */
        !           113: 
        !           114: static void c3_1_2_2()
        !           115:        {
        !           116:        int j9 = ivalue(9);             /* no linkage */
        !           117:        extern int s11;                 /* internal linkage (already defined) */
        !           118:        static int e12 = 12;    /* no linkage */
        !           119:        extern int g13;                 /* external linkage (already defined) */
        !           120:        extern int g14;                 /* external linkage (forward reference) */
        !           121:        extern int e15;                 /* external linkage (defined in main1.c) */
        !           122: 
        !           123:        /* this is not referenced and shouldn't require any linkage */
        !           124:        extern int notdefinedanywhere;
        !           125:        iequals(__LINE__, j9, 9);
        !           126:        iequals(__LINE__, s11, 11);
        !           127:        iequals(__LINE__, g13, 13);
        !           128:        iequals(__LINE__, g14, 14);
        !           129:        iequals(__LINE__, e15, 15);
        !           130:        iequals(__LINE__, s16(), 16);
        !           131: 
        !           132:        /* this should have internal linkage -- it is erroneous to link
        !           133:         * to the static variable below.
        !           134:         */
        !           135:        iequals(__LINE__, e12, 12);
        !           136: 
        !           137:        /* scope testing of 'static i' from c3_1_2_1 */
        !           138:        iequals(__LINE__, i, 17);
        !           139: 
        !           140:        /* test scoping into and out of include files */
        !           141:                {
        !           142:                int i = 9;
        !           143: #include "c31sco.h"
        !           144:                iequals(__LINE__, i, 10);
        !           145:                }
        !           146:        iequals(__LINE__, i, 17);
        !           147:        }
        !           148: 
        !           149: static int e12 = 0;
        !           150:                int g14 = 14;
        !           151: 
        !           152: static int s16() { return ivalue(16); }
        !           153: /*
        !           154:  * 3.1.2.3 - Name spaces of identifiers.
        !           155:  * K&R and V7 have 2 (variables/labels and tags/members);
        !           156:  * later UNIX (set TAG_AND_MEMB_SPACES to 1) has 3 (var/labels, tags, members);
        !           157:  * ANSI has 4 (variables, labels, tags, members).
        !           158:  */
        !           159: static void c3_1_2_3()
        !           160:        {
        !           161:        int ident;
        !           162: 
        !           163: #if (TAG_AND_MEMB_SPACES || ANSI)
        !           164:        struct ident
        !           165:                {
        !           166:                int xxx;
        !           167:                int ident; /* members and variables in different spaces */
        !           168:                }p;
        !           169: #endif
        !           170:        struct a
        !           171:                {
        !           172:                int ident2;
        !           173:                } pa;
        !           174: #if (ANSI || UNIQ_MEMB_NAMES)
        !           175:        struct b
        !           176:                {
        !           177:                long ident2;
        !           178:                } pb;
        !           179: #endif
        !           180: 
        !           181:        ident = ivalue(7);
        !           182:        pa.ident2 = ivalue(8);
        !           183: #if ANSI
        !           184:        {
        !           185:        struct x { int x; } x = { 6 };
        !           186:        iequals(__LINE__, x.x, ivalue(6));
        !           187:        }
        !           188:        if (ident)
        !           189:                goto ident;
        !           190: #else
        !           191:        if (ident)
        !           192:                goto ident1;
        !           193: #endif
        !           194: 
        !           195:        /* this statement should never be reached */
        !           196:        complain(__LINE__);
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: 
        !           202: 
        !           203:                                                                                                                                                                                /* 3.1.2.3 (cont.) */
        !           204: #if ANSI
        !           205:        ident:
        !           206: #else
        !           207:        ident1:
        !           208: #endif
        !           209:        iequals(__LINE__, pa.ident2, 8);
        !           210: 
        !           211: #if (TAG_AND_MEMB_SPACES || ANSI)
        !           212:        p.ident = ivalue(9);
        !           213:        iequals(__LINE__, p.ident, 9);
        !           214: #endif
        !           215:        }
        !           216: 
        !           217: 
        !           218: 
        !           219: 
        !           220: 
        !           221: 
        !           222: 
        !           223: 
        !           224: 
        !           225: 
        !           226: 
        !           227: 
        !           228: 
        !           229: 
        !           230: 
        !           231: 
        !           232: 
        !           233: 
        !           234: 
        !           235: 
        !           236: 
        !           237: 
        !           238: 
        !           239: 
        !           240: 
        !           241: 
        !           242: 
        !           243: 
        !           244: 
        !           245: 
        !           246: 
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: 
        !           252: 
        !           253: /*
        !           254:  * 3.1.2.4 - Storage classes of objects.
        !           255:  */
        !           256: static void c3_1_2_4(arg)
        !           257:        int arg;
        !           258:        {
        !           259:        static int i = 0;
        !           260:        int j = 17;
        !           261: 
        !           262:        /* make sure static items are still alive at each invocation */
        !           263:        if (arg == 0)
        !           264:                {
        !           265:                i = 13;
        !           266:                /* recursion ensures that stack frames (if any) don't coincide */
        !           267:                c3_1_2_4(1);
        !           268:                }
        !           269:        else
        !           270:                {
        !           271:                iequals(__LINE__, i, 13);
        !           272:                goto label;
        !           273:                }
        !           274: 
        !           275:        for (i = 1; i <= 2; ++i)
        !           276:                {
        !           277:                int j = i + 1;
        !           278: 
        !           279:                iequals(__LINE__, j, i + 1);    /* auto var of inner block */
        !           280:                }
        !           281:                {
        !           282:                int j = 14;
        !           283: label:
        !           284:                j = 15;
        !           285:                }
        !           286:        
        !           287:        iequals(__LINE__, j, 17);
        !           288: 
        !           289:        /* local items might hold their values, but it is only coincidence */
        !           290:        }
        !           291: 
        !           292: 
        !           293: 
        !           294: 
        !           295: 
        !           296: 
        !           297: 
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: 
        !           303: /*
        !           304:  * 3.1.2.5 - Types
        !           305:  */
        !           306: char a_incomplete[]; char a_incomplete[3] = "ab";
        !           307: static void c3_1_2_5()
        !           308:        {
        !           309:        static char Carray[] = 
        !           310:                {
        !           311:                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
        !           312:                'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
        !           313:                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
        !           314:                'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 
        !           315:                ',', '.', '/', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 
        !           316:                '-', '=', '|', '<', '>', '?', '!',      '#',      '%', '^', '&',
        !           317:                     '"', '~', '[', ']', '{', '}', '*', '(', ')', '_', '+', '\\',
        !           318:                '\'', 
        !           319:                };      /* dollar-sign, accent-grave, and at-sign are not in C source set */
        !           320: 
        !           321: #if ANSI
        !           322:        signed char sc;
        !           323:        signed short ss;
        !           324:        signed int si;
        !           325:        signed long sl;
        !           326:        long double ld;
        !           327:        struct s_incomplete *psinc;
        !           328:        struct s_incomplete { int i; } sinc = {3};
        !           329: #endif
        !           330:        char c;
        !           331:        short int s;
        !           332:        int i;
        !           333:        long int li;
        !           334:        float f;
        !           335:        double d;
        !           336:        unsigned int ui;
        !           337: 
        !           338: 
        !           339:        UCHAR uc;
        !           340:        USHORT us;
        !           341:        ULONG int ul;
        !           342: 
        !           343:        checkthat(__LINE__, sizeof(a_incomplete) == 3);
        !           344:        checkthat(__LINE__, sizeof(c) <= sizeof(s));
        !           345:        checkthat(__LINE__, sizeof(s) <= sizeof(i));
        !           346:        checkthat(__LINE__, sizeof(i) <= sizeof(li));
        !           347:        checkthat(__LINE__, sizeof(f) <= sizeof(d));
        !           348:        checkthat(__LINE__, sizeof(uc) == sizeof(c));
        !           349:        checkthat(__LINE__, sizeof(us) == sizeof(s));
        !           350:        checkthat(__LINE__, sizeof(ui) == sizeof(i));
        !           351:        checkthat(__LINE__, sizeof(ul) == sizeof(li));
        !           352: 
        !           353: #if ANSI                                                                                                                                                               /* 3.1.2.5 (cont.) */
        !           354:        psinc = &sinc;
        !           355:        iequals(__LINE__, psinc->i, 3);
        !           356:        checkthat(__LINE__, sizeof(d) <= sizeof(ld));
        !           357:        checkthat(__LINE__, sizeof(uc) == sizeof(sc));
        !           358:        checkthat(__LINE__, sizeof(us) == sizeof(ss));
        !           359:        checkthat(__LINE__, sizeof(ui) == sizeof(si));
        !           360:        checkthat(__LINE__, sizeof(ul) == sizeof(sl));
        !           361: #endif
        !           362:        
        !           363:        /* all source char constants are positive */
        !           364:        for (i = 0; i < sizeof(Carray); ++i)
        !           365:                checkthat(__LINE__, Carray[i] > 0);
        !           366: #if ANSI
        !           367:        /* <limits.h> is included in the "defs.h" for ANSI */
        !           368:        checkthat(__LINE__, (int)INT_MAX == (unsigned int)INT_MAX);
        !           369:        checkthat(__LINE__, (long)LONG_MAX == (unsigned long)LONG_MAX);
        !           370: 
        !           371:        checkthat(__LINE__, ULONG_MAX >= LONG_MAX);
        !           372:        checkthat(__LINE__, UINT_MAX >= INT_MAX);
        !           373:        checkthat(__LINE__, USHRT_MAX >= SHRT_MAX);
        !           374:        ul = ULONG_MAX;
        !           375:                {
        !           376:                struct ints { char c; short s; int i; long l; };
        !           377:                struct uints { UCHAR c; USHORT s; unsigned int i; ULONG l; };
        !           378:                union { short s; unsigned short us; } u1;
        !           379:                static char str2[] = "abc", str3[] = "abc";
        !           380:                union { void *v2; char *s2; } u2;
        !           381:                union { void *v3; char *s3; } u3;
        !           382: 
        !           383:                checkthat(__LINE__, sizeof(struct ints) == sizeof(struct uints));       /* ANSI8703 same alignments */
        !           384:        
        !           385:                /* ANSI8809 - "same representation and alignment" means interchangeable in args, returned values, and unions */
        !           386:                u1.s = 10;
        !           387:                iequals(__LINE__, abs(u1.us), ivalue(10));      /* no prototype for abs at this point, defaults */
        !           388:                u2.s2 = str2, u3.s3 = str3;
        !           389:                iequals(__LINE__, str_cmp(u2.v2, u3.v3), 0);    /* no prototype for str_cmp at this point, defaults */
        !           390: 
        !           391:                }
        !           392:        checkthat(__LINE__, ul + ULONG_MAX > 0);        /* unsigned "can't oflo" */
        !           393:        ui = UINT_MAX;
        !           394:        checkthat(__LINE__, ui + UINT_MAX > 0);         /* unsigned "can't oflo" */
        !           395:        us = USHRT_MAX;
        !           396:        checkthat(__LINE__, us + USHRT_MAX > 0);        /* unsigned "can't oflo" */
        !           397:        ldequals(__LINE__, (ul += 1), 0);       /* unsigned "can't oflo" */
        !           398:        ldequals(__LINE__, (ui += 1), 0);       /* unsigned "can't oflo" */
        !           399:        ldequals(__LINE__, (us += 1u), 0);      /* unsigned "can't oflo" */
        !           400: #endif /* ANSI */
        !           401:        }
        !           402: 
        !           403: #if ANSI8709
        !           404: /*
        !           405:  * 3.1.2.6 - Compatible type and composite type
        !           406:  */
        !           407: typedef char CHAR_COMPATIBLE;
        !           408: extern struct s3126 { CHAR_COMPATIBLE i; signed int j; } s3126;        /* link with lang.c */
        !           409: extern union u3126 { signed int j; CHAR_COMPATIBLE i; } u3126; /* link with lang.c */
        !           410: extern enum e3126 { E3126B=5, E3126A=4 } e3126;                                        /* link with lang.c */
        !           411: typedef void VF();                     /* no parm list */
        !           412: typedef void VF_VF(VF *);      /* one parm of type VF * */
        !           413: static void c3_1_2_6();
        !           414: static void c3_1_2_6(VF *);
        !           415: static void c3_1_2_6(VF_VF *);
        !           416: static void c3_1_2_6(
        !           417:        VF_VF *pf)
        !           418:        {
        !           419:        iequals(__LINE__, s3126.j, 2);
        !           420:        iequals(__LINE__, u3126.i, 3);
        !           421:        iequals(__LINE__, e3126, 5);
        !           422:        checkthat(__LINE__, pf == c3_1_2_6);
        !           423:        }
        !           424: #endif
        !           425: 
        !           426: 
        !           427: 
        !           428: 
        !           429: 
        !           430: 
        !           431: 
        !           432: 
        !           433: 
        !           434: 
        !           435: 
        !           436: 
        !           437: 
        !           438: 
        !           439: 
        !           440: 
        !           441: 
        !           442: 
        !           443: 
        !           444: 
        !           445: 
        !           446: 
        !           447: 
        !           448: 
        !           449: 
        !           450: 
        !           451: 
        !           452: 
        !           453: /*
        !           454:  * 3.1.3.1 - Floating constants
        !           455:  */
        !           456: static void c3_1_3_1()
        !           457:        {
        !           458: 
        !           459:        /* check multiple representations for equality */
        !           460:        dequals(__LINE__, 123., 123.0); 
        !           461:        dequals(__LINE__, 123.0, 12.3e1); 
        !           462:        dequals(__LINE__, 12.3e1, 12.3E1); 
        !           463:        dequals(__LINE__, 12.3E1, 1.23E+2); 
        !           464:        dequals(__LINE__, 123.e-2, 12.3e-1);
        !           465:        dequals(__LINE__, .9, 9e-1);
        !           466:        checkthat(__LINE__, sizeof(double) == sizeof(1.0));
        !           467: 
        !           468: #if ANSI
        !           469:        /* check for existance of long double constants */
        !           470:        ldequals(__LINE__, 101.L, 101.0l); 
        !           471:        fequals(__LINE__, 202.f, 202.0F);
        !           472:        checkthat(__LINE__, sizeof(1.F) == sizeof(float) && sizeof(1.f) == sizeof(float));
        !           473:        checkthat(__LINE__, sizeof(1.L) == sizeof(long double) && sizeof(1.l) == sizeof(long double));
        !           474: #endif
        !           475:        }
        !           476: 
        !           477: 
        !           478: 
        !           479: 
        !           480: 
        !           481: 
        !           482: 
        !           483: 
        !           484: 
        !           485: 
        !           486: 
        !           487: 
        !           488: 
        !           489: 
        !           490: 
        !           491: 
        !           492: 
        !           493: 
        !           494: 
        !           495: 
        !           496: 
        !           497: 
        !           498: 
        !           499: 
        !           500: 
        !           501: 
        !           502: 
        !           503: /*
        !           504:  * 3.1.3.2 - Integer constants.
        !           505:  */
        !           506: static void c3_1_3_2()
        !           507:        {
        !           508:        /* make sure all hex digits are accepted */
        !           509:        iequals(__LINE__, 0xabc, 0xABC);
        !           510:        iequals(__LINE__, 0xdef, 0xDEF);
        !           511: 
        !           512:        /* equivalence checking */
        !           513:        iequals(__LINE__, 456, 0x1c8);
        !           514:        iequals(__LINE__, 456, 0710);
        !           515: 
        !           516:        /* size checking */
        !           517:        iequals(__LINE__, sizeof(1), sizeof(int));
        !           518:        iequals(__LINE__, sizeof(0xabc), sizeof(int));
        !           519:        iequals(__LINE__, sizeof(0123), sizeof(int));
        !           520:        iequals(__LINE__, sizeof(1L), sizeof(long));
        !           521:        iequals(__LINE__, sizeof(0xabcL), sizeof(long));
        !           522:        iequals(__LINE__, sizeof(0123L), sizeof(long));
        !           523:        iequals(__LINE__, sizeof(1l), sizeof(long));
        !           524:        iequals(__LINE__, sizeof(0xabcl), sizeof(long));
        !           525:        iequals(__LINE__, sizeof(0123l), sizeof(long));
        !           526:        iequals( - __LINE__, sizeof(999999999), sizeof(long));
        !           527:        iequals( - __LINE__, sizeof(0x9999999), sizeof(long));
        !           528:        iequals( - __LINE__, sizeof(0777777777), sizeof(long));
        !           529:        /* the 3 lines above are not strict - could fit a very large int */
        !           530: #if ANSI
        !           531:        /* check for existence of both U and L suffixes */
        !           532:        iequals(__LINE__, sizeof(1u), sizeof(unsigned int));
        !           533:        iequals(__LINE__, sizeof(1U), sizeof(unsigned int));
        !           534:        iequals(__LINE__, sizeof(1LU), sizeof(unsigned long));
        !           535:        iequals(__LINE__, sizeof(1lU), sizeof(unsigned long));
        !           536:        iequals(__LINE__, sizeof(01uL), sizeof(unsigned long));
        !           537:        iequals(__LINE__, sizeof(0x1ul), sizeof(unsigned long));
        !           538: #endif
        !           539: 
        !           540: /* ANSI requires that 0xffff be unsigned int (if too big for int),
        !           541:  * but that 65535 be long (if too big for int).
        !           542:  */
        !           543: #if ANSI
        !           544:        iequals(__LINE__, sizeof(0xffff), sizeof(unsigned int));
        !           545:        if (MAX_UINT == 65535)
        !           546:                {
        !           547:                iequals(__LINE__, sizeof(65535), sizeof(long));
        !           548:                iequals(__LINE__, sizeof(65535u), sizeof(unsigned int));
        !           549:                iequals(__LINE__, sizeof(0xffff), sizeof(int));
        !           550:                }
        !           551:        else
        !           552:                {
        !           553:                checkthat(__LINE__, sizeof(65535) <= sizeof(long));
        !           554:                iequals(__LINE__, sizeof(65535u), sizeof(unsigned int));
        !           555:                iequals(__LINE__, sizeof(0xffff), sizeof(int));
        !           556:                }
        !           557: #endif
        !           558:        }
        !           559: /*
        !           560:  * 3.1.3.3 - Enumeration constants.
        !           561:  */
        !           562: static void c3_1_3_3()
        !           563:        {
        !           564: #if (V7 || ANSI)
        !           565:        enum color { red = -1, blue = -2, green = (MAX_INT-1-MAX_INT) /* i.e., -1 again */ };
        !           566:        checkthat(__LINE__, sizeof(red) <= sizeof(int));
        !           567:        iequals(__LINE__, red, ivalue(-1));
        !           568:        iequals(__LINE__, blue, ivalue(-2));
        !           569:        iequals(__LINE__, green, ivalue(-1));
        !           570: #endif
        !           571:        }
        !           572: 
        !           573: 
        !           574: 
        !           575: 
        !           576: 
        !           577: 
        !           578: 
        !           579: 
        !           580: 
        !           581: 
        !           582: 
        !           583: 
        !           584: 
        !           585: 
        !           586: 
        !           587: 
        !           588: 
        !           589: 
        !           590: 
        !           591: 
        !           592: 
        !           593: 
        !           594: 
        !           595: 
        !           596: 
        !           597: 
        !           598: 
        !           599: 
        !           600: 
        !           601: 
        !           602: 
        !           603: 
        !           604: 
        !           605: 
        !           606: 
        !           607: 
        !           608: 
        !           609: /*
        !           610:  * 3.1.3.4 - Character constants.
        !           611:  */
        !           612: static void c3_1_3_4()
        !           613:        {
        !           614:        int c;
        !           615: 
        !           616:        /* the basic set of character constants was tested above */
        !           617: 
        !           618:        /* escape sequence character constants */
        !           619:        inotequals(__LINE__, '\b', 'b');
        !           620:        inotequals(__LINE__, '\f', 'f');
        !           621:        inotequals(__LINE__, '\n', 'n');
        !           622:        inotequals(__LINE__, '\r', 'r');
        !           623:        inotequals(__LINE__, '\t', 't');
        !           624:        iequals(__LINE__, '\"', '"');
        !           625:        iequals(__LINE__, '\\', "\\"[0]);
        !           626: 
        !           627: #if ANSI
        !           628:        inotequals(__LINE__, '\a', 'a');
        !           629:        inotequals(__LINE__, '\v', 'v');
        !           630: 
        !           631:        /* hex digit form */
        !           632:        iequals(__LINE__, '\xa', 0xa);
        !           633:        iequals(__LINE__, '\x7b', 0x7b);
        !           634:        iequals(__LINE__, '\x001', 1);
        !           635: #if WIDE_CHARS
        !           636: #include "c3134.h"  /* to hide the following lines from non-ANSI lexical scan */
        !           637: /*     checkthat(__LINE__, sizeof(L'x') == sizeof(wchar_t)); */
        !           638: /*     iequals(__LINE__, L'a', 'a'); */
        !           639: /*     iequals(__LINE__, L'\0', 0); */
        !           640: #endif
        !           641: 
        !           642: #endif
        !           643: 
        !           644:        /* octal digit form */
        !           645:        iequals(__LINE__, '\0', 0);
        !           646:        iequals(__LINE__, '\1', 1);
        !           647:        iequals(__LINE__, '\12', 012);
        !           648:        iequals(__LINE__, '\123', 0123);
        !           649:        
        !           650:        iequals(__LINE__, sizeof('0'), sizeof(int));
        !           651: 
        !           652: 
        !           653: 
        !           654: 
        !           655: 
        !           656: 
        !           657: 
        !           658: 
        !           659: #if (SIGNED_CHAR == 1 && MAX_UCHAR == 0xff)                                                                                            /* 3.1.3.4 (cont.) */
        !           660:        /* character constants sign extend */
        !           661:        iequals(__LINE__, '\377', -1);
        !           662: #else
        !           663: #if UNSIGNED_CHAR
        !           664:        /* character constants do not sign extend */
        !           665:        iequals(__LINE__, '\377', 255);
        !           666: #endif
        !           667: #endif
        !           668:        }
        !           669: 
        !           670: /*
        !           671:  * 3.1.4 - String literals.
        !           672:  */
        !           673: int distinct(s)
        !           674:        char *s;
        !           675:        {
        !           676:        int i, j;
        !           677: 
        !           678:        for (i = 0; s[i] != '\0'; ++i)
        !           679:                {
        !           680:                for (j = 0; s[j] != s[i]; ++j)
        !           681:                        ;
        !           682:                if (i != j)
        !           683:                        return (0);             /* s[i] is dup'ed by an earlier char */
        !           684:                }
        !           685:        return (1);
        !           686:        }
        !           687: #define OLD_ESC_CHARS "\"\\\b\f\n\r\t"
        !           688: #define SOURCE_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\
        !           689: 0123456789!#%&'()*+,-./:;<=>?[]^_{|}~"
        !           690: static void c3_1_4()
        !           691:        {
        !           692:        static char *p = "abc";
        !           693:        static char *q = OLD_ESC_CHARS;
        !           694:        static char *r = "abc";
        !           695:        /* check out all legal characters */
        !           696:        static char *s = SOURCE_CHARS;
        !           697:        static char *z = "";
        !           698: 
        !           699:        /* empty string */
        !           700:        iequals(__LINE__, z[0], 0);
        !           701:        
        !           702:        /* check for "array of char" behaviour and trailing null */
        !           703:        iequals(__LINE__, p[0], 'a');
        !           704:        iequals(__LINE__, p[1], 'b');
        !           705:        iequals(__LINE__, p[2], 'c');
        !           706:        iequals(__LINE__, p[3], '\0');
        !           707: 
        !           708: 
        !           709:                                                                                                                                                                                /* 3.1.3.4 (cont.) */
        !           710:        /* check escape sequences */
        !           711:        checkthat(__LINE__, distinct(q));
        !           712:        checkthat(__LINE__, distinct(s));
        !           713:        iequals(__LINE__, q[0], '\"');
        !           714:        iequals(__LINE__, q[1], '\\');
        !           715:        iequals(__LINE__, q[2], '\b');
        !           716:        iequals(__LINE__, q[3], '\f');
        !           717:        iequals(__LINE__, q[4], '\n');
        !           718:        iequals(__LINE__, q[5], '\r');
        !           719:        iequals(__LINE__, q[6], '\t');
        !           720: 
        !           721: #if ANSI
        !           722: #define NEW_ESC_CHARS "\a\v"
        !           723:                {
        !           724:                /* extra escape characters and string catenation */
        !           725:                static char *s = NEW_ESC_CHARS;
        !           726:                static char *t = "abc""def";
        !           727:                static char *u = SOURCE_CHARS OLD_ESC_CHARS NEW_ESC_CHARS ;
        !           728:                iequals(__LINE__, s[0], '\a');
        !           729:                iequals(__LINE__, s[1], '\v');
        !           730:                iequals(__LINE__, t[3], 'd');
        !           731:                iequals(__LINE__, t[6], '\0');
        !           732:                checkthat(__LINE__, distinct(u));
        !           733:                }
        !           734: #endif
        !           735: 
        !           736: #if V7 /* this changed in ANSI */
        !           737:        /* check for distinctness and writability of strings */
        !           738:                {
        !           739:                static char *u = "xyz";
        !           740:                static char *t = "xyz";
        !           741:        
        !           742:                u[0] = ivalue(0);
        !           743:                iequals(__LINE__, u[0], 0);
        !           744:                inotequals(__LINE__, t[0], 0);
        !           745:                }
        !           746: #endif
        !           747:        /* pure numbers through escapes */
        !           748:        s = "\0123";
        !           749:        iequals(__LINE__, 012, s[0]);
        !           750:        iequals(__LINE__, '3', s[1]);
        !           751: #if ANSI
        !           752:        s = "\x012""3";                                         /* The catenation "" is needed for ANSI8706 */
        !           753:        iequals(__LINE__, 0x12, s[0]);                                                  /* See 3.1.4 Example */
        !           754:        iequals(__LINE__, '3', s[1]);
        !           755: #if ANSI8706
        !           756:        checkthat(__LINE__, str_cmp("\x023", "\x02""3") != 0);  /* ANSI8706 */
        !           757: #endif
        !           758: #endif
        !           759:                                                                                                                                                                                /* 3.1.4 (cont.) */
        !           760:        /* strings are arrays of chars */
        !           761:        iequals(__LINE__, "abcd"[0], 'a');
        !           762:        iequals(__LINE__, "abcd"[1], 'b');
        !           763:        iequals(__LINE__, "abcd"[2], 'c');
        !           764:        iequals(__LINE__, "abcd"[3], 'd');
        !           765:        iequals(__LINE__, "abcd"[4], 0);
        !           766:        }
        !           767: 
        !           768: /*
        !           769:  * Operators.
        !           770:  * No capability requirements.
        !           771:  * Each operator will be tested later (c3_3 etc.).
        !           772:  */
        !           773: static void c3_1_5(){}
        !           774: 
        !           775: /*
        !           776:  * Punctuators.
        !           777:  * No capability requirements.
        !           778:  * Each use of punctuator in syntax will be tested later (c3_5, c3_6, c3_7, c3_8).
        !           779:  */
        !           780: static void c3_1_6(){}
        !           781: 
        !           782: /* 3.1.7 - Header names (tested throughout) */
        !           783: 
        !           784: /*
        !           785:  * 3.1.8 - Preprocessing numbers
        !           786:  */
        !           787: #if ANSI
        !           788:        #define STR(a) NXSTR(a)
        !           789:        #define NXSTR(a) #a
        !           790: #endif
        !           791: static void c3_1_8()
        !           792:        {
        !           793: #if PP_CAT_AND_STR
        !           794: #include "c318.h" /* to prevent non-ANSI lexical scan of ... */
        !           795: /*     #define CAT(a, b) NXCAT(a, b) */
        !           796: /*     #define NXCAT(a, b) a ## b */
        !           797: /*     iequals(__LINE__, str_cmp(STR(CAT(1., E9)), "1.E9"), 0); */
        !           798: /*     iequals(__LINE__, str_cmp(STR(CAT(1.u, 1E+)), "1.u1E+"), 0); */
        !           799: /* #define E 2 */
        !           800: /*     checkthat(__LINE__, 1E1 == 10.); */
        !           801: #endif
        !           802:        }
        !           803: 
        !           804: 
        !           805: 
        !           806: 
        !           807: 
        !           808: 
        !           809: /*
        !           810:  * Comments - 3.1.9
        !           811:  */
        !           812: /* /* no nesting */
        !           813: /* comment prevents preprocessing of its contents...
        !           814: #include "unknown"
        !           815: */
        !           816: 
        !           817: static void c3_1_9()
        !           818:        {
        !           819:        int i;
        !           820:        char c;
        !           821:        char *s;
        !           822: 
        !           823: 
        !           824: 
        !           825: 
        !           826: 
        !           827:        i = 2; s = "/*"; i = 3; /* no comment in string literal */
        !           828:        iequals(__LINE__, i, 3);
        !           829:        /* comment prevents compilation of its contents...
        !           830:        complain(__LINE__);
        !           831:        */
        !           832:        }
        !           833: 
        !           834: 
        !           835: 
        !           836: 
        !           837: 
        !           838: 
        !           839: 
        !           840: 
        !           841: 
        !           842: 
        !           843: 
        !           844: 
        !           845: 
        !           846: 
        !           847: 
        !           848: 
        !           849: 
        !           850: 
        !           851: 
        !           852: 
        !           853: 
        !           854: 
        !           855: 
        !           856: 
        !           857: 
        !           858: 
        !           859: /*
        !           860:  * 3.1 - Lexical elements
        !           861:  */
        !           862: void c3_1()
        !           863:        {
        !           864:        int a = 1;
        !           865:        int b = 2;
        !           866:        int c = 3;
        !           867: 
        !           868:        Filename = "c31.c";
        !           869: 
        !           870:        /* check for insignificance of white space */
        !           871: #if ANSI
        !           872: #include "c31h.h"
        !           873:        Filename = "c31.c";
        !           874: #else
        !           875:        iequals(__LINE__, (a+b-c),  (a +        b
        !           876:                                                        /* */-
        !           877:                                                        c));
        !           878: #endif
        !           879: 
        !           880:        /* a token uses the longest sequence of characters */
        !           881:        iequals(__LINE__, c+++b, 5);
        !           882:        iequals(__LINE__, b, 2);
        !           883:        iequals(__LINE__, c, 4);
        !           884: 
        !           885:        c3_1_1();
        !           886:        c3_1_2();
        !           887:        c3_1_2_1(19);
        !           888:        c3_1_2_2();
        !           889:        c3_1_2_3();
        !           890:        c3_1_2_4(0);
        !           891:        c3_1_2_5();
        !           892: #if ANSI8709
        !           893:        c3_1_2_6(&c3_1_2_6);
        !           894: #endif
        !           895:        c3_1_3_1();
        !           896:        c3_1_3_2();
        !           897:        c3_1_3_3();
        !           898:        c3_1_3_4();
        !           899:        c3_1_4();
        !           900:        c3_1_5();
        !           901:        c3_1_6();
        !           902:        c3_1_8();
        !           903:        c3_1_9();
        !           904:        }
        !           905: #else /* if SKIP31 */
        !           906: 
        !           907: void c3_1() { pr_skip("c3_1: SKIPPED ENTIRELY\n"); }
        !           908: #endif /* SKIP31 */
        !           909: 

unix.superglobalmegacorp.com

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