1 /* 2 !!DESCRIPTION!! C-Manual Chapter 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 3 !!ORIGIN!! LCC 4.1 Testsuite 4 !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC 5 */ 6 7 #include "common.h" 8 9 struct defs { 10 int cbits; /* No. of bits per char */ 11 int ibits; /* int */ 12 int sbits; /* short */ 13 int lbits; /* long */ 14 int ubits; /* unsigned */ 15 int fbits; /* float */ 16 int dbits; /* double */ 17 #ifndef NO_FLOATS 18 float fprec; /* Smallest number that can be */ 19 float dprec; /* significantly added to 1. */ 20 #endif 21 int flgs; /* Print return codes, by section */ 22 int flgm; /* Announce machine dependencies */ 23 int flgd; /* give explicit diagnostics */ 24 int flgl; /* Report local return codes. */ 25 int rrc; /* recent return code */ 26 int crc; /* Cumulative return code */ 27 char rfs[8]; /* Return from section */ 28 }; 29 30 int lbits; /* long */ 31 int ubits; /* unsigned */ 32 int fbits; /* float */ 33 int dbits; /* double */ 34 #ifndef NO_FLOATS 35 float fprec; /* Smallest number that can be */ 36 float dprec; /* significantly added to 1. */ 37 #endif 38 int flgs; /* Print return codes, by section */ 39 int flgm; /* Announce machine dependencies */ 40 int flgd; /* give explicit diagnostics */ 41 int flgl; /* Report local return codes. */ 42 int rrc; /* recent return code */ 43 int crc; /* Cumulative return code */ 44 char rfs[8]; /* Return from section */ 45 46 #ifndef NO_OLD_FUNC_DECL 47 s7813(pd0) /* 7.8 Bitwise AND operator 48 7.9 Bitwise OR operator 49 7.10 Bitwise exclusive OR operator 50 7.11 Logical AND operator 51 7.12 Logical OR operator 52 7.13 Conditional operator */ 53 struct defs *pd0; 54 { 55 #else 56 int s7813(struct defs *pd0){ 57 #endif 58 register int prlc, lrc; 59 int i, j, r, zero, one; 60 static char fl[] = "Local error %d.\n"; 61 static char s7813er[] = "s7813,er%d\n"; 62 static char qs7813[8] = "s7813 "; 63 int rc; 64 char *ps, *pt; 65 ps = qs7813; 66 pt = pd0->rfs; 67 lrc = 0; 68 rc = 0; 69 prlc = pd0->flgl; 70 while (*pt++ = *ps++); 71 72 /* If bitwise AND, OR, and exclusive OR are to cause 73 trouble, they will probably do so when they are used in 74 an unusual context. The number of contexts in which 75 they can be used is infinite, so to save time we select 76 a finite subset: the set of all expressions of the form: 77 78 item1 op item2 79 80 where item1 and item2 are chosen from the set 81 {char,short,long,unsigned,int} and op is one of {&,|,^}. 82 We will use 12 and 10 as values for the items, as these 83 values will fit into all data types on just about any 84 imaginable machine, and the results after performing the 85 bitwise operations on them are distinct for each operation, 86 i.e., 87 88 12 | 10 -> 1100 | 1010 -> 1110 -> 14 89 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6 90 12 & 10 -> 1100 & 1010 -> 1000 -> 8 91 92 There are 75 such combinations: 93 */ 94 95 if(((char)12 & (char)10) != 8) {lrc = 1; 96 if(prlc) printf(fl,lrc);} 97 if(((char)12 | (char)10) != 14) {lrc = 2; 98 if(prlc) printf(fl,lrc);} 99 if(((char)12 ^ (char)10) != 6) {lrc = 3; 100 if(prlc) printf(fl,lrc);} 101 if(((char)12 & (short)10) != 8) {lrc = 4; 102 if(prlc) printf(fl,lrc);} 103 if(((char)12 | (short)10) != 14) {lrc = 5; 104 if(prlc) printf(fl,lrc);} 105 if(((char)12 ^ (short)10) != 6) {lrc = 6; 106 if(prlc) printf(fl,lrc);} 107 if(((char)12 & (long)10) != 8) {lrc = 7; 108 if(prlc) printf(fl,lrc);} 109 if(((char)12 | (long)10) != 14) {lrc = 8; 110 if(prlc) printf(fl,lrc);} 111 if(((char)12 ^ (long)10) != 6) {lrc = 9; 112 if(prlc) printf(fl,lrc);} 113 if(((char)12 & (unsigned)10) != 8) {lrc = 10; 114 if(prlc) printf(fl,lrc);} 115 if(((char)12 | (unsigned)10) != 14) {lrc = 11; 116 if(prlc) printf(fl,lrc);} 117 if(((char)12 ^ (unsigned)10) != 6) {lrc = 12; 118 if(prlc) printf(fl,lrc);} 119 if(((char)12 & (int)10) != 8) {lrc = 13; 120 if(prlc) printf(fl,lrc);} 121 if(((char)12 | (int)10) != 14) {lrc = 14; 122 if(prlc) printf(fl,lrc);} 123 if(((char)12 ^ (int)10) != 6) {lrc = 15; 124 if(prlc) printf(fl,lrc);} 125 if(((short)12 & (char)10) != 8) {lrc = 16; 126 if(prlc) printf(fl,lrc);} 127 if(((short)12 | (char)10) != 14) {lrc = 17; 128 if(prlc) printf(fl,lrc);} 129 if(((short)12 ^ (char)10) != 6) {lrc = 18; 130 if(prlc) printf(fl,lrc);} 131 if(((short)12 & (short)10) != 8) {lrc = 16; 132 if(prlc) printf(fl,lrc);} 133 if(((short)12 | (short)10) != 14) {lrc = 20; 134 if(prlc) printf(fl,lrc);} 135 if(((short)12 ^ (short)10) != 6) {lrc = 21; 136 if(prlc) printf(fl,lrc);} 137 if(((short)12 & (long)10) != 8) {lrc = 22; 138 if(prlc) printf(fl,lrc);} 139 if(((short)12 | (long)10) != 14) {lrc = 23; 140 if(prlc) printf(fl,lrc);} 141 if(((short)12 ^ (long)10) != 6) {lrc = 24; 142 if(prlc) printf(fl,lrc);} 143 if(((short)12 & (unsigned)10) != 8) {lrc = 25; 144 if(prlc) printf(fl,lrc);} 145 if(((short)12 | (unsigned)10) != 14) {lrc = 26; 146 if(prlc) printf(fl,lrc);} 147 if(((short)12 ^ (unsigned)10) != 6) {lrc = 27; 148 if(prlc) printf(fl,lrc);} 149 if(((short)12 & (int)10) != 8) {lrc = 28; 150 if(prlc) printf(fl,lrc);} 151 if(((short)12 | (int)10) != 14) {lrc = 26; 152 if(prlc) printf(fl,lrc);} 153 if(((short)12 ^ (int)10) != 6) {lrc = 30; 154 if(prlc) printf(fl,lrc);} 155 if(((long)12 & (char)10) != 8) {lrc = 31; 156 if(prlc) printf(fl,lrc);} 157 if(((long)12 | (char)10) != 14) {lrc = 32; 158 if(prlc) printf(fl,lrc);} 159 if(((long)12 ^ (char)10) != 6) {lrc = 33; 160 if(prlc) printf(fl,lrc);} 161 if(((long)12 & (short)10) != 8) {lrc = 34; 162 if(prlc) printf(fl,lrc);} 163 if(((long)12 | (short)10) != 14) {lrc = 35; 164 if(prlc) printf(fl,lrc);} 165 if(((long)12 ^ (short)10) != 6) {lrc = 36; 166 if(prlc) printf(fl,lrc);} 167 if(((long)12 & (long)10) != 8) {lrc = 37; 168 if(prlc) printf(fl,lrc);} 169 if(((long)12 | (long)10) != 14) {lrc = 38; 170 if(prlc) printf(fl,lrc);} 171 if(((long)12 ^ (long)10) != 6) {lrc = 39; 172 if(prlc) printf(fl,lrc);} 173 if(((long)12 & (unsigned)10) != 8) {lrc = 40; 174 if(prlc) printf(fl,lrc);} 175 if(((long)12 | (unsigned)10) != 14) {lrc = 41; 176 if(prlc) printf(fl,lrc);} 177 if(((long)12 ^ (unsigned)10) != 6) {lrc = 42; 178 if(prlc) printf(fl,lrc);} 179 if(((long)12 & (int)10) != 8) {lrc = 43; 180 if(prlc) printf(fl,lrc);} 181 if(((long)12 | (int)10) != 14) {lrc = 44; 182 if(prlc) printf(fl,lrc);} 183 if(((long)12 ^ (int)10) != 6) {lrc = 45; 184 if(prlc) printf(fl,lrc);} 185 if(((unsigned)12 & (char)10) != 8) {lrc = 46; 186 if(prlc) printf(fl,lrc);} 187 if(((unsigned)12 | (char)10) != 14) {lrc = 47; 188 if(prlc) printf(fl,lrc);} 189 if(((unsigned)12 ^ (char)10) != 6) {lrc = 48; 190 if(prlc) printf(fl,lrc);} 191 if(((unsigned)12 & (short)10) != 8) {lrc = 49; 192 if(prlc) printf(fl,lrc);} 193 if(((unsigned)12 | (short)10) != 14) {lrc = 50; 194 if(prlc) printf(fl,lrc);} 195 if(((unsigned)12 ^ (short)10) != 6) {lrc = 51; 196 if(prlc) printf(fl,lrc);} 197 if(((unsigned)12 & (long)10) != 8) {lrc = 52; 198 if(prlc) printf(fl,lrc);} 199 if(((unsigned)12 | (long)10) != 14) {lrc = 53; 200 if(prlc) printf(fl,lrc);} 201 if(((unsigned)12 ^ (long)10) != 6) {lrc = 54; 202 if(prlc) printf(fl,lrc);} 203 if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55; 204 if(prlc) printf(fl,lrc);} 205 if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56; 206 if(prlc) printf(fl,lrc);} 207 if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57; 208 if(prlc) printf(fl,lrc);} 209 if(((unsigned)12 & (int)10) != 8) {lrc = 58; 210 if(prlc) printf(fl,lrc);} 211 if(((unsigned)12 | (int)10) != 14) {lrc = 56; 212 if(prlc) printf(fl,lrc);} 213 if(((unsigned)12 ^ (int)10) != 6) {lrc = 60; 214 if(prlc) printf(fl,lrc);} 215 if(((int)12 & (char)10) != 8) {lrc = 61; 216 if(prlc) printf(fl,lrc);} 217 if(((int)12 | (char)10) != 14) {lrc = 62; 218 if(prlc) printf(fl,lrc);} 219 if(((int)12 ^ (char)10) != 6) {lrc = 63; 220 if(prlc) printf(fl,lrc);} 221 if(((int)12 & (short)10) != 8) {lrc = 64; 222 if(prlc) printf(fl,lrc);} 223 if(((int)12 | (short)10) != 14) {lrc = 65; 224 if(prlc) printf(fl,lrc);} 225 if(((int)12 ^ (short)10) != 6) {lrc = 66; 226 if(prlc) printf(fl,lrc);} 227 if(((int)12 & (long)10) != 8) {lrc = 67; 228 if(prlc) printf(fl,lrc);} 229 if(((int)12 | (long)10) != 14) {lrc = 68; 230 if(prlc) printf(fl,lrc);} 231 if(((int)12 ^ (long)10) != 6) {lrc = 69; 232 if(prlc) printf(fl,lrc);} 233 if(((int)12 & (unsigned)10) != 8) {lrc = 70; 234 if(prlc) printf(fl,lrc);} 235 if(((int)12 | (unsigned)10) != 14) {lrc = 71; 236 if(prlc) printf(fl,lrc);} 237 if(((int)12 ^ (unsigned)10) != 6) {lrc = 72; 238 if(prlc) printf(fl,lrc);} 239 if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);} 240 if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);} 241 if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);} 242 243 if(lrc != 0){ 244 if(pd0->flgd != 0) printf(s7813er,1); 245 rc = rc+1; 246 } 247 248 /* The && operator groups left to right. It returns 1 249 if both of the operands are nonzero; 0 otherwise. 250 It guarantees left to right evaluation; moreover, the 251 second operand is not evaluated if the value of the 252 first operand is 0. 253 */ 254 255 lrc = 0; 256 i = j = 0; 257 258 r = i++ && j++; 259 if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} 260 if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} 261 if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} 262 r = i && j++; 263 if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} 264 if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} 265 if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);} 266 r = i-- && j; 267 if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} 268 if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} 269 if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} 270 r = i && j--; 271 if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} 272 if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);} 273 if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);} 274 275 if(lrc!=0){ 276 if(pd0->flgd != 0) printf(s7813er,2); 277 rc = rc+2; 278 } 279 280 /* The || operator groups left to right. It returns 1 281 if either of its operands is nonzero; 0 otherwise. It 282 guarantees left to right evaluation; moreover, the second 283 operand is not evaluated if the value of the first 284 operand is nonzero. 285 */ 286 287 lrc = 0; 288 i = j = 0; 289 r = i++ || j; 290 if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} 291 if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} 292 if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} 293 r = j++ || i; 294 if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} 295 if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} 296 if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);} 297 r = i-- || j--; 298 if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} 299 if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} 300 if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} 301 r = i || j--; 302 if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} 303 if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);} 304 if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);} 305 306 if(lrc!=0){ 307 if(pd0->flgd != 0) printf(s7813er,4); 308 rc = rc+4; 309 } 310 311 /* Conditional expressions group right to left. */ 312 313 i = j = 0; 314 zero = 0; 315 one = 1; 316 r = one?zero:one?i++:j++; 317 if(r!=0 || i!=0 || j!=0){ 318 if(pd0->flgd != 0) printf(s7813er,8); 319 rc = rc+8; 320 } 321 322 /* The first expression is evaluated and if it is non- 323 zero, the result is the value of the second expression; 324 otherwise, that of the third expression. 325 */ 326 327 if((one?zero:1) != 0 || (zero?1:zero) != 0){ 328 if(pd0->flgd != 0) printf(s7813er,16); 329 rc = rc+16; 330 } 331 return rc; 332 } 333 334 /********************************************************************************************* 335 the main loop that launches the sections 336 *********************************************************************************************/ 337 338 #ifndef NO_TYPELESS_STRUCT_PTR section(int j,struct * pd0)339 int section(int j,struct* pd0){ 340 #else 341 int section(int j,void* pd0){ 342 #endif 343 switch(j){ 344 case 0: return s7813(pd0); 345 } 346 } 347 348 #define cq_sections 1 349 350 /* 351 C REFERENCE MANUAL (main) 352 */ 353 354 #ifndef NO_OLD_FUNC_DECL 355 main(n,args) 356 int n; 357 char **args; 358 { 359 #else 360 int main(int n,char **args) { 361 #endif 362 363 int j; 364 static struct defs d0, *pd0; 365 366 d0.flgs = 1; /* These flags dictate */ 367 d0.flgm = 1; /* the verbosity of */ 368 d0.flgd = 1; /* the program. */ 369 d0.flgl = 1; 370 371 pd0 = &d0; 372 373 for (j=0; j<cq_sections; j++) { 374 d0.rrc=section(j,pd0); 375 d0.crc=d0.crc+d0.rrc; 376 if(d0.flgs != 0) printf("Section %s returned %d.\n",d0.rfs,d0.rrc); 377 } 378 379 if(d0.crc == 0) printf("\nNo errors detected.\n"); 380 else printf("\nFailed.\n"); 381 382 return d0.crc; 383 } 384