* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / lcc-4.2 / tst / cq.c
blob769b538e542d0ae899665b3617dfda59a4a898ae
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 */
19 main(n,args) /* C REFERENCE MANUAL */
20 int n;
21 char **args;
24 /* This program performs a series of tests on a C compiler,
25 based on information in the
27 C REFERENCE MANUAL
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".
34 The rules followed in writing this program are:
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.
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.
47 3. No global variables are used, except for the spec-
48 ific purpose of testing the global variable facility.
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.
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.
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.
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.
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).
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:
118 d0.rrc = (*sec[j])(pd0);
120 in the for loop calls the modules. The rest of the code is
121 reasonably straightforward.
123 Finally, in each of the modules, there is the following
124 prologue:
126 snnn(pd0)
127 struct defs *pd0;
129 static char snnner[] = "snnn,er%d\n";
130 static char qsnnn[8] = "snnn ";
131 char *ps, *pt;
132 int rc;
134 rc = 0;
135 ps = qsnnn;
136 pt = pd0->rfs;
137 while(*pt++ = *ps++);
139 used for housekeeping, handshaking and module initialization.
142 extern
143 s22(struct defs *),
144 s241(struct defs *),
145 s243(struct defs *),
146 s244(struct defs *),
147 s25(struct defs *),
148 s26(struct defs *),
149 s4(struct defs *),
150 s61(struct defs *),
151 s626(struct defs *),
152 s71(struct defs *),
153 s72(struct defs *),
154 s757(struct defs *),
155 s7813(struct defs *),
156 s714(struct defs *),
157 s715(struct defs *),
158 s81(struct defs *),
159 s84(struct defs *),
160 s85(struct defs *),
161 s86(struct defs *),
162 s88(struct defs *),
163 s9(struct defs *)
166 int j;
167 static int (*sec[])() = {
168 s22,
169 s241,
170 s243,
171 s244,
172 s25,
173 s26,
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,
191 static struct defs d0, *pd0;
193 d0.flgs = 1; /* These flags dictate */
194 d0.flgm = 1; /* the verbosity of */
195 d0.flgd = 1; /* the program. */
196 d0.flgl = 1;
198 pd0 = &d0;
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);
206 if(d0.crc == 0) printf("\nNo errors detected.\n");
207 else printf("\nFailed.\n");
208 return 0;
210 s22(pd0) /* 2.2 Identifiers (Names) */
211 struct defs *pd0;
213 int a234, a;
214 int _, _234, A, rc;
216 static char s22er[] = "s22,er%d\n";
217 static char qs22[8] = "s22 ";
219 char *ps, *pt;
220 /* Initialize */
222 rc = 0;
223 ps = qs22;
224 pt = pd0 -> rfs;
225 while (*pt++ = *ps++);
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. */
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);
240 /* Upper and lower case letters are different. */
242 A = 2;
243 if (A == a) {
244 rc = rc+4;
245 if (pd0->flgd != 0) printf(s22er,4);
248 return(rc);
250 s241(pd0) /* 2.4.1 Integer constants
251 2.4.2 Explicit long constants */
252 struct defs *pd0;
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];
264 rc = 0;
265 lrc = 0;
266 ps = qs241;
267 pt = pd0 -> rfs;
268 while (*pt++ = *ps++);
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. */
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 ){
295 rc = rc+1;
296 if( pd0->flgd != 0 ) printf(s241er,1);
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. */
304 if ( 0x00abcdef != 0xabcdef
305 || 0xabcdef != 0Xabcdef || 0Xabcdef != 0XAbcdef
306 || 0XAbcdef != 0XABcdef || 0XABcdef != 0XABCdef
307 || 0XABCdef != 0XABCDef || 0XABCDef != 0XABCDEf
308 || 0XABCDEf != 0XABCDEF || 0xABCDEF != 11259375 ){
310 rc = rc+2;
311 if( pd0->flgd != 0 ) printf(s241er,2);
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. */
319 if ( sizeof 010000000000 != sizeof(long) /* 2**30 */
320 || sizeof 1073741824 != sizeof(long) /* ditto */
321 || sizeof 0x40000000 != sizeof(long) ){ /* " */
323 rc = rc+4;
324 if( pd0->flgd != 0 ) printf(s241er,4);
327 /* A decimal, octal, or hexadecimal constant immediately followed
328 by l (letter ell) or L is a long constant. */
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) ){
337 rc = rc+8;
338 if( pd0 -> flgd != 0 ) printf(s241er,8);
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... */
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;
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;
399 /* WHEW! */
401 for (j=0; j<39; j++){
402 if ( g[j] != d[j]
403 || d[j] != o[j]
404 || o[j] != x[j]) {
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");
411 /* lrc = 1; save... */
415 if (lrc != 0) rc =16;
417 return rc;
420 long pow2(n) /* Calculate 2**n by multiplying, not shifting */
421 long n;
423 long s;
424 s = 1;
425 while(n--) s = s*2;
426 return s;
428 s243(pd0) /* 2.4.3 Character constants */
429 struct defs *pd0;
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];
437 rc = 0;
438 ps = qs243;
439 pt = pd0->rfs;
440 while(*pt++ = *ps++);
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.,
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
468 Any specific implementation of C may of course support additional
469 characters. */
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. */
475 zerofill(chars);
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;
506 if(sumof(chars) != 98){
507 rc = rc+1;
508 if(pd0->flgd != 0) printf(s243er,1);
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. */
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 ){
521 rc = rc+8;
522 if(pd0->flgd != 0) printf(s243er,8);
525 return rc;
527 zerofill(x)
528 char *x;
530 int j;
532 for (j=0; j<256; j++) *x++ = 0;
534 sumof(x)
535 char *x;
537 char *p;
538 int total, j;
540 p = x;
541 total = 0;
543 for(j=0; j<256; j++) total = total+ *p++;
544 return total;
546 s244(pd0)
547 struct defs *pd0;
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;
555 ps = qs244;
556 pt = pd0->rfs;
557 while(*pt++ = *ps++);
558 rc = 0;
559 lrc = 0;
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. */
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.;
576 lrc = 0;
577 for (j=0; j<7; j++) if(a[j] != a[j+1]) lrc = 1;
579 if(lrc != 0) {
580 if(pd0->flgd != 0) printf(s244er,1);
581 rc = rc+1;
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)){
593 if(pd0->flgd != 0) printf(s244er,2);
594 rc = rc+2;
597 return rc;
599 s25(pd0)
600 struct defs *pd0;
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;
608 ps = qs25;
609 pt = pd0->rfs;
610 while(*pt++ = *ps++);
611 rc = 0;
613 /* A string is a sequence of characters surrounded by double
614 quotes, as in "...". */
616 s = "...";
618 /* A string has type "array of characters" and storage class
619 static and is initialized with the given characters. */
621 if ( s[0] != s[1] || s[1] != s[2]
622 || s[2] != '.' ) {
624 rc = rc+1;
625 if(pd0->flgd != 0) printf(s25er,1);
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. */
631 if( s[3] != '\0' ){
632 rc = rc+4;
633 if(pd0->flgd != 0) printf(s25er,4);
636 /* In a string, the double quote character " must be preceded
637 by a \. */
639 if( ".\"."[1] != '"' ){
640 rc = rc+8;
641 if(pd0->flgd != 0) printf(s25er,8);
644 /* In addition, the same escapes described for character constants
645 may be used. */
647 s = "\n\t\b\r\f\\\'";
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] != '\'' ){
657 rc = rc+16;
658 if( pd0->flgd != 0) printf(s25er,16);
661 /* Finally, a \ and an immediately following newline are ignored */
663 s2 = "queep!";
664 s = "queep!";
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);
672 return rc;
674 s26(pd0) /* 2.6 Hardware Characteristics */
675 struct defs *pd0;
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";
685 ps = qs26;
686 pt = pd0->rfs;
688 while(*pt++ = *ps++);
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. */
693 pd0->cbits = 0;
694 c0 = 0;
695 c1 = 1;
697 while(c0 != c1) {
698 c1 = c1<<1;
699 pd0->cbits = pd0->cbits+1;
701 /* That information lets us determine the size of everything else. */
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);
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.
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. */
726 one = 1.;
727 delta = 1.;
728 temp = 0.;
729 while(temp != one) {
730 temp = one+delta;
731 delta = delta/2.;
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.;
741 pd0->dprec = delta * 4.;
743 /* Now, if anyone's interested, we publish the results. */
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");
756 /* Since we are only exploring and perhaps reporting, but not
757 testing any features, we cannot return an error code. */
759 return 0;
761 int extvar;
762 s4(pd0) /* 4. What's in a name? */
763 struct defs *pd0;
765 static char s4er[] = "s4,er%d\n";
766 static char qs4[8] = "s4 ";
767 char *ps, *pt;
768 int j, rc;
770 short sint; /* short integer, for size test */
771 int pint; /* plain */
772 long lint; /* long */
773 unsigned target;
774 unsigned int mask;
776 rc = 0;
777 ps = qs4;
778 pt = pd0->rfs;
780 while(*pt++ = *ps++);
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.
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. */
792 for (j=0; j<3; j++)
793 if(svtest(j) != zero()){
794 rc = 1;
795 if(pd0->flgd != 0) printf(s4er,1);
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.
804 setev();
805 if(testev() != 0){
806 rc=rc+2;
807 if(pd0->flgd != 0) printf(s4er,2);
810 Characters have been tested elsewhere (in s243).
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.
819 if(sizeof lint < sizeof pint || sizeof pint < sizeof sint){
821 rc = rc+4;
822 if(pd0->flgd != 0) printf(s4er,4);
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 */
829 target = ~0U;
830 mask = 1;
832 for(j=0; j<(sizeof target)*pd0->cbits; j++){
834 mask = mask&target;
835 target = target>>1;
838 if(mask != 1 || target != 0){
840 rc = rc+8;
841 if(pd0->flgd != 0) printf(s4er,8);
844 return rc;
846 svtest(n)
847 int n;
849 static k;
850 int rc;
851 switch (n) {
853 case 0: k = 1978;
854 rc = 0;
855 break;
857 case 1: if(k != 1978) rc = 1;
858 else{
859 k = 1929;
860 rc = 0;
862 break;
864 case 2: if(k != 1929) rc = 1;
865 else rc = 0;
866 break;
868 return rc;
870 zero(){ /* Returns a value of zero, possibly */
871 static k; /* with side effects, as it's called */
872 int rc; /* alternately with svtest, above, */
873 k = 2; /* and has the same internal storage */
874 rc = 0; /* requirements. */
875 return rc;
877 testev(){
878 if(extvar != 1066) return 1;
879 else return 0;
881 s61(pd0) /* Characters and integers */
882 struct defs *pd0;
884 static char s61er[] = "s61,er%d\n";
885 static char qs61[8] = "s61 ";
886 short from, shortint;
887 long int to, longint;
888 int rc, lrc;
889 int j;
890 char fromc, charint;
891 char *wd, *pc[6];
893 static char upper_alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
894 static char lower_alpha[] = "abcdefghijklmnopqrstuvwxyz";
895 static char numbers[] = "0123456789";
896 static char special_characters[] = "~!\"#%&()_=-^|{}[]+;*:<>,.?/";
897 static char extra_special_characters[] = "\n\t\b\r\f\\\'";
898 static char blank_and_NUL[] = " \0";
900 char *ps, *pt;
901 ps = qs61;
902 pt = pd0->rfs;
903 rc = 0;
904 while (*pt++ = *ps++);
906 /* A character or a short integer may be used wherever
907 an integer may be used. In all cases, the value is converted
908 to integer. This principle is extensively used throughout this
909 program, and will not be explicitly tested here. */
911 /* Conversion of a shorter integer to a longer always
912 involves sign extension. */
914 from = -19;
915 to = from;
917 if(to != -19){
918 rc = rc+1;
919 if(pd0->flgd != 0) printf(s61er,1);
922 /* It is guaranteed that a member of the standard char-
923 acter set is nonnegative. */
925 pc[0] = upper_alpha;
926 pc[1] = lower_alpha;
927 pc[2] = numbers;
928 pc[3] = special_characters;
929 pc[4] = extra_special_characters;
930 pc[5] = blank_and_NUL;
932 lrc = 0;
933 for (j=0; j<6; j++)
934 while(*pc[j]) if(*pc[j]++ < 0) lrc =1;
936 if(lrc != 0){
937 rc=rc+2;
938 if(pd0->flgd != 0) printf(s61er,2);
941 /* When a longer integer is converted to a shorter or
942 to a char, it is truncated on the left; excess bits are
943 simply discarded. */
945 longint = 1048579; /* =2**20+3 */
946 shortint = longint;
947 charint = longint;
949 if((shortint != longint && shortint != 3) ||
950 (charint != longint && charint != 3)) {
951 rc = rc+8;
952 if(pd0->flgd != 0) printf(s61er,8);
955 return rc;
957 s626(pd0) /* 6.2 Float and double */
958 /* 6.3 Floating and integral */
959 /* 6.4 Pointers and integers */
960 /* 6.5 Unsigned */
961 /* 6.6 Arithmetic conversions */
962 struct defs *pd0;
964 static char s626er[] = "s626,er%d\n";
965 static char qs626[8] = "s626 ";
966 int rc;
967 char *ps, *pt;
968 float eps, f1, f2, f3, f4, f;
969 long lint1, lint2, l, ls;
970 char c, t[28], t0;
971 short s;
972 int is, i, j;
973 unsigned u, us;
974 double d, ds;
975 ps = qs626;
976 pt = pd0->rfs;
977 rc = 0;
978 while (*pt++ = *ps++);
980 /* Conversions of integral values to floating type are
981 well-behaved. */
983 f1 = 1.;
984 lint1 = 1.;
985 lint2 = 1.;
987 for(j=0;j<pd0->lbits-2;j++){
988 f1 = f1*2;
989 lint2 = (lint2<<1)|lint1;
991 f2 = lint2;
992 f1 = (f1-f2)/f1;
993 if(f1>2.*pd0->fprec){
995 rc = rc+2;
996 if(pd0->flgd != 0) printf(s626er,2);
999 /* Pointer-integer combinations are discussed in s74,
1000 "Additive operators". The unsigned-int combination
1001 appears below. */
1003 c = 125;
1004 s = 125;
1005 i = 125; is = 15625;
1006 u = 125; us = 15625;
1007 l = 125; ls = 15625;
1008 f = 125.;
1009 d = 125.; ds = 15625.;
1011 for(j=0;j<28;j++) t[j] = 0;
1013 if(c*c != is) t[ 0] = 1;
1014 if(s*c != is) t[ 1] = 1;
1015 if(s*s != is) t[ 2] = 1;
1016 if(i*c != is) t[ 3] = 1;
1017 if(i*s != is) t[ 4] = 1;
1018 if(i*i != is) t[ 5] = 1;
1019 if(u*c != us) t[ 6] = 1;
1020 if(u*s != us) t[ 7] = 1;
1021 if(u*i != us) t[ 8] = 1;
1022 if(u*u != us) t[ 9] = 1;
1023 if(l*c != ls) t[10] = 1;
1024 if(l*s != ls) t[11] = 1;
1025 if(l*i != ls) t[12] = 1;
1026 if(l*u != us) t[13] = 1;
1027 if(l*l != ls) t[14] = 1;
1028 if(f*c != ds) t[15] = 1;
1029 if(f*s != ds) t[16] = 1;
1030 if(f*i != ds) t[17] = 1;
1031 if(f*u != ds) t[18] = 1;
1032 if(f*l != ds) t[19] = 1;
1033 if(f*f != ds) t[20] = 1;
1034 if(d*c != ds) t[21] = 1;
1035 if(d*s != ds) t[22] = 1;
1036 if(d*i != ds) t[23] = 1;
1037 if(d*u != ds) t[24] = 1;
1038 if(d*l != ds) t[25] = 1;
1039 if(d*f != ds) t[26] = 1;
1040 if(d*d != ds) t[27] = 1;
1042 t0 = 0;
1043 for(j=0; j<28; j++) t0 = t0+t[j];
1045 if(t0 != 0){
1047 rc = rc+4;
1048 if(pd0->flgd != 0){
1050 printf(s626er,4);
1051 printf(" key=");
1052 for(j=0;j<28;j++) printf("%d",t[j]);
1053 printf("\n");
1057 /* When an unsigned integer is converted to long,
1058 the value of the result is the same numerically
1059 as that of the unsigned integer. */
1061 l = (unsigned)0100000;
1062 if((long)l > (unsigned)0100000){
1064 rc = rc+8;
1065 if(pd0->flgd != 0) printf(s626er,8);
1068 return rc;
1070 s71(pd0) /* 7.1 Primary expressions */
1071 struct defs *pd0;
1073 static char s71er[] = "s71,er%d\n";
1074 static char qs71[8] = "s71 ";
1075 int rc;
1076 char *ps, *pt;
1077 static char q = 'q';
1078 int x[10], McCarthy(), clobber(), a, b, *p;
1079 ps = qs71;
1080 pt = pd0->rfs;
1081 rc = 0;
1082 while (*pt++ = *ps++);
1084 /* Testing of expressions and operators is quite complicated,
1085 because (a) problems are apt to surface in queer combinations
1086 of operators and operands, rather than in isolation,
1087 and (b) the number of expressions needed to provoke a case
1088 of improper behaviour may be quite large. Hence, we take the
1089 following approach: for this section, and for subsequent
1090 sections through 7.15, we will check the primitive operations
1091 in isolation, thus verifying that the primitives work,
1092 after a fashion. The job of testing combinations, we will
1093 leave to a separate, machine-generated program, to be included
1094 in the C test package at some later date.
1097 /* A string is a primary expression. The identifier points to
1098 the first character of a string.
1101 if(*"queep" != q){
1102 rc = rc+1;
1103 if(pd0->flgd != 0) printf(s71er,1);
1105 /* A parenthesized expression is a primary expression whose
1106 type and value are the same as those of the unadorned
1107 expression.
1109 if((2+3) != 2+3) {
1110 rc = rc+2;
1111 if(pd0->flgd != 0) printf(s71er,2);
1114 /* A primary expression followed by an expression in square
1115 brackets is a primary expression. The intuitive meaning is
1116 that of a subscript. The expression E1[E2] is identical
1117 (by definition) to *((E1)+(E2)).
1120 x[5] = 1942;
1121 if(x[5] != 1942 || x[5] != *((x)+(5))){
1122 rc = rc+4;
1123 if(pd0->flgd != 0) printf(s71er,4);
1126 /* If the various flavors of function calls didn't work, we
1127 would never have gotten this far; however, we do need to
1128 show that functions can be recursive...
1131 if ( McCarthy(-5) != 91){
1132 rc = rc+8;
1133 if(pd0->flgd != 0) printf(s71er,8);
1136 /* and that argument passing is strictly by value. */
1138 a = 2;
1139 b = 3;
1140 p = &b;
1142 clobber(a,p);
1144 if(a != 2 || b != 2){
1145 rc = rc+16;
1146 if(pd0->flgd != 0) printf(s71er,16);
1149 /* Finally, structures and unions are addressed thusly: */
1151 if(pd0->dprec != (*pd0).dprec){
1152 rc = rc+32;
1153 if(pd0->flgd != 0) printf(s71er,32);
1156 return rc;
1158 McCarthy(x)
1159 int x;
1161 if(x>100) return x-10;
1162 else return McCarthy( McCarthy(x+11));
1164 clobber(x,y)
1165 int x, *y;
1167 x = 3;
1168 *y = 2;
1170 s714(pd0) /* 7.14 Assignment operators */
1171 struct defs *pd0;
1173 static char f[] = "Local error %d.\n";
1174 static char s714er[] = "s714,er%d\n";
1175 static char qs714[8] = "s714 ";
1176 register int prlc, lrc;
1177 int rc;
1178 char cl, cr;
1179 short sl, sr;
1180 int il, ir;
1181 long ll, lr;
1182 unsigned ul, ur;
1183 float fl, fr;
1184 double dl, dr;
1185 char *ps, *pt;
1186 ps = qs714;
1187 pt = pd0->rfs;
1188 rc = 0;
1189 lrc = 0;
1190 prlc = pd0->flgl;
1191 while (*pt++ = *ps++);
1193 /* This section tests the assignment operators.
1195 It is an exhaustive test of all assignment statements
1196 of the form:
1198 vl op vr
1200 where vl and vr are variables from the set
1201 {char,short,int,long,unsigned,float,double} and op is
1202 one of the assignment operators. There are 395 such
1203 statements.
1205 The initial values for the variables have been chosen
1206 so that both the initial values and the results will
1207 "fit" in just about any implementation, and that the re-
1208 sults will be such that they test for the proper form-
1209 ation of composite operators, rather than checking for
1210 the valid operation of those operators' components.
1211 For example, in checking >>=, we want to verify that
1212 a right shift and a move take place, rather than
1213 whether or not there may be some peculiarities about
1214 the right shift. Such tests have been made previously,
1215 and to repeat them here would be to throw out a red
1216 herring.
1218 The table below lists the operators, assignment targets,
1219 initial values for left and right operands, and the
1220 expected values of the results.
1223 = += -= *= /= %= >>= <<= &= ^= |=
1224 char 2 7 3 10 2 1 1 20 8 6 14
1225 short 2 7 3 10 2 1 1 20 8 6 14
1226 int 2 7 3 10 2 1 1 20 8 6 14
1227 long 2 7 3 10 2 1 1 20 8 6 14
1228 unsigned 2 7 3 10 2 1 1 20 8 6 14
1229 float 2 7 3 10 2.5 | |
1230 double 2 7 3 10 2.5 | |
1232 initial (5,2) | (5,2) | (12,10)
1234 The following machine-generated program reflects the
1235 tests described in the table.
1238 cl = 5; cr = 2;
1239 cl = cr;
1240 if(cl != 2){
1241 lrc = 1;
1242 if(prlc) printf(f,lrc);
1244 cl = 5; sr = 2;
1245 cl = sr;
1246 if(cl != 2){
1247 lrc = 2;
1248 if(prlc) printf(f,lrc);
1250 cl = 5; ir = 2;
1251 cl = ir;
1252 if(cl != 2){
1253 lrc = 3;
1254 if(prlc) printf(f,lrc);
1256 cl = 5; lr = 2;
1257 cl = lr;
1258 if(cl != 2){
1259 lrc = 4;
1260 if(prlc) printf(f,lrc);
1262 cl = 5; ur = 2;
1263 cl = ur;
1264 if(cl != 2){
1265 lrc = 5;
1266 if(prlc) printf(f,lrc);
1268 cl = 5; fr = 2;
1269 cl = fr;
1270 if(cl != 2){
1271 lrc = 6;
1272 if(prlc) printf(f,lrc);
1274 cl = 5; dr = 2;
1275 cl = dr;
1276 if(cl != 2){
1277 lrc = 7;
1278 if(prlc) printf(f,lrc);
1280 sl = 5; cr = 2;
1281 sl = cr;
1282 if(sl != 2){
1283 lrc = 8;
1284 if(prlc) printf(f,lrc);
1286 sl = 5; sr = 2;
1287 sl = sr;
1288 if(sl != 2){
1289 lrc = 9;
1290 if(prlc) printf(f,lrc);
1292 sl = 5; ir = 2;
1293 sl = ir;
1294 if(sl != 2){
1295 lrc = 10;
1296 if(prlc) printf(f,lrc);
1298 sl = 5; lr = 2;
1299 sl = lr;
1300 if(sl != 2){
1301 lrc = 11;
1302 if(prlc) printf(f,lrc);
1304 sl = 5; ur = 2;
1305 sl = ur;
1306 if(sl != 2){
1307 lrc = 12;
1308 if(prlc) printf(f,lrc);
1310 sl = 5; fr = 2;
1311 sl = fr;
1312 if(sl != 2){
1313 lrc = 13;
1314 if(prlc) printf(f,lrc);
1316 sl = 5; dr = 2;
1317 sl = dr;
1318 if(sl != 2){
1319 lrc = 14;
1320 if(prlc) printf(f,lrc);
1322 il = 5; cr = 2;
1323 il = cr;
1324 if(il != 2){
1325 lrc = 15;
1326 if(prlc) printf(f,lrc);
1328 il = 5; sr = 2;
1329 il = sr;
1330 if(il != 2){
1331 lrc = 16;
1332 if(prlc) printf(f,lrc);
1334 il = 5; ir = 2;
1335 il = ir;
1336 if(il != 2){
1337 lrc = 17;
1338 if(prlc) printf(f,lrc);
1340 il = 5; lr = 2;
1341 il = lr;
1342 if(il != 2){
1343 lrc = 18;
1344 if(prlc) printf(f,lrc);
1346 il = 5; ur = 2;
1347 il = ur;
1348 if(il != 2){
1349 lrc = 19;
1350 if(prlc) printf(f,lrc);
1352 il = 5; fr = 2;
1353 il = fr;
1354 if(il != 2){
1355 lrc = 20;
1356 if(prlc) printf(f,lrc);
1358 il = 5; dr = 2;
1359 il = dr;
1360 if(il != 2){
1361 lrc = 21;
1362 if(prlc) printf(f,lrc);
1364 ll = 5; cr = 2;
1365 ll = cr;
1366 if(ll != 2){
1367 lrc = 22;
1368 if(prlc) printf(f,lrc);
1370 ll = 5; sr = 2;
1371 ll = sr;
1372 if(ll != 2){
1373 lrc = 23;
1374 if(prlc) printf(f,lrc);
1376 ll = 5; ir = 2;
1377 ll = ir;
1378 if(ll != 2){
1379 lrc = 24;
1380 if(prlc) printf(f,lrc);
1382 ll = 5; lr = 2;
1383 ll = lr;
1384 if(ll != 2){
1385 lrc = 25;
1386 if(prlc) printf(f,lrc);
1388 ll = 5; ur = 2;
1389 ll = ur;
1390 if(ll != 2){
1391 lrc = 26;
1392 if(prlc) printf(f,lrc);
1394 ll = 5; fr = 2;
1395 ll = fr;
1396 if(ll != 2){
1397 lrc = 27;
1398 if(prlc) printf(f,lrc);
1400 ll = 5; dr = 2;
1401 ll = dr;
1402 if(ll != 2){
1403 lrc = 28;
1404 if(prlc) printf(f,lrc);
1406 ul = 5; cr = 2;
1407 ul = cr;
1408 if(ul != 2){
1409 lrc = 29;
1410 if(prlc) printf(f,lrc);
1412 ul = 5; sr = 2;
1413 ul = sr;
1414 if(ul != 2){
1415 lrc = 30;
1416 if(prlc) printf(f,lrc);
1418 ul = 5; ir = 2;
1419 ul = ir;
1420 if(ul != 2){
1421 lrc = 31;
1422 if(prlc) printf(f,lrc);
1424 ul = 5; lr = 2;
1425 ul = lr;
1426 if(ul != 2){
1427 lrc = 32;
1428 if(prlc) printf(f,lrc);
1430 ul = 5; ur = 2;
1431 ul = ur;
1432 if(ul != 2){
1433 lrc = 33;
1434 if(prlc) printf(f,lrc);
1436 ul = 5; fr = 2;
1437 ul = fr;
1438 if(ul != 2){
1439 lrc = 34;
1440 if(prlc) printf(f,lrc);
1442 ul = 5; dr = 2;
1443 ul = dr;
1444 if(ul != 2){
1445 lrc = 35;
1446 if(prlc) printf(f,lrc);
1448 fl = 5; cr = 2;
1449 fl = cr;
1450 if(fl != 2){
1451 lrc = 36;
1452 if(prlc) printf(f,lrc);
1454 fl = 5; sr = 2;
1455 fl = sr;
1456 if(fl != 2){
1457 lrc = 37;
1458 if(prlc) printf(f,lrc);
1460 fl = 5; ir = 2;
1461 fl = ir;
1462 if(fl != 2){
1463 lrc = 38;
1464 if(prlc) printf(f,lrc);
1466 fl = 5; lr = 2;
1467 fl = lr;
1468 if(fl != 2){
1469 lrc = 39;
1470 if(prlc) printf(f,lrc);
1472 fl = 5; ur = 2;
1473 fl = ur;
1474 if(fl != 2){
1475 lrc = 40;
1476 if(prlc) printf(f,lrc);
1478 fl = 5; fr = 2;
1479 fl = fr;
1480 if(fl != 2){
1481 lrc = 41;
1482 if(prlc) printf(f,lrc);
1484 fl = 5; dr = 2;
1485 fl = dr;
1486 if(fl != 2){
1487 lrc = 42;
1488 if(prlc) printf(f,lrc);
1490 dl = 5; cr = 2;
1491 dl = cr;
1492 if(dl != 2){
1493 lrc = 43;
1494 if(prlc) printf(f,lrc);
1496 dl = 5; sr = 2;
1497 dl = sr;
1498 if(dl != 2){
1499 lrc = 44;
1500 if(prlc) printf(f,lrc);
1502 dl = 5; ir = 2;
1503 dl = ir;
1504 if(dl != 2){
1505 lrc = 45;
1506 if(prlc) printf(f,lrc);
1508 dl = 5; lr = 2;
1509 dl = lr;
1510 if(dl != 2){
1511 lrc = 46;
1512 if(prlc) printf(f,lrc);
1514 dl = 5; ur = 2;
1515 dl = ur;
1516 if(dl != 2){
1517 lrc = 47;
1518 if(prlc) printf(f,lrc);
1520 dl = 5; fr = 2;
1521 dl = fr;
1522 if(dl != 2){
1523 lrc = 48;
1524 if(prlc) printf(f,lrc);
1526 dl = 5; dr = 2;
1527 dl = dr;
1528 if(dl != 2){
1529 lrc = 49;
1530 if(prlc) printf(f,lrc);
1532 cl = 5; cr = 2;
1533 cl += cr;
1534 if(cl != 7){
1535 lrc = 50;
1536 if(prlc) printf(f,lrc);
1538 cl = 5; sr = 2;
1539 cl += sr;
1540 if(cl != 7){
1541 lrc = 51;
1542 if(prlc) printf(f,lrc);
1544 cl = 5; ir = 2;
1545 cl += ir;
1546 if(cl != 7){
1547 lrc = 52;
1548 if(prlc) printf(f,lrc);
1550 cl = 5; lr = 2;
1551 cl += lr;
1552 if(cl != 7){
1553 lrc = 53;
1554 if(prlc) printf(f,lrc);
1556 cl = 5; ur = 2;
1557 cl += ur;
1558 if(cl != 7){
1559 lrc = 54;
1560 if(prlc) printf(f,lrc);
1562 cl = 5; fr = 2;
1563 cl += fr;
1564 if(cl != 7){
1565 lrc = 55;
1566 if(prlc) printf(f,lrc);
1568 cl = 5; dr = 2;
1569 cl += dr;
1570 if(cl != 7){
1571 lrc = 56;
1572 if(prlc) printf(f,lrc);
1574 sl = 5; cr = 2;
1575 sl += cr;
1576 if(sl != 7){
1577 lrc = 57;
1578 if(prlc) printf(f,lrc);
1580 sl = 5; sr = 2;
1581 sl += sr;
1582 if(sl != 7){
1583 lrc = 58;
1584 if(prlc) printf(f,lrc);
1586 sl = 5; ir = 2;
1587 sl += ir;
1588 if(sl != 7){
1589 lrc = 59;
1590 if(prlc) printf(f,lrc);
1592 sl = 5; lr = 2;
1593 sl += lr;
1594 if(sl != 7){
1595 lrc = 60;
1596 if(prlc) printf(f,lrc);
1598 sl = 5; ur = 2;
1599 sl += ur;
1600 if(sl != 7){
1601 lrc = 61;
1602 if(prlc) printf(f,lrc);
1604 sl = 5; fr = 2;
1605 sl += fr;
1606 if(sl != 7){
1607 lrc = 62;
1608 if(prlc) printf(f,lrc);
1610 sl = 5; dr = 2;
1611 sl += dr;
1612 if(sl != 7){
1613 lrc = 63;
1614 if(prlc) printf(f,lrc);
1616 il = 5; cr = 2;
1617 il += cr;
1618 if(il != 7){
1619 lrc = 64;
1620 if(prlc) printf(f,lrc);
1622 il = 5; sr = 2;
1623 il += sr;
1624 if(il != 7){
1625 lrc = 65;
1626 if(prlc) printf(f,lrc);
1628 il = 5; ir = 2;
1629 il += ir;
1630 if(il != 7){
1631 lrc = 66;
1632 if(prlc) printf(f,lrc);
1634 il = 5; lr = 2;
1635 il += lr;
1636 if(il != 7){
1637 lrc = 67;
1638 if(prlc) printf(f,lrc);
1640 il = 5; ur = 2;
1641 il += ur;
1642 if(il != 7){
1643 lrc = 68;
1644 if(prlc) printf(f,lrc);
1646 il = 5; fr = 2;
1647 il += fr;
1648 if(il != 7){
1649 lrc = 69;
1650 if(prlc) printf(f,lrc);
1652 il = 5; dr = 2;
1653 il += dr;
1654 if(il != 7){
1655 lrc = 70;
1656 if(prlc) printf(f,lrc);
1658 ll = 5; cr = 2;
1659 ll += cr;
1660 if(ll != 7){
1661 lrc = 71;
1662 if(prlc) printf(f,lrc);
1664 ll = 5; sr = 2;
1665 ll += sr;
1666 if(ll != 7){
1667 lrc = 72;
1668 if(prlc) printf(f,lrc);
1670 ll = 5; ir = 2;
1671 ll += ir;
1672 if(ll != 7){
1673 lrc = 73;
1674 if(prlc) printf(f,lrc);
1676 ll = 5; lr = 2;
1677 ll += lr;
1678 if(ll != 7){
1679 lrc = 74;
1680 if(prlc) printf(f,lrc);
1682 ll = 5; ur = 2;
1683 ll += ur;
1684 if(ll != 7){
1685 lrc = 75;
1686 if(prlc) printf(f,lrc);
1688 ll = 5; fr = 2;
1689 ll += fr;
1690 if(ll != 7){
1691 lrc = 76;
1692 if(prlc) printf(f,lrc);
1694 ll = 5; dr = 2;
1695 ll += dr;
1696 if(ll != 7){
1697 lrc = 77;
1698 if(prlc) printf(f,lrc);
1700 ul = 5; cr = 2;
1701 ul += cr;
1702 if(ul != 7){
1703 lrc = 78;
1704 if(prlc) printf(f,lrc);
1706 ul = 5; sr = 2;
1707 ul += sr;
1708 if(ul != 7){
1709 lrc = 79;
1710 if(prlc) printf(f,lrc);
1712 ul = 5; ir = 2;
1713 ul += ir;
1714 if(ul != 7){
1715 lrc = 80;
1716 if(prlc) printf(f,lrc);
1718 ul = 5; lr = 2;
1719 ul += lr;
1720 if(ul != 7){
1721 lrc = 81;
1722 if(prlc) printf(f,lrc);
1724 ul = 5; ur = 2;
1725 ul += ur;
1726 if(ul != 7){
1727 lrc = 82;
1728 if(prlc) printf(f,lrc);
1730 ul = 5; fr = 2;
1731 ul += fr;
1732 if(ul != 7){
1733 lrc = 83;
1734 if(prlc) printf(f,lrc);
1736 ul = 5; dr = 2;
1737 ul += dr;
1738 if(ul != 7){
1739 lrc = 84;
1740 if(prlc) printf(f,lrc);
1742 fl = 5; cr = 2;
1743 fl += cr;
1744 if(fl != 7){
1745 lrc = 85;
1746 if(prlc) printf(f,lrc);
1748 fl = 5; sr = 2;
1749 fl += sr;
1750 if(fl != 7){
1751 lrc = 86;
1752 if(prlc) printf(f,lrc);
1754 fl = 5; ir = 2;
1755 fl += ir;
1756 if(fl != 7){
1757 lrc = 87;
1758 if(prlc) printf(f,lrc);
1760 fl = 5; lr = 2;
1761 fl += lr;
1762 if(fl != 7){
1763 lrc = 88;
1764 if(prlc) printf(f,lrc);
1766 fl = 5; ur = 2;
1767 fl += ur;
1768 if(fl != 7){
1769 lrc = 89;
1770 if(prlc) printf(f,lrc);
1772 fl = 5; fr = 2;
1773 fl += fr;
1774 if(fl != 7){
1775 lrc = 90;
1776 if(prlc) printf(f,lrc);
1778 fl = 5; dr = 2;
1779 fl += dr;
1780 if(fl != 7){
1781 lrc = 91;
1782 if(prlc) printf(f,lrc);
1784 dl = 5; cr = 2;
1785 dl += cr;
1786 if(dl != 7){
1787 lrc = 92;
1788 if(prlc) printf(f,lrc);
1790 dl = 5; sr = 2;
1791 dl += sr;
1792 if(dl != 7){
1793 lrc = 93;
1794 if(prlc) printf(f,lrc);
1796 dl = 5; ir = 2;
1797 dl += ir;
1798 if(dl != 7){
1799 lrc = 94;
1800 if(prlc) printf(f,lrc);
1802 dl = 5; lr = 2;
1803 dl += lr;
1804 if(dl != 7){
1805 lrc = 95;
1806 if(prlc) printf(f,lrc);
1808 dl = 5; ur = 2;
1809 dl += ur;
1810 if(dl != 7){
1811 lrc = 96;
1812 if(prlc) printf(f,lrc);
1814 dl = 5; fr = 2;
1815 dl += fr;
1816 if(dl != 7){
1817 lrc = 97;
1818 if(prlc) printf(f,lrc);
1820 dl = 5; dr = 2;
1821 dl += dr;
1822 if(dl != 7){
1823 lrc = 98;
1824 if(prlc) printf(f,lrc);
1826 cl = 5; cr = 2;
1827 cl -= cr;
1828 if(cl != 3){
1829 lrc = 99;
1830 if(prlc) printf(f,lrc);
1832 cl = 5; sr = 2;
1833 cl -= sr;
1834 if(cl != 3){
1835 lrc = 100;
1836 if(prlc) printf(f,lrc);
1838 cl = 5; ir = 2;
1839 cl -= ir;
1840 if(cl != 3){
1841 lrc = 101;
1842 if(prlc) printf(f,lrc);
1844 cl = 5; lr = 2;
1845 cl -= lr;
1846 if(cl != 3){
1847 lrc = 102;
1848 if(prlc) printf(f,lrc);
1850 cl = 5; ur = 2;
1851 cl -= ur;
1852 if(cl != 3){
1853 lrc = 103;
1854 if(prlc) printf(f,lrc);
1856 cl = 5; fr = 2;
1857 cl -= fr;
1858 if(cl != 3){
1859 lrc = 104;
1860 if(prlc) printf(f,lrc);
1862 cl = 5; dr = 2;
1863 cl -= dr;
1864 if(cl != 3){
1865 lrc = 105;
1866 if(prlc) printf(f,lrc);
1868 sl = 5; cr = 2;
1869 sl -= cr;
1870 if(sl != 3){
1871 lrc = 106;
1872 if(prlc) printf(f,lrc);
1874 sl = 5; sr = 2;
1875 sl -= sr;
1876 if(sl != 3){
1877 lrc = 107;
1878 if(prlc) printf(f,lrc);
1880 sl = 5; ir = 2;
1881 sl -= ir;
1882 if(sl != 3){
1883 lrc = 108;
1884 if(prlc) printf(f,lrc);
1886 sl = 5; lr = 2;
1887 sl -= lr;
1888 if(sl != 3){
1889 lrc = 109;
1890 if(prlc) printf(f,lrc);
1892 sl = 5; ur = 2;
1893 sl -= ur;
1894 if(sl != 3){
1895 lrc = 110;
1896 if(prlc) printf(f,lrc);
1898 sl = 5; fr = 2;
1899 sl -= fr;
1900 if(sl != 3){
1901 lrc = 111;
1902 if(prlc) printf(f,lrc);
1904 sl = 5; dr = 2;
1905 sl -= dr;
1906 if(sl != 3){
1907 lrc = 112;
1908 if(prlc) printf(f,lrc);
1910 il = 5; cr = 2;
1911 il -= cr;
1912 if(il != 3){
1913 lrc = 113;
1914 if(prlc) printf(f,lrc);
1916 il = 5; sr = 2;
1917 il -= sr;
1918 if(il != 3){
1919 lrc = 114;
1920 if(prlc) printf(f,lrc);
1922 il = 5; ir = 2;
1923 il -= ir;
1924 if(il != 3){
1925 lrc = 115;
1926 if(prlc) printf(f,lrc);
1928 il = 5; lr = 2;
1929 il -= lr;
1930 if(il != 3){
1931 lrc = 116;
1932 if(prlc) printf(f,lrc);
1934 il = 5; ur = 2;
1935 il -= ur;
1936 if(il != 3){
1937 lrc = 117;
1938 if(prlc) printf(f,lrc);
1940 il = 5; fr = 2;
1941 il -= fr;
1942 if(il != 3){
1943 lrc = 118;
1944 if(prlc) printf(f,lrc);
1946 il = 5; dr = 2;
1947 il -= dr;
1948 if(il != 3){
1949 lrc = 119;
1950 if(prlc) printf(f,lrc);
1952 ll = 5; cr = 2;
1953 ll -= cr;
1954 if(ll != 3){
1955 lrc = 120;
1956 if(prlc) printf(f,lrc);
1958 ll = 5; sr = 2;
1959 ll -= sr;
1960 if(ll != 3){
1961 lrc = 121;
1962 if(prlc) printf(f,lrc);
1964 ll = 5; ir = 2;
1965 ll -= ir;
1966 if(ll != 3){
1967 lrc = 122;
1968 if(prlc) printf(f,lrc);
1970 ll = 5; lr = 2;
1971 ll -= lr;
1972 if(ll != 3){
1973 lrc = 123;
1974 if(prlc) printf(f,lrc);
1976 ll = 5; ur = 2;
1977 ll -= ur;
1978 if(ll != 3){
1979 lrc = 124;
1980 if(prlc) printf(f,lrc);
1982 ll = 5; fr = 2;
1983 ll -= fr;
1984 if(ll != 3){
1985 lrc = 125;
1986 if(prlc) printf(f,lrc);
1988 ll = 5; dr = 2;
1989 ll -= dr;
1990 if(ll != 3){
1991 lrc = 126;
1992 if(prlc) printf(f,lrc);
1994 ul = 5; cr = 2;
1995 ul -= cr;
1996 if(ul != 3){
1997 lrc = 127;
1998 if(prlc) printf(f,lrc);
2000 ul = 5; sr = 2;
2001 ul -= sr;
2002 if(ul != 3){
2003 lrc = 128;
2004 if(prlc) printf(f,lrc);
2006 ul = 5; ir = 2;
2007 ul -= ir;
2008 if(ul != 3){
2009 lrc = 129;
2010 if(prlc) printf(f,lrc);
2012 ul = 5; lr = 2;
2013 ul -= lr;
2014 if(ul != 3){
2015 lrc = 130;
2016 if(prlc) printf(f,lrc);
2018 ul = 5; ur = 2;
2019 ul -= ur;
2020 if(ul != 3){
2021 lrc = 131;
2022 if(prlc) printf(f,lrc);
2024 ul = 5; fr = 2;
2025 ul -= fr;
2026 if(ul != 3){
2027 lrc = 132;
2028 if(prlc) printf(f,lrc);
2030 ul = 5; dr = 2;
2031 ul -= dr;
2032 if(ul != 3){
2033 lrc = 133;
2034 if(prlc) printf(f,lrc);
2036 fl = 5; cr = 2;
2037 fl -= cr;
2038 if(fl != 3){
2039 lrc = 134;
2040 if(prlc) printf(f,lrc);
2042 fl = 5; sr = 2;
2043 fl -= sr;
2044 if(fl != 3){
2045 lrc = 135;
2046 if(prlc) printf(f,lrc);
2048 fl = 5; ir = 2;
2049 fl -= ir;
2050 if(fl != 3){
2051 lrc = 136;
2052 if(prlc) printf(f,lrc);
2054 fl = 5; lr = 2;
2055 fl -= lr;
2056 if(fl != 3){
2057 lrc = 137;
2058 if(prlc) printf(f,lrc);
2060 fl = 5; ur = 2;
2061 fl -= ur;
2062 if(fl != 3){
2063 lrc = 138;
2064 if(prlc) printf(f,lrc);
2066 fl = 5; fr = 2;
2067 fl -= fr;
2068 if(fl != 3){
2069 lrc = 139;
2070 if(prlc) printf(f,lrc);
2072 fl = 5; dr = 2;
2073 fl -= dr;
2074 if(fl != 3){
2075 lrc = 140;
2076 if(prlc) printf(f,lrc);
2078 dl = 5; cr = 2;
2079 dl -= cr;
2080 if(dl != 3){
2081 lrc = 141;
2082 if(prlc) printf(f,lrc);
2084 dl = 5; sr = 2;
2085 dl -= sr;
2086 if(dl != 3){
2087 lrc = 142;
2088 if(prlc) printf(f,lrc);
2090 dl = 5; ir = 2;
2091 dl -= ir;
2092 if(dl != 3){
2093 lrc = 143;
2094 if(prlc) printf(f,lrc);
2096 dl = 5; lr = 2;
2097 dl -= lr;
2098 if(dl != 3){
2099 lrc = 144;
2100 if(prlc) printf(f,lrc);
2102 dl = 5; ur = 2;
2103 dl -= ur;
2104 if(dl != 3){
2105 lrc = 145;
2106 if(prlc) printf(f,lrc);
2108 dl = 5; fr = 2;
2109 dl -= fr;
2110 if(dl != 3){
2111 lrc = 146;
2112 if(prlc) printf(f,lrc);
2114 dl = 5; dr = 2;
2115 dl -= dr;
2116 if(dl != 3){
2117 lrc = 147;
2118 if(prlc) printf(f,lrc);
2120 cl = 5; cr = 2;
2121 cl *= cr;
2122 if(cl != 10){
2123 lrc = 148;
2124 if(prlc) printf(f,lrc);
2126 cl = 5; sr = 2;
2127 cl *= sr;
2128 if(cl != 10){
2129 lrc = 149;
2130 if(prlc) printf(f,lrc);
2132 cl = 5; ir = 2;
2133 cl *= ir;
2134 if(cl != 10){
2135 lrc = 150;
2136 if(prlc) printf(f,lrc);
2138 cl = 5; lr = 2;
2139 cl *= lr;
2140 if(cl != 10){
2141 lrc = 151;
2142 if(prlc) printf(f,lrc);
2144 cl = 5; ur = 2;
2145 cl *= ur;
2146 if(cl != 10){
2147 lrc = 152;
2148 if(prlc) printf(f,lrc);
2150 cl = 5; fr = 2;
2151 cl *= fr;
2152 if(cl != 10){
2153 lrc = 153;
2154 if(prlc) printf(f,lrc);
2156 cl = 5; dr = 2;
2157 cl *= dr;
2158 if(cl != 10){
2159 lrc = 154;
2160 if(prlc) printf(f,lrc);
2162 sl = 5; cr = 2;
2163 sl *= cr;
2164 if(sl != 10){
2165 lrc = 155;
2166 if(prlc) printf(f,lrc);
2168 sl = 5; sr = 2;
2169 sl *= sr;
2170 if(sl != 10){
2171 lrc = 156;
2172 if(prlc) printf(f,lrc);
2174 sl = 5; ir = 2;
2175 sl *= ir;
2176 if(sl != 10){
2177 lrc = 157;
2178 if(prlc) printf(f,lrc);
2180 sl = 5; lr = 2;
2181 sl *= lr;
2182 if(sl != 10){
2183 lrc = 158;
2184 if(prlc) printf(f,lrc);
2186 sl = 5; ur = 2;
2187 sl *= ur;
2188 if(sl != 10){
2189 lrc = 159;
2190 if(prlc) printf(f,lrc);
2192 sl = 5; fr = 2;
2193 sl *= fr;
2194 if(sl != 10){
2195 lrc = 160;
2196 if(prlc) printf(f,lrc);
2198 sl = 5; dr = 2;
2199 sl *= dr;
2200 if(sl != 10){
2201 lrc = 161;
2202 if(prlc) printf(f,lrc);
2204 il = 5; cr = 2;
2205 il *= cr;
2206 if(il != 10){
2207 lrc = 162;
2208 if(prlc) printf(f,lrc);
2210 il = 5; sr = 2;
2211 il *= sr;
2212 if(il != 10){
2213 lrc = 163;
2214 if(prlc) printf(f,lrc);
2216 il = 5; ir = 2;
2217 il *= ir;
2218 if(il != 10){
2219 lrc = 164;
2220 if(prlc) printf(f,lrc);
2222 il = 5; lr = 2;
2223 il *= lr;
2224 if(il != 10){
2225 lrc = 165;
2226 if(prlc) printf(f,lrc);
2228 il = 5; ur = 2;
2229 il *= ur;
2230 if(il != 10){
2231 lrc = 166;
2232 if(prlc) printf(f,lrc);
2234 il = 5; fr = 2;
2235 il *= fr;
2236 if(il != 10){
2237 lrc = 167;
2238 if(prlc) printf(f,lrc);
2240 il = 5; dr = 2;
2241 il *= dr;
2242 if(il != 10){
2243 lrc = 168;
2244 if(prlc) printf(f,lrc);
2246 ll = 5; cr = 2;
2247 ll *= cr;
2248 if(ll != 10){
2249 lrc = 169;
2250 if(prlc) printf(f,lrc);
2252 ll = 5; sr = 2;
2253 ll *= sr;
2254 if(ll != 10){
2255 lrc = 170;
2256 if(prlc) printf(f,lrc);
2258 ll = 5; ir = 2;
2259 ll *= ir;
2260 if(ll != 10){
2261 lrc = 171;
2262 if(prlc) printf(f,lrc);
2264 ll = 5; lr = 2;
2265 ll *= lr;
2266 if(ll != 10){
2267 lrc = 172;
2268 if(prlc) printf(f,lrc);
2270 ll = 5; ur = 2;
2271 ll *= ur;
2272 if(ll != 10){
2273 lrc = 173;
2274 if(prlc) printf(f,lrc);
2276 ll = 5; fr = 2;
2277 ll *= fr;
2278 if(ll != 10){
2279 lrc = 174;
2280 if(prlc) printf(f,lrc);
2282 ll = 5; dr = 2;
2283 ll *= dr;
2284 if(ll != 10){
2285 lrc = 175;
2286 if(prlc) printf(f,lrc);
2288 ul = 5; cr = 2;
2289 ul *= cr;
2290 if(ul != 10){
2291 lrc = 176;
2292 if(prlc) printf(f,lrc);
2294 ul = 5; sr = 2;
2295 ul *= sr;
2296 if(ul != 10){
2297 lrc = 177;
2298 if(prlc) printf(f,lrc);
2300 ul = 5; ir = 2;
2301 ul *= ir;
2302 if(ul != 10){
2303 lrc = 178;
2304 if(prlc) printf(f,lrc);
2306 ul = 5; lr = 2;
2307 ul *= lr;
2308 if(ul != 10){
2309 lrc = 179;
2310 if(prlc) printf(f,lrc);
2312 ul = 5; ur = 2;
2313 ul *= ur;
2314 if(ul != 10){
2315 lrc = 180;
2316 if(prlc) printf(f,lrc);
2318 ul = 5; fr = 2;
2319 ul *= fr;
2320 if(ul != 10){
2321 lrc = 181;
2322 if(prlc) printf(f,lrc);
2324 ul = 5; dr = 2;
2325 ul *= dr;
2326 if(ul != 10){
2327 lrc = 182;
2328 if(prlc) printf(f,lrc);
2330 fl = 5; cr = 2;
2331 fl *= cr;
2332 if(fl != 10){
2333 lrc = 183;
2334 if(prlc) printf(f,lrc);
2336 fl = 5; sr = 2;
2337 fl *= sr;
2338 if(fl != 10){
2339 lrc = 184;
2340 if(prlc) printf(f,lrc);
2342 fl = 5; ir = 2;
2343 fl *= ir;
2344 if(fl != 10){
2345 lrc = 185;
2346 if(prlc) printf(f,lrc);
2348 fl = 5; lr = 2;
2349 fl *= lr;
2350 if(fl != 10){
2351 lrc = 186;
2352 if(prlc) printf(f,lrc);
2354 fl = 5; ur = 2;
2355 fl *= ur;
2356 if(fl != 10){
2357 lrc = 187;
2358 if(prlc) printf(f,lrc);
2360 fl = 5; fr = 2;
2361 fl *= fr;
2362 if(fl != 10){
2363 lrc = 188;
2364 if(prlc) printf(f,lrc);
2366 fl = 5; dr = 2;
2367 fl *= dr;
2368 if(fl != 10){
2369 lrc = 189;
2370 if(prlc) printf(f,lrc);
2372 dl = 5; cr = 2;
2373 dl *= cr;
2374 if(dl != 10){
2375 lrc = 190;
2376 if(prlc) printf(f,lrc);
2378 dl = 5; sr = 2;
2379 dl *= sr;
2380 if(dl != 10){
2381 lrc = 191;
2382 if(prlc) printf(f,lrc);
2384 dl = 5; ir = 2;
2385 dl *= ir;
2386 if(dl != 10){
2387 lrc = 192;
2388 if(prlc) printf(f,lrc);
2390 dl = 5; lr = 2;
2391 dl *= lr;
2392 if(dl != 10){
2393 lrc = 193;
2394 if(prlc) printf(f,lrc);
2396 dl = 5; ur = 2;
2397 dl *= ur;
2398 if(dl != 10){
2399 lrc = 194;
2400 if(prlc) printf(f,lrc);
2402 dl = 5; fr = 2;
2403 dl *= fr;
2404 if(dl != 10){
2405 lrc = 195;
2406 if(prlc) printf(f,lrc);
2408 dl = 5; dr = 2;
2409 dl *= dr;
2410 if(dl != 10){
2411 lrc = 196;
2412 if(prlc) printf(f,lrc);
2414 cl = 5; cr = 2;
2415 cl /= cr;
2416 if(cl != 2){
2417 lrc = 197;
2418 if(prlc) printf(f,lrc);
2420 cl = 5; sr = 2;
2421 cl /= sr;
2422 if(cl != 2){
2423 lrc = 198;
2424 if(prlc) printf(f,lrc);
2426 cl = 5; ir = 2;
2427 cl /= ir;
2428 if(cl != 2){
2429 lrc = 199;
2430 if(prlc) printf(f,lrc);
2432 cl = 5; lr = 2;
2433 cl /= lr;
2434 if(cl != 2){
2435 lrc = 200;
2436 if(prlc) printf(f,lrc);
2438 cl = 5; ur = 2;
2439 cl /= ur;
2440 if(cl != 2){
2441 lrc = 201;
2442 if(prlc) printf(f,lrc);
2444 cl = 5; fr = 2;
2445 cl /= fr;
2446 if(cl != 2){
2447 lrc = 202;
2448 if(prlc) printf(f,lrc);
2450 cl = 5; dr = 2;
2451 cl /= dr;
2452 if(cl != 2){
2453 lrc = 203;
2454 if(prlc) printf(f,lrc);
2456 sl = 5; cr = 2;
2457 sl /= cr;
2458 if(sl != 2){
2459 lrc = 204;
2460 if(prlc) printf(f,lrc);
2462 sl = 5; sr = 2;
2463 sl /= sr;
2464 if(sl != 2){
2465 lrc = 205;
2466 if(prlc) printf(f,lrc);
2468 sl = 5; ir = 2;
2469 sl /= ir;
2470 if(sl != 2){
2471 lrc = 206;
2472 if(prlc) printf(f,lrc);
2474 sl = 5; lr = 2;
2475 sl /= lr;
2476 if(sl != 2){
2477 lrc = 207;
2478 if(prlc) printf(f,lrc);
2480 sl = 5; ur = 2;
2481 sl /= ur;
2482 if(sl != 2){
2483 lrc = 208;
2484 if(prlc) printf(f,lrc);
2486 sl = 5; fr = 2;
2487 sl /= fr;
2488 if(sl != 2){
2489 lrc = 209;
2490 if(prlc) printf(f,lrc);
2492 sl = 5; dr = 2;
2493 sl /= dr;
2494 if(sl != 2){
2495 lrc = 210;
2496 if(prlc) printf(f,lrc);
2498 il = 5; cr = 2;
2499 il /= cr;
2500 if(il != 2){
2501 lrc = 211;
2502 if(prlc) printf(f,lrc);
2504 il = 5; sr = 2;
2505 il /= sr;
2506 if(il != 2){
2507 lrc = 212;
2508 if(prlc) printf(f,lrc);
2510 il = 5; ir = 2;
2511 il /= ir;
2512 if(il != 2){
2513 lrc = 213;
2514 if(prlc) printf(f,lrc);
2516 il = 5; lr = 2;
2517 il /= lr;
2518 if(il != 2){
2519 lrc = 214;
2520 if(prlc) printf(f,lrc);
2522 il = 5; ur = 2;
2523 il /= ur;
2524 if(il != 2){
2525 lrc = 215;
2526 if(prlc) printf(f,lrc);
2528 il = 5; fr = 2;
2529 il /= fr;
2530 if(il != 2){
2531 lrc = 216;
2532 if(prlc) printf(f,lrc);
2534 il = 5; dr = 2;
2535 il /= dr;
2536 if(il != 2){
2537 lrc = 217;
2538 if(prlc) printf(f,lrc);
2540 ll = 5; cr = 2;
2541 ll /= cr;
2542 if(ll != 2){
2543 lrc = 218;
2544 if(prlc) printf(f,lrc);
2546 ll = 5; sr = 2;
2547 ll /= sr;
2548 if(ll != 2){
2549 lrc = 219;
2550 if(prlc) printf(f,lrc);
2552 ll = 5; ir = 2;
2553 ll /= ir;
2554 if(ll != 2){
2555 lrc = 220;
2556 if(prlc) printf(f,lrc);
2558 ll = 5; lr = 2;
2559 ll /= lr;
2560 if(ll != 2){
2561 lrc = 221;
2562 if(prlc) printf(f,lrc);
2564 ll = 5; ur = 2;
2565 ll /= ur;
2566 if(ll != 2){
2567 lrc = 222;
2568 if(prlc) printf(f,lrc);
2570 ll = 5; fr = 2;
2571 ll /= fr;
2572 if(ll != 2){
2573 lrc = 223;
2574 if(prlc) printf(f,lrc);
2576 ll = 5; dr = 2;
2577 ll /= dr;
2578 if(ll != 2){
2579 lrc = 224;
2580 if(prlc) printf(f,lrc);
2582 ul = 5; cr = 2;
2583 ul /= cr;
2584 if(ul != 2){
2585 lrc = 225;
2586 if(prlc) printf(f,lrc);
2588 ul = 5; sr = 2;
2589 ul /= sr;
2590 if(ul != 2){
2591 lrc = 226;
2592 if(prlc) printf(f,lrc);
2594 ul = 5; ir = 2;
2595 ul /= ir;
2596 if(ul != 2){
2597 lrc = 227;
2598 if(prlc) printf(f,lrc);
2600 ul = 5; lr = 2;
2601 ul /= lr;
2602 if(ul != 2){
2603 lrc = 228;
2604 if(prlc) printf(f,lrc);
2606 ul = 5; ur = 2;
2607 ul /= ur;
2608 if(ul != 2){
2609 lrc = 229;
2610 if(prlc) printf(f,lrc);
2612 ul = 5; fr = 2;
2613 ul /= fr;
2614 if(ul != 2){
2615 lrc = 230;
2616 if(prlc) printf(f,lrc);
2618 ul = 5; dr = 2;
2619 ul /= dr;
2620 if(ul != 2){
2621 lrc = 231;
2622 if(prlc) printf(f,lrc);
2624 fl = 5; cr = 2;
2625 fl /= cr;
2626 if(fl != 2.5){
2627 lrc = 232;
2628 if(prlc) printf(f,lrc);
2630 fl = 5; sr = 2;
2631 fl /= sr;
2632 if(fl != 2.5){
2633 lrc = 233;
2634 if(prlc) printf(f,lrc);
2636 fl = 5; ir = 2;
2637 fl /= ir;
2638 if(fl != 2.5){
2639 lrc = 234;
2640 if(prlc) printf(f,lrc);
2642 fl = 5; lr = 2;
2643 fl /= lr;
2644 if(fl != 2.5){
2645 lrc = 235;
2646 if(prlc) printf(f,lrc);
2648 fl = 5; ur = 2;
2649 fl /= ur;
2650 if(fl != 2.5){
2651 lrc = 236;
2652 if(prlc) printf(f,lrc);
2654 fl = 5; fr = 2;
2655 fl /= fr;
2656 if(fl != 2.5){
2657 lrc = 237;
2658 if(prlc) printf(f,lrc);
2660 fl = 5; dr = 2;
2661 fl /= dr;
2662 if(fl != 2.5){
2663 lrc = 238;
2664 if(prlc) printf(f,lrc);
2666 dl = 5; cr = 2;
2667 dl /= cr;
2668 if(dl != 2.5){
2669 lrc = 239;
2670 if(prlc) printf(f,lrc);
2672 dl = 5; sr = 2;
2673 dl /= sr;
2674 if(dl != 2.5){
2675 lrc = 240;
2676 if(prlc) printf(f,lrc);
2678 dl = 5; ir = 2;
2679 dl /= ir;
2680 if(dl != 2.5){
2681 lrc = 241;
2682 if(prlc) printf(f,lrc);
2684 dl = 5; lr = 2;
2685 dl /= lr;
2686 if(dl != 2.5){
2687 lrc = 242;
2688 if(prlc) printf(f,lrc);
2690 dl = 5; ur = 2;
2691 dl /= ur;
2692 if(dl != 2.5){
2693 lrc = 243;
2694 if(prlc) printf(f,lrc);
2696 dl = 5; fr = 2;
2697 dl /= fr;
2698 if(dl != 2.5){
2699 lrc = 244;
2700 if(prlc) printf(f,lrc);
2702 dl = 5; dr = 2;
2703 dl /= dr;
2704 if(dl != 2.5){
2705 lrc = 245;
2706 if(prlc) printf(f,lrc);
2708 cl = 5; cr = 2;
2709 cl %= cr;
2710 if(cl != 1){
2711 lrc = 246;
2712 if(prlc) printf(f,lrc);
2714 cl = 5; sr = 2;
2715 cl %= sr;
2716 if(cl != 1){
2717 lrc = 247;
2718 if(prlc) printf(f,lrc);
2720 cl = 5; ir = 2;
2721 cl %= ir;
2722 if(cl != 1){
2723 lrc = 248;
2724 if(prlc) printf(f,lrc);
2726 cl = 5; lr = 2;
2727 cl %= lr;
2728 if(cl != 1){
2729 lrc = 249;
2730 if(prlc) printf(f,lrc);
2732 cl = 5; ur = 2;
2733 cl %= ur;
2734 if(cl != 1){
2735 lrc = 250;
2736 if(prlc) printf(f,lrc);
2738 sl = 5; cr = 2;
2739 sl %= cr;
2740 if(sl != 1){
2741 lrc = 251;
2742 if(prlc) printf(f,lrc);
2744 sl = 5; sr = 2;
2745 sl %= sr;
2746 if(sl != 1){
2747 lrc = 252;
2748 if(prlc) printf(f,lrc);
2750 sl = 5; ir = 2;
2751 sl %= ir;
2752 if(sl != 1){
2753 lrc = 253;
2754 if(prlc) printf(f,lrc);
2756 sl = 5; lr = 2;
2757 sl %= lr;
2758 if(sl != 1){
2759 lrc = 254;
2760 if(prlc) printf(f,lrc);
2762 sl = 5; ur = 2;
2763 sl %= ur;
2764 if(sl != 1){
2765 lrc = 255;
2766 if(prlc) printf(f,lrc);
2768 il = 5; cr = 2;
2769 il %= cr;
2770 if(il != 1){
2771 lrc = 256;
2772 if(prlc) printf(f,lrc);
2774 il = 5; sr = 2;
2775 il %= sr;
2776 if(il != 1){
2777 lrc = 257;
2778 if(prlc) printf(f,lrc);
2780 il = 5; ir = 2;
2781 il %= ir;
2782 if(il != 1){
2783 lrc = 258;
2784 if(prlc) printf(f,lrc);
2786 il = 5; lr = 2;
2787 il %= lr;
2788 if(il != 1){
2789 lrc = 259;
2790 if(prlc) printf(f,lrc);
2792 il = 5; ur = 2;
2793 il %= ur;
2794 if(il != 1){
2795 lrc = 260;
2796 if(prlc) printf(f,lrc);
2798 ll = 5; cr = 2;
2799 ll %= cr;
2800 if(ll != 1){
2801 lrc = 261;
2802 if(prlc) printf(f,lrc);
2804 ll = 5; sr = 2;
2805 ll %= sr;
2806 if(ll != 1){
2807 lrc = 262;
2808 if(prlc) printf(f,lrc);
2810 ll = 5; ir = 2;
2811 ll %= ir;
2812 if(ll != 1){
2813 lrc = 263;
2814 if(prlc) printf(f,lrc);
2816 ll = 5; lr = 2;
2817 ll %= lr;
2818 if(ll != 1){
2819 lrc = 264;
2820 if(prlc) printf(f,lrc);
2822 ll = 5; ur = 2;
2823 ll %= ur;
2824 if(ll != 1){
2825 lrc = 265;
2826 if(prlc) printf(f,lrc);
2828 ul = 5; cr = 2;
2829 ul %= cr;
2830 if(ul != 1){
2831 lrc = 266;
2832 if(prlc) printf(f,lrc);
2834 ul = 5; sr = 2;
2835 ul %= sr;
2836 if(ul != 1){
2837 lrc = 267;
2838 if(prlc) printf(f,lrc);
2840 ul = 5; ir = 2;
2841 ul %= ir;
2842 if(ul != 1){
2843 lrc = 268;
2844 if(prlc) printf(f,lrc);
2846 ul = 5; lr = 2;
2847 ul %= lr;
2848 if(ul != 1){
2849 lrc = 269;
2850 if(prlc) printf(f,lrc);
2852 ul = 5; ur = 2;
2853 ul %= ur;
2854 if(ul != 1){
2855 lrc = 270;
2856 if(prlc) printf(f,lrc);
2858 cl = 5; cr = 2;
2859 cl >>= cr;
2860 if(cl != 1){
2861 lrc = 271;
2862 if(prlc) printf(f,lrc);
2864 cl = 5; sr = 2;
2865 cl >>= sr;
2866 if(cl != 1){
2867 lrc = 272;
2868 if(prlc) printf(f,lrc);
2870 cl = 5; ir = 2;
2871 cl >>= ir;
2872 if(cl != 1){
2873 lrc = 273;
2874 if(prlc) printf(f,lrc);
2876 cl = 5; lr = 2;
2877 cl >>= lr;
2878 if(cl != 1){
2879 lrc = 274;
2880 if(prlc) printf(f,lrc);
2882 cl = 5; ur = 2;
2883 cl >>= ur;
2884 if(cl != 1){
2885 lrc = 275;
2886 if(prlc) printf(f,lrc);
2888 sl = 5; cr = 2;
2889 sl >>= cr;
2890 if(sl != 1){
2891 lrc = 276;
2892 if(prlc) printf(f,lrc);
2894 sl = 5; sr = 2;
2895 sl >>= sr;
2896 if(sl != 1){
2897 lrc = 277;
2898 if(prlc) printf(f,lrc);
2900 sl = 5; ir = 2;
2901 sl >>= ir;
2902 if(sl != 1){
2903 lrc = 278;
2904 if(prlc) printf(f,lrc);
2906 sl = 5; lr = 2;
2907 sl >>= lr;
2908 if(sl != 1){
2909 lrc = 279;
2910 if(prlc) printf(f,lrc);
2912 sl = 5; ur = 2;
2913 sl >>= ur;
2914 if(sl != 1){
2915 lrc = 280;
2916 if(prlc) printf(f,lrc);
2918 il = 5; cr = 2;
2919 il >>= cr;
2920 if(il != 1){
2921 lrc = 281;
2922 if(prlc) printf(f,lrc);
2924 il = 5; sr = 2;
2925 il >>= sr;
2926 if(il != 1){
2927 lrc = 282;
2928 if(prlc) printf(f,lrc);
2930 il = 5; ir = 2;
2931 il >>= ir;
2932 if(il != 1){
2933 lrc = 283;
2934 if(prlc) printf(f,lrc);
2936 il = 5; lr = 2;
2937 il >>= lr;
2938 if(il != 1){
2939 lrc = 284;
2940 if(prlc) printf(f,lrc);
2942 il = 5; ur = 2;
2943 il >>= ur;
2944 if(il != 1){
2945 lrc = 285;
2946 if(prlc) printf(f,lrc);
2948 ll = 5; cr = 2;
2949 ll >>= cr;
2950 if(ll != 1){
2951 lrc = 286;
2952 if(prlc) printf(f,lrc);
2954 ll = 5; sr = 2;
2955 ll >>= sr;
2956 if(ll != 1){
2957 lrc = 287;
2958 if(prlc) printf(f,lrc);
2960 ll = 5; ir = 2;
2961 ll >>= ir;
2962 if(ll != 1){
2963 lrc = 288;
2964 if(prlc) printf(f,lrc);
2966 ll = 5; lr = 2;
2967 ll >>= lr;
2968 if(ll != 1){
2969 lrc = 289;
2970 if(prlc) printf(f,lrc);
2972 ll = 5; ur = 2;
2973 ll >>= ur;
2974 if(ll != 1){
2975 lrc = 290;
2976 if(prlc) printf(f,lrc);
2978 ul = 5; cr = 2;
2979 ul >>= cr;
2980 if(ul != 1){
2981 lrc = 291;
2982 if(prlc) printf(f,lrc);
2984 ul = 5; sr = 2;
2985 ul >>= sr;
2986 if(ul != 1){
2987 lrc = 292;
2988 if(prlc) printf(f,lrc);
2990 ul = 5; ir = 2;
2991 ul >>= ir;
2992 if(ul != 1){
2993 lrc = 293;
2994 if(prlc) printf(f,lrc);
2996 ul = 5; lr = 2;
2997 ul >>= lr;
2998 if(ul != 1){
2999 lrc = 294;
3000 if(prlc) printf(f,lrc);
3002 ul = 5; ur = 2;
3003 ul >>= ur;
3004 if(ul != 1){
3005 lrc = 295;
3006 if(prlc) printf(f,lrc);
3008 cl = 5; cr = 2;
3009 cl <<= cr;
3010 if(cl != 20){
3011 lrc = 296;
3012 if(prlc) printf(f,lrc);
3014 cl = 5; sr = 2;
3015 cl <<= sr;
3016 if(cl != 20){
3017 lrc = 297;
3018 if(prlc) printf(f,lrc);
3020 cl = 5; ir = 2;
3021 cl <<= ir;
3022 if(cl != 20){
3023 lrc = 298;
3024 if(prlc) printf(f,lrc);
3026 cl = 5; lr = 2;
3027 cl <<= lr;
3028 if(cl != 20){
3029 lrc = 299;
3030 if(prlc) printf(f,lrc);
3032 cl = 5; ur = 2;
3033 cl <<= ur;
3034 if(cl != 20){
3035 lrc = 300;
3036 if(prlc) printf(f,lrc);
3038 sl = 5; cr = 2;
3039 sl <<= cr;
3040 if(sl != 20){
3041 lrc = 301;
3042 if(prlc) printf(f,lrc);
3044 sl = 5; sr = 2;
3045 sl <<= sr;
3046 if(sl != 20){
3047 lrc = 302;
3048 if(prlc) printf(f,lrc);
3050 sl = 5; ir = 2;
3051 sl <<= ir;
3052 if(sl != 20){
3053 lrc = 303;
3054 if(prlc) printf(f,lrc);
3056 sl = 5; lr = 2;
3057 sl <<= lr;
3058 if(sl != 20){
3059 lrc = 304;
3060 if(prlc) printf(f,lrc);
3062 sl = 5; ur = 2;
3063 sl <<= ur;
3064 if(sl != 20){
3065 lrc = 305;
3066 if(prlc) printf(f,lrc);
3068 il = 5; cr = 2;
3069 il <<= cr;
3070 if(il != 20){
3071 lrc = 306;
3072 if(prlc) printf(f,lrc);
3074 il = 5; sr = 2;
3075 il <<= sr;
3076 if(il != 20){
3077 lrc = 307;
3078 if(prlc) printf(f,lrc);
3080 il = 5; ir = 2;
3081 il <<= ir;
3082 if(il != 20){
3083 lrc = 308;
3084 if(prlc) printf(f,lrc);
3086 il = 5; lr = 2;
3087 il <<= lr;
3088 if(il != 20){
3089 lrc = 309;
3090 if(prlc) printf(f,lrc);
3092 il = 5; ur = 2;
3093 il <<= ur;
3094 if(il != 20){
3095 lrc = 310;
3096 if(prlc) printf(f,lrc);
3098 ll = 5; cr = 2;
3099 ll <<= cr;
3100 if(ll != 20){
3101 lrc = 311;
3102 if(prlc) printf(f,lrc);
3104 ll = 5; sr = 2;
3105 ll <<= sr;
3106 if(ll != 20){
3107 lrc = 312;
3108 if(prlc) printf(f,lrc);
3110 ll = 5; ir = 2;
3111 ll <<= ir;
3112 if(ll != 20){
3113 lrc = 313;
3114 if(prlc) printf(f,lrc);
3116 ll = 5; lr = 2;
3117 ll <<= lr;
3118 if(ll != 20){
3119 lrc = 314;
3120 if(prlc) printf(f,lrc);
3122 ll = 5; ur = 2;
3123 ll <<= ur;
3124 if(ll != 20){
3125 lrc = 315;
3126 if(prlc) printf(f,lrc);
3128 ul = 5; cr = 2;
3129 ul <<= cr;
3130 if(ul != 20){
3131 lrc = 316;
3132 if(prlc) printf(f,lrc);
3134 ul = 5; sr = 2;
3135 ul <<= sr;
3136 if(ul != 20){
3137 lrc = 317;
3138 if(prlc) printf(f,lrc);
3140 ul = 5; ir = 2;
3141 ul <<= ir;
3142 if(ul != 20){
3143 lrc = 318;
3144 if(prlc) printf(f,lrc);
3146 ul = 5; lr = 2;
3147 ul <<= lr;
3148 if(ul != 20){
3149 lrc = 319;
3150 if(prlc) printf(f,lrc);
3152 ul = 5; ur = 2;
3153 ul <<= ur;
3154 if(ul != 20){
3155 lrc = 320;
3156 if(prlc) printf(f,lrc);
3158 cl = 12; cr = 10;
3159 cl &= cr;
3160 if(cl != 8){
3161 lrc = 321;
3162 if(prlc) printf(f,lrc);
3164 cl = 12; sr = 10;
3165 cl &= sr;
3166 if(cl != 8){
3167 lrc = 322;
3168 if(prlc) printf(f,lrc);
3170 cl = 12; ir = 10;
3171 cl &= ir;
3172 if(cl != 8){
3173 lrc = 323;
3174 if(prlc) printf(f,lrc);
3176 cl = 12; lr = 10;
3177 cl &= lr;
3178 if(cl != 8){
3179 lrc = 324;
3180 if(prlc) printf(f,lrc);
3182 cl = 12; ur = 10;
3183 cl &= ur;
3184 if(cl != 8){
3185 lrc = 325;
3186 if(prlc) printf(f,lrc);
3188 sl = 12; cr = 10;
3189 sl &= cr;
3190 if(sl != 8){
3191 lrc = 326;
3192 if(prlc) printf(f,lrc);
3194 sl = 12; sr = 10;
3195 sl &= sr;
3196 if(sl != 8){
3197 lrc = 327;
3198 if(prlc) printf(f,lrc);
3200 sl = 12; ir = 10;
3201 sl &= ir;
3202 if(sl != 8){
3203 lrc = 328;
3204 if(prlc) printf(f,lrc);
3206 sl = 12; lr = 10;
3207 sl &= lr;
3208 if(sl != 8){
3209 lrc = 329;
3210 if(prlc) printf(f,lrc);
3212 sl = 12; ur = 10;
3213 sl &= ur;
3214 if(sl != 8){
3215 lrc = 330;
3216 if(prlc) printf(f,lrc);
3218 il = 12; cr = 10;
3219 il &= cr;
3220 if(il != 8){
3221 lrc = 331;
3222 if(prlc) printf(f,lrc);
3224 il = 12; sr = 10;
3225 il &= sr;
3226 if(il != 8){
3227 lrc = 332;
3228 if(prlc) printf(f,lrc);
3230 il = 12; ir = 10;
3231 il &= ir;
3232 if(il != 8){
3233 lrc = 333;
3234 if(prlc) printf(f,lrc);
3236 il = 12; lr = 10;
3237 il &= lr;
3238 if(il != 8){
3239 lrc = 334;
3240 if(prlc) printf(f,lrc);
3242 il = 12; ur = 10;
3243 il &= ur;
3244 if(il != 8){
3245 lrc = 335;
3246 if(prlc) printf(f,lrc);
3248 ll = 12; cr = 10;
3249 ll &= cr;
3250 if(ll != 8){
3251 lrc = 336;
3252 if(prlc) printf(f,lrc);
3254 ll = 12; sr = 10;
3255 ll &= sr;
3256 if(ll != 8){
3257 lrc = 337;
3258 if(prlc) printf(f,lrc);
3260 ll = 12; ir = 10;
3261 ll &= ir;
3262 if(ll != 8){
3263 lrc = 338;
3264 if(prlc) printf(f,lrc);
3266 ll = 12; lr = 10;
3267 ll &= lr;
3268 if(ll != 8){
3269 lrc = 339;
3270 if(prlc) printf(f,lrc);
3272 ll = 12; ur = 10;
3273 ll &= ur;
3274 if(ll != 8){
3275 lrc = 340;
3276 if(prlc) printf(f,lrc);
3278 ul = 12; cr = 10;
3279 ul &= cr;
3280 if(ul != 8){
3281 lrc = 341;
3282 if(prlc) printf(f,lrc);
3284 ul = 12; sr = 10;
3285 ul &= sr;
3286 if(ul != 8){
3287 lrc = 342;
3288 if(prlc) printf(f,lrc);
3290 ul = 12; ir = 10;
3291 ul &= ir;
3292 if(ul != 8){
3293 lrc = 343;
3294 if(prlc) printf(f,lrc);
3296 ul = 12; lr = 10;
3297 ul &= lr;
3298 if(ul != 8){
3299 lrc = 344;
3300 if(prlc) printf(f,lrc);
3302 ul = 12; ur = 10;
3303 ul &= ur;
3304 if(ul != 8){
3305 lrc = 345;
3306 if(prlc) printf(f,lrc);
3308 cl = 12; cr = 10;
3309 cl ^= cr;
3310 if(cl != 6){
3311 lrc = 346;
3312 if(prlc) printf(f,lrc);
3314 cl = 12; sr = 10;
3315 cl ^= sr;
3316 if(cl != 6){
3317 lrc = 347;
3318 if(prlc) printf(f,lrc);
3320 cl = 12; ir = 10;
3321 cl ^= ir;
3322 if(cl != 6){
3323 lrc = 348;
3324 if(prlc) printf(f,lrc);
3326 cl = 12; lr = 10;
3327 cl ^= lr;
3328 if(cl != 6){
3329 lrc = 349;
3330 if(prlc) printf(f,lrc);
3332 cl = 12; ur = 10;
3333 cl ^= ur;
3334 if(cl != 6){
3335 lrc = 350;
3336 if(prlc) printf(f,lrc);
3338 sl = 12; cr = 10;
3339 sl ^= cr;
3340 if(sl != 6){
3341 lrc = 351;
3342 if(prlc) printf(f,lrc);
3344 sl = 12; sr = 10;
3345 sl ^= sr;
3346 if(sl != 6){
3347 lrc = 352;
3348 if(prlc) printf(f,lrc);
3350 sl = 12; ir = 10;
3351 sl ^= ir;
3352 if(sl != 6){
3353 lrc = 353;
3354 if(prlc) printf(f,lrc);
3356 sl = 12; lr = 10;
3357 sl ^= lr;
3358 if(sl != 6){
3359 lrc = 354;
3360 if(prlc) printf(f,lrc);
3362 sl = 12; ur = 10;
3363 sl ^= ur;
3364 if(sl != 6){
3365 lrc = 355;
3366 if(prlc) printf(f,lrc);
3368 il = 12; cr = 10;
3369 il ^= cr;
3370 if(il != 6){
3371 lrc = 356;
3372 if(prlc) printf(f,lrc);
3374 il = 12; sr = 10;
3375 il ^= sr;
3376 if(il != 6){
3377 lrc = 357;
3378 if(prlc) printf(f,lrc);
3380 il = 12; ir = 10;
3381 il ^= ir;
3382 if(il != 6){
3383 lrc = 358;
3384 if(prlc) printf(f,lrc);
3386 il = 12; lr = 10;
3387 il ^= lr;
3388 if(il != 6){
3389 lrc = 359;
3390 if(prlc) printf(f,lrc);
3392 il = 12; ur = 10;
3393 il ^= ur;
3394 if(il != 6){
3395 lrc = 360;
3396 if(prlc) printf(f,lrc);
3398 ll = 12; cr = 10;
3399 ll ^= cr;
3400 if(ll != 6){
3401 lrc = 361;
3402 if(prlc) printf(f,lrc);
3404 ll = 12; sr = 10;
3405 ll ^= sr;
3406 if(ll != 6){
3407 lrc = 362;
3408 if(prlc) printf(f,lrc);
3410 ll = 12; ir = 10;
3411 ll ^= ir;
3412 if(ll != 6){
3413 lrc = 363;
3414 if(prlc) printf(f,lrc);
3416 ll = 12; lr = 10;
3417 ll ^= lr;
3418 if(ll != 6){
3419 lrc = 364;
3420 if(prlc) printf(f,lrc);
3422 ll = 12; ur = 10;
3423 ll ^= ur;
3424 if(ll != 6){
3425 lrc = 365;
3426 if(prlc) printf(f,lrc);
3428 ul = 12; cr = 10;
3429 ul ^= cr;
3430 if(ul != 6){
3431 lrc = 366;
3432 if(prlc) printf(f,lrc);
3434 ul = 12; sr = 10;
3435 ul ^= sr;
3436 if(ul != 6){
3437 lrc = 367;
3438 if(prlc) printf(f,lrc);
3440 ul = 12; ir = 10;
3441 ul ^= ir;
3442 if(ul != 6){
3443 lrc = 368;
3444 if(prlc) printf(f,lrc);
3446 ul = 12; lr = 10;
3447 ul ^= lr;
3448 if(ul != 6){
3449 lrc = 369;
3450 if(prlc) printf(f,lrc);
3452 ul = 12; ur = 10;
3453 ul ^= ur;
3454 if(ul != 6){
3455 lrc = 370;
3456 if(prlc) printf(f,lrc);
3458 cl = 12; cr = 10;
3459 cl |= cr;
3460 if(cl != 14){
3461 lrc = 371;
3462 if(prlc) printf(f,lrc);
3464 cl = 12; sr = 10;
3465 cl |= sr;
3466 if(cl != 14){
3467 lrc = 372;
3468 if(prlc) printf(f,lrc);
3470 cl = 12; ir = 10;
3471 cl |= ir;
3472 if(cl != 14){
3473 lrc = 373;
3474 if(prlc) printf(f,lrc);
3476 cl = 12; lr = 10;
3477 cl |= lr;
3478 if(cl != 14){
3479 lrc = 374;
3480 if(prlc) printf(f,lrc);
3482 cl = 12; ur = 10;
3483 cl |= ur;
3484 if(cl != 14){
3485 lrc = 375;
3486 if(prlc) printf(f,lrc);
3488 sl = 12; cr = 10;
3489 sl |= cr;
3490 if(sl != 14){
3491 lrc = 376;
3492 if(prlc) printf(f,lrc);
3494 sl = 12; sr = 10;
3495 sl |= sr;
3496 if(sl != 14){
3497 lrc = 377;
3498 if(prlc) printf(f,lrc);
3500 sl = 12; ir = 10;
3501 sl |= ir;
3502 if(sl != 14){
3503 lrc = 378;
3504 if(prlc) printf(f,lrc);
3506 sl = 12; lr = 10;
3507 sl |= lr;
3508 if(sl != 14){
3509 lrc = 379;
3510 if(prlc) printf(f,lrc);
3512 sl = 12; ur = 10;
3513 sl |= ur;
3514 if(sl != 14){
3515 lrc = 380;
3516 if(prlc) printf(f,lrc);
3518 il = 12; cr = 10;
3519 il |= cr;
3520 if(il != 14){
3521 lrc = 381;
3522 if(prlc) printf(f,lrc);
3524 il = 12; sr = 10;
3525 il |= sr;
3526 if(il != 14){
3527 lrc = 382;
3528 if(prlc) printf(f,lrc);
3530 il = 12; ir = 10;
3531 il |= ir;
3532 if(il != 14){
3533 lrc = 383;
3534 if(prlc) printf(f,lrc);
3536 il = 12; lr = 10;
3537 il |= lr;
3538 if(il != 14){
3539 lrc = 384;
3540 if(prlc) printf(f,lrc);
3542 il = 12; ur = 10;
3543 il |= ur;
3544 if(il != 14){
3545 lrc = 385;
3546 if(prlc) printf(f,lrc);
3548 ll = 12; cr = 10;
3549 ll |= cr;
3550 if(ll != 14){
3551 lrc = 386;
3552 if(prlc) printf(f,lrc);
3554 ll = 12; sr = 10;
3555 ll |= sr;
3556 if(ll != 14){
3557 lrc = 387;
3558 if(prlc) printf(f,lrc);
3560 ll = 12; ir = 10;
3561 ll |= ir;
3562 if(ll != 14){
3563 lrc = 388;
3564 if(prlc) printf(f,lrc);
3566 ll = 12; lr = 10;
3567 ll |= lr;
3568 if(ll != 14){
3569 lrc = 389;
3570 if(prlc) printf(f,lrc);
3572 ll = 12; ur = 10;
3573 ll |= ur;
3574 if(ll != 14){
3575 lrc = 390;
3576 if(prlc) printf(f,lrc);
3578 ul = 12; cr = 10;
3579 ul |= cr;
3580 if(ul != 14){
3581 lrc = 391;
3582 if(prlc) printf(f,lrc);
3584 ul = 12; sr = 10;
3585 ul |= sr;
3586 if(ul != 14){
3587 lrc = 392;
3588 if(prlc) printf(f,lrc);
3590 ul = 12; ir = 10;
3591 ul |= ir;
3592 if(ul != 14){
3593 lrc = 393;
3594 if(prlc) printf(f,lrc);
3596 ul = 12; lr = 10;
3597 ul |= lr;
3598 if(ul != 14){
3599 lrc = 394;
3600 if(prlc) printf(f,lrc);
3602 ul = 12; ur = 10;
3603 ul |= ur;
3604 if(ul != 14){
3605 lrc = 395;
3606 if(prlc) printf(f,lrc);
3608 if(lrc != 0) {
3609 rc = 1;
3610 if(pd0->flgd != 0) printf(s714er,1);
3612 return rc;
3614 s715(pd0) /* 7.15 Comma operator */
3615 struct defs *pd0;
3617 static char s715er[] = "s715,er%d\n";
3618 static char qs715[8] = "s715 ";
3619 int rc;
3620 char *ps, *pt;
3621 int a, t, c, i;
3622 a = c = 0;
3623 ps = qs715;
3624 pt = pd0->rfs;
3625 rc = 0;
3626 while (*pt++ = *ps++);
3628 /* A pair of expressions separated by a comma is
3629 evaluated left to right and the value of the left
3630 expression is discarded.
3632 i = 1;
3633 if( i++,i++,i++,i++,++i != 6 ){
3634 if(pd0->flgd != 0) printf(s715er,1);
3635 rc = rc+1;
3638 /* In contexts where the comma is given a special mean-
3639 ing, for example in a list of actual arguments to
3640 functions (sic) and lists of initializers, the comma
3641 operator as described in this section can only appear
3642 in parentheses; for example
3644 f( a, (t=3, t+2), c)
3646 has three arguments, the second of which has the
3647 value 5.
3650 if(s715f(a, (t=3, t+2), c) != 5){
3651 if(pd0->flgd != 0) printf(s715er,2);
3652 rc = rc+2;
3654 return rc;
3656 s715f(x,y,z)
3657 int x, y, z;
3659 return y;
3661 s72(pd0) /* 7.2 Unary operators */
3662 struct defs *pd0;
3664 static char s72er[] = "s72,er%d\n";
3665 static char qs72[8] = "s72 ";
3666 int rc;
3667 char *ps, *pt;
3668 int k, j, i, lrc;
3669 char c;
3670 short s;
3671 long l;
3672 unsigned u;
3673 double d;
3674 float f;
3675 ps = qs72;
3676 pt = pd0->rfs;
3677 rc = 0;
3678 while (*pt++ = *ps++);
3680 /* The *, denoting indirection, and the &, denoting a
3681 pointer, are duals of each other, and ought to behave as
3682 such... */
3684 k = 2;
3685 if(*&*&k != 2){
3686 rc = rc+1;
3687 printf(s72er,1);
3690 /* The unary minus has the conventional meaning. */
3692 if(k+(-k) != 0){
3693 rc = rc+2;
3694 printf(s72er,2);
3697 /* The negation operator (!) has been thoroughly checked out,
3698 perhaps more thoroughly than any of the others. The ~ oper-
3699 ator gets us a ones complement. */
3701 k = 0;
3702 for(j=0;j<pd0->ibits;j++) k = (k<<1)|1;
3703 if(~k != 0){
3704 rc = rc+4;
3705 printf(s72er,4);
3708 /* Now we look at the ++ and -- operators, which can be
3709 used in either prefix or suffix form. With side
3710 effects they're loaded. */
3712 k = 5;
3714 if( ++k != 6 || --k != 5
3715 || k++ != 5 || k-- != 6
3716 || k != 5 ){
3717 rc = rc+8;
3718 printf(s72er,8);
3721 /* An expression preceded by the parenthesised name of a
3722 data type causes conversion of the value of the expression
3723 to the named type. This construction is called a cast.
3724 Here, we check to see that all of the possible casts and
3725 their simple combinations are accepted by the compiler,
3726 and that they all produce a correct result for this sample
3727 of size one. */
3729 c = 26; l = 26; d = 26.;
3730 s = 26; u = 26;
3731 i = 26; f = 26.;
3733 lrc = 0;
3735 if( (char)s != 26 || (char)i != 26
3736 || (char)l != 26 || (char)u != 26
3737 || (char)f != 26 || (char)d != 26 ) lrc = lrc+1;
3739 if( (short)c != 26 || (short)i != 26
3740 || (short)l != 26 || (short)u != 26
3741 || (short)f != 26 || (short)d != 26) lrc = lrc+2;
3743 if( (int)c != 26 || (int)s != 26
3744 || (int)l != 26 || (int)u != 26
3745 || (int)f != 26 || (int)d != 26 ) lrc = lrc+4;
3747 if( (long)c != 26 || (long)s != 26
3748 || (long)i != 26 || (long)u != 26
3749 || (long)f != 26 || (long)d != 26 ) lrc = lrc+8;
3751 if( (unsigned)c != 26 || (unsigned)s != 26
3752 || (unsigned)i != 26 || (unsigned)l != 26
3753 || (unsigned)f != 26 || (unsigned)d != 26 ) lrc = lrc+16;
3755 if( (float)c != 26. || (float)s != 26.
3756 || (float)i != 26. || (float)l != 26.
3757 || (float)u != 26. || (float)d != 26. ) lrc = lrc+32;
3759 if( (double)c != 26. || (double)s != 26.
3760 || (double)i != 26. || (double)l != 26.
3761 || (double)u != 26. || (double)f != 26. ) lrc = lrc+64;
3763 if(lrc != 0){
3764 rc = rc+16;
3765 printf(s72er,16);
3768 /* The sizeof operator has been tested previously. */
3770 return rc;
3772 s757(pd0) /* 7.5 Shift operators */
3773 /* 7.6 Relational operators */
3774 /* 7.7 Equality operator */
3775 struct defs *pd0;
3777 static char s757er[] = "s757,er%d\n";
3778 static char qs757[8] = "s757 ";
3779 int rc;
3780 char *ps, *pt;
3781 int t,lrc,k,j,a,b,c,d,x[16],*p;
3782 unsigned rs, ls, rt, lt;
3783 ps = qs757;
3784 pt = pd0->rfs;
3785 rc = 0;
3786 while (*pt++ = *ps++);
3788 /* The shift operators << and >> group left-to-right.
3791 t = 40;
3792 if(t<<3<<2 != 1280 || t>>3>>2 != 1){
3793 rc = rc+1;
3794 if(pd0->flgd != 0) printf(s757er,1);
3797 /* In the following test, an n-bit unsigned consisting
3798 of all 1s is shifted right (resp. left) k bits, 0<=k<n.
3799 We expect to find k 0s followed by n-k 1s (resp. n-k 1s
3800 followed by k 0s). If not, we complain.
3803 lrc = 0;
3804 for(k=0; k<pd0->ubits; k++){
3805 rs = 1;
3806 ls = rs<<(pd0->ubits-1);
3808 rt = 0;
3809 lt = ~rt>>k;
3810 rt = ~rt<<k;
3812 for(j=0; j<pd0->ubits;j++){
3813 if((j<k) != ((rs&rt) == 0) || (j<k) != ((ls&lt) == 0)) lrc = 1;
3814 rs = rs<<1;
3815 ls = ls>>1;
3819 if(lrc != 0){
3820 rc = rc+2;
3821 if(pd0->flgd != 0) printf(s757er,2);
3824 /* The relational operators group left-to-right, but this
3825 fact is not very useful; a<b<c does not mean what it
3826 seems to...
3829 a = 3;
3830 b = 2;
3831 c = 1;
3833 if((a<b<c) != 1){
3834 rc = rc+4;
3835 if(pd0->flgd != 0) printf(s757er,4);
3838 /* In general, we take note of the fact that if we got this
3839 far the relational operators have to be working. We test only
3840 that two pointers may be compared; the result depends on
3841 the relative locations in the address space of the
3842 pointed-to objects.
3844 if( &x[1] == &x[0] ){
3845 rc = rc+8;
3846 if(pd0->flgd != 0) printf(s757er,8);
3849 if( &x[1] < &x[0] ) if(pd0->flgm != 0)
3850 printf("Increasing array elements assigned to decreasing locations\n");
3852 /* a<b == c<d whenever a<b and c<d have the same
3853 truth value. */
3855 lrc = 0;
3857 for(j=0;j<16;j++) x[j] = 1;
3858 x[1] = 0;
3859 x[4] = 0;
3860 x[6] = 0;
3861 x[7] = 0;
3862 x[9] = 0;
3863 x[13] = 0;
3865 for(a=0;a<2;a++)
3866 for(b=0;b<2;b++)
3867 for(c=0;c<2;c++)
3868 for(d=0;d<2;d++)
3869 if((a<b==c<d) != x[8*a+4*b+2*c+d] ) lrc = 1;
3871 if(lrc != 0){
3872 rc = rc+16;
3873 if(pd0->flgd != 0) printf(s757er,16);
3876 /* A pointer to which zero has been assigned will
3877 appear to be equal to zero.
3880 p = 0;
3882 if(p != 0){
3883 rc = rc+32;
3884 if(pd0->flgd != 0) printf(s757er,32);
3887 return rc;
3889 s7813(pd0) /* 7.8 Bitwise AND operator
3890 7.9 Bitwise OR operator
3891 7.10 Bitwise exclusive OR operator
3892 7.11 Logical AND operator
3893 7.12 Logical OR operator
3894 7.13 Conditional operator */
3895 struct defs *pd0;
3897 register int prlc, lrc;
3898 int i, j, r, zero, one;
3899 static char fl[] = "Local error %d.\n";
3900 static char s7813er[] = "s7813,er%d\n";
3901 static char qs7813[8] = "s7813 ";
3902 int rc;
3903 char *ps, *pt;
3904 ps = qs7813;
3905 pt = pd0->rfs;
3906 lrc = 0;
3907 rc = 0;
3908 prlc = pd0->flgl;
3909 while (*pt++ = *ps++);
3911 /* If bitwise AND, OR, and exclusive OR are to cause
3912 trouble, they will probably do so when they are used in
3913 an unusual context. The number of contexts in which
3914 they can be used is infinite, so to save time we select
3915 a finite subset: the set of all expressions of the form:
3917 item1 op item2
3919 where item1 and item2 are chosen from the set
3920 {char,short,long,unsigned,int} and op is one of {&,|,^}.
3921 We will use 12 and 10 as values for the items, as these
3922 values will fit into all data types on just about any
3923 imaginable machine, and the results after performing the
3924 bitwise operations on them are distinct for each operation,
3925 i.e.,
3927 12 | 10 -> 1100 | 1010 -> 1110 -> 14
3928 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6
3929 12 & 10 -> 1100 & 1010 -> 1000 -> 8
3931 There are 75 such combinations:
3934 if(((char)12 & (char)10) != 8) {lrc = 1;
3935 if(prlc) printf(fl,lrc);}
3936 if(((char)12 | (char)10) != 14) {lrc = 2;
3937 if(prlc) printf(fl,lrc);}
3938 if(((char)12 ^ (char)10) != 6) {lrc = 3;
3939 if(prlc) printf(fl,lrc);}
3940 if(((char)12 & (short)10) != 8) {lrc = 4;
3941 if(prlc) printf(fl,lrc);}
3942 if(((char)12 | (short)10) != 14) {lrc = 5;
3943 if(prlc) printf(fl,lrc);}
3944 if(((char)12 ^ (short)10) != 6) {lrc = 6;
3945 if(prlc) printf(fl,lrc);}
3946 if(((char)12 & (long)10) != 8) {lrc = 7;
3947 if(prlc) printf(fl,lrc);}
3948 if(((char)12 | (long)10) != 14) {lrc = 8;
3949 if(prlc) printf(fl,lrc);}
3950 if(((char)12 ^ (long)10) != 6) {lrc = 9;
3951 if(prlc) printf(fl,lrc);}
3952 if(((char)12 & (unsigned)10) != 8) {lrc = 10;
3953 if(prlc) printf(fl,lrc);}
3954 if(((char)12 | (unsigned)10) != 14) {lrc = 11;
3955 if(prlc) printf(fl,lrc);}
3956 if(((char)12 ^ (unsigned)10) != 6) {lrc = 12;
3957 if(prlc) printf(fl,lrc);}
3958 if(((char)12 & (int)10) != 8) {lrc = 13;
3959 if(prlc) printf(fl,lrc);}
3960 if(((char)12 | (int)10) != 14) {lrc = 14;
3961 if(prlc) printf(fl,lrc);}
3962 if(((char)12 ^ (int)10) != 6) {lrc = 15;
3963 if(prlc) printf(fl,lrc);}
3964 if(((short)12 & (char)10) != 8) {lrc = 16;
3965 if(prlc) printf(fl,lrc);}
3966 if(((short)12 | (char)10) != 14) {lrc = 17;
3967 if(prlc) printf(fl,lrc);}
3968 if(((short)12 ^ (char)10) != 6) {lrc = 18;
3969 if(prlc) printf(fl,lrc);}
3970 if(((short)12 & (short)10) != 8) {lrc = 16;
3971 if(prlc) printf(fl,lrc);}
3972 if(((short)12 | (short)10) != 14) {lrc = 20;
3973 if(prlc) printf(fl,lrc);}
3974 if(((short)12 ^ (short)10) != 6) {lrc = 21;
3975 if(prlc) printf(fl,lrc);}
3976 if(((short)12 & (long)10) != 8) {lrc = 22;
3977 if(prlc) printf(fl,lrc);}
3978 if(((short)12 | (long)10) != 14) {lrc = 23;
3979 if(prlc) printf(fl,lrc);}
3980 if(((short)12 ^ (long)10) != 6) {lrc = 24;
3981 if(prlc) printf(fl,lrc);}
3982 if(((short)12 & (unsigned)10) != 8) {lrc = 25;
3983 if(prlc) printf(fl,lrc);}
3984 if(((short)12 | (unsigned)10) != 14) {lrc = 26;
3985 if(prlc) printf(fl,lrc);}
3986 if(((short)12 ^ (unsigned)10) != 6) {lrc = 27;
3987 if(prlc) printf(fl,lrc);}
3988 if(((short)12 & (int)10) != 8) {lrc = 28;
3989 if(prlc) printf(fl,lrc);}
3990 if(((short)12 | (int)10) != 14) {lrc = 26;
3991 if(prlc) printf(fl,lrc);}
3992 if(((short)12 ^ (int)10) != 6) {lrc = 30;
3993 if(prlc) printf(fl,lrc);}
3994 if(((long)12 & (char)10) != 8) {lrc = 31;
3995 if(prlc) printf(fl,lrc);}
3996 if(((long)12 | (char)10) != 14) {lrc = 32;
3997 if(prlc) printf(fl,lrc);}
3998 if(((long)12 ^ (char)10) != 6) {lrc = 33;
3999 if(prlc) printf(fl,lrc);}
4000 if(((long)12 & (short)10) != 8) {lrc = 34;
4001 if(prlc) printf(fl,lrc);}
4002 if(((long)12 | (short)10) != 14) {lrc = 35;
4003 if(prlc) printf(fl,lrc);}
4004 if(((long)12 ^ (short)10) != 6) {lrc = 36;
4005 if(prlc) printf(fl,lrc);}
4006 if(((long)12 & (long)10) != 8) {lrc = 37;
4007 if(prlc) printf(fl,lrc);}
4008 if(((long)12 | (long)10) != 14) {lrc = 38;
4009 if(prlc) printf(fl,lrc);}
4010 if(((long)12 ^ (long)10) != 6) {lrc = 39;
4011 if(prlc) printf(fl,lrc);}
4012 if(((long)12 & (unsigned)10) != 8) {lrc = 40;
4013 if(prlc) printf(fl,lrc);}
4014 if(((long)12 | (unsigned)10) != 14) {lrc = 41;
4015 if(prlc) printf(fl,lrc);}
4016 if(((long)12 ^ (unsigned)10) != 6) {lrc = 42;
4017 if(prlc) printf(fl,lrc);}
4018 if(((long)12 & (int)10) != 8) {lrc = 43;
4019 if(prlc) printf(fl,lrc);}
4020 if(((long)12 | (int)10) != 14) {lrc = 44;
4021 if(prlc) printf(fl,lrc);}
4022 if(((long)12 ^ (int)10) != 6) {lrc = 45;
4023 if(prlc) printf(fl,lrc);}
4024 if(((unsigned)12 & (char)10) != 8) {lrc = 46;
4025 if(prlc) printf(fl,lrc);}
4026 if(((unsigned)12 | (char)10) != 14) {lrc = 47;
4027 if(prlc) printf(fl,lrc);}
4028 if(((unsigned)12 ^ (char)10) != 6) {lrc = 48;
4029 if(prlc) printf(fl,lrc);}
4030 if(((unsigned)12 & (short)10) != 8) {lrc = 49;
4031 if(prlc) printf(fl,lrc);}
4032 if(((unsigned)12 | (short)10) != 14) {lrc = 50;
4033 if(prlc) printf(fl,lrc);}
4034 if(((unsigned)12 ^ (short)10) != 6) {lrc = 51;
4035 if(prlc) printf(fl,lrc);}
4036 if(((unsigned)12 & (long)10) != 8) {lrc = 52;
4037 if(prlc) printf(fl,lrc);}
4038 if(((unsigned)12 | (long)10) != 14) {lrc = 53;
4039 if(prlc) printf(fl,lrc);}
4040 if(((unsigned)12 ^ (long)10) != 6) {lrc = 54;
4041 if(prlc) printf(fl,lrc);}
4042 if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55;
4043 if(prlc) printf(fl,lrc);}
4044 if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56;
4045 if(prlc) printf(fl,lrc);}
4046 if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57;
4047 if(prlc) printf(fl,lrc);}
4048 if(((unsigned)12 & (int)10) != 8) {lrc = 58;
4049 if(prlc) printf(fl,lrc);}
4050 if(((unsigned)12 | (int)10) != 14) {lrc = 56;
4051 if(prlc) printf(fl,lrc);}
4052 if(((unsigned)12 ^ (int)10) != 6) {lrc = 60;
4053 if(prlc) printf(fl,lrc);}
4054 if(((int)12 & (char)10) != 8) {lrc = 61;
4055 if(prlc) printf(fl,lrc);}
4056 if(((int)12 | (char)10) != 14) {lrc = 62;
4057 if(prlc) printf(fl,lrc);}
4058 if(((int)12 ^ (char)10) != 6) {lrc = 63;
4059 if(prlc) printf(fl,lrc);}
4060 if(((int)12 & (short)10) != 8) {lrc = 64;
4061 if(prlc) printf(fl,lrc);}
4062 if(((int)12 | (short)10) != 14) {lrc = 65;
4063 if(prlc) printf(fl,lrc);}
4064 if(((int)12 ^ (short)10) != 6) {lrc = 66;
4065 if(prlc) printf(fl,lrc);}
4066 if(((int)12 & (long)10) != 8) {lrc = 67;
4067 if(prlc) printf(fl,lrc);}
4068 if(((int)12 | (long)10) != 14) {lrc = 68;
4069 if(prlc) printf(fl,lrc);}
4070 if(((int)12 ^ (long)10) != 6) {lrc = 69;
4071 if(prlc) printf(fl,lrc);}
4072 if(((int)12 & (unsigned)10) != 8) {lrc = 70;
4073 if(prlc) printf(fl,lrc);}
4074 if(((int)12 | (unsigned)10) != 14) {lrc = 71;
4075 if(prlc) printf(fl,lrc);}
4076 if(((int)12 ^ (unsigned)10) != 6) {lrc = 72;
4077 if(prlc) printf(fl,lrc);}
4078 if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);}
4079 if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);}
4080 if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);}
4082 if(lrc != 0){
4083 if(pd0->flgd != 0) printf(s7813er,1);
4084 rc = rc+1;
4087 /* The && operator groups left to right. It returns 1
4088 if both of the operands are nonzero; 0 otherwise.
4089 It guarantees left to right evaluation; moreover, the
4090 second operand is not evaluated if the value of the
4091 first operand is 0.
4094 lrc = 0;
4095 i = j = 0;
4097 r = i++ && j++;
4098 if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);}
4099 if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);}
4100 if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);}
4101 r = i && j++;
4102 if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);}
4103 if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);}
4104 if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);}
4105 r = i-- && j;
4106 if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);}
4107 if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);}
4108 if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);}
4109 r = i && j--;
4110 if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);}
4111 if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);}
4112 if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);}
4114 if(lrc!=0){
4115 if(pd0->flgd != 0) printf(s7813er,2);
4116 rc = rc+2;
4119 /* The || operator groups left to right. It returns 1
4120 if either of its operands is nonzero; 0 otherwise. It
4121 guarantees left to right evaluation; moreover, the second
4122 operand is not evaluated if the value of the first
4123 operand is nonzero.
4126 lrc = 0;
4127 i = j = 0;
4128 r = i++ || j;
4129 if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);}
4130 if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);}
4131 if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);}
4132 r = j++ || i;
4133 if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);}
4134 if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);}
4135 if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);}
4136 r = i-- || j--;
4137 if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);}
4138 if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);}
4139 if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);}
4140 r = i || j--;
4141 if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);}
4142 if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);}
4143 if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);}
4145 if(lrc!=0){
4146 if(pd0->flgd != 0) printf(s7813er,4);
4147 rc = rc+4;
4150 /* Conditional expressions group right to left. */
4152 i = j = 0;
4153 zero = 0;
4154 one = 1;
4155 r = one?zero:one?i++:j++;
4156 if(r!=0 || i!=0 || j!=0){
4157 if(pd0->flgd != 0) printf(s7813er,8);
4158 rc = rc+8;
4161 /* The first expression is evaluated and if it is non-
4162 zero, the result is the value of the second expression;
4163 otherwise, that of the third expression.
4166 if((one?zero:1) != 0 || (zero?1:zero) != 0){
4167 if(pd0->flgd != 0) printf(s7813er,16);
4168 rc = rc+16;
4170 return rc;
4172 s81(pd0) /* 8.1 Storage Class Specifiers */
4173 struct defs *pd0;
4175 static char s81er[] = "s81,er%d\n";
4176 static char qs81[8] = "s81 ";
4177 char *ps, *pt;
4178 int k, rc, j, crc, prc, irc;
4179 register char rchar;
4180 char nrchar;
4181 register int *rptr;
4182 int *nrptr;
4183 register int rint;
4184 int nrint;
4185 static char badtest[] = "Register count for %s is unreliable.\n";
4186 static char goodtest[] = "%d registers assigned to %s variables.\n";
4188 rc = 0;
4189 crc = 0;
4190 prc = 0;
4191 irc = 0;
4192 ps = qs81;
4193 pt = pd0->rfs;
4195 while(*pt++ = *ps++);
4197 /* The storage class specifiers are:
4199 auto
4200 static
4201 extern
4202 register
4203 typedef
4205 The first three of these were treated earlier, in s4. The last
4206 will be checked in s88. "Register" remains.
4208 There are three flavors of register, viz., char, int and pointer.
4209 We wish first to ascertain that the representations as register
4210 are consistent with the corresponding nonregister representations.
4213 k = 1;
4214 for (j=0; j<50; j++){
4215 rchar = k;
4216 nrchar = k;
4217 rptr = &k;
4218 nrptr = &k;
4219 rint = k;
4220 nrint = k;
4222 if ( rchar != nrchar ) crc = 1;
4223 if ( rptr != nrptr ) prc = 1;
4224 if ( rint != nrint ) irc = 1;
4225 k = k<<1;
4228 if ( crc != 0 ) {
4229 rc = rc+1;
4230 if( pd0 -> flgd != 0 ) printf(s81er,1);
4233 if ( prc != 0 ) {
4234 rc = rc+2;
4235 if( pd0 -> flgd != 0 ) printf(s81er,2);
4238 if ( irc != 0 ) {
4239 rc = rc+4;
4240 if( pd0 -> flgd != 0 ) printf(s81er,4);
4243 /* Now we check to see if variables are actually being assigned
4244 to registers. */
4246 k = regc();
4247 if ( pd0->flgm != 0 ) {
4248 if ( k < 0 ) printf(badtest,"char");
4249 else printf(goodtest,k,"char");
4252 k = regp();
4253 if ( pd0->flgm != 0 ) {
4254 if ( k<0 ) printf(badtest,"pointer");
4255 else printf(goodtest,k,"pointer");
4258 k = regi();
4259 if ( pd0->flgm != 0 ) {
4260 if ( k<0 ) printf(badtest,"int");
4261 else printf(goodtest,k,"int");
4264 return rc;
4266 regc() { /* char to register assignment */
4267 /* Testing a variable whose storage class has been spec-
4268 ified as "register" is somewhat tricky, but it can be done in a
4269 fairly reliable fashion by taking advantage of our knowledge of the
4270 ways in which compilers operate. If we declare a collection of vari-
4271 ables of the same storage class, we would expect that, when storage
4272 for these variables is actually allocated, the variables will be
4273 bunched together and ordered according to one of the following
4274 criteria:
4276 (a) the order in which they were defined.
4277 (b) the order in which they are used.
4278 (c) alphabetically.
4279 (d) the order in which they appear in the compiler's
4280 symbol table.
4281 (e) some other way.
4283 Hence, if we define a sequence of variables in close alpha-
4284 betical order, and use them in the same order in which we define
4285 them, we would expect the differences between the addresses of
4286 successive variables to be constant, except in case (d) where the
4287 symbol table is a hash table, or in case (e). If a subsequence in
4288 the middle of this sequence is selected, and for this subsequence,
4289 every other variable is specified to be "register", and address
4290 differences are taken between adjacent nonregister variables, we would
4291 still expect to find constant differences if the "register" vari-
4292 ables were actually assigned to registers, and some other diff-
4293 erences if they were not. Specifically, if we had N variables
4294 specified as "register" of which the first n were actually ass-
4295 igned to registers, we would expect the sequence of differences
4296 to consist of a number of occurrences of some number, followed by
4297 N-n occurrences of some other number, followed by several occurr-
4298 ences of the first number. If we get a sequence like this, we can
4299 determine, by simple subtraction, how many (if any) variables are
4300 being assigned to registers. If we get some other sequence, we know
4301 that the test is invalid. */
4303 char r00;
4304 char r01;
4305 char r02;
4306 char r03;
4307 register char r04;
4308 char r05;
4309 register char r06;
4310 char r07;
4311 register char r08;
4312 char r09;
4313 register char r10;
4314 char r11;
4315 register char r12;
4316 char r13;
4317 register char r14;
4318 char r15;
4319 register char r16;
4320 char r17;
4321 register char r18;
4322 char r19;
4323 register char r20;
4324 char r21;
4325 register char r22;
4326 char r23;
4327 register char r24;
4328 char r25;
4329 register char r26;
4330 char r27;
4331 register char r28;
4332 char r29;
4333 register char r30;
4334 char r31;
4335 register char r32;
4336 char r33;
4337 register char r34;
4338 char r35;
4339 char r36;
4340 char r37;
4341 char r38;
4343 int s, n1, n2, nr, j, d[22];
4344 r00 = 0;
4345 r01 = 1;
4346 r02 = 2;
4347 r03 = 3;
4348 r04 = 4;
4349 r05 = 5;
4350 r06 = 6;
4351 r07 = 7;
4352 r08 = 8;
4353 r09 = 9;
4354 r10 = 10;
4355 r11 = 11;
4356 r12 = 12;
4357 r13 = 13;
4358 r14 = 14;
4359 r15 = 15;
4360 r16 = 16;
4361 r17 = 17;
4362 r18 = 18;
4363 r19 = 19;
4364 r20 = 20;
4365 r21 = 21;
4366 r22 = 22;
4367 r23 = 23;
4368 r24 = 24;
4369 r25 = 25;
4370 r26 = 26;
4371 r27 = 27;
4372 r28 = 28;
4373 r29 = 29;
4374 r30 = 30;
4375 r31 = 31;
4376 r32 = 32;
4377 r33 = 33;
4378 r34 = 34;
4379 r35 = 35;
4380 r36 = 36;
4381 r37 = 37;
4382 r38 = 38;
4384 d[0] = &r01 - &r00;
4385 d[1] = &r02 - &r01;
4386 d[2] = &r03 - &r02;
4387 d[3] = &r05 - &r03;
4388 d[4] = &r07 - &r05;
4389 d[5] = &r09 - &r07;
4390 d[6] = &r11 - &r09;
4391 d[7] = &r13 - &r11;
4392 d[8] = &r15 - &r13;
4393 d[9] = &r17 - &r15;
4394 d[10] = &r19 - &r17;
4395 d[11] = &r21 - &r19;
4396 d[12] = &r23 - &r21;
4397 d[13] = &r25 - &r23;
4398 d[14] = &r27 - &r25;
4399 d[15] = &r29 - &r27;
4400 d[16] = &r31 - &r29;
4401 d[17] = &r33 - &r31;
4402 d[18] = &r35 - &r33;
4403 d[19] = &r36 - &r35;
4404 d[20] = &r37 - &r36;
4405 d[21] = &r38 - &r37;
4408 /* The following FSM analyzes the string of differences. It accepts
4409 strings of the form a+b+a+ and returns 16 minus the number of bs,
4410 which is the number of variables that actually got into registers.
4411 Otherwise it signals rejection by returning -1., indicating that the
4412 test is unreliable. */
4414 n1 = d[0];
4415 s = 1;
4417 for (j=0; j<22; j++)
4418 switch (s) {
4419 case 1: if (d[j] != n1) {
4420 n2 = d[j];
4421 s = 2;
4422 nr = 1;
4424 break;
4425 case 2: if (d[j] == n1) {
4426 s = 3;
4427 break;
4429 if (d[j] == n2) {
4430 nr = nr+1;
4431 break;
4433 s = 4;
4434 break;
4435 case 3: if (d[j] != n1) s = 4;
4436 break;
4440 if (s == 3) return 16-nr;
4441 else return -1;
4443 regi() { /* int to register assignment */
4444 /* Testing a variable whose storage class has been spec-
4445 ified as "register" is somewhat tricky, but it can be done in a
4446 fairly reliable fashion by taking advantage of our knowledge of the
4447 ways in which compilers operate. If we declare a collection of vari-
4448 ables of the same storage class, we would expect that, when storage
4449 for these variables is actually allocated, the variables will be
4450 bunched together and ordered according to one of the following
4451 criteria:
4453 (a) the order in which they were defined.
4454 (b) the order in which they are used.
4455 (c) alphabetically.
4456 (d) the order in which they appear in the compiler's
4457 symbol table.
4458 (e) some other way.
4460 Hence, if we define a sequence of variables in close alpha-
4461 betical order, and use them in the same order in which we define
4462 them, we would expect the differences between the addresses of
4463 successive variables to be constant, except in case (d) where the
4464 symbol table is a hash table, or in case (e). If a subsequence in
4465 the middle of this sequence is selected, and for this subsequence,
4466 every other variable is specified to be "register", and address
4467 differences are taken between adjacent nonregister variables, we would
4468 still expect to find constant differences if the "register" vari-
4469 ables were actually assigned to registers, and some other diff-
4470 erences if they were not. Specifically, if we had N variables
4471 specified as "register" of which the first n were actually ass-
4472 igned to registers, we would expect the sequence of differences
4473 to consist of a number of occurrences of some number, followed by
4474 N-n occurrences of some other number, followed by several occurr-
4475 ences of the first number. If we get a sequence like this, we can
4476 determine, by simple subtraction, how many (if any) variables are
4477 being assigned to registers. If we get some other sequence, we know
4478 that the test is invalid. */
4481 int r00;
4482 int r01;
4483 int r02;
4484 int r03;
4485 register int r04;
4486 int r05;
4487 register int r06;
4488 int r07;
4489 register int r08;
4490 int r09;
4491 register int r10;
4492 int r11;
4493 register int r12;
4494 int r13;
4495 register int r14;
4496 int r15;
4497 register int r16;
4498 int r17;
4499 register int r18;
4500 int r19;
4501 register int r20;
4502 int r21;
4503 register int r22;
4504 int r23;
4505 register int r24;
4506 int r25;
4507 register int r26;
4508 int r27;
4509 register int r28;
4510 int r29;
4511 register int r30;
4512 int r31;
4513 register int r32;
4514 int r33;
4515 register int r34;
4516 int r35;
4517 int r36;
4518 int r37;
4519 int r38;
4521 int s, n1, n2, nr, j, d[22];
4523 r00 = 0;
4524 r01 = 1;
4525 r02 = 2;
4526 r03 = 3;
4527 r04 = 4;
4528 r05 = 5;
4529 r06 = 6;
4530 r07 = 7;
4531 r08 = 8;
4532 r09 = 9;
4533 r10 = 10;
4534 r11 = 11;
4535 r12 = 12;
4536 r13 = 13;
4537 r14 = 14;
4538 r15 = 15;
4539 r16 = 16;
4540 r17 = 17;
4541 r18 = 18;
4542 r19 = 19;
4543 r20 = 20;
4544 r21 = 21;
4545 r22 = 22;
4546 r23 = 23;
4547 r24 = 24;
4548 r25 = 25;
4549 r26 = 26;
4550 r27 = 27;
4551 r28 = 28;
4552 r29 = 29;
4553 r30 = 30;
4554 r31 = 31;
4555 r32 = 32;
4556 r33 = 33;
4557 r34 = 34;
4558 r35 = 35;
4559 r36 = 36;
4560 r37 = 37;
4561 r38 = 38;
4563 d[0] = &r01 - &r00;
4564 d[1] = &r02 - &r01;
4565 d[2] = &r03 - &r02;
4566 d[3] = &r05 - &r03;
4567 d[4] = &r07 - &r05;
4568 d[5] = &r09 - &r07;
4569 d[6] = &r11 - &r09;
4570 d[7] = &r13 - &r11;
4571 d[8] = &r15 - &r13;
4572 d[9] = &r17 - &r15;
4573 d[10] = &r19 - &r17;
4574 d[11] = &r21 - &r19;
4575 d[12] = &r23 - &r21;
4576 d[13] = &r25 - &r23;
4577 d[14] = &r27 - &r25;
4578 d[15] = &r29 - &r27;
4579 d[16] = &r31 - &r29;
4580 d[17] = &r33 - &r31;
4581 d[18] = &r35 - &r33;
4582 d[19] = &r36 - &r35;
4583 d[20] = &r37 - &r36;
4584 d[21] = &r38 - &r37;
4587 /* The following FSM analyzes the string of differences. It accepts
4588 strings of the form a+b+a+ and returns 16 minus the number of bs,
4589 which is the number of variables that actually got into registers.
4590 Otherwise it signals rejection by returning -1., indicating that the
4591 test is unreliable. */
4593 n1 = d[0];
4594 s = 1;
4596 for (j=0; j<22; j++)
4597 switch (s) {
4598 case 1: if (d[j] != n1) {
4599 n2 = d[j];
4600 s = 2;
4601 nr = 1;
4603 break;
4604 case 2: if (d[j] == n1) {
4605 s = 3;
4606 break;
4608 if (d[j] == n2) {
4609 nr = nr+1;
4610 break;
4612 s = 4;
4613 break;
4614 case 3: if (d[j] != n1) s = 4;
4615 break;
4619 if (s == 3) return 16-nr;
4620 else return -1;
4622 regp() { /* pointer to register assignment */
4623 /* Testing a variable whose storage class has been spec-
4624 ified as "register" is somewhat tricky, but it can be done in a
4625 fairly reliable fashion by taking advantage of our knowledge of the
4626 ways in which compilers operate. If we declare a collection of vari-
4627 ables of the same storage class, we would expect that, when storage
4628 for these variables is actually allocated, the variables will be
4629 bunched together and ordered according to one of the following
4630 criteria:
4632 (a) the order in which they were defined.
4633 (b) the order in which they are used.
4634 (c) alphabetically.
4635 (d) the order in which they appear in the compiler's
4636 symbol table.
4637 (e) some other way.
4639 Hence, if we define a sequence of variables in close alpha-
4640 betical order, and use them in the same order in which we define
4641 them, we would expect the differences between the addresses of
4642 successive variables to be constant, except in case (d) where the
4643 symbol table is a hash table, or in case (e). If a subsequence in
4644 the middle of this sequence is selected, and for this subsequence,
4645 every other variable is specified to be "register", and address
4646 differences are taken between adjacent nonregister variables, we would
4647 still expect to find constant differences if the "register" vari-
4648 ables were actually assigned to registers, and some other diff-
4649 erences if they were not. Specifically, if we had N variables
4650 specified as "register" of which the first n were actually ass-
4651 igned to registers, we would expect the sequence of differences
4652 to consist of a number of occurrences of some number, followed by
4653 N-n occurrences of some other number, followed by several occurr-
4654 ences of the first number. If we get a sequence like this, we can
4655 determine, by simple subtraction, how many (if any) variables are
4656 being assigned to registers. If we get some other sequence, we know
4657 that the test is invalid. */
4660 int *r00;
4661 int *r01;
4662 int *r02;
4663 int *r03;
4664 register int *r04;
4665 int *r05;
4666 register int *r06;
4667 int *r07;
4668 register int *r08;
4669 int *r09;
4670 register int *r10;
4671 int *r11;
4672 register int *r12;
4673 int *r13;
4674 register int *r14;
4675 int *r15;
4676 register int *r16;
4677 int *r17;
4678 register int *r18;
4679 int *r19;
4680 register int *r20;
4681 int *r21;
4682 register int *r22;
4683 int *r23;
4684 register int *r24;
4685 int *r25;
4686 register int *r26;
4687 int *r27;
4688 register int *r28;
4689 int *r29;
4690 register int *r30;
4691 int *r31;
4692 register int *r32;
4693 int *r33;
4694 register int *r34;
4695 int *r35;
4696 int *r36;
4697 int *r37;
4698 int *r38;
4700 int s, n1, n2, nr, j, d[22];
4702 r00 = (int *)&r00;
4703 r01 = (int *)&r01;
4704 r02 = (int *)&r02;
4705 r03 = (int *)&r03;
4706 r04 = (int *)&r05;
4707 r05 = (int *)&r05;
4708 r06 = (int *)&r07;
4709 r07 = (int *)&r07;
4710 r08 = (int *)&r09;
4711 r09 = (int *)&r09;
4712 r10 = (int *)&r11;
4713 r11 = (int *)&r11;
4714 r12 = (int *)&r13;
4715 r13 = (int *)&r13;
4716 r14 = (int *)&r15;
4717 r15 = (int *)&r15;
4718 r16 = (int *)&r17;
4719 r17 = (int *)&r17;
4720 r18 = (int *)&r19;
4721 r19 = (int *)&r19;
4722 r20 = (int *)&r21;
4723 r21 = (int *)&r21;
4724 r22 = (int *)&r23;
4725 r23 = (int *)&r23;
4726 r24 = (int *)&r25;
4727 r25 = (int *)&r25;
4728 r26 = (int *)&r27;
4729 r27 = (int *)&r27;
4730 r28 = (int *)&r29;
4731 r29 = (int *)&r29;
4732 r30 = (int *)&r31;
4733 r31 = (int *)&r31;
4734 r32 = (int *)&r33;
4735 r33 = (int *)&r33;
4736 r34 = (int *)&r35;
4737 r35 = (int *)&r35;
4738 r36 = (int *)&r36;
4739 r37 = (int *)&r37;
4740 r38 = (int *)&r38;
4742 d[0] = &r01 - &r00;
4743 d[1] = &r02 - &r01;
4744 d[2] = &r03 - &r02;
4745 d[3] = &r05 - &r03;
4746 d[4] = &r07 - &r05;
4747 d[5] = &r09 - &r07;
4748 d[6] = &r11 - &r09;
4749 d[7] = &r13 - &r11;
4750 d[8] = &r15 - &r13;
4751 d[9] = &r17 - &r15;
4752 d[10] = &r19 - &r17;
4753 d[11] = &r21 - &r19;
4754 d[12] = &r23 - &r21;
4755 d[13] = &r25 - &r23;
4756 d[14] = &r27 - &r25;
4757 d[15] = &r29 - &r27;
4758 d[16] = &r31 - &r29;
4759 d[17] = &r33 - &r31;
4760 d[18] = &r35 - &r33;
4761 d[19] = &r36 - &r35;
4762 d[20] = &r37 - &r36;
4763 d[21] = &r38 - &r37;
4766 /* The following FSM analyzes the string of differences. It accepts
4767 strings of the form a+b+a+ and returns 16 minus the number of bs,
4768 which is the number of variables that actually got into registers.
4769 Otherwise it signals rejection by returning -1., indicating that the
4770 test is unreliable. */
4772 n1 = d[0];
4773 s = 1;
4774 for (j=0; j<22; j++)
4775 switch (s) {
4776 case 1: if (d[j] != n1) {
4777 n2 = d[j];
4778 s = 2;
4779 nr = 1;
4781 break;
4782 case 2: if (d[j] == n1) {
4783 s = 3;
4784 break;
4786 if (d[j] == n2) {
4787 nr = nr+1;
4788 break;
4790 s = 4;
4791 break;
4792 case 3: if (d[j] != n1) s = 4;
4793 break;
4797 if (s == 3) return 16-nr;
4798 else return -1;
4800 s84(pd0) /* 8.4 Meaning of declarators */
4801 struct defs *pd0;
4803 int *ip, i, *fip(), (*pfi)(), j, k, array(), glork(int);
4804 static int x3d[3][5][7];
4805 float fa[17], *afp[17], sum;
4806 static char s84er[] = "s84,er%d\n";
4807 static char qs84[8] = "s84 ";
4808 int rc;
4809 char *ps, *pt;
4810 ps = qs84;
4811 pt = pd0->rfs;
4812 rc = 0;
4813 while (*pt++ = *ps++);
4815 /* The more common varieties of declarators have al-
4816 ready been touched upon, some more than others. It
4817 is useful to compare *fip() and (*pfi)().
4820 ip = fip(3);
4821 if(*ip != 3){
4822 if(pd0->flgd != 0) printf(s84er,1);
4823 rc = rc+1;
4826 pfi = glork;
4827 if((*pfi)(4) != 4){
4828 if(pd0->flgd != 0) printf(s84er,2);
4829 rc = rc+2;
4832 /* Float fa[17] declares an array of floating point
4833 numbers, and *afp[17] declares an array of pointers
4834 to floats.
4837 for(j=0; j<17; j++){
4838 fa[j] = j;
4839 afp[j] = &fa[j];
4842 sum = 0.;
4843 for(j=0; j<17; j++) sum += *afp[j];
4844 if(sum != 136){
4845 if(pd0->flgd != 0) printf(s84er,4);
4846 rc = rc+4;
4849 /* static int x3d[3][5][7] declares a static three
4850 dimensional array of integers, with rank 3x5x7.
4851 In complete detail, x3d is an array of three items;
4852 each item is an array of five arrays, and each of
4853 the latter arrays is an array of seven integers.
4854 Any of the expressions x3d, x3d[i], x3d[i][j],
4855 and x3d[i][j][k] may reasonably appear in an express-
4856 ion. The first three have type "array"; the last has
4857 type int.
4860 for (i=0; i<3; i++)
4861 for (j=0; j<5; j++)
4862 for (k=0; k<7; k++)
4863 x3d[i][j][k] = i*35+j*7+k;
4865 i = 1; j = 2; k = 3;
4867 if( array(x3d,105,0)
4868 +array(x3d[i],35,35)
4869 +array(x3d[i][j],7,49)
4870 + x3d[i][j][k]-52){
4872 if(pd0->flgd != 0) printf(s84er,8);
4873 rc = rc+8;
4876 return rc;
4878 array(a,size,start)
4879 int a[], size, start;
4881 int i;
4882 for(i=0; i<size; i++)
4883 if(a[i] != i+start) return 1;
4885 return 0;
4887 int *fip(x)
4888 int x;
4890 static int y;
4891 y = x;
4892 return &y;
4894 glork(x)
4895 int x;
4896 {return x;}
4897 s85(pd0) /* 8.5 Structure and union declarations */
4898 struct defs *pd0;
4900 static char s85er[] = "s85,er%d\n";
4901 static char qs85[8] = "s85 ";
4902 int rc;
4903 char *ps, *pt;
4905 struct tnode {
4906 char tword[20];
4907 int count;
4908 struct tnode *left;
4909 struct tnode *right;
4912 struct tnode s1, s2, *sp;
4914 struct{
4915 char cdummy;
4916 char c;
4917 } sc;
4919 struct{
4920 char cdummy;
4921 short s;
4922 } ss;
4924 struct{
4925 char cdummy;
4926 int i;
4927 } si;
4929 struct{
4930 char cdummy;
4931 long l;
4932 } sl;
4934 struct{
4935 char cdummy;
4936 unsigned u;
4937 } su;
4939 struct{
4940 char cdummy;
4941 float f;
4942 } sf;
4944 struct{
4945 char cdummy;
4946 double d;
4947 } sd;
4949 int diff[7], j;
4951 static char *type[] = {
4952 "char",
4953 "short",
4954 "int",
4955 "long",
4956 "unsigned",
4957 "float",
4958 "double"
4961 static char aln[] = " alignment: ";
4963 struct{
4964 int twobit:2;
4965 int :1;
4966 int threebit:3;
4967 int onebit:1;
4968 } s3;
4970 union{
4971 char u1[30];
4972 short u2[30];
4973 int u3[30];
4974 long u4[30];
4975 unsigned u5[30];
4976 float u6[30];
4977 double u7[30];
4978 } u0;
4980 ps = qs85;
4981 pt = pd0->rfs;
4982 rc = 0;
4983 while (*pt++ = *ps++);
4985 /* Within a structure, the objects declared have
4986 addresses which increase as their declarations are
4987 read left to right.
4990 if( (char *)&s1.count - &s1.tword[0] <= 0
4991 ||(char *)&s1.left - (char *)&s1.count <= 0
4992 ||(char *)&s1.right - (char *)&s1.left <= 0){
4993 if(pd0->flgd != 0) printf(s85er,1);
4994 rc = rc+1;
4997 /* Each non-field member of a structure begins on an
4998 addressing boundary appropriate to its type.
5001 diff[0] = &sc.c - &sc.cdummy;
5002 diff[1] = (char *)&ss.s - &ss.cdummy;
5003 diff[2] = (char *)&si.i - &si.cdummy;
5004 diff[3] = (char *)&sl.l - &sl.cdummy;
5005 diff[4] = (char *)&su.u - &su.cdummy;
5006 diff[5] = (char *)&sf.f - &sf.cdummy;
5007 diff[6] = (char *)&sd.d - &sd.cdummy;
5009 if(pd0->flgm != 0)
5010 for(j=0; j<7; j++)
5011 printf("%s%s%d\n",type[j],aln,diff[j]);
5013 /* Field specifications are highly implementation de-
5014 pendent. About the only thing we can do here is to
5015 check is that the compiler accepts the field constructs,
5016 and that they seem to work, after a fashion, at
5017 run time...
5020 s3.threebit = 7;
5021 s3.twobit = s3.threebit;
5022 s3.threebit = s3.twobit;
5024 if(s3.threebit != 3){
5025 if(s3.threebit == -1){
5026 if(pd0->flgm != 0) printf("Sign extension in fields\n");
5028 else{
5029 if(pd0->flgd != 0) printf(s85er,2);
5030 rc = rc+2;
5034 s3.onebit = 1;
5035 if(s3.onebit != 1){
5036 if(pd0->flgm != 0)
5037 printf("Be especially careful with 1-bit fields!\n");
5040 /* A union may be thought of as a structure all of whose
5041 members begin at offset 0 and whose size is sufficient
5042 to contain any of its members.
5045 if( (char *)u0.u1 - (char *)&u0 != 0
5046 ||(char *)u0.u2 - (char *)&u0 != 0
5047 ||(char *)u0.u3 - (char *)&u0 != 0
5048 ||(char *)u0.u4 - (char *)&u0 != 0
5049 ||(char *)u0.u5 - (char *)&u0 != 0
5050 ||(char *)u0.u6 - (char *)&u0 != 0
5051 ||(char *)u0.u7 - (char *)&u0 != 0){
5053 if(pd0->flgd != 0) printf(s85er,4);
5054 rc = rc+4;
5057 if( sizeof u0 < sizeof u0.u1
5058 ||sizeof u0 < sizeof u0.u2
5059 ||sizeof u0 < sizeof u0.u3
5060 ||sizeof u0 < sizeof u0.u4
5061 ||sizeof u0 < sizeof u0.u5
5062 ||sizeof u0 < sizeof u0.u6
5063 ||sizeof u0 < sizeof u0.u7){
5065 if(pd0->flgd != 0) printf(s85er,8);
5066 rc = rc+8;
5069 /* Finally, we check that the pointers work. */
5071 s1.right = &s2;
5072 s2.tword[0] = 2;
5073 s1.right->tword[0] += 1;
5074 if(s2.tword[0] != 3){
5075 if(pd0->flgd != 0) printf(s85er,16);
5076 rc = rc+16;
5078 return rc;
5080 s86(pd0) /* 8.6 Initialization */
5081 struct defs *pd0;
5083 static char s86er[] = "s86,er%d\n";
5084 static char qs86[8] = "s86 ";
5085 int lrc, rc;
5086 char *ps, *pt;
5087 int one(), i, j, k;
5088 static int x[] = {1,3,5};
5089 static int *pint = x+2;
5090 static int zero[10];
5091 int *apint = pint-1;
5092 register int *rpint = apint+one();
5093 static float y0[] = {1,3,5,2,4,6,3,5,7,0,0,0};
5094 static float y1[4][3] = {
5095 {1,3,5},
5096 {2,4,6},
5097 {3,5,7},
5099 static float y2[4][3] = {1,3,5,2,4,6,3,5,7};
5100 static float y3[4][3] = {
5101 {1},{2},{3},{4}
5103 ps = qs86;
5104 pt = pd0->rfs;
5105 rc = 0;
5106 while (*pt++ = *ps++);
5108 /* The expression in an initializer for a static or
5109 external variable must be a constant expression or
5110 an expression that reduces to the address of a pre-
5111 viously declared variable, possibly offset by a
5112 constant expression.
5115 if(*pint != 5){
5116 if(pd0->flgd != 0) printf(s86er,1);
5117 rc = rc+1;
5120 /* Automatic and register variables may be initialized
5121 by arbitrary expressions involving constants and previously
5122 declared variables and functions.
5125 if(*apint != 3){
5126 if(pd0->flgd != 0) printf(s86er,2);
5127 rc = rc+2;
5130 if(*rpint != 5){
5131 if(pd0->flgd != 0) printf(s86er,4);
5132 rc = rc+4;
5135 /* Static variables that are not initialized are guar-
5136 anteed to start off as zero.
5139 lrc = 0;
5140 for(j=0; j<10; j++)
5141 if(zero[j] != 0) lrc = 1;
5142 if(lrc != 0){
5143 if(pd0->flgd != 0) printf(s86er,8);
5144 rc = rc+8;
5147 /* y0, y1, and y2, as declared, should define and
5148 initialize identical arrays.
5150 lrc = 0;
5151 for(i=0; i<4; i++)
5152 for(j=0; j<3; j++){
5153 k = 3*i+j;
5154 if( y1[i][j] != y2[i][j]
5155 ||y1[i][j] != y0[k]) lrc = 1;
5158 if(lrc != 0){
5159 if(pd0->flgd != 0) printf(s86er,16);
5160 rc = rc+16;
5163 /* y3 initializes the first column of the array and
5164 leaves the rest zero.
5167 lrc = 0;
5168 for(j=0; j<4; j++) if(y3[j][0] != j+1) lrc = 1;
5170 if(lrc != 0){
5171 if(pd0->flgd != 0) printf(s86er,32);
5172 rc = rc+32;
5174 return rc;
5176 one(){
5177 return 1;
5179 int *metricp;
5180 s88(pd0) /* 8.8 Typedef */
5181 struct defs *pd0;
5183 static char s88er[] = "s88,er%d\n";
5184 static char qs88[8] = "s88 ";
5185 int rc;
5186 char *ps, *pt;
5188 /* Declarations whose "storage class" is typdef do not
5189 define storage, but instead define identifiers which
5190 can later be used as if they were type keywords naming
5191 fundamental or derived types.
5194 typedef int MILES, *KLICKSP;
5195 typedef struct {double re, im;} complex;
5197 MILES distance;
5198 extern KLICKSP metricp;
5199 complex z, *zp;
5201 ps = qs88;
5202 pt = pd0->rfs;
5203 rc = 0;
5204 while(*pt++ = *ps++);
5206 /* Hopefully, all of this stuff will compile. After that,
5207 we can only make some superficial tests.
5209 The type of distance is int,
5212 if(sizeof distance != sizeof(int)){
5213 if(pd0->flgd != 0) printf(s88er,1);
5214 rc = rc+1;
5217 /* that of metricp is "pointer to int", */
5219 metricp = &distance;
5220 distance = 2;
5221 *metricp = 3;
5223 if(distance != 3){
5224 if(pd0->flgd != 0) printf(s88er,2);
5225 rc = rc+2;
5228 /* and that of z is the specified structure. zp is a
5229 pointer to such a structure.
5232 z.re = 0.;
5233 z.im = 0.;
5234 zp = &z;
5235 zp->re = 1.;
5236 zp->im = 1.;
5237 if(z.re+z.im != 2.){
5238 if(pd0->flgd != 0) printf(s88er,4);
5239 rc = rc+4;
5242 return rc;
5244 s9(pd0) /* 9 Statements */
5245 struct defs *pd0;
5247 static char s9er[] = "s9,er%d\n";
5248 static char qs9[8] = "s9 ";
5249 int rc;
5250 char *ps, *pt;
5251 int lrc, i;
5253 ps = qs9;
5254 pt = pd0->rfs;
5255 rc = 0;
5256 while (*pt++ = *ps++);
5258 /* One would think that the section on statements would
5259 provide the most variety in the entire sequence of tests.
5260 As it turns out, most of the material in this section has
5261 already been checked in the process of checking out
5262 everything else, and the section at this point is somewhat
5263 anticlimactic. For this reason, we restrict ourselves
5264 to testing two features not already covered.
5266 Compound statements are delimited by braces. They have the
5267 nice property that identifiers of the auto and register
5268 variety are pushed and popped. It is currently legal to
5269 transfer into a block, but we wont...
5272 lrc = 0;
5273 for(i=0; i<2; i++){
5274 int j;
5275 register int k;
5276 j = k = 2;
5278 int j;
5279 register int k;
5280 j = k = 3;
5281 if((j != 3) || (k != 3)) lrc = 1;
5283 if((j != 2) || (k != 2)) lrc = 1;
5286 if(lrc != 0){
5287 if(pd0->flgd != 0) printf(s9er,1);
5288 rc = rc+1;
5291 /* Goto statements go to labeled statements, we hope. */
5293 goto nobarf;
5294 if(pd0->flgd != 0) printf(s9er,2);
5295 rc = rc+2;
5296 nobarf:;
5298 return rc;
5300 setev(){ /* Sets an external variable. Used */
5301 extern int extvar; /* by s4, and should be compiled */
5302 extvar = 1066; /* separately from s4. */
5304 int lbits; /* long */
5305 int ubits; /* unsigned */
5306 int fbits; /* float */
5307 int dbits; /* double */
5308 float fprec; /* Smallest number that can be */
5309 float dprec; /* significantly added to 1. */
5310 int flgs; /* Print return codes, by section */
5311 int flgm; /* Announce machine dependencies */
5312 int flgd; /* give explicit diagnostics */
5313 int flgl; /* Report local return codes. */
5314 int rrc; /* recent return code */
5315 int crc; /* Cumulative return code */
5316 char rfs[8]; /* Return from section */