# { (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. This product is part of the Amsterdam Compiler Kit. Permission to use, sell, duplicate or disclose this software must be obtained in writing. Requests for such permissions may be sent to Dr. Andrew S. Tanenbaum Wiskundig Seminarium Vrije Universiteit Postbox 7161 1007 MC Amsterdam The Netherlands } {$i64 : sets of integers contain 64 bits} program t3(input,output,f1,f2,f3,f4,f5,f6); { The Berkeley and EM-1 compilers both can handle this program } const rcsversion='$Id$'; type wavelength = (red,blue,yellow,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11, pink,green,orange); spectrum= set of wavelength; bit = 0..1; #ifndef NOFLOAT tp3= packed record c1:char; i:integer; p:boolean; x:real end; tp4= record c1:char; i:integer; p:boolean; x:real end; #else tp3= packed record c1:char; i:integer; p:boolean; end; tp4= record c1:char; i:integer; p:boolean; end; #endif vec1 = array [-10..+10] of integer; #ifndef NOFLOAT vrec = record case t:boolean of false:(r:real); true:(b:bit) end; #else vrec = record case t:boolean of false:(); true:(b:bit) end; #endif var t,pct,ect:integer; i,j,k,l:integer; #ifndef NOFLOAT x,y: real; #endif p:boolean; c2:char; a1: vec1; c: array [1..20] of char; r3: tp3; r4: tp4; vr: vrec; colors: spectrum; letters,cset:set of char; f1: text; f2: file of spectrum; f3: file of tp3; f4: file of tp4; f5: file of vec1; f6: file of vrec; procedure e(n:integer); begin ect := ect + 1; writeln(' Error', n:3,' in test ', t) end; {************************************************************************} procedure tst34; { Global files } var i:integer; c1:char; begin t:=34; pct := pct + 1; rewrite(f1); if not eof(f1) then e(1); write(f1,'abc',20+7:2,'a':2); writeln(f1); write(f1,'xyz'); i:=-3000; write(f1,i:5); reset(f1); if eof(f1) or eoln(f1) then e(2); for i:=1 to 17 do read(f1,c[i]); if(c[1]<>'a') or (c[3]<>'c') or (c[5]<>'7') or (c[8]<>' ') or (c[12]<>'-') or (c[13]<>'3') or (c[16]<>'0') then e(3); if not eof(f1) then e(4); rewrite(f1); for i:= 32 to 127 do write(f1,chr(i)); reset(f1); p:= false; for i:= 32 to 127 do begin read(f1,c1); if ord(c1) <> i then p:=true end; if p then e(5); rewrite(f1); for c1 := 'a' to 'z' do write(f1,c1); reset(f1); p:= false; for c1 := 'a' to 'z' do begin read(f1,c2); if c2 <> c1 then p:=true end; if p then e(6); end; procedure tst36; var i,j:integer; begin t:=36; pct:=pct+1; rewrite(f2); rewrite(f3); rewrite(f4); rewrite(f5); rewrite(f6); colors := []; f2^ := colors; put(f2); colors := [red]; f2^ := colors; put(f2); colors := [red,blue]; f2^ := colors; put(f2); colors := [yellow,blue]; f2^ := colors; put(f2); reset(f2); colors := f2^; get(f2); if colors <> [] then e(4); colors := f2^; get(f2); if colors <> [red] then e(5); colors := f2^; get(f2); if colors <> [blue,red] then e(6); colors := f2^; get(f2); if colors <> [blue,yellow] then e(7); #ifndef NOFLOAT r3.c1:='w'; r3.i:= -100; r3.x:=303.56; r3.p:=true; f3^:=r3; put(f3); r3.c1:='y'; r3.i:= -35; r3.x:=26.32; f3^:=r3; put(f3); r3.c1:='q'; r3.i:= +29; r3.x:=10.00; f3^:=r3; put(f3); r3.c1:='j'; r3.i:= 8; r3.x:=10000; f3^:=r3; put(f3); #else r3.c1:='w'; r3.i:= -100; r3.p:=true; f3^:=r3; put(f3); r3.c1:='y'; r3.i:= -35; f3^:=r3; put(f3); r3.c1:='q'; r3.i:= +29; f3^:=r3; put(f3); r3.c1:='j'; r3.i:= 8; f3^:=r3; put(f3); #endif for i:= 1 to 1000 do begin f3^ := r3; put(f3) end; reset(f3); #ifndef NOFLOAT r3 := f3^; get(f3); if (r3.c1<>'w') or (r3.i<>-100) or (r3.x<>303.56) then e(8); r3 := f3^; get(f3); if (r3.c1<>'y') or (r3.i<> -35) or (r3.x<> 26.32) then e(9); r3 := f3^; get(f3); if (r3.c1<>'q') or (r3.i<> 29) or (r3.x<> 10.00) then e(10); r3 := f3^; get(f3); if (r3.c1<>'j') or (r3.i<> 8) or (r3.x<> 10000) then e(11); #else r3 := f3^; get(f3); if (r3.c1<>'w') or (r3.i<>-100) then e(8); r3 := f3^; get(f3); if (r3.c1<>'y') or (r3.i<> -35) then e(9); r3 := f3^; get(f3); if (r3.c1<>'q') or (r3.i<> 29) then e(10); r3 := f3^; get(f3); if (r3.c1<>'j') or (r3.i<> 8) then e(11); #endif #ifndef NOFLOAT r4.c1:='w'; r4.i:= -100; r4.x:=303.56; r4.p:=true; f4^:=r4; put(f4); r4.c1:='y'; r4.i:= -35; r4.x:=26.32; f4^:=r4; put(f4); r4.c1:='q'; r4.i:= +29; r4.x:=10.00; f4^:=r4; put(f4); r4.c1:='j'; r4.i:= 8; r4.x:=10000; f4^:=r4; put(f4); #else r4.c1:='w'; r4.i:= -100; r4.p:=true; f4^:=r4; put(f4); r4.c1:='y'; r4.i:= -35; f4^:=r4; put(f4); r4.c1:='q'; r4.i:= +29; f4^:=r4; put(f4); r4.c1:='j'; r4.i:= 8; f4^:=r4; put(f4); #endif for i:= 1 to 1000 do begin f4^ := r4; put(f4) end; reset(f4); #ifndef NOFLOAT r4 := f4^; get(f4); if (r4.c1<>'w') or (r4.i<>-100) or (r4.x<>303.56) then e(12); r4 := f4^; get(f4); if (r4.c1<>'y') or (r4.i<> -35) or (r4.x<> 26.32) then e(13); r4 := f4^; get(f4); if (r4.c1<>'q') or (r4.i<> 29) or (r4.x<> 10.00) then e(13); r4 := f4^; get(f4); if (r4.c1<>'j') or (r4.i<> 8) or (r4.x<> 10000) then e(14); #else r4 := f4^; get(f4); if (r4.c1<>'w') or (r4.i<>-100) then e(12); r4 := f4^; get(f4); if (r4.c1<>'y') or (r4.i<> -35) then e(13); r4 := f4^; get(f4); if (r4.c1<>'q') or (r4.i<> 29) then e(13); r4 := f4^; get(f4); if (r4.c1<>'j') or (r4.i<> 8) then e(14); #endif for j:= 1 to 100 do begin for i:= -10 to +10 do a1[i] := i*j; f5^ := a1; put(f5); end; reset(f5); for j:= 1 to 99 do begin a1:=f5^; get(f5); for i:= -10 to +10 do if a1[i]<> i*j then e(14) end; #ifndef NOFLOAT vr.t:=false; for i:= 1 to 1000 do begin vr.r:=i+0.5; f6^:=vr; put(f6) ; p:=true; end; reset(f6); p:=false; for i:= 1 to 999 do begin vr:=f6^; get(f6); if vr.r <> i+0.5 then p:=true end; if p then e(15); #endif rewrite(f6); if not eof(f6) then e(16); for i:= 1 to 1000 do begin vr.b:=i mod 2; f6^:=vr; put(f6) end; reset(f6); if eof(f6) then e(17); p:=false; for i:= 1 to 1000 do begin vr:=f6^; get(f6); if vr.b <> i mod 2 then p:=true end; if not eof(f6) then e(18); if p then e(19); rewrite(f1); f1^:=chr(10); put(f1); reset(f1); if ord(f1^) <> 32 then e(20); #ifndef NOFLOAT rewrite(f1); x:=0.0625; write(f1,x:6:4, x:6:2); reset(f1); read(f1,y); if y <> 0.0625 then e(21); reset(f1); for i:= 1 to 12 do begin c[i]:= f1^; get(f1) end; if (c[1]<>'0') or (c[2]<>'.') or (c[4]<>'6') then e(22); if (c[7]<>' ') or (c[9]<>'0') or (c[10]<>'.') or (c[12]<>'6') then e(23); #endif end; {************************************************************************} procedure tst35; { Local files } var g1: text; g2: file of spectrum; g3: file of tp4; g4: file of vec1; i,j:integer; begin t:=35; pct := pct + 1; rewrite(g1); rewrite(g2); rewrite(g3); rewrite(g4); if (not (eof(g1) and eof(g4))) then e(1); writeln(g1,'abc', 20+7:2,'a':2); write(g1,'xyz'); reset(g1); if eof(g1) or eoln(g1) then e(2); read(g1,c[1]); read(g1,c[2]); read(g1,c[3],c[4],c[5],c[6],c[7]); if (c[1]<>'a') or (c[3]<>'c') or (c[4]<>'2') or (c[7]<>'a') then e(3); if not eoln(g1) then e(4) else readln(g1); for i:=1 to 2 do read(g1,c[8+i]); if c[10]<>'y' then e(5); if eof(g1) or eoln(g1) then e(6); colors := []; g2^ := colors; put(g2); colors := [pink]; g2^ := colors; put(g2); colors := [pink,green]; g2^ := colors; put(g2); colors := [orange,green]; g2^ := colors; put(g2); reset(g2); colors := g2^; get(g2); if colors <> [] then e(7); colors := g2^; get(g2); if colors <> [pink] then e(8); colors := g2^; get(g2); if colors <> [green,pink] then e(9); colors := g2^; get(g2); if colors <> [green,orange] then e(10); #ifndef NOFLOAT r4.c1:='w'; r4.i:= -100; r4.x:=303.56; g3^:=r4; put(g3); r4.c1:='y'; r4.i:= -35; r4.x:=26.32; g3^:=r4; put(g3); r4.c1:='q'; r4.i:= +29; r4.x:=10.00; g3^:=r4; put(g3); r4.c1:='j'; r4.i:= 8; r4.x:=10000; g3^:=r4; put(g3); #else r4.c1:='w'; r4.i:= -100; g3^:=r4; put(g3); r4.c1:='y'; r4.i:= -35; g3^:=r4; put(g3); r4.c1:='q'; r4.i:= +29; g3^:=r4; put(g3); r4.c1:='j'; r4.i:= 8; g3^:=r4; put(g3); #endif for i:= 1 to 1000 do begin g3^ := r4; put(g3) end; reset(g3); if eof(g3) then e(11); #ifndef NOFLOAT r4 := g3^; get(g3); if (r4.c1<>'w') or (r4.i<>-100) or (r4.x<>303.56) then e(12); r4 := g3^; get(g3); if (r4.c1<>'y') or (r4.i<> -35) or (r4.x<> 26.32) then e(13); r4 := g3^; get(g3); if (r4.c1<>'q') or (r4.i<> 29) or (r4.x<> 10.00) then e(14); r4 := g3^; get(g3); if (r4.c1<>'j') or (r4.i<> 8) or (r4.x<> 10000) then e(15); #else r4 := g3^; get(g3); if (r4.c1<>'w') or (r4.i<>-100) then e(12); r4 := g3^; get(g3); if (r4.c1<>'y') or (r4.i<> -35) then e(13); r4 := g3^; get(g3); if (r4.c1<>'q') or (r4.i<> 29) then e(14); r4 := g3^; get(g3); if (r4.c1<>'j') or (r4.i<> 8) then e(15); #endif for j:= 1 to 100 do begin for i:= -10 to +10 do a1[i] := i*j; g4^ := a1; put(g4) end; reset(g4); for j:= 1 to 100 do begin a1:=g4^; get(g4); for i:= -10 to +10 do if a1[i]<>i*j then e(16) end; if not eof(g2) then e(17); colors:=[q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11]; end; {***********************************************************************} procedure tst37; { Intermediate level files } var g1: text; g2: file of spectrum; g3: file of tp4; g4: file of vec1; procedure tst3701; var i,j:integer; begin t:=3701; pct := pct + 1; rewrite(g1); rewrite(g2); rewrite(g3); rewrite(g4); if (not (eof(g1) and eof(g4))) then e(1); writeln(g1,'abc', 20+7:2,'a':2); write(g1,'xyz'); reset(g1); if eof(g1) or eoln(g1) then e(2); read(g1,c[1]); read(g1,c[2]); read(g1,c[3],c[4],c[5],c[6],c[7]); if (c[1]<>'a') or (c[3]<>'c') or (c[4]<>'2') or (c[7]<>'a') then e(3); if not eoln(g1) then e(4) else readln(g1); for i:=1 to 2 do read(g1,c[8+i]); if c[10]<>'y' then e(5); if eof(g1) or eoln(g1) then e(6); colors := []; g2^ := colors; put(g2); colors := [pink]; g2^ := colors; put(g2); colors := [pink,green]; g2^ := colors; put(g2); colors := [orange,green]; g2^ := colors; put(g2); reset(g2); colors := g2^; get(g2); if colors <> [] then e(7); colors := g2^; get(g2); if colors <> [pink] then e(8); colors := g2^; get(g2); if colors <> [green,pink] then e(9); colors := g2^; get(g2); if colors <> [green,orange] then e(10); #ifndef NOFLOAT r4.c1:='w'; r4.i:= -100; r4.x:=303.56; g3^:=r4; put(g3); r4.c1:='y'; r4.i:= -35; r4.x:=26.32; g3^:=r4; put(g3); r4.c1:='q'; r4.i:= +29; r4.x:=10.00; g3^:=r4; put(g3); r4.c1:='j'; r4.i:= 8; r4.x:=10000; g3^:=r4; put(g3); #else r4.c1:='w'; r4.i:= -100; g3^:=r4; put(g3); r4.c1:='y'; r4.i:= -35; g3^:=r4; put(g3); r4.c1:='q'; r4.i:= +29; g3^:=r4; put(g3); r4.c1:='j'; r4.i:= 8; g3^:=r4; put(g3); #endif for i:= 1 to 1000 do begin g3^ := r4; put(g3) end; reset(g3); if eof(g3) then e(11); #ifndef NOFLOAT r4 := g3^; get(g3); if (r4.c1<>'w') or (r4.i<>-100) or (r4.x<>303.56) then e(12); r4 := g3^; get(g3); if (r4.c1<>'y') or (r4.i<> -35) or (r4.x<> 26.32) then e(13); r4 := g3^; get(g3); if (r4.c1<>'q') or (r4.i<> 29) or (r4.x<> 10.00) then e(14); r4 := g3^; get(g3); if (r4.c1<>'j') or (r4.i<> 8) or (r4.x<> 10000) then e(15); #else r4 := g3^; get(g3); if (r4.c1<>'w') or (r4.i<>-100) then e(12); r4 := g3^; get(g3); if (r4.c1<>'y') or (r4.i<> -35) then e(13); r4 := g3^; get(g3); if (r4.c1<>'q') or (r4.i<> 29) then e(14); r4 := g3^; get(g3); if (r4.c1<>'j') or (r4.i<> 8) then e(15); #endif for j:= 1 to 100 do begin for i:= -10 to +10 do a1[i] := i*j; g4^ := a1; put(g4) end; reset(g4); for j:= 1 to 100 do begin a1:=g4^; get(g4); for i:= -10 to +10 do if a1[i]<>i*j then e(16) end; end; begin t:=37; pct := pct+1; tst3701; t:=37; if not eof(g2) then e(1); end; {***********************************************************************} procedure tst38; { Advanced set theory } begin t:=38; pct := pct + 1; if [50] >= [49,51] then e(1); if [10] <= [9,11] then e(2); if not ([50] <= [49..51]) then e(3); i:=1; j:=2; k:=3; l:=5; if [i] + [j] <> [i,j] then e(4); if [i] + [j] <> [i..j] then e(5); if [j..i] <> [] then e(6); if [j..l] + [j..k] <> [2,3,4,5] then e(7); if ([1..k, l..8] + [10]) * [k..7, 2, l] <> [2,3,l..7] then e(8); if [i..9] - [j..l] <> [1,l+1..k*k] then e(9); if [k..j] <> [i..j] * [k..l] then e(10); if not ([k..10] <= [i..15]) then e(11); if not ([k-1..k*l] <= [i..15]) then e(12); letters := ['a','b', 'z']; if letters <> ['a', 'b', 'z'] then e(13); cset := ['a'] + ['b', 'c', 'z'] - ['c','d']; if cset <> letters then e(14); cset := ['a'..'e']; if cset <> ['a', 'b', 'c', 'd', 'e'] then e(15); cset := ['a'..'z', '0'..'9', '+','-','*','/','.',':','(',')','{','}']; if not ('+' in cset) or not ('.' in cset) or not ('}' in cset) then e(16); letters := ['a'..'z' , '0'..'9']; if letters >= cset then e(17); end; {***********************************************************************} { Main program } begin ect:=0; pct:=0; tst34; tst35; tst36; tst37; tst38; write('Program t3:',pct:3,' tests completed.'); writeln('Number of errors = ',ect:1); end.