FORMIO.LST 12 KB

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