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

1.1       root        1: /* The Plum Hall Validation Suite for C
                      2:  * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
                      3:  * VERSION: 4
                      4:  * DATE: 1993-01-01
                      5:  * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
                      6:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
                      7:  * without specific permission from Plum Hall Inc.
                      8:  */
                      9: 
                     10: #include "flags.h"
                     11: #ifndef SKIP38
                     12: /*
                     13:  * 3.8 - Preprocessor directives
                     14:  */
                     15: #include "defs.h"
                     16: 
                     17: static char save_date[20], save_time[20];
                     18: static char tmp_str[20];
                     19: static int f(n) int n; { return (n); }
                     20: 
                     21: void c3_8_1();
                     22: void c3_8_2();
                     23: void c3_8_3();
                     24: void c3_8_4();
                     25: void c3_8_5();
                     26: void c3_8_6();
                     27: void c3_8_7();
                     28: void c3_8_8();
                     29: 
                     30: void c3_8()
                     31:        {
                     32:        Filename = "c38.c";
                     33: 
                     34: #if ANSI8709
                     35:        str_cpye(save_date, __DATE__);  /* to be tested in c3_8_8 */
                     36:        str_cpye(save_time, __TIME__);
                     37: #endif
                     38:        c3_8_1();
                     39:        c3_8_2();
                     40:        c3_8_3();
                     41:        c3_8_4();
                     42:        c3_8_5();
                     43:        c3_8_6();
                     44:        c3_8_7();
                     45:        c3_8_8();
                     46:        }
                     47: 
                     48: 
                     49: 
                     50: /*
                     51:  * 3.8.1 - conditional inclusion
                     52:  */
                     53: void c3_8_1()
                     54:        {
                     55: #define X 0
                     56: #define Y 1
                     57:        int i, j, k;
                     58: 
                     59:        i = j = k = 0;
                     60: 
                     61: #if 0
                     62:        complain(__LINE__);
                     63: #endif
                     64: 
                     65: #if ANSI
                     66:        #include "c381.h"
                     67:        /* contents of included file: 
                     68:         *      Filename = "c381.h";
                     69:         *      #if !defined X
                     70:         *              syntax error !!!
                     71:         *      #elif !defined (X)
                     72:         *              syntax error !!!
                     73:         *      #endif
                     74:         *      #define c3835 1
                     75:         */
                     76:        Filename = "c38.c";
                     77:        #if c3835 != 1
                     78:                complain(__LINE__);
                     79:        #endif
                     80: #endif
                     81: #if !~~0 == (1*2/3%4+6-5^7&8|9) || 10 > 11 && 12 >= 13
                     82:        complain(__LINE__);
                     83: #endif
                     84: #if UNDEFINED_NAME
                     85:        complain(__LINE__);
                     86: #endif
                     87: #if X
                     88:        complain(__LINE__);
                     89: #endif
                     90: #if ANSI
                     91:        #if ~0 > 2147483647
                     92:                complain(__LINE__);
                     93:        #endif
                     94: 
                     95:        #if '\33' != 033                        /* interpretation of escapes is implem-defined */
                     96:                complain(- __LINE__);
                     97:        #endif
                     98: 
                     99:        #if Y
                    100:                i = 3;
                    101:        #elif Y
                    102:                i = 4;
                    103:        #endif
                    104:        iequals(__LINE__, i, 3);
                    105: #endif
                    106: 
                    107: /* test nesting and else clauses */
                    108: #ifdef /* comments can appear anywhere */X
                    109: #ifndef UNDEFINED_NAME /* comments can appear anywhere */
                    110:        i = 7;
                    111: #else
                    112:        complain(__LINE__);
                    113: #endif
                    114: #else
                    115:        complain(__LINE__);
                    116: #endif /* comments can appear anywhere */
                    117:        iequals(__LINE__, i, 7);
                    118:        }
                    119: 
                    120: /*
                    121:  * 3.8.2  - Source file inclusion
                    122:  */
                    123: #if ANSI
                    124: #define NXSTR(a) #a                    /* See 3.8.3.2 */
                    125: #include NXSTR(stdarg.h)       /* produces "stdarg.h", then looks for <stdarg.h> */
                    126: #endif /* ANSI */
                    127: 
                    128: void c3_8_2()
                    129:        {
                    130:        char *p = NULL;
                    131: #if ANSI
                    132:        #  define INCLUDE "c382a.h"
                    133:        #       include INCLUDE
                    134: #else
                    135: #include "c382a.h"
                    136: #endif /* ANSI */
                    137:        /* contents of "c382a.h":       #include "c382b.h"
                    138:         * contents of "c382b.h":       int i;
                    139:         */
                    140:        i = 1;  /* syntax error if the include is wrong */
                    141: #if ANSI && !defined(va_start) /* to prove inclusion of <stdarg.h> */
                    142:        complain(__LINE__);     
                    143: #endif
                    144:        }
                    145: 
                    146: 
                    147: /*
                    148:  * 3.8.3 - Macro replacement
                    149:  */
                    150: void c3_8_3()
                    151:        {
                    152: #define INT_I_J_K int i, j, k; /* object-like macro */
                    153: #define NOTHING
                    154: #define INIT() = 1;                            /* fn-like macro, no args */
                    155: 
                    156:        INT_I_J_K               /* semi-colon is part of macro */
                    157: 
                    158:        NOTHING                 /* syntax error if anything remains */
                    159:        i INIT()                /* semi-colon is part of def -- i = 1; */
                    160:        j INIT()
                    161:        k INIT()
                    162: 
                    163: #if ANSI
                    164:        #define OBJ 1 + 1
                    165:        #define OBJ 1  +/* comment is whitespace */1
                    166:        #define OBJ    1   +   1
                    167:        # define/* */OBJ 1 + 1
                    168:        iequals(__LINE__, OBJ, 2);
                    169: 
                    170:        #define FN(a) 1 + 1
                    171:        #define FN(a) 1  +  /* comment is whitespace */ 1
                    172:        #define FN(a)    1   +   1
                    173:        # define  /* */ FN(a) 1 + 1
                    174:        iequals(__LINE__, FN(0), 2);
                    175: 
                    176:        #define define 1
                    177:        # define A 2
                    178:        iequals(__LINE__, A, 2);
                    179:        #undef define
                    180:        #undef A
                    181: #endif
                    182: /* comments can be embedded in other preprocessor statements */
                    183: #define /* */ SUM(c, /* */b, a) (a+b+/* */c /* */)
                    184: 
                    185:        /* grouping parenthesis and commas inside don't affect expansion 
                    186:         * Also, comments can now be ANYWHERE in the text. */
                    187: #if ANSI
                    188:        iequals(__LINE__, SUM(/* */(7,/* */i),
                    189:                (((3,j))),k), 3);
                    190: #endif
                    191:        /* make sure that macro expansion is literal, e.g., does no C grouping */
                    192: #define ADD(a,b) a+b
                    193:        iequals(__LINE__, ADD(2,3)*4, 14);
                    194: 
                    195: 
                    196:                                                                                                                                                                        /* 3.8.3 (cont.) */
                    197:        /* character constants and string literals are not scanned */
                    198:        inotequals(__LINE__, 'X', '0');
                    199:        inotequals(__LINE__, "X"[0], '0');
                    200: 
                    201:        /* nested definitions -- also, commas in expansion don't affect the expansion */
                    202: #define A B
                    203: #define B (j=1,C)
                    204: #define C X
                    205:        iequals(__LINE__, A, 0);
                    206: 
                    207: #if ANSI
                    208: 
                    209:        /* 3.8.3.1 - Argument substitution */
                    210:        #define f(a) (2 * f(a) + 1)
                    211:        iequals(__LINE__, f(f(1)), 7);
                    212:        #undef f
                    213: 
                    214:        /* 3.8.3.2 - The # operator */
                    215:        #define STR(a) NXSTR(a)
                    216:        #define NXSTR(a) #a
                    217:        #define NAME  /* whitespace */ abc
                    218: 
                    219:        stequals(__LINE__, STR("\a"), "\"\\a\"");
                    220:        stequals(__LINE__, STR(\7), "\7");
                    221:        stequals(__LINE__, STR(NAME), "abc");
                    222:        stequals(__LINE__, NXSTR(NAME), "NAME");
                    223:        stequals(__LINE__, NXSTR(a b), "a b");
                    224:        stequals(__LINE__, NXSTR(  a  ), "a");
                    225:        stequals(__LINE__, STR(Y.1), "1.1");
                    226:        #define f h
                    227:        #define h(a) a+f
                    228:        str_cpye(tmp_str, STR( f(1)(2) ));
                    229:        if (str_cmp(tmp_str, "1+f(2)") != 0 && str_cmp(tmp_str, "1+h(2)") != 0)
                    230:                stequals(__LINE__, tmp_str, "NEITHER '1+f(2)' NOR '1+h(2)'");
                    231: 
                    232:        #undef f
                    233:        #undef h
                    234: 
                    235: 
                    236: 
                    237: 
                    238: 
                    239: 
                    240: 
                    241: 
                    242: 
                    243: 
                    244: 
                    245: 
                    246:        /* 3.8.3.3 - The ## operator */
                    247:        #if MACRO_NOV_86
                    248:        #define CAT(a, b) NXCAT(a, b)
                    249:        #define NXCAT(a, b) a ## b
                    250:        #define Xx  x
                    251:                {
                    252:                int xy = 1;
                    253: 
                    254:                iequals(__LINE__, NXCAT(x, y), 1);
                    255:                iequals(__LINE__, CAT(Xx, y), 1);
                    256:                }
                    257: 
                    258:        #define pp1 x ## y
                    259:        #define pp3(a) x ## a
                    260:        #define xy b
                    261:        #define cat3() x ## x ## y
                    262:        #define op1(a) a
                    263:        #define op(n, a) op ## n (a)
                    264:                {
                    265:                int xxy = 1;
                    266:                int b = 2;
                    267:                int x = 3;
                    268: 
                    269:                iequals(__LINE__, pp3(xy), 1);          /* -> xxy */
                    270:                iequals(__LINE__, pp1, 2);                      /* -> xy -> b */
                    271:                iequals(__LINE__, pp3(y+2), 4);         /* -> xy + 2 -> b + 2 */
                    272:                iequals(__LINE__, pp3(xy + xy), 3);     /* -> xxy + xy -> xxy + b */
                    273:                iequals(__LINE__, cat3(), 1);           /* -> xxy */
                    274:                iequals(__LINE__, op(1, xxy), 1);       /* -> op1(xxy) -> xxy */
                    275:                }
                    276:        #endif /* MACRO_NOV_86 */
                    277: 
                    278:        /* 3.8.3.4 - Re-scanning and further replacement */
                    279:        #define f(a) f(1 + a
                    280:        #define apply(f, n) f(n)
                    281:                {
                    282:                #if MACRO_NOV_86
                    283:                iequals(__LINE__, f(1) ), 2);           /* -> f(1 + 1 ) */
                    284:                iequals(__LINE__, f(f(2)) )), 4);       /* -> f(1 + f(1 + 2 )) */
                    285:                iequals(__LINE__, f(1) + f(1) )), 4); /* -> f(1 + 1 + f(1 + 1 )) */
                    286:                iequals(__LINE__, apply(f, 2) ), 3); /* -> f(2) ) -> f(1 + 2 ) */
                    287:                #endif
                    288:                #undef f
                    289:                #define f g
                    290:                #define g f
                    291:                iequals(__LINE__, f(1), 1);             /* -> g(1) -> f(1) */
                    292:                #define checkthat  checkthat ( __LINE__, 0 == 0
                    293:                checkthat );
                    294:                #undef checkthat
                    295:                }
                    296:        /* 3.8.3.5 - Scope of macro definitions */
                    297:        #if !defined c3835
                    298:                complain(__LINE__);
                    299:        #endif
                    300:        #undef c3835
                    301:        #if defined c3835
                    302:                complain(__LINE__);
                    303:        #endif
                    304:        #undef c3835
                    305: 
                    306: #endif
                    307: 
                    308:        /* undef */
                    309: #undef INIT
                    310: #define INIT = 2;
                    311:        i INIT
                    312:        j INIT
                    313:        k INIT
                    314:        iequals(__LINE__, SUM(i,j,k), 6);
                    315: 
                    316:        /* __LINE__ and __FILE__ have been checked throughout */
                    317: 
                    318:        } /* end c3_8_3 */
                    319: 
                    320: /*
                    321:  * 3.8.4 - line control
                    322:  */
                    323: void c3_8_4()
                    324:        {
                    325:        int i;
                    326: 
                    327: #if (V7 || ANSI)
                    328: #line 32767
                    329:        i = __LINE__;
                    330: #line 336 "newfile"
                    331:        iequals(__LINE__, i, 32767);
                    332:        checkthat( - __LINE__, str_cmp(__FILE__, "newfile") == 0);
                    333: #line 339 "c38.c"
                    334:        iequals(__LINE__, __LINE__, 339);
                    335:        checkthat( - __LINE__, str_cmp(__FILE__, "c38.c") == 0);
                    336: #if ANSI
                    337:        #define ALINE 10306 "X38.c"
                    338: 
                    339:        #line ALINE
                    340:        i = __LINE__;
                    341:        #line 347
                    342:        iequals(__LINE__, i, 10306);
                    343:        checkthat( - __LINE__, str_cmp(__FILE__, "X38.c") == 0);
                    344:        #line 350 "c38.c"
                    345: #endif /* ANSI */
                    346: #endif /* V7 || ANSI */
                    347:        } /* end c3_8_4 */
                    348: 
                    349: /*
                    350:  * 3.8.5  - #error directive
                    351:  */
                    352: void c3_8_5()
                    353:        {
                    354:        /* #error is tested in diagnostic-tests */
                    355:        }
                    356: 
                    357: /*
                    358:  * 3.8.6  - #pragma directive
                    359:  */
                    360: void c3_8_6()
                    361:        {
                    362: #if ANSI
                    363:        #include "c386.h"
                    364:        /* contents of included file: 
                    365:         *      #pragma ignore_this_unimplemented_pragma
                    366:         */
                    367: #endif
                    368:        }
                    369: 
                    370: /*
                    371:  * 3.8.7  - Null directive
                    372:  */
                    373: void c3_8_7()
                    374:        {
                    375: #if ANSI
                    376:        #       /* comments */          /* and other whitespace */  /* allowed */
                    377:        #
                    378:        #
                    379: #endif
                    380:        }
                    381: 
                    382: 
                    383: 
                    384: 
                    385: 
                    386: 
                    387: 
                    388: 
                    389: 
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: 
                    397: /*
                    398:  * 3.8.8  - Predefined macro names
                    399:  */
                    400: void c3_8_8()
                    401:        {
                    402: #if ANSI
                    403:        /* __LINE__ and __FILE__ already tested */
                    404: #if ANSI8709
                    405:        stequals(__LINE__, save_date, __DATE__);
                    406:        stequals(__LINE__, save_time, __TIME__);
                    407: #endif /* ANSI8709 */
                    408:        iequals(__LINE__, str_len(__DATE__), 11);
                    409:        iequals(__LINE__, __DATE__[3], ' ');
                    410:        iequals(__LINE__, __DATE__[6], ' ');
                    411:        iequals(__LINE__, __DATE__[7], '1');
                    412:        iequals(__LINE__, __DATE__[8], '9');
                    413:        iequals(__LINE__, str_len(__TIME__), 8);
                    414:        iequals(__LINE__, __TIME__[2], ':');
                    415:        iequals(__LINE__, __TIME__[5], ':');
                    416:        iequals(__LINE__, __STDC__, 1);
                    417: #else
                    418: #ifdef __STDC__
                    419:        warning -- __STDC__ should only be pre-defined in conforming environment
                    420: #endif /* __STDC__ */
                    421: #endif /* ANSI */
                    422:        } /* end c3_8 */
                    423: 
                    424: #else /* if SKIP38 */
                    425: 
                    426: void c3_8() { pr_skip("c3_8: SKIPPED ENTIRELY\n"); }
                    427: #endif /* SKIP38 */
                    428: 

unix.superglobalmegacorp.com

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