IMPLEMENTATION MODULE PrinterUtils; (* * ModBase * Release 3.0 * (c) Copyright 1986 - 1991 PMI * P.O. Box 8402 * Green Bay Wi 53308 * All Rights Reserved * by Ed Ross *) FROM SYSTEM IMPORT BYTE,ADR; FROM DateFunctions IMPORT Date,DateToStr; FROM StrConv IMPORT RealToStr,CardinalToStr,IntegerToStr,LongIntegerToStr; FROM StringIO IMPORT WriteEol; FROM M2Strings IMPORT Length,Assign; FROM StrEdit IMPORT Center,RightJustify,CrunchBlanks,Append,MakeCurrency; FROM Storage IMPORT ALLOCATE,DEALLOCATE; FROM NumTypes IMPORT Real8; FROM LowLevel IMPORT Fill; TYPE DisplayLine = POINTER TO DisplayRec; DisplayRec = RECORD Str : POINTER TO ARRAY[0..300] OF CHAR; NbrBytes : CARDINAL; END; PROCEDURE OverWrite(obj : ARRAY OF CHAR; VAR targ : ARRAY OF CHAR; Pos : CARDINAL); VAR J : CARDINAL; K : CARDINAL; BEGIN K := Length(obj) + Pos; IF K > Length(targ) THEN K := Length(targ) ELSE K := Length(obj) END; FOR J := 0 TO Length(obj) -1 DO targ[Pos + J] := obj[J]; END; END OverWrite; PROCEDURE SetupDisplayLine(VAR PL : DisplayLine; NbrOfCols:CARDINAL); BEGIN ALLOCATE(PL,SIZE(PL^)); PL^.NbrBytes := NbrOfCols + 2; ALLOCATE(PL^.Str,PL^.NbrBytes); ClearDisplayLine(PL); END SetupDisplayLine; PROCEDURE RemoveDisplayLine(VAR PL : DisplayLine); BEGIN DEALLOCATE(PL^.Str,PL^.NbrBytes); DEALLOCATE(PL,SIZE(PL^)); PL := NIL; END RemoveDisplayLine; PROCEDURE AddPrintElemt(VAR PL: DisplayLine; elemt: ARRAY OF BYTE; PT : CHAR; ColNbr, NbrCols : CARDINAL; Justification : CHAR); TYPE DTypes = RECORD CASE : CHAR OF 'R' : R : Real8; |'I' : I : INTEGER; |'L' : L : LONGINT; |'C' : C : CARDINAL; |'D' : D : Date; |'S' : S : ARRAY[0..300] OF CHAR; (* string *) |'$' : Dollar : Real8; (* Prefix with $ dollar type *) |'%' : Percent :Real8; (* percent type suffix with '%'*) END; END; CharSet = SET OF CHAR; VAR P : POINTER TO DTypes; S : ARRAY [0..300] OF CHAR; ok : BOOLEAN; BEGIN P := ADR(elemt); P^.S[NbrCols] :=0C; CASE PT OF (* first go through the conversions *) 'R','%','$' : RealToStr(P^.R,2,NbrCols,S); |'I' : IntegerToStr(P^.I,NbrCols,S); |'C' : CardinalToStr(P^.C,NbrCols,S); |'L' : LongIntegerToStr(P^.L,NbrCols,S); |'D' : DateToStr(P^.D,S,ok); IF NOT ok THEN S:= '?????' END; END; IF PT IN CharSet{'R','I','C','L','D','%'} THEN Assign( S,P^.S); END; IF PT = '%' THEN Append(P^.S,'%'); ELSIF PT = 'R' THEN MakeCurrency('$',P^.S); Assign( P^.S,S); (* kluge here *) RightJustify(S,NbrCols); Assign(S,P^.S ); END; CASE Justification OF 'C' : Center(P^.S,NbrCols); |'R' : RightJustify(P^.S,10); END; OverWrite(P^.S,PL^.Str^,ColNbr); S := S; (* debug stop *) END AddPrintElemt; PROCEDURE PrintDisplayLine(PL : DisplayLine; Handle : CARDINAL); BEGIN WriteEol(Handle,PL^.Str^); END PrintDisplayLine; PROCEDURE GetDisplayLine(PL : DisplayLine; VAR Display : ARRAY OF CHAR); BEGIN Assign(PL^.Str^,Display ); END GetDisplayLine; PROCEDURE ClearDisplayLine(VAR PL : DisplayLine); BEGIN Fill(ADR(PL^.Str^),PL^.NbrBytes-1,' '); PL^.Str^[PL^.NbrBytes-1] := CHR(0); END ClearDisplayLine; END PrinterUtils.