diff options
Diffstat (limited to 'code/tools/lcc/tst/cq.c')
-rw-r--r-- | code/tools/lcc/tst/cq.c | 5316 |
1 files changed, 0 insertions, 5316 deletions
diff --git a/code/tools/lcc/tst/cq.c b/code/tools/lcc/tst/cq.c deleted file mode 100644 index 5cd0d6e..0000000 --- a/code/tools/lcc/tst/cq.c +++ /dev/null @@ -1,5316 +0,0 @@ - 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 */ |