|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.