diff options
author | zakk <zakk@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-08-26 17:39:27 +0000 |
---|---|---|
committer | zakk <zakk@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-08-26 17:39:27 +0000 |
commit | 6bf20c78f5b69d40bcc4931df93d29198435ab67 (patch) | |
tree | e3eda937a05d7db42de725b7013bd0344b987f34 /lcc/tst/cq.c | |
parent | 872d4d7f55af706737ffb361bb76ad13e7496770 (diff) | |
download | ioquake3-aero-6bf20c78f5b69d40bcc4931df93d29198435ab67.tar.gz ioquake3-aero-6bf20c78f5b69d40bcc4931df93d29198435ab67.zip |
newlines fixed
git-svn-id: svn://svn.icculus.org/quake3/trunk@6 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'lcc/tst/cq.c')
-rwxr-xr-x | lcc/tst/cq.c | 10632 |
1 files changed, 5316 insertions, 5316 deletions
diff --git a/lcc/tst/cq.c b/lcc/tst/cq.c index 55d18d1..5cd0d6e 100755 --- a/lcc/tst/cq.c +++ b/lcc/tst/cq.c @@ -1,5316 +1,5316 @@ - struct defs {
- int cbits; /* No. of bits per char */
- int ibits; /* int */
- int sbits; /* short */
- int lbits; /* long */
- int ubits; /* unsigned */
- int fbits; /* float */
- int dbits; /* double */
- float fprec; /* Smallest number that can be */
- float dprec; /* significantly added to 1. */
- int flgs; /* Print return codes, by section */
- int flgm; /* Announce machine dependencies */
- int flgd; /* give explicit diagnostics */
- int flgl; /* Report local return codes. */
- int rrc; /* recent return code */
- int crc; /* Cumulative return code */
- char rfs[8]; /* Return from section */
- };
-main(n,args) /* C REFERENCE MANUAL */
-int n;
-char **args;
-{
-
-/* This program performs a series of tests on a C compiler,
-based on information in the
-
- C REFERENCE MANUAL
-
-which appears as Appendix A to the book "The C Programming
-Language" by Brian W. Kernighan and Dennis M. Ritchie
-(Prentice-Hall, 1978, $10.95). This Appendix is hereafter
-referred to as "the Manual".
-
- The rules followed in writing this program are:
-
- 1. The entire program is written in legal C, according
- to the Manual. It should compile with no error messages,
- although some warning messages may be produced by some
- compilers. Failure to compile should be interpreted as
- a compiler error.
-
- 2. The program is clean, in that it does not make use
- of any features of the operating system on which it runs,
- with the sole exceptions of the printf() function, and an
- internal "options" routine, which is easily excised.
-
- 3. No global variables are used, except for the spec-
- ific purpose of testing the global variable facility.
-
- The program is divided into modules having names of the
-form snnn... These modules correspond to those sections of the
-Manual, as identified by boldface type headings, in which
-there is something to test. For example, s241() corresponds
-to section 2.4.1 of the Manual (Integer constants) and tests
-the facilities described therein. The module numbering
-scheme is ambiguous, especially when it names modules
-referring to more than one section; module s7813, for ex-
-ample, deals with sections 7.8 through 7.13. Nonetheless,
-it is surprisingly easy to find a section in the Manual
-corresponding to a section of code, and vice versa.
-
- Note also that there seem to be "holes" in the program,
-at least from the point of view that there exist sections in the
-Manual for which there is no corresponding code. Such holes
-arise from three causes: (a) there is nothing in that partic-
-ular section to test, (b) everything in that section is tested
-elsewhere, and (c) it was deemed advisable not to check cer-
-tain features like preprocessor or listing control features.
-
- Modules are called by a main program main(). The mod-
-ules that are called, and the sequence in which they are
-called, are determined by two lists in main(), in which the
-module names appear. The first list (an extern statement)
-declares the module names to be external. The second (a stat-
-ic int statement) names the modules and defines the sequence
-in which they are called. There is no need for these lists
-to be in the same order, but it is probably a good idea to keep
-them that way in the interest of clarity. Since there are no
-cross-linkages between modules, new modules may be added,
-or old ones deleted, simply by editing the lists, with one
-exception: section s26, which pokes around at the hardware
-trying to figure out the characteristics of the machine that
-it is running on, saves information that is subsequently
-used by sections s626, s72, and s757. If this program is
-to be broken up into smallish pieces, say for running on
-a microcomputer, take care to see that s26 is called before
-calling any of the latter three sections. The size
-of the lists, i.e., the number of modules to be called, is
-not explicitly specified as a program parameter, but is
-determined dynamically using the sizeof operator.
-
- Communication between the main program and the modules
-takes place in two ways. In all cases, a pointer to a structure
-is passed to the called module. The structure contains flags
-that will determine the type of information to be published
-by the module, and fields that may be written in by the
-module. The former include "flgm" and "flgd", which, if set
-to a nonzero value, specify that machine dependencies are to
-be announced or that error messages are to be printed, re-
-spectively. The called module's name, and the hardware char-
-acteristics probed in s26() comprise the latter.
-
-
- Also, in all cases, a return code is returned by the called
-module. A return code of zero indicates that all has gone well;
-nonzero indicates otherwise. Since more than one type of error
-may be detected by a module, the return code is a composite
-of error indicators, which, individually, are given as numbers
-that are powers of two. Thus, a return code of 10 indicates
-that two specific errors, 8 and 2, were detected. Whether or
-not the codes returned by the modules are printed by the main
-program is determined by setting "flgs" to 1 (resp. 0).
-
- The entire logic of the main program is contained in the
-half-dozen or so lines at the end. The somewhat cryptic
-statement:
-
- d0.rrc = (*sec[j])(pd0);
-
-in the for loop calls the modules. The rest of the code is
-reasonably straightforward.
-
- Finally, in each of the modules, there is the following
-prologue:
-
- snnn(pd0)
- struct defs *pd0;
- {
- static char snnner[] = "snnn,er%d\n";
- static char qsnnn[8] = "snnn ";
- char *ps, *pt;
- int rc;
-
- rc = 0;
- ps = qsnnn;
- pt = pd0->rfs;
- while(*pt++ = *ps++);
-
-used for housekeeping, handshaking and module initialization.
-
- */
- extern
- s22(),
- s241(),
- s243(),
- s244(),
- s25(),
- s26(),
- s4(),
- s61(),
- s626(),
- s71(),
- s72(),
- s757(),
- s7813(),
- s714(),
- s715(),
- s81(),
- s84(),
- s85(),
- s86(),
- s88(),
- s9()
- ;
-
- int j;
- static int (*sec[])() = {
- s22,
- s241,
- s243,
- s244,
- s25,
- s26,
- s4,
- s61,
- s626,
- s71,
- s72,
- s757,
- s7813,
- s714,
- s715,
- s81,
- s84,
- s85,
- s86,
- s88,
- s9
- };
-
- static struct defs d0, *pd0;
-
- d0.flgs = 1; /* These flags dictate */
- d0.flgm = 1; /* the verbosity of */
- d0.flgd = 1; /* the program. */
- d0.flgl = 1;
-
- pd0 = &d0;
-
- for (j=0; j<sizeof(sec) / sizeof(sec[0]); j++) {
- d0.rrc = (*sec[j])(pd0);
- d0.crc = d0.crc+d0.rrc;
- if(d0.flgs != 0) printf("Section %s returned %d.\n",d0.rfs,d0.rrc);
- }
-
- if(d0.crc == 0) printf("\nNo errors detected.\n");
- else printf("\nFailed.\n");
- return 0;
-}
-s22(pd0) /* 2.2 Identifiers (Names) */
-struct defs *pd0;
-{
- int a234, a;
- int _, _234, A, rc;
-
- static char s22er[] = "s22,er%d\n";
- static char qs22[8] = "s22 ";
-
- char *ps, *pt;
- /* Initialize */
-
- rc = 0;
- ps = qs22;
- pt = pd0 -> rfs;
- while (*pt++ = *ps++);
-
- /* An identifier is a sequence of letters and digits;
- the first character must be a letter. The under-
- score _ counts as a letter. */
-
- a=1;
- _=2;
- _234=3;
- a234=4;
- if(a+_+_234+a234 != 10) {
- rc = rc+1;
- if(pd0->flgd != 0) printf(s22er,1);
- }
-
- /* Upper and lower case letters are different. */
-
- A = 2;
- if (A == a) {
- rc = rc+4;
- if (pd0->flgd != 0) printf(s22er,4);
- }
-
- return(rc);
-}
-s241(pd0) /* 2.4.1 Integer constants
- 2.4.2 Explicit long constants */
-struct defs *pd0;
-{
- long pow2();
- static char s241er[] = "s241,er%d\n";
- static char qs241[8] = "s241 ";
- char *ps, *pt;
- int rc, j, lrc;
- static long g[39] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,6,0,8,0,12,0,16,0,18,0,20,0,24,
- 0,28,0,30,0,32,0,36};
- long d[39], o[39], x[39];
-
- rc = 0;
- lrc = 0;
- ps = qs241;
- pt = pd0 -> rfs;
- while (*pt++ = *ps++);
-
- /* An integer constant consisting of a sequence of digits is
- taken to be octal if it begins with 0 (digit zero), decimal
- otherwise. */
-
- if ( 8 != 010
- || 16 != 020
- || 24 != 030
- || 32 != 040
- || 40 != 050
- || 48 != 060
- || 56 != 070
- || 64 != 0100
- || 72 != 0110
- || 80 != 0120
- || 9 != 0011
- || 17 != 0021
- || 25 != 0031
- || 33 != 0041
- || 41 != 0051
- || 49 != 0061
- || 57 != 0071
- || 65 != 0101
- || 73 != 0111
- || 81 != 0121 ){
-
- rc = rc+1;
- if( pd0->flgd != 0 ) printf(s241er,1);
- }
-
- /* A sequence of digits preceded by 0x or 0X (digit zero)
- is taken to be a hexadecimal integer. The hexadecimal
- digits include a or A through f or F with values 10
- through 15. */
-
- if ( 0x00abcdef != 0xabcdef
- || 0xabcdef != 0Xabcdef || 0Xabcdef != 0XAbcdef
- || 0XAbcdef != 0XABcdef || 0XABcdef != 0XABCdef
- || 0XABCdef != 0XABCDef || 0XABCDef != 0XABCDEf
- || 0XABCDEf != 0XABCDEF || 0xABCDEF != 11259375 ){
-
- rc = rc+2;
- if( pd0->flgd != 0 ) printf(s241er,2);
- }
-
- /* A decimal constant whose value exceeds the largest signed
- machine integer is taken to be long; an octal or hex con-
- stant which exceeds the largest unsigned machine integer
- is likewise taken to be long. */
-
- if ( sizeof 010000000000 != sizeof(long) /* 2**30 */
- || sizeof 1073741824 != sizeof(long) /* ditto */
- || sizeof 0x40000000 != sizeof(long) ){ /* " */
-
- rc = rc+4;
- if( pd0->flgd != 0 ) printf(s241er,4);
- }
-
- /* A decimal, octal, or hexadecimal constant immediately followed
- by l (letter ell) or L is a long constant. */
-
- if ( sizeof 67l != sizeof(long)
- || sizeof 67L != sizeof(long)
- || sizeof 067l != sizeof(long)
- || sizeof 067L != sizeof(long)
- || sizeof 0X67l != sizeof(long)
- || sizeof 0x67L != sizeof(long) ){
-
- rc = rc+8;
- if( pd0 -> flgd != 0 ) printf(s241er,8);
- }
-
- /* Finally, we test to see that decimal (d), octal (o),
- and hexadecimal (x) constants representing the same values
- agree among themselves, and with computed values, at spec-
- ified points over an appropriate range. The points select-
- ed here are those with the greatest potential for caus-
- ing trouble, i.e., zero, 1-16, and values of 2**n and
- 2**n - 1 where n is some multiple of 4 or 6. Unfortunately,
- just what happens when a value is too big to fit in a
- long is undefined; however, it would be nice if what
- happened were at least consistent... */
-
- for ( j=0; j<17; j++ ) g[j] = j;
- for ( j=18; j<39; ) {
- g[j] = pow2(g[j]);
- g[j-1] = g[j] - 1;
- j = j+2;
- }
-
- d[0] = 0; o[0] = 00; x[0] = 0x0;
- d[1] = 1; o[1] = 01; x[1] = 0x1;
- d[2] = 2; o[2] = 02; x[2] = 0x2;
- d[3] = 3; o[3] = 03; x[3] = 0x3;
- d[4] = 4; o[4] = 04; x[4] = 0x4;
- d[5] = 5; o[5] = 05; x[5] = 0x5;
- d[6] = 6; o[6] = 06; x[6] = 0x6;
- d[7] = 7; o[7] = 07; x[7] = 0x7;
- d[8] = 8; o[8] = 010; x[8] = 0x8;
- d[9] = 9; o[9] = 011; x[9] = 0x9;
- d[10] = 10; o[10] = 012; x[10] = 0xa;
- d[11] = 11; o[11] = 013; x[11] = 0xb;
- d[12] = 12; o[12] = 014; x[12] = 0xc;
- d[13] = 13; o[13] = 015; x[13] = 0xd;
- d[14] = 14; o[14] = 016; x[14] = 0xe;
- d[15] = 15; o[15] = 017; x[15] = 0xf;
- d[16] = 16; o[16] = 020; x[16] = 0x10;
- d[17] = 63; o[17] = 077; x[17] = 0x3f;
- d[18] = 64; o[18] = 0100; x[18] = 0x40;
- d[19] = 255; o[19] = 0377; x[19] = 0xff;
- d[20] = 256; o[20] = 0400; x[20] = 0x100;
- d[21] = 4095; o[21] = 07777; x[21] = 0xfff;
- d[22] = 4096; o[22] = 010000; x[22] = 0x1000;
- d[23] = 65535; o[23] = 0177777; x[23] = 0xffff;
- d[24] = 65536; o[24] = 0200000; x[24] = 0x10000;
- d[25] = 262143; o[25] = 0777777; x[25] = 0x3ffff;
- d[26] = 262144; o[26] = 01000000; x[26] = 0x40000;
- d[27] = 1048575; o[27] = 03777777; x[27] = 0xfffff;
- d[28] = 1048576; o[28] = 04000000; x[28] = 0x100000;
- d[29] = 16777215; o[29] = 077777777; x[29] = 0xffffff;
- d[30] = 16777216; o[30] = 0100000000; x[30] = 0x1000000;
- d[31] = 268435455; o[31] = 01777777777; x[31] = 0xfffffff;
- d[32] = 268435456; o[32] = 02000000000; x[32] = 0x10000000;
- d[33] = 1073741823; o[33] = 07777777777; x[33] = 0x3fffffff;
- d[34] = 1073741824; o[34] = 010000000000; x[34] = 0x40000000;
- d[35] = 4294967295; o[35] = 037777777777; x[35] = 0xffffffff;
- d[36] = 4294967296; o[36] = 040000000000; x[36] = 0x100000000;
- d[37] = 68719476735; o[37] = 0777777777777; x[37] = 0xfffffffff;
- d[38] = 68719476736; o[38] = 01000000000000; x[38] = 0x1000000000;
-
- /* WHEW! */
-
- for (j=0; j<39; j++){
- if ( g[j] != d[j]
- || d[j] != o[j]
- || o[j] != x[j]) {
-
- if( pd0 -> flgm != 0 ) {
-/* printf(s241er,16); save in case opinions change... */
- printf("Decimal and octal/hex constants sometimes give\n");
- printf(" different results when assigned to longs.\n");
- }
-/* lrc = 1; save... */
- }
- }
-
- if (lrc != 0) rc =16;
-
- return rc;
-}
-
-long pow2(n) /* Calculate 2**n by multiplying, not shifting */
-long n;
-{
- long s;
- s = 1;
- while(n--) s = s*2;
- return s;
-}
-s243(pd0) /* 2.4.3 Character constants */
-struct defs *pd0;
-{
- static char s243er[] = "s243,er%d\n";
- static char qs243[8] = "s243 ";
- char *ps, *pt;
- int rc;
- char chars[256];
-
- rc = 0;
- ps = qs243;
- pt = pd0->rfs;
- while(*pt++ = *ps++);
-
- /* One of the problems that arises when testing character constants
- is that of definition: What, exactly, is the character set?
- In order to guarantee a certain amount of machine independence,
- the character set we will use here is the set of characters writ-
- able as escape sequences in C, plus those characters used in writ-
- ing C programs, i.e.,
-
- letters:
- ABCDEFGHIJKLMNOPQRSTUVWXYZ 26
- abcdefghijklmnopqrstuvwxyz 26
- numbers:
- 0123456789 10
- special characters:
- ~!"#%&()_=-^|{}[]+;*:<>,.?/ 27
- extra special characters:
- newline \n
- horizontal tab \t
- backspace \b
- carriage return \r
- form feed \f
- backslash \\
- single quote \' 7
- blank & NUL 2
- ---
- 98
-
- Any specific implementation of C may of course support additional
- characters. */
-
- /* Since the value of a character constant is the numerical value
- of the character in the machine's character set, there should
- be a one-to-one correspondence between characters and values. */
-
- zerofill(chars);
-
- chars['a'] = 1; chars['A'] = 1; chars['~'] = 1; chars['0'] = 1;
- chars['b'] = 1; chars['B'] = 1; chars['!'] = 1; chars['1'] = 1;
- chars['c'] = 1; chars['C'] = 1; chars['"'] = 1; chars['2'] = 1;
- chars['d'] = 1; chars['D'] = 1; chars['#'] = 1; chars['3'] = 1;
- chars['e'] = 1; chars['E'] = 1; chars['%'] = 1; chars['4'] = 1;
- chars['f'] = 1; chars['F'] = 1; chars['&'] = 1; chars['5'] = 1;
- chars['g'] = 1; chars['G'] = 1; chars['('] = 1; chars['6'] = 1;
- chars['h'] = 1; chars['H'] = 1; chars[')'] = 1; chars['7'] = 1;
- chars['i'] = 1; chars['I'] = 1; chars['_'] = 1; chars['8'] = 1;
- chars['j'] = 1; chars['J'] = 1; chars['='] = 1; chars['9'] = 1;
- chars['k'] = 1; chars['K'] = 1; chars['-'] = 1;
- chars['l'] = 1; chars['L'] = 1; chars['^'] = 1;
- chars['m'] = 1; chars['M'] = 1; chars['|'] = 1; chars['\n'] = 1;
- chars['n'] = 1; chars['N'] = 1; chars['\t'] = 1;
- chars['o'] = 1; chars['O'] = 1; chars['{'] = 1; chars['\b'] = 1;
- chars['p'] = 1; chars['P'] = 1; chars['}'] = 1; chars['\r'] = 1;
- chars['q'] = 1; chars['Q'] = 1; chars['['] = 1; chars['\f'] = 1;
- chars['r'] = 1; chars['R'] = 1; chars[']'] = 1;
- chars['s'] = 1; chars['S'] = 1; chars['+'] = 1; chars['\\'] = 1;
- chars['t'] = 1; chars['T'] = 1; chars[';'] = 1; chars['\''] = 1;
- chars['u'] = 1; chars['U'] = 1; chars['*'] = 1;
- chars['v'] = 1; chars['V'] = 1; chars[':'] = 1; chars['\0'] = 1;
- chars['w'] = 1; chars['W'] = 1; chars['<'] = 1; chars[' '] = 1;
- chars['x'] = 1; chars['X'] = 1; chars['>'] = 1;
- chars['y'] = 1; chars['Y'] = 1; chars[','] = 1;
- chars['z'] = 1; chars['Z'] = 1; chars['.'] = 1;
- chars['?'] = 1;
- chars['/'] = 1;
-
- if(sumof(chars) != 98){
- rc = rc+1;
- if(pd0->flgd != 0) printf(s243er,1);
- }
-
- /* Finally, the escape \ddd consists of the backslash followed
- by 1, 2, or 3 octal digits which are taken to specify the
- desired character. */
-
- if( '\0' != 0 || '\01' != 1 || '\02' != 2
- || '\03' != 3 || '\04' != 4 || '\05' != 5
- || '\06' != 6 || '\07' != 7 || '\10' != 8
- || '\17' != 15 || '\20' != 16 || '\77' != 63
- || '\100' != 64 || '\177' != 127 ){
-
- rc = rc+8;
- if(pd0->flgd != 0) printf(s243er,8);
- }
-
- return rc;
-}
-zerofill(x)
-char *x;
-{
- int j;
-
- for (j=0; j<256; j++) *x++ = 0;
-}
-sumof(x)
-char *x;
-{
- char *p;
- int total, j;
-
- p = x;
- total = 0;
-
- for(j=0; j<256; j++) total = total+ *p++;
- return total;
-}
-s244(pd0)
-struct defs *pd0;
-{
- double a[8];
- int rc, lrc, j;
- static char s244er[] = "s244,er%d\n";
- static char qs244[8] = "s244 ";
- char *ps, *pt;
-
- ps = qs244;
- pt = pd0->rfs;
- while(*pt++ = *ps++);
- rc = 0;
- lrc = 0;
-
- /* Unfortunately, there's not a lot we can do with floating constants.
- We can check to see that the various representations can be com-
- piled, that the conversion is such that they yield the same hard-
- ware representations in all cases, and that all representations
- thus checked are double precision. */
-
- a[0] = .1250E+04;
- a[1] = 1.250E3;
- a[2] = 12.50E02;
- a[3] = 125.0e+1;
- a[4] = 1250e00;
- a[5] = 12500.e-01;
- a[6] = 125000e-2;
- a[7] = 1250.;
-
- lrc = 0;
- for (j=0; j<7; j++) if(a[j] != a[j+1]) lrc = 1;
-
- if(lrc != 0) {
- if(pd0->flgd != 0) printf(s244er,1);
- rc = rc+1;
- }
-
- if ( (sizeof .1250E+04 ) != sizeof(double)
- || (sizeof 1.250E3 ) != sizeof(double)
- || (sizeof 12.50E02 ) != sizeof(double)
- || (sizeof 1.250e+1 ) != sizeof(double)
- || (sizeof 1250e00 ) != sizeof(double)
- || (sizeof 12500.e-01) != sizeof(double)
- || (sizeof 125000e-2 ) != sizeof(double)
- || (sizeof 1250. ) != sizeof(double)){
-
- if(pd0->flgd != 0) printf(s244er,2);
- rc = rc+2;
- }
-
- return rc;
-}
-s25(pd0)
-struct defs *pd0;
-{
- char *s, *s2;
- int rc, lrc, j;
- static char s25er[] = "s25,er%d\n";
- static char qs25[8] = "s25 ";
- char *ps, *pt;
-
- ps = qs25;
- pt = pd0->rfs;
- while(*pt++ = *ps++);
- rc = 0;
-
- /* A string is a sequence of characters surrounded by double
- quotes, as in "...". */
-
- s = "...";
-
- /* A string has type "array of characters" and storage class
- static and is initialized with the given characters. */
-
- if ( s[0] != s[1] || s[1] != s[2]
- || s[2] != '.' ) {
-
- rc = rc+1;
- if(pd0->flgd != 0) printf(s25er,1);
- }
-
- /* The compiler places a null byte \0 at the end of each string
- so the program which scans the string can find its end. */
-
- if( s[3] != '\0' ){
- rc = rc+4;
- if(pd0->flgd != 0) printf(s25er,4);
- }
-
- /* In a string, the double quote character " must be preceded
- by a \. */
-
- if( ".\"."[1] != '"' ){
- rc = rc+8;
- if(pd0->flgd != 0) printf(s25er,8);
- }
-
- /* In addition, the same escapes described for character constants
- may be used. */
-
- s = "\n\t\b\r\f\\\'";
-
- if( s[0] != '\n'
- || s[1] != '\t'
- || s[2] != '\b'
- || s[3] != '\r'
- || s[4] != '\f'
- || s[5] != '\\'
- || s[6] != '\'' ){
-
- rc = rc+16;
- if( pd0->flgd != 0) printf(s25er,16);
- }
-
- /* Finally, a \ and an immediately following newline are ignored */
-
- s2 = "queep!";
- s = "queep!";
-
- lrc = 0;
- for (j=0; j<sizeof "queep!"; j++) if(s[j] != s2[j]) lrc = 1;
- if (lrc != 0){
- rc = rc+32;
- if(pd0->flgd != 0) printf(s25er,32);
- }
- return rc;
-}
-s26(pd0) /* 2.6 Hardware Characteristics */
-struct defs *pd0;
-{
- static char qs26[8] = "s26 ";
- char *ps, *pt;
- char c0, c1;
- float temp, one, delta;
- double tempd, oned;
- static char s[] = "%3d bits in %ss.\n";
- static char s2[] = "%e is the least number that can be added to 1. (%s).\n";
-
- ps = qs26;
- pt = pd0->rfs;
-
- while(*pt++ = *ps++);
-
- /* Here, we shake the machinery a little to see what falls
- out. First, we find out how many bits are in a char. */
-
- pd0->cbits = 0;
- c0 = 0;
- c1 = 1;
-
- while(c0 != c1) {
- c1 = c1<<1;
- pd0->cbits = pd0->cbits+1;
- }
- /* That information lets us determine the size of everything else. */
-
- pd0->ibits = pd0->cbits * sizeof(int);
- pd0->sbits = pd0->cbits * sizeof(short);
- pd0->lbits = pd0->cbits * sizeof(long);
- pd0->ubits = pd0->cbits * sizeof(unsigned);
- pd0->fbits = pd0->cbits * sizeof(float);
- pd0->dbits = pd0->cbits * sizeof(double);
-
- /* We have now almost reconstructed the table in section 2.6, the
- exception being the range of the floating point hardware.
- Now there are just so many ways to conjure up a floating point
- representation system that it's damned near impossible to guess
- what's going on by writing a program to interpret bit patterns.
- Further, the information isn't all that useful, if we consider
- the fact that machines that won't handle numbers between 10**30
- and 10**-30 are very hard to find, and that people playing with
- numbers outside that range have a lot more to worry about than
- just the capacity of the characteristic.
-
- A much more useful measure is the precision, which can be ex-
- pressed in terms of the smallest number that can be added to
- 1. without loss of significance. We calculate that here, for
- float and double. */
-
- one = 1.;
- delta = 1.;
- temp = 0.;
- while(temp != one) {
- temp = one+delta;
- delta = delta/2.;
- }
- pd0->fprec = delta * 4.;
- oned = 1.;
- delta = 1.;
- tempd = 0.;
- while(tempd != oned) {
- tempd = oned+delta;
- delta = delta/2.;
- }
- pd0->dprec = delta * 4.;
-
- /* Now, if anyone's interested, we publish the results. */
-
- if(pd0->flgm != 0) {
- printf(s,pd0->cbits,"char");
- printf(s,pd0->ibits,"int");
- printf(s,pd0->sbits,"short");
- printf(s,pd0->lbits,"long");
- printf(s,pd0->ubits,"unsigned");
- printf(s,pd0->fbits,"float");
- printf(s,pd0->dbits,"double");
- printf(s2,pd0->fprec,"float");
- printf(s2,pd0->dprec,"double");
- }
- /* Since we are only exploring and perhaps reporting, but not
- testing any features, we cannot return an error code. */
-
- return 0;
-}
-int extvar;
-s4(pd0) /* 4. What's in a name? */
-struct defs *pd0;
-{
- static char s4er[] = "s4,er%d\n";
- static char qs4[8] = "s4 ";
- char *ps, *pt;
- int j, rc;
-
- short sint; /* short integer, for size test */
- int pint; /* plain */
- long lint; /* long */
- unsigned target;
- unsigned int mask;
-
- rc = 0;
- ps = qs4;
- pt = pd0->rfs;
-
- while(*pt++ = *ps++);
-
-/* There are four declarable storage classes: automatic,
-static, external, and register. Automatic variables have
-been dealt with extensively thus far, and will not be specif-
-ically treated in this section. Register variables are treated
-in section s81.
-
- Static variables are local to a block, but retain their
-values upon reentry to a block, even after control has left
-the block. */
-
- for (j=0; j<3; j++)
- if(svtest(j) != zero()){
- rc = 1;
- if(pd0->flgd != 0) printf(s4er,1);
- }
- ;
-
-/* External variables exist and retain their values throughout
-the execution of the entire program, and may be used for comm-
-unication between functions, even separately compiled functions.
- */
-
- setev();
- if(testev() != 0){
- rc=rc+2;
- if(pd0->flgd != 0) printf(s4er,2);
- }
-/*
- Characters have been tested elsewhere (in s243).
-
- Up to three sizes of integer, declared short int, int, and
-long int, are available. Longer integers provide no less storage
-than shorter ones, but implementation may make either short
-integers, or long integers, or both, equivalent to plain
-integers.
- */
-
- if(sizeof lint < sizeof pint || sizeof pint < sizeof sint){
-
- rc = rc+4;
- if(pd0->flgd != 0) printf(s4er,4);
- }
-
-/* Unsigned integers, declared unsigned, obey the laws of
-arithmetic modulo 2**n, where n is the number of bits in the
-implementation */
-
- target = ~0U;
- mask = 1;
-
- for(j=0; j<(sizeof target)*pd0->cbits; j++){
-
- mask = mask⌖
- target = target>>1;
- }
-
- if(mask != 1 || target != 0){
-
- rc = rc+8;
- if(pd0->flgd != 0) printf(s4er,8);
- }
-
- return rc;
-}
-svtest(n)
-int n;
-{
- static k;
- int rc;
- switch (n) {
-
- case 0: k = 1978;
- rc = 0;
- break;
-
- case 1: if(k != 1978) rc = 1;
- else{
- k = 1929;
- rc = 0;
- }
- break;
-
- case 2: if(k != 1929) rc = 1;
- else rc = 0;
- break;
- }
- return rc;
-}
-zero(){ /* Returns a value of zero, possibly */
- static k; /* with side effects, as it's called */
- int rc; /* alternately with svtest, above, */
- k = 2; /* and has the same internal storage */
- rc = 0; /* requirements. */
- return rc;
-}
-testev(){
- if(extvar != 1066) return 1;
- else return 0;
-}
-s61(pd0) /* Characters and integers */
-struct defs *pd0;
-{
- static char s61er[] = "s61,er%d\n";
- static char qs61[8] = "s61 ";
- short from, shortint;
- long int to, longint;
- int rc, lrc;
- int j;
- char fromc, charint;
- char *wd, *pc[6];
-
- static char upper_alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- static char lower_alpha[] = "abcdefghijklmnopqrstuvwxyz";
- static char numbers[] = "0123456789";
- static char special_characters[] = "~!\"#%&()_=-^|{}[]+;*:<>,.?/";
- static char extra_special_characters[] = "\n\t\b\r\f\\\'";
- static char blank_and_NUL[] = " \0";
-
- char *ps, *pt;
- ps = qs61;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
-/* A character or a short integer may be used wherever
-an integer may be used. In all cases, the value is converted
-to integer. This principle is extensively used throughout this
-program, and will not be explicitly tested here. */
-
-/* Conversion of a shorter integer to a longer always
-involves sign extension. */
-
- from = -19;
- to = from;
-
- if(to != -19){
- rc = rc+1;
- if(pd0->flgd != 0) printf(s61er,1);
- }
-
-/* It is guaranteed that a member of the standard char-
-acter set is nonnegative. */
-
- pc[0] = upper_alpha;
- pc[1] = lower_alpha;
- pc[2] = numbers;
- pc[3] = special_characters;
- pc[4] = extra_special_characters;
- pc[5] = blank_and_NUL;
-
- lrc = 0;
- for (j=0; j<6; j++)
- while(*pc[j]) if(*pc[j]++ < 0) lrc =1;
-
- if(lrc != 0){
- rc=rc+2;
- if(pd0->flgd != 0) printf(s61er,2);
- }
-
-/* When a longer integer is converted to a shorter or
-to a char, it is truncated on the left; excess bits are
-simply discarded. */
-
- longint = 1048579; /* =2**20+3 */
- shortint = longint;
- charint = longint;
-
- if((shortint != longint && shortint != 3) ||
- (charint != longint && charint != 3)) {
- rc = rc+8;
- if(pd0->flgd != 0) printf(s61er,8);
- }
-
- return rc;
-}
-s626(pd0) /* 6.2 Float and double */
- /* 6.3 Floating and integral */
- /* 6.4 Pointers and integers */
- /* 6.5 Unsigned */
- /* 6.6 Arithmetic conversions */
-struct defs *pd0;
-{
- static char s626er[] = "s626,er%d\n";
- static char qs626[8] = "s626 ";
- int rc;
- char *ps, *pt;
- float eps, f1, f2, f3, f4, f;
- long lint1, lint2, l, ls;
- char c, t[28], t0;
- short s;
- int is, i, j;
- unsigned u, us;
- double d, ds;
- ps = qs626;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* Conversions of integral values to floating type are
- well-behaved. */
-
- f1 = 1.;
- lint1 = 1.;
- lint2 = 1.;
-
- for(j=0;j<pd0->lbits-2;j++){
- f1 = f1*2;
- lint2 = (lint2<<1)|lint1;
- }
- f2 = lint2;
- f1 = (f1-f2)/f1;
- if(f1>2.*pd0->fprec){
-
- rc = rc+2;
- if(pd0->flgd != 0) printf(s626er,2);
- }
-
- /* Pointer-integer combinations are discussed in s74,
- "Additive operators". The unsigned-int combination
- appears below. */
-
- c = 125;
- s = 125;
- i = 125; is = 15625;
- u = 125; us = 15625;
- l = 125; ls = 15625;
- f = 125.;
- d = 125.; ds = 15625.;
-
- for(j=0;j<28;j++) t[j] = 0;
-
- if(c*c != is) t[ 0] = 1;
- if(s*c != is) t[ 1] = 1;
- if(s*s != is) t[ 2] = 1;
- if(i*c != is) t[ 3] = 1;
- if(i*s != is) t[ 4] = 1;
- if(i*i != is) t[ 5] = 1;
- if(u*c != us) t[ 6] = 1;
- if(u*s != us) t[ 7] = 1;
- if(u*i != us) t[ 8] = 1;
- if(u*u != us) t[ 9] = 1;
- if(l*c != ls) t[10] = 1;
- if(l*s != ls) t[11] = 1;
- if(l*i != ls) t[12] = 1;
- if(l*u != us) t[13] = 1;
- if(l*l != ls) t[14] = 1;
- if(f*c != ds) t[15] = 1;
- if(f*s != ds) t[16] = 1;
- if(f*i != ds) t[17] = 1;
- if(f*u != ds) t[18] = 1;
- if(f*l != ds) t[19] = 1;
- if(f*f != ds) t[20] = 1;
- if(d*c != ds) t[21] = 1;
- if(d*s != ds) t[22] = 1;
- if(d*i != ds) t[23] = 1;
- if(d*u != ds) t[24] = 1;
- if(d*l != ds) t[25] = 1;
- if(d*f != ds) t[26] = 1;
- if(d*d != ds) t[27] = 1;
-
- t0 = 0;
- for(j=0; j<28; j++) t0 = t0+t[j];
-
- if(t0 != 0){
-
- rc = rc+4;
- if(pd0->flgd != 0){
-
- printf(s626er,4);
- printf(" key=");
- for(j=0;j<28;j++) printf("%d",t[j]);
- printf("\n");
- }
- }
-
- /* When an unsigned integer is converted to long,
- the value of the result is the same numerically
- as that of the unsigned integer. */
-
- l = (unsigned)0100000;
- if((long)l > (unsigned)0100000){
-
- rc = rc+8;
- if(pd0->flgd != 0) printf(s626er,8);
- }
-
- return rc;
-}
-s71(pd0) /* 7.1 Primary expressions */
-struct defs *pd0;
-{
- static char s71er[] = "s71,er%d\n";
- static char qs71[8] = "s71 ";
- int rc;
- char *ps, *pt;
- static char q = 'q';
- int x[10], McCarthy(), clobber(), a, b, *p;
- ps = qs71;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
-/* Testing of expressions and operators is quite complicated,
- because (a) problems are apt to surface in queer combinations
- of operators and operands, rather than in isolation,
- and (b) the number of expressions needed to provoke a case
- of improper behaviour may be quite large. Hence, we take the
- following approach: for this section, and for subsequent
- sections through 7.15, we will check the primitive operations
- in isolation, thus verifying that the primitives work,
- after a fashion. The job of testing combinations, we will
- leave to a separate, machine-generated program, to be included
- in the C test package at some later date.
- */
-
-/* A string is a primary expression. The identifier points to
- the first character of a string.
- */
-
- if(*"queep" != q){
- rc = rc+1;
- if(pd0->flgd != 0) printf(s71er,1);
- }
-/* A parenthesized expression is a primary expression whose
- type and value are the same as those of the unadorned
- expression.
- */
- if((2+3) != 2+3) {
- rc = rc+2;
- if(pd0->flgd != 0) printf(s71er,2);
- }
-
-/* A primary expression followed by an expression in square
- brackets is a primary expression. The intuitive meaning is
- that of a subscript. The expression E1[E2] is identical
- (by definition) to *((E1)+(E2)).
- */
-
- x[5] = 1942;
- if(x[5] != 1942 || x[5] != *((x)+(5))){
- rc = rc+4;
- if(pd0->flgd != 0) printf(s71er,4);
- }
-
-/* If the various flavors of function calls didn't work, we
- would never have gotten this far; however, we do need to
- show that functions can be recursive...
- */
-
- if ( McCarthy(-5) != 91){
- rc = rc+8;
- if(pd0->flgd != 0) printf(s71er,8);
- }
-
-/* and that argument passing is strictly by value. */
-
- a = 2;
- b = 3;
- p = &b;
-
- clobber(a,p);
-
- if(a != 2 || b != 2){
- rc = rc+16;
- if(pd0->flgd != 0) printf(s71er,16);
- }
-
-/* Finally, structures and unions are addressed thusly: */
-
- if(pd0->dprec != (*pd0).dprec){
- rc = rc+32;
- if(pd0->flgd != 0) printf(s71er,32);
- }
-
- return rc;
-}
-McCarthy(x)
-int x;
-{
- if(x>100) return x-10;
- else return McCarthy( McCarthy(x+11));
-}
-clobber(x,y)
-int x, *y;
-{
- x = 3;
- *y = 2;
-}
-s714(pd0) /* 7.14 Assignment operators */
-struct defs *pd0;
-{
- static char f[] = "Local error %d.\n";
- static char s714er[] = "s714,er%d\n";
- static char qs714[8] = "s714 ";
- register int prlc, lrc;
- int rc;
- char cl, cr;
- short sl, sr;
- int il, ir;
- long ll, lr;
- unsigned ul, ur;
- float fl, fr;
- double dl, dr;
- char *ps, *pt;
- ps = qs714;
- pt = pd0->rfs;
- rc = 0;
- lrc = 0;
- prlc = pd0->flgl;
- while (*pt++ = *ps++);
-
- /* This section tests the assignment operators.
-
- It is an exhaustive test of all assignment statements
- of the form:
-
- vl op vr
-
- where vl and vr are variables from the set
- {char,short,int,long,unsigned,float,double} and op is
- one of the assignment operators. There are 395 such
- statements.
-
- The initial values for the variables have been chosen
- so that both the initial values and the results will
- "fit" in just about any implementation, and that the re-
- sults will be such that they test for the proper form-
- ation of composite operators, rather than checking for
- the valid operation of those operators' components.
- For example, in checking >>=, we want to verify that
- a right shift and a move take place, rather than
- whether or not there may be some peculiarities about
- the right shift. Such tests have been made previously,
- and to repeat them here would be to throw out a red
- herring.
-
- The table below lists the operators, assignment targets,
- initial values for left and right operands, and the
- expected values of the results.
-
-
- = += -= *= /= %= >>= <<= &= ^= |=
-char 2 7 3 10 2 1 1 20 8 6 14
-short 2 7 3 10 2 1 1 20 8 6 14
-int 2 7 3 10 2 1 1 20 8 6 14
-long 2 7 3 10 2 1 1 20 8 6 14
-unsigned 2 7 3 10 2 1 1 20 8 6 14
-float 2 7 3 10 2.5 | |
-double 2 7 3 10 2.5 | |
- | |
-initial (5,2) | (5,2) | (12,10)
-
- The following machine-generated program reflects the
- tests described in the table.
- */
-
- cl = 5; cr = 2;
- cl = cr;
- if(cl != 2){
- lrc = 1;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl = sr;
- if(cl != 2){
- lrc = 2;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl = ir;
- if(cl != 2){
- lrc = 3;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl = lr;
- if(cl != 2){
- lrc = 4;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl = ur;
- if(cl != 2){
- lrc = 5;
- if(prlc) printf(f,lrc);
- }
- cl = 5; fr = 2;
- cl = fr;
- if(cl != 2){
- lrc = 6;
- if(prlc) printf(f,lrc);
- }
- cl = 5; dr = 2;
- cl = dr;
- if(cl != 2){
- lrc = 7;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl = cr;
- if(sl != 2){
- lrc = 8;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl = sr;
- if(sl != 2){
- lrc = 9;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl = ir;
- if(sl != 2){
- lrc = 10;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl = lr;
- if(sl != 2){
- lrc = 11;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl = ur;
- if(sl != 2){
- lrc = 12;
- if(prlc) printf(f,lrc);
- }
- sl = 5; fr = 2;
- sl = fr;
- if(sl != 2){
- lrc = 13;
- if(prlc) printf(f,lrc);
- }
- sl = 5; dr = 2;
- sl = dr;
- if(sl != 2){
- lrc = 14;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il = cr;
- if(il != 2){
- lrc = 15;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il = sr;
- if(il != 2){
- lrc = 16;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il = ir;
- if(il != 2){
- lrc = 17;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il = lr;
- if(il != 2){
- lrc = 18;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il = ur;
- if(il != 2){
- lrc = 19;
- if(prlc) printf(f,lrc);
- }
- il = 5; fr = 2;
- il = fr;
- if(il != 2){
- lrc = 20;
- if(prlc) printf(f,lrc);
- }
- il = 5; dr = 2;
- il = dr;
- if(il != 2){
- lrc = 21;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll = cr;
- if(ll != 2){
- lrc = 22;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll = sr;
- if(ll != 2){
- lrc = 23;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll = ir;
- if(ll != 2){
- lrc = 24;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll = lr;
- if(ll != 2){
- lrc = 25;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll = ur;
- if(ll != 2){
- lrc = 26;
- if(prlc) printf(f,lrc);
- }
- ll = 5; fr = 2;
- ll = fr;
- if(ll != 2){
- lrc = 27;
- if(prlc) printf(f,lrc);
- }
- ll = 5; dr = 2;
- ll = dr;
- if(ll != 2){
- lrc = 28;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul = cr;
- if(ul != 2){
- lrc = 29;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul = sr;
- if(ul != 2){
- lrc = 30;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul = ir;
- if(ul != 2){
- lrc = 31;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul = lr;
- if(ul != 2){
- lrc = 32;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul = ur;
- if(ul != 2){
- lrc = 33;
- if(prlc) printf(f,lrc);
- }
- ul = 5; fr = 2;
- ul = fr;
- if(ul != 2){
- lrc = 34;
- if(prlc) printf(f,lrc);
- }
- ul = 5; dr = 2;
- ul = dr;
- if(ul != 2){
- lrc = 35;
- if(prlc) printf(f,lrc);
- }
- fl = 5; cr = 2;
- fl = cr;
- if(fl != 2){
- lrc = 36;
- if(prlc) printf(f,lrc);
- }
- fl = 5; sr = 2;
- fl = sr;
- if(fl != 2){
- lrc = 37;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ir = 2;
- fl = ir;
- if(fl != 2){
- lrc = 38;
- if(prlc) printf(f,lrc);
- }
- fl = 5; lr = 2;
- fl = lr;
- if(fl != 2){
- lrc = 39;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ur = 2;
- fl = ur;
- if(fl != 2){
- lrc = 40;
- if(prlc) printf(f,lrc);
- }
- fl = 5; fr = 2;
- fl = fr;
- if(fl != 2){
- lrc = 41;
- if(prlc) printf(f,lrc);
- }
- fl = 5; dr = 2;
- fl = dr;
- if(fl != 2){
- lrc = 42;
- if(prlc) printf(f,lrc);
- }
- dl = 5; cr = 2;
- dl = cr;
- if(dl != 2){
- lrc = 43;
- if(prlc) printf(f,lrc);
- }
- dl = 5; sr = 2;
- dl = sr;
- if(dl != 2){
- lrc = 44;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ir = 2;
- dl = ir;
- if(dl != 2){
- lrc = 45;
- if(prlc) printf(f,lrc);
- }
- dl = 5; lr = 2;
- dl = lr;
- if(dl != 2){
- lrc = 46;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ur = 2;
- dl = ur;
- if(dl != 2){
- lrc = 47;
- if(prlc) printf(f,lrc);
- }
- dl = 5; fr = 2;
- dl = fr;
- if(dl != 2){
- lrc = 48;
- if(prlc) printf(f,lrc);
- }
- dl = 5; dr = 2;
- dl = dr;
- if(dl != 2){
- lrc = 49;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl += cr;
- if(cl != 7){
- lrc = 50;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl += sr;
- if(cl != 7){
- lrc = 51;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl += ir;
- if(cl != 7){
- lrc = 52;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl += lr;
- if(cl != 7){
- lrc = 53;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl += ur;
- if(cl != 7){
- lrc = 54;
- if(prlc) printf(f,lrc);
- }
- cl = 5; fr = 2;
- cl += fr;
- if(cl != 7){
- lrc = 55;
- if(prlc) printf(f,lrc);
- }
- cl = 5; dr = 2;
- cl += dr;
- if(cl != 7){
- lrc = 56;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl += cr;
- if(sl != 7){
- lrc = 57;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl += sr;
- if(sl != 7){
- lrc = 58;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl += ir;
- if(sl != 7){
- lrc = 59;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl += lr;
- if(sl != 7){
- lrc = 60;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl += ur;
- if(sl != 7){
- lrc = 61;
- if(prlc) printf(f,lrc);
- }
- sl = 5; fr = 2;
- sl += fr;
- if(sl != 7){
- lrc = 62;
- if(prlc) printf(f,lrc);
- }
- sl = 5; dr = 2;
- sl += dr;
- if(sl != 7){
- lrc = 63;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il += cr;
- if(il != 7){
- lrc = 64;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il += sr;
- if(il != 7){
- lrc = 65;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il += ir;
- if(il != 7){
- lrc = 66;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il += lr;
- if(il != 7){
- lrc = 67;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il += ur;
- if(il != 7){
- lrc = 68;
- if(prlc) printf(f,lrc);
- }
- il = 5; fr = 2;
- il += fr;
- if(il != 7){
- lrc = 69;
- if(prlc) printf(f,lrc);
- }
- il = 5; dr = 2;
- il += dr;
- if(il != 7){
- lrc = 70;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll += cr;
- if(ll != 7){
- lrc = 71;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll += sr;
- if(ll != 7){
- lrc = 72;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll += ir;
- if(ll != 7){
- lrc = 73;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll += lr;
- if(ll != 7){
- lrc = 74;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll += ur;
- if(ll != 7){
- lrc = 75;
- if(prlc) printf(f,lrc);
- }
- ll = 5; fr = 2;
- ll += fr;
- if(ll != 7){
- lrc = 76;
- if(prlc) printf(f,lrc);
- }
- ll = 5; dr = 2;
- ll += dr;
- if(ll != 7){
- lrc = 77;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul += cr;
- if(ul != 7){
- lrc = 78;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul += sr;
- if(ul != 7){
- lrc = 79;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul += ir;
- if(ul != 7){
- lrc = 80;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul += lr;
- if(ul != 7){
- lrc = 81;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul += ur;
- if(ul != 7){
- lrc = 82;
- if(prlc) printf(f,lrc);
- }
- ul = 5; fr = 2;
- ul += fr;
- if(ul != 7){
- lrc = 83;
- if(prlc) printf(f,lrc);
- }
- ul = 5; dr = 2;
- ul += dr;
- if(ul != 7){
- lrc = 84;
- if(prlc) printf(f,lrc);
- }
- fl = 5; cr = 2;
- fl += cr;
- if(fl != 7){
- lrc = 85;
- if(prlc) printf(f,lrc);
- }
- fl = 5; sr = 2;
- fl += sr;
- if(fl != 7){
- lrc = 86;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ir = 2;
- fl += ir;
- if(fl != 7){
- lrc = 87;
- if(prlc) printf(f,lrc);
- }
- fl = 5; lr = 2;
- fl += lr;
- if(fl != 7){
- lrc = 88;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ur = 2;
- fl += ur;
- if(fl != 7){
- lrc = 89;
- if(prlc) printf(f,lrc);
- }
- fl = 5; fr = 2;
- fl += fr;
- if(fl != 7){
- lrc = 90;
- if(prlc) printf(f,lrc);
- }
- fl = 5; dr = 2;
- fl += dr;
- if(fl != 7){
- lrc = 91;
- if(prlc) printf(f,lrc);
- }
- dl = 5; cr = 2;
- dl += cr;
- if(dl != 7){
- lrc = 92;
- if(prlc) printf(f,lrc);
- }
- dl = 5; sr = 2;
- dl += sr;
- if(dl != 7){
- lrc = 93;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ir = 2;
- dl += ir;
- if(dl != 7){
- lrc = 94;
- if(prlc) printf(f,lrc);
- }
- dl = 5; lr = 2;
- dl += lr;
- if(dl != 7){
- lrc = 95;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ur = 2;
- dl += ur;
- if(dl != 7){
- lrc = 96;
- if(prlc) printf(f,lrc);
- }
- dl = 5; fr = 2;
- dl += fr;
- if(dl != 7){
- lrc = 97;
- if(prlc) printf(f,lrc);
- }
- dl = 5; dr = 2;
- dl += dr;
- if(dl != 7){
- lrc = 98;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl -= cr;
- if(cl != 3){
- lrc = 99;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl -= sr;
- if(cl != 3){
- lrc = 100;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl -= ir;
- if(cl != 3){
- lrc = 101;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl -= lr;
- if(cl != 3){
- lrc = 102;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl -= ur;
- if(cl != 3){
- lrc = 103;
- if(prlc) printf(f,lrc);
- }
- cl = 5; fr = 2;
- cl -= fr;
- if(cl != 3){
- lrc = 104;
- if(prlc) printf(f,lrc);
- }
- cl = 5; dr = 2;
- cl -= dr;
- if(cl != 3){
- lrc = 105;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl -= cr;
- if(sl != 3){
- lrc = 106;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl -= sr;
- if(sl != 3){
- lrc = 107;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl -= ir;
- if(sl != 3){
- lrc = 108;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl -= lr;
- if(sl != 3){
- lrc = 109;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl -= ur;
- if(sl != 3){
- lrc = 110;
- if(prlc) printf(f,lrc);
- }
- sl = 5; fr = 2;
- sl -= fr;
- if(sl != 3){
- lrc = 111;
- if(prlc) printf(f,lrc);
- }
- sl = 5; dr = 2;
- sl -= dr;
- if(sl != 3){
- lrc = 112;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il -= cr;
- if(il != 3){
- lrc = 113;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il -= sr;
- if(il != 3){
- lrc = 114;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il -= ir;
- if(il != 3){
- lrc = 115;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il -= lr;
- if(il != 3){
- lrc = 116;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il -= ur;
- if(il != 3){
- lrc = 117;
- if(prlc) printf(f,lrc);
- }
- il = 5; fr = 2;
- il -= fr;
- if(il != 3){
- lrc = 118;
- if(prlc) printf(f,lrc);
- }
- il = 5; dr = 2;
- il -= dr;
- if(il != 3){
- lrc = 119;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll -= cr;
- if(ll != 3){
- lrc = 120;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll -= sr;
- if(ll != 3){
- lrc = 121;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll -= ir;
- if(ll != 3){
- lrc = 122;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll -= lr;
- if(ll != 3){
- lrc = 123;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll -= ur;
- if(ll != 3){
- lrc = 124;
- if(prlc) printf(f,lrc);
- }
- ll = 5; fr = 2;
- ll -= fr;
- if(ll != 3){
- lrc = 125;
- if(prlc) printf(f,lrc);
- }
- ll = 5; dr = 2;
- ll -= dr;
- if(ll != 3){
- lrc = 126;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul -= cr;
- if(ul != 3){
- lrc = 127;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul -= sr;
- if(ul != 3){
- lrc = 128;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul -= ir;
- if(ul != 3){
- lrc = 129;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul -= lr;
- if(ul != 3){
- lrc = 130;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul -= ur;
- if(ul != 3){
- lrc = 131;
- if(prlc) printf(f,lrc);
- }
- ul = 5; fr = 2;
- ul -= fr;
- if(ul != 3){
- lrc = 132;
- if(prlc) printf(f,lrc);
- }
- ul = 5; dr = 2;
- ul -= dr;
- if(ul != 3){
- lrc = 133;
- if(prlc) printf(f,lrc);
- }
- fl = 5; cr = 2;
- fl -= cr;
- if(fl != 3){
- lrc = 134;
- if(prlc) printf(f,lrc);
- }
- fl = 5; sr = 2;
- fl -= sr;
- if(fl != 3){
- lrc = 135;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ir = 2;
- fl -= ir;
- if(fl != 3){
- lrc = 136;
- if(prlc) printf(f,lrc);
- }
- fl = 5; lr = 2;
- fl -= lr;
- if(fl != 3){
- lrc = 137;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ur = 2;
- fl -= ur;
- if(fl != 3){
- lrc = 138;
- if(prlc) printf(f,lrc);
- }
- fl = 5; fr = 2;
- fl -= fr;
- if(fl != 3){
- lrc = 139;
- if(prlc) printf(f,lrc);
- }
- fl = 5; dr = 2;
- fl -= dr;
- if(fl != 3){
- lrc = 140;
- if(prlc) printf(f,lrc);
- }
- dl = 5; cr = 2;
- dl -= cr;
- if(dl != 3){
- lrc = 141;
- if(prlc) printf(f,lrc);
- }
- dl = 5; sr = 2;
- dl -= sr;
- if(dl != 3){
- lrc = 142;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ir = 2;
- dl -= ir;
- if(dl != 3){
- lrc = 143;
- if(prlc) printf(f,lrc);
- }
- dl = 5; lr = 2;
- dl -= lr;
- if(dl != 3){
- lrc = 144;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ur = 2;
- dl -= ur;
- if(dl != 3){
- lrc = 145;
- if(prlc) printf(f,lrc);
- }
- dl = 5; fr = 2;
- dl -= fr;
- if(dl != 3){
- lrc = 146;
- if(prlc) printf(f,lrc);
- }
- dl = 5; dr = 2;
- dl -= dr;
- if(dl != 3){
- lrc = 147;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl *= cr;
- if(cl != 10){
- lrc = 148;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl *= sr;
- if(cl != 10){
- lrc = 149;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl *= ir;
- if(cl != 10){
- lrc = 150;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl *= lr;
- if(cl != 10){
- lrc = 151;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl *= ur;
- if(cl != 10){
- lrc = 152;
- if(prlc) printf(f,lrc);
- }
- cl = 5; fr = 2;
- cl *= fr;
- if(cl != 10){
- lrc = 153;
- if(prlc) printf(f,lrc);
- }
- cl = 5; dr = 2;
- cl *= dr;
- if(cl != 10){
- lrc = 154;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl *= cr;
- if(sl != 10){
- lrc = 155;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl *= sr;
- if(sl != 10){
- lrc = 156;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl *= ir;
- if(sl != 10){
- lrc = 157;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl *= lr;
- if(sl != 10){
- lrc = 158;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl *= ur;
- if(sl != 10){
- lrc = 159;
- if(prlc) printf(f,lrc);
- }
- sl = 5; fr = 2;
- sl *= fr;
- if(sl != 10){
- lrc = 160;
- if(prlc) printf(f,lrc);
- }
- sl = 5; dr = 2;
- sl *= dr;
- if(sl != 10){
- lrc = 161;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il *= cr;
- if(il != 10){
- lrc = 162;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il *= sr;
- if(il != 10){
- lrc = 163;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il *= ir;
- if(il != 10){
- lrc = 164;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il *= lr;
- if(il != 10){
- lrc = 165;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il *= ur;
- if(il != 10){
- lrc = 166;
- if(prlc) printf(f,lrc);
- }
- il = 5; fr = 2;
- il *= fr;
- if(il != 10){
- lrc = 167;
- if(prlc) printf(f,lrc);
- }
- il = 5; dr = 2;
- il *= dr;
- if(il != 10){
- lrc = 168;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll *= cr;
- if(ll != 10){
- lrc = 169;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll *= sr;
- if(ll != 10){
- lrc = 170;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll *= ir;
- if(ll != 10){
- lrc = 171;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll *= lr;
- if(ll != 10){
- lrc = 172;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll *= ur;
- if(ll != 10){
- lrc = 173;
- if(prlc) printf(f,lrc);
- }
- ll = 5; fr = 2;
- ll *= fr;
- if(ll != 10){
- lrc = 174;
- if(prlc) printf(f,lrc);
- }
- ll = 5; dr = 2;
- ll *= dr;
- if(ll != 10){
- lrc = 175;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul *= cr;
- if(ul != 10){
- lrc = 176;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul *= sr;
- if(ul != 10){
- lrc = 177;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul *= ir;
- if(ul != 10){
- lrc = 178;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul *= lr;
- if(ul != 10){
- lrc = 179;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul *= ur;
- if(ul != 10){
- lrc = 180;
- if(prlc) printf(f,lrc);
- }
- ul = 5; fr = 2;
- ul *= fr;
- if(ul != 10){
- lrc = 181;
- if(prlc) printf(f,lrc);
- }
- ul = 5; dr = 2;
- ul *= dr;
- if(ul != 10){
- lrc = 182;
- if(prlc) printf(f,lrc);
- }
- fl = 5; cr = 2;
- fl *= cr;
- if(fl != 10){
- lrc = 183;
- if(prlc) printf(f,lrc);
- }
- fl = 5; sr = 2;
- fl *= sr;
- if(fl != 10){
- lrc = 184;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ir = 2;
- fl *= ir;
- if(fl != 10){
- lrc = 185;
- if(prlc) printf(f,lrc);
- }
- fl = 5; lr = 2;
- fl *= lr;
- if(fl != 10){
- lrc = 186;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ur = 2;
- fl *= ur;
- if(fl != 10){
- lrc = 187;
- if(prlc) printf(f,lrc);
- }
- fl = 5; fr = 2;
- fl *= fr;
- if(fl != 10){
- lrc = 188;
- if(prlc) printf(f,lrc);
- }
- fl = 5; dr = 2;
- fl *= dr;
- if(fl != 10){
- lrc = 189;
- if(prlc) printf(f,lrc);
- }
- dl = 5; cr = 2;
- dl *= cr;
- if(dl != 10){
- lrc = 190;
- if(prlc) printf(f,lrc);
- }
- dl = 5; sr = 2;
- dl *= sr;
- if(dl != 10){
- lrc = 191;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ir = 2;
- dl *= ir;
- if(dl != 10){
- lrc = 192;
- if(prlc) printf(f,lrc);
- }
- dl = 5; lr = 2;
- dl *= lr;
- if(dl != 10){
- lrc = 193;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ur = 2;
- dl *= ur;
- if(dl != 10){
- lrc = 194;
- if(prlc) printf(f,lrc);
- }
- dl = 5; fr = 2;
- dl *= fr;
- if(dl != 10){
- lrc = 195;
- if(prlc) printf(f,lrc);
- }
- dl = 5; dr = 2;
- dl *= dr;
- if(dl != 10){
- lrc = 196;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl /= cr;
- if(cl != 2){
- lrc = 197;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl /= sr;
- if(cl != 2){
- lrc = 198;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl /= ir;
- if(cl != 2){
- lrc = 199;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl /= lr;
- if(cl != 2){
- lrc = 200;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl /= ur;
- if(cl != 2){
- lrc = 201;
- if(prlc) printf(f,lrc);
- }
- cl = 5; fr = 2;
- cl /= fr;
- if(cl != 2){
- lrc = 202;
- if(prlc) printf(f,lrc);
- }
- cl = 5; dr = 2;
- cl /= dr;
- if(cl != 2){
- lrc = 203;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl /= cr;
- if(sl != 2){
- lrc = 204;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl /= sr;
- if(sl != 2){
- lrc = 205;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl /= ir;
- if(sl != 2){
- lrc = 206;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl /= lr;
- if(sl != 2){
- lrc = 207;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl /= ur;
- if(sl != 2){
- lrc = 208;
- if(prlc) printf(f,lrc);
- }
- sl = 5; fr = 2;
- sl /= fr;
- if(sl != 2){
- lrc = 209;
- if(prlc) printf(f,lrc);
- }
- sl = 5; dr = 2;
- sl /= dr;
- if(sl != 2){
- lrc = 210;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il /= cr;
- if(il != 2){
- lrc = 211;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il /= sr;
- if(il != 2){
- lrc = 212;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il /= ir;
- if(il != 2){
- lrc = 213;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il /= lr;
- if(il != 2){
- lrc = 214;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il /= ur;
- if(il != 2){
- lrc = 215;
- if(prlc) printf(f,lrc);
- }
- il = 5; fr = 2;
- il /= fr;
- if(il != 2){
- lrc = 216;
- if(prlc) printf(f,lrc);
- }
- il = 5; dr = 2;
- il /= dr;
- if(il != 2){
- lrc = 217;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll /= cr;
- if(ll != 2){
- lrc = 218;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll /= sr;
- if(ll != 2){
- lrc = 219;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll /= ir;
- if(ll != 2){
- lrc = 220;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll /= lr;
- if(ll != 2){
- lrc = 221;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll /= ur;
- if(ll != 2){
- lrc = 222;
- if(prlc) printf(f,lrc);
- }
- ll = 5; fr = 2;
- ll /= fr;
- if(ll != 2){
- lrc = 223;
- if(prlc) printf(f,lrc);
- }
- ll = 5; dr = 2;
- ll /= dr;
- if(ll != 2){
- lrc = 224;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul /= cr;
- if(ul != 2){
- lrc = 225;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul /= sr;
- if(ul != 2){
- lrc = 226;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul /= ir;
- if(ul != 2){
- lrc = 227;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul /= lr;
- if(ul != 2){
- lrc = 228;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul /= ur;
- if(ul != 2){
- lrc = 229;
- if(prlc) printf(f,lrc);
- }
- ul = 5; fr = 2;
- ul /= fr;
- if(ul != 2){
- lrc = 230;
- if(prlc) printf(f,lrc);
- }
- ul = 5; dr = 2;
- ul /= dr;
- if(ul != 2){
- lrc = 231;
- if(prlc) printf(f,lrc);
- }
- fl = 5; cr = 2;
- fl /= cr;
- if(fl != 2.5){
- lrc = 232;
- if(prlc) printf(f,lrc);
- }
- fl = 5; sr = 2;
- fl /= sr;
- if(fl != 2.5){
- lrc = 233;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ir = 2;
- fl /= ir;
- if(fl != 2.5){
- lrc = 234;
- if(prlc) printf(f,lrc);
- }
- fl = 5; lr = 2;
- fl /= lr;
- if(fl != 2.5){
- lrc = 235;
- if(prlc) printf(f,lrc);
- }
- fl = 5; ur = 2;
- fl /= ur;
- if(fl != 2.5){
- lrc = 236;
- if(prlc) printf(f,lrc);
- }
- fl = 5; fr = 2;
- fl /= fr;
- if(fl != 2.5){
- lrc = 237;
- if(prlc) printf(f,lrc);
- }
- fl = 5; dr = 2;
- fl /= dr;
- if(fl != 2.5){
- lrc = 238;
- if(prlc) printf(f,lrc);
- }
- dl = 5; cr = 2;
- dl /= cr;
- if(dl != 2.5){
- lrc = 239;
- if(prlc) printf(f,lrc);
- }
- dl = 5; sr = 2;
- dl /= sr;
- if(dl != 2.5){
- lrc = 240;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ir = 2;
- dl /= ir;
- if(dl != 2.5){
- lrc = 241;
- if(prlc) printf(f,lrc);
- }
- dl = 5; lr = 2;
- dl /= lr;
- if(dl != 2.5){
- lrc = 242;
- if(prlc) printf(f,lrc);
- }
- dl = 5; ur = 2;
- dl /= ur;
- if(dl != 2.5){
- lrc = 243;
- if(prlc) printf(f,lrc);
- }
- dl = 5; fr = 2;
- dl /= fr;
- if(dl != 2.5){
- lrc = 244;
- if(prlc) printf(f,lrc);
- }
- dl = 5; dr = 2;
- dl /= dr;
- if(dl != 2.5){
- lrc = 245;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl %= cr;
- if(cl != 1){
- lrc = 246;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl %= sr;
- if(cl != 1){
- lrc = 247;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl %= ir;
- if(cl != 1){
- lrc = 248;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl %= lr;
- if(cl != 1){
- lrc = 249;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl %= ur;
- if(cl != 1){
- lrc = 250;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl %= cr;
- if(sl != 1){
- lrc = 251;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl %= sr;
- if(sl != 1){
- lrc = 252;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl %= ir;
- if(sl != 1){
- lrc = 253;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl %= lr;
- if(sl != 1){
- lrc = 254;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl %= ur;
- if(sl != 1){
- lrc = 255;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il %= cr;
- if(il != 1){
- lrc = 256;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il %= sr;
- if(il != 1){
- lrc = 257;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il %= ir;
- if(il != 1){
- lrc = 258;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il %= lr;
- if(il != 1){
- lrc = 259;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il %= ur;
- if(il != 1){
- lrc = 260;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll %= cr;
- if(ll != 1){
- lrc = 261;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll %= sr;
- if(ll != 1){
- lrc = 262;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll %= ir;
- if(ll != 1){
- lrc = 263;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll %= lr;
- if(ll != 1){
- lrc = 264;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll %= ur;
- if(ll != 1){
- lrc = 265;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul %= cr;
- if(ul != 1){
- lrc = 266;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul %= sr;
- if(ul != 1){
- lrc = 267;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul %= ir;
- if(ul != 1){
- lrc = 268;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul %= lr;
- if(ul != 1){
- lrc = 269;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul %= ur;
- if(ul != 1){
- lrc = 270;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl >>= cr;
- if(cl != 1){
- lrc = 271;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl >>= sr;
- if(cl != 1){
- lrc = 272;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl >>= ir;
- if(cl != 1){
- lrc = 273;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl >>= lr;
- if(cl != 1){
- lrc = 274;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl >>= ur;
- if(cl != 1){
- lrc = 275;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl >>= cr;
- if(sl != 1){
- lrc = 276;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl >>= sr;
- if(sl != 1){
- lrc = 277;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl >>= ir;
- if(sl != 1){
- lrc = 278;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl >>= lr;
- if(sl != 1){
- lrc = 279;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl >>= ur;
- if(sl != 1){
- lrc = 280;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il >>= cr;
- if(il != 1){
- lrc = 281;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il >>= sr;
- if(il != 1){
- lrc = 282;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il >>= ir;
- if(il != 1){
- lrc = 283;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il >>= lr;
- if(il != 1){
- lrc = 284;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il >>= ur;
- if(il != 1){
- lrc = 285;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll >>= cr;
- if(ll != 1){
- lrc = 286;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll >>= sr;
- if(ll != 1){
- lrc = 287;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll >>= ir;
- if(ll != 1){
- lrc = 288;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll >>= lr;
- if(ll != 1){
- lrc = 289;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll >>= ur;
- if(ll != 1){
- lrc = 290;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul >>= cr;
- if(ul != 1){
- lrc = 291;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul >>= sr;
- if(ul != 1){
- lrc = 292;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul >>= ir;
- if(ul != 1){
- lrc = 293;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul >>= lr;
- if(ul != 1){
- lrc = 294;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul >>= ur;
- if(ul != 1){
- lrc = 295;
- if(prlc) printf(f,lrc);
- }
- cl = 5; cr = 2;
- cl <<= cr;
- if(cl != 20){
- lrc = 296;
- if(prlc) printf(f,lrc);
- }
- cl = 5; sr = 2;
- cl <<= sr;
- if(cl != 20){
- lrc = 297;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ir = 2;
- cl <<= ir;
- if(cl != 20){
- lrc = 298;
- if(prlc) printf(f,lrc);
- }
- cl = 5; lr = 2;
- cl <<= lr;
- if(cl != 20){
- lrc = 299;
- if(prlc) printf(f,lrc);
- }
- cl = 5; ur = 2;
- cl <<= ur;
- if(cl != 20){
- lrc = 300;
- if(prlc) printf(f,lrc);
- }
- sl = 5; cr = 2;
- sl <<= cr;
- if(sl != 20){
- lrc = 301;
- if(prlc) printf(f,lrc);
- }
- sl = 5; sr = 2;
- sl <<= sr;
- if(sl != 20){
- lrc = 302;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ir = 2;
- sl <<= ir;
- if(sl != 20){
- lrc = 303;
- if(prlc) printf(f,lrc);
- }
- sl = 5; lr = 2;
- sl <<= lr;
- if(sl != 20){
- lrc = 304;
- if(prlc) printf(f,lrc);
- }
- sl = 5; ur = 2;
- sl <<= ur;
- if(sl != 20){
- lrc = 305;
- if(prlc) printf(f,lrc);
- }
- il = 5; cr = 2;
- il <<= cr;
- if(il != 20){
- lrc = 306;
- if(prlc) printf(f,lrc);
- }
- il = 5; sr = 2;
- il <<= sr;
- if(il != 20){
- lrc = 307;
- if(prlc) printf(f,lrc);
- }
- il = 5; ir = 2;
- il <<= ir;
- if(il != 20){
- lrc = 308;
- if(prlc) printf(f,lrc);
- }
- il = 5; lr = 2;
- il <<= lr;
- if(il != 20){
- lrc = 309;
- if(prlc) printf(f,lrc);
- }
- il = 5; ur = 2;
- il <<= ur;
- if(il != 20){
- lrc = 310;
- if(prlc) printf(f,lrc);
- }
- ll = 5; cr = 2;
- ll <<= cr;
- if(ll != 20){
- lrc = 311;
- if(prlc) printf(f,lrc);
- }
- ll = 5; sr = 2;
- ll <<= sr;
- if(ll != 20){
- lrc = 312;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ir = 2;
- ll <<= ir;
- if(ll != 20){
- lrc = 313;
- if(prlc) printf(f,lrc);
- }
- ll = 5; lr = 2;
- ll <<= lr;
- if(ll != 20){
- lrc = 314;
- if(prlc) printf(f,lrc);
- }
- ll = 5; ur = 2;
- ll <<= ur;
- if(ll != 20){
- lrc = 315;
- if(prlc) printf(f,lrc);
- }
- ul = 5; cr = 2;
- ul <<= cr;
- if(ul != 20){
- lrc = 316;
- if(prlc) printf(f,lrc);
- }
- ul = 5; sr = 2;
- ul <<= sr;
- if(ul != 20){
- lrc = 317;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ir = 2;
- ul <<= ir;
- if(ul != 20){
- lrc = 318;
- if(prlc) printf(f,lrc);
- }
- ul = 5; lr = 2;
- ul <<= lr;
- if(ul != 20){
- lrc = 319;
- if(prlc) printf(f,lrc);
- }
- ul = 5; ur = 2;
- ul <<= ur;
- if(ul != 20){
- lrc = 320;
- if(prlc) printf(f,lrc);
- }
- cl = 12; cr = 10;
- cl &= cr;
- if(cl != 8){
- lrc = 321;
- if(prlc) printf(f,lrc);
- }
- cl = 12; sr = 10;
- cl &= sr;
- if(cl != 8){
- lrc = 322;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ir = 10;
- cl &= ir;
- if(cl != 8){
- lrc = 323;
- if(prlc) printf(f,lrc);
- }
- cl = 12; lr = 10;
- cl &= lr;
- if(cl != 8){
- lrc = 324;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ur = 10;
- cl &= ur;
- if(cl != 8){
- lrc = 325;
- if(prlc) printf(f,lrc);
- }
- sl = 12; cr = 10;
- sl &= cr;
- if(sl != 8){
- lrc = 326;
- if(prlc) printf(f,lrc);
- }
- sl = 12; sr = 10;
- sl &= sr;
- if(sl != 8){
- lrc = 327;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ir = 10;
- sl &= ir;
- if(sl != 8){
- lrc = 328;
- if(prlc) printf(f,lrc);
- }
- sl = 12; lr = 10;
- sl &= lr;
- if(sl != 8){
- lrc = 329;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ur = 10;
- sl &= ur;
- if(sl != 8){
- lrc = 330;
- if(prlc) printf(f,lrc);
- }
- il = 12; cr = 10;
- il &= cr;
- if(il != 8){
- lrc = 331;
- if(prlc) printf(f,lrc);
- }
- il = 12; sr = 10;
- il &= sr;
- if(il != 8){
- lrc = 332;
- if(prlc) printf(f,lrc);
- }
- il = 12; ir = 10;
- il &= ir;
- if(il != 8){
- lrc = 333;
- if(prlc) printf(f,lrc);
- }
- il = 12; lr = 10;
- il &= lr;
- if(il != 8){
- lrc = 334;
- if(prlc) printf(f,lrc);
- }
- il = 12; ur = 10;
- il &= ur;
- if(il != 8){
- lrc = 335;
- if(prlc) printf(f,lrc);
- }
- ll = 12; cr = 10;
- ll &= cr;
- if(ll != 8){
- lrc = 336;
- if(prlc) printf(f,lrc);
- }
- ll = 12; sr = 10;
- ll &= sr;
- if(ll != 8){
- lrc = 337;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ir = 10;
- ll &= ir;
- if(ll != 8){
- lrc = 338;
- if(prlc) printf(f,lrc);
- }
- ll = 12; lr = 10;
- ll &= lr;
- if(ll != 8){
- lrc = 339;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ur = 10;
- ll &= ur;
- if(ll != 8){
- lrc = 340;
- if(prlc) printf(f,lrc);
- }
- ul = 12; cr = 10;
- ul &= cr;
- if(ul != 8){
- lrc = 341;
- if(prlc) printf(f,lrc);
- }
- ul = 12; sr = 10;
- ul &= sr;
- if(ul != 8){
- lrc = 342;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ir = 10;
- ul &= ir;
- if(ul != 8){
- lrc = 343;
- if(prlc) printf(f,lrc);
- }
- ul = 12; lr = 10;
- ul &= lr;
- if(ul != 8){
- lrc = 344;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ur = 10;
- ul &= ur;
- if(ul != 8){
- lrc = 345;
- if(prlc) printf(f,lrc);
- }
- cl = 12; cr = 10;
- cl ^= cr;
- if(cl != 6){
- lrc = 346;
- if(prlc) printf(f,lrc);
- }
- cl = 12; sr = 10;
- cl ^= sr;
- if(cl != 6){
- lrc = 347;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ir = 10;
- cl ^= ir;
- if(cl != 6){
- lrc = 348;
- if(prlc) printf(f,lrc);
- }
- cl = 12; lr = 10;
- cl ^= lr;
- if(cl != 6){
- lrc = 349;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ur = 10;
- cl ^= ur;
- if(cl != 6){
- lrc = 350;
- if(prlc) printf(f,lrc);
- }
- sl = 12; cr = 10;
- sl ^= cr;
- if(sl != 6){
- lrc = 351;
- if(prlc) printf(f,lrc);
- }
- sl = 12; sr = 10;
- sl ^= sr;
- if(sl != 6){
- lrc = 352;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ir = 10;
- sl ^= ir;
- if(sl != 6){
- lrc = 353;
- if(prlc) printf(f,lrc);
- }
- sl = 12; lr = 10;
- sl ^= lr;
- if(sl != 6){
- lrc = 354;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ur = 10;
- sl ^= ur;
- if(sl != 6){
- lrc = 355;
- if(prlc) printf(f,lrc);
- }
- il = 12; cr = 10;
- il ^= cr;
- if(il != 6){
- lrc = 356;
- if(prlc) printf(f,lrc);
- }
- il = 12; sr = 10;
- il ^= sr;
- if(il != 6){
- lrc = 357;
- if(prlc) printf(f,lrc);
- }
- il = 12; ir = 10;
- il ^= ir;
- if(il != 6){
- lrc = 358;
- if(prlc) printf(f,lrc);
- }
- il = 12; lr = 10;
- il ^= lr;
- if(il != 6){
- lrc = 359;
- if(prlc) printf(f,lrc);
- }
- il = 12; ur = 10;
- il ^= ur;
- if(il != 6){
- lrc = 360;
- if(prlc) printf(f,lrc);
- }
- ll = 12; cr = 10;
- ll ^= cr;
- if(ll != 6){
- lrc = 361;
- if(prlc) printf(f,lrc);
- }
- ll = 12; sr = 10;
- ll ^= sr;
- if(ll != 6){
- lrc = 362;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ir = 10;
- ll ^= ir;
- if(ll != 6){
- lrc = 363;
- if(prlc) printf(f,lrc);
- }
- ll = 12; lr = 10;
- ll ^= lr;
- if(ll != 6){
- lrc = 364;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ur = 10;
- ll ^= ur;
- if(ll != 6){
- lrc = 365;
- if(prlc) printf(f,lrc);
- }
- ul = 12; cr = 10;
- ul ^= cr;
- if(ul != 6){
- lrc = 366;
- if(prlc) printf(f,lrc);
- }
- ul = 12; sr = 10;
- ul ^= sr;
- if(ul != 6){
- lrc = 367;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ir = 10;
- ul ^= ir;
- if(ul != 6){
- lrc = 368;
- if(prlc) printf(f,lrc);
- }
- ul = 12; lr = 10;
- ul ^= lr;
- if(ul != 6){
- lrc = 369;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ur = 10;
- ul ^= ur;
- if(ul != 6){
- lrc = 370;
- if(prlc) printf(f,lrc);
- }
- cl = 12; cr = 10;
- cl |= cr;
- if(cl != 14){
- lrc = 371;
- if(prlc) printf(f,lrc);
- }
- cl = 12; sr = 10;
- cl |= sr;
- if(cl != 14){
- lrc = 372;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ir = 10;
- cl |= ir;
- if(cl != 14){
- lrc = 373;
- if(prlc) printf(f,lrc);
- }
- cl = 12; lr = 10;
- cl |= lr;
- if(cl != 14){
- lrc = 374;
- if(prlc) printf(f,lrc);
- }
- cl = 12; ur = 10;
- cl |= ur;
- if(cl != 14){
- lrc = 375;
- if(prlc) printf(f,lrc);
- }
- sl = 12; cr = 10;
- sl |= cr;
- if(sl != 14){
- lrc = 376;
- if(prlc) printf(f,lrc);
- }
- sl = 12; sr = 10;
- sl |= sr;
- if(sl != 14){
- lrc = 377;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ir = 10;
- sl |= ir;
- if(sl != 14){
- lrc = 378;
- if(prlc) printf(f,lrc);
- }
- sl = 12; lr = 10;
- sl |= lr;
- if(sl != 14){
- lrc = 379;
- if(prlc) printf(f,lrc);
- }
- sl = 12; ur = 10;
- sl |= ur;
- if(sl != 14){
- lrc = 380;
- if(prlc) printf(f,lrc);
- }
- il = 12; cr = 10;
- il |= cr;
- if(il != 14){
- lrc = 381;
- if(prlc) printf(f,lrc);
- }
- il = 12; sr = 10;
- il |= sr;
- if(il != 14){
- lrc = 382;
- if(prlc) printf(f,lrc);
- }
- il = 12; ir = 10;
- il |= ir;
- if(il != 14){
- lrc = 383;
- if(prlc) printf(f,lrc);
- }
- il = 12; lr = 10;
- il |= lr;
- if(il != 14){
- lrc = 384;
- if(prlc) printf(f,lrc);
- }
- il = 12; ur = 10;
- il |= ur;
- if(il != 14){
- lrc = 385;
- if(prlc) printf(f,lrc);
- }
- ll = 12; cr = 10;
- ll |= cr;
- if(ll != 14){
- lrc = 386;
- if(prlc) printf(f,lrc);
- }
- ll = 12; sr = 10;
- ll |= sr;
- if(ll != 14){
- lrc = 387;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ir = 10;
- ll |= ir;
- if(ll != 14){
- lrc = 388;
- if(prlc) printf(f,lrc);
- }
- ll = 12; lr = 10;
- ll |= lr;
- if(ll != 14){
- lrc = 389;
- if(prlc) printf(f,lrc);
- }
- ll = 12; ur = 10;
- ll |= ur;
- if(ll != 14){
- lrc = 390;
- if(prlc) printf(f,lrc);
- }
- ul = 12; cr = 10;
- ul |= cr;
- if(ul != 14){
- lrc = 391;
- if(prlc) printf(f,lrc);
- }
- ul = 12; sr = 10;
- ul |= sr;
- if(ul != 14){
- lrc = 392;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ir = 10;
- ul |= ir;
- if(ul != 14){
- lrc = 393;
- if(prlc) printf(f,lrc);
- }
- ul = 12; lr = 10;
- ul |= lr;
- if(ul != 14){
- lrc = 394;
- if(prlc) printf(f,lrc);
- }
- ul = 12; ur = 10;
- ul |= ur;
- if(ul != 14){
- lrc = 395;
- if(prlc) printf(f,lrc);
- }
- if(lrc != 0) {
- rc = 1;
- if(pd0->flgd != 0) printf(s714er,1);
- }
- return rc;
-}
-s715(pd0) /* 7.15 Comma operator */
-struct defs *pd0;
-{
- static char s715er[] = "s715,er%d\n";
- static char qs715[8] = "s715 ";
- int rc;
- char *ps, *pt;
- int a, t, c, i;
- a = c = 0;
- ps = qs715;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* A pair of expressions separated by a comma is
- evaluated left to right and the value of the left
- expression is discarded.
- */
- i = 1;
- if( i++,i++,i++,i++,++i != 6 ){
- if(pd0->flgd != 0) printf(s715er,1);
- rc = rc+1;
- }
-
- /* In contexts where the comma is given a special mean-
- ing, for example in a list of actual arguments to
- functions (sic) and lists of initializers, the comma
- operator as described in this section can only appear
- in parentheses; for example
-
- f( a, (t=3, t+2), c)
-
- has three arguments, the second of which has the
- value 5.
- */
-
- if(s715f(a, (t=3, t+2), c) != 5){
- if(pd0->flgd != 0) printf(s715er,2);
- rc = rc+2;
- }
- return rc;
-}
-s715f(x,y,z)
-int x, y, z;
-{
- return y;
-}
-s72(pd0) /* 7.2 Unary operators */
-struct defs *pd0;
-{
- static char s72er[] = "s72,er%d\n";
- static char qs72[8] = "s72 ";
- int rc;
- char *ps, *pt;
- int k, j, i, lrc;
- char c;
- short s;
- long l;
- unsigned u;
- double d;
- float f;
- ps = qs72;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* The *, denoting indirection, and the &, denoting a
- pointer, are duals of each other, and ought to behave as
- such... */
-
- k = 2;
- if(*&*&k != 2){
- rc = rc+1;
- printf(s72er,1);
- }
-
- /* The unary minus has the conventional meaning. */
-
- if(k+(-k) != 0){
- rc = rc+2;
- printf(s72er,2);
- }
-
- /* The negation operator (!) has been thoroughly checked out,
- perhaps more thoroughly than any of the others. The ~ oper-
- ator gets us a ones complement. */
-
- k = 0;
- for(j=0;j<pd0->ibits;j++) k = (k<<1)|1;
- if(~k != 0){
- rc = rc+4;
- printf(s72er,4);
- }
-
- /* Now we look at the ++ and -- operators, which can be
- used in either prefix or suffix form. With side
- effects they're loaded. */
-
- k = 5;
-
- if( ++k != 6 || --k != 5
- || k++ != 5 || k-- != 6
- || k != 5 ){
- rc = rc+8;
- printf(s72er,8);
- }
-
- /* An expression preceded by the parenthesised name of a
- data type causes conversion of the value of the expression
- to the named type. This construction is called a cast.
- Here, we check to see that all of the possible casts and
- their simple combinations are accepted by the compiler,
- and that they all produce a correct result for this sample
- of size one. */
-
- c = 26; l = 26; d = 26.;
- s = 26; u = 26;
- i = 26; f = 26.;
-
- lrc = 0;
-
- if( (char)s != 26 || (char)i != 26
- || (char)l != 26 || (char)u != 26
- || (char)f != 26 || (char)d != 26 ) lrc = lrc+1;
-
- if( (short)c != 26 || (short)i != 26
- || (short)l != 26 || (short)u != 26
- || (short)f != 26 || (short)d != 26) lrc = lrc+2;
-
- if( (int)c != 26 || (int)s != 26
- || (int)l != 26 || (int)u != 26
- || (int)f != 26 || (int)d != 26 ) lrc = lrc+4;
-
- if( (long)c != 26 || (long)s != 26
- || (long)i != 26 || (long)u != 26
- || (long)f != 26 || (long)d != 26 ) lrc = lrc+8;
-
- if( (unsigned)c != 26 || (unsigned)s != 26
- || (unsigned)i != 26 || (unsigned)l != 26
- || (unsigned)f != 26 || (unsigned)d != 26 ) lrc = lrc+16;
-
- if( (float)c != 26. || (float)s != 26.
- || (float)i != 26. || (float)l != 26.
- || (float)u != 26. || (float)d != 26. ) lrc = lrc+32;
-
- if( (double)c != 26. || (double)s != 26.
- || (double)i != 26. || (double)l != 26.
- || (double)u != 26. || (double)f != 26. ) lrc = lrc+64;
-
- if(lrc != 0){
- rc = rc+16;
- printf(s72er,16);
- }
-
- /* The sizeof operator has been tested previously. */
-
- return rc;
-}
-s757(pd0) /* 7.5 Shift operators */
- /* 7.6 Relational operators */
- /* 7.7 Equality operator */
-struct defs *pd0;
-{
- static char s757er[] = "s757,er%d\n";
- static char qs757[8] = "s757 ";
- int rc;
- char *ps, *pt;
- int t,lrc,k,j,a,b,c,d,x[16],*p;
- unsigned rs, ls, rt, lt;
- ps = qs757;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* The shift operators << and >> group left-to-right.
- */
-
- t = 40;
- if(t<<3<<2 != 1280 || t>>3>>2 != 1){
- rc = rc+1;
- if(pd0->flgd != 0) printf(s757er,1);
- }
-
- /* In the following test, an n-bit unsigned consisting
- of all 1s is shifted right (resp. left) k bits, 0<=k<n.
- We expect to find k 0s followed by n-k 1s (resp. n-k 1s
- followed by k 0s). If not, we complain.
- */
-
- lrc = 0;
- for(k=0; k<pd0->ubits; k++){
- rs = 1;
- ls = rs<<(pd0->ubits-1);
-
- rt = 0;
- lt = ~rt>>k;
- rt = ~rt<<k;
-
- for(j=0; j<pd0->ubits;j++){
- if((j<k) != ((rs&rt) == 0) || (j<k) != ((ls<) == 0)) lrc = 1;
- rs = rs<<1;
- ls = ls>>1;
- }
- }
-
- if(lrc != 0){
- rc = rc+2;
- if(pd0->flgd != 0) printf(s757er,2);
- }
-
- /* The relational operators group left-to-right, but this
- fact is not very useful; a<b<c does not mean what it
- seems to...
- */
-
- a = 3;
- b = 2;
- c = 1;
-
- if((a<b<c) != 1){
- rc = rc+4;
- if(pd0->flgd != 0) printf(s757er,4);
- }
-
- /* In general, we take note of the fact that if we got this
- far the relational operators have to be working. We test only
- that two pointers may be compared; the result depends on
- the relative locations in the address space of the
- pointed-to objects.
- */
- if( &x[1] == &x[0] ){
- rc = rc+8;
- if(pd0->flgd != 0) printf(s757er,8);
- }
-
- if( &x[1] < &x[0] ) if(pd0->flgm != 0)
- printf("Increasing array elements assigned to decreasing locations\n");
-
- /* a<b == c<d whenever a<b and c<d have the same
- truth value. */
-
- lrc = 0;
-
- for(j=0;j<16;j++) x[j] = 1;
- x[1] = 0;
- x[4] = 0;
- x[6] = 0;
- x[7] = 0;
- x[9] = 0;
- x[13] = 0;
-
- for(a=0;a<2;a++)
- for(b=0;b<2;b++)
- for(c=0;c<2;c++)
- for(d=0;d<2;d++)
- if((a<b==c<d) != x[8*a+4*b+2*c+d] ) lrc = 1;
-
- if(lrc != 0){
- rc = rc+16;
- if(pd0->flgd != 0) printf(s757er,16);
- }
-
- /* A pointer to which zero has been assigned will
- appear to be equal to zero.
- */
-
- p = 0;
-
- if(p != 0){
- rc = rc+32;
- if(pd0->flgd != 0) printf(s757er,32);
- }
-
- return rc;
-}
-s7813(pd0) /* 7.8 Bitwise AND operator
- 7.9 Bitwise OR operator
- 7.10 Bitwise exclusive OR operator
- 7.11 Logical AND operator
- 7.12 Logical OR operator
- 7.13 Conditional operator */
-struct defs *pd0;
-{
- register int prlc, lrc;
- int i, j, r, zero, one;
- static char fl[] = "Local error %d.\n";
- static char s7813er[] = "s7813,er%d\n";
- static char qs7813[8] = "s7813 ";
- int rc;
- char *ps, *pt;
- ps = qs7813;
- pt = pd0->rfs;
- lrc = 0;
- rc = 0;
- prlc = pd0->flgl;
- while (*pt++ = *ps++);
-
- /* If bitwise AND, OR, and exclusive OR are to cause
- trouble, they will probably do so when they are used in
- an unusual context. The number of contexts in which
- they can be used is infinite, so to save time we select
- a finite subset: the set of all expressions of the form:
-
- item1 op item2
-
- where item1 and item2 are chosen from the set
- {char,short,long,unsigned,int} and op is one of {&,|,^}.
- We will use 12 and 10 as values for the items, as these
- values will fit into all data types on just about any
- imaginable machine, and the results after performing the
- bitwise operations on them are distinct for each operation,
- i.e.,
-
- 12 | 10 -> 1100 | 1010 -> 1110 -> 14
- 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6
- 12 & 10 -> 1100 & 1010 -> 1000 -> 8
-
- There are 75 such combinations:
- */
-
- if(((char)12 & (char)10) != 8) {lrc = 1;
- if(prlc) printf(fl,lrc);}
- if(((char)12 | (char)10) != 14) {lrc = 2;
- if(prlc) printf(fl,lrc);}
- if(((char)12 ^ (char)10) != 6) {lrc = 3;
- if(prlc) printf(fl,lrc);}
- if(((char)12 & (short)10) != 8) {lrc = 4;
- if(prlc) printf(fl,lrc);}
- if(((char)12 | (short)10) != 14) {lrc = 5;
- if(prlc) printf(fl,lrc);}
- if(((char)12 ^ (short)10) != 6) {lrc = 6;
- if(prlc) printf(fl,lrc);}
- if(((char)12 & (long)10) != 8) {lrc = 7;
- if(prlc) printf(fl,lrc);}
- if(((char)12 | (long)10) != 14) {lrc = 8;
- if(prlc) printf(fl,lrc);}
- if(((char)12 ^ (long)10) != 6) {lrc = 9;
- if(prlc) printf(fl,lrc);}
- if(((char)12 & (unsigned)10) != 8) {lrc = 10;
- if(prlc) printf(fl,lrc);}
- if(((char)12 | (unsigned)10) != 14) {lrc = 11;
- if(prlc) printf(fl,lrc);}
- if(((char)12 ^ (unsigned)10) != 6) {lrc = 12;
- if(prlc) printf(fl,lrc);}
- if(((char)12 & (int)10) != 8) {lrc = 13;
- if(prlc) printf(fl,lrc);}
- if(((char)12 | (int)10) != 14) {lrc = 14;
- if(prlc) printf(fl,lrc);}
- if(((char)12 ^ (int)10) != 6) {lrc = 15;
- if(prlc) printf(fl,lrc);}
- if(((short)12 & (char)10) != 8) {lrc = 16;
- if(prlc) printf(fl,lrc);}
- if(((short)12 | (char)10) != 14) {lrc = 17;
- if(prlc) printf(fl,lrc);}
- if(((short)12 ^ (char)10) != 6) {lrc = 18;
- if(prlc) printf(fl,lrc);}
- if(((short)12 & (short)10) != 8) {lrc = 16;
- if(prlc) printf(fl,lrc);}
- if(((short)12 | (short)10) != 14) {lrc = 20;
- if(prlc) printf(fl,lrc);}
- if(((short)12 ^ (short)10) != 6) {lrc = 21;
- if(prlc) printf(fl,lrc);}
- if(((short)12 & (long)10) != 8) {lrc = 22;
- if(prlc) printf(fl,lrc);}
- if(((short)12 | (long)10) != 14) {lrc = 23;
- if(prlc) printf(fl,lrc);}
- if(((short)12 ^ (long)10) != 6) {lrc = 24;
- if(prlc) printf(fl,lrc);}
- if(((short)12 & (unsigned)10) != 8) {lrc = 25;
- if(prlc) printf(fl,lrc);}
- if(((short)12 | (unsigned)10) != 14) {lrc = 26;
- if(prlc) printf(fl,lrc);}
- if(((short)12 ^ (unsigned)10) != 6) {lrc = 27;
- if(prlc) printf(fl,lrc);}
- if(((short)12 & (int)10) != 8) {lrc = 28;
- if(prlc) printf(fl,lrc);}
- if(((short)12 | (int)10) != 14) {lrc = 26;
- if(prlc) printf(fl,lrc);}
- if(((short)12 ^ (int)10) != 6) {lrc = 30;
- if(prlc) printf(fl,lrc);}
- if(((long)12 & (char)10) != 8) {lrc = 31;
- if(prlc) printf(fl,lrc);}
- if(((long)12 | (char)10) != 14) {lrc = 32;
- if(prlc) printf(fl,lrc);}
- if(((long)12 ^ (char)10) != 6) {lrc = 33;
- if(prlc) printf(fl,lrc);}
- if(((long)12 & (short)10) != 8) {lrc = 34;
- if(prlc) printf(fl,lrc);}
- if(((long)12 | (short)10) != 14) {lrc = 35;
- if(prlc) printf(fl,lrc);}
- if(((long)12 ^ (short)10) != 6) {lrc = 36;
- if(prlc) printf(fl,lrc);}
- if(((long)12 & (long)10) != 8) {lrc = 37;
- if(prlc) printf(fl,lrc);}
- if(((long)12 | (long)10) != 14) {lrc = 38;
- if(prlc) printf(fl,lrc);}
- if(((long)12 ^ (long)10) != 6) {lrc = 39;
- if(prlc) printf(fl,lrc);}
- if(((long)12 & (unsigned)10) != 8) {lrc = 40;
- if(prlc) printf(fl,lrc);}
- if(((long)12 | (unsigned)10) != 14) {lrc = 41;
- if(prlc) printf(fl,lrc);}
- if(((long)12 ^ (unsigned)10) != 6) {lrc = 42;
- if(prlc) printf(fl,lrc);}
- if(((long)12 & (int)10) != 8) {lrc = 43;
- if(prlc) printf(fl,lrc);}
- if(((long)12 | (int)10) != 14) {lrc = 44;
- if(prlc) printf(fl,lrc);}
- if(((long)12 ^ (int)10) != 6) {lrc = 45;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 & (char)10) != 8) {lrc = 46;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 | (char)10) != 14) {lrc = 47;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 ^ (char)10) != 6) {lrc = 48;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 & (short)10) != 8) {lrc = 49;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 | (short)10) != 14) {lrc = 50;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 ^ (short)10) != 6) {lrc = 51;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 & (long)10) != 8) {lrc = 52;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 | (long)10) != 14) {lrc = 53;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 ^ (long)10) != 6) {lrc = 54;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 & (int)10) != 8) {lrc = 58;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 | (int)10) != 14) {lrc = 56;
- if(prlc) printf(fl,lrc);}
- if(((unsigned)12 ^ (int)10) != 6) {lrc = 60;
- if(prlc) printf(fl,lrc);}
- if(((int)12 & (char)10) != 8) {lrc = 61;
- if(prlc) printf(fl,lrc);}
- if(((int)12 | (char)10) != 14) {lrc = 62;
- if(prlc) printf(fl,lrc);}
- if(((int)12 ^ (char)10) != 6) {lrc = 63;
- if(prlc) printf(fl,lrc);}
- if(((int)12 & (short)10) != 8) {lrc = 64;
- if(prlc) printf(fl,lrc);}
- if(((int)12 | (short)10) != 14) {lrc = 65;
- if(prlc) printf(fl,lrc);}
- if(((int)12 ^ (short)10) != 6) {lrc = 66;
- if(prlc) printf(fl,lrc);}
- if(((int)12 & (long)10) != 8) {lrc = 67;
- if(prlc) printf(fl,lrc);}
- if(((int)12 | (long)10) != 14) {lrc = 68;
- if(prlc) printf(fl,lrc);}
- if(((int)12 ^ (long)10) != 6) {lrc = 69;
- if(prlc) printf(fl,lrc);}
- if(((int)12 & (unsigned)10) != 8) {lrc = 70;
- if(prlc) printf(fl,lrc);}
- if(((int)12 | (unsigned)10) != 14) {lrc = 71;
- if(prlc) printf(fl,lrc);}
- if(((int)12 ^ (unsigned)10) != 6) {lrc = 72;
- if(prlc) printf(fl,lrc);}
- if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);}
- if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);}
- if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);}
-
- if(lrc != 0){
- if(pd0->flgd != 0) printf(s7813er,1);
- rc = rc+1;
- }
-
- /* The && operator groups left to right. It returns 1
- if both of the operands are nonzero; 0 otherwise.
- It guarantees left to right evaluation; moreover, the
- second operand is not evaluated if the value of the
- first operand is 0.
- */
-
- lrc = 0;
- i = j = 0;
-
- r = i++ && j++;
- if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);}
- if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);}
- if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);}
- r = i && j++;
- if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);}
- if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);}
- if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);}
- r = i-- && j;
- if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);}
- if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);}
- if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);}
- r = i && j--;
- if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);}
- if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);}
- if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);}
-
- if(lrc!=0){
- if(pd0->flgd != 0) printf(s7813er,2);
- rc = rc+2;
- }
-
- /* The || operator groups left to right. It returns 1
- if either of its operands is nonzero; 0 otherwise. It
- guarantees left to right evaluation; moreover, the second
- operand is not evaluated if the value of the first
- operand is nonzero.
- */
-
- lrc = 0;
- i = j = 0;
- r = i++ || j;
- if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);}
- if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);}
- if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);}
- r = j++ || i;
- if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);}
- if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);}
- if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);}
- r = i-- || j--;
- if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);}
- if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);}
- if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);}
- r = i || j--;
- if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);}
- if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);}
- if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);}
-
- if(lrc!=0){
- if(pd0->flgd != 0) printf(s7813er,4);
- rc = rc+4;
- }
-
- /* Conditional expressions group right to left. */
-
- i = j = 0;
- zero = 0;
- one = 1;
- r = one?zero:one?i++:j++;
- if(r!=0 || i!=0 || j!=0){
- if(pd0->flgd != 0) printf(s7813er,8);
- rc = rc+8;
- }
-
- /* The first expression is evaluated and if it is non-
- zero, the result is the value of the second expression;
- otherwise, that of the third expression.
- */
-
- if((one?zero:1) != 0 || (zero?1:zero) != 0){
- if(pd0->flgd != 0) printf(s7813er,16);
- rc = rc+16;
- }
- return rc;
-}
-s81(pd0) /* 8.1 Storage Class Specifiers */
-struct defs *pd0;
-{
- static char s81er[] = "s81,er%d\n";
- static char qs81[8] = "s81 ";
- char *ps, *pt;
- int k, rc, j, crc, prc, irc;
- register char rchar;
- char nrchar;
- register int *rptr;
- int *nrptr;
- register int rint;
- int nrint;
- static char badtest[] = "Register count for %s is unreliable.\n";
- static char goodtest[] = "%d registers assigned to %s variables.\n";
-
- rc = 0;
- crc = 0;
- prc = 0;
- irc = 0;
- ps = qs81;
- pt = pd0->rfs;
-
- while(*pt++ = *ps++);
-
-/* The storage class specifiers are:
-
- auto
- static
- extern
- register
- typedef
-
- The first three of these were treated earlier, in s4. The last
- will be checked in s88. "Register" remains.
-
- There are three flavors of register, viz., char, int and pointer.
- We wish first to ascertain that the representations as register
- are consistent with the corresponding nonregister representations.
- */
-
- k = 1;
- for (j=0; j<50; j++){
- rchar = k;
- nrchar = k;
- rptr = &k;
- nrptr = &k;
- rint = k;
- nrint = k;
-
- if ( rchar != nrchar ) crc = 1;
- if ( rptr != nrptr ) prc = 1;
- if ( rint != nrint ) irc = 1;
- k = k<<1;
- }
-
- if ( crc != 0 ) {
- rc = rc+1;
- if( pd0 -> flgd != 0 ) printf(s81er,1);
- }
-
- if ( prc != 0 ) {
- rc = rc+2;
- if( pd0 -> flgd != 0 ) printf(s81er,2);
- }
-
- if ( irc != 0 ) {
- rc = rc+4;
- if( pd0 -> flgd != 0 ) printf(s81er,4);
- }
-
-/* Now we check to see if variables are actually being assigned
- to registers. */
-
- k = regc();
- if ( pd0->flgm != 0 ) {
- if ( k < 0 ) printf(badtest,"char");
- else printf(goodtest,k,"char");
- }
-
- k = regp();
- if ( pd0->flgm != 0 ) {
- if ( k<0 ) printf(badtest,"pointer");
- else printf(goodtest,k,"pointer");
- }
-
- k = regi();
- if ( pd0->flgm != 0 ) {
- if ( k<0 ) printf(badtest,"int");
- else printf(goodtest,k,"int");
- }
-
- return rc;
-}
-regc() { /* char to register assignment */
-/* Testing a variable whose storage class has been spec-
-ified as "register" is somewhat tricky, but it can be done in a
-fairly reliable fashion by taking advantage of our knowledge of the
-ways in which compilers operate. If we declare a collection of vari-
-ables of the same storage class, we would expect that, when storage
-for these variables is actually allocated, the variables will be
-bunched together and ordered according to one of the following
-criteria:
-
- (a) the order in which they were defined.
- (b) the order in which they are used.
- (c) alphabetically.
- (d) the order in which they appear in the compiler's
- symbol table.
- (e) some other way.
-
- Hence, if we define a sequence of variables in close alpha-
-betical order, and use them in the same order in which we define
-them, we would expect the differences between the addresses of
-successive variables to be constant, except in case (d) where the
-symbol table is a hash table, or in case (e). If a subsequence in
-the middle of this sequence is selected, and for this subsequence,
-every other variable is specified to be "register", and address
-differences are taken between adjacent nonregister variables, we would
-still expect to find constant differences if the "register" vari-
-ables were actually assigned to registers, and some other diff-
-erences if they were not. Specifically, if we had N variables
-specified as "register" of which the first n were actually ass-
-igned to registers, we would expect the sequence of differences
-to consist of a number of occurrences of some number, followed by
-N-n occurrences of some other number, followed by several occurr-
-ences of the first number. If we get a sequence like this, we can
-determine, by simple subtraction, how many (if any) variables are
-being assigned to registers. If we get some other sequence, we know
-that the test is invalid. */
-
- char r00;
- char r01;
- char r02;
- char r03;
- register char r04;
- char r05;
- register char r06;
- char r07;
- register char r08;
- char r09;
- register char r10;
- char r11;
- register char r12;
- char r13;
- register char r14;
- char r15;
- register char r16;
- char r17;
- register char r18;
- char r19;
- register char r20;
- char r21;
- register char r22;
- char r23;
- register char r24;
- char r25;
- register char r26;
- char r27;
- register char r28;
- char r29;
- register char r30;
- char r31;
- register char r32;
- char r33;
- register char r34;
- char r35;
- char r36;
- char r37;
- char r38;
-
- int s, n1, n2, nr, j, d[22];
- r00 = 0;
- r01 = 1;
- r02 = 2;
- r03 = 3;
- r04 = 4;
- r05 = 5;
- r06 = 6;
- r07 = 7;
- r08 = 8;
- r09 = 9;
- r10 = 10;
- r11 = 11;
- r12 = 12;
- r13 = 13;
- r14 = 14;
- r15 = 15;
- r16 = 16;
- r17 = 17;
- r18 = 18;
- r19 = 19;
- r20 = 20;
- r21 = 21;
- r22 = 22;
- r23 = 23;
- r24 = 24;
- r25 = 25;
- r26 = 26;
- r27 = 27;
- r28 = 28;
- r29 = 29;
- r30 = 30;
- r31 = 31;
- r32 = 32;
- r33 = 33;
- r34 = 34;
- r35 = 35;
- r36 = 36;
- r37 = 37;
- r38 = 38;
-
- d[0] = &r01 - &r00;
- d[1] = &r02 - &r01;
- d[2] = &r03 - &r02;
- d[3] = &r05 - &r03;
- d[4] = &r07 - &r05;
- d[5] = &r09 - &r07;
- d[6] = &r11 - &r09;
- d[7] = &r13 - &r11;
- d[8] = &r15 - &r13;
- d[9] = &r17 - &r15;
- d[10] = &r19 - &r17;
- d[11] = &r21 - &r19;
- d[12] = &r23 - &r21;
- d[13] = &r25 - &r23;
- d[14] = &r27 - &r25;
- d[15] = &r29 - &r27;
- d[16] = &r31 - &r29;
- d[17] = &r33 - &r31;
- d[18] = &r35 - &r33;
- d[19] = &r36 - &r35;
- d[20] = &r37 - &r36;
- d[21] = &r38 - &r37;
-
-
-/* The following FSM analyzes the string of differences. It accepts
-strings of the form a+b+a+ and returns 16 minus the number of bs,
-which is the number of variables that actually got into registers.
-Otherwise it signals rejection by returning -1., indicating that the
-test is unreliable. */
-
- n1 = d[0];
- s = 1;
-
- for (j=0; j<22; j++)
- switch (s) {
- case 1: if (d[j] != n1) {
- n2 = d[j];
- s = 2;
- nr = 1;
- }
- break;
- case 2: if (d[j] == n1) {
- s = 3;
- break;
- }
- if (d[j] == n2) {
- nr = nr+1;
- break;
- }
- s = 4;
- break;
- case 3: if (d[j] != n1) s = 4;
- break;
- }
- ;
-
- if (s == 3) return 16-nr;
- else return -1;
-}
-regi() { /* int to register assignment */
-/* Testing a variable whose storage class has been spec-
-ified as "register" is somewhat tricky, but it can be done in a
-fairly reliable fashion by taking advantage of our knowledge of the
-ways in which compilers operate. If we declare a collection of vari-
-ables of the same storage class, we would expect that, when storage
-for these variables is actually allocated, the variables will be
-bunched together and ordered according to one of the following
-criteria:
-
- (a) the order in which they were defined.
- (b) the order in which they are used.
- (c) alphabetically.
- (d) the order in which they appear in the compiler's
- symbol table.
- (e) some other way.
-
- Hence, if we define a sequence of variables in close alpha-
-betical order, and use them in the same order in which we define
-them, we would expect the differences between the addresses of
-successive variables to be constant, except in case (d) where the
-symbol table is a hash table, or in case (e). If a subsequence in
-the middle of this sequence is selected, and for this subsequence,
-every other variable is specified to be "register", and address
-differences are taken between adjacent nonregister variables, we would
-still expect to find constant differences if the "register" vari-
-ables were actually assigned to registers, and some other diff-
-erences if they were not. Specifically, if we had N variables
-specified as "register" of which the first n were actually ass-
-igned to registers, we would expect the sequence of differences
-to consist of a number of occurrences of some number, followed by
-N-n occurrences of some other number, followed by several occurr-
-ences of the first number. If we get a sequence like this, we can
-determine, by simple subtraction, how many (if any) variables are
-being assigned to registers. If we get some other sequence, we know
-that the test is invalid. */
-
-
- int r00;
- int r01;
- int r02;
- int r03;
- register int r04;
- int r05;
- register int r06;
- int r07;
- register int r08;
- int r09;
- register int r10;
- int r11;
- register int r12;
- int r13;
- register int r14;
- int r15;
- register int r16;
- int r17;
- register int r18;
- int r19;
- register int r20;
- int r21;
- register int r22;
- int r23;
- register int r24;
- int r25;
- register int r26;
- int r27;
- register int r28;
- int r29;
- register int r30;
- int r31;
- register int r32;
- int r33;
- register int r34;
- int r35;
- int r36;
- int r37;
- int r38;
-
- int s, n1, n2, nr, j, d[22];
-
- r00 = 0;
- r01 = 1;
- r02 = 2;
- r03 = 3;
- r04 = 4;
- r05 = 5;
- r06 = 6;
- r07 = 7;
- r08 = 8;
- r09 = 9;
- r10 = 10;
- r11 = 11;
- r12 = 12;
- r13 = 13;
- r14 = 14;
- r15 = 15;
- r16 = 16;
- r17 = 17;
- r18 = 18;
- r19 = 19;
- r20 = 20;
- r21 = 21;
- r22 = 22;
- r23 = 23;
- r24 = 24;
- r25 = 25;
- r26 = 26;
- r27 = 27;
- r28 = 28;
- r29 = 29;
- r30 = 30;
- r31 = 31;
- r32 = 32;
- r33 = 33;
- r34 = 34;
- r35 = 35;
- r36 = 36;
- r37 = 37;
- r38 = 38;
-
- d[0] = &r01 - &r00;
- d[1] = &r02 - &r01;
- d[2] = &r03 - &r02;
- d[3] = &r05 - &r03;
- d[4] = &r07 - &r05;
- d[5] = &r09 - &r07;
- d[6] = &r11 - &r09;
- d[7] = &r13 - &r11;
- d[8] = &r15 - &r13;
- d[9] = &r17 - &r15;
- d[10] = &r19 - &r17;
- d[11] = &r21 - &r19;
- d[12] = &r23 - &r21;
- d[13] = &r25 - &r23;
- d[14] = &r27 - &r25;
- d[15] = &r29 - &r27;
- d[16] = &r31 - &r29;
- d[17] = &r33 - &r31;
- d[18] = &r35 - &r33;
- d[19] = &r36 - &r35;
- d[20] = &r37 - &r36;
- d[21] = &r38 - &r37;
-
-
-/* The following FSM analyzes the string of differences. It accepts
-strings of the form a+b+a+ and returns 16 minus the number of bs,
-which is the number of variables that actually got into registers.
-Otherwise it signals rejection by returning -1., indicating that the
-test is unreliable. */
-
- n1 = d[0];
- s = 1;
-
- for (j=0; j<22; j++)
- switch (s) {
- case 1: if (d[j] != n1) {
- n2 = d[j];
- s = 2;
- nr = 1;
- }
- break;
- case 2: if (d[j] == n1) {
- s = 3;
- break;
- }
- if (d[j] == n2) {
- nr = nr+1;
- break;
- }
- s = 4;
- break;
- case 3: if (d[j] != n1) s = 4;
- break;
- }
- ;
-
- if (s == 3) return 16-nr;
- else return -1;
-}
-regp() { /* pointer to register assignment */
-/* Testing a variable whose storage class has been spec-
-ified as "register" is somewhat tricky, but it can be done in a
-fairly reliable fashion by taking advantage of our knowledge of the
-ways in which compilers operate. If we declare a collection of vari-
-ables of the same storage class, we would expect that, when storage
-for these variables is actually allocated, the variables will be
-bunched together and ordered according to one of the following
-criteria:
-
- (a) the order in which they were defined.
- (b) the order in which they are used.
- (c) alphabetically.
- (d) the order in which they appear in the compiler's
- symbol table.
- (e) some other way.
-
- Hence, if we define a sequence of variables in close alpha-
-betical order, and use them in the same order in which we define
-them, we would expect the differences between the addresses of
-successive variables to be constant, except in case (d) where the
-symbol table is a hash table, or in case (e). If a subsequence in
-the middle of this sequence is selected, and for this subsequence,
-every other variable is specified to be "register", and address
-differences are taken between adjacent nonregister variables, we would
-still expect to find constant differences if the "register" vari-
-ables were actually assigned to registers, and some other diff-
-erences if they were not. Specifically, if we had N variables
-specified as "register" of which the first n were actually ass-
-igned to registers, we would expect the sequence of differences
-to consist of a number of occurrences of some number, followed by
-N-n occurrences of some other number, followed by several occurr-
-ences of the first number. If we get a sequence like this, we can
-determine, by simple subtraction, how many (if any) variables are
-being assigned to registers. If we get some other sequence, we know
-that the test is invalid. */
-
-
- int *r00;
- int *r01;
- int *r02;
- int *r03;
- register int *r04;
- int *r05;
- register int *r06;
- int *r07;
- register int *r08;
- int *r09;
- register int *r10;
- int *r11;
- register int *r12;
- int *r13;
- register int *r14;
- int *r15;
- register int *r16;
- int *r17;
- register int *r18;
- int *r19;
- register int *r20;
- int *r21;
- register int *r22;
- int *r23;
- register int *r24;
- int *r25;
- register int *r26;
- int *r27;
- register int *r28;
- int *r29;
- register int *r30;
- int *r31;
- register int *r32;
- int *r33;
- register int *r34;
- int *r35;
- int *r36;
- int *r37;
- int *r38;
-
- int s, n1, n2, nr, j, d[22];
-
- r00 = (int *)&r00;
- r01 = (int *)&r01;
- r02 = (int *)&r02;
- r03 = (int *)&r03;
- r04 = (int *)&r05;
- r05 = (int *)&r05;
- r06 = (int *)&r07;
- r07 = (int *)&r07;
- r08 = (int *)&r09;
- r09 = (int *)&r09;
- r10 = (int *)&r11;
- r11 = (int *)&r11;
- r12 = (int *)&r13;
- r13 = (int *)&r13;
- r14 = (int *)&r15;
- r15 = (int *)&r15;
- r16 = (int *)&r17;
- r17 = (int *)&r17;
- r18 = (int *)&r19;
- r19 = (int *)&r19;
- r20 = (int *)&r21;
- r21 = (int *)&r21;
- r22 = (int *)&r23;
- r23 = (int *)&r23;
- r24 = (int *)&r25;
- r25 = (int *)&r25;
- r26 = (int *)&r27;
- r27 = (int *)&r27;
- r28 = (int *)&r29;
- r29 = (int *)&r29;
- r30 = (int *)&r31;
- r31 = (int *)&r31;
- r32 = (int *)&r33;
- r33 = (int *)&r33;
- r34 = (int *)&r35;
- r35 = (int *)&r35;
- r36 = (int *)&r36;
- r37 = (int *)&r37;
- r38 = (int *)&r38;
-
- d[0] = &r01 - &r00;
- d[1] = &r02 - &r01;
- d[2] = &r03 - &r02;
- d[3] = &r05 - &r03;
- d[4] = &r07 - &r05;
- d[5] = &r09 - &r07;
- d[6] = &r11 - &r09;
- d[7] = &r13 - &r11;
- d[8] = &r15 - &r13;
- d[9] = &r17 - &r15;
- d[10] = &r19 - &r17;
- d[11] = &r21 - &r19;
- d[12] = &r23 - &r21;
- d[13] = &r25 - &r23;
- d[14] = &r27 - &r25;
- d[15] = &r29 - &r27;
- d[16] = &r31 - &r29;
- d[17] = &r33 - &r31;
- d[18] = &r35 - &r33;
- d[19] = &r36 - &r35;
- d[20] = &r37 - &r36;
- d[21] = &r38 - &r37;
-
-
-/* The following FSM analyzes the string of differences. It accepts
-strings of the form a+b+a+ and returns 16 minus the number of bs,
-which is the number of variables that actually got into registers.
-Otherwise it signals rejection by returning -1., indicating that the
-test is unreliable. */
-
- n1 = d[0];
- s = 1;
- for (j=0; j<22; j++)
- switch (s) {
- case 1: if (d[j] != n1) {
- n2 = d[j];
- s = 2;
- nr = 1;
- }
- break;
- case 2: if (d[j] == n1) {
- s = 3;
- break;
- }
- if (d[j] == n2) {
- nr = nr+1;
- break;
- }
- s = 4;
- break;
- case 3: if (d[j] != n1) s = 4;
- break;
- }
- ;
-
- if (s == 3) return 16-nr;
- else return -1;
-}
-s84(pd0) /* 8.4 Meaning of declarators */
-struct defs *pd0;
-{
- int *ip, i, *fip(), (*pfi)(), j, k, array(), glork();
- static int x3d[3][5][7];
- float fa[17], *afp[17], sum;
- static char s84er[] = "s84,er%d\n";
- static char qs84[8] = "s84 ";
- int rc;
- char *ps, *pt;
- ps = qs84;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* The more common varieties of declarators have al-
- ready been touched upon, some more than others. It
- is useful to compare *fip() and (*pfi)().
- */
-
- ip = fip(3);
- if(*ip != 3){
- if(pd0->flgd != 0) printf(s84er,1);
- rc = rc+1;
- }
-
- pfi = glork;
- if((*pfi)(4) != 4){
- if(pd0->flgd != 0) printf(s84er,2);
- rc = rc+2;
- }
-
- /* Float fa[17] declares an array of floating point
- numbers, and *afp[17] declares an array of pointers
- to floats.
- */
-
- for(j=0; j<17; j++){
- fa[j] = j;
- afp[j] = &fa[j];
- }
-
- sum = 0.;
- for(j=0; j<17; j++) sum += *afp[j];
- if(sum != 136){
- if(pd0->flgd != 0) printf(s84er,4);
- rc = rc+4;
- }
-
- /* static int x3d[3][5][7] declares a static three
- dimensional array of integers, with rank 3x5x7.
- In complete detail, x3d is an array of three items;
- each item is an array of five arrays, and each of
- the latter arrays is an array of seven integers.
- Any of the expressions x3d, x3d[i], x3d[i][j],
- and x3d[i][j][k] may reasonably appear in an express-
- ion. The first three have type "array"; the last has
- type int.
- */
-
- for (i=0; i<3; i++)
- for (j=0; j<5; j++)
- for (k=0; k<7; k++)
- x3d[i][j][k] = i*35+j*7+k;
-
- i = 1; j = 2; k = 3;
-
- if( array(x3d,105,0)
- +array(x3d[i],35,35)
- +array(x3d[i][j],7,49)
- + x3d[i][j][k]-52){
-
- if(pd0->flgd != 0) printf(s84er,8);
- rc = rc+8;
- }
-
- return rc;
-}
-array(a,size,start)
-int a[], size, start;
-{
- int i;
- for(i=0; i<size; i++)
- if(a[i] != i+start) return 1;
-
- return 0;
-}
-int *fip(x)
-int x;
-{
- static int y;
- y = x;
- return &y;
-}
-glork(x)
-int x;
-{return x;}
-s85(pd0) /* 8.5 Structure and union declarations */
-struct defs *pd0;
-{
- static char s85er[] = "s85,er%d\n";
- static char qs85[8] = "s85 ";
- int rc;
- char *ps, *pt;
-
- struct tnode {
- char tword[20];
- int count;
- struct tnode *left;
- struct tnode *right;
- };
-
- struct tnode s1, s2, *sp;
-
- struct{
- char cdummy;
- char c;
- } sc;
-
- struct{
- char cdummy;
- short s;
- } ss;
-
- struct{
- char cdummy;
- int i;
- } si;
-
- struct{
- char cdummy;
- long l;
- } sl;
-
- struct{
- char cdummy;
- unsigned u;
- } su;
-
- struct{
- char cdummy;
- float f;
- } sf;
-
- struct{
- char cdummy;
- double d;
- } sd;
-
- int diff[7], j;
-
- static char *type[] = {
- "char",
- "short",
- "int",
- "long",
- "unsigned",
- "float",
- "double"
- };
-
- static char aln[] = " alignment: ";
-
- struct{
- int twobit:2;
- int :1;
- int threebit:3;
- int onebit:1;
- } s3;
-
- union{
- char u1[30];
- short u2[30];
- int u3[30];
- long u4[30];
- unsigned u5[30];
- float u6[30];
- double u7[30];
- } u0;
-
- ps = qs85;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* Within a structure, the objects declared have
- addresses which increase as their declarations are
- read left to right.
- */
-
- if( (char *)&s1.count - &s1.tword[0] <= 0
- ||(char *)&s1.left - (char *)&s1.count <= 0
- ||(char *)&s1.right - (char *)&s1.left <= 0){
- if(pd0->flgd != 0) printf(s85er,1);
- rc = rc+1;
- }
-
- /* Each non-field member of a structure begins on an
- addressing boundary appropriate to its type.
- */
-
- diff[0] = &sc.c - &sc.cdummy;
- diff[1] = (char *)&ss.s - &ss.cdummy;
- diff[2] = (char *)&si.i - &si.cdummy;
- diff[3] = (char *)&sl.l - &sl.cdummy;
- diff[4] = (char *)&su.u - &su.cdummy;
- diff[5] = (char *)&sf.f - &sf.cdummy;
- diff[6] = (char *)&sd.d - &sd.cdummy;
-
- if(pd0->flgm != 0)
- for(j=0; j<7; j++)
- printf("%s%s%d\n",type[j],aln,diff[j]);
-
- /* Field specifications are highly implementation de-
- pendent. About the only thing we can do here is to
- check is that the compiler accepts the field constructs,
- and that they seem to work, after a fashion, at
- run time...
- */
-
- s3.threebit = 7;
- s3.twobit = s3.threebit;
- s3.threebit = s3.twobit;
-
- if(s3.threebit != 3){
- if(s3.threebit == -1){
- if(pd0->flgm != 0) printf("Sign extension in fields\n");
- }
- else{
- if(pd0->flgd != 0) printf(s85er,2);
- rc = rc+2;
- }
- }
-
- s3.onebit = 1;
- if(s3.onebit != 1){
- if(pd0->flgm != 0)
- printf("Be especially careful with 1-bit fields!\n");
- }
-
- /* A union may be thought of as a structure all of whose
- members begin at offset 0 and whose size is sufficient
- to contain any of its members.
- */
-
- if( (char *)u0.u1 - (char *)&u0 != 0
- ||(char *)u0.u2 - (char *)&u0 != 0
- ||(char *)u0.u3 - (char *)&u0 != 0
- ||(char *)u0.u4 - (char *)&u0 != 0
- ||(char *)u0.u5 - (char *)&u0 != 0
- ||(char *)u0.u6 - (char *)&u0 != 0
- ||(char *)u0.u7 - (char *)&u0 != 0){
-
- if(pd0->flgd != 0) printf(s85er,4);
- rc = rc+4;
- }
-
- if( sizeof u0 < sizeof u0.u1
- ||sizeof u0 < sizeof u0.u2
- ||sizeof u0 < sizeof u0.u3
- ||sizeof u0 < sizeof u0.u4
- ||sizeof u0 < sizeof u0.u5
- ||sizeof u0 < sizeof u0.u6
- ||sizeof u0 < sizeof u0.u7){
-
- if(pd0->flgd != 0) printf(s85er,8);
- rc = rc+8;
- }
-
- /* Finally, we check that the pointers work. */
-
- s1.right = &s2;
- s2.tword[0] = 2;
- s1.right->tword[0] += 1;
- if(s2.tword[0] != 3){
- if(pd0->flgd != 0) printf(s85er,16);
- rc = rc+16;
- }
- return rc;
-}
-s86(pd0) /* 8.6 Initialization */
-struct defs *pd0;
-{
- static char s86er[] = "s86,er%d\n";
- static char qs86[8] = "s86 ";
- int lrc, rc;
- char *ps, *pt;
- int one(), i, j, k;
- static int x[] = {1,3,5};
- static int *pint = x+2;
- static int zero[10];
- int *apint = pint-1;
- register int *rpint = apint+one();
- static float y0[] = {1,3,5,2,4,6,3,5,7,0,0,0};
- static float y1[4][3] = {
- {1,3,5},
- {2,4,6},
- {3,5,7},
- };
- static float y2[4][3] = {1,3,5,2,4,6,3,5,7};
- static float y3[4][3] = {
- {1},{2},{3},{4}
- };
- ps = qs86;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* The expression in an initializer for a static or
- external variable must be a constant expression or
- an expression that reduces to the address of a pre-
- viously declared variable, possibly offset by a
- constant expression.
- */
-
- if(*pint != 5){
- if(pd0->flgd != 0) printf(s86er,1);
- rc = rc+1;
- }
-
- /* Automatic and register variables may be initialized
- by arbitrary expressions involving constants and previously
- declared variables and functions.
- */
-
- if(*apint != 3){
- if(pd0->flgd != 0) printf(s86er,2);
- rc = rc+2;
- }
-
- if(*rpint != 5){
- if(pd0->flgd != 0) printf(s86er,4);
- rc = rc+4;
- }
-
- /* Static variables that are not initialized are guar-
- anteed to start off as zero.
- */
-
- lrc = 0;
- for(j=0; j<10; j++)
- if(zero[j] != 0) lrc = 1;
- if(lrc != 0){
- if(pd0->flgd != 0) printf(s86er,8);
- rc = rc+8;
- }
-
- /* y0, y1, and y2, as declared, should define and
- initialize identical arrays.
- */
- lrc = 0;
- for(i=0; i<4; i++)
- for(j=0; j<3; j++){
- k = 3*i+j;
- if( y1[i][j] != y2[i][j]
- ||y1[i][j] != y0[k]) lrc = 1;
- }
-
- if(lrc != 0){
- if(pd0->flgd != 0) printf(s86er,16);
- rc = rc+16;
- }
-
- /* y3 initializes the first column of the array and
- leaves the rest zero.
- */
-
- lrc = 0;
- for(j=0; j<4; j++) if(y3[j][0] != j+1) lrc = 1;
-
- if(lrc != 0){
- if(pd0->flgd != 0) printf(s86er,32);
- rc = rc+32;
- }
- return rc;
-}
-one(){
- return 1;
-}
-int *metricp;
-s88(pd0) /* 8.8 Typedef */
-struct defs *pd0;
-{
- static char s88er[] = "s88,er%d\n";
- static char qs88[8] = "s88 ";
- int rc;
- char *ps, *pt;
-
- /* Declarations whose "storage class" is typdef do not
- define storage, but instead define identifiers which
- can later be used as if they were type keywords naming
- fundamental or derived types.
- */
-
- typedef int MILES, *KLICKSP;
- typedef struct {double re, im;} complex;
-
- MILES distance;
- extern KLICKSP metricp;
- complex z, *zp;
-
- ps = qs88;
- pt = pd0->rfs;
- rc = 0;
- while(*pt++ = *ps++);
-
- /* Hopefully, all of this stuff will compile. After that,
- we can only make some superficial tests.
-
- The type of distance is int,
- */
-
- if(sizeof distance != sizeof(int)){
- if(pd0->flgd != 0) printf(s88er,1);
- rc = rc+1;
- }
-
- /* that of metricp is "pointer to int", */
-
- metricp = &distance;
- distance = 2;
- *metricp = 3;
-
- if(distance != 3){
- if(pd0->flgd != 0) printf(s88er,2);
- rc = rc+2;
- }
-
- /* and that of z is the specified structure. zp is a
- pointer to such a structure.
- */
-
- z.re = 0.;
- z.im = 0.;
- zp = &z;
- zp->re = 1.;
- zp->im = 1.;
- if(z.re+z.im != 2.){
- if(pd0->flgd != 0) printf(s88er,4);
- rc = rc+4;
- }
-
- return rc;
-}
-s9(pd0) /* 9 Statements */
-struct defs *pd0;
-{
- static char s9er[] = "s9,er%d\n";
- static char qs9[8] = "s9 ";
- int rc;
- char *ps, *pt;
- int lrc, i;
-
- ps = qs9;
- pt = pd0->rfs;
- rc = 0;
- while (*pt++ = *ps++);
-
- /* One would think that the section on statements would
- provide the most variety in the entire sequence of tests.
- As it turns out, most of the material in this section has
- already been checked in the process of checking out
- everything else, and the section at this point is somewhat
- anticlimactic. For this reason, we restrict ourselves
- to testing two features not already covered.
-
- Compound statements are delimited by braces. They have the
- nice property that identifiers of the auto and register
- variety are pushed and popped. It is currently legal to
- transfer into a block, but we wont...
- */
-
- lrc = 0;
- for(i=0; i<2; i++){
- int j;
- register int k;
- j = k = 2;
- {
- int j;
- register int k;
- j = k = 3;
- if((j != 3) || (k != 3)) lrc = 1;
- }
- if((j != 2) || (k != 2)) lrc = 1;
- }
-
- if(lrc != 0){
- if(pd0->flgd != 0) printf(s9er,1);
- rc = rc+1;
- }
-
- /* Goto statements go to labeled statements, we hope. */
-
- goto nobarf;
- if(pd0->flgd != 0) printf(s9er,2);
- rc = rc+2;
- nobarf:;
-
- return rc;
-}
-setev(){ /* Sets an external variable. Used */
- extern int extvar; /* by s4, and should be compiled */
- extvar = 1066; /* separately from s4. */
-}
- int lbits; /* long */
- int ubits; /* unsigned */
- int fbits; /* float */
- int dbits; /* double */
- float fprec; /* Smallest number that can be */
- float dprec; /* significantly added to 1. */
- int flgs; /* Print return codes, by section */
- int flgm; /* Announce machine dependencies */
- int flgd; /* give explicit diagnostics */
- int flgl; /* Report local return codes. */
- int rrc; /* recent return code */
- int crc; /* Cumulative return code */
- char rfs[8]; /* Return from section */
+ struct defs { + int cbits; /* No. of bits per char */ + int ibits; /* int */ + int sbits; /* short */ + int lbits; /* long */ + int ubits; /* unsigned */ + int fbits; /* float */ + int dbits; /* double */ + float fprec; /* Smallest number that can be */ + float dprec; /* significantly added to 1. */ + int flgs; /* Print return codes, by section */ + int flgm; /* Announce machine dependencies */ + int flgd; /* give explicit diagnostics */ + int flgl; /* Report local return codes. */ + int rrc; /* recent return code */ + int crc; /* Cumulative return code */ + char rfs[8]; /* Return from section */ + }; +main(n,args) /* C REFERENCE MANUAL */ +int n; +char **args; +{ + +/* This program performs a series of tests on a C compiler, +based on information in the + + C REFERENCE MANUAL + +which appears as Appendix A to the book "The C Programming +Language" by Brian W. Kernighan and Dennis M. Ritchie +(Prentice-Hall, 1978, $10.95). This Appendix is hereafter +referred to as "the Manual". + + The rules followed in writing this program are: + + 1. The entire program is written in legal C, according + to the Manual. It should compile with no error messages, + although some warning messages may be produced by some + compilers. Failure to compile should be interpreted as + a compiler error. + + 2. The program is clean, in that it does not make use + of any features of the operating system on which it runs, + with the sole exceptions of the printf() function, and an + internal "options" routine, which is easily excised. + + 3. No global variables are used, except for the spec- + ific purpose of testing the global variable facility. + + The program is divided into modules having names of the +form snnn... These modules correspond to those sections of the +Manual, as identified by boldface type headings, in which +there is something to test. For example, s241() corresponds +to section 2.4.1 of the Manual (Integer constants) and tests +the facilities described therein. The module numbering +scheme is ambiguous, especially when it names modules +referring to more than one section; module s7813, for ex- +ample, deals with sections 7.8 through 7.13. Nonetheless, +it is surprisingly easy to find a section in the Manual +corresponding to a section of code, and vice versa. + + Note also that there seem to be "holes" in the program, +at least from the point of view that there exist sections in the +Manual for which there is no corresponding code. Such holes +arise from three causes: (a) there is nothing in that partic- +ular section to test, (b) everything in that section is tested +elsewhere, and (c) it was deemed advisable not to check cer- +tain features like preprocessor or listing control features. + + Modules are called by a main program main(). The mod- +ules that are called, and the sequence in which they are +called, are determined by two lists in main(), in which the +module names appear. The first list (an extern statement) +declares the module names to be external. The second (a stat- +ic int statement) names the modules and defines the sequence +in which they are called. There is no need for these lists +to be in the same order, but it is probably a good idea to keep +them that way in the interest of clarity. Since there are no +cross-linkages between modules, new modules may be added, +or old ones deleted, simply by editing the lists, with one +exception: section s26, which pokes around at the hardware +trying to figure out the characteristics of the machine that +it is running on, saves information that is subsequently +used by sections s626, s72, and s757. If this program is +to be broken up into smallish pieces, say for running on +a microcomputer, take care to see that s26 is called before +calling any of the latter three sections. The size +of the lists, i.e., the number of modules to be called, is +not explicitly specified as a program parameter, but is +determined dynamically using the sizeof operator. + + Communication between the main program and the modules +takes place in two ways. In all cases, a pointer to a structure +is passed to the called module. The structure contains flags +that will determine the type of information to be published +by the module, and fields that may be written in by the +module. The former include "flgm" and "flgd", which, if set +to a nonzero value, specify that machine dependencies are to +be announced or that error messages are to be printed, re- +spectively. The called module's name, and the hardware char- +acteristics probed in s26() comprise the latter. + + + Also, in all cases, a return code is returned by the called +module. A return code of zero indicates that all has gone well; +nonzero indicates otherwise. Since more than one type of error +may be detected by a module, the return code is a composite +of error indicators, which, individually, are given as numbers +that are powers of two. Thus, a return code of 10 indicates +that two specific errors, 8 and 2, were detected. Whether or +not the codes returned by the modules are printed by the main +program is determined by setting "flgs" to 1 (resp. 0). + + The entire logic of the main program is contained in the +half-dozen or so lines at the end. The somewhat cryptic +statement: + + d0.rrc = (*sec[j])(pd0); + +in the for loop calls the modules. The rest of the code is +reasonably straightforward. + + Finally, in each of the modules, there is the following +prologue: + + snnn(pd0) + struct defs *pd0; + { + static char snnner[] = "snnn,er%d\n"; + static char qsnnn[8] = "snnn "; + char *ps, *pt; + int rc; + + rc = 0; + ps = qsnnn; + pt = pd0->rfs; + while(*pt++ = *ps++); + +used for housekeeping, handshaking and module initialization. + + */ + extern + s22(), + s241(), + s243(), + s244(), + s25(), + s26(), + s4(), + s61(), + s626(), + s71(), + s72(), + s757(), + s7813(), + s714(), + s715(), + s81(), + s84(), + s85(), + s86(), + s88(), + s9() + ; + + int j; + static int (*sec[])() = { + s22, + s241, + s243, + s244, + s25, + s26, + s4, + s61, + s626, + s71, + s72, + s757, + s7813, + s714, + s715, + s81, + s84, + s85, + s86, + s88, + s9 + }; + + static struct defs d0, *pd0; + + d0.flgs = 1; /* These flags dictate */ + d0.flgm = 1; /* the verbosity of */ + d0.flgd = 1; /* the program. */ + d0.flgl = 1; + + pd0 = &d0; + + for (j=0; j<sizeof(sec) / sizeof(sec[0]); j++) { + d0.rrc = (*sec[j])(pd0); + d0.crc = d0.crc+d0.rrc; + if(d0.flgs != 0) printf("Section %s returned %d.\n",d0.rfs,d0.rrc); + } + + if(d0.crc == 0) printf("\nNo errors detected.\n"); + else printf("\nFailed.\n"); + return 0; +} +s22(pd0) /* 2.2 Identifiers (Names) */ +struct defs *pd0; +{ + int a234, a; + int _, _234, A, rc; + + static char s22er[] = "s22,er%d\n"; + static char qs22[8] = "s22 "; + + char *ps, *pt; + /* Initialize */ + + rc = 0; + ps = qs22; + pt = pd0 -> rfs; + while (*pt++ = *ps++); + + /* An identifier is a sequence of letters and digits; + the first character must be a letter. The under- + score _ counts as a letter. */ + + a=1; + _=2; + _234=3; + a234=4; + if(a+_+_234+a234 != 10) { + rc = rc+1; + if(pd0->flgd != 0) printf(s22er,1); + } + + /* Upper and lower case letters are different. */ + + A = 2; + if (A == a) { + rc = rc+4; + if (pd0->flgd != 0) printf(s22er,4); + } + + return(rc); +} +s241(pd0) /* 2.4.1 Integer constants + 2.4.2 Explicit long constants */ +struct defs *pd0; +{ + long pow2(); + static char s241er[] = "s241,er%d\n"; + static char qs241[8] = "s241 "; + char *ps, *pt; + int rc, j, lrc; + static long g[39] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,6,0,8,0,12,0,16,0,18,0,20,0,24, + 0,28,0,30,0,32,0,36}; + long d[39], o[39], x[39]; + + rc = 0; + lrc = 0; + ps = qs241; + pt = pd0 -> rfs; + while (*pt++ = *ps++); + + /* An integer constant consisting of a sequence of digits is + taken to be octal if it begins with 0 (digit zero), decimal + otherwise. */ + + if ( 8 != 010 + || 16 != 020 + || 24 != 030 + || 32 != 040 + || 40 != 050 + || 48 != 060 + || 56 != 070 + || 64 != 0100 + || 72 != 0110 + || 80 != 0120 + || 9 != 0011 + || 17 != 0021 + || 25 != 0031 + || 33 != 0041 + || 41 != 0051 + || 49 != 0061 + || 57 != 0071 + || 65 != 0101 + || 73 != 0111 + || 81 != 0121 ){ + + rc = rc+1; + if( pd0->flgd != 0 ) printf(s241er,1); + } + + /* A sequence of digits preceded by 0x or 0X (digit zero) + is taken to be a hexadecimal integer. The hexadecimal + digits include a or A through f or F with values 10 + through 15. */ + + if ( 0x00abcdef != 0xabcdef + || 0xabcdef != 0Xabcdef || 0Xabcdef != 0XAbcdef + || 0XAbcdef != 0XABcdef || 0XABcdef != 0XABCdef + || 0XABCdef != 0XABCDef || 0XABCDef != 0XABCDEf + || 0XABCDEf != 0XABCDEF || 0xABCDEF != 11259375 ){ + + rc = rc+2; + if( pd0->flgd != 0 ) printf(s241er,2); + } + + /* A decimal constant whose value exceeds the largest signed + machine integer is taken to be long; an octal or hex con- + stant which exceeds the largest unsigned machine integer + is likewise taken to be long. */ + + if ( sizeof 010000000000 != sizeof(long) /* 2**30 */ + || sizeof 1073741824 != sizeof(long) /* ditto */ + || sizeof 0x40000000 != sizeof(long) ){ /* " */ + + rc = rc+4; + if( pd0->flgd != 0 ) printf(s241er,4); + } + + /* A decimal, octal, or hexadecimal constant immediately followed + by l (letter ell) or L is a long constant. */ + + if ( sizeof 67l != sizeof(long) + || sizeof 67L != sizeof(long) + || sizeof 067l != sizeof(long) + || sizeof 067L != sizeof(long) + || sizeof 0X67l != sizeof(long) + || sizeof 0x67L != sizeof(long) ){ + + rc = rc+8; + if( pd0 -> flgd != 0 ) printf(s241er,8); + } + + /* Finally, we test to see that decimal (d), octal (o), + and hexadecimal (x) constants representing the same values + agree among themselves, and with computed values, at spec- + ified points over an appropriate range. The points select- + ed here are those with the greatest potential for caus- + ing trouble, i.e., zero, 1-16, and values of 2**n and + 2**n - 1 where n is some multiple of 4 or 6. Unfortunately, + just what happens when a value is too big to fit in a + long is undefined; however, it would be nice if what + happened were at least consistent... */ + + for ( j=0; j<17; j++ ) g[j] = j; + for ( j=18; j<39; ) { + g[j] = pow2(g[j]); + g[j-1] = g[j] - 1; + j = j+2; + } + + d[0] = 0; o[0] = 00; x[0] = 0x0; + d[1] = 1; o[1] = 01; x[1] = 0x1; + d[2] = 2; o[2] = 02; x[2] = 0x2; + d[3] = 3; o[3] = 03; x[3] = 0x3; + d[4] = 4; o[4] = 04; x[4] = 0x4; + d[5] = 5; o[5] = 05; x[5] = 0x5; + d[6] = 6; o[6] = 06; x[6] = 0x6; + d[7] = 7; o[7] = 07; x[7] = 0x7; + d[8] = 8; o[8] = 010; x[8] = 0x8; + d[9] = 9; o[9] = 011; x[9] = 0x9; + d[10] = 10; o[10] = 012; x[10] = 0xa; + d[11] = 11; o[11] = 013; x[11] = 0xb; + d[12] = 12; o[12] = 014; x[12] = 0xc; + d[13] = 13; o[13] = 015; x[13] = 0xd; + d[14] = 14; o[14] = 016; x[14] = 0xe; + d[15] = 15; o[15] = 017; x[15] = 0xf; + d[16] = 16; o[16] = 020; x[16] = 0x10; + d[17] = 63; o[17] = 077; x[17] = 0x3f; + d[18] = 64; o[18] = 0100; x[18] = 0x40; + d[19] = 255; o[19] = 0377; x[19] = 0xff; + d[20] = 256; o[20] = 0400; x[20] = 0x100; + d[21] = 4095; o[21] = 07777; x[21] = 0xfff; + d[22] = 4096; o[22] = 010000; x[22] = 0x1000; + d[23] = 65535; o[23] = 0177777; x[23] = 0xffff; + d[24] = 65536; o[24] = 0200000; x[24] = 0x10000; + d[25] = 262143; o[25] = 0777777; x[25] = 0x3ffff; + d[26] = 262144; o[26] = 01000000; x[26] = 0x40000; + d[27] = 1048575; o[27] = 03777777; x[27] = 0xfffff; + d[28] = 1048576; o[28] = 04000000; x[28] = 0x100000; + d[29] = 16777215; o[29] = 077777777; x[29] = 0xffffff; + d[30] = 16777216; o[30] = 0100000000; x[30] = 0x1000000; + d[31] = 268435455; o[31] = 01777777777; x[31] = 0xfffffff; + d[32] = 268435456; o[32] = 02000000000; x[32] = 0x10000000; + d[33] = 1073741823; o[33] = 07777777777; x[33] = 0x3fffffff; + d[34] = 1073741824; o[34] = 010000000000; x[34] = 0x40000000; + d[35] = 4294967295; o[35] = 037777777777; x[35] = 0xffffffff; + d[36] = 4294967296; o[36] = 040000000000; x[36] = 0x100000000; + d[37] = 68719476735; o[37] = 0777777777777; x[37] = 0xfffffffff; + d[38] = 68719476736; o[38] = 01000000000000; x[38] = 0x1000000000; + + /* WHEW! */ + + for (j=0; j<39; j++){ + if ( g[j] != d[j] + || d[j] != o[j] + || o[j] != x[j]) { + + if( pd0 -> flgm != 0 ) { +/* printf(s241er,16); save in case opinions change... */ + printf("Decimal and octal/hex constants sometimes give\n"); + printf(" different results when assigned to longs.\n"); + } +/* lrc = 1; save... */ + } + } + + if (lrc != 0) rc =16; + + return rc; +} + +long pow2(n) /* Calculate 2**n by multiplying, not shifting */ +long n; +{ + long s; + s = 1; + while(n--) s = s*2; + return s; +} +s243(pd0) /* 2.4.3 Character constants */ +struct defs *pd0; +{ + static char s243er[] = "s243,er%d\n"; + static char qs243[8] = "s243 "; + char *ps, *pt; + int rc; + char chars[256]; + + rc = 0; + ps = qs243; + pt = pd0->rfs; + while(*pt++ = *ps++); + + /* One of the problems that arises when testing character constants + is that of definition: What, exactly, is the character set? + In order to guarantee a certain amount of machine independence, + the character set we will use here is the set of characters writ- + able as escape sequences in C, plus those characters used in writ- + ing C programs, i.e., + + letters: + ABCDEFGHIJKLMNOPQRSTUVWXYZ 26 + abcdefghijklmnopqrstuvwxyz 26 + numbers: + 0123456789 10 + special characters: + ~!"#%&()_=-^|{}[]+;*:<>,.?/ 27 + extra special characters: + newline \n + horizontal tab \t + backspace \b + carriage return \r + form feed \f + backslash \\ + single quote \' 7 + blank & NUL 2 + --- + 98 + + Any specific implementation of C may of course support additional + characters. */ + + /* Since the value of a character constant is the numerical value + of the character in the machine's character set, there should + be a one-to-one correspondence between characters and values. */ + + zerofill(chars); + + chars['a'] = 1; chars['A'] = 1; chars['~'] = 1; chars['0'] = 1; + chars['b'] = 1; chars['B'] = 1; chars['!'] = 1; chars['1'] = 1; + chars['c'] = 1; chars['C'] = 1; chars['"'] = 1; chars['2'] = 1; + chars['d'] = 1; chars['D'] = 1; chars['#'] = 1; chars['3'] = 1; + chars['e'] = 1; chars['E'] = 1; chars['%'] = 1; chars['4'] = 1; + chars['f'] = 1; chars['F'] = 1; chars['&'] = 1; chars['5'] = 1; + chars['g'] = 1; chars['G'] = 1; chars['('] = 1; chars['6'] = 1; + chars['h'] = 1; chars['H'] = 1; chars[')'] = 1; chars['7'] = 1; + chars['i'] = 1; chars['I'] = 1; chars['_'] = 1; chars['8'] = 1; + chars['j'] = 1; chars['J'] = 1; chars['='] = 1; chars['9'] = 1; + chars['k'] = 1; chars['K'] = 1; chars['-'] = 1; + chars['l'] = 1; chars['L'] = 1; chars['^'] = 1; + chars['m'] = 1; chars['M'] = 1; chars['|'] = 1; chars['\n'] = 1; + chars['n'] = 1; chars['N'] = 1; chars['\t'] = 1; + chars['o'] = 1; chars['O'] = 1; chars['{'] = 1; chars['\b'] = 1; + chars['p'] = 1; chars['P'] = 1; chars['}'] = 1; chars['\r'] = 1; + chars['q'] = 1; chars['Q'] = 1; chars['['] = 1; chars['\f'] = 1; + chars['r'] = 1; chars['R'] = 1; chars[']'] = 1; + chars['s'] = 1; chars['S'] = 1; chars['+'] = 1; chars['\\'] = 1; + chars['t'] = 1; chars['T'] = 1; chars[';'] = 1; chars['\''] = 1; + chars['u'] = 1; chars['U'] = 1; chars['*'] = 1; + chars['v'] = 1; chars['V'] = 1; chars[':'] = 1; chars['\0'] = 1; + chars['w'] = 1; chars['W'] = 1; chars['<'] = 1; chars[' '] = 1; + chars['x'] = 1; chars['X'] = 1; chars['>'] = 1; + chars['y'] = 1; chars['Y'] = 1; chars[','] = 1; + chars['z'] = 1; chars['Z'] = 1; chars['.'] = 1; + chars['?'] = 1; + chars['/'] = 1; + + if(sumof(chars) != 98){ + rc = rc+1; + if(pd0->flgd != 0) printf(s243er,1); + } + + /* Finally, the escape \ddd consists of the backslash followed + by 1, 2, or 3 octal digits which are taken to specify the + desired character. */ + + if( '\0' != 0 || '\01' != 1 || '\02' != 2 + || '\03' != 3 || '\04' != 4 || '\05' != 5 + || '\06' != 6 || '\07' != 7 || '\10' != 8 + || '\17' != 15 || '\20' != 16 || '\77' != 63 + || '\100' != 64 || '\177' != 127 ){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s243er,8); + } + + return rc; +} +zerofill(x) +char *x; +{ + int j; + + for (j=0; j<256; j++) *x++ = 0; +} +sumof(x) +char *x; +{ + char *p; + int total, j; + + p = x; + total = 0; + + for(j=0; j<256; j++) total = total+ *p++; + return total; +} +s244(pd0) +struct defs *pd0; +{ + double a[8]; + int rc, lrc, j; + static char s244er[] = "s244,er%d\n"; + static char qs244[8] = "s244 "; + char *ps, *pt; + + ps = qs244; + pt = pd0->rfs; + while(*pt++ = *ps++); + rc = 0; + lrc = 0; + + /* Unfortunately, there's not a lot we can do with floating constants. + We can check to see that the various representations can be com- + piled, that the conversion is such that they yield the same hard- + ware representations in all cases, and that all representations + thus checked are double precision. */ + + a[0] = .1250E+04; + a[1] = 1.250E3; + a[2] = 12.50E02; + a[3] = 125.0e+1; + a[4] = 1250e00; + a[5] = 12500.e-01; + a[6] = 125000e-2; + a[7] = 1250.; + + lrc = 0; + for (j=0; j<7; j++) if(a[j] != a[j+1]) lrc = 1; + + if(lrc != 0) { + if(pd0->flgd != 0) printf(s244er,1); + rc = rc+1; + } + + if ( (sizeof .1250E+04 ) != sizeof(double) + || (sizeof 1.250E3 ) != sizeof(double) + || (sizeof 12.50E02 ) != sizeof(double) + || (sizeof 1.250e+1 ) != sizeof(double) + || (sizeof 1250e00 ) != sizeof(double) + || (sizeof 12500.e-01) != sizeof(double) + || (sizeof 125000e-2 ) != sizeof(double) + || (sizeof 1250. ) != sizeof(double)){ + + if(pd0->flgd != 0) printf(s244er,2); + rc = rc+2; + } + + return rc; +} +s25(pd0) +struct defs *pd0; +{ + char *s, *s2; + int rc, lrc, j; + static char s25er[] = "s25,er%d\n"; + static char qs25[8] = "s25 "; + char *ps, *pt; + + ps = qs25; + pt = pd0->rfs; + while(*pt++ = *ps++); + rc = 0; + + /* A string is a sequence of characters surrounded by double + quotes, as in "...". */ + + s = "..."; + + /* A string has type "array of characters" and storage class + static and is initialized with the given characters. */ + + if ( s[0] != s[1] || s[1] != s[2] + || s[2] != '.' ) { + + rc = rc+1; + if(pd0->flgd != 0) printf(s25er,1); + } + + /* The compiler places a null byte \0 at the end of each string + so the program which scans the string can find its end. */ + + if( s[3] != '\0' ){ + rc = rc+4; + if(pd0->flgd != 0) printf(s25er,4); + } + + /* In a string, the double quote character " must be preceded + by a \. */ + + if( ".\"."[1] != '"' ){ + rc = rc+8; + if(pd0->flgd != 0) printf(s25er,8); + } + + /* In addition, the same escapes described for character constants + may be used. */ + + s = "\n\t\b\r\f\\\'"; + + if( s[0] != '\n' + || s[1] != '\t' + || s[2] != '\b' + || s[3] != '\r' + || s[4] != '\f' + || s[5] != '\\' + || s[6] != '\'' ){ + + rc = rc+16; + if( pd0->flgd != 0) printf(s25er,16); + } + + /* Finally, a \ and an immediately following newline are ignored */ + + s2 = "queep!"; + s = "queep!"; + + lrc = 0; + for (j=0; j<sizeof "queep!"; j++) if(s[j] != s2[j]) lrc = 1; + if (lrc != 0){ + rc = rc+32; + if(pd0->flgd != 0) printf(s25er,32); + } + return rc; +} +s26(pd0) /* 2.6 Hardware Characteristics */ +struct defs *pd0; +{ + static char qs26[8] = "s26 "; + char *ps, *pt; + char c0, c1; + float temp, one, delta; + double tempd, oned; + static char s[] = "%3d bits in %ss.\n"; + static char s2[] = "%e is the least number that can be added to 1. (%s).\n"; + + ps = qs26; + pt = pd0->rfs; + + while(*pt++ = *ps++); + + /* Here, we shake the machinery a little to see what falls + out. First, we find out how many bits are in a char. */ + + pd0->cbits = 0; + c0 = 0; + c1 = 1; + + while(c0 != c1) { + c1 = c1<<1; + pd0->cbits = pd0->cbits+1; + } + /* That information lets us determine the size of everything else. */ + + pd0->ibits = pd0->cbits * sizeof(int); + pd0->sbits = pd0->cbits * sizeof(short); + pd0->lbits = pd0->cbits * sizeof(long); + pd0->ubits = pd0->cbits * sizeof(unsigned); + pd0->fbits = pd0->cbits * sizeof(float); + pd0->dbits = pd0->cbits * sizeof(double); + + /* We have now almost reconstructed the table in section 2.6, the + exception being the range of the floating point hardware. + Now there are just so many ways to conjure up a floating point + representation system that it's damned near impossible to guess + what's going on by writing a program to interpret bit patterns. + Further, the information isn't all that useful, if we consider + the fact that machines that won't handle numbers between 10**30 + and 10**-30 are very hard to find, and that people playing with + numbers outside that range have a lot more to worry about than + just the capacity of the characteristic. + + A much more useful measure is the precision, which can be ex- + pressed in terms of the smallest number that can be added to + 1. without loss of significance. We calculate that here, for + float and double. */ + + one = 1.; + delta = 1.; + temp = 0.; + while(temp != one) { + temp = one+delta; + delta = delta/2.; + } + pd0->fprec = delta * 4.; + oned = 1.; + delta = 1.; + tempd = 0.; + while(tempd != oned) { + tempd = oned+delta; + delta = delta/2.; + } + pd0->dprec = delta * 4.; + + /* Now, if anyone's interested, we publish the results. */ + + if(pd0->flgm != 0) { + printf(s,pd0->cbits,"char"); + printf(s,pd0->ibits,"int"); + printf(s,pd0->sbits,"short"); + printf(s,pd0->lbits,"long"); + printf(s,pd0->ubits,"unsigned"); + printf(s,pd0->fbits,"float"); + printf(s,pd0->dbits,"double"); + printf(s2,pd0->fprec,"float"); + printf(s2,pd0->dprec,"double"); + } + /* Since we are only exploring and perhaps reporting, but not + testing any features, we cannot return an error code. */ + + return 0; +} +int extvar; +s4(pd0) /* 4. What's in a name? */ +struct defs *pd0; +{ + static char s4er[] = "s4,er%d\n"; + static char qs4[8] = "s4 "; + char *ps, *pt; + int j, rc; + + short sint; /* short integer, for size test */ + int pint; /* plain */ + long lint; /* long */ + unsigned target; + unsigned int mask; + + rc = 0; + ps = qs4; + pt = pd0->rfs; + + while(*pt++ = *ps++); + +/* There are four declarable storage classes: automatic, +static, external, and register. Automatic variables have +been dealt with extensively thus far, and will not be specif- +ically treated in this section. Register variables are treated +in section s81. + + Static variables are local to a block, but retain their +values upon reentry to a block, even after control has left +the block. */ + + for (j=0; j<3; j++) + if(svtest(j) != zero()){ + rc = 1; + if(pd0->flgd != 0) printf(s4er,1); + } + ; + +/* External variables exist and retain their values throughout +the execution of the entire program, and may be used for comm- +unication between functions, even separately compiled functions. + */ + + setev(); + if(testev() != 0){ + rc=rc+2; + if(pd0->flgd != 0) printf(s4er,2); + } +/* + Characters have been tested elsewhere (in s243). + + Up to three sizes of integer, declared short int, int, and +long int, are available. Longer integers provide no less storage +than shorter ones, but implementation may make either short +integers, or long integers, or both, equivalent to plain +integers. + */ + + if(sizeof lint < sizeof pint || sizeof pint < sizeof sint){ + + rc = rc+4; + if(pd0->flgd != 0) printf(s4er,4); + } + +/* Unsigned integers, declared unsigned, obey the laws of +arithmetic modulo 2**n, where n is the number of bits in the +implementation */ + + target = ~0U; + mask = 1; + + for(j=0; j<(sizeof target)*pd0->cbits; j++){ + + mask = mask⌖ + target = target>>1; + } + + if(mask != 1 || target != 0){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s4er,8); + } + + return rc; +} +svtest(n) +int n; +{ + static k; + int rc; + switch (n) { + + case 0: k = 1978; + rc = 0; + break; + + case 1: if(k != 1978) rc = 1; + else{ + k = 1929; + rc = 0; + } + break; + + case 2: if(k != 1929) rc = 1; + else rc = 0; + break; + } + return rc; +} +zero(){ /* Returns a value of zero, possibly */ + static k; /* with side effects, as it's called */ + int rc; /* alternately with svtest, above, */ + k = 2; /* and has the same internal storage */ + rc = 0; /* requirements. */ + return rc; +} +testev(){ + if(extvar != 1066) return 1; + else return 0; +} +s61(pd0) /* Characters and integers */ +struct defs *pd0; +{ + static char s61er[] = "s61,er%d\n"; + static char qs61[8] = "s61 "; + short from, shortint; + long int to, longint; + int rc, lrc; + int j; + char fromc, charint; + char *wd, *pc[6]; + + static char upper_alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static char lower_alpha[] = "abcdefghijklmnopqrstuvwxyz"; + static char numbers[] = "0123456789"; + static char special_characters[] = "~!\"#%&()_=-^|{}[]+;*:<>,.?/"; + static char extra_special_characters[] = "\n\t\b\r\f\\\'"; + static char blank_and_NUL[] = " \0"; + + char *ps, *pt; + ps = qs61; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + +/* A character or a short integer may be used wherever +an integer may be used. In all cases, the value is converted +to integer. This principle is extensively used throughout this +program, and will not be explicitly tested here. */ + +/* Conversion of a shorter integer to a longer always +involves sign extension. */ + + from = -19; + to = from; + + if(to != -19){ + rc = rc+1; + if(pd0->flgd != 0) printf(s61er,1); + } + +/* It is guaranteed that a member of the standard char- +acter set is nonnegative. */ + + pc[0] = upper_alpha; + pc[1] = lower_alpha; + pc[2] = numbers; + pc[3] = special_characters; + pc[4] = extra_special_characters; + pc[5] = blank_and_NUL; + + lrc = 0; + for (j=0; j<6; j++) + while(*pc[j]) if(*pc[j]++ < 0) lrc =1; + + if(lrc != 0){ + rc=rc+2; + if(pd0->flgd != 0) printf(s61er,2); + } + +/* When a longer integer is converted to a shorter or +to a char, it is truncated on the left; excess bits are +simply discarded. */ + + longint = 1048579; /* =2**20+3 */ + shortint = longint; + charint = longint; + + if((shortint != longint && shortint != 3) || + (charint != longint && charint != 3)) { + rc = rc+8; + if(pd0->flgd != 0) printf(s61er,8); + } + + return rc; +} +s626(pd0) /* 6.2 Float and double */ + /* 6.3 Floating and integral */ + /* 6.4 Pointers and integers */ + /* 6.5 Unsigned */ + /* 6.6 Arithmetic conversions */ +struct defs *pd0; +{ + static char s626er[] = "s626,er%d\n"; + static char qs626[8] = "s626 "; + int rc; + char *ps, *pt; + float eps, f1, f2, f3, f4, f; + long lint1, lint2, l, ls; + char c, t[28], t0; + short s; + int is, i, j; + unsigned u, us; + double d, ds; + ps = qs626; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* Conversions of integral values to floating type are + well-behaved. */ + + f1 = 1.; + lint1 = 1.; + lint2 = 1.; + + for(j=0;j<pd0->lbits-2;j++){ + f1 = f1*2; + lint2 = (lint2<<1)|lint1; + } + f2 = lint2; + f1 = (f1-f2)/f1; + if(f1>2.*pd0->fprec){ + + rc = rc+2; + if(pd0->flgd != 0) printf(s626er,2); + } + + /* Pointer-integer combinations are discussed in s74, + "Additive operators". The unsigned-int combination + appears below. */ + + c = 125; + s = 125; + i = 125; is = 15625; + u = 125; us = 15625; + l = 125; ls = 15625; + f = 125.; + d = 125.; ds = 15625.; + + for(j=0;j<28;j++) t[j] = 0; + + if(c*c != is) t[ 0] = 1; + if(s*c != is) t[ 1] = 1; + if(s*s != is) t[ 2] = 1; + if(i*c != is) t[ 3] = 1; + if(i*s != is) t[ 4] = 1; + if(i*i != is) t[ 5] = 1; + if(u*c != us) t[ 6] = 1; + if(u*s != us) t[ 7] = 1; + if(u*i != us) t[ 8] = 1; + if(u*u != us) t[ 9] = 1; + if(l*c != ls) t[10] = 1; + if(l*s != ls) t[11] = 1; + if(l*i != ls) t[12] = 1; + if(l*u != us) t[13] = 1; + if(l*l != ls) t[14] = 1; + if(f*c != ds) t[15] = 1; + if(f*s != ds) t[16] = 1; + if(f*i != ds) t[17] = 1; + if(f*u != ds) t[18] = 1; + if(f*l != ds) t[19] = 1; + if(f*f != ds) t[20] = 1; + if(d*c != ds) t[21] = 1; + if(d*s != ds) t[22] = 1; + if(d*i != ds) t[23] = 1; + if(d*u != ds) t[24] = 1; + if(d*l != ds) t[25] = 1; + if(d*f != ds) t[26] = 1; + if(d*d != ds) t[27] = 1; + + t0 = 0; + for(j=0; j<28; j++) t0 = t0+t[j]; + + if(t0 != 0){ + + rc = rc+4; + if(pd0->flgd != 0){ + + printf(s626er,4); + printf(" key="); + for(j=0;j<28;j++) printf("%d",t[j]); + printf("\n"); + } + } + + /* When an unsigned integer is converted to long, + the value of the result is the same numerically + as that of the unsigned integer. */ + + l = (unsigned)0100000; + if((long)l > (unsigned)0100000){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s626er,8); + } + + return rc; +} +s71(pd0) /* 7.1 Primary expressions */ +struct defs *pd0; +{ + static char s71er[] = "s71,er%d\n"; + static char qs71[8] = "s71 "; + int rc; + char *ps, *pt; + static char q = 'q'; + int x[10], McCarthy(), clobber(), a, b, *p; + ps = qs71; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + +/* Testing of expressions and operators is quite complicated, + because (a) problems are apt to surface in queer combinations + of operators and operands, rather than in isolation, + and (b) the number of expressions needed to provoke a case + of improper behaviour may be quite large. Hence, we take the + following approach: for this section, and for subsequent + sections through 7.15, we will check the primitive operations + in isolation, thus verifying that the primitives work, + after a fashion. The job of testing combinations, we will + leave to a separate, machine-generated program, to be included + in the C test package at some later date. + */ + +/* A string is a primary expression. The identifier points to + the first character of a string. + */ + + if(*"queep" != q){ + rc = rc+1; + if(pd0->flgd != 0) printf(s71er,1); + } +/* A parenthesized expression is a primary expression whose + type and value are the same as those of the unadorned + expression. + */ + if((2+3) != 2+3) { + rc = rc+2; + if(pd0->flgd != 0) printf(s71er,2); + } + +/* A primary expression followed by an expression in square + brackets is a primary expression. The intuitive meaning is + that of a subscript. The expression E1[E2] is identical + (by definition) to *((E1)+(E2)). + */ + + x[5] = 1942; + if(x[5] != 1942 || x[5] != *((x)+(5))){ + rc = rc+4; + if(pd0->flgd != 0) printf(s71er,4); + } + +/* If the various flavors of function calls didn't work, we + would never have gotten this far; however, we do need to + show that functions can be recursive... + */ + + if ( McCarthy(-5) != 91){ + rc = rc+8; + if(pd0->flgd != 0) printf(s71er,8); + } + +/* and that argument passing is strictly by value. */ + + a = 2; + b = 3; + p = &b; + + clobber(a,p); + + if(a != 2 || b != 2){ + rc = rc+16; + if(pd0->flgd != 0) printf(s71er,16); + } + +/* Finally, structures and unions are addressed thusly: */ + + if(pd0->dprec != (*pd0).dprec){ + rc = rc+32; + if(pd0->flgd != 0) printf(s71er,32); + } + + return rc; +} +McCarthy(x) +int x; +{ + if(x>100) return x-10; + else return McCarthy( McCarthy(x+11)); +} +clobber(x,y) +int x, *y; +{ + x = 3; + *y = 2; +} +s714(pd0) /* 7.14 Assignment operators */ +struct defs *pd0; +{ + static char f[] = "Local error %d.\n"; + static char s714er[] = "s714,er%d\n"; + static char qs714[8] = "s714 "; + register int prlc, lrc; + int rc; + char cl, cr; + short sl, sr; + int il, ir; + long ll, lr; + unsigned ul, ur; + float fl, fr; + double dl, dr; + char *ps, *pt; + ps = qs714; + pt = pd0->rfs; + rc = 0; + lrc = 0; + prlc = pd0->flgl; + while (*pt++ = *ps++); + + /* This section tests the assignment operators. + + It is an exhaustive test of all assignment statements + of the form: + + vl op vr + + where vl and vr are variables from the set + {char,short,int,long,unsigned,float,double} and op is + one of the assignment operators. There are 395 such + statements. + + The initial values for the variables have been chosen + so that both the initial values and the results will + "fit" in just about any implementation, and that the re- + sults will be such that they test for the proper form- + ation of composite operators, rather than checking for + the valid operation of those operators' components. + For example, in checking >>=, we want to verify that + a right shift and a move take place, rather than + whether or not there may be some peculiarities about + the right shift. Such tests have been made previously, + and to repeat them here would be to throw out a red + herring. + + The table below lists the operators, assignment targets, + initial values for left and right operands, and the + expected values of the results. + + + = += -= *= /= %= >>= <<= &= ^= |= +char 2 7 3 10 2 1 1 20 8 6 14 +short 2 7 3 10 2 1 1 20 8 6 14 +int 2 7 3 10 2 1 1 20 8 6 14 +long 2 7 3 10 2 1 1 20 8 6 14 +unsigned 2 7 3 10 2 1 1 20 8 6 14 +float 2 7 3 10 2.5 | | +double 2 7 3 10 2.5 | | + | | +initial (5,2) | (5,2) | (12,10) + + The following machine-generated program reflects the + tests described in the table. + */ + + cl = 5; cr = 2; + cl = cr; + if(cl != 2){ + lrc = 1; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl = sr; + if(cl != 2){ + lrc = 2; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl = ir; + if(cl != 2){ + lrc = 3; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl = lr; + if(cl != 2){ + lrc = 4; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl = ur; + if(cl != 2){ + lrc = 5; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl = fr; + if(cl != 2){ + lrc = 6; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl = dr; + if(cl != 2){ + lrc = 7; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl = cr; + if(sl != 2){ + lrc = 8; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl = sr; + if(sl != 2){ + lrc = 9; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl = ir; + if(sl != 2){ + lrc = 10; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl = lr; + if(sl != 2){ + lrc = 11; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl = ur; + if(sl != 2){ + lrc = 12; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl = fr; + if(sl != 2){ + lrc = 13; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl = dr; + if(sl != 2){ + lrc = 14; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il = cr; + if(il != 2){ + lrc = 15; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il = sr; + if(il != 2){ + lrc = 16; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il = ir; + if(il != 2){ + lrc = 17; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il = lr; + if(il != 2){ + lrc = 18; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il = ur; + if(il != 2){ + lrc = 19; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il = fr; + if(il != 2){ + lrc = 20; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il = dr; + if(il != 2){ + lrc = 21; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll = cr; + if(ll != 2){ + lrc = 22; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll = sr; + if(ll != 2){ + lrc = 23; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll = ir; + if(ll != 2){ + lrc = 24; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll = lr; + if(ll != 2){ + lrc = 25; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll = ur; + if(ll != 2){ + lrc = 26; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll = fr; + if(ll != 2){ + lrc = 27; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll = dr; + if(ll != 2){ + lrc = 28; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul = cr; + if(ul != 2){ + lrc = 29; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul = sr; + if(ul != 2){ + lrc = 30; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul = ir; + if(ul != 2){ + lrc = 31; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul = lr; + if(ul != 2){ + lrc = 32; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul = ur; + if(ul != 2){ + lrc = 33; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul = fr; + if(ul != 2){ + lrc = 34; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul = dr; + if(ul != 2){ + lrc = 35; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl = cr; + if(fl != 2){ + lrc = 36; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl = sr; + if(fl != 2){ + lrc = 37; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl = ir; + if(fl != 2){ + lrc = 38; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl = lr; + if(fl != 2){ + lrc = 39; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl = ur; + if(fl != 2){ + lrc = 40; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl = fr; + if(fl != 2){ + lrc = 41; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl = dr; + if(fl != 2){ + lrc = 42; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl = cr; + if(dl != 2){ + lrc = 43; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl = sr; + if(dl != 2){ + lrc = 44; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl = ir; + if(dl != 2){ + lrc = 45; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl = lr; + if(dl != 2){ + lrc = 46; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl = ur; + if(dl != 2){ + lrc = 47; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl = fr; + if(dl != 2){ + lrc = 48; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl = dr; + if(dl != 2){ + lrc = 49; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl += cr; + if(cl != 7){ + lrc = 50; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl += sr; + if(cl != 7){ + lrc = 51; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl += ir; + if(cl != 7){ + lrc = 52; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl += lr; + if(cl != 7){ + lrc = 53; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl += ur; + if(cl != 7){ + lrc = 54; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl += fr; + if(cl != 7){ + lrc = 55; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl += dr; + if(cl != 7){ + lrc = 56; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl += cr; + if(sl != 7){ + lrc = 57; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl += sr; + if(sl != 7){ + lrc = 58; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl += ir; + if(sl != 7){ + lrc = 59; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl += lr; + if(sl != 7){ + lrc = 60; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl += ur; + if(sl != 7){ + lrc = 61; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl += fr; + if(sl != 7){ + lrc = 62; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl += dr; + if(sl != 7){ + lrc = 63; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il += cr; + if(il != 7){ + lrc = 64; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il += sr; + if(il != 7){ + lrc = 65; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il += ir; + if(il != 7){ + lrc = 66; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il += lr; + if(il != 7){ + lrc = 67; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il += ur; + if(il != 7){ + lrc = 68; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il += fr; + if(il != 7){ + lrc = 69; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il += dr; + if(il != 7){ + lrc = 70; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll += cr; + if(ll != 7){ + lrc = 71; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll += sr; + if(ll != 7){ + lrc = 72; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll += ir; + if(ll != 7){ + lrc = 73; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll += lr; + if(ll != 7){ + lrc = 74; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll += ur; + if(ll != 7){ + lrc = 75; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll += fr; + if(ll != 7){ + lrc = 76; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll += dr; + if(ll != 7){ + lrc = 77; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul += cr; + if(ul != 7){ + lrc = 78; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul += sr; + if(ul != 7){ + lrc = 79; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul += ir; + if(ul != 7){ + lrc = 80; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul += lr; + if(ul != 7){ + lrc = 81; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul += ur; + if(ul != 7){ + lrc = 82; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul += fr; + if(ul != 7){ + lrc = 83; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul += dr; + if(ul != 7){ + lrc = 84; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl += cr; + if(fl != 7){ + lrc = 85; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl += sr; + if(fl != 7){ + lrc = 86; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl += ir; + if(fl != 7){ + lrc = 87; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl += lr; + if(fl != 7){ + lrc = 88; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl += ur; + if(fl != 7){ + lrc = 89; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl += fr; + if(fl != 7){ + lrc = 90; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl += dr; + if(fl != 7){ + lrc = 91; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl += cr; + if(dl != 7){ + lrc = 92; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl += sr; + if(dl != 7){ + lrc = 93; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl += ir; + if(dl != 7){ + lrc = 94; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl += lr; + if(dl != 7){ + lrc = 95; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl += ur; + if(dl != 7){ + lrc = 96; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl += fr; + if(dl != 7){ + lrc = 97; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl += dr; + if(dl != 7){ + lrc = 98; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl -= cr; + if(cl != 3){ + lrc = 99; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl -= sr; + if(cl != 3){ + lrc = 100; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl -= ir; + if(cl != 3){ + lrc = 101; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl -= lr; + if(cl != 3){ + lrc = 102; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl -= ur; + if(cl != 3){ + lrc = 103; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl -= fr; + if(cl != 3){ + lrc = 104; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl -= dr; + if(cl != 3){ + lrc = 105; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl -= cr; + if(sl != 3){ + lrc = 106; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl -= sr; + if(sl != 3){ + lrc = 107; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl -= ir; + if(sl != 3){ + lrc = 108; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl -= lr; + if(sl != 3){ + lrc = 109; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl -= ur; + if(sl != 3){ + lrc = 110; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl -= fr; + if(sl != 3){ + lrc = 111; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl -= dr; + if(sl != 3){ + lrc = 112; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il -= cr; + if(il != 3){ + lrc = 113; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il -= sr; + if(il != 3){ + lrc = 114; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il -= ir; + if(il != 3){ + lrc = 115; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il -= lr; + if(il != 3){ + lrc = 116; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il -= ur; + if(il != 3){ + lrc = 117; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il -= fr; + if(il != 3){ + lrc = 118; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il -= dr; + if(il != 3){ + lrc = 119; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll -= cr; + if(ll != 3){ + lrc = 120; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll -= sr; + if(ll != 3){ + lrc = 121; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll -= ir; + if(ll != 3){ + lrc = 122; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll -= lr; + if(ll != 3){ + lrc = 123; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll -= ur; + if(ll != 3){ + lrc = 124; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll -= fr; + if(ll != 3){ + lrc = 125; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll -= dr; + if(ll != 3){ + lrc = 126; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul -= cr; + if(ul != 3){ + lrc = 127; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul -= sr; + if(ul != 3){ + lrc = 128; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul -= ir; + if(ul != 3){ + lrc = 129; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul -= lr; + if(ul != 3){ + lrc = 130; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul -= ur; + if(ul != 3){ + lrc = 131; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul -= fr; + if(ul != 3){ + lrc = 132; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul -= dr; + if(ul != 3){ + lrc = 133; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl -= cr; + if(fl != 3){ + lrc = 134; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl -= sr; + if(fl != 3){ + lrc = 135; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl -= ir; + if(fl != 3){ + lrc = 136; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl -= lr; + if(fl != 3){ + lrc = 137; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl -= ur; + if(fl != 3){ + lrc = 138; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl -= fr; + if(fl != 3){ + lrc = 139; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl -= dr; + if(fl != 3){ + lrc = 140; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl -= cr; + if(dl != 3){ + lrc = 141; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl -= sr; + if(dl != 3){ + lrc = 142; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl -= ir; + if(dl != 3){ + lrc = 143; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl -= lr; + if(dl != 3){ + lrc = 144; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl -= ur; + if(dl != 3){ + lrc = 145; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl -= fr; + if(dl != 3){ + lrc = 146; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl -= dr; + if(dl != 3){ + lrc = 147; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl *= cr; + if(cl != 10){ + lrc = 148; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl *= sr; + if(cl != 10){ + lrc = 149; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl *= ir; + if(cl != 10){ + lrc = 150; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl *= lr; + if(cl != 10){ + lrc = 151; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl *= ur; + if(cl != 10){ + lrc = 152; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl *= fr; + if(cl != 10){ + lrc = 153; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl *= dr; + if(cl != 10){ + lrc = 154; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl *= cr; + if(sl != 10){ + lrc = 155; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl *= sr; + if(sl != 10){ + lrc = 156; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl *= ir; + if(sl != 10){ + lrc = 157; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl *= lr; + if(sl != 10){ + lrc = 158; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl *= ur; + if(sl != 10){ + lrc = 159; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl *= fr; + if(sl != 10){ + lrc = 160; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl *= dr; + if(sl != 10){ + lrc = 161; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il *= cr; + if(il != 10){ + lrc = 162; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il *= sr; + if(il != 10){ + lrc = 163; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il *= ir; + if(il != 10){ + lrc = 164; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il *= lr; + if(il != 10){ + lrc = 165; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il *= ur; + if(il != 10){ + lrc = 166; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il *= fr; + if(il != 10){ + lrc = 167; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il *= dr; + if(il != 10){ + lrc = 168; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll *= cr; + if(ll != 10){ + lrc = 169; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll *= sr; + if(ll != 10){ + lrc = 170; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll *= ir; + if(ll != 10){ + lrc = 171; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll *= lr; + if(ll != 10){ + lrc = 172; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll *= ur; + if(ll != 10){ + lrc = 173; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll *= fr; + if(ll != 10){ + lrc = 174; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll *= dr; + if(ll != 10){ + lrc = 175; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul *= cr; + if(ul != 10){ + lrc = 176; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul *= sr; + if(ul != 10){ + lrc = 177; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul *= ir; + if(ul != 10){ + lrc = 178; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul *= lr; + if(ul != 10){ + lrc = 179; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul *= ur; + if(ul != 10){ + lrc = 180; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul *= fr; + if(ul != 10){ + lrc = 181; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul *= dr; + if(ul != 10){ + lrc = 182; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl *= cr; + if(fl != 10){ + lrc = 183; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl *= sr; + if(fl != 10){ + lrc = 184; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl *= ir; + if(fl != 10){ + lrc = 185; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl *= lr; + if(fl != 10){ + lrc = 186; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl *= ur; + if(fl != 10){ + lrc = 187; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl *= fr; + if(fl != 10){ + lrc = 188; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl *= dr; + if(fl != 10){ + lrc = 189; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl *= cr; + if(dl != 10){ + lrc = 190; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl *= sr; + if(dl != 10){ + lrc = 191; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl *= ir; + if(dl != 10){ + lrc = 192; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl *= lr; + if(dl != 10){ + lrc = 193; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl *= ur; + if(dl != 10){ + lrc = 194; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl *= fr; + if(dl != 10){ + lrc = 195; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl *= dr; + if(dl != 10){ + lrc = 196; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl /= cr; + if(cl != 2){ + lrc = 197; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl /= sr; + if(cl != 2){ + lrc = 198; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl /= ir; + if(cl != 2){ + lrc = 199; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl /= lr; + if(cl != 2){ + lrc = 200; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl /= ur; + if(cl != 2){ + lrc = 201; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl /= fr; + if(cl != 2){ + lrc = 202; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl /= dr; + if(cl != 2){ + lrc = 203; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl /= cr; + if(sl != 2){ + lrc = 204; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl /= sr; + if(sl != 2){ + lrc = 205; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl /= ir; + if(sl != 2){ + lrc = 206; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl /= lr; + if(sl != 2){ + lrc = 207; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl /= ur; + if(sl != 2){ + lrc = 208; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl /= fr; + if(sl != 2){ + lrc = 209; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl /= dr; + if(sl != 2){ + lrc = 210; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il /= cr; + if(il != 2){ + lrc = 211; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il /= sr; + if(il != 2){ + lrc = 212; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il /= ir; + if(il != 2){ + lrc = 213; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il /= lr; + if(il != 2){ + lrc = 214; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il /= ur; + if(il != 2){ + lrc = 215; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il /= fr; + if(il != 2){ + lrc = 216; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il /= dr; + if(il != 2){ + lrc = 217; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll /= cr; + if(ll != 2){ + lrc = 218; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll /= sr; + if(ll != 2){ + lrc = 219; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll /= ir; + if(ll != 2){ + lrc = 220; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll /= lr; + if(ll != 2){ + lrc = 221; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll /= ur; + if(ll != 2){ + lrc = 222; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll /= fr; + if(ll != 2){ + lrc = 223; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll /= dr; + if(ll != 2){ + lrc = 224; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul /= cr; + if(ul != 2){ + lrc = 225; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul /= sr; + if(ul != 2){ + lrc = 226; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul /= ir; + if(ul != 2){ + lrc = 227; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul /= lr; + if(ul != 2){ + lrc = 228; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul /= ur; + if(ul != 2){ + lrc = 229; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul /= fr; + if(ul != 2){ + lrc = 230; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul /= dr; + if(ul != 2){ + lrc = 231; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl /= cr; + if(fl != 2.5){ + lrc = 232; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl /= sr; + if(fl != 2.5){ + lrc = 233; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl /= ir; + if(fl != 2.5){ + lrc = 234; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl /= lr; + if(fl != 2.5){ + lrc = 235; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl /= ur; + if(fl != 2.5){ + lrc = 236; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl /= fr; + if(fl != 2.5){ + lrc = 237; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl /= dr; + if(fl != 2.5){ + lrc = 238; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl /= cr; + if(dl != 2.5){ + lrc = 239; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl /= sr; + if(dl != 2.5){ + lrc = 240; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl /= ir; + if(dl != 2.5){ + lrc = 241; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl /= lr; + if(dl != 2.5){ + lrc = 242; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl /= ur; + if(dl != 2.5){ + lrc = 243; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl /= fr; + if(dl != 2.5){ + lrc = 244; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl /= dr; + if(dl != 2.5){ + lrc = 245; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl %= cr; + if(cl != 1){ + lrc = 246; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl %= sr; + if(cl != 1){ + lrc = 247; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl %= ir; + if(cl != 1){ + lrc = 248; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl %= lr; + if(cl != 1){ + lrc = 249; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl %= ur; + if(cl != 1){ + lrc = 250; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl %= cr; + if(sl != 1){ + lrc = 251; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl %= sr; + if(sl != 1){ + lrc = 252; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl %= ir; + if(sl != 1){ + lrc = 253; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl %= lr; + if(sl != 1){ + lrc = 254; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl %= ur; + if(sl != 1){ + lrc = 255; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il %= cr; + if(il != 1){ + lrc = 256; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il %= sr; + if(il != 1){ + lrc = 257; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il %= ir; + if(il != 1){ + lrc = 258; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il %= lr; + if(il != 1){ + lrc = 259; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il %= ur; + if(il != 1){ + lrc = 260; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll %= cr; + if(ll != 1){ + lrc = 261; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll %= sr; + if(ll != 1){ + lrc = 262; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll %= ir; + if(ll != 1){ + lrc = 263; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll %= lr; + if(ll != 1){ + lrc = 264; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll %= ur; + if(ll != 1){ + lrc = 265; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul %= cr; + if(ul != 1){ + lrc = 266; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul %= sr; + if(ul != 1){ + lrc = 267; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul %= ir; + if(ul != 1){ + lrc = 268; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul %= lr; + if(ul != 1){ + lrc = 269; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul %= ur; + if(ul != 1){ + lrc = 270; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl >>= cr; + if(cl != 1){ + lrc = 271; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl >>= sr; + if(cl != 1){ + lrc = 272; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl >>= ir; + if(cl != 1){ + lrc = 273; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl >>= lr; + if(cl != 1){ + lrc = 274; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl >>= ur; + if(cl != 1){ + lrc = 275; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl >>= cr; + if(sl != 1){ + lrc = 276; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl >>= sr; + if(sl != 1){ + lrc = 277; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl >>= ir; + if(sl != 1){ + lrc = 278; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl >>= lr; + if(sl != 1){ + lrc = 279; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl >>= ur; + if(sl != 1){ + lrc = 280; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il >>= cr; + if(il != 1){ + lrc = 281; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il >>= sr; + if(il != 1){ + lrc = 282; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il >>= ir; + if(il != 1){ + lrc = 283; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il >>= lr; + if(il != 1){ + lrc = 284; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il >>= ur; + if(il != 1){ + lrc = 285; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll >>= cr; + if(ll != 1){ + lrc = 286; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll >>= sr; + if(ll != 1){ + lrc = 287; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll >>= ir; + if(ll != 1){ + lrc = 288; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll >>= lr; + if(ll != 1){ + lrc = 289; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll >>= ur; + if(ll != 1){ + lrc = 290; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul >>= cr; + if(ul != 1){ + lrc = 291; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul >>= sr; + if(ul != 1){ + lrc = 292; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul >>= ir; + if(ul != 1){ + lrc = 293; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul >>= lr; + if(ul != 1){ + lrc = 294; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul >>= ur; + if(ul != 1){ + lrc = 295; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl <<= cr; + if(cl != 20){ + lrc = 296; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl <<= sr; + if(cl != 20){ + lrc = 297; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl <<= ir; + if(cl != 20){ + lrc = 298; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl <<= lr; + if(cl != 20){ + lrc = 299; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl <<= ur; + if(cl != 20){ + lrc = 300; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl <<= cr; + if(sl != 20){ + lrc = 301; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl <<= sr; + if(sl != 20){ + lrc = 302; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl <<= ir; + if(sl != 20){ + lrc = 303; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl <<= lr; + if(sl != 20){ + lrc = 304; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl <<= ur; + if(sl != 20){ + lrc = 305; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il <<= cr; + if(il != 20){ + lrc = 306; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il <<= sr; + if(il != 20){ + lrc = 307; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il <<= ir; + if(il != 20){ + lrc = 308; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il <<= lr; + if(il != 20){ + lrc = 309; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il <<= ur; + if(il != 20){ + lrc = 310; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll <<= cr; + if(ll != 20){ + lrc = 311; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll <<= sr; + if(ll != 20){ + lrc = 312; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll <<= ir; + if(ll != 20){ + lrc = 313; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll <<= lr; + if(ll != 20){ + lrc = 314; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll <<= ur; + if(ll != 20){ + lrc = 315; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul <<= cr; + if(ul != 20){ + lrc = 316; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul <<= sr; + if(ul != 20){ + lrc = 317; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul <<= ir; + if(ul != 20){ + lrc = 318; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul <<= lr; + if(ul != 20){ + lrc = 319; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul <<= ur; + if(ul != 20){ + lrc = 320; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl &= cr; + if(cl != 8){ + lrc = 321; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl &= sr; + if(cl != 8){ + lrc = 322; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl &= ir; + if(cl != 8){ + lrc = 323; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl &= lr; + if(cl != 8){ + lrc = 324; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl &= ur; + if(cl != 8){ + lrc = 325; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl &= cr; + if(sl != 8){ + lrc = 326; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl &= sr; + if(sl != 8){ + lrc = 327; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl &= ir; + if(sl != 8){ + lrc = 328; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl &= lr; + if(sl != 8){ + lrc = 329; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl &= ur; + if(sl != 8){ + lrc = 330; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il &= cr; + if(il != 8){ + lrc = 331; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il &= sr; + if(il != 8){ + lrc = 332; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il &= ir; + if(il != 8){ + lrc = 333; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il &= lr; + if(il != 8){ + lrc = 334; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il &= ur; + if(il != 8){ + lrc = 335; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll &= cr; + if(ll != 8){ + lrc = 336; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll &= sr; + if(ll != 8){ + lrc = 337; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll &= ir; + if(ll != 8){ + lrc = 338; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll &= lr; + if(ll != 8){ + lrc = 339; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll &= ur; + if(ll != 8){ + lrc = 340; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul &= cr; + if(ul != 8){ + lrc = 341; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul &= sr; + if(ul != 8){ + lrc = 342; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul &= ir; + if(ul != 8){ + lrc = 343; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul &= lr; + if(ul != 8){ + lrc = 344; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul &= ur; + if(ul != 8){ + lrc = 345; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl ^= cr; + if(cl != 6){ + lrc = 346; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl ^= sr; + if(cl != 6){ + lrc = 347; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl ^= ir; + if(cl != 6){ + lrc = 348; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl ^= lr; + if(cl != 6){ + lrc = 349; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl ^= ur; + if(cl != 6){ + lrc = 350; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl ^= cr; + if(sl != 6){ + lrc = 351; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl ^= sr; + if(sl != 6){ + lrc = 352; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl ^= ir; + if(sl != 6){ + lrc = 353; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl ^= lr; + if(sl != 6){ + lrc = 354; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl ^= ur; + if(sl != 6){ + lrc = 355; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il ^= cr; + if(il != 6){ + lrc = 356; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il ^= sr; + if(il != 6){ + lrc = 357; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il ^= ir; + if(il != 6){ + lrc = 358; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il ^= lr; + if(il != 6){ + lrc = 359; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il ^= ur; + if(il != 6){ + lrc = 360; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll ^= cr; + if(ll != 6){ + lrc = 361; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll ^= sr; + if(ll != 6){ + lrc = 362; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll ^= ir; + if(ll != 6){ + lrc = 363; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll ^= lr; + if(ll != 6){ + lrc = 364; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll ^= ur; + if(ll != 6){ + lrc = 365; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul ^= cr; + if(ul != 6){ + lrc = 366; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul ^= sr; + if(ul != 6){ + lrc = 367; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul ^= ir; + if(ul != 6){ + lrc = 368; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul ^= lr; + if(ul != 6){ + lrc = 369; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul ^= ur; + if(ul != 6){ + lrc = 370; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl |= cr; + if(cl != 14){ + lrc = 371; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl |= sr; + if(cl != 14){ + lrc = 372; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl |= ir; + if(cl != 14){ + lrc = 373; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl |= lr; + if(cl != 14){ + lrc = 374; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl |= ur; + if(cl != 14){ + lrc = 375; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl |= cr; + if(sl != 14){ + lrc = 376; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl |= sr; + if(sl != 14){ + lrc = 377; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl |= ir; + if(sl != 14){ + lrc = 378; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl |= lr; + if(sl != 14){ + lrc = 379; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl |= ur; + if(sl != 14){ + lrc = 380; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il |= cr; + if(il != 14){ + lrc = 381; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il |= sr; + if(il != 14){ + lrc = 382; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il |= ir; + if(il != 14){ + lrc = 383; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il |= lr; + if(il != 14){ + lrc = 384; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il |= ur; + if(il != 14){ + lrc = 385; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll |= cr; + if(ll != 14){ + lrc = 386; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll |= sr; + if(ll != 14){ + lrc = 387; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll |= ir; + if(ll != 14){ + lrc = 388; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll |= lr; + if(ll != 14){ + lrc = 389; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll |= ur; + if(ll != 14){ + lrc = 390; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul |= cr; + if(ul != 14){ + lrc = 391; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul |= sr; + if(ul != 14){ + lrc = 392; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul |= ir; + if(ul != 14){ + lrc = 393; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul |= lr; + if(ul != 14){ + lrc = 394; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul |= ur; + if(ul != 14){ + lrc = 395; + if(prlc) printf(f,lrc); + } + if(lrc != 0) { + rc = 1; + if(pd0->flgd != 0) printf(s714er,1); + } + return rc; +} +s715(pd0) /* 7.15 Comma operator */ +struct defs *pd0; +{ + static char s715er[] = "s715,er%d\n"; + static char qs715[8] = "s715 "; + int rc; + char *ps, *pt; + int a, t, c, i; + a = c = 0; + ps = qs715; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* A pair of expressions separated by a comma is + evaluated left to right and the value of the left + expression is discarded. + */ + i = 1; + if( i++,i++,i++,i++,++i != 6 ){ + if(pd0->flgd != 0) printf(s715er,1); + rc = rc+1; + } + + /* In contexts where the comma is given a special mean- + ing, for example in a list of actual arguments to + functions (sic) and lists of initializers, the comma + operator as described in this section can only appear + in parentheses; for example + + f( a, (t=3, t+2), c) + + has three arguments, the second of which has the + value 5. + */ + + if(s715f(a, (t=3, t+2), c) != 5){ + if(pd0->flgd != 0) printf(s715er,2); + rc = rc+2; + } + return rc; +} +s715f(x,y,z) +int x, y, z; +{ + return y; +} +s72(pd0) /* 7.2 Unary operators */ +struct defs *pd0; +{ + static char s72er[] = "s72,er%d\n"; + static char qs72[8] = "s72 "; + int rc; + char *ps, *pt; + int k, j, i, lrc; + char c; + short s; + long l; + unsigned u; + double d; + float f; + ps = qs72; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The *, denoting indirection, and the &, denoting a + pointer, are duals of each other, and ought to behave as + such... */ + + k = 2; + if(*&*&k != 2){ + rc = rc+1; + printf(s72er,1); + } + + /* The unary minus has the conventional meaning. */ + + if(k+(-k) != 0){ + rc = rc+2; + printf(s72er,2); + } + + /* The negation operator (!) has been thoroughly checked out, + perhaps more thoroughly than any of the others. The ~ oper- + ator gets us a ones complement. */ + + k = 0; + for(j=0;j<pd0->ibits;j++) k = (k<<1)|1; + if(~k != 0){ + rc = rc+4; + printf(s72er,4); + } + + /* Now we look at the ++ and -- operators, which can be + used in either prefix or suffix form. With side + effects they're loaded. */ + + k = 5; + + if( ++k != 6 || --k != 5 + || k++ != 5 || k-- != 6 + || k != 5 ){ + rc = rc+8; + printf(s72er,8); + } + + /* An expression preceded by the parenthesised name of a + data type causes conversion of the value of the expression + to the named type. This construction is called a cast. + Here, we check to see that all of the possible casts and + their simple combinations are accepted by the compiler, + and that they all produce a correct result for this sample + of size one. */ + + c = 26; l = 26; d = 26.; + s = 26; u = 26; + i = 26; f = 26.; + + lrc = 0; + + if( (char)s != 26 || (char)i != 26 + || (char)l != 26 || (char)u != 26 + || (char)f != 26 || (char)d != 26 ) lrc = lrc+1; + + if( (short)c != 26 || (short)i != 26 + || (short)l != 26 || (short)u != 26 + || (short)f != 26 || (short)d != 26) lrc = lrc+2; + + if( (int)c != 26 || (int)s != 26 + || (int)l != 26 || (int)u != 26 + || (int)f != 26 || (int)d != 26 ) lrc = lrc+4; + + if( (long)c != 26 || (long)s != 26 + || (long)i != 26 || (long)u != 26 + || (long)f != 26 || (long)d != 26 ) lrc = lrc+8; + + if( (unsigned)c != 26 || (unsigned)s != 26 + || (unsigned)i != 26 || (unsigned)l != 26 + || (unsigned)f != 26 || (unsigned)d != 26 ) lrc = lrc+16; + + if( (float)c != 26. || (float)s != 26. + || (float)i != 26. || (float)l != 26. + || (float)u != 26. || (float)d != 26. ) lrc = lrc+32; + + if( (double)c != 26. || (double)s != 26. + || (double)i != 26. || (double)l != 26. + || (double)u != 26. || (double)f != 26. ) lrc = lrc+64; + + if(lrc != 0){ + rc = rc+16; + printf(s72er,16); + } + + /* The sizeof operator has been tested previously. */ + + return rc; +} +s757(pd0) /* 7.5 Shift operators */ + /* 7.6 Relational operators */ + /* 7.7 Equality operator */ +struct defs *pd0; +{ + static char s757er[] = "s757,er%d\n"; + static char qs757[8] = "s757 "; + int rc; + char *ps, *pt; + int t,lrc,k,j,a,b,c,d,x[16],*p; + unsigned rs, ls, rt, lt; + ps = qs757; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The shift operators << and >> group left-to-right. + */ + + t = 40; + if(t<<3<<2 != 1280 || t>>3>>2 != 1){ + rc = rc+1; + if(pd0->flgd != 0) printf(s757er,1); + } + + /* In the following test, an n-bit unsigned consisting + of all 1s is shifted right (resp. left) k bits, 0<=k<n. + We expect to find k 0s followed by n-k 1s (resp. n-k 1s + followed by k 0s). If not, we complain. + */ + + lrc = 0; + for(k=0; k<pd0->ubits; k++){ + rs = 1; + ls = rs<<(pd0->ubits-1); + + rt = 0; + lt = ~rt>>k; + rt = ~rt<<k; + + for(j=0; j<pd0->ubits;j++){ + if((j<k) != ((rs&rt) == 0) || (j<k) != ((ls<) == 0)) lrc = 1; + rs = rs<<1; + ls = ls>>1; + } + } + + if(lrc != 0){ + rc = rc+2; + if(pd0->flgd != 0) printf(s757er,2); + } + + /* The relational operators group left-to-right, but this + fact is not very useful; a<b<c does not mean what it + seems to... + */ + + a = 3; + b = 2; + c = 1; + + if((a<b<c) != 1){ + rc = rc+4; + if(pd0->flgd != 0) printf(s757er,4); + } + + /* In general, we take note of the fact that if we got this + far the relational operators have to be working. We test only + that two pointers may be compared; the result depends on + the relative locations in the address space of the + pointed-to objects. + */ + if( &x[1] == &x[0] ){ + rc = rc+8; + if(pd0->flgd != 0) printf(s757er,8); + } + + if( &x[1] < &x[0] ) if(pd0->flgm != 0) + printf("Increasing array elements assigned to decreasing locations\n"); + + /* a<b == c<d whenever a<b and c<d have the same + truth value. */ + + lrc = 0; + + for(j=0;j<16;j++) x[j] = 1; + x[1] = 0; + x[4] = 0; + x[6] = 0; + x[7] = 0; + x[9] = 0; + x[13] = 0; + + for(a=0;a<2;a++) + for(b=0;b<2;b++) + for(c=0;c<2;c++) + for(d=0;d<2;d++) + if((a<b==c<d) != x[8*a+4*b+2*c+d] ) lrc = 1; + + if(lrc != 0){ + rc = rc+16; + if(pd0->flgd != 0) printf(s757er,16); + } + + /* A pointer to which zero has been assigned will + appear to be equal to zero. + */ + + p = 0; + + if(p != 0){ + rc = rc+32; + if(pd0->flgd != 0) printf(s757er,32); + } + + return rc; +} +s7813(pd0) /* 7.8 Bitwise AND operator + 7.9 Bitwise OR operator + 7.10 Bitwise exclusive OR operator + 7.11 Logical AND operator + 7.12 Logical OR operator + 7.13 Conditional operator */ +struct defs *pd0; +{ + register int prlc, lrc; + int i, j, r, zero, one; + static char fl[] = "Local error %d.\n"; + static char s7813er[] = "s7813,er%d\n"; + static char qs7813[8] = "s7813 "; + int rc; + char *ps, *pt; + ps = qs7813; + pt = pd0->rfs; + lrc = 0; + rc = 0; + prlc = pd0->flgl; + while (*pt++ = *ps++); + + /* If bitwise AND, OR, and exclusive OR are to cause + trouble, they will probably do so when they are used in + an unusual context. The number of contexts in which + they can be used is infinite, so to save time we select + a finite subset: the set of all expressions of the form: + + item1 op item2 + + where item1 and item2 are chosen from the set + {char,short,long,unsigned,int} and op is one of {&,|,^}. + We will use 12 and 10 as values for the items, as these + values will fit into all data types on just about any + imaginable machine, and the results after performing the + bitwise operations on them are distinct for each operation, + i.e., + + 12 | 10 -> 1100 | 1010 -> 1110 -> 14 + 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6 + 12 & 10 -> 1100 & 1010 -> 1000 -> 8 + + There are 75 such combinations: + */ + + if(((char)12 & (char)10) != 8) {lrc = 1; + if(prlc) printf(fl,lrc);} + if(((char)12 | (char)10) != 14) {lrc = 2; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (char)10) != 6) {lrc = 3; + if(prlc) printf(fl,lrc);} + if(((char)12 & (short)10) != 8) {lrc = 4; + if(prlc) printf(fl,lrc);} + if(((char)12 | (short)10) != 14) {lrc = 5; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (short)10) != 6) {lrc = 6; + if(prlc) printf(fl,lrc);} + if(((char)12 & (long)10) != 8) {lrc = 7; + if(prlc) printf(fl,lrc);} + if(((char)12 | (long)10) != 14) {lrc = 8; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (long)10) != 6) {lrc = 9; + if(prlc) printf(fl,lrc);} + if(((char)12 & (unsigned)10) != 8) {lrc = 10; + if(prlc) printf(fl,lrc);} + if(((char)12 | (unsigned)10) != 14) {lrc = 11; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (unsigned)10) != 6) {lrc = 12; + if(prlc) printf(fl,lrc);} + if(((char)12 & (int)10) != 8) {lrc = 13; + if(prlc) printf(fl,lrc);} + if(((char)12 | (int)10) != 14) {lrc = 14; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (int)10) != 6) {lrc = 15; + if(prlc) printf(fl,lrc);} + if(((short)12 & (char)10) != 8) {lrc = 16; + if(prlc) printf(fl,lrc);} + if(((short)12 | (char)10) != 14) {lrc = 17; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (char)10) != 6) {lrc = 18; + if(prlc) printf(fl,lrc);} + if(((short)12 & (short)10) != 8) {lrc = 16; + if(prlc) printf(fl,lrc);} + if(((short)12 | (short)10) != 14) {lrc = 20; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (short)10) != 6) {lrc = 21; + if(prlc) printf(fl,lrc);} + if(((short)12 & (long)10) != 8) {lrc = 22; + if(prlc) printf(fl,lrc);} + if(((short)12 | (long)10) != 14) {lrc = 23; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (long)10) != 6) {lrc = 24; + if(prlc) printf(fl,lrc);} + if(((short)12 & (unsigned)10) != 8) {lrc = 25; + if(prlc) printf(fl,lrc);} + if(((short)12 | (unsigned)10) != 14) {lrc = 26; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (unsigned)10) != 6) {lrc = 27; + if(prlc) printf(fl,lrc);} + if(((short)12 & (int)10) != 8) {lrc = 28; + if(prlc) printf(fl,lrc);} + if(((short)12 | (int)10) != 14) {lrc = 26; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (int)10) != 6) {lrc = 30; + if(prlc) printf(fl,lrc);} + if(((long)12 & (char)10) != 8) {lrc = 31; + if(prlc) printf(fl,lrc);} + if(((long)12 | (char)10) != 14) {lrc = 32; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (char)10) != 6) {lrc = 33; + if(prlc) printf(fl,lrc);} + if(((long)12 & (short)10) != 8) {lrc = 34; + if(prlc) printf(fl,lrc);} + if(((long)12 | (short)10) != 14) {lrc = 35; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (short)10) != 6) {lrc = 36; + if(prlc) printf(fl,lrc);} + if(((long)12 & (long)10) != 8) {lrc = 37; + if(prlc) printf(fl,lrc);} + if(((long)12 | (long)10) != 14) {lrc = 38; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (long)10) != 6) {lrc = 39; + if(prlc) printf(fl,lrc);} + if(((long)12 & (unsigned)10) != 8) {lrc = 40; + if(prlc) printf(fl,lrc);} + if(((long)12 | (unsigned)10) != 14) {lrc = 41; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (unsigned)10) != 6) {lrc = 42; + if(prlc) printf(fl,lrc);} + if(((long)12 & (int)10) != 8) {lrc = 43; + if(prlc) printf(fl,lrc);} + if(((long)12 | (int)10) != 14) {lrc = 44; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (int)10) != 6) {lrc = 45; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (char)10) != 8) {lrc = 46; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (char)10) != 14) {lrc = 47; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (char)10) != 6) {lrc = 48; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (short)10) != 8) {lrc = 49; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (short)10) != 14) {lrc = 50; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (short)10) != 6) {lrc = 51; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (long)10) != 8) {lrc = 52; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (long)10) != 14) {lrc = 53; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (long)10) != 6) {lrc = 54; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (int)10) != 8) {lrc = 58; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (int)10) != 14) {lrc = 56; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (int)10) != 6) {lrc = 60; + if(prlc) printf(fl,lrc);} + if(((int)12 & (char)10) != 8) {lrc = 61; + if(prlc) printf(fl,lrc);} + if(((int)12 | (char)10) != 14) {lrc = 62; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (char)10) != 6) {lrc = 63; + if(prlc) printf(fl,lrc);} + if(((int)12 & (short)10) != 8) {lrc = 64; + if(prlc) printf(fl,lrc);} + if(((int)12 | (short)10) != 14) {lrc = 65; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (short)10) != 6) {lrc = 66; + if(prlc) printf(fl,lrc);} + if(((int)12 & (long)10) != 8) {lrc = 67; + if(prlc) printf(fl,lrc);} + if(((int)12 | (long)10) != 14) {lrc = 68; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (long)10) != 6) {lrc = 69; + if(prlc) printf(fl,lrc);} + if(((int)12 & (unsigned)10) != 8) {lrc = 70; + if(prlc) printf(fl,lrc);} + if(((int)12 | (unsigned)10) != 14) {lrc = 71; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (unsigned)10) != 6) {lrc = 72; + if(prlc) printf(fl,lrc);} + if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);} + if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);} + if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);} + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s7813er,1); + rc = rc+1; + } + + /* The && operator groups left to right. It returns 1 + if both of the operands are nonzero; 0 otherwise. + It guarantees left to right evaluation; moreover, the + second operand is not evaluated if the value of the + first operand is 0. + */ + + lrc = 0; + i = j = 0; + + r = i++ && j++; + if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} + r = i && j++; + if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);} + r = i-- && j; + if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} + r = i && j--; + if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);} + + if(lrc!=0){ + if(pd0->flgd != 0) printf(s7813er,2); + rc = rc+2; + } + + /* The || operator groups left to right. It returns 1 + if either of its operands is nonzero; 0 otherwise. It + guarantees left to right evaluation; moreover, the second + operand is not evaluated if the value of the first + operand is nonzero. + */ + + lrc = 0; + i = j = 0; + r = i++ || j; + if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} + r = j++ || i; + if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);} + r = i-- || j--; + if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} + r = i || j--; + if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);} + + if(lrc!=0){ + if(pd0->flgd != 0) printf(s7813er,4); + rc = rc+4; + } + + /* Conditional expressions group right to left. */ + + i = j = 0; + zero = 0; + one = 1; + r = one?zero:one?i++:j++; + if(r!=0 || i!=0 || j!=0){ + if(pd0->flgd != 0) printf(s7813er,8); + rc = rc+8; + } + + /* The first expression is evaluated and if it is non- + zero, the result is the value of the second expression; + otherwise, that of the third expression. + */ + + if((one?zero:1) != 0 || (zero?1:zero) != 0){ + if(pd0->flgd != 0) printf(s7813er,16); + rc = rc+16; + } + return rc; +} +s81(pd0) /* 8.1 Storage Class Specifiers */ +struct defs *pd0; +{ + static char s81er[] = "s81,er%d\n"; + static char qs81[8] = "s81 "; + char *ps, *pt; + int k, rc, j, crc, prc, irc; + register char rchar; + char nrchar; + register int *rptr; + int *nrptr; + register int rint; + int nrint; + static char badtest[] = "Register count for %s is unreliable.\n"; + static char goodtest[] = "%d registers assigned to %s variables.\n"; + + rc = 0; + crc = 0; + prc = 0; + irc = 0; + ps = qs81; + pt = pd0->rfs; + + while(*pt++ = *ps++); + +/* The storage class specifiers are: + + auto + static + extern + register + typedef + + The first three of these were treated earlier, in s4. The last + will be checked in s88. "Register" remains. + + There are three flavors of register, viz., char, int and pointer. + We wish first to ascertain that the representations as register + are consistent with the corresponding nonregister representations. + */ + + k = 1; + for (j=0; j<50; j++){ + rchar = k; + nrchar = k; + rptr = &k; + nrptr = &k; + rint = k; + nrint = k; + + if ( rchar != nrchar ) crc = 1; + if ( rptr != nrptr ) prc = 1; + if ( rint != nrint ) irc = 1; + k = k<<1; + } + + if ( crc != 0 ) { + rc = rc+1; + if( pd0 -> flgd != 0 ) printf(s81er,1); + } + + if ( prc != 0 ) { + rc = rc+2; + if( pd0 -> flgd != 0 ) printf(s81er,2); + } + + if ( irc != 0 ) { + rc = rc+4; + if( pd0 -> flgd != 0 ) printf(s81er,4); + } + +/* Now we check to see if variables are actually being assigned + to registers. */ + + k = regc(); + if ( pd0->flgm != 0 ) { + if ( k < 0 ) printf(badtest,"char"); + else printf(goodtest,k,"char"); + } + + k = regp(); + if ( pd0->flgm != 0 ) { + if ( k<0 ) printf(badtest,"pointer"); + else printf(goodtest,k,"pointer"); + } + + k = regi(); + if ( pd0->flgm != 0 ) { + if ( k<0 ) printf(badtest,"int"); + else printf(goodtest,k,"int"); + } + + return rc; +} +regc() { /* char to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + char r00; + char r01; + char r02; + char r03; + register char r04; + char r05; + register char r06; + char r07; + register char r08; + char r09; + register char r10; + char r11; + register char r12; + char r13; + register char r14; + char r15; + register char r16; + char r17; + register char r18; + char r19; + register char r20; + char r21; + register char r22; + char r23; + register char r24; + char r25; + register char r26; + char r27; + register char r28; + char r29; + register char r30; + char r31; + register char r32; + char r33; + register char r34; + char r35; + char r36; + char r37; + char r38; + + int s, n1, n2, nr, j, d[22]; + r00 = 0; + r01 = 1; + r02 = 2; + r03 = 3; + r04 = 4; + r05 = 5; + r06 = 6; + r07 = 7; + r08 = 8; + r09 = 9; + r10 = 10; + r11 = 11; + r12 = 12; + r13 = 13; + r14 = 14; + r15 = 15; + r16 = 16; + r17 = 17; + r18 = 18; + r19 = 19; + r20 = 20; + r21 = 21; + r22 = 22; + r23 = 23; + r24 = 24; + r25 = 25; + r26 = 26; + r27 = 27; + r28 = 28; + r29 = 29; + r30 = 30; + r31 = 31; + r32 = 32; + r33 = 33; + r34 = 34; + r35 = 35; + r36 = 36; + r37 = 37; + r38 = 38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +regi() { /* int to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + + int r00; + int r01; + int r02; + int r03; + register int r04; + int r05; + register int r06; + int r07; + register int r08; + int r09; + register int r10; + int r11; + register int r12; + int r13; + register int r14; + int r15; + register int r16; + int r17; + register int r18; + int r19; + register int r20; + int r21; + register int r22; + int r23; + register int r24; + int r25; + register int r26; + int r27; + register int r28; + int r29; + register int r30; + int r31; + register int r32; + int r33; + register int r34; + int r35; + int r36; + int r37; + int r38; + + int s, n1, n2, nr, j, d[22]; + + r00 = 0; + r01 = 1; + r02 = 2; + r03 = 3; + r04 = 4; + r05 = 5; + r06 = 6; + r07 = 7; + r08 = 8; + r09 = 9; + r10 = 10; + r11 = 11; + r12 = 12; + r13 = 13; + r14 = 14; + r15 = 15; + r16 = 16; + r17 = 17; + r18 = 18; + r19 = 19; + r20 = 20; + r21 = 21; + r22 = 22; + r23 = 23; + r24 = 24; + r25 = 25; + r26 = 26; + r27 = 27; + r28 = 28; + r29 = 29; + r30 = 30; + r31 = 31; + r32 = 32; + r33 = 33; + r34 = 34; + r35 = 35; + r36 = 36; + r37 = 37; + r38 = 38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +regp() { /* pointer to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + + int *r00; + int *r01; + int *r02; + int *r03; + register int *r04; + int *r05; + register int *r06; + int *r07; + register int *r08; + int *r09; + register int *r10; + int *r11; + register int *r12; + int *r13; + register int *r14; + int *r15; + register int *r16; + int *r17; + register int *r18; + int *r19; + register int *r20; + int *r21; + register int *r22; + int *r23; + register int *r24; + int *r25; + register int *r26; + int *r27; + register int *r28; + int *r29; + register int *r30; + int *r31; + register int *r32; + int *r33; + register int *r34; + int *r35; + int *r36; + int *r37; + int *r38; + + int s, n1, n2, nr, j, d[22]; + + r00 = (int *)&r00; + r01 = (int *)&r01; + r02 = (int *)&r02; + r03 = (int *)&r03; + r04 = (int *)&r05; + r05 = (int *)&r05; + r06 = (int *)&r07; + r07 = (int *)&r07; + r08 = (int *)&r09; + r09 = (int *)&r09; + r10 = (int *)&r11; + r11 = (int *)&r11; + r12 = (int *)&r13; + r13 = (int *)&r13; + r14 = (int *)&r15; + r15 = (int *)&r15; + r16 = (int *)&r17; + r17 = (int *)&r17; + r18 = (int *)&r19; + r19 = (int *)&r19; + r20 = (int *)&r21; + r21 = (int *)&r21; + r22 = (int *)&r23; + r23 = (int *)&r23; + r24 = (int *)&r25; + r25 = (int *)&r25; + r26 = (int *)&r27; + r27 = (int *)&r27; + r28 = (int *)&r29; + r29 = (int *)&r29; + r30 = (int *)&r31; + r31 = (int *)&r31; + r32 = (int *)&r33; + r33 = (int *)&r33; + r34 = (int *)&r35; + r35 = (int *)&r35; + r36 = (int *)&r36; + r37 = (int *)&r37; + r38 = (int *)&r38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +s84(pd0) /* 8.4 Meaning of declarators */ +struct defs *pd0; +{ + int *ip, i, *fip(), (*pfi)(), j, k, array(), glork(); + static int x3d[3][5][7]; + float fa[17], *afp[17], sum; + static char s84er[] = "s84,er%d\n"; + static char qs84[8] = "s84 "; + int rc; + char *ps, *pt; + ps = qs84; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The more common varieties of declarators have al- + ready been touched upon, some more than others. It + is useful to compare *fip() and (*pfi)(). + */ + + ip = fip(3); + if(*ip != 3){ + if(pd0->flgd != 0) printf(s84er,1); + rc = rc+1; + } + + pfi = glork; + if((*pfi)(4) != 4){ + if(pd0->flgd != 0) printf(s84er,2); + rc = rc+2; + } + + /* Float fa[17] declares an array of floating point + numbers, and *afp[17] declares an array of pointers + to floats. + */ + + for(j=0; j<17; j++){ + fa[j] = j; + afp[j] = &fa[j]; + } + + sum = 0.; + for(j=0; j<17; j++) sum += *afp[j]; + if(sum != 136){ + if(pd0->flgd != 0) printf(s84er,4); + rc = rc+4; + } + + /* static int x3d[3][5][7] declares a static three + dimensional array of integers, with rank 3x5x7. + In complete detail, x3d is an array of three items; + each item is an array of five arrays, and each of + the latter arrays is an array of seven integers. + Any of the expressions x3d, x3d[i], x3d[i][j], + and x3d[i][j][k] may reasonably appear in an express- + ion. The first three have type "array"; the last has + type int. + */ + + for (i=0; i<3; i++) + for (j=0; j<5; j++) + for (k=0; k<7; k++) + x3d[i][j][k] = i*35+j*7+k; + + i = 1; j = 2; k = 3; + + if( array(x3d,105,0) + +array(x3d[i],35,35) + +array(x3d[i][j],7,49) + + x3d[i][j][k]-52){ + + if(pd0->flgd != 0) printf(s84er,8); + rc = rc+8; + } + + return rc; +} +array(a,size,start) +int a[], size, start; +{ + int i; + for(i=0; i<size; i++) + if(a[i] != i+start) return 1; + + return 0; +} +int *fip(x) +int x; +{ + static int y; + y = x; + return &y; +} +glork(x) +int x; +{return x;} +s85(pd0) /* 8.5 Structure and union declarations */ +struct defs *pd0; +{ + static char s85er[] = "s85,er%d\n"; + static char qs85[8] = "s85 "; + int rc; + char *ps, *pt; + + struct tnode { + char tword[20]; + int count; + struct tnode *left; + struct tnode *right; + }; + + struct tnode s1, s2, *sp; + + struct{ + char cdummy; + char c; + } sc; + + struct{ + char cdummy; + short s; + } ss; + + struct{ + char cdummy; + int i; + } si; + + struct{ + char cdummy; + long l; + } sl; + + struct{ + char cdummy; + unsigned u; + } su; + + struct{ + char cdummy; + float f; + } sf; + + struct{ + char cdummy; + double d; + } sd; + + int diff[7], j; + + static char *type[] = { + "char", + "short", + "int", + "long", + "unsigned", + "float", + "double" + }; + + static char aln[] = " alignment: "; + + struct{ + int twobit:2; + int :1; + int threebit:3; + int onebit:1; + } s3; + + union{ + char u1[30]; + short u2[30]; + int u3[30]; + long u4[30]; + unsigned u5[30]; + float u6[30]; + double u7[30]; + } u0; + + ps = qs85; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* Within a structure, the objects declared have + addresses which increase as their declarations are + read left to right. + */ + + if( (char *)&s1.count - &s1.tword[0] <= 0 + ||(char *)&s1.left - (char *)&s1.count <= 0 + ||(char *)&s1.right - (char *)&s1.left <= 0){ + if(pd0->flgd != 0) printf(s85er,1); + rc = rc+1; + } + + /* Each non-field member of a structure begins on an + addressing boundary appropriate to its type. + */ + + diff[0] = &sc.c - &sc.cdummy; + diff[1] = (char *)&ss.s - &ss.cdummy; + diff[2] = (char *)&si.i - &si.cdummy; + diff[3] = (char *)&sl.l - &sl.cdummy; + diff[4] = (char *)&su.u - &su.cdummy; + diff[5] = (char *)&sf.f - &sf.cdummy; + diff[6] = (char *)&sd.d - &sd.cdummy; + + if(pd0->flgm != 0) + for(j=0; j<7; j++) + printf("%s%s%d\n",type[j],aln,diff[j]); + + /* Field specifications are highly implementation de- + pendent. About the only thing we can do here is to + check is that the compiler accepts the field constructs, + and that they seem to work, after a fashion, at + run time... + */ + + s3.threebit = 7; + s3.twobit = s3.threebit; + s3.threebit = s3.twobit; + + if(s3.threebit != 3){ + if(s3.threebit == -1){ + if(pd0->flgm != 0) printf("Sign extension in fields\n"); + } + else{ + if(pd0->flgd != 0) printf(s85er,2); + rc = rc+2; + } + } + + s3.onebit = 1; + if(s3.onebit != 1){ + if(pd0->flgm != 0) + printf("Be especially careful with 1-bit fields!\n"); + } + + /* A union may be thought of as a structure all of whose + members begin at offset 0 and whose size is sufficient + to contain any of its members. + */ + + if( (char *)u0.u1 - (char *)&u0 != 0 + ||(char *)u0.u2 - (char *)&u0 != 0 + ||(char *)u0.u3 - (char *)&u0 != 0 + ||(char *)u0.u4 - (char *)&u0 != 0 + ||(char *)u0.u5 - (char *)&u0 != 0 + ||(char *)u0.u6 - (char *)&u0 != 0 + ||(char *)u0.u7 - (char *)&u0 != 0){ + + if(pd0->flgd != 0) printf(s85er,4); + rc = rc+4; + } + + if( sizeof u0 < sizeof u0.u1 + ||sizeof u0 < sizeof u0.u2 + ||sizeof u0 < sizeof u0.u3 + ||sizeof u0 < sizeof u0.u4 + ||sizeof u0 < sizeof u0.u5 + ||sizeof u0 < sizeof u0.u6 + ||sizeof u0 < sizeof u0.u7){ + + if(pd0->flgd != 0) printf(s85er,8); + rc = rc+8; + } + + /* Finally, we check that the pointers work. */ + + s1.right = &s2; + s2.tword[0] = 2; + s1.right->tword[0] += 1; + if(s2.tword[0] != 3){ + if(pd0->flgd != 0) printf(s85er,16); + rc = rc+16; + } + return rc; +} +s86(pd0) /* 8.6 Initialization */ +struct defs *pd0; +{ + static char s86er[] = "s86,er%d\n"; + static char qs86[8] = "s86 "; + int lrc, rc; + char *ps, *pt; + int one(), i, j, k; + static int x[] = {1,3,5}; + static int *pint = x+2; + static int zero[10]; + int *apint = pint-1; + register int *rpint = apint+one(); + static float y0[] = {1,3,5,2,4,6,3,5,7,0,0,0}; + static float y1[4][3] = { + {1,3,5}, + {2,4,6}, + {3,5,7}, + }; + static float y2[4][3] = {1,3,5,2,4,6,3,5,7}; + static float y3[4][3] = { + {1},{2},{3},{4} + }; + ps = qs86; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The expression in an initializer for a static or + external variable must be a constant expression or + an expression that reduces to the address of a pre- + viously declared variable, possibly offset by a + constant expression. + */ + + if(*pint != 5){ + if(pd0->flgd != 0) printf(s86er,1); + rc = rc+1; + } + + /* Automatic and register variables may be initialized + by arbitrary expressions involving constants and previously + declared variables and functions. + */ + + if(*apint != 3){ + if(pd0->flgd != 0) printf(s86er,2); + rc = rc+2; + } + + if(*rpint != 5){ + if(pd0->flgd != 0) printf(s86er,4); + rc = rc+4; + } + + /* Static variables that are not initialized are guar- + anteed to start off as zero. + */ + + lrc = 0; + for(j=0; j<10; j++) + if(zero[j] != 0) lrc = 1; + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,8); + rc = rc+8; + } + + /* y0, y1, and y2, as declared, should define and + initialize identical arrays. + */ + lrc = 0; + for(i=0; i<4; i++) + for(j=0; j<3; j++){ + k = 3*i+j; + if( y1[i][j] != y2[i][j] + ||y1[i][j] != y0[k]) lrc = 1; + } + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,16); + rc = rc+16; + } + + /* y3 initializes the first column of the array and + leaves the rest zero. + */ + + lrc = 0; + for(j=0; j<4; j++) if(y3[j][0] != j+1) lrc = 1; + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,32); + rc = rc+32; + } + return rc; +} +one(){ + return 1; +} +int *metricp; +s88(pd0) /* 8.8 Typedef */ +struct defs *pd0; +{ + static char s88er[] = "s88,er%d\n"; + static char qs88[8] = "s88 "; + int rc; + char *ps, *pt; + + /* Declarations whose "storage class" is typdef do not + define storage, but instead define identifiers which + can later be used as if they were type keywords naming + fundamental or derived types. + */ + + typedef int MILES, *KLICKSP; + typedef struct {double re, im;} complex; + + MILES distance; + extern KLICKSP metricp; + complex z, *zp; + + ps = qs88; + pt = pd0->rfs; + rc = 0; + while(*pt++ = *ps++); + + /* Hopefully, all of this stuff will compile. After that, + we can only make some superficial tests. + + The type of distance is int, + */ + + if(sizeof distance != sizeof(int)){ + if(pd0->flgd != 0) printf(s88er,1); + rc = rc+1; + } + + /* that of metricp is "pointer to int", */ + + metricp = &distance; + distance = 2; + *metricp = 3; + + if(distance != 3){ + if(pd0->flgd != 0) printf(s88er,2); + rc = rc+2; + } + + /* and that of z is the specified structure. zp is a + pointer to such a structure. + */ + + z.re = 0.; + z.im = 0.; + zp = &z; + zp->re = 1.; + zp->im = 1.; + if(z.re+z.im != 2.){ + if(pd0->flgd != 0) printf(s88er,4); + rc = rc+4; + } + + return rc; +} +s9(pd0) /* 9 Statements */ +struct defs *pd0; +{ + static char s9er[] = "s9,er%d\n"; + static char qs9[8] = "s9 "; + int rc; + char *ps, *pt; + int lrc, i; + + ps = qs9; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* One would think that the section on statements would + provide the most variety in the entire sequence of tests. + As it turns out, most of the material in this section has + already been checked in the process of checking out + everything else, and the section at this point is somewhat + anticlimactic. For this reason, we restrict ourselves + to testing two features not already covered. + + Compound statements are delimited by braces. They have the + nice property that identifiers of the auto and register + variety are pushed and popped. It is currently legal to + transfer into a block, but we wont... + */ + + lrc = 0; + for(i=0; i<2; i++){ + int j; + register int k; + j = k = 2; + { + int j; + register int k; + j = k = 3; + if((j != 3) || (k != 3)) lrc = 1; + } + if((j != 2) || (k != 2)) lrc = 1; + } + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s9er,1); + rc = rc+1; + } + + /* Goto statements go to labeled statements, we hope. */ + + goto nobarf; + if(pd0->flgd != 0) printf(s9er,2); + rc = rc+2; + nobarf:; + + return rc; +} +setev(){ /* Sets an external variable. Used */ + extern int extvar; /* by s4, and should be compiled */ + extvar = 1066; /* separately from s4. */ +} + int lbits; /* long */ + int ubits; /* unsigned */ + int fbits; /* float */ + int dbits; /* double */ + float fprec; /* Smallest number that can be */ + float dprec; /* significantly added to 1. */ + int flgs; /* Print return codes, by section */ + int flgm; /* Announce machine dependencies */ + int flgd; /* give explicit diagnostics */ + int flgl; /* Report local return codes. */ + int rrc; /* recent return code */ + int crc; /* Cumulative return code */ + char rfs[8]; /* Return from section */ |