blob: c22f25be0c6f815887202bf54165cb6a9ef14af1 [file] [log] [blame]
(* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. *)
(* This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with gm2; see the file COPYING. If not, write to the Free Software
Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
MODULE testsystem ;
FROM SYSTEM IMPORT BITSPERLOC, LOCSPERWORD,
LOC, BYTE, WORD, ADDRESS,
ADDADR, SUBADR, DIFADR, MAKEADR, ADR, ROTATE,
SHIFT, TSIZE ;
FROM libc IMPORT exit ;
FROM NumberIO IMPORT WriteCard ;
FROM StrIO IMPORT WriteString, WriteLn ;
FROM FIO IMPORT Close, StdOut ;
PROCEDURE FindFirstElement (start: CARDINAL; s: LargeSet) : CARDINAL ;
BEGIN
WHILE NOT (start IN s) DO
INC(start)
END ;
RETURN( start )
END FindFirstElement ;
PROCEDURE FindLastElement (start: CARDINAL; s: LargeSet) : CARDINAL ;
BEGIN
WHILE (start+1<1024) AND ((start+1) IN s) DO
INC(start)
END ;
RETURN( start )
END FindLastElement ;
PROCEDURE debug (s: LargeSet) ;
VAR
lo, hi: CARDINAL ;
BEGIN
IF s=LargeSet{}
THEN
WriteString('{}')
ELSE
WriteString('{') ;
lo := FindFirstElement(0, s) ;
hi := FindLastElement(lo, s) ;
WHILE hi<1024 DO
IF hi=lo
THEN
WriteCard(lo, 0)
ELSE
WriteCard(lo, 0) ; WriteString('..') ; WriteCard(hi, 0)
END ;
lo := FindFirstElement(hi+1, s) ;
hi := FindLastElement(lo, s) ;
IF hi<1024
THEN
WriteString(', ')
END
END ;
WriteString('}')
END ;
WriteLn
END debug ;
(*
* purpose of testsystem is to check that all ISO SYSTEM functions are
* implemented, compile and run.
*)
TYPE
LargeSet = SET OF [0..1023] ;
SmallSet = SET OF [0..3] ;
VAR
a1, a2: ADDRESS ;
b1, b2: BYTE ;
s1, s2: BITSET ;
s3, s4: LargeSet ;
c1, c2: CARDINAL ;
w : WORD ;
l : LOC ;
array : ARRAY [0..TSIZE(ADDRESS)-1] OF LOC ;
s5, s6: SmallSet ;
BEGIN
a1 := ADR(array) ;
a2 := ADDADR(a1, TSIZE(LOC)) ;
IF SUBADR(a2, TSIZE(LOC))#a1
THEN
Close(StdOut) ;
exit(1)
END ;
IF DIFADR(a2, a1) # INTEGER (TSIZE (LOC))
THEN
Close(StdOut) ;
exit(2)
END ;
a1 := MAKEADR (ADDRESS (0)) ;
IF a1#NIL
THEN
Close(StdOut) ;
exit(3)
END ;
(*
#if defined(__x86_64)
a1 := MAKEADR(BYTE(0ABH), BYTE(0CDH)) ;
a1 := MAKEADR(BYTE(0FEH), BYTE(0DCH), BYTE(0BAH), BYTE(098H),
BYTE(076H), BYTE(054H), BYTE(032H), BYTE(010H)) ;
a1 := MAKEADR(CARDINAL(123456789), CARDINAL(987654321)) ;
#endif
*)
s3 := LargeSet{0, 1, 31, 32, 33, 63, 64, 65, 127, 128, 129} ;
debug(s3) ;
s4 := SHIFT(s3, -1) ;
debug(s4) ;
IF s4#LargeSet{0, 30, 31, 32, 62, 63, 64, 126, 127, 128}
THEN
Close(StdOut) ;
exit(4)
END ;
s4 := SHIFT(s4, 1) ;
debug(s4) ;
IF s4#LargeSet{1, 31, 32, 33, 63, 64, 65, 127, 128, 129}
THEN
Close(StdOut) ;
exit(5)
END ;
s5 := SmallSet{0, 1} ;
s6 := ROTATE(s5, 1) ;
IF s6#SmallSet{1, 2}
THEN
Close(StdOut) ;
exit(6)
END ;
s5 := SmallSet{0, 1} ;
s6 := ROTATE(s5, -1) ;
IF s6#SmallSet{0, 3}
THEN
Close(StdOut) ;
exit(7)
END ;
s3 := LargeSet{0, 1, 31, 32, 33, 63, 64, 65, 127, 128, 129} ;
debug(s3) ;
s4 := ROTATE(s3, -1) ;
debug(s4) ;
IF s4#LargeSet{1023, 0, 30, 31, 32, 62, 63, 64, 126, 127, 128}
THEN
Close(StdOut) ;
exit(8)
END ;
s3 := LargeSet{1, 31, 32, 33, 63, 64, 65, 127, 128, 129, 255, 1023} ;
debug(s3) ;
s4 := ROTATE(s3, 1) ;
debug(s4) ;
IF s4#LargeSet{0, 2, 32, 33, 34, 64, 65, 66, 128, 129, 130, 256}
THEN
Close(StdOut) ;
exit(9)
END
END testsystem.
(*
* Local variables:
* compile-command: "gm2 -Wcpp -Wiso -c -g -I. testsystem.mod"
* End:
*)