Code: Select all
MODULE MyZeros; (*Set record memory to zero*)
IMPORT
Meta,
S:=SYSTEM;
(*
*)
PROCEDURE Zero* (IN modName, recName: ARRAY OF CHAR; VAR r: ANYREC);
VAR size: INTEGER; mod, item: Meta.Item; byte: BYTE; a0:INTEGER;
BEGIN
Meta.Lookup(modName, mod);
mod.Lookup(recName, item);
IF item.Valid() THEN
size := item.Size();
a0 := S.ADR(r);
byte := 0;
S.PUT(a0, byte);
S.MOVE(a0, a0+1, size-1);
END
END Zero;
END MyZeros.
Code: Select all
MODULE TestMyZeros;
IMPORT
Out:=MyOut,
Z:=MyZeros;
TYPE
Record* = RECORD
bool: BOOLEAN;
shortchar: SHORTCHAR;
char: CHAR;
byte: BYTE;
shortint: SHORTINT;
int: INTEGER;
longint: LONGINT;
shortreal: SHORTREAL;
real: REAL;
set: SET
END;
Big* = RECORD
x: ARRAY ASH(2, 16) OF BYTE
END;
VAR
level: INTEGER;
zero: BOOLEAN;
(*
*)
PROCEDURE (VAR r: Record) Out (IN banner: ARRAY OF CHAR), NEW;
BEGIN
Out.Ln; Out.String(banner); Out.Ln;
Out.String("bool="); Out.Bool(r.bool); Out.Ln;
Out.String("shortchar="); Out.Char(r.shortchar); Out.Ln;
Out.String("char="); Out.Char(r.char); Out.Ln;
Out.String("byte="); Out.Int(r.byte); Out.Ln;
Out.String("shortint="); Out.Int(r.shortint); Out.Ln;
Out.String("int="); Out.Int(r.int); Out.Ln;
Out.String("longint="); Out.Int(r.longint); Out.Ln;
Out.String("shortreal="); Out.Real(r.shortreal); Out.Ln;
Out.String("real="); Out.Real(r.real); Out.Ln;
Out.String("set="); Out.Set(r.set); Out.Ln;
END Out;
PROCEDURE Do*;
VAR
rec: Record;
BEGIN
rec.Out("Before");
Z.Zero("TestMyZeros", "Record", rec);
rec.Out("After");
END Do;
PROCEDURE Recurse;
VAR
big: Big;
BEGIN
IF level > 0 THEN
IF zero THEN Z.Zero("TestMyZeros", "Big", big) END;
DEC(level);
Recurse
END
END Recurse;
PROCEDURE Time*;
BEGIN
level := 10;
zero := TRUE;
Recurse;
END Time;
END TestMyZeros.
@ TestMyZeros.Do
@ TestMyZeros.Time
@ "TboxTimer.Start; TestMyZeros.Time; TboxTimer.Stop"