|
|
1.1 ! root 1: struct defs { ! 2: int cbits; /* No. of bits per char */ ! 3: int ibits; /* int */ ! 4: int sbits; /* short */ ! 5: int lbits; /* long */ ! 6: int ubits; /* unsigned */ ! 7: int fbits; /* float */ ! 8: int dbits; /* double */ ! 9: float fprec; /* Smallest number that can be */ ! 10: float dprec; /* significantly added to 1. */ ! 11: int flgs; /* Print return codes, by section */ ! 12: int flgm; /* Announce machine dependencies */ ! 13: int flgd; /* give explicit diagnostics */ ! 14: int flgl; /* Report local return codes. */ ! 15: int rrc; /* recent return code */ ! 16: int crc; /* Cumulative return code */ ! 17: char rfs[8]; /* Return from section */ ! 18: }; ! 19: main(n,args) /* C REFERENCE MANUAL */ ! 20: int n; ! 21: char **args; ! 22: { ! 23: ! 24: /* This program performs a series of tests on a C compiler, ! 25: based on information in the ! 26: ! 27: C REFERENCE MANUAL ! 28: ! 29: which appears as Appendix A to the book "The C Programming ! 30: Language" by Brian W. Kernighan and Dennis M. Ritchie ! 31: (Prentice-Hall, 1978, $10.95). This Appendix is hereafter ! 32: referred to as "the Manual". ! 33: ! 34: The rules followed in writing this program are: ! 35: ! 36: 1. The entire program is written in legal C, according ! 37: to the Manual. It should compile with no error messages, ! 38: although some warning messages may be produced by some ! 39: compilers. Failure to compile should be interpreted as ! 40: a compiler error. ! 41: ! 42: 2. The program is clean, in that it does not make use ! 43: of any features of the operating system on which it runs, ! 44: with the sole exceptions of the printf() function, and an ! 45: internal "options" routine, which is easily excised. ! 46: ! 47: 3. No global variables are used, except for the spec- ! 48: ific purpose of testing the global variable facility. ! 49: ! 50: The program is divided into modules having names of the ! 51: form snnn... These modules correspond to those sections of the ! 52: Manual, as identified by boldface type headings, in which ! 53: there is something to test. For example, s241() corresponds ! 54: to section 2.4.1 of the Manual (Integer constants) and tests ! 55: the facilities described therein. The module numbering ! 56: scheme is ambiguous, especially when it names modules ! 57: referring to more than one section; module s7813, for ex- ! 58: ample, deals with sections 7.8 through 7.13. Nonetheless, ! 59: it is surprisingly easy to find a section in the Manual ! 60: corresponding to a section of code, and vice versa. ! 61: ! 62: Note also that there seem to be "holes" in the program, ! 63: at least from the point of view that there exist sections in the ! 64: Manual for which there is no corresponding code. Such holes ! 65: arise from three causes: (a) there is nothing in that partic- ! 66: ular section to test, (b) everything in that section is tested ! 67: elsewhere, and (c) it was deemed advisable not to check cer- ! 68: tain features like preprocessor or listing control features. ! 69: ! 70: Modules are called by a main program main(). The mod- ! 71: ules that are called, and the sequence in which they are ! 72: called, are determined by two lists in main(), in which the ! 73: module names appear. The first list (an extern statement) ! 74: declares the module names to be external. The second (a stat- ! 75: ic int statement) names the modules and defines the sequence ! 76: in which they are called. There is no need for these lists ! 77: to be in the same order, but it is probably a good idea to keep ! 78: them that way in the interest of clarity. Since there are no ! 79: cross-linkages between modules, new modules may be added, ! 80: or old ones deleted, simply by editing the lists, with one ! 81: exception: section s26, which pokes around at the hardware ! 82: trying to figure out the characteristics of the machine that ! 83: it is running on, saves information that is subsequently ! 84: used by sections s626, s72, and s757. If this program is ! 85: to be broken up into smallish pieces, say for running on ! 86: a microcomputer, take care to see that s26 is called before ! 87: calling any of the latter three sections. The size ! 88: of the lists, i.e., the number of modules to be called, is ! 89: not explicitly specified as a program parameter, but is ! 90: determined dynamically using the sizeof operator. ! 91: ! 92: Communication between the main program and the modules ! 93: takes place in two ways. In all cases, a pointer to a structure ! 94: is passed to the called module. The structure contains flags ! 95: that will determine the type of information to be published ! 96: by the module, and fields that may be written in by the ! 97: module. The former include "flgm" and "flgd", which, if set ! 98: to a nonzero value, specify that machine dependencies are to ! 99: be announced or that error messages are to be printed, re- ! 100: spectively. The called module's name, and the hardware char- ! 101: acteristics probed in s26() comprise the latter. ! 102: ! 103: ! 104: Also, in all cases, a return code is returned by the called ! 105: module. A return code of zero indicates that all has gone well; ! 106: nonzero indicates otherwise. Since more than one type of error ! 107: may be detected by a module, the return code is a composite ! 108: of error indicators, which, individually, are given as numbers ! 109: that are powers of two. Thus, a return code of 10 indicates ! 110: that two specific errors, 8 and 2, were detected. Whether or ! 111: not the codes returned by the modules are printed by the main ! 112: program is determined by setting "flgs" to 1 (resp. 0). ! 113: ! 114: The entire logic of the main program is contained in the ! 115: half-dozen or so lines at the end. The somewhat cryptic ! 116: statement: ! 117: ! 118: d0.rrc = (*sec[j])(pd0); ! 119: ! 120: in the for loop calls the modules. The rest of the code is ! 121: reasonably straightforward. ! 122: ! 123: Finally, in each of the modules, there is the following ! 124: prologue: ! 125: ! 126: snnn(pd0) ! 127: struct defs *pd0; ! 128: { ! 129: static char snnner[] = "snnn,er%d\n"; ! 130: static char qsnnn[8] = "snnn "; ! 131: char *ps, *pt; ! 132: int rc; ! 133: ! 134: rc = 0; ! 135: ps = qsnnn; ! 136: pt = pd0->rfs; ! 137: while(*pt++ = *ps++); ! 138: ! 139: used for housekeeping, handshaking and module initialization. ! 140: ! 141: */ ! 142: extern ! 143: s22(), ! 144: s241(), ! 145: s243(), ! 146: s244(), ! 147: s25(), ! 148: s26(), ! 149: s4(), ! 150: s61(), ! 151: s626(), ! 152: s71(), ! 153: s72(), ! 154: s757(), ! 155: s7813(), ! 156: s714(), ! 157: s715(), ! 158: s81(), ! 159: s84(), ! 160: s85(), ! 161: s86(), ! 162: s88(), ! 163: s9() ! 164: ; ! 165: ! 166: int j; ! 167: static int (*sec[])() = { ! 168: s22, ! 169: s241, ! 170: s243, ! 171: s244, ! 172: s25, ! 173: s26, ! 174: s4, ! 175: s61, ! 176: s626, ! 177: s71, ! 178: s72, ! 179: s757, ! 180: s7813, ! 181: s714, ! 182: s715, ! 183: s81, ! 184: s84, ! 185: s85, ! 186: s86, ! 187: s88, ! 188: s9 ! 189: }; ! 190: ! 191: static struct defs d0, *pd0; ! 192: ! 193: d0.flgs = 1; /* These flags dictate */ ! 194: d0.flgm = 1; /* the verbosity of */ ! 195: d0.flgd = 1; /* the program. */ ! 196: d0.flgl = 1; ! 197: ! 198: pd0 = &d0; ! 199: ! 200: for (j=0; j<sizeof(sec) / sizeof(sec[0]); j++) { ! 201: d0.rrc = (*sec[j])(pd0); ! 202: d0.crc = d0.crc+d0.rrc; ! 203: if(d0.flgs != 0) printf("Section %s returned %d.\n",d0.rfs,d0.rrc); ! 204: } ! 205: ! 206: if(d0.crc == 0) printf("\nNo errors detected.\n"); ! 207: else printf("\nFailed.\n"); ! 208: return 0; ! 209: } ! 210: s22(pd0) /* 2.2 Identifiers (Names) */ ! 211: struct defs *pd0; ! 212: { ! 213: int a234, a; ! 214: int _, _234, A, rc; ! 215: ! 216: static char s22er[] = "s22,er%d\n"; ! 217: static char qs22[8] = "s22 "; ! 218: ! 219: char *ps, *pt; ! 220: /* Initialize */ ! 221: ! 222: rc = 0; ! 223: ps = qs22; ! 224: pt = pd0 -> rfs; ! 225: while (*pt++ = *ps++); ! 226: ! 227: /* An identifier is a sequence of letters and digits; ! 228: the first character must be a letter. The under- ! 229: score _ counts as a letter. */ ! 230: ! 231: a=1; ! 232: _=2; ! 233: _234=3; ! 234: a234=4; ! 235: if(a+_+_234+a234 != 10) { ! 236: rc = rc+1; ! 237: if(pd0->flgd != 0) printf(s22er,1); ! 238: } ! 239: ! 240: /* Upper and lower case letters are different. */ ! 241: ! 242: A = 2; ! 243: if (A == a) { ! 244: rc = rc+4; ! 245: if (pd0->flgd != 0) printf(s22er,4); ! 246: } ! 247: ! 248: return(rc); ! 249: } ! 250: s241(pd0) /* 2.4.1 Integer constants ! 251: 2.4.2 Explicit long constants */ ! 252: struct defs *pd0; ! 253: { ! 254: long pow2(); ! 255: static char s241er[] = "s241,er%d\n"; ! 256: static char qs241[8] = "s241 "; ! 257: char *ps, *pt; ! 258: int rc, j, lrc; ! 259: static long g[39] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ! 260: 0,6,0,8,0,12,0,16,0,18,0,20,0,24, ! 261: 0,28,0,30,0,32,0,36}; ! 262: long d[39], o[39], x[39]; ! 263: ! 264: rc = 0; ! 265: lrc = 0; ! 266: ps = qs241; ! 267: pt = pd0 -> rfs; ! 268: while (*pt++ = *ps++); ! 269: ! 270: /* An integer constant consisting of a sequence of digits is ! 271: taken to be octal if it begins with 0 (digit zero), decimal ! 272: otherwise. */ ! 273: ! 274: if ( 8 != 010 ! 275: || 16 != 020 ! 276: || 24 != 030 ! 277: || 32 != 040 ! 278: || 40 != 050 ! 279: || 48 != 060 ! 280: || 56 != 070 ! 281: || 64 != 0100 ! 282: || 72 != 0110 ! 283: || 80 != 0120 ! 284: || 9 != 0011 ! 285: || 17 != 0021 ! 286: || 25 != 0031 ! 287: || 33 != 0041 ! 288: || 41 != 0051 ! 289: || 49 != 0061 ! 290: || 57 != 0071 ! 291: || 65 != 0101 ! 292: || 73 != 0111 ! 293: || 81 != 0121 ){ ! 294: ! 295: rc = rc+1; ! 296: if( pd0->flgd != 0 ) printf(s241er,1); ! 297: } ! 298: ! 299: /* A sequence of digits preceded by 0x or 0X (digit zero) ! 300: is taken to be a hexadecimal integer. The hexadecimal ! 301: digits include a or A through f or F with values 10 ! 302: through 15. */ ! 303: ! 304: if ( 0x00abcdef != 0xabcdef ! 305: || 0xabcdef != 0Xabcdef || 0Xabcdef != 0XAbcdef ! 306: || 0XAbcdef != 0XABcdef || 0XABcdef != 0XABCdef ! 307: || 0XABCdef != 0XABCDef || 0XABCDef != 0XABCDEf ! 308: || 0XABCDEf != 0XABCDEF || 0xABCDEF != 11259375 ){ ! 309: ! 310: rc = rc+2; ! 311: if( pd0->flgd != 0 ) printf(s241er,2); ! 312: } ! 313: ! 314: /* A decimal constant whose value exceeds the largest signed ! 315: machine integer is taken to be long; an octal or hex con- ! 316: stant which exceeds the largest unsigned machine integer ! 317: is likewise taken to be long. */ ! 318: ! 319: if ( sizeof 010000000000 != sizeof(long) /* 2**30 */ ! 320: || sizeof 1073741824 != sizeof(long) /* ditto */ ! 321: || sizeof 0x40000000 != sizeof(long) ){ /* " */ ! 322: ! 323: rc = rc+4; ! 324: if( pd0->flgd != 0 ) printf(s241er,4); ! 325: } ! 326: ! 327: /* A decimal, octal, or hexadecimal constant immediately followed ! 328: by l (letter ell) or L is a long constant. */ ! 329: ! 330: if ( sizeof 67l != sizeof(long) ! 331: || sizeof 67L != sizeof(long) ! 332: || sizeof 067l != sizeof(long) ! 333: || sizeof 067L != sizeof(long) ! 334: || sizeof 0X67l != sizeof(long) ! 335: || sizeof 0x67L != sizeof(long) ){ ! 336: ! 337: rc = rc+8; ! 338: if( pd0 -> flgd != 0 ) printf(s241er,8); ! 339: } ! 340: ! 341: /* Finally, we test to see that decimal (d), octal (o), ! 342: and hexadecimal (x) constants representing the same values ! 343: agree among themselves, and with computed values, at spec- ! 344: ified points over an appropriate range. The points select- ! 345: ed here are those with the greatest potential for caus- ! 346: ing trouble, i.e., zero, 1-16, and values of 2**n and ! 347: 2**n - 1 where n is some multiple of 4 or 6. Unfortunately, ! 348: just what happens when a value is too big to fit in a ! 349: long is undefined; however, it would be nice if what ! 350: happened were at least consistent... */ ! 351: ! 352: for ( j=0; j<17; j++ ) g[j] = j; ! 353: for ( j=18; j<39; ) { ! 354: g[j] = pow2(g[j]); ! 355: g[j-1] = g[j] - 1; ! 356: j = j+2; ! 357: } ! 358: ! 359: d[0] = 0; o[0] = 00; x[0] = 0x0; ! 360: d[1] = 1; o[1] = 01; x[1] = 0x1; ! 361: d[2] = 2; o[2] = 02; x[2] = 0x2; ! 362: d[3] = 3; o[3] = 03; x[3] = 0x3; ! 363: d[4] = 4; o[4] = 04; x[4] = 0x4; ! 364: d[5] = 5; o[5] = 05; x[5] = 0x5; ! 365: d[6] = 6; o[6] = 06; x[6] = 0x6; ! 366: d[7] = 7; o[7] = 07; x[7] = 0x7; ! 367: d[8] = 8; o[8] = 010; x[8] = 0x8; ! 368: d[9] = 9; o[9] = 011; x[9] = 0x9; ! 369: d[10] = 10; o[10] = 012; x[10] = 0xa; ! 370: d[11] = 11; o[11] = 013; x[11] = 0xb; ! 371: d[12] = 12; o[12] = 014; x[12] = 0xc; ! 372: d[13] = 13; o[13] = 015; x[13] = 0xd; ! 373: d[14] = 14; o[14] = 016; x[14] = 0xe; ! 374: d[15] = 15; o[15] = 017; x[15] = 0xf; ! 375: d[16] = 16; o[16] = 020; x[16] = 0x10; ! 376: d[17] = 63; o[17] = 077; x[17] = 0x3f; ! 377: d[18] = 64; o[18] = 0100; x[18] = 0x40; ! 378: d[19] = 255; o[19] = 0377; x[19] = 0xff; ! 379: d[20] = 256; o[20] = 0400; x[20] = 0x100; ! 380: d[21] = 4095; o[21] = 07777; x[21] = 0xfff; ! 381: d[22] = 4096; o[22] = 010000; x[22] = 0x1000; ! 382: d[23] = 65535; o[23] = 0177777; x[23] = 0xffff; ! 383: d[24] = 65536; o[24] = 0200000; x[24] = 0x10000; ! 384: d[25] = 262143; o[25] = 0777777; x[25] = 0x3ffff; ! 385: d[26] = 262144; o[26] = 01000000; x[26] = 0x40000; ! 386: d[27] = 1048575; o[27] = 03777777; x[27] = 0xfffff; ! 387: d[28] = 1048576; o[28] = 04000000; x[28] = 0x100000; ! 388: d[29] = 16777215; o[29] = 077777777; x[29] = 0xffffff; ! 389: d[30] = 16777216; o[30] = 0100000000; x[30] = 0x1000000; ! 390: d[31] = 268435455; o[31] = 01777777777; x[31] = 0xfffffff; ! 391: d[32] = 268435456; o[32] = 02000000000; x[32] = 0x10000000; ! 392: d[33] = 1073741823; o[33] = 07777777777; x[33] = 0x3fffffff; ! 393: d[34] = 1073741824; o[34] = 010000000000; x[34] = 0x40000000; ! 394: d[35] = 4294967295; o[35] = 037777777777; x[35] = 0xffffffff; ! 395: d[36] = 4294967296; o[36] = 040000000000; x[36] = 0x100000000; ! 396: d[37] = 68719476735; o[37] = 0777777777777; x[37] = 0xfffffffff; ! 397: d[38] = 68719476736; o[38] = 01000000000000; x[38] = 0x1000000000; ! 398: ! 399: /* WHEW! */ ! 400: ! 401: for (j=0; j<39; j++){ ! 402: if ( g[j] != d[j] ! 403: || d[j] != o[j] ! 404: || o[j] != x[j]) { ! 405: ! 406: if( pd0 -> flgm != 0 ) { ! 407: /* printf(s241er,16); save in case opinions change... */ ! 408: printf("Decimal and octal/hex constants sometimes give\n"); ! 409: printf(" different results when assigned to longs.\n"); ! 410: } ! 411: /* lrc = 1; save... */ ! 412: } ! 413: } ! 414: ! 415: if (lrc != 0) rc =16; ! 416: ! 417: return rc; ! 418: } ! 419: ! 420: long pow2(n) /* Calculate 2**n by multiplying, not shifting */ ! 421: long n; ! 422: { ! 423: long s; ! 424: s = 1; ! 425: while(n--) s = s*2; ! 426: return s; ! 427: } ! 428: s243(pd0) /* 2.4.3 Character constants */ ! 429: struct defs *pd0; ! 430: { ! 431: static char s243er[] = "s243,er%d\n"; ! 432: static char qs243[8] = "s243 "; ! 433: char *ps, *pt; ! 434: int rc; ! 435: char chars[256]; ! 436: ! 437: rc = 0; ! 438: ps = qs243; ! 439: pt = pd0->rfs; ! 440: while(*pt++ = *ps++); ! 441: ! 442: /* One of the problems that arises when testing character constants ! 443: is that of definition: What, exactly, is the character set? ! 444: In order to guarantee a certain amount of machine independence, ! 445: the character set we will use here is the set of characters writ- ! 446: able as escape sequences in C, plus those characters used in writ- ! 447: ing C programs, i.e., ! 448: ! 449: letters: ! 450: ABCDEFGHIJKLMNOPQRSTUVWXYZ 26 ! 451: abcdefghijklmnopqrstuvwxyz 26 ! 452: numbers: ! 453: 0123456789 10 ! 454: special characters: ! 455: ~!"#%&()_=-^|{}[]+;*:<>,.?/ 27 ! 456: extra special characters: ! 457: newline \n ! 458: horizontal tab \t ! 459: backspace \b ! 460: carriage return \r ! 461: form feed \f ! 462: backslash \\ ! 463: single quote \' 7 ! 464: blank & NUL 2 ! 465: --- ! 466: 98 ! 467: ! 468: Any specific implementation of C may of course support additional ! 469: characters. */ ! 470: ! 471: /* Since the value of a character constant is the numerical value ! 472: of the character in the machine's character set, there should ! 473: be a one-to-one correspondence between characters and values. */ ! 474: ! 475: zerofill(chars); ! 476: ! 477: chars['a'] = 1; chars['A'] = 1; chars['~'] = 1; chars['0'] = 1; ! 478: chars['b'] = 1; chars['B'] = 1; chars['!'] = 1; chars['1'] = 1; ! 479: chars['c'] = 1; chars['C'] = 1; chars['"'] = 1; chars['2'] = 1; ! 480: chars['d'] = 1; chars['D'] = 1; chars['#'] = 1; chars['3'] = 1; ! 481: chars['e'] = 1; chars['E'] = 1; chars['%'] = 1; chars['4'] = 1; ! 482: chars['f'] = 1; chars['F'] = 1; chars['&'] = 1; chars['5'] = 1; ! 483: chars['g'] = 1; chars['G'] = 1; chars['('] = 1; chars['6'] = 1; ! 484: chars['h'] = 1; chars['H'] = 1; chars[')'] = 1; chars['7'] = 1; ! 485: chars['i'] = 1; chars['I'] = 1; chars['_'] = 1; chars['8'] = 1; ! 486: chars['j'] = 1; chars['J'] = 1; chars['='] = 1; chars['9'] = 1; ! 487: chars['k'] = 1; chars['K'] = 1; chars['-'] = 1; ! 488: chars['l'] = 1; chars['L'] = 1; chars['^'] = 1; ! 489: chars['m'] = 1; chars['M'] = 1; chars['|'] = 1; chars['\n'] = 1; ! 490: chars['n'] = 1; chars['N'] = 1; chars['\t'] = 1; ! 491: chars['o'] = 1; chars['O'] = 1; chars['{'] = 1; chars['\b'] = 1; ! 492: chars['p'] = 1; chars['P'] = 1; chars['}'] = 1; chars['\r'] = 1; ! 493: chars['q'] = 1; chars['Q'] = 1; chars['['] = 1; chars['\f'] = 1; ! 494: chars['r'] = 1; chars['R'] = 1; chars[']'] = 1; ! 495: chars['s'] = 1; chars['S'] = 1; chars['+'] = 1; chars['\\'] = 1; ! 496: chars['t'] = 1; chars['T'] = 1; chars[';'] = 1; chars['\''] = 1; ! 497: chars['u'] = 1; chars['U'] = 1; chars['*'] = 1; ! 498: chars['v'] = 1; chars['V'] = 1; chars[':'] = 1; chars['\0'] = 1; ! 499: chars['w'] = 1; chars['W'] = 1; chars['<'] = 1; chars[' '] = 1; ! 500: chars['x'] = 1; chars['X'] = 1; chars['>'] = 1; ! 501: chars['y'] = 1; chars['Y'] = 1; chars[','] = 1; ! 502: chars['z'] = 1; chars['Z'] = 1; chars['.'] = 1; ! 503: chars['?'] = 1; ! 504: chars['/'] = 1; ! 505: ! 506: if(sumof(chars) != 98){ ! 507: rc = rc+1; ! 508: if(pd0->flgd != 0) printf(s243er,1); ! 509: } ! 510: ! 511: /* Finally, the escape \ddd consists of the backslash followed ! 512: by 1, 2, or 3 octal digits which are taken to specify the ! 513: desired character. */ ! 514: ! 515: if( '\0' != 0 || '\01' != 1 || '\02' != 2 ! 516: || '\03' != 3 || '\04' != 4 || '\05' != 5 ! 517: || '\06' != 6 || '\07' != 7 || '\10' != 8 ! 518: || '\17' != 15 || '\20' != 16 || '\77' != 63 ! 519: || '\100' != 64 || '\177' != 127 ){ ! 520: ! 521: rc = rc+8; ! 522: if(pd0->flgd != 0) printf(s243er,8); ! 523: } ! 524: ! 525: return rc; ! 526: } ! 527: zerofill(x) ! 528: char *x; ! 529: { ! 530: int j; ! 531: ! 532: for (j=0; j<256; j++) *x++ = 0; ! 533: } ! 534: sumof(x) ! 535: char *x; ! 536: { ! 537: char *p; ! 538: int total, j; ! 539: ! 540: p = x; ! 541: total = 0; ! 542: ! 543: for(j=0; j<256; j++) total = total+ *p++; ! 544: return total; ! 545: } ! 546: s244(pd0) ! 547: struct defs *pd0; ! 548: { ! 549: double a[8]; ! 550: int rc, lrc, j; ! 551: static char s244er[] = "s244,er%d\n"; ! 552: static char qs244[8] = "s244 "; ! 553: char *ps, *pt; ! 554: ! 555: ps = qs244; ! 556: pt = pd0->rfs; ! 557: while(*pt++ = *ps++); ! 558: rc = 0; ! 559: lrc = 0; ! 560: ! 561: /* Unfortunately, there's not a lot we can do with floating constants. ! 562: We can check to see that the various representations can be com- ! 563: piled, that the conversion is such that they yield the same hard- ! 564: ware representations in all cases, and that all representations ! 565: thus checked are double precision. */ ! 566: ! 567: a[0] = .1250E+04; ! 568: a[1] = 1.250E3; ! 569: a[2] = 12.50E02; ! 570: a[3] = 125.0e+1; ! 571: a[4] = 1250e00; ! 572: a[5] = 12500.e-01; ! 573: a[6] = 125000e-2; ! 574: a[7] = 1250.; ! 575: ! 576: lrc = 0; ! 577: for (j=0; j<7; j++) if(a[j] != a[j+1]) lrc = 1; ! 578: ! 579: if(lrc != 0) { ! 580: if(pd0->flgd != 0) printf(s244er,1); ! 581: rc = rc+1; ! 582: } ! 583: ! 584: if ( (sizeof .1250E+04 ) != sizeof(double) ! 585: || (sizeof 1.250E3 ) != sizeof(double) ! 586: || (sizeof 12.50E02 ) != sizeof(double) ! 587: || (sizeof 1.250e+1 ) != sizeof(double) ! 588: || (sizeof 1250e00 ) != sizeof(double) ! 589: || (sizeof 12500.e-01) != sizeof(double) ! 590: || (sizeof 125000e-2 ) != sizeof(double) ! 591: || (sizeof 1250. ) != sizeof(double)){ ! 592: ! 593: if(pd0->flgd != 0) printf(s244er,2); ! 594: rc = rc+2; ! 595: } ! 596: ! 597: return rc; ! 598: } ! 599: s25(pd0) ! 600: struct defs *pd0; ! 601: { ! 602: char *s, *s2; ! 603: int rc, lrc, j; ! 604: static char s25er[] = "s25,er%d\n"; ! 605: static char qs25[8] = "s25 "; ! 606: char *ps, *pt; ! 607: ! 608: ps = qs25; ! 609: pt = pd0->rfs; ! 610: while(*pt++ = *ps++); ! 611: rc = 0; ! 612: ! 613: /* A string is a sequence of characters surrounded by double ! 614: quotes, as in "...". */ ! 615: ! 616: s = "..."; ! 617: ! 618: /* A string has type "array of characters" and storage class ! 619: static and is initialized with the given characters. */ ! 620: ! 621: if ( s[0] != s[1] || s[1] != s[2] ! 622: || s[2] != '.' ) { ! 623: ! 624: rc = rc+1; ! 625: if(pd0->flgd != 0) printf(s25er,1); ! 626: } ! 627: ! 628: /* The compiler places a null byte \0 at the end of each string ! 629: so the program which scans the string can find its end. */ ! 630: ! 631: if( s[3] != '\0' ){ ! 632: rc = rc+4; ! 633: if(pd0->flgd != 0) printf(s25er,4); ! 634: } ! 635: ! 636: /* In a string, the double quote character " must be preceded ! 637: by a \. */ ! 638: ! 639: if( ".\"."[1] != '"' ){ ! 640: rc = rc+8; ! 641: if(pd0->flgd != 0) printf(s25er,8); ! 642: } ! 643: ! 644: /* In addition, the same escapes described for character constants ! 645: may be used. */ ! 646: ! 647: s = "\n\t\b\r\f\\\'"; ! 648: ! 649: if( s[0] != '\n' ! 650: || s[1] != '\t' ! 651: || s[2] != '\b' ! 652: || s[3] != '\r' ! 653: || s[4] != '\f' ! 654: || s[5] != '\\' ! 655: || s[6] != '\'' ){ ! 656: ! 657: rc = rc+16; ! 658: if( pd0->flgd != 0) printf(s25er,16); ! 659: } ! 660: ! 661: /* Finally, a \ and an immediately following newline are ignored */ ! 662: ! 663: s2 = "queep!"; ! 664: s = "queep!"; ! 665: ! 666: lrc = 0; ! 667: for (j=0; j<sizeof "queep!"; j++) if(s[j] != s2[j]) lrc = 1; ! 668: if (lrc != 0){ ! 669: rc = rc+32; ! 670: if(pd0->flgd != 0) printf(s25er,32); ! 671: } ! 672: return rc; ! 673: } ! 674: s26(pd0) /* 2.6 Hardware Characteristics */ ! 675: struct defs *pd0; ! 676: { ! 677: static char qs26[8] = "s26 "; ! 678: char *ps, *pt; ! 679: char c0, c1; ! 680: float temp, one, delta; ! 681: double tempd, oned; ! 682: static char s[] = "%3d bits in %ss.\n"; ! 683: static char s2[] = "%e is the least number that can be added to 1. (%s).\n"; ! 684: ! 685: ps = qs26; ! 686: pt = pd0->rfs; ! 687: ! 688: while(*pt++ = *ps++); ! 689: ! 690: /* Here, we shake the machinery a little to see what falls ! 691: out. First, we find out how many bits are in a char. */ ! 692: ! 693: pd0->cbits = 0; ! 694: c0 = 0; ! 695: c1 = 1; ! 696: ! 697: while(c0 != c1) { ! 698: c1 = c1<<1; ! 699: pd0->cbits = pd0->cbits+1; ! 700: } ! 701: /* That information lets us determine the size of everything else. */ ! 702: ! 703: pd0->ibits = pd0->cbits * sizeof(int); ! 704: pd0->sbits = pd0->cbits * sizeof(short); ! 705: pd0->lbits = pd0->cbits * sizeof(long); ! 706: pd0->ubits = pd0->cbits * sizeof(unsigned); ! 707: pd0->fbits = pd0->cbits * sizeof(float); ! 708: pd0->dbits = pd0->cbits * sizeof(double); ! 709: ! 710: /* We have now almost reconstructed the table in section 2.6, the ! 711: exception being the range of the floating point hardware. ! 712: Now there are just so many ways to conjure up a floating point ! 713: representation system that it's damned near impossible to guess ! 714: what's going on by writing a program to interpret bit patterns. ! 715: Further, the information isn't all that useful, if we consider ! 716: the fact that machines that won't handle numbers between 10**30 ! 717: and 10**-30 are very hard to find, and that people playing with ! 718: numbers outside that range have a lot more to worry about than ! 719: just the capacity of the characteristic. ! 720: ! 721: A much more useful measure is the precision, which can be ex- ! 722: pressed in terms of the smallest number that can be added to ! 723: 1. without loss of significance. We calculate that here, for ! 724: float and double. */ ! 725: ! 726: one = 1.; ! 727: delta = 1.; ! 728: temp = 0.; ! 729: while(temp != one) { ! 730: temp = one+delta; ! 731: delta = delta/2.; ! 732: } ! 733: pd0->fprec = delta * 4.; ! 734: oned = 1.; ! 735: delta = 1.; ! 736: tempd = 0.; ! 737: while(tempd != oned) { ! 738: tempd = oned+delta; ! 739: delta = delta/2.; ! 740: } ! 741: pd0->dprec = delta * 4.; ! 742: ! 743: /* Now, if anyone's interested, we publish the results. */ ! 744: ! 745: if(pd0->flgm != 0) { ! 746: printf(s,pd0->cbits,"char"); ! 747: printf(s,pd0->ibits,"int"); ! 748: printf(s,pd0->sbits,"short"); ! 749: printf(s,pd0->lbits,"long"); ! 750: printf(s,pd0->ubits,"unsigned"); ! 751: printf(s,pd0->fbits,"float"); ! 752: printf(s,pd0->dbits,"double"); ! 753: printf(s2,pd0->fprec,"float"); ! 754: printf(s2,pd0->dprec,"double"); ! 755: } ! 756: /* Since we are only exploring and perhaps reporting, but not ! 757: testing any features, we cannot return an error code. */ ! 758: ! 759: return 0; ! 760: } ! 761: int extvar; ! 762: s4(pd0) /* 4. What's in a name? */ ! 763: struct defs *pd0; ! 764: { ! 765: static char s4er[] = "s4,er%d\n"; ! 766: static char qs4[8] = "s4 "; ! 767: char *ps, *pt; ! 768: int j, rc; ! 769: ! 770: short sint; /* short integer, for size test */ ! 771: int pint; /* plain */ ! 772: long lint; /* long */ ! 773: unsigned target; ! 774: unsigned int mask; ! 775: ! 776: rc = 0; ! 777: ps = qs4; ! 778: pt = pd0->rfs; ! 779: ! 780: while(*pt++ = *ps++); ! 781: ! 782: /* There are four declarable storage classes: automatic, ! 783: static, external, and register. Automatic variables have ! 784: been dealt with extensively thus far, and will not be specif- ! 785: ically treated in this section. Register variables are treated ! 786: in section s81. ! 787: ! 788: Static variables are local to a block, but retain their ! 789: values upon reentry to a block, even after control has left ! 790: the block. */ ! 791: ! 792: for (j=0; j<3; j++) ! 793: if(svtest(j) != zero()){ ! 794: rc = 1; ! 795: if(pd0->flgd != 0) printf(s4er,1); ! 796: } ! 797: ; ! 798: ! 799: /* External variables exist and retain their values throughout ! 800: the execution of the entire program, and may be used for comm- ! 801: unication between functions, even separately compiled functions. ! 802: */ ! 803: ! 804: setev(); ! 805: if(testev() != 0){ ! 806: rc=rc+2; ! 807: if(pd0->flgd != 0) printf(s4er,2); ! 808: } ! 809: /* ! 810: Characters have been tested elsewhere (in s243). ! 811: ! 812: Up to three sizes of integer, declared short int, int, and ! 813: long int, are available. Longer integers provide no less storage ! 814: than shorter ones, but implementation may make either short ! 815: integers, or long integers, or both, equivalent to plain ! 816: integers. ! 817: */ ! 818: ! 819: if(sizeof lint < sizeof pint || sizeof pint < sizeof sint){ ! 820: ! 821: rc = rc+4; ! 822: if(pd0->flgd != 0) printf(s4er,4); ! 823: } ! 824: ! 825: /* Unsigned integers, declared unsigned, obey the laws of ! 826: arithmetic modulo 2**n, where n is the number of bits in the ! 827: implementation */ ! 828: ! 829: target = 0; ! 830: target = target-1; ! 831: mask = 1; ! 832: ! 833: for(j=0; j<(sizeof target)*pd0->cbits; j++){ ! 834: ! 835: mask = mask⌖ ! 836: target = target>>1; ! 837: } ! 838: ! 839: if(mask != 1 || target != 0){ ! 840: ! 841: rc = rc+8; ! 842: if(pd0->flgd != 0) printf(s4er,8); ! 843: } ! 844: ! 845: return rc; ! 846: } ! 847: svtest(n) ! 848: int n; ! 849: { ! 850: static k; ! 851: int rc; ! 852: switch (n) { ! 853: ! 854: case 0: k = 1978; ! 855: rc = 0; ! 856: break; ! 857: ! 858: case 1: if(k != 1978) rc = 1; ! 859: else{ ! 860: k = 1929; ! 861: rc = 0; ! 862: } ! 863: break; ! 864: ! 865: case 2: if(k != 1929) rc = 1; ! 866: else rc = 0; ! 867: break; ! 868: } ! 869: return rc; ! 870: } ! 871: zero(){ /* Returns a value of zero, possibly */ ! 872: static k; /* with side effects, as it's called */ ! 873: int rc; /* alternately with svtest, above, */ ! 874: k = 2; /* and has the same internal storage */ ! 875: rc = 0; /* requirements. */ ! 876: return rc; ! 877: } ! 878: testev(){ ! 879: if(extvar != 1066) return 1; ! 880: else return 0; ! 881: } ! 882: s61(pd0) /* Characters and integers */ ! 883: struct defs *pd0; ! 884: { ! 885: static char s61er[] = "s61,er%d\n"; ! 886: static char qs61[8] = "s61 "; ! 887: short from, shortint; ! 888: long int to, longint; ! 889: int rc, lrc; ! 890: int j; ! 891: char fromc, charint; ! 892: char *wd, *pc[6]; ! 893: ! 894: static char upper_alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ! 895: static char lower_alpha[] = "abcdefghijklmnopqrstuvwxyz"; ! 896: static char numbers[] = "0123456789"; ! 897: static char special_characters[] = "~!\"#%&()_=-^|{}[]+;*:<>,.?/"; ! 898: static char extra_special_characters[] = "\n\t\b\r\f\\\'"; ! 899: static char blank_and_NUL[] = " \0"; ! 900: ! 901: char *ps, *pt; ! 902: ps = qs61; ! 903: pt = pd0->rfs; ! 904: rc = 0; ! 905: while (*pt++ = *ps++); ! 906: ! 907: /* A character or a short integer may be used wherever ! 908: an integer may be used. In all cases, the value is converted ! 909: to integer. This principle is extensively used throughout this ! 910: program, and will not be explicitly tested here. */ ! 911: ! 912: /* Conversion of a shorter integer to a longer always ! 913: involves sign extension. */ ! 914: ! 915: from = -19; ! 916: to = from; ! 917: ! 918: if(to != -19){ ! 919: rc = rc+1; ! 920: if(pd0->flgd != 0) printf(s61er,1); ! 921: } ! 922: ! 923: /* It is guaranteed that a member of the standard char- ! 924: acter set is nonnegative. */ ! 925: ! 926: pc[0] = upper_alpha; ! 927: pc[1] = lower_alpha; ! 928: pc[2] = numbers; ! 929: pc[3] = special_characters; ! 930: pc[4] = extra_special_characters; ! 931: pc[5] = blank_and_NUL; ! 932: ! 933: lrc = 0; ! 934: for (j=0; j<6; j++) ! 935: while(*pc[j]) if(*pc[j]++ < 0) lrc =1; ! 936: ! 937: if(lrc != 0){ ! 938: rc=rc+2; ! 939: if(pd0->flgd != 0) printf(s61er,2); ! 940: } ! 941: ! 942: /* When a longer integer is converted to a shorter or ! 943: to a char, it is truncated on the left; excess bits are ! 944: simply discarded. */ ! 945: ! 946: longint = 1048579; /* =2**20+3 */ ! 947: shortint = longint; ! 948: charint = longint; ! 949: ! 950: if((shortint != longint && shortint != 3) || ! 951: (charint != longint && charint != 3)) { ! 952: rc = rc+8; ! 953: if(pd0->flgd != 0) printf(s61er,8); ! 954: } ! 955: ! 956: return rc; ! 957: } ! 958: s626(pd0) /* 6.2 Float and double */ ! 959: /* 6.3 Floating and integral */ ! 960: /* 6.4 Pointers and integers */ ! 961: /* 6.5 Unsigned */ ! 962: /* 6.6 Arithmetic conversions */ ! 963: struct defs *pd0; ! 964: { ! 965: static char s626er[] = "s626,er%d\n"; ! 966: static char qs626[8] = "s626 "; ! 967: int rc; ! 968: char *ps, *pt; ! 969: float eps, f1, f2, f3, f4, f; ! 970: long lint1, lint2, l, ls; ! 971: char c, t[28], t0; ! 972: short s; ! 973: int is, i, j; ! 974: unsigned u, us; ! 975: double d, ds; ! 976: ps = qs626; ! 977: pt = pd0->rfs; ! 978: rc = 0; ! 979: while (*pt++ = *ps++); ! 980: ! 981: /* Conversions of integral values to floating type are ! 982: well-behaved. */ ! 983: ! 984: f1 = 1.; ! 985: lint1 = 1.; ! 986: lint2 = 1.; ! 987: ! 988: for(j=0;j<pd0->lbits-2;j++){ ! 989: f1 = f1*2; ! 990: lint2 = (lint2<<1)|lint1; ! 991: } ! 992: f2 = lint2; ! 993: f1 = (f1-f2)/f1; ! 994: if(f1>2.*pd0->fprec){ ! 995: ! 996: rc = rc+2; ! 997: if(pd0->flgd != 0) printf(s626er,2); ! 998: } ! 999: ! 1000: /* Pointer-integer combinations are discussed in s74, ! 1001: "Additive operators". The unsigned-int combination ! 1002: appears below. */ ! 1003: ! 1004: c = 125; ! 1005: s = 125; ! 1006: i = 125; is = 15625; ! 1007: u = 125; us = 15625; ! 1008: l = 125; ls = 15625; ! 1009: f = 125.; ! 1010: d = 125.; ds = 15625.; ! 1011: ! 1012: for(j=0;j<28;j++) t[j] = 0; ! 1013: ! 1014: if(c*c != is) t[ 0] = 1; ! 1015: if(s*c != is) t[ 1] = 1; ! 1016: if(s*s != is) t[ 2] = 1; ! 1017: if(i*c != is) t[ 3] = 1; ! 1018: if(i*s != is) t[ 4] = 1; ! 1019: if(i*i != is) t[ 5] = 1; ! 1020: if(u*c != us) t[ 6] = 1; ! 1021: if(u*s != us) t[ 7] = 1; ! 1022: if(u*i != us) t[ 8] = 1; ! 1023: if(u*u != us) t[ 9] = 1; ! 1024: if(l*c != ls) t[10] = 1; ! 1025: if(l*s != ls) t[11] = 1; ! 1026: if(l*i != ls) t[12] = 1; ! 1027: if(l*u != us) t[13] = 1; ! 1028: if(l*l != ls) t[14] = 1; ! 1029: if(f*c != ds) t[15] = 1; ! 1030: if(f*s != ds) t[16] = 1; ! 1031: if(f*i != ds) t[17] = 1; ! 1032: if(f*u != ds) t[18] = 1; ! 1033: if(f*l != ds) t[19] = 1; ! 1034: if(f*f != ds) t[20] = 1; ! 1035: if(d*c != ds) t[21] = 1; ! 1036: if(d*s != ds) t[22] = 1; ! 1037: if(d*i != ds) t[23] = 1; ! 1038: if(d*u != ds) t[24] = 1; ! 1039: if(d*l != ds) t[25] = 1; ! 1040: if(d*f != ds) t[26] = 1; ! 1041: if(d*d != ds) t[27] = 1; ! 1042: ! 1043: t0 = 0; ! 1044: for(j=0; j<28; j++) t0 = t0+t[j]; ! 1045: ! 1046: if(t0 != 0){ ! 1047: ! 1048: rc = rc+4; ! 1049: if(pd0->flgd != 0){ ! 1050: ! 1051: printf(s626er,4); ! 1052: printf(" key="); ! 1053: for(j=0;j<28;j++) printf("%d",t[j]); ! 1054: printf("\n"); ! 1055: } ! 1056: } ! 1057: ! 1058: /* When an unsigned integer is converted to long, ! 1059: the value of the result is the same numerically ! 1060: as that of the unsigned integer. */ ! 1061: ! 1062: l = (unsigned)0100000; ! 1063: if((long)l > (unsigned)0100000){ ! 1064: ! 1065: rc = rc+8; ! 1066: if(pd0->flgd != 0) printf(s626er,8); ! 1067: } ! 1068: ! 1069: return rc; ! 1070: } ! 1071: s71(pd0) /* 7.1 Primary expressions */ ! 1072: struct defs *pd0; ! 1073: { ! 1074: static char s71er[] = "s71,er%d\n"; ! 1075: static char qs71[8] = "s71 "; ! 1076: int rc; ! 1077: char *ps, *pt; ! 1078: static char q = 'q'; ! 1079: int x[10], McCarthy(), clobber(), a, b, *p; ! 1080: ps = qs71; ! 1081: pt = pd0->rfs; ! 1082: rc = 0; ! 1083: while (*pt++ = *ps++); ! 1084: ! 1085: /* Testing of expressions and operators is quite complicated, ! 1086: because (a) problems are apt to surface in queer combinations ! 1087: of operators and operands, rather than in isolation, ! 1088: and (b) the number of expressions needed to provoke a case ! 1089: of improper behaviour may be quite large. Hence, we take the ! 1090: following approach: for this section, and for subsequent ! 1091: sections through 7.15, we will check the primitive operations ! 1092: in isolation, thus verifying that the primitives work, ! 1093: after a fashion. The job of testing combinations, we will ! 1094: leave to a separate, machine-generated program, to be included ! 1095: in the C test package at some later date. ! 1096: */ ! 1097: ! 1098: /* A string is a primary expression. The identifier points to ! 1099: the first character of a string. ! 1100: */ ! 1101: ! 1102: if(*"queep" != q){ ! 1103: rc = rc+1; ! 1104: if(pd0->flgd != 0) printf(s71er,1); ! 1105: } ! 1106: /* A parenthesized expression is a primary expression whose ! 1107: type and value are the same as those of the unadorned ! 1108: expression. ! 1109: */ ! 1110: if((2+3) != 2+3) { ! 1111: rc = rc+2; ! 1112: if(pd0->flgd != 0) printf(s71er,2); ! 1113: } ! 1114: ! 1115: /* A primary expression followed by an expression in square ! 1116: brackets is a primary expression. The intuitive meaning is ! 1117: that of a subscript. The expression E1[E2] is identical ! 1118: (by definition) to *((E1)+(E2)). ! 1119: */ ! 1120: ! 1121: x[5] = 1942; ! 1122: if(x[5] != 1942 || x[5] != *((x)+(5))){ ! 1123: rc = rc+4; ! 1124: if(pd0->flgd != 0) printf(s71er,4); ! 1125: } ! 1126: ! 1127: /* If the various flavors of function calls didn't work, we ! 1128: would never have gotten this far; however, we do need to ! 1129: show that functions can be recursive... ! 1130: */ ! 1131: ! 1132: if ( McCarthy(-5) != 91){ ! 1133: rc = rc+8; ! 1134: if(pd0->flgd != 0) printf(s71er,8); ! 1135: } ! 1136: ! 1137: /* and that argument passing is strictly by value. */ ! 1138: ! 1139: a = 2; ! 1140: b = 3; ! 1141: p = &b; ! 1142: ! 1143: clobber(a,p); ! 1144: ! 1145: if(a != 2 || b != 2){ ! 1146: rc = rc+16; ! 1147: if(pd0->flgd != 0) printf(s71er,16); ! 1148: } ! 1149: ! 1150: /* Finally, structures and unions are addressed thusly: */ ! 1151: ! 1152: if(pd0->dprec != (*pd0).dprec){ ! 1153: rc = rc+32; ! 1154: if(pd0->flgd != 0) printf(s71er,32); ! 1155: } ! 1156: ! 1157: return rc; ! 1158: } ! 1159: McCarthy(x) ! 1160: int x; ! 1161: { ! 1162: if(x>100) return x-10; ! 1163: else return McCarthy( McCarthy(x+11)); ! 1164: } ! 1165: clobber(x,y) ! 1166: int x, *y; ! 1167: { ! 1168: x = 3; ! 1169: *y = 2; ! 1170: } ! 1171: s714(pd0) /* 7.14 Assignment operators */ ! 1172: struct defs *pd0; ! 1173: { ! 1174: static char f[] = "Local error %d.\n"; ! 1175: static char s714er[] = "s714,er%d\n"; ! 1176: static char qs714[8] = "s714 "; ! 1177: register int prlc, lrc; ! 1178: int rc; ! 1179: char cl, cr; ! 1180: short sl, sr; ! 1181: int il, ir; ! 1182: long ll, lr; ! 1183: unsigned ul, ur; ! 1184: float fl, fr; ! 1185: double dl, dr; ! 1186: char *ps, *pt; ! 1187: ps = qs714; ! 1188: pt = pd0->rfs; ! 1189: rc = 0; ! 1190: lrc = 0; ! 1191: prlc = pd0->flgl; ! 1192: while (*pt++ = *ps++); ! 1193: ! 1194: /* This section tests the assignment operators. ! 1195: ! 1196: It is an exhaustive test of all assignment statements ! 1197: of the form: ! 1198: ! 1199: vl op vr ! 1200: ! 1201: where vl and vr are variables from the set ! 1202: {char,short,int,long,unsigned,float,double} and op is ! 1203: one of the assignment operators. There are 395 such ! 1204: statements. ! 1205: ! 1206: The initial values for the variables have been chosen ! 1207: so that both the initial values and the results will ! 1208: "fit" in just about any implementation, and that the re- ! 1209: sults will be such that they test for the proper form- ! 1210: ation of composite operators, rather than checking for ! 1211: the valid operation of those operators' components. ! 1212: For example, in checking >>=, we want to verify that ! 1213: a right shift and a move take place, rather than ! 1214: whether or not there may be some peculiarities about ! 1215: the right shift. Such tests have been made previously, ! 1216: and to repeat them here would be to throw out a red ! 1217: herring. ! 1218: ! 1219: The table below lists the operators, assignment targets, ! 1220: initial values for left and right operands, and the ! 1221: expected values of the results. ! 1222: ! 1223: ! 1224: = += -= *= /= %= >>= <<= &= ^= |= ! 1225: char 2 7 3 10 2 1 1 20 8 6 14 ! 1226: short 2 7 3 10 2 1 1 20 8 6 14 ! 1227: int 2 7 3 10 2 1 1 20 8 6 14 ! 1228: long 2 7 3 10 2 1 1 20 8 6 14 ! 1229: unsigned 2 7 3 10 2 1 1 20 8 6 14 ! 1230: float 2 7 3 10 2.5 | | ! 1231: double 2 7 3 10 2.5 | | ! 1232: | | ! 1233: initial (5,2) | (5,2) | (12,10) ! 1234: ! 1235: The following machine-generated program reflects the ! 1236: tests described in the table. ! 1237: */ ! 1238: ! 1239: cl = 5; cr = 2; ! 1240: cl = cr; ! 1241: if(cl != 2){ ! 1242: lrc = 1; ! 1243: if(prlc) printf(f,lrc); ! 1244: } ! 1245: cl = 5; sr = 2; ! 1246: cl = sr; ! 1247: if(cl != 2){ ! 1248: lrc = 2; ! 1249: if(prlc) printf(f,lrc); ! 1250: } ! 1251: cl = 5; ir = 2; ! 1252: cl = ir; ! 1253: if(cl != 2){ ! 1254: lrc = 3; ! 1255: if(prlc) printf(f,lrc); ! 1256: } ! 1257: cl = 5; lr = 2; ! 1258: cl = lr; ! 1259: if(cl != 2){ ! 1260: lrc = 4; ! 1261: if(prlc) printf(f,lrc); ! 1262: } ! 1263: cl = 5; ur = 2; ! 1264: cl = ur; ! 1265: if(cl != 2){ ! 1266: lrc = 5; ! 1267: if(prlc) printf(f,lrc); ! 1268: } ! 1269: cl = 5; fr = 2; ! 1270: cl = fr; ! 1271: if(cl != 2){ ! 1272: lrc = 6; ! 1273: if(prlc) printf(f,lrc); ! 1274: } ! 1275: cl = 5; dr = 2; ! 1276: cl = dr; ! 1277: if(cl != 2){ ! 1278: lrc = 7; ! 1279: if(prlc) printf(f,lrc); ! 1280: } ! 1281: sl = 5; cr = 2; ! 1282: sl = cr; ! 1283: if(sl != 2){ ! 1284: lrc = 8; ! 1285: if(prlc) printf(f,lrc); ! 1286: } ! 1287: sl = 5; sr = 2; ! 1288: sl = sr; ! 1289: if(sl != 2){ ! 1290: lrc = 9; ! 1291: if(prlc) printf(f,lrc); ! 1292: } ! 1293: sl = 5; ir = 2; ! 1294: sl = ir; ! 1295: if(sl != 2){ ! 1296: lrc = 10; ! 1297: if(prlc) printf(f,lrc); ! 1298: } ! 1299: sl = 5; lr = 2; ! 1300: sl = lr; ! 1301: if(sl != 2){ ! 1302: lrc = 11; ! 1303: if(prlc) printf(f,lrc); ! 1304: } ! 1305: sl = 5; ur = 2; ! 1306: sl = ur; ! 1307: if(sl != 2){ ! 1308: lrc = 12; ! 1309: if(prlc) printf(f,lrc); ! 1310: } ! 1311: sl = 5; fr = 2; ! 1312: sl = fr; ! 1313: if(sl != 2){ ! 1314: lrc = 13; ! 1315: if(prlc) printf(f,lrc); ! 1316: } ! 1317: sl = 5; dr = 2; ! 1318: sl = dr; ! 1319: if(sl != 2){ ! 1320: lrc = 14; ! 1321: if(prlc) printf(f,lrc); ! 1322: } ! 1323: il = 5; cr = 2; ! 1324: il = cr; ! 1325: if(il != 2){ ! 1326: lrc = 15; ! 1327: if(prlc) printf(f,lrc); ! 1328: } ! 1329: il = 5; sr = 2; ! 1330: il = sr; ! 1331: if(il != 2){ ! 1332: lrc = 16; ! 1333: if(prlc) printf(f,lrc); ! 1334: } ! 1335: il = 5; ir = 2; ! 1336: il = ir; ! 1337: if(il != 2){ ! 1338: lrc = 17; ! 1339: if(prlc) printf(f,lrc); ! 1340: } ! 1341: il = 5; lr = 2; ! 1342: il = lr; ! 1343: if(il != 2){ ! 1344: lrc = 18; ! 1345: if(prlc) printf(f,lrc); ! 1346: } ! 1347: il = 5; ur = 2; ! 1348: il = ur; ! 1349: if(il != 2){ ! 1350: lrc = 19; ! 1351: if(prlc) printf(f,lrc); ! 1352: } ! 1353: il = 5; fr = 2; ! 1354: il = fr; ! 1355: if(il != 2){ ! 1356: lrc = 20; ! 1357: if(prlc) printf(f,lrc); ! 1358: } ! 1359: il = 5; dr = 2; ! 1360: il = dr; ! 1361: if(il != 2){ ! 1362: lrc = 21; ! 1363: if(prlc) printf(f,lrc); ! 1364: } ! 1365: ll = 5; cr = 2; ! 1366: ll = cr; ! 1367: if(ll != 2){ ! 1368: lrc = 22; ! 1369: if(prlc) printf(f,lrc); ! 1370: } ! 1371: ll = 5; sr = 2; ! 1372: ll = sr; ! 1373: if(ll != 2){ ! 1374: lrc = 23; ! 1375: if(prlc) printf(f,lrc); ! 1376: } ! 1377: ll = 5; ir = 2; ! 1378: ll = ir; ! 1379: if(ll != 2){ ! 1380: lrc = 24; ! 1381: if(prlc) printf(f,lrc); ! 1382: } ! 1383: ll = 5; lr = 2; ! 1384: ll = lr; ! 1385: if(ll != 2){ ! 1386: lrc = 25; ! 1387: if(prlc) printf(f,lrc); ! 1388: } ! 1389: ll = 5; ur = 2; ! 1390: ll = ur; ! 1391: if(ll != 2){ ! 1392: lrc = 26; ! 1393: if(prlc) printf(f,lrc); ! 1394: } ! 1395: ll = 5; fr = 2; ! 1396: ll = fr; ! 1397: if(ll != 2){ ! 1398: lrc = 27; ! 1399: if(prlc) printf(f,lrc); ! 1400: } ! 1401: ll = 5; dr = 2; ! 1402: ll = dr; ! 1403: if(ll != 2){ ! 1404: lrc = 28; ! 1405: if(prlc) printf(f,lrc); ! 1406: } ! 1407: ul = 5; cr = 2; ! 1408: ul = cr; ! 1409: if(ul != 2){ ! 1410: lrc = 29; ! 1411: if(prlc) printf(f,lrc); ! 1412: } ! 1413: ul = 5; sr = 2; ! 1414: ul = sr; ! 1415: if(ul != 2){ ! 1416: lrc = 30; ! 1417: if(prlc) printf(f,lrc); ! 1418: } ! 1419: ul = 5; ir = 2; ! 1420: ul = ir; ! 1421: if(ul != 2){ ! 1422: lrc = 31; ! 1423: if(prlc) printf(f,lrc); ! 1424: } ! 1425: ul = 5; lr = 2; ! 1426: ul = lr; ! 1427: if(ul != 2){ ! 1428: lrc = 32; ! 1429: if(prlc) printf(f,lrc); ! 1430: } ! 1431: ul = 5; ur = 2; ! 1432: ul = ur; ! 1433: if(ul != 2){ ! 1434: lrc = 33; ! 1435: if(prlc) printf(f,lrc); ! 1436: } ! 1437: ul = 5; fr = 2; ! 1438: ul = fr; ! 1439: if(ul != 2){ ! 1440: lrc = 34; ! 1441: if(prlc) printf(f,lrc); ! 1442: } ! 1443: ul = 5; dr = 2; ! 1444: ul = dr; ! 1445: if(ul != 2){ ! 1446: lrc = 35; ! 1447: if(prlc) printf(f,lrc); ! 1448: } ! 1449: fl = 5; cr = 2; ! 1450: fl = cr; ! 1451: if(fl != 2){ ! 1452: lrc = 36; ! 1453: if(prlc) printf(f,lrc); ! 1454: } ! 1455: fl = 5; sr = 2; ! 1456: fl = sr; ! 1457: if(fl != 2){ ! 1458: lrc = 37; ! 1459: if(prlc) printf(f,lrc); ! 1460: } ! 1461: fl = 5; ir = 2; ! 1462: fl = ir; ! 1463: if(fl != 2){ ! 1464: lrc = 38; ! 1465: if(prlc) printf(f,lrc); ! 1466: } ! 1467: fl = 5; lr = 2; ! 1468: fl = lr; ! 1469: if(fl != 2){ ! 1470: lrc = 39; ! 1471: if(prlc) printf(f,lrc); ! 1472: } ! 1473: fl = 5; ur = 2; ! 1474: fl = ur; ! 1475: if(fl != 2){ ! 1476: lrc = 40; ! 1477: if(prlc) printf(f,lrc); ! 1478: } ! 1479: fl = 5; fr = 2; ! 1480: fl = fr; ! 1481: if(fl != 2){ ! 1482: lrc = 41; ! 1483: if(prlc) printf(f,lrc); ! 1484: } ! 1485: fl = 5; dr = 2; ! 1486: fl = dr; ! 1487: if(fl != 2){ ! 1488: lrc = 42; ! 1489: if(prlc) printf(f,lrc); ! 1490: } ! 1491: dl = 5; cr = 2; ! 1492: dl = cr; ! 1493: if(dl != 2){ ! 1494: lrc = 43; ! 1495: if(prlc) printf(f,lrc); ! 1496: } ! 1497: dl = 5; sr = 2; ! 1498: dl = sr; ! 1499: if(dl != 2){ ! 1500: lrc = 44; ! 1501: if(prlc) printf(f,lrc); ! 1502: } ! 1503: dl = 5; ir = 2; ! 1504: dl = ir; ! 1505: if(dl != 2){ ! 1506: lrc = 45; ! 1507: if(prlc) printf(f,lrc); ! 1508: } ! 1509: dl = 5; lr = 2; ! 1510: dl = lr; ! 1511: if(dl != 2){ ! 1512: lrc = 46; ! 1513: if(prlc) printf(f,lrc); ! 1514: } ! 1515: dl = 5; ur = 2; ! 1516: dl = ur; ! 1517: if(dl != 2){ ! 1518: lrc = 47; ! 1519: if(prlc) printf(f,lrc); ! 1520: } ! 1521: dl = 5; fr = 2; ! 1522: dl = fr; ! 1523: if(dl != 2){ ! 1524: lrc = 48; ! 1525: if(prlc) printf(f,lrc); ! 1526: } ! 1527: dl = 5; dr = 2; ! 1528: dl = dr; ! 1529: if(dl != 2){ ! 1530: lrc = 49; ! 1531: if(prlc) printf(f,lrc); ! 1532: } ! 1533: cl = 5; cr = 2; ! 1534: cl += cr; ! 1535: if(cl != 7){ ! 1536: lrc = 50; ! 1537: if(prlc) printf(f,lrc); ! 1538: } ! 1539: cl = 5; sr = 2; ! 1540: cl += sr; ! 1541: if(cl != 7){ ! 1542: lrc = 51; ! 1543: if(prlc) printf(f,lrc); ! 1544: } ! 1545: cl = 5; ir = 2; ! 1546: cl += ir; ! 1547: if(cl != 7){ ! 1548: lrc = 52; ! 1549: if(prlc) printf(f,lrc); ! 1550: } ! 1551: cl = 5; lr = 2; ! 1552: cl += lr; ! 1553: if(cl != 7){ ! 1554: lrc = 53; ! 1555: if(prlc) printf(f,lrc); ! 1556: } ! 1557: cl = 5; ur = 2; ! 1558: cl += ur; ! 1559: if(cl != 7){ ! 1560: lrc = 54; ! 1561: if(prlc) printf(f,lrc); ! 1562: } ! 1563: cl = 5; fr = 2; ! 1564: cl += fr; ! 1565: if(cl != 7){ ! 1566: lrc = 55; ! 1567: if(prlc) printf(f,lrc); ! 1568: } ! 1569: cl = 5; dr = 2; ! 1570: cl += dr; ! 1571: if(cl != 7){ ! 1572: lrc = 56; ! 1573: if(prlc) printf(f,lrc); ! 1574: } ! 1575: sl = 5; cr = 2; ! 1576: sl += cr; ! 1577: if(sl != 7){ ! 1578: lrc = 57; ! 1579: if(prlc) printf(f,lrc); ! 1580: } ! 1581: sl = 5; sr = 2; ! 1582: sl += sr; ! 1583: if(sl != 7){ ! 1584: lrc = 58; ! 1585: if(prlc) printf(f,lrc); ! 1586: } ! 1587: sl = 5; ir = 2; ! 1588: sl += ir; ! 1589: if(sl != 7){ ! 1590: lrc = 59; ! 1591: if(prlc) printf(f,lrc); ! 1592: } ! 1593: sl = 5; lr = 2; ! 1594: sl += lr; ! 1595: if(sl != 7){ ! 1596: lrc = 60; ! 1597: if(prlc) printf(f,lrc); ! 1598: } ! 1599: sl = 5; ur = 2; ! 1600: sl += ur; ! 1601: if(sl != 7){ ! 1602: lrc = 61; ! 1603: if(prlc) printf(f,lrc); ! 1604: } ! 1605: sl = 5; fr = 2; ! 1606: sl += fr; ! 1607: if(sl != 7){ ! 1608: lrc = 62; ! 1609: if(prlc) printf(f,lrc); ! 1610: } ! 1611: sl = 5; dr = 2; ! 1612: sl += dr; ! 1613: if(sl != 7){ ! 1614: lrc = 63; ! 1615: if(prlc) printf(f,lrc); ! 1616: } ! 1617: il = 5; cr = 2; ! 1618: il += cr; ! 1619: if(il != 7){ ! 1620: lrc = 64; ! 1621: if(prlc) printf(f,lrc); ! 1622: } ! 1623: il = 5; sr = 2; ! 1624: il += sr; ! 1625: if(il != 7){ ! 1626: lrc = 65; ! 1627: if(prlc) printf(f,lrc); ! 1628: } ! 1629: il = 5; ir = 2; ! 1630: il += ir; ! 1631: if(il != 7){ ! 1632: lrc = 66; ! 1633: if(prlc) printf(f,lrc); ! 1634: } ! 1635: il = 5; lr = 2; ! 1636: il += lr; ! 1637: if(il != 7){ ! 1638: lrc = 67; ! 1639: if(prlc) printf(f,lrc); ! 1640: } ! 1641: il = 5; ur = 2; ! 1642: il += ur; ! 1643: if(il != 7){ ! 1644: lrc = 68; ! 1645: if(prlc) printf(f,lrc); ! 1646: } ! 1647: il = 5; fr = 2; ! 1648: il += fr; ! 1649: if(il != 7){ ! 1650: lrc = 69; ! 1651: if(prlc) printf(f,lrc); ! 1652: } ! 1653: il = 5; dr = 2; ! 1654: il += dr; ! 1655: if(il != 7){ ! 1656: lrc = 70; ! 1657: if(prlc) printf(f,lrc); ! 1658: } ! 1659: ll = 5; cr = 2; ! 1660: ll += cr; ! 1661: if(ll != 7){ ! 1662: lrc = 71; ! 1663: if(prlc) printf(f,lrc); ! 1664: } ! 1665: ll = 5; sr = 2; ! 1666: ll += sr; ! 1667: if(ll != 7){ ! 1668: lrc = 72; ! 1669: if(prlc) printf(f,lrc); ! 1670: } ! 1671: ll = 5; ir = 2; ! 1672: ll += ir; ! 1673: if(ll != 7){ ! 1674: lrc = 73; ! 1675: if(prlc) printf(f,lrc); ! 1676: } ! 1677: ll = 5; lr = 2; ! 1678: ll += lr; ! 1679: if(ll != 7){ ! 1680: lrc = 74; ! 1681: if(prlc) printf(f,lrc); ! 1682: } ! 1683: ll = 5; ur = 2; ! 1684: ll += ur; ! 1685: if(ll != 7){ ! 1686: lrc = 75; ! 1687: if(prlc) printf(f,lrc); ! 1688: } ! 1689: ll = 5; fr = 2; ! 1690: ll += fr; ! 1691: if(ll != 7){ ! 1692: lrc = 76; ! 1693: if(prlc) printf(f,lrc); ! 1694: } ! 1695: ll = 5; dr = 2; ! 1696: ll += dr; ! 1697: if(ll != 7){ ! 1698: lrc = 77; ! 1699: if(prlc) printf(f,lrc); ! 1700: } ! 1701: ul = 5; cr = 2; ! 1702: ul += cr; ! 1703: if(ul != 7){ ! 1704: lrc = 78; ! 1705: if(prlc) printf(f,lrc); ! 1706: } ! 1707: ul = 5; sr = 2; ! 1708: ul += sr; ! 1709: if(ul != 7){ ! 1710: lrc = 79; ! 1711: if(prlc) printf(f,lrc); ! 1712: } ! 1713: ul = 5; ir = 2; ! 1714: ul += ir; ! 1715: if(ul != 7){ ! 1716: lrc = 80; ! 1717: if(prlc) printf(f,lrc); ! 1718: } ! 1719: ul = 5; lr = 2; ! 1720: ul += lr; ! 1721: if(ul != 7){ ! 1722: lrc = 81; ! 1723: if(prlc) printf(f,lrc); ! 1724: } ! 1725: ul = 5; ur = 2; ! 1726: ul += ur; ! 1727: if(ul != 7){ ! 1728: lrc = 82; ! 1729: if(prlc) printf(f,lrc); ! 1730: } ! 1731: ul = 5; fr = 2; ! 1732: ul += fr; ! 1733: if(ul != 7){ ! 1734: lrc = 83; ! 1735: if(prlc) printf(f,lrc); ! 1736: } ! 1737: ul = 5; dr = 2; ! 1738: ul += dr; ! 1739: if(ul != 7){ ! 1740: lrc = 84; ! 1741: if(prlc) printf(f,lrc); ! 1742: } ! 1743: fl = 5; cr = 2; ! 1744: fl += cr; ! 1745: if(fl != 7){ ! 1746: lrc = 85; ! 1747: if(prlc) printf(f,lrc); ! 1748: } ! 1749: fl = 5; sr = 2; ! 1750: fl += sr; ! 1751: if(fl != 7){ ! 1752: lrc = 86; ! 1753: if(prlc) printf(f,lrc); ! 1754: } ! 1755: fl = 5; ir = 2; ! 1756: fl += ir; ! 1757: if(fl != 7){ ! 1758: lrc = 87; ! 1759: if(prlc) printf(f,lrc); ! 1760: } ! 1761: fl = 5; lr = 2; ! 1762: fl += lr; ! 1763: if(fl != 7){ ! 1764: lrc = 88; ! 1765: if(prlc) printf(f,lrc); ! 1766: } ! 1767: fl = 5; ur = 2; ! 1768: fl += ur; ! 1769: if(fl != 7){ ! 1770: lrc = 89; ! 1771: if(prlc) printf(f,lrc); ! 1772: } ! 1773: fl = 5; fr = 2; ! 1774: fl += fr; ! 1775: if(fl != 7){ ! 1776: lrc = 90; ! 1777: if(prlc) printf(f,lrc); ! 1778: } ! 1779: fl = 5; dr = 2; ! 1780: fl += dr; ! 1781: if(fl != 7){ ! 1782: lrc = 91; ! 1783: if(prlc) printf(f,lrc); ! 1784: } ! 1785: dl = 5; cr = 2; ! 1786: dl += cr; ! 1787: if(dl != 7){ ! 1788: lrc = 92; ! 1789: if(prlc) printf(f,lrc); ! 1790: } ! 1791: dl = 5; sr = 2; ! 1792: dl += sr; ! 1793: if(dl != 7){ ! 1794: lrc = 93; ! 1795: if(prlc) printf(f,lrc); ! 1796: } ! 1797: dl = 5; ir = 2; ! 1798: dl += ir; ! 1799: if(dl != 7){ ! 1800: lrc = 94; ! 1801: if(prlc) printf(f,lrc); ! 1802: } ! 1803: dl = 5; lr = 2; ! 1804: dl += lr; ! 1805: if(dl != 7){ ! 1806: lrc = 95; ! 1807: if(prlc) printf(f,lrc); ! 1808: } ! 1809: dl = 5; ur = 2; ! 1810: dl += ur; ! 1811: if(dl != 7){ ! 1812: lrc = 96; ! 1813: if(prlc) printf(f,lrc); ! 1814: } ! 1815: dl = 5; fr = 2; ! 1816: dl += fr; ! 1817: if(dl != 7){ ! 1818: lrc = 97; ! 1819: if(prlc) printf(f,lrc); ! 1820: } ! 1821: dl = 5; dr = 2; ! 1822: dl += dr; ! 1823: if(dl != 7){ ! 1824: lrc = 98; ! 1825: if(prlc) printf(f,lrc); ! 1826: } ! 1827: cl = 5; cr = 2; ! 1828: cl -= cr; ! 1829: if(cl != 3){ ! 1830: lrc = 99; ! 1831: if(prlc) printf(f,lrc); ! 1832: } ! 1833: cl = 5; sr = 2; ! 1834: cl -= sr; ! 1835: if(cl != 3){ ! 1836: lrc = 100; ! 1837: if(prlc) printf(f,lrc); ! 1838: } ! 1839: cl = 5; ir = 2; ! 1840: cl -= ir; ! 1841: if(cl != 3){ ! 1842: lrc = 101; ! 1843: if(prlc) printf(f,lrc); ! 1844: } ! 1845: cl = 5; lr = 2; ! 1846: cl -= lr; ! 1847: if(cl != 3){ ! 1848: lrc = 102; ! 1849: if(prlc) printf(f,lrc); ! 1850: } ! 1851: cl = 5; ur = 2; ! 1852: cl -= ur; ! 1853: if(cl != 3){ ! 1854: lrc = 103; ! 1855: if(prlc) printf(f,lrc); ! 1856: } ! 1857: cl = 5; fr = 2; ! 1858: cl -= fr; ! 1859: if(cl != 3){ ! 1860: lrc = 104; ! 1861: if(prlc) printf(f,lrc); ! 1862: } ! 1863: cl = 5; dr = 2; ! 1864: cl -= dr; ! 1865: if(cl != 3){ ! 1866: lrc = 105; ! 1867: if(prlc) printf(f,lrc); ! 1868: } ! 1869: sl = 5; cr = 2; ! 1870: sl -= cr; ! 1871: if(sl != 3){ ! 1872: lrc = 106; ! 1873: if(prlc) printf(f,lrc); ! 1874: } ! 1875: sl = 5; sr = 2; ! 1876: sl -= sr; ! 1877: if(sl != 3){ ! 1878: lrc = 107; ! 1879: if(prlc) printf(f,lrc); ! 1880: } ! 1881: sl = 5; ir = 2; ! 1882: sl -= ir; ! 1883: if(sl != 3){ ! 1884: lrc = 108; ! 1885: if(prlc) printf(f,lrc); ! 1886: } ! 1887: sl = 5; lr = 2; ! 1888: sl -= lr; ! 1889: if(sl != 3){ ! 1890: lrc = 109; ! 1891: if(prlc) printf(f,lrc); ! 1892: } ! 1893: sl = 5; ur = 2; ! 1894: sl -= ur; ! 1895: if(sl != 3){ ! 1896: lrc = 110; ! 1897: if(prlc) printf(f,lrc); ! 1898: } ! 1899: sl = 5; fr = 2; ! 1900: sl -= fr; ! 1901: if(sl != 3){ ! 1902: lrc = 111; ! 1903: if(prlc) printf(f,lrc); ! 1904: } ! 1905: sl = 5; dr = 2; ! 1906: sl -= dr; ! 1907: if(sl != 3){ ! 1908: lrc = 112; ! 1909: if(prlc) printf(f,lrc); ! 1910: } ! 1911: il = 5; cr = 2; ! 1912: il -= cr; ! 1913: if(il != 3){ ! 1914: lrc = 113; ! 1915: if(prlc) printf(f,lrc); ! 1916: } ! 1917: il = 5; sr = 2; ! 1918: il -= sr; ! 1919: if(il != 3){ ! 1920: lrc = 114; ! 1921: if(prlc) printf(f,lrc); ! 1922: } ! 1923: il = 5; ir = 2; ! 1924: il -= ir; ! 1925: if(il != 3){ ! 1926: lrc = 115; ! 1927: if(prlc) printf(f,lrc); ! 1928: } ! 1929: il = 5; lr = 2; ! 1930: il -= lr; ! 1931: if(il != 3){ ! 1932: lrc = 116; ! 1933: if(prlc) printf(f,lrc); ! 1934: } ! 1935: il = 5; ur = 2; ! 1936: il -= ur; ! 1937: if(il != 3){ ! 1938: lrc = 117; ! 1939: if(prlc) printf(f,lrc); ! 1940: } ! 1941: il = 5; fr = 2; ! 1942: il -= fr; ! 1943: if(il != 3){ ! 1944: lrc = 118; ! 1945: if(prlc) printf(f,lrc); ! 1946: } ! 1947: il = 5; dr = 2; ! 1948: il -= dr; ! 1949: if(il != 3){ ! 1950: lrc = 119; ! 1951: if(prlc) printf(f,lrc); ! 1952: } ! 1953: ll = 5; cr = 2; ! 1954: ll -= cr; ! 1955: if(ll != 3){ ! 1956: lrc = 120; ! 1957: if(prlc) printf(f,lrc); ! 1958: } ! 1959: ll = 5; sr = 2; ! 1960: ll -= sr; ! 1961: if(ll != 3){ ! 1962: lrc = 121; ! 1963: if(prlc) printf(f,lrc); ! 1964: } ! 1965: ll = 5; ir = 2; ! 1966: ll -= ir; ! 1967: if(ll != 3){ ! 1968: lrc = 122; ! 1969: if(prlc) printf(f,lrc); ! 1970: } ! 1971: ll = 5; lr = 2; ! 1972: ll -= lr; ! 1973: if(ll != 3){ ! 1974: lrc = 123; ! 1975: if(prlc) printf(f,lrc); ! 1976: } ! 1977: ll = 5; ur = 2; ! 1978: ll -= ur; ! 1979: if(ll != 3){ ! 1980: lrc = 124; ! 1981: if(prlc) printf(f,lrc); ! 1982: } ! 1983: ll = 5; fr = 2; ! 1984: ll -= fr; ! 1985: if(ll != 3){ ! 1986: lrc = 125; ! 1987: if(prlc) printf(f,lrc); ! 1988: } ! 1989: ll = 5; dr = 2; ! 1990: ll -= dr; ! 1991: if(ll != 3){ ! 1992: lrc = 126; ! 1993: if(prlc) printf(f,lrc); ! 1994: } ! 1995: ul = 5; cr = 2; ! 1996: ul -= cr; ! 1997: if(ul != 3){ ! 1998: lrc = 127; ! 1999: if(prlc) printf(f,lrc); ! 2000: } ! 2001: ul = 5; sr = 2; ! 2002: ul -= sr; ! 2003: if(ul != 3){ ! 2004: lrc = 128; ! 2005: if(prlc) printf(f,lrc); ! 2006: } ! 2007: ul = 5; ir = 2; ! 2008: ul -= ir; ! 2009: if(ul != 3){ ! 2010: lrc = 129; ! 2011: if(prlc) printf(f,lrc); ! 2012: } ! 2013: ul = 5; lr = 2; ! 2014: ul -= lr; ! 2015: if(ul != 3){ ! 2016: lrc = 130; ! 2017: if(prlc) printf(f,lrc); ! 2018: } ! 2019: ul = 5; ur = 2; ! 2020: ul -= ur; ! 2021: if(ul != 3){ ! 2022: lrc = 131; ! 2023: if(prlc) printf(f,lrc); ! 2024: } ! 2025: ul = 5; fr = 2; ! 2026: ul -= fr; ! 2027: if(ul != 3){ ! 2028: lrc = 132; ! 2029: if(prlc) printf(f,lrc); ! 2030: } ! 2031: ul = 5; dr = 2; ! 2032: ul -= dr; ! 2033: if(ul != 3){ ! 2034: lrc = 133; ! 2035: if(prlc) printf(f,lrc); ! 2036: } ! 2037: fl = 5; cr = 2; ! 2038: fl -= cr; ! 2039: if(fl != 3){ ! 2040: lrc = 134; ! 2041: if(prlc) printf(f,lrc); ! 2042: } ! 2043: fl = 5; sr = 2; ! 2044: fl -= sr; ! 2045: if(fl != 3){ ! 2046: lrc = 135; ! 2047: if(prlc) printf(f,lrc); ! 2048: } ! 2049: fl = 5; ir = 2; ! 2050: fl -= ir; ! 2051: if(fl != 3){ ! 2052: lrc = 136; ! 2053: if(prlc) printf(f,lrc); ! 2054: } ! 2055: fl = 5; lr = 2; ! 2056: fl -= lr; ! 2057: if(fl != 3){ ! 2058: lrc = 137; ! 2059: if(prlc) printf(f,lrc); ! 2060: } ! 2061: fl = 5; ur = 2; ! 2062: fl -= ur; ! 2063: if(fl != 3){ ! 2064: lrc = 138; ! 2065: if(prlc) printf(f,lrc); ! 2066: } ! 2067: fl = 5; fr = 2; ! 2068: fl -= fr; ! 2069: if(fl != 3){ ! 2070: lrc = 139; ! 2071: if(prlc) printf(f,lrc); ! 2072: } ! 2073: fl = 5; dr = 2; ! 2074: fl -= dr; ! 2075: if(fl != 3){ ! 2076: lrc = 140; ! 2077: if(prlc) printf(f,lrc); ! 2078: } ! 2079: dl = 5; cr = 2; ! 2080: dl -= cr; ! 2081: if(dl != 3){ ! 2082: lrc = 141; ! 2083: if(prlc) printf(f,lrc); ! 2084: } ! 2085: dl = 5; sr = 2; ! 2086: dl -= sr; ! 2087: if(dl != 3){ ! 2088: lrc = 142; ! 2089: if(prlc) printf(f,lrc); ! 2090: } ! 2091: dl = 5; ir = 2; ! 2092: dl -= ir; ! 2093: if(dl != 3){ ! 2094: lrc = 143; ! 2095: if(prlc) printf(f,lrc); ! 2096: } ! 2097: dl = 5; lr = 2; ! 2098: dl -= lr; ! 2099: if(dl != 3){ ! 2100: lrc = 144; ! 2101: if(prlc) printf(f,lrc); ! 2102: } ! 2103: dl = 5; ur = 2; ! 2104: dl -= ur; ! 2105: if(dl != 3){ ! 2106: lrc = 145; ! 2107: if(prlc) printf(f,lrc); ! 2108: } ! 2109: dl = 5; fr = 2; ! 2110: dl -= fr; ! 2111: if(dl != 3){ ! 2112: lrc = 146; ! 2113: if(prlc) printf(f,lrc); ! 2114: } ! 2115: dl = 5; dr = 2; ! 2116: dl -= dr; ! 2117: if(dl != 3){ ! 2118: lrc = 147; ! 2119: if(prlc) printf(f,lrc); ! 2120: } ! 2121: cl = 5; cr = 2; ! 2122: cl *= cr; ! 2123: if(cl != 10){ ! 2124: lrc = 148; ! 2125: if(prlc) printf(f,lrc); ! 2126: } ! 2127: cl = 5; sr = 2; ! 2128: cl *= sr; ! 2129: if(cl != 10){ ! 2130: lrc = 149; ! 2131: if(prlc) printf(f,lrc); ! 2132: } ! 2133: cl = 5; ir = 2; ! 2134: cl *= ir; ! 2135: if(cl != 10){ ! 2136: lrc = 150; ! 2137: if(prlc) printf(f,lrc); ! 2138: } ! 2139: cl = 5; lr = 2; ! 2140: cl *= lr; ! 2141: if(cl != 10){ ! 2142: lrc = 151; ! 2143: if(prlc) printf(f,lrc); ! 2144: } ! 2145: cl = 5; ur = 2; ! 2146: cl *= ur; ! 2147: if(cl != 10){ ! 2148: lrc = 152; ! 2149: if(prlc) printf(f,lrc); ! 2150: } ! 2151: cl = 5; fr = 2; ! 2152: cl *= fr; ! 2153: if(cl != 10){ ! 2154: lrc = 153; ! 2155: if(prlc) printf(f,lrc); ! 2156: } ! 2157: cl = 5; dr = 2; ! 2158: cl *= dr; ! 2159: if(cl != 10){ ! 2160: lrc = 154; ! 2161: if(prlc) printf(f,lrc); ! 2162: } ! 2163: sl = 5; cr = 2; ! 2164: sl *= cr; ! 2165: if(sl != 10){ ! 2166: lrc = 155; ! 2167: if(prlc) printf(f,lrc); ! 2168: } ! 2169: sl = 5; sr = 2; ! 2170: sl *= sr; ! 2171: if(sl != 10){ ! 2172: lrc = 156; ! 2173: if(prlc) printf(f,lrc); ! 2174: } ! 2175: sl = 5; ir = 2; ! 2176: sl *= ir; ! 2177: if(sl != 10){ ! 2178: lrc = 157; ! 2179: if(prlc) printf(f,lrc); ! 2180: } ! 2181: sl = 5; lr = 2; ! 2182: sl *= lr; ! 2183: if(sl != 10){ ! 2184: lrc = 158; ! 2185: if(prlc) printf(f,lrc); ! 2186: } ! 2187: sl = 5; ur = 2; ! 2188: sl *= ur; ! 2189: if(sl != 10){ ! 2190: lrc = 159; ! 2191: if(prlc) printf(f,lrc); ! 2192: } ! 2193: sl = 5; fr = 2; ! 2194: sl *= fr; ! 2195: if(sl != 10){ ! 2196: lrc = 160; ! 2197: if(prlc) printf(f,lrc); ! 2198: } ! 2199: sl = 5; dr = 2; ! 2200: sl *= dr; ! 2201: if(sl != 10){ ! 2202: lrc = 161; ! 2203: if(prlc) printf(f,lrc); ! 2204: } ! 2205: il = 5; cr = 2; ! 2206: il *= cr; ! 2207: if(il != 10){ ! 2208: lrc = 162; ! 2209: if(prlc) printf(f,lrc); ! 2210: } ! 2211: il = 5; sr = 2; ! 2212: il *= sr; ! 2213: if(il != 10){ ! 2214: lrc = 163; ! 2215: if(prlc) printf(f,lrc); ! 2216: } ! 2217: il = 5; ir = 2; ! 2218: il *= ir; ! 2219: if(il != 10){ ! 2220: lrc = 164; ! 2221: if(prlc) printf(f,lrc); ! 2222: } ! 2223: il = 5; lr = 2; ! 2224: il *= lr; ! 2225: if(il != 10){ ! 2226: lrc = 165; ! 2227: if(prlc) printf(f,lrc); ! 2228: } ! 2229: il = 5; ur = 2; ! 2230: il *= ur; ! 2231: if(il != 10){ ! 2232: lrc = 166; ! 2233: if(prlc) printf(f,lrc); ! 2234: } ! 2235: il = 5; fr = 2; ! 2236: il *= fr; ! 2237: if(il != 10){ ! 2238: lrc = 167; ! 2239: if(prlc) printf(f,lrc); ! 2240: } ! 2241: il = 5; dr = 2; ! 2242: il *= dr; ! 2243: if(il != 10){ ! 2244: lrc = 168; ! 2245: if(prlc) printf(f,lrc); ! 2246: } ! 2247: ll = 5; cr = 2; ! 2248: ll *= cr; ! 2249: if(ll != 10){ ! 2250: lrc = 169; ! 2251: if(prlc) printf(f,lrc); ! 2252: } ! 2253: ll = 5; sr = 2; ! 2254: ll *= sr; ! 2255: if(ll != 10){ ! 2256: lrc = 170; ! 2257: if(prlc) printf(f,lrc); ! 2258: } ! 2259: ll = 5; ir = 2; ! 2260: ll *= ir; ! 2261: if(ll != 10){ ! 2262: lrc = 171; ! 2263: if(prlc) printf(f,lrc); ! 2264: } ! 2265: ll = 5; lr = 2; ! 2266: ll *= lr; ! 2267: if(ll != 10){ ! 2268: lrc = 172; ! 2269: if(prlc) printf(f,lrc); ! 2270: } ! 2271: ll = 5; ur = 2; ! 2272: ll *= ur; ! 2273: if(ll != 10){ ! 2274: lrc = 173; ! 2275: if(prlc) printf(f,lrc); ! 2276: } ! 2277: ll = 5; fr = 2; ! 2278: ll *= fr; ! 2279: if(ll != 10){ ! 2280: lrc = 174; ! 2281: if(prlc) printf(f,lrc); ! 2282: } ! 2283: ll = 5; dr = 2; ! 2284: ll *= dr; ! 2285: if(ll != 10){ ! 2286: lrc = 175; ! 2287: if(prlc) printf(f,lrc); ! 2288: } ! 2289: ul = 5; cr = 2; ! 2290: ul *= cr; ! 2291: if(ul != 10){ ! 2292: lrc = 176; ! 2293: if(prlc) printf(f,lrc); ! 2294: } ! 2295: ul = 5; sr = 2; ! 2296: ul *= sr; ! 2297: if(ul != 10){ ! 2298: lrc = 177; ! 2299: if(prlc) printf(f,lrc); ! 2300: } ! 2301: ul = 5; ir = 2; ! 2302: ul *= ir; ! 2303: if(ul != 10){ ! 2304: lrc = 178; ! 2305: if(prlc) printf(f,lrc); ! 2306: } ! 2307: ul = 5; lr = 2; ! 2308: ul *= lr; ! 2309: if(ul != 10){ ! 2310: lrc = 179; ! 2311: if(prlc) printf(f,lrc); ! 2312: } ! 2313: ul = 5; ur = 2; ! 2314: ul *= ur; ! 2315: if(ul != 10){ ! 2316: lrc = 180; ! 2317: if(prlc) printf(f,lrc); ! 2318: } ! 2319: ul = 5; fr = 2; ! 2320: ul *= fr; ! 2321: if(ul != 10){ ! 2322: lrc = 181; ! 2323: if(prlc) printf(f,lrc); ! 2324: } ! 2325: ul = 5; dr = 2; ! 2326: ul *= dr; ! 2327: if(ul != 10){ ! 2328: lrc = 182; ! 2329: if(prlc) printf(f,lrc); ! 2330: } ! 2331: fl = 5; cr = 2; ! 2332: fl *= cr; ! 2333: if(fl != 10){ ! 2334: lrc = 183; ! 2335: if(prlc) printf(f,lrc); ! 2336: } ! 2337: fl = 5; sr = 2; ! 2338: fl *= sr; ! 2339: if(fl != 10){ ! 2340: lrc = 184; ! 2341: if(prlc) printf(f,lrc); ! 2342: } ! 2343: fl = 5; ir = 2; ! 2344: fl *= ir; ! 2345: if(fl != 10){ ! 2346: lrc = 185; ! 2347: if(prlc) printf(f,lrc); ! 2348: } ! 2349: fl = 5; lr = 2; ! 2350: fl *= lr; ! 2351: if(fl != 10){ ! 2352: lrc = 186; ! 2353: if(prlc) printf(f,lrc); ! 2354: } ! 2355: fl = 5; ur = 2; ! 2356: fl *= ur; ! 2357: if(fl != 10){ ! 2358: lrc = 187; ! 2359: if(prlc) printf(f,lrc); ! 2360: } ! 2361: fl = 5; fr = 2; ! 2362: fl *= fr; ! 2363: if(fl != 10){ ! 2364: lrc = 188; ! 2365: if(prlc) printf(f,lrc); ! 2366: } ! 2367: fl = 5; dr = 2; ! 2368: fl *= dr; ! 2369: if(fl != 10){ ! 2370: lrc = 189; ! 2371: if(prlc) printf(f,lrc); ! 2372: } ! 2373: dl = 5; cr = 2; ! 2374: dl *= cr; ! 2375: if(dl != 10){ ! 2376: lrc = 190; ! 2377: if(prlc) printf(f,lrc); ! 2378: } ! 2379: dl = 5; sr = 2; ! 2380: dl *= sr; ! 2381: if(dl != 10){ ! 2382: lrc = 191; ! 2383: if(prlc) printf(f,lrc); ! 2384: } ! 2385: dl = 5; ir = 2; ! 2386: dl *= ir; ! 2387: if(dl != 10){ ! 2388: lrc = 192; ! 2389: if(prlc) printf(f,lrc); ! 2390: } ! 2391: dl = 5; lr = 2; ! 2392: dl *= lr; ! 2393: if(dl != 10){ ! 2394: lrc = 193; ! 2395: if(prlc) printf(f,lrc); ! 2396: } ! 2397: dl = 5; ur = 2; ! 2398: dl *= ur; ! 2399: if(dl != 10){ ! 2400: lrc = 194; ! 2401: if(prlc) printf(f,lrc); ! 2402: } ! 2403: dl = 5; fr = 2; ! 2404: dl *= fr; ! 2405: if(dl != 10){ ! 2406: lrc = 195; ! 2407: if(prlc) printf(f,lrc); ! 2408: } ! 2409: dl = 5; dr = 2; ! 2410: dl *= dr; ! 2411: if(dl != 10){ ! 2412: lrc = 196; ! 2413: if(prlc) printf(f,lrc); ! 2414: } ! 2415: cl = 5; cr = 2; ! 2416: cl /= cr; ! 2417: if(cl != 2){ ! 2418: lrc = 197; ! 2419: if(prlc) printf(f,lrc); ! 2420: } ! 2421: cl = 5; sr = 2; ! 2422: cl /= sr; ! 2423: if(cl != 2){ ! 2424: lrc = 198; ! 2425: if(prlc) printf(f,lrc); ! 2426: } ! 2427: cl = 5; ir = 2; ! 2428: cl /= ir; ! 2429: if(cl != 2){ ! 2430: lrc = 199; ! 2431: if(prlc) printf(f,lrc); ! 2432: } ! 2433: cl = 5; lr = 2; ! 2434: cl /= lr; ! 2435: if(cl != 2){ ! 2436: lrc = 200; ! 2437: if(prlc) printf(f,lrc); ! 2438: } ! 2439: cl = 5; ur = 2; ! 2440: cl /= ur; ! 2441: if(cl != 2){ ! 2442: lrc = 201; ! 2443: if(prlc) printf(f,lrc); ! 2444: } ! 2445: cl = 5; fr = 2; ! 2446: cl /= fr; ! 2447: if(cl != 2){ ! 2448: lrc = 202; ! 2449: if(prlc) printf(f,lrc); ! 2450: } ! 2451: cl = 5; dr = 2; ! 2452: cl /= dr; ! 2453: if(cl != 2){ ! 2454: lrc = 203; ! 2455: if(prlc) printf(f,lrc); ! 2456: } ! 2457: sl = 5; cr = 2; ! 2458: sl /= cr; ! 2459: if(sl != 2){ ! 2460: lrc = 204; ! 2461: if(prlc) printf(f,lrc); ! 2462: } ! 2463: sl = 5; sr = 2; ! 2464: sl /= sr; ! 2465: if(sl != 2){ ! 2466: lrc = 205; ! 2467: if(prlc) printf(f,lrc); ! 2468: } ! 2469: sl = 5; ir = 2; ! 2470: sl /= ir; ! 2471: if(sl != 2){ ! 2472: lrc = 206; ! 2473: if(prlc) printf(f,lrc); ! 2474: } ! 2475: sl = 5; lr = 2; ! 2476: sl /= lr; ! 2477: if(sl != 2){ ! 2478: lrc = 207; ! 2479: if(prlc) printf(f,lrc); ! 2480: } ! 2481: sl = 5; ur = 2; ! 2482: sl /= ur; ! 2483: if(sl != 2){ ! 2484: lrc = 208; ! 2485: if(prlc) printf(f,lrc); ! 2486: } ! 2487: sl = 5; fr = 2; ! 2488: sl /= fr; ! 2489: if(sl != 2){ ! 2490: lrc = 209; ! 2491: if(prlc) printf(f,lrc); ! 2492: } ! 2493: sl = 5; dr = 2; ! 2494: sl /= dr; ! 2495: if(sl != 2){ ! 2496: lrc = 210; ! 2497: if(prlc) printf(f,lrc); ! 2498: } ! 2499: il = 5; cr = 2; ! 2500: il /= cr; ! 2501: if(il != 2){ ! 2502: lrc = 211; ! 2503: if(prlc) printf(f,lrc); ! 2504: } ! 2505: il = 5; sr = 2; ! 2506: il /= sr; ! 2507: if(il != 2){ ! 2508: lrc = 212; ! 2509: if(prlc) printf(f,lrc); ! 2510: } ! 2511: il = 5; ir = 2; ! 2512: il /= ir; ! 2513: if(il != 2){ ! 2514: lrc = 213; ! 2515: if(prlc) printf(f,lrc); ! 2516: } ! 2517: il = 5; lr = 2; ! 2518: il /= lr; ! 2519: if(il != 2){ ! 2520: lrc = 214; ! 2521: if(prlc) printf(f,lrc); ! 2522: } ! 2523: il = 5; ur = 2; ! 2524: il /= ur; ! 2525: if(il != 2){ ! 2526: lrc = 215; ! 2527: if(prlc) printf(f,lrc); ! 2528: } ! 2529: il = 5; fr = 2; ! 2530: il /= fr; ! 2531: if(il != 2){ ! 2532: lrc = 216; ! 2533: if(prlc) printf(f,lrc); ! 2534: } ! 2535: il = 5; dr = 2; ! 2536: il /= dr; ! 2537: if(il != 2){ ! 2538: lrc = 217; ! 2539: if(prlc) printf(f,lrc); ! 2540: } ! 2541: ll = 5; cr = 2; ! 2542: ll /= cr; ! 2543: if(ll != 2){ ! 2544: lrc = 218; ! 2545: if(prlc) printf(f,lrc); ! 2546: } ! 2547: ll = 5; sr = 2; ! 2548: ll /= sr; ! 2549: if(ll != 2){ ! 2550: lrc = 219; ! 2551: if(prlc) printf(f,lrc); ! 2552: } ! 2553: ll = 5; ir = 2; ! 2554: ll /= ir; ! 2555: if(ll != 2){ ! 2556: lrc = 220; ! 2557: if(prlc) printf(f,lrc); ! 2558: } ! 2559: ll = 5; lr = 2; ! 2560: ll /= lr; ! 2561: if(ll != 2){ ! 2562: lrc = 221; ! 2563: if(prlc) printf(f,lrc); ! 2564: } ! 2565: ll = 5; ur = 2; ! 2566: ll /= ur; ! 2567: if(ll != 2){ ! 2568: lrc = 222; ! 2569: if(prlc) printf(f,lrc); ! 2570: } ! 2571: ll = 5; fr = 2; ! 2572: ll /= fr; ! 2573: if(ll != 2){ ! 2574: lrc = 223; ! 2575: if(prlc) printf(f,lrc); ! 2576: } ! 2577: ll = 5; dr = 2; ! 2578: ll /= dr; ! 2579: if(ll != 2){ ! 2580: lrc = 224; ! 2581: if(prlc) printf(f,lrc); ! 2582: } ! 2583: ul = 5; cr = 2; ! 2584: ul /= cr; ! 2585: if(ul != 2){ ! 2586: lrc = 225; ! 2587: if(prlc) printf(f,lrc); ! 2588: } ! 2589: ul = 5; sr = 2; ! 2590: ul /= sr; ! 2591: if(ul != 2){ ! 2592: lrc = 226; ! 2593: if(prlc) printf(f,lrc); ! 2594: } ! 2595: ul = 5; ir = 2; ! 2596: ul /= ir; ! 2597: if(ul != 2){ ! 2598: lrc = 227; ! 2599: if(prlc) printf(f,lrc); ! 2600: } ! 2601: ul = 5; lr = 2; ! 2602: ul /= lr; ! 2603: if(ul != 2){ ! 2604: lrc = 228; ! 2605: if(prlc) printf(f,lrc); ! 2606: } ! 2607: ul = 5; ur = 2; ! 2608: ul /= ur; ! 2609: if(ul != 2){ ! 2610: lrc = 229; ! 2611: if(prlc) printf(f,lrc); ! 2612: } ! 2613: ul = 5; fr = 2; ! 2614: ul /= fr; ! 2615: if(ul != 2){ ! 2616: lrc = 230; ! 2617: if(prlc) printf(f,lrc); ! 2618: } ! 2619: ul = 5; dr = 2; ! 2620: ul /= dr; ! 2621: if(ul != 2){ ! 2622: lrc = 231; ! 2623: if(prlc) printf(f,lrc); ! 2624: } ! 2625: fl = 5; cr = 2; ! 2626: fl /= cr; ! 2627: if(fl != 2.5){ ! 2628: lrc = 232; ! 2629: if(prlc) printf(f,lrc); ! 2630: } ! 2631: fl = 5; sr = 2; ! 2632: fl /= sr; ! 2633: if(fl != 2.5){ ! 2634: lrc = 233; ! 2635: if(prlc) printf(f,lrc); ! 2636: } ! 2637: fl = 5; ir = 2; ! 2638: fl /= ir; ! 2639: if(fl != 2.5){ ! 2640: lrc = 234; ! 2641: if(prlc) printf(f,lrc); ! 2642: } ! 2643: fl = 5; lr = 2; ! 2644: fl /= lr; ! 2645: if(fl != 2.5){ ! 2646: lrc = 235; ! 2647: if(prlc) printf(f,lrc); ! 2648: } ! 2649: fl = 5; ur = 2; ! 2650: fl /= ur; ! 2651: if(fl != 2.5){ ! 2652: lrc = 236; ! 2653: if(prlc) printf(f,lrc); ! 2654: } ! 2655: fl = 5; fr = 2; ! 2656: fl /= fr; ! 2657: if(fl != 2.5){ ! 2658: lrc = 237; ! 2659: if(prlc) printf(f,lrc); ! 2660: } ! 2661: fl = 5; dr = 2; ! 2662: fl /= dr; ! 2663: if(fl != 2.5){ ! 2664: lrc = 238; ! 2665: if(prlc) printf(f,lrc); ! 2666: } ! 2667: dl = 5; cr = 2; ! 2668: dl /= cr; ! 2669: if(dl != 2.5){ ! 2670: lrc = 239; ! 2671: if(prlc) printf(f,lrc); ! 2672: } ! 2673: dl = 5; sr = 2; ! 2674: dl /= sr; ! 2675: if(dl != 2.5){ ! 2676: lrc = 240; ! 2677: if(prlc) printf(f,lrc); ! 2678: } ! 2679: dl = 5; ir = 2; ! 2680: dl /= ir; ! 2681: if(dl != 2.5){ ! 2682: lrc = 241; ! 2683: if(prlc) printf(f,lrc); ! 2684: } ! 2685: dl = 5; lr = 2; ! 2686: dl /= lr; ! 2687: if(dl != 2.5){ ! 2688: lrc = 242; ! 2689: if(prlc) printf(f,lrc); ! 2690: } ! 2691: dl = 5; ur = 2; ! 2692: dl /= ur; ! 2693: if(dl != 2.5){ ! 2694: lrc = 243; ! 2695: if(prlc) printf(f,lrc); ! 2696: } ! 2697: dl = 5; fr = 2; ! 2698: dl /= fr; ! 2699: if(dl != 2.5){ ! 2700: lrc = 244; ! 2701: if(prlc) printf(f,lrc); ! 2702: } ! 2703: dl = 5; dr = 2; ! 2704: dl /= dr; ! 2705: if(dl != 2.5){ ! 2706: lrc = 245; ! 2707: if(prlc) printf(f,lrc); ! 2708: } ! 2709: cl = 5; cr = 2; ! 2710: cl %= cr; ! 2711: if(cl != 1){ ! 2712: lrc = 246; ! 2713: if(prlc) printf(f,lrc); ! 2714: } ! 2715: cl = 5; sr = 2; ! 2716: cl %= sr; ! 2717: if(cl != 1){ ! 2718: lrc = 247; ! 2719: if(prlc) printf(f,lrc); ! 2720: } ! 2721: cl = 5; ir = 2; ! 2722: cl %= ir; ! 2723: if(cl != 1){ ! 2724: lrc = 248; ! 2725: if(prlc) printf(f,lrc); ! 2726: } ! 2727: cl = 5; lr = 2; ! 2728: cl %= lr; ! 2729: if(cl != 1){ ! 2730: lrc = 249; ! 2731: if(prlc) printf(f,lrc); ! 2732: } ! 2733: cl = 5; ur = 2; ! 2734: cl %= ur; ! 2735: if(cl != 1){ ! 2736: lrc = 250; ! 2737: if(prlc) printf(f,lrc); ! 2738: } ! 2739: sl = 5; cr = 2; ! 2740: sl %= cr; ! 2741: if(sl != 1){ ! 2742: lrc = 251; ! 2743: if(prlc) printf(f,lrc); ! 2744: } ! 2745: sl = 5; sr = 2; ! 2746: sl %= sr; ! 2747: if(sl != 1){ ! 2748: lrc = 252; ! 2749: if(prlc) printf(f,lrc); ! 2750: } ! 2751: sl = 5; ir = 2; ! 2752: sl %= ir; ! 2753: if(sl != 1){ ! 2754: lrc = 253; ! 2755: if(prlc) printf(f,lrc); ! 2756: } ! 2757: sl = 5; lr = 2; ! 2758: sl %= lr; ! 2759: if(sl != 1){ ! 2760: lrc = 254; ! 2761: if(prlc) printf(f,lrc); ! 2762: } ! 2763: sl = 5; ur = 2; ! 2764: sl %= ur; ! 2765: if(sl != 1){ ! 2766: lrc = 255; ! 2767: if(prlc) printf(f,lrc); ! 2768: } ! 2769: il = 5; cr = 2; ! 2770: il %= cr; ! 2771: if(il != 1){ ! 2772: lrc = 256; ! 2773: if(prlc) printf(f,lrc); ! 2774: } ! 2775: il = 5; sr = 2; ! 2776: il %= sr; ! 2777: if(il != 1){ ! 2778: lrc = 257; ! 2779: if(prlc) printf(f,lrc); ! 2780: } ! 2781: il = 5; ir = 2; ! 2782: il %= ir; ! 2783: if(il != 1){ ! 2784: lrc = 258; ! 2785: if(prlc) printf(f,lrc); ! 2786: } ! 2787: il = 5; lr = 2; ! 2788: il %= lr; ! 2789: if(il != 1){ ! 2790: lrc = 259; ! 2791: if(prlc) printf(f,lrc); ! 2792: } ! 2793: il = 5; ur = 2; ! 2794: il %= ur; ! 2795: if(il != 1){ ! 2796: lrc = 260; ! 2797: if(prlc) printf(f,lrc); ! 2798: } ! 2799: ll = 5; cr = 2; ! 2800: ll %= cr; ! 2801: if(ll != 1){ ! 2802: lrc = 261; ! 2803: if(prlc) printf(f,lrc); ! 2804: } ! 2805: ll = 5; sr = 2; ! 2806: ll %= sr; ! 2807: if(ll != 1){ ! 2808: lrc = 262; ! 2809: if(prlc) printf(f,lrc); ! 2810: } ! 2811: ll = 5; ir = 2; ! 2812: ll %= ir; ! 2813: if(ll != 1){ ! 2814: lrc = 263; ! 2815: if(prlc) printf(f,lrc); ! 2816: } ! 2817: ll = 5; lr = 2; ! 2818: ll %= lr; ! 2819: if(ll != 1){ ! 2820: lrc = 264; ! 2821: if(prlc) printf(f,lrc); ! 2822: } ! 2823: ll = 5; ur = 2; ! 2824: ll %= ur; ! 2825: if(ll != 1){ ! 2826: lrc = 265; ! 2827: if(prlc) printf(f,lrc); ! 2828: } ! 2829: ul = 5; cr = 2; ! 2830: ul %= cr; ! 2831: if(ul != 1){ ! 2832: lrc = 266; ! 2833: if(prlc) printf(f,lrc); ! 2834: } ! 2835: ul = 5; sr = 2; ! 2836: ul %= sr; ! 2837: if(ul != 1){ ! 2838: lrc = 267; ! 2839: if(prlc) printf(f,lrc); ! 2840: } ! 2841: ul = 5; ir = 2; ! 2842: ul %= ir; ! 2843: if(ul != 1){ ! 2844: lrc = 268; ! 2845: if(prlc) printf(f,lrc); ! 2846: } ! 2847: ul = 5; lr = 2; ! 2848: ul %= lr; ! 2849: if(ul != 1){ ! 2850: lrc = 269; ! 2851: if(prlc) printf(f,lrc); ! 2852: } ! 2853: ul = 5; ur = 2; ! 2854: ul %= ur; ! 2855: if(ul != 1){ ! 2856: lrc = 270; ! 2857: if(prlc) printf(f,lrc); ! 2858: } ! 2859: cl = 5; cr = 2; ! 2860: cl >>= cr; ! 2861: if(cl != 1){ ! 2862: lrc = 271; ! 2863: if(prlc) printf(f,lrc); ! 2864: } ! 2865: cl = 5; sr = 2; ! 2866: cl >>= sr; ! 2867: if(cl != 1){ ! 2868: lrc = 272; ! 2869: if(prlc) printf(f,lrc); ! 2870: } ! 2871: cl = 5; ir = 2; ! 2872: cl >>= ir; ! 2873: if(cl != 1){ ! 2874: lrc = 273; ! 2875: if(prlc) printf(f,lrc); ! 2876: } ! 2877: cl = 5; lr = 2; ! 2878: cl >>= lr; ! 2879: if(cl != 1){ ! 2880: lrc = 274; ! 2881: if(prlc) printf(f,lrc); ! 2882: } ! 2883: cl = 5; ur = 2; ! 2884: cl >>= ur; ! 2885: if(cl != 1){ ! 2886: lrc = 275; ! 2887: if(prlc) printf(f,lrc); ! 2888: } ! 2889: sl = 5; cr = 2; ! 2890: sl >>= cr; ! 2891: if(sl != 1){ ! 2892: lrc = 276; ! 2893: if(prlc) printf(f,lrc); ! 2894: } ! 2895: sl = 5; sr = 2; ! 2896: sl >>= sr; ! 2897: if(sl != 1){ ! 2898: lrc = 277; ! 2899: if(prlc) printf(f,lrc); ! 2900: } ! 2901: sl = 5; ir = 2; ! 2902: sl >>= ir; ! 2903: if(sl != 1){ ! 2904: lrc = 278; ! 2905: if(prlc) printf(f,lrc); ! 2906: } ! 2907: sl = 5; lr = 2; ! 2908: sl >>= lr; ! 2909: if(sl != 1){ ! 2910: lrc = 279; ! 2911: if(prlc) printf(f,lrc); ! 2912: } ! 2913: sl = 5; ur = 2; ! 2914: sl >>= ur; ! 2915: if(sl != 1){ ! 2916: lrc = 280; ! 2917: if(prlc) printf(f,lrc); ! 2918: } ! 2919: il = 5; cr = 2; ! 2920: il >>= cr; ! 2921: if(il != 1){ ! 2922: lrc = 281; ! 2923: if(prlc) printf(f,lrc); ! 2924: } ! 2925: il = 5; sr = 2; ! 2926: il >>= sr; ! 2927: if(il != 1){ ! 2928: lrc = 282; ! 2929: if(prlc) printf(f,lrc); ! 2930: } ! 2931: il = 5; ir = 2; ! 2932: il >>= ir; ! 2933: if(il != 1){ ! 2934: lrc = 283; ! 2935: if(prlc) printf(f,lrc); ! 2936: } ! 2937: il = 5; lr = 2; ! 2938: il >>= lr; ! 2939: if(il != 1){ ! 2940: lrc = 284; ! 2941: if(prlc) printf(f,lrc); ! 2942: } ! 2943: il = 5; ur = 2; ! 2944: il >>= ur; ! 2945: if(il != 1){ ! 2946: lrc = 285; ! 2947: if(prlc) printf(f,lrc); ! 2948: } ! 2949: ll = 5; cr = 2; ! 2950: ll >>= cr; ! 2951: if(ll != 1){ ! 2952: lrc = 286; ! 2953: if(prlc) printf(f,lrc); ! 2954: } ! 2955: ll = 5; sr = 2; ! 2956: ll >>= sr; ! 2957: if(ll != 1){ ! 2958: lrc = 287; ! 2959: if(prlc) printf(f,lrc); ! 2960: } ! 2961: ll = 5; ir = 2; ! 2962: ll >>= ir; ! 2963: if(ll != 1){ ! 2964: lrc = 288; ! 2965: if(prlc) printf(f,lrc); ! 2966: } ! 2967: ll = 5; lr = 2; ! 2968: ll >>= lr; ! 2969: if(ll != 1){ ! 2970: lrc = 289; ! 2971: if(prlc) printf(f,lrc); ! 2972: } ! 2973: ll = 5; ur = 2; ! 2974: ll >>= ur; ! 2975: if(ll != 1){ ! 2976: lrc = 290; ! 2977: if(prlc) printf(f,lrc); ! 2978: } ! 2979: ul = 5; cr = 2; ! 2980: ul >>= cr; ! 2981: if(ul != 1){ ! 2982: lrc = 291; ! 2983: if(prlc) printf(f,lrc); ! 2984: } ! 2985: ul = 5; sr = 2; ! 2986: ul >>= sr; ! 2987: if(ul != 1){ ! 2988: lrc = 292; ! 2989: if(prlc) printf(f,lrc); ! 2990: } ! 2991: ul = 5; ir = 2; ! 2992: ul >>= ir; ! 2993: if(ul != 1){ ! 2994: lrc = 293; ! 2995: if(prlc) printf(f,lrc); ! 2996: } ! 2997: ul = 5; lr = 2; ! 2998: ul >>= lr; ! 2999: if(ul != 1){ ! 3000: lrc = 294; ! 3001: if(prlc) printf(f,lrc); ! 3002: } ! 3003: ul = 5; ur = 2; ! 3004: ul >>= ur; ! 3005: if(ul != 1){ ! 3006: lrc = 295; ! 3007: if(prlc) printf(f,lrc); ! 3008: } ! 3009: cl = 5; cr = 2; ! 3010: cl <<= cr; ! 3011: if(cl != 20){ ! 3012: lrc = 296; ! 3013: if(prlc) printf(f,lrc); ! 3014: } ! 3015: cl = 5; sr = 2; ! 3016: cl <<= sr; ! 3017: if(cl != 20){ ! 3018: lrc = 297; ! 3019: if(prlc) printf(f,lrc); ! 3020: } ! 3021: cl = 5; ir = 2; ! 3022: cl <<= ir; ! 3023: if(cl != 20){ ! 3024: lrc = 298; ! 3025: if(prlc) printf(f,lrc); ! 3026: } ! 3027: cl = 5; lr = 2; ! 3028: cl <<= lr; ! 3029: if(cl != 20){ ! 3030: lrc = 299; ! 3031: if(prlc) printf(f,lrc); ! 3032: } ! 3033: cl = 5; ur = 2; ! 3034: cl <<= ur; ! 3035: if(cl != 20){ ! 3036: lrc = 300; ! 3037: if(prlc) printf(f,lrc); ! 3038: } ! 3039: sl = 5; cr = 2; ! 3040: sl <<= cr; ! 3041: if(sl != 20){ ! 3042: lrc = 301; ! 3043: if(prlc) printf(f,lrc); ! 3044: } ! 3045: sl = 5; sr = 2; ! 3046: sl <<= sr; ! 3047: if(sl != 20){ ! 3048: lrc = 302; ! 3049: if(prlc) printf(f,lrc); ! 3050: } ! 3051: sl = 5; ir = 2; ! 3052: sl <<= ir; ! 3053: if(sl != 20){ ! 3054: lrc = 303; ! 3055: if(prlc) printf(f,lrc); ! 3056: } ! 3057: sl = 5; lr = 2; ! 3058: sl <<= lr; ! 3059: if(sl != 20){ ! 3060: lrc = 304; ! 3061: if(prlc) printf(f,lrc); ! 3062: } ! 3063: sl = 5; ur = 2; ! 3064: sl <<= ur; ! 3065: if(sl != 20){ ! 3066: lrc = 305; ! 3067: if(prlc) printf(f,lrc); ! 3068: } ! 3069: il = 5; cr = 2; ! 3070: il <<= cr; ! 3071: if(il != 20){ ! 3072: lrc = 306; ! 3073: if(prlc) printf(f,lrc); ! 3074: } ! 3075: il = 5; sr = 2; ! 3076: il <<= sr; ! 3077: if(il != 20){ ! 3078: lrc = 307; ! 3079: if(prlc) printf(f,lrc); ! 3080: } ! 3081: il = 5; ir = 2; ! 3082: il <<= ir; ! 3083: if(il != 20){ ! 3084: lrc = 308; ! 3085: if(prlc) printf(f,lrc); ! 3086: } ! 3087: il = 5; lr = 2; ! 3088: il <<= lr; ! 3089: if(il != 20){ ! 3090: lrc = 309; ! 3091: if(prlc) printf(f,lrc); ! 3092: } ! 3093: il = 5; ur = 2; ! 3094: il <<= ur; ! 3095: if(il != 20){ ! 3096: lrc = 310; ! 3097: if(prlc) printf(f,lrc); ! 3098: } ! 3099: ll = 5; cr = 2; ! 3100: ll <<= cr; ! 3101: if(ll != 20){ ! 3102: lrc = 311; ! 3103: if(prlc) printf(f,lrc); ! 3104: } ! 3105: ll = 5; sr = 2; ! 3106: ll <<= sr; ! 3107: if(ll != 20){ ! 3108: lrc = 312; ! 3109: if(prlc) printf(f,lrc); ! 3110: } ! 3111: ll = 5; ir = 2; ! 3112: ll <<= ir; ! 3113: if(ll != 20){ ! 3114: lrc = 313; ! 3115: if(prlc) printf(f,lrc); ! 3116: } ! 3117: ll = 5; lr = 2; ! 3118: ll <<= lr; ! 3119: if(ll != 20){ ! 3120: lrc = 314; ! 3121: if(prlc) printf(f,lrc); ! 3122: } ! 3123: ll = 5; ur = 2; ! 3124: ll <<= ur; ! 3125: if(ll != 20){ ! 3126: lrc = 315; ! 3127: if(prlc) printf(f,lrc); ! 3128: } ! 3129: ul = 5; cr = 2; ! 3130: ul <<= cr; ! 3131: if(ul != 20){ ! 3132: lrc = 316; ! 3133: if(prlc) printf(f,lrc); ! 3134: } ! 3135: ul = 5; sr = 2; ! 3136: ul <<= sr; ! 3137: if(ul != 20){ ! 3138: lrc = 317; ! 3139: if(prlc) printf(f,lrc); ! 3140: } ! 3141: ul = 5; ir = 2; ! 3142: ul <<= ir; ! 3143: if(ul != 20){ ! 3144: lrc = 318; ! 3145: if(prlc) printf(f,lrc); ! 3146: } ! 3147: ul = 5; lr = 2; ! 3148: ul <<= lr; ! 3149: if(ul != 20){ ! 3150: lrc = 319; ! 3151: if(prlc) printf(f,lrc); ! 3152: } ! 3153: ul = 5; ur = 2; ! 3154: ul <<= ur; ! 3155: if(ul != 20){ ! 3156: lrc = 320; ! 3157: if(prlc) printf(f,lrc); ! 3158: } ! 3159: cl = 12; cr = 10; ! 3160: cl &= cr; ! 3161: if(cl != 8){ ! 3162: lrc = 321; ! 3163: if(prlc) printf(f,lrc); ! 3164: } ! 3165: cl = 12; sr = 10; ! 3166: cl &= sr; ! 3167: if(cl != 8){ ! 3168: lrc = 322; ! 3169: if(prlc) printf(f,lrc); ! 3170: } ! 3171: cl = 12; ir = 10; ! 3172: cl &= ir; ! 3173: if(cl != 8){ ! 3174: lrc = 323; ! 3175: if(prlc) printf(f,lrc); ! 3176: } ! 3177: cl = 12; lr = 10; ! 3178: cl &= lr; ! 3179: if(cl != 8){ ! 3180: lrc = 324; ! 3181: if(prlc) printf(f,lrc); ! 3182: } ! 3183: cl = 12; ur = 10; ! 3184: cl &= ur; ! 3185: if(cl != 8){ ! 3186: lrc = 325; ! 3187: if(prlc) printf(f,lrc); ! 3188: } ! 3189: sl = 12; cr = 10; ! 3190: sl &= cr; ! 3191: if(sl != 8){ ! 3192: lrc = 326; ! 3193: if(prlc) printf(f,lrc); ! 3194: } ! 3195: sl = 12; sr = 10; ! 3196: sl &= sr; ! 3197: if(sl != 8){ ! 3198: lrc = 327; ! 3199: if(prlc) printf(f,lrc); ! 3200: } ! 3201: sl = 12; ir = 10; ! 3202: sl &= ir; ! 3203: if(sl != 8){ ! 3204: lrc = 328; ! 3205: if(prlc) printf(f,lrc); ! 3206: } ! 3207: sl = 12; lr = 10; ! 3208: sl &= lr; ! 3209: if(sl != 8){ ! 3210: lrc = 329; ! 3211: if(prlc) printf(f,lrc); ! 3212: } ! 3213: sl = 12; ur = 10; ! 3214: sl &= ur; ! 3215: if(sl != 8){ ! 3216: lrc = 330; ! 3217: if(prlc) printf(f,lrc); ! 3218: } ! 3219: il = 12; cr = 10; ! 3220: il &= cr; ! 3221: if(il != 8){ ! 3222: lrc = 331; ! 3223: if(prlc) printf(f,lrc); ! 3224: } ! 3225: il = 12; sr = 10; ! 3226: il &= sr; ! 3227: if(il != 8){ ! 3228: lrc = 332; ! 3229: if(prlc) printf(f,lrc); ! 3230: } ! 3231: il = 12; ir = 10; ! 3232: il &= ir; ! 3233: if(il != 8){ ! 3234: lrc = 333; ! 3235: if(prlc) printf(f,lrc); ! 3236: } ! 3237: il = 12; lr = 10; ! 3238: il &= lr; ! 3239: if(il != 8){ ! 3240: lrc = 334; ! 3241: if(prlc) printf(f,lrc); ! 3242: } ! 3243: il = 12; ur = 10; ! 3244: il &= ur; ! 3245: if(il != 8){ ! 3246: lrc = 335; ! 3247: if(prlc) printf(f,lrc); ! 3248: } ! 3249: ll = 12; cr = 10; ! 3250: ll &= cr; ! 3251: if(ll != 8){ ! 3252: lrc = 336; ! 3253: if(prlc) printf(f,lrc); ! 3254: } ! 3255: ll = 12; sr = 10; ! 3256: ll &= sr; ! 3257: if(ll != 8){ ! 3258: lrc = 337; ! 3259: if(prlc) printf(f,lrc); ! 3260: } ! 3261: ll = 12; ir = 10; ! 3262: ll &= ir; ! 3263: if(ll != 8){ ! 3264: lrc = 338; ! 3265: if(prlc) printf(f,lrc); ! 3266: } ! 3267: ll = 12; lr = 10; ! 3268: ll &= lr; ! 3269: if(ll != 8){ ! 3270: lrc = 339; ! 3271: if(prlc) printf(f,lrc); ! 3272: } ! 3273: ll = 12; ur = 10; ! 3274: ll &= ur; ! 3275: if(ll != 8){ ! 3276: lrc = 340; ! 3277: if(prlc) printf(f,lrc); ! 3278: } ! 3279: ul = 12; cr = 10; ! 3280: ul &= cr; ! 3281: if(ul != 8){ ! 3282: lrc = 341; ! 3283: if(prlc) printf(f,lrc); ! 3284: } ! 3285: ul = 12; sr = 10; ! 3286: ul &= sr; ! 3287: if(ul != 8){ ! 3288: lrc = 342; ! 3289: if(prlc) printf(f,lrc); ! 3290: } ! 3291: ul = 12; ir = 10; ! 3292: ul &= ir; ! 3293: if(ul != 8){ ! 3294: lrc = 343; ! 3295: if(prlc) printf(f,lrc); ! 3296: } ! 3297: ul = 12; lr = 10; ! 3298: ul &= lr; ! 3299: if(ul != 8){ ! 3300: lrc = 344; ! 3301: if(prlc) printf(f,lrc); ! 3302: } ! 3303: ul = 12; ur = 10; ! 3304: ul &= ur; ! 3305: if(ul != 8){ ! 3306: lrc = 345; ! 3307: if(prlc) printf(f,lrc); ! 3308: } ! 3309: cl = 12; cr = 10; ! 3310: cl ^= cr; ! 3311: if(cl != 6){ ! 3312: lrc = 346; ! 3313: if(prlc) printf(f,lrc); ! 3314: } ! 3315: cl = 12; sr = 10; ! 3316: cl ^= sr; ! 3317: if(cl != 6){ ! 3318: lrc = 347; ! 3319: if(prlc) printf(f,lrc); ! 3320: } ! 3321: cl = 12; ir = 10; ! 3322: cl ^= ir; ! 3323: if(cl != 6){ ! 3324: lrc = 348; ! 3325: if(prlc) printf(f,lrc); ! 3326: } ! 3327: cl = 12; lr = 10; ! 3328: cl ^= lr; ! 3329: if(cl != 6){ ! 3330: lrc = 349; ! 3331: if(prlc) printf(f,lrc); ! 3332: } ! 3333: cl = 12; ur = 10; ! 3334: cl ^= ur; ! 3335: if(cl != 6){ ! 3336: lrc = 350; ! 3337: if(prlc) printf(f,lrc); ! 3338: } ! 3339: sl = 12; cr = 10; ! 3340: sl ^= cr; ! 3341: if(sl != 6){ ! 3342: lrc = 351; ! 3343: if(prlc) printf(f,lrc); ! 3344: } ! 3345: sl = 12; sr = 10; ! 3346: sl ^= sr; ! 3347: if(sl != 6){ ! 3348: lrc = 352; ! 3349: if(prlc) printf(f,lrc); ! 3350: } ! 3351: sl = 12; ir = 10; ! 3352: sl ^= ir; ! 3353: if(sl != 6){ ! 3354: lrc = 353; ! 3355: if(prlc) printf(f,lrc); ! 3356: } ! 3357: sl = 12; lr = 10; ! 3358: sl ^= lr; ! 3359: if(sl != 6){ ! 3360: lrc = 354; ! 3361: if(prlc) printf(f,lrc); ! 3362: } ! 3363: sl = 12; ur = 10; ! 3364: sl ^= ur; ! 3365: if(sl != 6){ ! 3366: lrc = 355; ! 3367: if(prlc) printf(f,lrc); ! 3368: } ! 3369: il = 12; cr = 10; ! 3370: il ^= cr; ! 3371: if(il != 6){ ! 3372: lrc = 356; ! 3373: if(prlc) printf(f,lrc); ! 3374: } ! 3375: il = 12; sr = 10; ! 3376: il ^= sr; ! 3377: if(il != 6){ ! 3378: lrc = 357; ! 3379: if(prlc) printf(f,lrc); ! 3380: } ! 3381: il = 12; ir = 10; ! 3382: il ^= ir; ! 3383: if(il != 6){ ! 3384: lrc = 358; ! 3385: if(prlc) printf(f,lrc); ! 3386: } ! 3387: il = 12; lr = 10; ! 3388: il ^= lr; ! 3389: if(il != 6){ ! 3390: lrc = 359; ! 3391: if(prlc) printf(f,lrc); ! 3392: } ! 3393: il = 12; ur = 10; ! 3394: il ^= ur; ! 3395: if(il != 6){ ! 3396: lrc = 360; ! 3397: if(prlc) printf(f,lrc); ! 3398: } ! 3399: ll = 12; cr = 10; ! 3400: ll ^= cr; ! 3401: if(ll != 6){ ! 3402: lrc = 361; ! 3403: if(prlc) printf(f,lrc); ! 3404: } ! 3405: ll = 12; sr = 10; ! 3406: ll ^= sr; ! 3407: if(ll != 6){ ! 3408: lrc = 362; ! 3409: if(prlc) printf(f,lrc); ! 3410: } ! 3411: ll = 12; ir = 10; ! 3412: ll ^= ir; ! 3413: if(ll != 6){ ! 3414: lrc = 363; ! 3415: if(prlc) printf(f,lrc); ! 3416: } ! 3417: ll = 12; lr = 10; ! 3418: ll ^= lr; ! 3419: if(ll != 6){ ! 3420: lrc = 364; ! 3421: if(prlc) printf(f,lrc); ! 3422: } ! 3423: ll = 12; ur = 10; ! 3424: ll ^= ur; ! 3425: if(ll != 6){ ! 3426: lrc = 365; ! 3427: if(prlc) printf(f,lrc); ! 3428: } ! 3429: ul = 12; cr = 10; ! 3430: ul ^= cr; ! 3431: if(ul != 6){ ! 3432: lrc = 366; ! 3433: if(prlc) printf(f,lrc); ! 3434: } ! 3435: ul = 12; sr = 10; ! 3436: ul ^= sr; ! 3437: if(ul != 6){ ! 3438: lrc = 367; ! 3439: if(prlc) printf(f,lrc); ! 3440: } ! 3441: ul = 12; ir = 10; ! 3442: ul ^= ir; ! 3443: if(ul != 6){ ! 3444: lrc = 368; ! 3445: if(prlc) printf(f,lrc); ! 3446: } ! 3447: ul = 12; lr = 10; ! 3448: ul ^= lr; ! 3449: if(ul != 6){ ! 3450: lrc = 369; ! 3451: if(prlc) printf(f,lrc); ! 3452: } ! 3453: ul = 12; ur = 10; ! 3454: ul ^= ur; ! 3455: if(ul != 6){ ! 3456: lrc = 370; ! 3457: if(prlc) printf(f,lrc); ! 3458: } ! 3459: cl = 12; cr = 10; ! 3460: cl |= cr; ! 3461: if(cl != 14){ ! 3462: lrc = 371; ! 3463: if(prlc) printf(f,lrc); ! 3464: } ! 3465: cl = 12; sr = 10; ! 3466: cl |= sr; ! 3467: if(cl != 14){ ! 3468: lrc = 372; ! 3469: if(prlc) printf(f,lrc); ! 3470: } ! 3471: cl = 12; ir = 10; ! 3472: cl |= ir; ! 3473: if(cl != 14){ ! 3474: lrc = 373; ! 3475: if(prlc) printf(f,lrc); ! 3476: } ! 3477: cl = 12; lr = 10; ! 3478: cl |= lr; ! 3479: if(cl != 14){ ! 3480: lrc = 374; ! 3481: if(prlc) printf(f,lrc); ! 3482: } ! 3483: cl = 12; ur = 10; ! 3484: cl |= ur; ! 3485: if(cl != 14){ ! 3486: lrc = 375; ! 3487: if(prlc) printf(f,lrc); ! 3488: } ! 3489: sl = 12; cr = 10; ! 3490: sl |= cr; ! 3491: if(sl != 14){ ! 3492: lrc = 376; ! 3493: if(prlc) printf(f,lrc); ! 3494: } ! 3495: sl = 12; sr = 10; ! 3496: sl |= sr; ! 3497: if(sl != 14){ ! 3498: lrc = 377; ! 3499: if(prlc) printf(f,lrc); ! 3500: } ! 3501: sl = 12; ir = 10; ! 3502: sl |= ir; ! 3503: if(sl != 14){ ! 3504: lrc = 378; ! 3505: if(prlc) printf(f,lrc); ! 3506: } ! 3507: sl = 12; lr = 10; ! 3508: sl |= lr; ! 3509: if(sl != 14){ ! 3510: lrc = 379; ! 3511: if(prlc) printf(f,lrc); ! 3512: } ! 3513: sl = 12; ur = 10; ! 3514: sl |= ur; ! 3515: if(sl != 14){ ! 3516: lrc = 380; ! 3517: if(prlc) printf(f,lrc); ! 3518: } ! 3519: il = 12; cr = 10; ! 3520: il |= cr; ! 3521: if(il != 14){ ! 3522: lrc = 381; ! 3523: if(prlc) printf(f,lrc); ! 3524: } ! 3525: il = 12; sr = 10; ! 3526: il |= sr; ! 3527: if(il != 14){ ! 3528: lrc = 382; ! 3529: if(prlc) printf(f,lrc); ! 3530: } ! 3531: il = 12; ir = 10; ! 3532: il |= ir; ! 3533: if(il != 14){ ! 3534: lrc = 383; ! 3535: if(prlc) printf(f,lrc); ! 3536: } ! 3537: il = 12; lr = 10; ! 3538: il |= lr; ! 3539: if(il != 14){ ! 3540: lrc = 384; ! 3541: if(prlc) printf(f,lrc); ! 3542: } ! 3543: il = 12; ur = 10; ! 3544: il |= ur; ! 3545: if(il != 14){ ! 3546: lrc = 385; ! 3547: if(prlc) printf(f,lrc); ! 3548: } ! 3549: ll = 12; cr = 10; ! 3550: ll |= cr; ! 3551: if(ll != 14){ ! 3552: lrc = 386; ! 3553: if(prlc) printf(f,lrc); ! 3554: } ! 3555: ll = 12; sr = 10; ! 3556: ll |= sr; ! 3557: if(ll != 14){ ! 3558: lrc = 387; ! 3559: if(prlc) printf(f,lrc); ! 3560: } ! 3561: ll = 12; ir = 10; ! 3562: ll |= ir; ! 3563: if(ll != 14){ ! 3564: lrc = 388; ! 3565: if(prlc) printf(f,lrc); ! 3566: } ! 3567: ll = 12; lr = 10; ! 3568: ll |= lr; ! 3569: if(ll != 14){ ! 3570: lrc = 389; ! 3571: if(prlc) printf(f,lrc); ! 3572: } ! 3573: ll = 12; ur = 10; ! 3574: ll |= ur; ! 3575: if(ll != 14){ ! 3576: lrc = 390; ! 3577: if(prlc) printf(f,lrc); ! 3578: } ! 3579: ul = 12; cr = 10; ! 3580: ul |= cr; ! 3581: if(ul != 14){ ! 3582: lrc = 391; ! 3583: if(prlc) printf(f,lrc); ! 3584: } ! 3585: ul = 12; sr = 10; ! 3586: ul |= sr; ! 3587: if(ul != 14){ ! 3588: lrc = 392; ! 3589: if(prlc) printf(f,lrc); ! 3590: } ! 3591: ul = 12; ir = 10; ! 3592: ul |= ir; ! 3593: if(ul != 14){ ! 3594: lrc = 393; ! 3595: if(prlc) printf(f,lrc); ! 3596: } ! 3597: ul = 12; lr = 10; ! 3598: ul |= lr; ! 3599: if(ul != 14){ ! 3600: lrc = 394; ! 3601: if(prlc) printf(f,lrc); ! 3602: } ! 3603: ul = 12; ur = 10; ! 3604: ul |= ur; ! 3605: if(ul != 14){ ! 3606: lrc = 395; ! 3607: if(prlc) printf(f,lrc); ! 3608: } ! 3609: if(lrc != 0) { ! 3610: rc = 1; ! 3611: if(pd0->flgd != 0) printf(s714er,1); ! 3612: } ! 3613: return rc; ! 3614: } ! 3615: s715(pd0) /* 7.15 Comma operator */ ! 3616: struct defs *pd0; ! 3617: { ! 3618: static char s715er[] = "s715,er%d\n"; ! 3619: static char qs715[8] = "s715 "; ! 3620: int rc; ! 3621: char *ps, *pt; ! 3622: int a, t, c, i; ! 3623: a = c = 0; ! 3624: ps = qs715; ! 3625: pt = pd0->rfs; ! 3626: rc = 0; ! 3627: while (*pt++ = *ps++); ! 3628: ! 3629: /* A pair of expressions separated by a comma is ! 3630: evaluated left to right and the value of the left ! 3631: expression is discarded. ! 3632: */ ! 3633: i = 1; ! 3634: if( i++,i++,i++,i++,++i != 6 ){ ! 3635: if(pd0->flgd != 0) printf(s715er,1); ! 3636: rc = rc+1; ! 3637: } ! 3638: ! 3639: /* In contexts where the comma is given a special mean- ! 3640: ing, for example in a list of actual arguments to ! 3641: functions (sic) and lists of initializers, the comma ! 3642: operator as described in this section can only appear ! 3643: in parentheses; for example ! 3644: ! 3645: f( a, (t=3, t+2), c) ! 3646: ! 3647: has three arguments, the second of which has the ! 3648: value 5. ! 3649: */ ! 3650: ! 3651: if(s715f(a, (t=3, t+2), c) != 5){ ! 3652: if(pd0->flgd != 0) printf(s715er,2); ! 3653: rc = rc+2; ! 3654: } ! 3655: return rc; ! 3656: } ! 3657: s715f(x,y,z) ! 3658: int x, y, z; ! 3659: { ! 3660: return y; ! 3661: } ! 3662: s72(pd0) /* 7.2 Unary operators */ ! 3663: struct defs *pd0; ! 3664: { ! 3665: static char s72er[] = "s72,er%d\n"; ! 3666: static char qs72[8] = "s72 "; ! 3667: int rc; ! 3668: char *ps, *pt; ! 3669: int k, j, i, lrc; ! 3670: char c; ! 3671: short s; ! 3672: long l; ! 3673: unsigned u; ! 3674: double d; ! 3675: float f; ! 3676: ps = qs72; ! 3677: pt = pd0->rfs; ! 3678: rc = 0; ! 3679: while (*pt++ = *ps++); ! 3680: ! 3681: /* The *, denoting indirection, and the &, denoting a ! 3682: pointer, are duals of each other, and ought to behave as ! 3683: such... */ ! 3684: ! 3685: k = 2; ! 3686: if(*&*&k != 2){ ! 3687: rc = rc+1; ! 3688: printf(s72er,1); ! 3689: } ! 3690: ! 3691: /* The unary minus has the conventional meaning. */ ! 3692: ! 3693: if(k+(-k) != 0){ ! 3694: rc = rc+2; ! 3695: printf(s72er,2); ! 3696: } ! 3697: ! 3698: /* The negation operator (!) has been thoroughly checked out, ! 3699: perhaps more thoroughly than any of the others. The ~ oper- ! 3700: ator gets us a ones complement. */ ! 3701: ! 3702: k = 0; ! 3703: for(j=0;j<pd0->ibits;j++) k = (k<<1)|1; ! 3704: if(~k != 0){ ! 3705: rc = rc+4; ! 3706: printf(s72er,4); ! 3707: } ! 3708: ! 3709: /* Now we look at the ++ and -- operators, which can be ! 3710: used in either prefix or suffix form. With side ! 3711: effects they're loaded. */ ! 3712: ! 3713: k = 5; ! 3714: ! 3715: if( ++k != 6 || --k != 5 ! 3716: || k++ != 5 || k-- != 6 ! 3717: || k != 5 ){ ! 3718: rc = rc+8; ! 3719: printf(s72er,8); ! 3720: } ! 3721: ! 3722: /* An expression preceded by the parenthesised name of a ! 3723: data type causes conversion of the value of the expression ! 3724: to the named type. This construction is called a cast. ! 3725: Here, we check to see that all of the possible casts and ! 3726: their simple combinations are accepted by the compiler, ! 3727: and that they all produce a correct result for this sample ! 3728: of size one. */ ! 3729: ! 3730: c = 26; l = 26; d = 26.; ! 3731: s = 26; u = 26; ! 3732: i = 26; f = 26.; ! 3733: ! 3734: lrc = 0; ! 3735: ! 3736: if( (char)s != 26 || (char)i != 26 ! 3737: || (char)l != 26 || (char)u != 26 ! 3738: || (char)f != 26 || (char)d != 26 ) lrc = lrc+1; ! 3739: ! 3740: if( (short)c != 26 || (short)i != 26 ! 3741: || (short)l != 26 || (short)u != 26 ! 3742: || (short)f != 26 || (short)d != 26) lrc = lrc+2; ! 3743: ! 3744: if( (int)c != 26 || (int)s != 26 ! 3745: || (int)l != 26 || (int)u != 26 ! 3746: || (int)f != 26 || (int)d != 26 ) lrc = lrc+4; ! 3747: ! 3748: if( (long)c != 26 || (long)s != 26 ! 3749: || (long)i != 26 || (long)u != 26 ! 3750: || (long)f != 26 || (long)d != 26 ) lrc = lrc+8; ! 3751: ! 3752: if( (unsigned)c != 26 || (unsigned)s != 26 ! 3753: || (unsigned)i != 26 || (unsigned)l != 26 ! 3754: || (unsigned)f != 26 || (unsigned)d != 26 ) lrc = lrc+16; ! 3755: ! 3756: if( (float)c != 26. || (float)s != 26. ! 3757: || (float)i != 26. || (float)l != 26. ! 3758: || (float)u != 26. || (float)d != 26. ) lrc = lrc+32; ! 3759: ! 3760: if( (double)c != 26. || (double)s != 26. ! 3761: || (double)i != 26. || (double)l != 26. ! 3762: || (double)u != 26. || (double)f != 26. ) lrc = lrc+64; ! 3763: ! 3764: if(lrc != 0){ ! 3765: rc = rc+16; ! 3766: printf(s72er,16); ! 3767: } ! 3768: ! 3769: /* The sizeof operator has been tested previously. */ ! 3770: ! 3771: return rc; ! 3772: } ! 3773: s757(pd0) /* 7.5 Shift operators */ ! 3774: /* 7.6 Relational operators */ ! 3775: /* 7.7 Equality operator */ ! 3776: struct defs *pd0; ! 3777: { ! 3778: static char s757er[] = "s757,er%d\n"; ! 3779: static char qs757[8] = "s757 "; ! 3780: int rc; ! 3781: char *ps, *pt; ! 3782: int t,lrc,k,j,a,b,c,d,x[16],*p; ! 3783: unsigned rs, ls, rt, lt; ! 3784: ps = qs757; ! 3785: pt = pd0->rfs; ! 3786: rc = 0; ! 3787: while (*pt++ = *ps++); ! 3788: ! 3789: /* The shift operators << and >> group left-to-right. ! 3790: */ ! 3791: ! 3792: t = 40; ! 3793: if(t<<3<<2 != 1280 || t>>3>>2 != 1){ ! 3794: rc = rc+1; ! 3795: if(pd0->flgd != 0) printf(s757er,1); ! 3796: } ! 3797: ! 3798: /* In the following test, an n-bit unsigned consisting ! 3799: of all 1s is shifted right (resp. left) k bits, 0<=k<n. ! 3800: We expect to find k 0s followed by n-k 1s (resp. n-k 1s ! 3801: followed by k 0s). If not, we complain. ! 3802: */ ! 3803: ! 3804: lrc = 0; ! 3805: for(k=0; k<pd0->ubits; k++){ ! 3806: rs = 1; ! 3807: ls = rs<<(pd0->ubits-1); ! 3808: ! 3809: rt = 0; ! 3810: lt = ~rt>>k; ! 3811: rt = ~rt<<k; ! 3812: ! 3813: for(j=0; j<pd0->ubits;j++){ ! 3814: if((j<k) != ((rs&rt) == 0) || (j<k) != ((ls<) == 0)) lrc = 1; ! 3815: rs = rs<<1; ! 3816: ls = ls>>1; ! 3817: } ! 3818: } ! 3819: ! 3820: if(lrc != 0){ ! 3821: rc = rc+2; ! 3822: if(pd0->flgd != 0) printf(s757er,2); ! 3823: } ! 3824: ! 3825: /* The relational operators group left-to-right, but this ! 3826: fact is not very useful; a<b<c does not mean what it ! 3827: seems to... ! 3828: */ ! 3829: ! 3830: a = 3; ! 3831: b = 2; ! 3832: c = 1; ! 3833: ! 3834: if((a<b<c) != 1){ ! 3835: rc = rc+4; ! 3836: if(pd0->flgd != 0) printf(s757er,4); ! 3837: } ! 3838: ! 3839: /* In general, we take note of the fact that if we got this ! 3840: far the relational operators have to be working. We test only ! 3841: that two pointers may be compared; the result depends on ! 3842: the relative locations in the address space of the ! 3843: pointed-to objects. ! 3844: */ ! 3845: if( &x[1] == &x[0] ){ ! 3846: rc = rc+8; ! 3847: if(pd0->flgd != 0) printf(s757er,8); ! 3848: } ! 3849: ! 3850: if( &x[1] < &x[0] ) if(pd0->flgm != 0) ! 3851: printf("Increasing array elements assigned to decreasing locations\n"); ! 3852: ! 3853: /* a<b == c<d whenever a<b and c<d have the same ! 3854: truth value. */ ! 3855: ! 3856: lrc = 0; ! 3857: ! 3858: for(j=0;j<16;j++) x[j] = 1; ! 3859: x[1] = 0; ! 3860: x[4] = 0; ! 3861: x[6] = 0; ! 3862: x[7] = 0; ! 3863: x[9] = 0; ! 3864: x[13] = 0; ! 3865: ! 3866: for(a=0;a<2;a++) ! 3867: for(b=0;b<2;b++) ! 3868: for(c=0;c<2;c++) ! 3869: for(d=0;d<2;d++) ! 3870: if((a<b==c<d) != x[8*a+4*b+2*c+d] ) lrc = 1; ! 3871: ! 3872: if(lrc != 0){ ! 3873: rc = rc+16; ! 3874: if(pd0->flgd != 0) printf(s757er,16); ! 3875: } ! 3876: ! 3877: /* A pointer to which zero has been assigned will ! 3878: appear to be equal to zero. ! 3879: */ ! 3880: ! 3881: p = 0; ! 3882: ! 3883: if(p != 0){ ! 3884: rc = rc+32; ! 3885: if(pd0->flgd != 0) printf(s757er,32); ! 3886: } ! 3887: ! 3888: return rc; ! 3889: } ! 3890: s7813(pd0) /* 7.8 Bitwise AND operator ! 3891: 7.9 Bitwise OR operator ! 3892: 7.10 Bitwise exclusive OR operator ! 3893: 7.11 Logical AND operator ! 3894: 7.12 Logical OR operator ! 3895: 7.13 Conditional operator */ ! 3896: struct defs *pd0; ! 3897: { ! 3898: register int prlc, lrc; ! 3899: int i, j, r, zero, one; ! 3900: static char fl[] = "Local error %d.\n"; ! 3901: static char s7813er[] = "s7813,er%d\n"; ! 3902: static char qs7813[8] = "s7813 "; ! 3903: int rc; ! 3904: char *ps, *pt; ! 3905: ps = qs7813; ! 3906: pt = pd0->rfs; ! 3907: lrc = 0; ! 3908: rc = 0; ! 3909: prlc = pd0->flgl; ! 3910: while (*pt++ = *ps++); ! 3911: ! 3912: /* If bitwise AND, OR, and exclusive OR are to cause ! 3913: trouble, they will probably do so when they are used in ! 3914: an unusual context. The number of contexts in which ! 3915: they can be used is infinite, so to save time we select ! 3916: a finite subset: the set of all expressions of the form: ! 3917: ! 3918: item1 op item2 ! 3919: ! 3920: where item1 and item2 are chosen from the set ! 3921: {char,short,long,unsigned,int} and op is one of {&,|,^}. ! 3922: We will use 12 and 10 as values for the items, as these ! 3923: values will fit into all data types on just about any ! 3924: imaginable machine, and the results after performing the ! 3925: bitwise operations on them are distinct for each operation, ! 3926: i.e., ! 3927: ! 3928: 12 | 10 -> 1100 | 1010 -> 1110 -> 14 ! 3929: 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6 ! 3930: 12 & 10 -> 1100 & 1010 -> 1000 -> 8 ! 3931: ! 3932: There are 75 such combinations: ! 3933: */ ! 3934: ! 3935: if(((char)12 & (char)10) != 8) {lrc = 1; ! 3936: if(prlc) printf(fl,lrc);} ! 3937: if(((char)12 | (char)10) != 14) {lrc = 2; ! 3938: if(prlc) printf(fl,lrc);} ! 3939: if(((char)12 ^ (char)10) != 6) {lrc = 3; ! 3940: if(prlc) printf(fl,lrc);} ! 3941: if(((char)12 & (short)10) != 8) {lrc = 4; ! 3942: if(prlc) printf(fl,lrc);} ! 3943: if(((char)12 | (short)10) != 14) {lrc = 5; ! 3944: if(prlc) printf(fl,lrc);} ! 3945: if(((char)12 ^ (short)10) != 6) {lrc = 6; ! 3946: if(prlc) printf(fl,lrc);} ! 3947: if(((char)12 & (long)10) != 8) {lrc = 7; ! 3948: if(prlc) printf(fl,lrc);} ! 3949: if(((char)12 | (long)10) != 14) {lrc = 8; ! 3950: if(prlc) printf(fl,lrc);} ! 3951: if(((char)12 ^ (long)10) != 6) {lrc = 9; ! 3952: if(prlc) printf(fl,lrc);} ! 3953: if(((char)12 & (unsigned)10) != 8) {lrc = 10; ! 3954: if(prlc) printf(fl,lrc);} ! 3955: if(((char)12 | (unsigned)10) != 14) {lrc = 11; ! 3956: if(prlc) printf(fl,lrc);} ! 3957: if(((char)12 ^ (unsigned)10) != 6) {lrc = 12; ! 3958: if(prlc) printf(fl,lrc);} ! 3959: if(((char)12 & (int)10) != 8) {lrc = 13; ! 3960: if(prlc) printf(fl,lrc);} ! 3961: if(((char)12 | (int)10) != 14) {lrc = 14; ! 3962: if(prlc) printf(fl,lrc);} ! 3963: if(((char)12 ^ (int)10) != 6) {lrc = 15; ! 3964: if(prlc) printf(fl,lrc);} ! 3965: if(((short)12 & (char)10) != 8) {lrc = 16; ! 3966: if(prlc) printf(fl,lrc);} ! 3967: if(((short)12 | (char)10) != 14) {lrc = 17; ! 3968: if(prlc) printf(fl,lrc);} ! 3969: if(((short)12 ^ (char)10) != 6) {lrc = 18; ! 3970: if(prlc) printf(fl,lrc);} ! 3971: if(((short)12 & (short)10) != 8) {lrc = 16; ! 3972: if(prlc) printf(fl,lrc);} ! 3973: if(((short)12 | (short)10) != 14) {lrc = 20; ! 3974: if(prlc) printf(fl,lrc);} ! 3975: if(((short)12 ^ (short)10) != 6) {lrc = 21; ! 3976: if(prlc) printf(fl,lrc);} ! 3977: if(((short)12 & (long)10) != 8) {lrc = 22; ! 3978: if(prlc) printf(fl,lrc);} ! 3979: if(((short)12 | (long)10) != 14) {lrc = 23; ! 3980: if(prlc) printf(fl,lrc);} ! 3981: if(((short)12 ^ (long)10) != 6) {lrc = 24; ! 3982: if(prlc) printf(fl,lrc);} ! 3983: if(((short)12 & (unsigned)10) != 8) {lrc = 25; ! 3984: if(prlc) printf(fl,lrc);} ! 3985: if(((short)12 | (unsigned)10) != 14) {lrc = 26; ! 3986: if(prlc) printf(fl,lrc);} ! 3987: if(((short)12 ^ (unsigned)10) != 6) {lrc = 27; ! 3988: if(prlc) printf(fl,lrc);} ! 3989: if(((short)12 & (int)10) != 8) {lrc = 28; ! 3990: if(prlc) printf(fl,lrc);} ! 3991: if(((short)12 | (int)10) != 14) {lrc = 26; ! 3992: if(prlc) printf(fl,lrc);} ! 3993: if(((short)12 ^ (int)10) != 6) {lrc = 30; ! 3994: if(prlc) printf(fl,lrc);} ! 3995: if(((long)12 & (char)10) != 8) {lrc = 31; ! 3996: if(prlc) printf(fl,lrc);} ! 3997: if(((long)12 | (char)10) != 14) {lrc = 32; ! 3998: if(prlc) printf(fl,lrc);} ! 3999: if(((long)12 ^ (char)10) != 6) {lrc = 33; ! 4000: if(prlc) printf(fl,lrc);} ! 4001: if(((long)12 & (short)10) != 8) {lrc = 34; ! 4002: if(prlc) printf(fl,lrc);} ! 4003: if(((long)12 | (short)10) != 14) {lrc = 35; ! 4004: if(prlc) printf(fl,lrc);} ! 4005: if(((long)12 ^ (short)10) != 6) {lrc = 36; ! 4006: if(prlc) printf(fl,lrc);} ! 4007: if(((long)12 & (long)10) != 8) {lrc = 37; ! 4008: if(prlc) printf(fl,lrc);} ! 4009: if(((long)12 | (long)10) != 14) {lrc = 38; ! 4010: if(prlc) printf(fl,lrc);} ! 4011: if(((long)12 ^ (long)10) != 6) {lrc = 39; ! 4012: if(prlc) printf(fl,lrc);} ! 4013: if(((long)12 & (unsigned)10) != 8) {lrc = 40; ! 4014: if(prlc) printf(fl,lrc);} ! 4015: if(((long)12 | (unsigned)10) != 14) {lrc = 41; ! 4016: if(prlc) printf(fl,lrc);} ! 4017: if(((long)12 ^ (unsigned)10) != 6) {lrc = 42; ! 4018: if(prlc) printf(fl,lrc);} ! 4019: if(((long)12 & (int)10) != 8) {lrc = 43; ! 4020: if(prlc) printf(fl,lrc);} ! 4021: if(((long)12 | (int)10) != 14) {lrc = 44; ! 4022: if(prlc) printf(fl,lrc);} ! 4023: if(((long)12 ^ (int)10) != 6) {lrc = 45; ! 4024: if(prlc) printf(fl,lrc);} ! 4025: if(((unsigned)12 & (char)10) != 8) {lrc = 46; ! 4026: if(prlc) printf(fl,lrc);} ! 4027: if(((unsigned)12 | (char)10) != 14) {lrc = 47; ! 4028: if(prlc) printf(fl,lrc);} ! 4029: if(((unsigned)12 ^ (char)10) != 6) {lrc = 48; ! 4030: if(prlc) printf(fl,lrc);} ! 4031: if(((unsigned)12 & (short)10) != 8) {lrc = 49; ! 4032: if(prlc) printf(fl,lrc);} ! 4033: if(((unsigned)12 | (short)10) != 14) {lrc = 50; ! 4034: if(prlc) printf(fl,lrc);} ! 4035: if(((unsigned)12 ^ (short)10) != 6) {lrc = 51; ! 4036: if(prlc) printf(fl,lrc);} ! 4037: if(((unsigned)12 & (long)10) != 8) {lrc = 52; ! 4038: if(prlc) printf(fl,lrc);} ! 4039: if(((unsigned)12 | (long)10) != 14) {lrc = 53; ! 4040: if(prlc) printf(fl,lrc);} ! 4041: if(((unsigned)12 ^ (long)10) != 6) {lrc = 54; ! 4042: if(prlc) printf(fl,lrc);} ! 4043: if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55; ! 4044: if(prlc) printf(fl,lrc);} ! 4045: if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56; ! 4046: if(prlc) printf(fl,lrc);} ! 4047: if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57; ! 4048: if(prlc) printf(fl,lrc);} ! 4049: if(((unsigned)12 & (int)10) != 8) {lrc = 58; ! 4050: if(prlc) printf(fl,lrc);} ! 4051: if(((unsigned)12 | (int)10) != 14) {lrc = 56; ! 4052: if(prlc) printf(fl,lrc);} ! 4053: if(((unsigned)12 ^ (int)10) != 6) {lrc = 60; ! 4054: if(prlc) printf(fl,lrc);} ! 4055: if(((int)12 & (char)10) != 8) {lrc = 61; ! 4056: if(prlc) printf(fl,lrc);} ! 4057: if(((int)12 | (char)10) != 14) {lrc = 62; ! 4058: if(prlc) printf(fl,lrc);} ! 4059: if(((int)12 ^ (char)10) != 6) {lrc = 63; ! 4060: if(prlc) printf(fl,lrc);} ! 4061: if(((int)12 & (short)10) != 8) {lrc = 64; ! 4062: if(prlc) printf(fl,lrc);} ! 4063: if(((int)12 | (short)10) != 14) {lrc = 65; ! 4064: if(prlc) printf(fl,lrc);} ! 4065: if(((int)12 ^ (short)10) != 6) {lrc = 66; ! 4066: if(prlc) printf(fl,lrc);} ! 4067: if(((int)12 & (long)10) != 8) {lrc = 67; ! 4068: if(prlc) printf(fl,lrc);} ! 4069: if(((int)12 | (long)10) != 14) {lrc = 68; ! 4070: if(prlc) printf(fl,lrc);} ! 4071: if(((int)12 ^ (long)10) != 6) {lrc = 69; ! 4072: if(prlc) printf(fl,lrc);} ! 4073: if(((int)12 & (unsigned)10) != 8) {lrc = 70; ! 4074: if(prlc) printf(fl,lrc);} ! 4075: if(((int)12 | (unsigned)10) != 14) {lrc = 71; ! 4076: if(prlc) printf(fl,lrc);} ! 4077: if(((int)12 ^ (unsigned)10) != 6) {lrc = 72; ! 4078: if(prlc) printf(fl,lrc);} ! 4079: if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);} ! 4080: if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);} ! 4081: if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);} ! 4082: ! 4083: if(lrc != 0){ ! 4084: if(pd0->flgd != 0) printf(s7813er,1); ! 4085: rc = rc+1; ! 4086: } ! 4087: ! 4088: /* The && operator groups left to right. It returns 1 ! 4089: if both of the operands are nonzero; 0 otherwise. ! 4090: It guarantees left to right evaluation; moreover, the ! 4091: second operand is not evaluated if the value of the ! 4092: first operand is 0. ! 4093: */ ! 4094: ! 4095: lrc = 0; ! 4096: i = j = 0; ! 4097: ! 4098: r = i++ && j++; ! 4099: if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} ! 4100: if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} ! 4101: if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} ! 4102: r = i && j++; ! 4103: if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} ! 4104: if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} ! 4105: if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);} ! 4106: r = i-- && j; ! 4107: if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} ! 4108: if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} ! 4109: if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} ! 4110: r = i && j--; ! 4111: if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} ! 4112: if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);} ! 4113: if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);} ! 4114: ! 4115: if(lrc!=0){ ! 4116: if(pd0->flgd != 0) printf(s7813er,2); ! 4117: rc = rc+2; ! 4118: } ! 4119: ! 4120: /* The || operator groups left to right. It returns 1 ! 4121: if either of its operands is nonzero; 0 otherwise. It ! 4122: guarantees left to right evaluation; moreover, the second ! 4123: operand is not evaluated if the value of the first ! 4124: operand is nonzero. ! 4125: */ ! 4126: ! 4127: lrc = 0; ! 4128: i = j = 0; ! 4129: r = i++ || j; ! 4130: if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} ! 4131: if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} ! 4132: if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} ! 4133: r = j++ || i; ! 4134: if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} ! 4135: if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} ! 4136: if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);} ! 4137: r = i-- || j--; ! 4138: if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} ! 4139: if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} ! 4140: if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} ! 4141: r = i || j--; ! 4142: if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} ! 4143: if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);} ! 4144: if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);} ! 4145: ! 4146: if(lrc!=0){ ! 4147: if(pd0->flgd != 0) printf(s7813er,4); ! 4148: rc = rc+4; ! 4149: } ! 4150: ! 4151: /* Conditional expressions group right to left. */ ! 4152: ! 4153: i = j = 0; ! 4154: zero = 0; ! 4155: one = 1; ! 4156: r = one?zero:one?i++:j++; ! 4157: if(r!=0 || i!=0 || j!=0){ ! 4158: if(pd0->flgd != 0) printf(s7813er,8); ! 4159: rc = rc+8; ! 4160: } ! 4161: ! 4162: /* The first expression is evaluated and if it is non- ! 4163: zero, the result is the value of the second expression; ! 4164: otherwise, that of the third expression. ! 4165: */ ! 4166: ! 4167: if((one?zero:1) != 0 || (zero?1:zero) != 0){ ! 4168: if(pd0->flgd != 0) printf(s7813er,16); ! 4169: rc = rc+16; ! 4170: } ! 4171: return rc; ! 4172: } ! 4173: s81(pd0) /* 8.1 Storage Class Specifiers */ ! 4174: struct defs *pd0; ! 4175: { ! 4176: static char s81er[] = "s81,er%d\n"; ! 4177: static char qs81[8] = "s81 "; ! 4178: char *ps, *pt; ! 4179: int k, rc, j, crc, prc, irc; ! 4180: register char rchar; ! 4181: char nrchar; ! 4182: register int *rptr; ! 4183: int *nrptr; ! 4184: register int rint; ! 4185: int nrint; ! 4186: static char badtest[] = "Register count for %s is unreliable.\n"; ! 4187: static char goodtest[] = "%d registers assigned to %s variables.\n"; ! 4188: ! 4189: rc = 0; ! 4190: crc = 0; ! 4191: prc = 0; ! 4192: irc = 0; ! 4193: ps = qs81; ! 4194: pt = pd0->rfs; ! 4195: ! 4196: while(*pt++ = *ps++); ! 4197: ! 4198: /* The storage class specifiers are: ! 4199: ! 4200: auto ! 4201: static ! 4202: extern ! 4203: register ! 4204: typedef ! 4205: ! 4206: The first three of these were treated earlier, in s4. The last ! 4207: will be checked in s88. "Register" remains. ! 4208: ! 4209: There are three flavors of register, viz., char, int and pointer. ! 4210: We wish first to ascertain that the representations as register ! 4211: are consistent with the corresponding nonregister representations. ! 4212: */ ! 4213: ! 4214: k = 1; ! 4215: for (j=0; j<50; j++){ ! 4216: rchar = k; ! 4217: nrchar = k; ! 4218: rptr = &k; ! 4219: nrptr = &k; ! 4220: rint = k; ! 4221: nrint = k; ! 4222: ! 4223: if ( rchar != nrchar ) crc = 1; ! 4224: if ( rptr != nrptr ) prc = 1; ! 4225: if ( rint != nrint ) irc = 1; ! 4226: k = k<<1; ! 4227: } ! 4228: ! 4229: if ( crc != 0 ) { ! 4230: rc = rc+1; ! 4231: if( pd0 -> flgd != 0 ) printf(s81er,1); ! 4232: } ! 4233: ! 4234: if ( prc != 0 ) { ! 4235: rc = rc+2; ! 4236: if( pd0 -> flgd != 0 ) printf(s81er,2); ! 4237: } ! 4238: ! 4239: if ( irc != 0 ) { ! 4240: rc = rc+4; ! 4241: if( pd0 -> flgd != 0 ) printf(s81er,4); ! 4242: } ! 4243: ! 4244: /* Now we check to see if variables are actually being assigned ! 4245: to registers. */ ! 4246: ! 4247: k = regc(); ! 4248: if ( pd0->flgm != 0 ) { ! 4249: if ( k < 0 ) printf(badtest,"char"); ! 4250: else printf(goodtest,k,"char"); ! 4251: } ! 4252: ! 4253: k = regp(); ! 4254: if ( pd0->flgm != 0 ) { ! 4255: if ( k<0 ) printf(badtest,"pointer"); ! 4256: else printf(goodtest,k,"pointer"); ! 4257: } ! 4258: ! 4259: k = regi(); ! 4260: if ( pd0->flgm != 0 ) { ! 4261: if ( k<0 ) printf(badtest,"int"); ! 4262: else printf(goodtest,k,"int"); ! 4263: } ! 4264: ! 4265: return rc; ! 4266: } ! 4267: regc() { /* char to register assignment */ ! 4268: /* Testing a variable whose storage class has been spec- ! 4269: ified as "register" is somewhat tricky, but it can be done in a ! 4270: fairly reliable fashion by taking advantage of our knowledge of the ! 4271: ways in which compilers operate. If we declare a collection of vari- ! 4272: ables of the same storage class, we would expect that, when storage ! 4273: for these variables is actually allocated, the variables will be ! 4274: bunched together and ordered according to one of the following ! 4275: criteria: ! 4276: ! 4277: (a) the order in which they were defined. ! 4278: (b) the order in which they are used. ! 4279: (c) alphabetically. ! 4280: (d) the order in which they appear in the compiler's ! 4281: symbol table. ! 4282: (e) some other way. ! 4283: ! 4284: Hence, if we define a sequence of variables in close alpha- ! 4285: betical order, and use them in the same order in which we define ! 4286: them, we would expect the differences between the addresses of ! 4287: successive variables to be constant, except in case (d) where the ! 4288: symbol table is a hash table, or in case (e). If a subsequence in ! 4289: the middle of this sequence is selected, and for this subsequence, ! 4290: every other variable is specified to be "register", and address ! 4291: differences are taken between adjacent nonregister variables, we would ! 4292: still expect to find constant differences if the "register" vari- ! 4293: ables were actually assigned to registers, and some other diff- ! 4294: erences if they were not. Specifically, if we had N variables ! 4295: specified as "register" of which the first n were actually ass- ! 4296: igned to registers, we would expect the sequence of differences ! 4297: to consist of a number of occurrences of some number, followed by ! 4298: N-n occurrences of some other number, followed by several occurr- ! 4299: ences of the first number. If we get a sequence like this, we can ! 4300: determine, by simple subtraction, how many (if any) variables are ! 4301: being assigned to registers. If we get some other sequence, we know ! 4302: that the test is invalid. */ ! 4303: ! 4304: char r00; ! 4305: char r01; ! 4306: char r02; ! 4307: char r03; ! 4308: register char r04; ! 4309: char r05; ! 4310: register char r06; ! 4311: char r07; ! 4312: register char r08; ! 4313: char r09; ! 4314: register char r10; ! 4315: char r11; ! 4316: register char r12; ! 4317: char r13; ! 4318: register char r14; ! 4319: char r15; ! 4320: register char r16; ! 4321: char r17; ! 4322: register char r18; ! 4323: char r19; ! 4324: register char r20; ! 4325: char r21; ! 4326: register char r22; ! 4327: char r23; ! 4328: register char r24; ! 4329: char r25; ! 4330: register char r26; ! 4331: char r27; ! 4332: register char r28; ! 4333: char r29; ! 4334: register char r30; ! 4335: char r31; ! 4336: register char r32; ! 4337: char r33; ! 4338: register char r34; ! 4339: char r35; ! 4340: char r36; ! 4341: char r37; ! 4342: char r38; ! 4343: ! 4344: int s, n1, n2, nr, j, d[22]; ! 4345: r00 = 0; ! 4346: r01 = 1; ! 4347: r02 = 2; ! 4348: r03 = 3; ! 4349: r04 = 4; ! 4350: r05 = 5; ! 4351: r06 = 6; ! 4352: r07 = 7; ! 4353: r08 = 8; ! 4354: r09 = 9; ! 4355: r10 = 10; ! 4356: r11 = 11; ! 4357: r12 = 12; ! 4358: r13 = 13; ! 4359: r14 = 14; ! 4360: r15 = 15; ! 4361: r16 = 16; ! 4362: r17 = 17; ! 4363: r18 = 18; ! 4364: r19 = 19; ! 4365: r20 = 20; ! 4366: r21 = 21; ! 4367: r22 = 22; ! 4368: r23 = 23; ! 4369: r24 = 24; ! 4370: r25 = 25; ! 4371: r26 = 26; ! 4372: r27 = 27; ! 4373: r28 = 28; ! 4374: r29 = 29; ! 4375: r30 = 30; ! 4376: r31 = 31; ! 4377: r32 = 32; ! 4378: r33 = 33; ! 4379: r34 = 34; ! 4380: r35 = 35; ! 4381: r36 = 36; ! 4382: r37 = 37; ! 4383: r38 = 38; ! 4384: ! 4385: d[0] = &r01 - &r00; ! 4386: d[1] = &r02 - &r01; ! 4387: d[2] = &r03 - &r02; ! 4388: d[3] = &r05 - &r03; ! 4389: d[4] = &r07 - &r05; ! 4390: d[5] = &r09 - &r07; ! 4391: d[6] = &r11 - &r09; ! 4392: d[7] = &r13 - &r11; ! 4393: d[8] = &r15 - &r13; ! 4394: d[9] = &r17 - &r15; ! 4395: d[10] = &r19 - &r17; ! 4396: d[11] = &r21 - &r19; ! 4397: d[12] = &r23 - &r21; ! 4398: d[13] = &r25 - &r23; ! 4399: d[14] = &r27 - &r25; ! 4400: d[15] = &r29 - &r27; ! 4401: d[16] = &r31 - &r29; ! 4402: d[17] = &r33 - &r31; ! 4403: d[18] = &r35 - &r33; ! 4404: d[19] = &r36 - &r35; ! 4405: d[20] = &r37 - &r36; ! 4406: d[21] = &r38 - &r37; ! 4407: ! 4408: ! 4409: /* The following FSM analyzes the string of differences. It accepts ! 4410: strings of the form a+b+a+ and returns 16 minus the number of bs, ! 4411: which is the number of variables that actually got into registers. ! 4412: Otherwise it signals rejection by returning -1., indicating that the ! 4413: test is unreliable. */ ! 4414: ! 4415: n1 = d[0]; ! 4416: s = 1; ! 4417: ! 4418: for (j=0; j<22; j++) ! 4419: switch (s) { ! 4420: case 1: if (d[j] != n1) { ! 4421: n2 = d[j]; ! 4422: s = 2; ! 4423: nr = 1; ! 4424: } ! 4425: break; ! 4426: case 2: if (d[j] == n1) { ! 4427: s = 3; ! 4428: break; ! 4429: } ! 4430: if (d[j] == n2) { ! 4431: nr = nr+1; ! 4432: break; ! 4433: } ! 4434: s = 4; ! 4435: break; ! 4436: case 3: if (d[j] != n1) s = 4; ! 4437: break; ! 4438: } ! 4439: ; ! 4440: ! 4441: if (s == 3) return 16-nr; ! 4442: else return -1; ! 4443: } ! 4444: regi() { /* int to register assignment */ ! 4445: /* Testing a variable whose storage class has been spec- ! 4446: ified as "register" is somewhat tricky, but it can be done in a ! 4447: fairly reliable fashion by taking advantage of our knowledge of the ! 4448: ways in which compilers operate. If we declare a collection of vari- ! 4449: ables of the same storage class, we would expect that, when storage ! 4450: for these variables is actually allocated, the variables will be ! 4451: bunched together and ordered according to one of the following ! 4452: criteria: ! 4453: ! 4454: (a) the order in which they were defined. ! 4455: (b) the order in which they are used. ! 4456: (c) alphabetically. ! 4457: (d) the order in which they appear in the compiler's ! 4458: symbol table. ! 4459: (e) some other way. ! 4460: ! 4461: Hence, if we define a sequence of variables in close alpha- ! 4462: betical order, and use them in the same order in which we define ! 4463: them, we would expect the differences between the addresses of ! 4464: successive variables to be constant, except in case (d) where the ! 4465: symbol table is a hash table, or in case (e). If a subsequence in ! 4466: the middle of this sequence is selected, and for this subsequence, ! 4467: every other variable is specified to be "register", and address ! 4468: differences are taken between adjacent nonregister variables, we would ! 4469: still expect to find constant differences if the "register" vari- ! 4470: ables were actually assigned to registers, and some other diff- ! 4471: erences if they were not. Specifically, if we had N variables ! 4472: specified as "register" of which the first n were actually ass- ! 4473: igned to registers, we would expect the sequence of differences ! 4474: to consist of a number of occurrences of some number, followed by ! 4475: N-n occurrences of some other number, followed by several occurr- ! 4476: ences of the first number. If we get a sequence like this, we can ! 4477: determine, by simple subtraction, how many (if any) variables are ! 4478: being assigned to registers. If we get some other sequence, we know ! 4479: that the test is invalid. */ ! 4480: ! 4481: ! 4482: int r00; ! 4483: int r01; ! 4484: int r02; ! 4485: int r03; ! 4486: register int r04; ! 4487: int r05; ! 4488: register int r06; ! 4489: int r07; ! 4490: register int r08; ! 4491: int r09; ! 4492: register int r10; ! 4493: int r11; ! 4494: register int r12; ! 4495: int r13; ! 4496: register int r14; ! 4497: int r15; ! 4498: register int r16; ! 4499: int r17; ! 4500: register int r18; ! 4501: int r19; ! 4502: register int r20; ! 4503: int r21; ! 4504: register int r22; ! 4505: int r23; ! 4506: register int r24; ! 4507: int r25; ! 4508: register int r26; ! 4509: int r27; ! 4510: register int r28; ! 4511: int r29; ! 4512: register int r30; ! 4513: int r31; ! 4514: register int r32; ! 4515: int r33; ! 4516: register int r34; ! 4517: int r35; ! 4518: int r36; ! 4519: int r37; ! 4520: int r38; ! 4521: ! 4522: int s, n1, n2, nr, j, d[22]; ! 4523: ! 4524: r00 = 0; ! 4525: r01 = 1; ! 4526: r02 = 2; ! 4527: r03 = 3; ! 4528: r04 = 4; ! 4529: r05 = 5; ! 4530: r06 = 6; ! 4531: r07 = 7; ! 4532: r08 = 8; ! 4533: r09 = 9; ! 4534: r10 = 10; ! 4535: r11 = 11; ! 4536: r12 = 12; ! 4537: r13 = 13; ! 4538: r14 = 14; ! 4539: r15 = 15; ! 4540: r16 = 16; ! 4541: r17 = 17; ! 4542: r18 = 18; ! 4543: r19 = 19; ! 4544: r20 = 20; ! 4545: r21 = 21; ! 4546: r22 = 22; ! 4547: r23 = 23; ! 4548: r24 = 24; ! 4549: r25 = 25; ! 4550: r26 = 26; ! 4551: r27 = 27; ! 4552: r28 = 28; ! 4553: r29 = 29; ! 4554: r30 = 30; ! 4555: r31 = 31; ! 4556: r32 = 32; ! 4557: r33 = 33; ! 4558: r34 = 34; ! 4559: r35 = 35; ! 4560: r36 = 36; ! 4561: r37 = 37; ! 4562: r38 = 38; ! 4563: ! 4564: d[0] = &r01 - &r00; ! 4565: d[1] = &r02 - &r01; ! 4566: d[2] = &r03 - &r02; ! 4567: d[3] = &r05 - &r03; ! 4568: d[4] = &r07 - &r05; ! 4569: d[5] = &r09 - &r07; ! 4570: d[6] = &r11 - &r09; ! 4571: d[7] = &r13 - &r11; ! 4572: d[8] = &r15 - &r13; ! 4573: d[9] = &r17 - &r15; ! 4574: d[10] = &r19 - &r17; ! 4575: d[11] = &r21 - &r19; ! 4576: d[12] = &r23 - &r21; ! 4577: d[13] = &r25 - &r23; ! 4578: d[14] = &r27 - &r25; ! 4579: d[15] = &r29 - &r27; ! 4580: d[16] = &r31 - &r29; ! 4581: d[17] = &r33 - &r31; ! 4582: d[18] = &r35 - &r33; ! 4583: d[19] = &r36 - &r35; ! 4584: d[20] = &r37 - &r36; ! 4585: d[21] = &r38 - &r37; ! 4586: ! 4587: ! 4588: /* The following FSM analyzes the string of differences. It accepts ! 4589: strings of the form a+b+a+ and returns 16 minus the number of bs, ! 4590: which is the number of variables that actually got into registers. ! 4591: Otherwise it signals rejection by returning -1., indicating that the ! 4592: test is unreliable. */ ! 4593: ! 4594: n1 = d[0]; ! 4595: s = 1; ! 4596: ! 4597: for (j=0; j<22; j++) ! 4598: switch (s) { ! 4599: case 1: if (d[j] != n1) { ! 4600: n2 = d[j]; ! 4601: s = 2; ! 4602: nr = 1; ! 4603: } ! 4604: break; ! 4605: case 2: if (d[j] == n1) { ! 4606: s = 3; ! 4607: break; ! 4608: } ! 4609: if (d[j] == n2) { ! 4610: nr = nr+1; ! 4611: break; ! 4612: } ! 4613: s = 4; ! 4614: break; ! 4615: case 3: if (d[j] != n1) s = 4; ! 4616: break; ! 4617: } ! 4618: ; ! 4619: ! 4620: if (s == 3) return 16-nr; ! 4621: else return -1; ! 4622: } ! 4623: regp() { /* pointer to register assignment */ ! 4624: /* Testing a variable whose storage class has been spec- ! 4625: ified as "register" is somewhat tricky, but it can be done in a ! 4626: fairly reliable fashion by taking advantage of our knowledge of the ! 4627: ways in which compilers operate. If we declare a collection of vari- ! 4628: ables of the same storage class, we would expect that, when storage ! 4629: for these variables is actually allocated, the variables will be ! 4630: bunched together and ordered according to one of the following ! 4631: criteria: ! 4632: ! 4633: (a) the order in which they were defined. ! 4634: (b) the order in which they are used. ! 4635: (c) alphabetically. ! 4636: (d) the order in which they appear in the compiler's ! 4637: symbol table. ! 4638: (e) some other way. ! 4639: ! 4640: Hence, if we define a sequence of variables in close alpha- ! 4641: betical order, and use them in the same order in which we define ! 4642: them, we would expect the differences between the addresses of ! 4643: successive variables to be constant, except in case (d) where the ! 4644: symbol table is a hash table, or in case (e). If a subsequence in ! 4645: the middle of this sequence is selected, and for this subsequence, ! 4646: every other variable is specified to be "register", and address ! 4647: differences are taken between adjacent nonregister variables, we would ! 4648: still expect to find constant differences if the "register" vari- ! 4649: ables were actually assigned to registers, and some other diff- ! 4650: erences if they were not. Specifically, if we had N variables ! 4651: specified as "register" of which the first n were actually ass- ! 4652: igned to registers, we would expect the sequence of differences ! 4653: to consist of a number of occurrences of some number, followed by ! 4654: N-n occurrences of some other number, followed by several occurr- ! 4655: ences of the first number. If we get a sequence like this, we can ! 4656: determine, by simple subtraction, how many (if any) variables are ! 4657: being assigned to registers. If we get some other sequence, we know ! 4658: that the test is invalid. */ ! 4659: ! 4660: ! 4661: int *r00; ! 4662: int *r01; ! 4663: int *r02; ! 4664: int *r03; ! 4665: register int *r04; ! 4666: int *r05; ! 4667: register int *r06; ! 4668: int *r07; ! 4669: register int *r08; ! 4670: int *r09; ! 4671: register int *r10; ! 4672: int *r11; ! 4673: register int *r12; ! 4674: int *r13; ! 4675: register int *r14; ! 4676: int *r15; ! 4677: register int *r16; ! 4678: int *r17; ! 4679: register int *r18; ! 4680: int *r19; ! 4681: register int *r20; ! 4682: int *r21; ! 4683: register int *r22; ! 4684: int *r23; ! 4685: register int *r24; ! 4686: int *r25; ! 4687: register int *r26; ! 4688: int *r27; ! 4689: register int *r28; ! 4690: int *r29; ! 4691: register int *r30; ! 4692: int *r31; ! 4693: register int *r32; ! 4694: int *r33; ! 4695: register int *r34; ! 4696: int *r35; ! 4697: int *r36; ! 4698: int *r37; ! 4699: int *r38; ! 4700: ! 4701: int s, n1, n2, nr, j, d[22]; ! 4702: ! 4703: r00 = (int *)&r00; ! 4704: r01 = (int *)&r01; ! 4705: r02 = (int *)&r02; ! 4706: r03 = (int *)&r03; ! 4707: r04 = (int *)&r05; ! 4708: r05 = (int *)&r05; ! 4709: r06 = (int *)&r07; ! 4710: r07 = (int *)&r07; ! 4711: r08 = (int *)&r09; ! 4712: r09 = (int *)&r09; ! 4713: r10 = (int *)&r11; ! 4714: r11 = (int *)&r11; ! 4715: r12 = (int *)&r13; ! 4716: r13 = (int *)&r13; ! 4717: r14 = (int *)&r15; ! 4718: r15 = (int *)&r15; ! 4719: r16 = (int *)&r17; ! 4720: r17 = (int *)&r17; ! 4721: r18 = (int *)&r19; ! 4722: r19 = (int *)&r19; ! 4723: r20 = (int *)&r21; ! 4724: r21 = (int *)&r21; ! 4725: r22 = (int *)&r23; ! 4726: r23 = (int *)&r23; ! 4727: r24 = (int *)&r25; ! 4728: r25 = (int *)&r25; ! 4729: r26 = (int *)&r27; ! 4730: r27 = (int *)&r27; ! 4731: r28 = (int *)&r29; ! 4732: r29 = (int *)&r29; ! 4733: r30 = (int *)&r31; ! 4734: r31 = (int *)&r31; ! 4735: r32 = (int *)&r33; ! 4736: r33 = (int *)&r33; ! 4737: r34 = (int *)&r35; ! 4738: r35 = (int *)&r35; ! 4739: r36 = (int *)&r36; ! 4740: r37 = (int *)&r37; ! 4741: r38 = (int *)&r38; ! 4742: ! 4743: d[0] = &r01 - &r00; ! 4744: d[1] = &r02 - &r01; ! 4745: d[2] = &r03 - &r02; ! 4746: d[3] = &r05 - &r03; ! 4747: d[4] = &r07 - &r05; ! 4748: d[5] = &r09 - &r07; ! 4749: d[6] = &r11 - &r09; ! 4750: d[7] = &r13 - &r11; ! 4751: d[8] = &r15 - &r13; ! 4752: d[9] = &r17 - &r15; ! 4753: d[10] = &r19 - &r17; ! 4754: d[11] = &r21 - &r19; ! 4755: d[12] = &r23 - &r21; ! 4756: d[13] = &r25 - &r23; ! 4757: d[14] = &r27 - &r25; ! 4758: d[15] = &r29 - &r27; ! 4759: d[16] = &r31 - &r29; ! 4760: d[17] = &r33 - &r31; ! 4761: d[18] = &r35 - &r33; ! 4762: d[19] = &r36 - &r35; ! 4763: d[20] = &r37 - &r36; ! 4764: d[21] = &r38 - &r37; ! 4765: ! 4766: ! 4767: /* The following FSM analyzes the string of differences. It accepts ! 4768: strings of the form a+b+a+ and returns 16 minus the number of bs, ! 4769: which is the number of variables that actually got into registers. ! 4770: Otherwise it signals rejection by returning -1., indicating that the ! 4771: test is unreliable. */ ! 4772: ! 4773: n1 = d[0]; ! 4774: s = 1; ! 4775: for (j=0; j<22; j++) ! 4776: switch (s) { ! 4777: case 1: if (d[j] != n1) { ! 4778: n2 = d[j]; ! 4779: s = 2; ! 4780: nr = 1; ! 4781: } ! 4782: break; ! 4783: case 2: if (d[j] == n1) { ! 4784: s = 3; ! 4785: break; ! 4786: } ! 4787: if (d[j] == n2) { ! 4788: nr = nr+1; ! 4789: break; ! 4790: } ! 4791: s = 4; ! 4792: break; ! 4793: case 3: if (d[j] != n1) s = 4; ! 4794: break; ! 4795: } ! 4796: ; ! 4797: ! 4798: if (s == 3) return 16-nr; ! 4799: else return -1; ! 4800: } ! 4801: s84(pd0) /* 8.4 Meaning of declarators */ ! 4802: struct defs *pd0; ! 4803: { ! 4804: int *ip, i, *fip(), (*pfi)(), j, k, array(), glork(); ! 4805: static int x3d[3][5][7]; ! 4806: float fa[17], *afp[17], sum; ! 4807: static char s84er[] = "s84,er%d\n"; ! 4808: static char qs84[8] = "s84 "; ! 4809: int rc; ! 4810: char *ps, *pt; ! 4811: ps = qs84; ! 4812: pt = pd0->rfs; ! 4813: rc = 0; ! 4814: while (*pt++ = *ps++); ! 4815: ! 4816: /* The more common varieties of declarators have al- ! 4817: ready been touched upon, some more than others. It ! 4818: is useful to compare *fip() and (*pfi)(). ! 4819: */ ! 4820: ! 4821: ip = fip(3); ! 4822: if(*ip != 3){ ! 4823: if(pd0->flgd != 0) printf(s84er,1); ! 4824: rc = rc+1; ! 4825: } ! 4826: ! 4827: pfi = glork; ! 4828: if((*pfi)(4) != 4){ ! 4829: if(pd0->flgd != 0) printf(s84er,2); ! 4830: rc = rc+2; ! 4831: } ! 4832: ! 4833: /* Float fa[17] declares an array of floating point ! 4834: numbers, and *afp[17] declares an array of pointers ! 4835: to floats. ! 4836: */ ! 4837: ! 4838: for(j=0; j<17; j++){ ! 4839: fa[j] = j; ! 4840: afp[j] = &fa[j]; ! 4841: } ! 4842: ! 4843: sum = 0.; ! 4844: for(j=0; j<17; j++) sum += *afp[j]; ! 4845: if(sum != 136){ ! 4846: if(pd0->flgd != 0) printf(s84er,4); ! 4847: rc = rc+4; ! 4848: } ! 4849: ! 4850: /* static int x3d[3][5][7] declares a static three ! 4851: dimensional array of integers, with rank 3x5x7. ! 4852: In complete detail, x3d is an array of three items; ! 4853: each item is an array of five arrays, and each of ! 4854: the latter arrays is an array of seven integers. ! 4855: Any of the expressions x3d, x3d[i], x3d[i][j], ! 4856: and x3d[i][j][k] may reasonably appear in an express- ! 4857: ion. The first three have type "array"; the last has ! 4858: type int. ! 4859: */ ! 4860: ! 4861: for (i=0; i<3; i++) ! 4862: for (j=0; j<5; j++) ! 4863: for (k=0; k<7; k++) ! 4864: x3d[i][j][k] = i*35+j*7+k; ! 4865: ! 4866: i = 1; j = 2; k = 3; ! 4867: ! 4868: if( array(x3d,105,0) ! 4869: +array(x3d[i],35,35) ! 4870: +array(x3d[i][j],7,49) ! 4871: + x3d[i][j][k]-52){ ! 4872: ! 4873: if(pd0->flgd != 0) printf(s84er,8); ! 4874: rc = rc+8; ! 4875: } ! 4876: ! 4877: return rc; ! 4878: } ! 4879: array(a,size,start) ! 4880: int a[], size, start; ! 4881: { ! 4882: int i; ! 4883: for(i=0; i<size; i++) ! 4884: if(a[i] != i+start) return 1; ! 4885: ! 4886: return 0; ! 4887: } ! 4888: int *fip(x) ! 4889: int x; ! 4890: { ! 4891: static int y; ! 4892: y = x; ! 4893: return &y; ! 4894: } ! 4895: glork(x) ! 4896: int x; ! 4897: {return x;} ! 4898: s85(pd0) /* 8.5 Structure and union declarations */ ! 4899: struct defs *pd0; ! 4900: { ! 4901: static char s85er[] = "s85,er%d\n"; ! 4902: static char qs85[8] = "s85 "; ! 4903: int rc; ! 4904: char *ps, *pt; ! 4905: ! 4906: struct tnode { ! 4907: char tword[20]; ! 4908: int count; ! 4909: struct tnode *left; ! 4910: struct tnode *right; ! 4911: }; ! 4912: ! 4913: struct tnode s1, s2, *sp; ! 4914: ! 4915: struct{ ! 4916: char cdummy; ! 4917: char c; ! 4918: } sc; ! 4919: ! 4920: struct{ ! 4921: char cdummy; ! 4922: short s; ! 4923: } ss; ! 4924: ! 4925: struct{ ! 4926: char cdummy; ! 4927: int i; ! 4928: } si; ! 4929: ! 4930: struct{ ! 4931: char cdummy; ! 4932: long l; ! 4933: } sl; ! 4934: ! 4935: struct{ ! 4936: char cdummy; ! 4937: unsigned u; ! 4938: } su; ! 4939: ! 4940: struct{ ! 4941: char cdummy; ! 4942: float f; ! 4943: } sf; ! 4944: ! 4945: struct{ ! 4946: char cdummy; ! 4947: double d; ! 4948: } sd; ! 4949: ! 4950: int diff[7], j; ! 4951: ! 4952: static char *type[] = { ! 4953: "char", ! 4954: "short", ! 4955: "int", ! 4956: "long", ! 4957: "unsigned", ! 4958: "float", ! 4959: "double" ! 4960: }; ! 4961: ! 4962: static char aln[] = " alignment: "; ! 4963: ! 4964: struct{ ! 4965: int twobit:2; ! 4966: int :1; ! 4967: int threebit:3; ! 4968: int onebit:1; ! 4969: } s3; ! 4970: ! 4971: union{ ! 4972: char u1[30]; ! 4973: short u2[30]; ! 4974: int u3[30]; ! 4975: long u4[30]; ! 4976: unsigned u5[30]; ! 4977: float u6[30]; ! 4978: double u7[30]; ! 4979: } u0; ! 4980: ! 4981: ps = qs85; ! 4982: pt = pd0->rfs; ! 4983: rc = 0; ! 4984: while (*pt++ = *ps++); ! 4985: ! 4986: /* Within a structure, the objects declared have ! 4987: addresses which increase as their declarations are ! 4988: read left to right. ! 4989: */ ! 4990: ! 4991: if( (char *)&s1.count - &s1.tword[0] <= 0 ! 4992: ||(char *)&s1.left - (char *)&s1.count <= 0 ! 4993: ||(char *)&s1.right - (char *)&s1.left <= 0){ ! 4994: if(pd0->flgd != 0) printf(s85er,1); ! 4995: rc = rc+1; ! 4996: } ! 4997: ! 4998: /* Each non-field member of a structure begins on an ! 4999: addressing boundary appropriate to its type. ! 5000: */ ! 5001: ! 5002: diff[0] = &sc.c - &sc.cdummy; ! 5003: diff[1] = (char *)&ss.s - &ss.cdummy; ! 5004: diff[2] = (char *)&si.i - &si.cdummy; ! 5005: diff[3] = (char *)&sl.l - &sl.cdummy; ! 5006: diff[4] = (char *)&su.u - &su.cdummy; ! 5007: diff[5] = (char *)&sf.f - &sf.cdummy; ! 5008: diff[6] = (char *)&sd.d - &sd.cdummy; ! 5009: ! 5010: if(pd0->flgm != 0) ! 5011: for(j=0; j<7; j++) ! 5012: printf("%s%s%d\n",type[j],aln,diff[j]); ! 5013: ! 5014: /* Field specifications are highly implementation de- ! 5015: pendent. About the only thing we can do here is to ! 5016: check is that the compiler accepts the field constructs, ! 5017: and that they seem to work, after a fashion, at ! 5018: run time... ! 5019: */ ! 5020: ! 5021: s3.threebit = 7; ! 5022: s3.twobit = s3.threebit; ! 5023: s3.threebit = s3.twobit; ! 5024: ! 5025: if(s3.threebit != 3){ ! 5026: if(s3.threebit == -1){ ! 5027: if(pd0->flgm != 0) printf("Sign extension in fields\n"); ! 5028: } ! 5029: else{ ! 5030: if(pd0->flgd != 0) printf(s85er,2); ! 5031: rc = rc+2; ! 5032: } ! 5033: } ! 5034: ! 5035: s3.onebit = 1; ! 5036: if(s3.onebit != 1){ ! 5037: if(pd0->flgm != 0) ! 5038: printf("Be especially careful with 1-bit fields!\n"); ! 5039: } ! 5040: ! 5041: /* A union may be thought of as a structure all of whose ! 5042: members begin at offset 0 and whose size is sufficient ! 5043: to contain any of its members. ! 5044: */ ! 5045: ! 5046: if( (char *)u0.u1 - (char *)&u0 != 0 ! 5047: ||(char *)u0.u2 - (char *)&u0 != 0 ! 5048: ||(char *)u0.u3 - (char *)&u0 != 0 ! 5049: ||(char *)u0.u4 - (char *)&u0 != 0 ! 5050: ||(char *)u0.u5 - (char *)&u0 != 0 ! 5051: ||(char *)u0.u6 - (char *)&u0 != 0 ! 5052: ||(char *)u0.u7 - (char *)&u0 != 0){ ! 5053: ! 5054: if(pd0->flgd != 0) printf(s85er,4); ! 5055: rc = rc+4; ! 5056: } ! 5057: ! 5058: if( sizeof u0 < sizeof u0.u1 ! 5059: ||sizeof u0 < sizeof u0.u2 ! 5060: ||sizeof u0 < sizeof u0.u3 ! 5061: ||sizeof u0 < sizeof u0.u4 ! 5062: ||sizeof u0 < sizeof u0.u5 ! 5063: ||sizeof u0 < sizeof u0.u6 ! 5064: ||sizeof u0 < sizeof u0.u7){ ! 5065: ! 5066: if(pd0->flgd != 0) printf(s85er,8); ! 5067: rc = rc+8; ! 5068: } ! 5069: ! 5070: /* Finally, we check that the pointers work. */ ! 5071: ! 5072: s1.right = &s2; ! 5073: s2.tword[0] = 2; ! 5074: s1.right->tword[0] += 1; ! 5075: if(s2.tword[0] != 3){ ! 5076: if(pd0->flgd != 0) printf(s85er,16); ! 5077: rc = rc+16; ! 5078: } ! 5079: return rc; ! 5080: } ! 5081: s86(pd0) /* 8.6 Initialization */ ! 5082: struct defs *pd0; ! 5083: { ! 5084: static char s86er[] = "s86,er%d\n"; ! 5085: static char qs86[8] = "s86 "; ! 5086: int lrc, rc; ! 5087: char *ps, *pt; ! 5088: int one(), i, j, k; ! 5089: static int x[] = {1,3,5}; ! 5090: static int *pint = x+2; ! 5091: static int zero[10]; ! 5092: int *apint = pint-1; ! 5093: register int *rpint = apint+one(); ! 5094: static float y0[] = {1,3,5,2,4,6,3,5,7,0,0,0}; ! 5095: static float y1[4][3] = { ! 5096: {1,3,5}, ! 5097: {2,4,6}, ! 5098: {3,5,7}, ! 5099: }; ! 5100: static float y2[4][3] = {1,3,5,2,4,6,3,5,7}; ! 5101: static float y3[4][3] = { ! 5102: {1},{2},{3},{4} ! 5103: }; ! 5104: ps = qs86; ! 5105: pt = pd0->rfs; ! 5106: rc = 0; ! 5107: while (*pt++ = *ps++); ! 5108: ! 5109: /* The expression in an initializer for a static or ! 5110: external variable must be a constant expression or ! 5111: an expression that reduces to the address of a pre- ! 5112: viously declared variable, possibly offset by a ! 5113: constant expression. ! 5114: */ ! 5115: ! 5116: if(*pint != 5){ ! 5117: if(pd0->flgd != 0) printf(s86er,1); ! 5118: rc = rc+1; ! 5119: } ! 5120: ! 5121: /* Automatic and register variables may be initialized ! 5122: by arbitrary expressions involving constants and previously ! 5123: declared variables and functions. ! 5124: */ ! 5125: ! 5126: if(*apint != 3){ ! 5127: if(pd0->flgd != 0) printf(s86er,2); ! 5128: rc = rc+2; ! 5129: } ! 5130: ! 5131: if(*rpint != 5){ ! 5132: if(pd0->flgd != 0) printf(s86er,4); ! 5133: rc = rc+4; ! 5134: } ! 5135: ! 5136: /* Static variables that are not initialized are guar- ! 5137: anteed to start off as zero. ! 5138: */ ! 5139: ! 5140: lrc = 0; ! 5141: for(j=0; j<10; j++) ! 5142: if(zero[j] != 0) lrc = 1; ! 5143: if(lrc != 0){ ! 5144: if(pd0->flgd != 0) printf(s86er,8); ! 5145: rc = rc+8; ! 5146: } ! 5147: ! 5148: /* y0, y1, and y2, as declared, should define and ! 5149: initialize identical arrays. ! 5150: */ ! 5151: lrc = 0; ! 5152: for(i=0; i<4; i++) ! 5153: for(j=0; j<3; j++){ ! 5154: k = 3*i+j; ! 5155: if( y1[i][j] != y2[i][j] ! 5156: ||y1[i][j] != y0[k]) lrc = 1; ! 5157: } ! 5158: ! 5159: if(lrc != 0){ ! 5160: if(pd0->flgd != 0) printf(s86er,16); ! 5161: rc = rc+16; ! 5162: } ! 5163: ! 5164: /* y3 initializes the first column of the array and ! 5165: leaves the rest zero. ! 5166: */ ! 5167: ! 5168: lrc = 0; ! 5169: for(j=0; j<4; j++) if(y3[j][0] != j+1) lrc = 1; ! 5170: ! 5171: if(lrc != 0){ ! 5172: if(pd0->flgd != 0) printf(s86er,32); ! 5173: rc = rc+32; ! 5174: } ! 5175: return rc; ! 5176: } ! 5177: one(){ ! 5178: return 1; ! 5179: } ! 5180: int *metricp; ! 5181: s88(pd0) /* 8.8 Typedef */ ! 5182: struct defs *pd0; ! 5183: { ! 5184: static char s88er[] = "s88,er%d\n"; ! 5185: static char qs88[8] = "s88 "; ! 5186: int rc; ! 5187: char *ps, *pt; ! 5188: ! 5189: /* Declarations whose "storage class" is typdef do not ! 5190: define storage, but instead define identifiers which ! 5191: can later be used as if they were type keywords naming ! 5192: fundamental or derived types. ! 5193: */ ! 5194: ! 5195: typedef int MILES, *KLICKSP; ! 5196: typedef struct {double re, im;} complex; ! 5197: ! 5198: MILES distance; ! 5199: extern KLICKSP metricp; ! 5200: complex z, *zp; ! 5201: ! 5202: ps = qs88; ! 5203: pt = pd0->rfs; ! 5204: rc = 0; ! 5205: while(*pt++ = *ps++); ! 5206: ! 5207: /* Hopefully, all of this stuff will compile. After that, ! 5208: we can only make some superficial tests. ! 5209: ! 5210: The type of distance is int, ! 5211: */ ! 5212: ! 5213: if(sizeof distance != sizeof(int)){ ! 5214: if(pd0->flgd != 0) printf(s88er,1); ! 5215: rc = rc+1; ! 5216: } ! 5217: ! 5218: /* that of metricp is "pointer to int", */ ! 5219: ! 5220: metricp = &distance; ! 5221: distance = 2; ! 5222: *metricp = 3; ! 5223: ! 5224: if(distance != 3){ ! 5225: if(pd0->flgd != 0) printf(s88er,2); ! 5226: rc = rc+2; ! 5227: } ! 5228: ! 5229: /* and that of z is the specified structure. zp is a ! 5230: pointer to such a structure. ! 5231: */ ! 5232: ! 5233: z.re = 0.; ! 5234: z.im = 0.; ! 5235: zp = &z; ! 5236: zp->re = 1.; ! 5237: zp->im = 1.; ! 5238: if(z.re+z.im != 2.){ ! 5239: if(pd0->flgd != 0) printf(s88er,4); ! 5240: rc = rc+4; ! 5241: } ! 5242: ! 5243: return rc; ! 5244: } ! 5245: s9(pd0) /* 9 Statements */ ! 5246: struct defs *pd0; ! 5247: { ! 5248: static char s9er[] = "s9,er%d\n"; ! 5249: static char qs9[8] = "s9 "; ! 5250: int rc; ! 5251: char *ps, *pt; ! 5252: int lrc, i; ! 5253: ! 5254: ps = qs9; ! 5255: pt = pd0->rfs; ! 5256: rc = 0; ! 5257: while (*pt++ = *ps++); ! 5258: ! 5259: /* One would think that the section on statements would ! 5260: provide the most variety in the entire sequence of tests. ! 5261: As it turns out, most of the material in this section has ! 5262: already been checked in the process of checking out ! 5263: everything else, and the section at this point is somewhat ! 5264: anticlimactic. For this reason, we restrict ourselves ! 5265: to testing two features not already covered. ! 5266: ! 5267: Compound statements are delimited by braces. They have the ! 5268: nice property that identifiers of the auto and register ! 5269: variety are pushed and popped. It is currently legal to ! 5270: transfer into a block, but we wont... ! 5271: */ ! 5272: ! 5273: lrc = 0; ! 5274: for(i=0; i<2; i++){ ! 5275: int j; ! 5276: register int k; ! 5277: j = k = 2; ! 5278: { ! 5279: int j; ! 5280: register int k; ! 5281: j = k = 3; ! 5282: if((j != 3) || (k != 3)) lrc = 1; ! 5283: } ! 5284: if((j != 2) || (k != 2)) lrc = 1; ! 5285: } ! 5286: ! 5287: if(lrc != 0){ ! 5288: if(pd0->flgd != 0) printf(s9er,1); ! 5289: rc = rc+1; ! 5290: } ! 5291: ! 5292: /* Goto statements go to labeled statements, we hope. */ ! 5293: ! 5294: goto nobarf; ! 5295: if(pd0->flgd != 0) printf(s9er,2); ! 5296: rc = rc+2; ! 5297: nobarf:; ! 5298: ! 5299: return rc; ! 5300: } ! 5301: setev(){ /* Sets an external variable. Used */ ! 5302: extern int extvar; /* by s4, and should be compiled */ ! 5303: extvar = 1066; /* separately from s4. */ ! 5304: } ! 5305: int lbits; /* long */ ! 5306: int ubits; /* unsigned */ ! 5307: int fbits; /* float */ ! 5308: int dbits; /* double */ ! 5309: float fprec; /* Smallest number that can be */ ! 5310: float dprec; /* significantly added to 1. */ ! 5311: int flgs; /* Print return codes, by section */ ! 5312: int flgm; /* Announce machine dependencies */ ! 5313: int flgd; /* give explicit diagnostics */ ! 5314: int flgl; /* Report local return codes. */ ! 5315: int rrc; /* recent return code */ ! 5316: int crc; /* Cumulative return code */ ! 5317: char rfs[8]; /* Return from section */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.