PRINTERU.MOD 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. IMPLEMENTATION MODULE PrinterUtils;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1986 - 1991 PMI
  6. * P.O. Box 8402
  7. * Green Bay Wi 53308
  8. * All Rights Reserved
  9. * by Ed Ross
  10. *)
  11. FROM SYSTEM IMPORT BYTE,ADR;
  12. FROM DateFunctions IMPORT Date,DateToStr;
  13. FROM StrConv IMPORT RealToStr,CardinalToStr,IntegerToStr,LongIntegerToStr;
  14. FROM StringIO IMPORT WriteEol;
  15. FROM M2Strings IMPORT Length,Assign;
  16. FROM StrEdit IMPORT Center,RightJustify,CrunchBlanks,Append,MakeCurrency;
  17. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  18. FROM NumTypes IMPORT Real8;
  19. FROM LowLevel IMPORT Fill;
  20. TYPE DisplayLine = POINTER TO DisplayRec;
  21. DisplayRec = RECORD
  22. Str : POINTER TO ARRAY[0..300] OF CHAR;
  23. NbrBytes : CARDINAL;
  24. END;
  25. PROCEDURE OverWrite(obj : ARRAY OF CHAR; VAR targ : ARRAY OF CHAR; Pos : CARDINAL);
  26. VAR
  27. J : CARDINAL;
  28. K : CARDINAL;
  29. BEGIN
  30. K := Length(obj) + Pos;
  31. IF K > Length(targ)
  32. THEN K := Length(targ)
  33. ELSE K := Length(obj)
  34. END;
  35. FOR J := 0 TO Length(obj) -1 DO
  36. targ[Pos + J] := obj[J];
  37. END;
  38. END OverWrite;
  39. PROCEDURE SetupDisplayLine(VAR PL : DisplayLine; NbrOfCols:CARDINAL);
  40. BEGIN
  41. ALLOCATE(PL,SIZE(PL^));
  42. PL^.NbrBytes := NbrOfCols + 2;
  43. ALLOCATE(PL^.Str,PL^.NbrBytes);
  44. ClearDisplayLine(PL);
  45. END SetupDisplayLine;
  46. PROCEDURE RemoveDisplayLine(VAR PL : DisplayLine);
  47. BEGIN
  48. DEALLOCATE(PL^.Str,PL^.NbrBytes);
  49. DEALLOCATE(PL,SIZE(PL^));
  50. PL := NIL;
  51. END RemoveDisplayLine;
  52. PROCEDURE AddPrintElemt(VAR PL: DisplayLine; elemt: ARRAY OF BYTE; PT : CHAR;
  53. ColNbr, NbrCols : CARDINAL; Justification : CHAR);
  54. TYPE
  55. DTypes = RECORD
  56. CASE : CHAR OF
  57. 'R' : R : Real8;
  58. |'I' : I : INTEGER;
  59. |'L' : L : LONGINT;
  60. |'C' : C : CARDINAL;
  61. |'D' : D : Date;
  62. |'S' : S : ARRAY[0..300] OF CHAR; (* string *)
  63. |'$' : Dollar : Real8; (* Prefix with $ dollar type *)
  64. |'%' : Percent :Real8; (* percent type suffix with '%'*)
  65. END;
  66. END;
  67. CharSet = SET OF CHAR;
  68. VAR
  69. P : POINTER TO DTypes;
  70. S : ARRAY [0..300] OF CHAR;
  71. ok : BOOLEAN;
  72. BEGIN
  73. P := ADR(elemt);
  74. P^.S[NbrCols] :=0C;
  75. CASE PT OF (* first go through the conversions *)
  76. 'R','%','$' : RealToStr(P^.R,2,NbrCols,S);
  77. |'I' : IntegerToStr(P^.I,NbrCols,S);
  78. |'C' : CardinalToStr(P^.C,NbrCols,S);
  79. |'L' : LongIntegerToStr(P^.L,NbrCols,S);
  80. |'D' : DateToStr(P^.D,S,ok);
  81. IF NOT ok
  82. THEN S:= '?????'
  83. END;
  84. END;
  85. IF PT IN CharSet{'R','I','C','L','D','%'}
  86. THEN
  87. Assign( S,P^.S);
  88. END;
  89. IF PT = '%'
  90. THEN Append(P^.S,'%');
  91. ELSIF PT = 'R'
  92. THEN
  93. MakeCurrency('$',P^.S);
  94. Assign( P^.S,S); (* kluge here *)
  95. RightJustify(S,NbrCols);
  96. Assign(S,P^.S );
  97. END;
  98. CASE Justification OF
  99. 'C' : Center(P^.S,NbrCols);
  100. |'R' : RightJustify(P^.S,10);
  101. END;
  102. OverWrite(P^.S,PL^.Str^,ColNbr);
  103. S := S; (* debug stop *)
  104. END AddPrintElemt;
  105. PROCEDURE PrintDisplayLine(PL : DisplayLine; Handle : CARDINAL);
  106. BEGIN
  107. WriteEol(Handle,PL^.Str^);
  108. END PrintDisplayLine;
  109. PROCEDURE GetDisplayLine(PL : DisplayLine; VAR Display : ARRAY OF CHAR);
  110. BEGIN
  111. Assign(PL^.Str^,Display );
  112. END GetDisplayLine;
  113. PROCEDURE ClearDisplayLine(VAR PL : DisplayLine);
  114. BEGIN
  115. Fill(ADR(PL^.Str^),PL^.NbrBytes-1,' ');
  116. PL^.Str^[PL^.NbrBytes-1] := CHR(0);
  117. END ClearDisplayLine;
  118. END PrinterUtils.