FORMIO.MOD 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * FORMIO.MOD - Formatted input/output *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*# data(seg_name => null) *)
  13. (*%E *)
  14. (*# check(stack=>off,
  15. index=>off,
  16. range=>off,
  17. overflow=>off,
  18. nil_ptr=>off) *)
  19. (*# module(implementation=>off) *)
  20. IMPLEMENTATION MODULE FormIO;
  21. (*# call(o_a_copy=>off) *)
  22. IMPORT SYSTEM,Str,IO;
  23. CONST
  24. MaxStrSize = 511;
  25. TYPE
  26. MaxStr = ARRAY [0..MaxStrSize] OF CHAR;
  27. (*
  28. FormatString = { Alpha | FieldSpecifier | SwitchChar }
  29. Alpha = any ascii char except '%' and '\'
  30. FieldSpecifier = '%' '%'
  31. | '% ['-'] [WidthSpecifier] TypeSpecifier
  32. WidthSpecifier = DecimalNumber [ '.' DecimalNumber ]
  33. TypeSpecifier = 'u' (* Unsigned *)
  34. | 'i' (* Signed *)
  35. | 'r' (* Real *)
  36. | 'c' (* Character *)
  37. | 's' (* String *)
  38. | 'h' (* Hex (unsigned) *)
  39. | 'b' (* Boolean *)
  40. | 'p' (* Pointer / Address *)
  41. SwitchChar = '\' SwitchOptions
  42. SwitchOptions = '\' (* \ *)
  43. | '%' (* % *)
  44. | 'b' (* BS = CHR(8) *)
  45. | 'f' (* FF = CHR(12) *)
  46. | 'n' (* NL = CHR(13),CHR(10) *)
  47. | 't' (* Tab = CHR(9) *)
  48. | 'e' (* Esc = CHR(27) *)
  49. | CharCode
  50. CharCode = DecimalNumber
  51. DecimalNumber = Digit [ Digit [ Digit ] ]
  52. *)
  53. TYPE ParamRec = RECORD
  54. size : CARDINAL;
  55. adr : ADDRESS;
  56. END;
  57. PROCEDURE Format ( VAR Res : ARRAY OF CHAR;
  58. Pat : ARRAY OF CHAR;
  59. Params : ARRAY OF ParamRec );
  60. VAR
  61. buff : MaxStr;
  62. hb : ARRAY [0..4] OF CHAR;
  63. rjust : BOOLEAN;
  64. fwidth : CARDINAL;
  65. fnum : CARDINAL;
  66. fsize : CARDINAL;
  67. places : CARDINAL;
  68. lc : LONGCARD;
  69. lr : LONGREAL;
  70. li : LONGINT;
  71. i,j,h,l,p : CARDINAL;
  72. storechar : BOOLEAN;
  73. c : CHAR;
  74. Ok : BOOLEAN;
  75. base : CARDINAL;
  76. f : POINTER TO
  77. RECORD CASE : SHORTCARD OF
  78. 0 : si : SHORTINT |
  79. 1 : i : INTEGER |
  80. 2 : li : LONGINT |
  81. 3 : sc : SHORTCARD |
  82. 4 : c : CARDINAL |
  83. 5 : lc : LONGCARD |
  84. 6 : r : REAL |
  85. 7 : lr : LONGREAL |
  86. 8 : ch : CHAR |
  87. 9 : a : ADDRESS |
  88. 10 : b : BOOLEAN |
  89. 11 : str : MaxStr;
  90. END;
  91. END;
  92. PROCEDURE GetNum():CARDINAL; (* leaves i and c changed *)
  93. VAR
  94. n,nc : CARDINAL;
  95. BEGIN
  96. n := 0;
  97. FOR nc := 0 TO 2 DO
  98. IF (i >= l) OR (c < '0') OR (c > '9') THEN
  99. RETURN n;
  100. END; (*IF*)
  101. n := n * 10 + ORD(c) - ORD('0');
  102. c := Pat[i];
  103. INC(i);
  104. END; (*FOR*)
  105. RETURN n;
  106. END GetNum;
  107. BEGIN
  108. fnum := 0;
  109. h := HIGH(Res);
  110. l := Str.Length(Pat);
  111. Res[0] := 0C;
  112. i := 0; j := 0;
  113. LOOP
  114. IF i=l THEN EXIT END;
  115. storechar := TRUE;
  116. c := Pat[i]; INC(i);
  117. IF c = '\' THEN
  118. c := Pat[i]; INC(i);
  119. CASE CAP(c) OF
  120. 'B':c:=CHR(8);
  121. | 'F':c:=CHR(12);
  122. | 'E':c:=CHR(27);
  123. | 'N':Res[j] := CHR(13); INC(j); c := CHR(10);
  124. | 'T':c:=CHR(9);
  125. | '0'..'9':DEC(i); c:= CHR(GetNum());
  126. END;
  127. ELSIF (c='%')AND(i<>l) THEN
  128. c := Pat[i]; INC(i);
  129. (* pattern found *)
  130. rjust:=TRUE; places:=5;
  131. storechar := FALSE;
  132. IF c='-' THEN rjust := FALSE; c := Pat[i]; INC(i);
  133. END;
  134. fwidth := GetNum();
  135. IF c='.' THEN
  136. c := Pat[i]; INC(i);
  137. places := GetNum();
  138. END;
  139. IF fnum<=HIGH(Params) THEN
  140. WITH Params[fnum] DO
  141. fsize := size;
  142. f := adr;
  143. END;
  144. INC(fnum);
  145. c := CAP(c);
  146. Ok := TRUE;
  147. buff[0] := 0C;
  148. CASE c OF
  149. 'I': IF fsize=1 THEN li := LONGINT(f^.si)
  150. ELSIF fsize=2 THEN li := LONGINT(f^.i)
  151. ELSIF fsize=4 THEN li := LONGINT(f^.li);
  152. ELSE Ok := FALSE;
  153. END;
  154. IF Ok THEN
  155. Str.IntToStr(li,buff,10,Ok);
  156. END;
  157. | 'U',
  158. 'H': IF fsize=1 THEN lc := LONGCARD(f^.sc)
  159. ELSIF fsize=2 THEN lc := LONGCARD(f^.c)
  160. ELSIF fsize=4 THEN lc := LONGCARD(f^.lc);
  161. ELSE Ok := FALSE ;
  162. END;
  163. IF Ok THEN
  164. base := 10; IF c='H' THEN base := 16 END;
  165. Str.CardToStr(lc,buff,base,Ok);
  166. END;
  167. | 'P': IF fsize <> 4 THEN Ok := FALSE END;
  168. IF Ok THEN
  169. Str.CardToStr(LONGCARD(SYSTEM.Seg(f^.a^)),buff,16,Ok);
  170. Str.Append(buff,':');
  171. Str.CardToStr(LONGCARD(SYSTEM.Ofs(f^.a^)),hb,16,Ok);
  172. Str.Append(buff,hb);
  173. END;
  174. | 'R': IF fsize=4 THEN lr := LONGREAL(f^.r)
  175. ELSIF fsize=8 THEN lr := LONGREAL(f^.lr);
  176. ELSE Ok := FALSE;
  177. END;
  178. IF Ok THEN
  179. Str.RealToStr(lr,places,FALSE,buff,Ok);
  180. END;
  181. | 'S': Str.Copy(buff,f^.str);
  182. IF fsize < SIZE(buff) THEN buff[fsize] := CHR(0) END;
  183. | 'C': buff[0] := f^.ch; buff[1] := CHR(0);
  184. | 'B': IF fsize=1 THEN
  185. IF f^.b THEN buff := 'TRUE' ELSE buff := 'FALSE' END;
  186. END;
  187. ELSE storechar := TRUE;
  188. END;
  189. Res[j] := CHR(0);
  190. IF NOT Ok THEN buff := '????' END;
  191. p := Str.Length(buff);
  192. IF rjust THEN
  193. WHILE (p<fwidth) DO
  194. Res[j] := ' '; INC(j); INC(p);
  195. END;
  196. Res[j] := CHR(0);
  197. Str.Append(Res,buff);
  198. j := Str.Length(Res);
  199. ELSE
  200. Res[j] := CHR(0);
  201. Str.Append(Res,buff);
  202. j := Str.Length(Res);
  203. WHILE (p<fwidth) DO
  204. Res[j] := ' '; INC(j); INC(p);
  205. END;
  206. END;
  207. END;
  208. END;
  209. IF storechar THEN
  210. Res[j] := c; INC(j);
  211. END;
  212. IF (j>h) THEN EXIT END;
  213. END;
  214. IF (j<=h) THEN Res[j] := CHR(0) END;
  215. END Format;
  216. PROCEDURE WrF1 ( Pat : ARRAY OF CHAR;
  217. P1 : ARRAY OF BYTE );
  218. VAR
  219. params : ARRAY [0..0] OF ParamRec;
  220. res : MaxStr;
  221. BEGIN
  222. params[0].size := SIZE(P1);
  223. params[0].adr := ADR(P1);
  224. Format(res,Pat,params);
  225. IO.WrStr(res);
  226. END WrF1;
  227. PROCEDURE WrF2 ( Pat : ARRAY OF CHAR;
  228. P1,P2 : ARRAY OF BYTE );
  229. VAR
  230. params : ARRAY [0..1] OF ParamRec;
  231. res : MaxStr;
  232. BEGIN
  233. params[0].size := SIZE(P1);
  234. params[0].adr := ADR(P1);
  235. params[1].size := SIZE(P2);
  236. params[1].adr := ADR(P2);
  237. Format(res,Pat,params);
  238. IO.WrStr(res);
  239. END WrF2;
  240. PROCEDURE WrF3 ( Pat : ARRAY OF CHAR;
  241. P1,P2,P3 : ARRAY OF BYTE );
  242. VAR
  243. params : ARRAY [0..2] OF ParamRec;
  244. res : MaxStr;
  245. BEGIN
  246. params[0].size := SIZE(P1);
  247. params[0].adr := ADR(P1);
  248. params[1].size := SIZE(P2);
  249. params[1].adr := ADR(P2);
  250. params[2].size := SIZE(P3);
  251. params[2].adr := ADR(P3);
  252. Format(res,Pat,params);
  253. IO.WrStr(res);
  254. END WrF3;
  255. PROCEDURE WrF4 ( Pat : ARRAY OF CHAR;
  256. P1,P2,P3,P4 : ARRAY OF BYTE );
  257. VAR
  258. params : ARRAY [0..3] OF ParamRec;
  259. res : MaxStr;
  260. BEGIN
  261. params[0].size := SIZE(P1);
  262. params[0].adr := ADR(P1);
  263. params[1].size := SIZE(P2);
  264. params[1].adr := ADR(P2);
  265. params[2].size := SIZE(P3);
  266. params[2].adr := ADR(P3);
  267. params[3].size := SIZE(P4);
  268. params[3].adr := ADR(P4);
  269. Format(res,Pat,params);
  270. IO.WrStr(res);
  271. END WrF4;
  272. PROCEDURE WrF5 ( Pat : ARRAY OF CHAR;
  273. P1,P2,P3,P4,P5 : ARRAY OF BYTE );
  274. VAR
  275. params : ARRAY [0..4] OF ParamRec;
  276. res : MaxStr;
  277. BEGIN
  278. params[0].size := SIZE(P1);
  279. params[0].adr := ADR(P1);
  280. params[1].size := SIZE(P2);
  281. params[1].adr := ADR(P2);
  282. params[2].size := SIZE(P3);
  283. params[2].adr := ADR(P3);
  284. params[3].size := SIZE(P4);
  285. params[3].adr := ADR(P4);
  286. params[4].size := SIZE(P5);
  287. params[4].adr := ADR(P5);
  288. Format(res,Pat,params);
  289. IO.WrStr(res);
  290. END WrF5;
  291. PROCEDURE WrF ( Pat : ARRAY OF CHAR );
  292. VAR
  293. c : CARDINAL;
  294. BEGIN
  295. c := 0;
  296. WrF1(Pat,c);
  297. END WrF;
  298. END FormIO.
  299.