DEADSOFTWARE

Port, TODO
[bbcp.git] / new / Text / Mod / Mappers.txt
1 MODULE TextMappers;
3 (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Mappers.odc *)
4 (* DO NOT EDIT *)
6 IMPORT Strings, Views, Dialog, TextModels;
8 CONST
9 (** Scanner.opts **)
10 returnCtrlChars* = 1;
11 returnQualIdents* = 2; returnViews* = 3;
12 interpretBools* = 4; interpretSets* = 5;
13 maskViews* = 6;
15 (** Scanner.type **)
16 char* = 1; string* = 3; int* = 4; real* = 5;
17 bool* = 6; (** iff interpretBools IN opts **)
18 set* = 7; (** iff interpretSets IN opts **)
19 view* = 8; (** iff returnViews IN opts **)
20 tab* = 9; line* = 10; para* = 11; (** iff returnCtrlChars IN opts **)
21 lint* = 16;
22 eot* = 30;
23 invalid* = 31; (** last Scan hit lexically invalid sequence **)
25 (** Formatter.WriteIntForm base **)
26 charCode* = Strings.charCode; decimal* = Strings.decimal; hexadecimal* = Strings.hexadecimal;
28 (** Formatter.WriteIntForm showBase **)
29 hideBase* = Strings.hideBase; showBase* = Strings.showBase;
31 VIEW = TextModels.viewcode;
32 TAB = TextModels.tab; LINE = TextModels.line; PARA = TextModels.para;
34 acceptUnderscores = TRUE;
36 TYPE
37 String* = ARRAY 256 OF CHAR;
39 Scanner* = RECORD
40 opts-: SET;
41 rider-: TextModels.Reader; (** prefetch state for single character look-ahead **)
43 type*: INTEGER;
44 start*, lines*, paras*: INTEGER; (** update by Skip **)
46 char*: CHAR; (** valid iff type = char **)
47 int*: INTEGER; (** valid iff type = int **)
48 base*: INTEGER; (** valid iff type IN {int, lint} **)
49 lint*: LONGINT; (** valid iff type IN {int, lint} **)
50 real*: REAL; (** valid iff type = real **)
51 bool*: BOOLEAN; (** valid iff type = bool **)
52 set*: SET; (** valid iff type = set **)
53 len*: INTEGER; (** valid iff type IN {string, int, lint} **)
54 string*: String; (** valid iff type IN {string, int, lint, bool, char} **)
55 view*: Views.View; w*, h*: INTEGER (** valid iff type = view **)
56 END;
58 Formatter* = RECORD
59 rider-: TextModels.Writer
60 END;
63 (** Scanner **)
65 PROCEDURE ^ (VAR s: Scanner) SetPos* (pos: INTEGER), NEW;
66 PROCEDURE ^ (VAR s: Scanner) SetOpts* (opts: SET), NEW;
67 PROCEDURE ^ (VAR s: Scanner) Skip* (OUT ch: CHAR), NEW;
68 PROCEDURE ^ (VAR s: Scanner) Scan*, NEW;
71 PROCEDURE Get (VAR s: Scanner; OUT ch: CHAR);
72 BEGIN
73 s.rider.ReadChar(ch)
74 END Get;
76 PROCEDURE Real (VAR s: Scanner);
77 VAR res: INTEGER; ch: CHAR;
78 BEGIN
79 s.type := real;
80 s.string[s.len] := "."; INC(s.len); Get(s, ch);
81 WHILE ("0" <= ch) & (ch <= "9") & (s.len < LEN(s.string) - 1) DO
82 s.string[s.len] := ch; INC(s.len); Get(s, ch)
83 END;
84 IF (ch = "E") OR (ch = "D") THEN
85 s.string[s.len] := ch; INC(s.len); Get(s, ch);
86 IF (ch = "-") OR (ch = "+") THEN s.string[s.len] := ch; INC(s.len); Get(s,ch) END;
87 WHILE ("0" <= ch) & (ch <= "9") & (s.len < LEN(s.string) - 1) DO
88 s.string[s.len] := ch; INC(s.len); Get(s, ch)
89 END
90 END;
91 s.string[s.len] := 0X;
92 Strings.StringToReal(s.string, s.real, res);
93 IF res # 0 THEN s.type := invalid END
94 END Real;
96 PROCEDURE Integer (VAR s: Scanner);
97 VAR n, k, res: INTEGER; ch: CHAR; hex: BOOLEAN;
98 BEGIN
99 s.type := int; hex := FALSE; ch := s.rider.char;
100 IF ch = "%" THEN
101 s.string[s.len] := "%"; INC(s.len); Get(s, ch); n:= 0;
102 IF ("0" <= ch) & (ch <= "9") THEN
103 k := ORD(ch) - ORD("0");
104 REPEAT
105 n := 10*n + k; s.string[s.len] := ch; INC(s.len);
106 Get(s, ch); k := ORD(ch) - ORD("0")
107 UNTIL (ch < "0") OR (ch > "9") OR (n > (MAX(INTEGER) - k) DIV 10) OR (s.len = LEN(s.string));
108 IF ("0" <= ch) & (ch <= "9") THEN s.type := invalid ELSE s.base := n END
109 ELSE s.type := invalid
110 END
111 ELSIF (ch = "H") OR (ch = "X") THEN
112 hex := TRUE; s.base := 16;
113 s.string[s.len] := ch; INC(s.len); Get(s, ch)
114 ELSE
115 s.base := 10
116 END;
117 s.string[s.len] := 0X;
118 IF s.type # invalid THEN
119 Strings.StringToInt(s.string, s.int, res);
120 IF res = 0 THEN s.type := int;
121 IF hex THEN (* Strings.StringToLInt(s.string, s.lint, res); ASSERT(res = 0, 100); *)
122 IF s.int < 0 THEN s.lint := s.int + (LONG(MAX(INTEGER)) + 1) * 2
123 ELSE s.lint := s.int
124 END
125 ELSE s.lint := s.int
126 END
127 ELSIF res = 1 THEN (* INTEGER overflow *)
128 Strings.StringToLInt(s.string, s.lint, res);
129 IF res = 0 THEN s.type := lint ELSE s.type := invalid END
130 ELSE (* syntax error *)
131 s.type := invalid
132 END
133 END
134 END Integer;
136 PROCEDURE Number (VAR s: Scanner; neg: BOOLEAN);
137 VAR m: INTEGER; ch: CHAR;
138 BEGIN
139 s.len := 0; m := 0; ch := s.rider.char;
140 IF neg THEN s.string[s.len] := "-"; INC(s.len) END;
141 REPEAT
142 IF (m > 0) OR (ch # "0") THEN (* ignore leading zeroes *)
143 s.string[s.len] := ch; INC(s.len); INC(m)
144 END;
145 Get(s, ch)
146 UNTIL (ch < "0") OR (ch > "9") & (ch < "A") OR (ch > "F")
147 OR (s.len = LEN(s.string) - 1) OR s.rider.eot;
148 IF (s.len = 0) OR (s.len = 1) & (s.string[0] = "-") THEN (* compensate for ignoring leading zeroes *)
149 s.string[s.len] := "0"; INC(s.len)
150 END;
151 s.string[s.len] := 0X;
152 IF ch = "." THEN Real(s) ELSE Integer(s) END
153 END Number;
155 PROCEDURE Cardinal (VAR s: Scanner; OUT n: INTEGER);
156 VAR k: INTEGER; ch: CHAR;
157 BEGIN
158 n := 0; s.Skip(ch);
159 IF ("0" <= ch) & (ch <= "9") THEN
160 k := ORD(ch) - ORD("0");
161 REPEAT
162 n := n * 10 + k;
163 Get(s, ch); k := ORD(ch) - ORD("0")
164 UNTIL (ch < "0") OR (ch > "9") OR (n > (MAX(INTEGER) - k) DIV 10);
165 IF ("0" <= ch) & (ch <= "9") THEN s.type := invalid END
166 ELSE s.type := invalid
167 END
168 END Cardinal;
170 PROCEDURE Set (VAR s: Scanner);
171 VAR n, m: INTEGER; ch: CHAR;
172 BEGIN
173 s.type := set; Get(s, ch); s.Skip(ch); s.set := {};
174 WHILE ("0" <= ch) & (ch <= "9") & (s.type = set) DO
175 Cardinal(s, n); s.Skip(ch);
176 IF (MIN(SET) <= n) & (n <= MAX(SET)) THEN
177 INCL(s.set, n);
178 IF ch = "," THEN
179 Get(s, ch); s.Skip(ch)
180 ELSIF ch = "." THEN
181 Get(s, ch);
182 IF ch = "." THEN
183 Get(s, ch); s.Skip(ch); Cardinal(s, m); s.Skip(ch);
184 IF ch = "," THEN Get(s, ch); s.Skip(ch) END;
185 IF (n <= m) & (m <= MAX(SET)) THEN
186 WHILE m > n DO INCL(s.set, m); DEC(m) END
187 ELSE s.type := invalid
188 END
189 ELSE s.type := invalid
190 END
191 END
192 ELSE s.type := invalid
193 END
194 END;
195 IF s.type = set THEN
196 s.Skip(ch);
197 IF ch = "}" THEN Get(s, ch) ELSE s.type := invalid END
198 END
199 END Set;
201 PROCEDURE Boolean (VAR s: Scanner);
202 VAR ch: CHAR;
203 BEGIN
204 s.type := bool; Get(s, ch);
205 IF (ch = "T") OR (ch = "F") THEN
206 s.Scan;
207 IF (s.type = string) & (s.string = "TRUE") THEN s.type := bool; s.bool := TRUE
208 ELSIF (s.type = string) & (s.string = "FALSE") THEN s.type := bool; s.bool := FALSE
209 ELSE s.type := invalid
210 END
211 ELSE s.type := invalid
212 END
213 END Boolean;
215 PROCEDURE Name (VAR s: Scanner);
216 VAR max: INTEGER; ch: CHAR;
217 BEGIN
218 s.type := string; s.len := 0; ch := s.rider.char; max := LEN(s.string);
219 REPEAT
220 s.string[s.len] := ch; INC(s.len); Get(s, ch)
221 UNTIL
222 ~( ("0" <= ch) & (ch <= "9")
223 OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
224 OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D7X) & (ch # 0F7X)
225 OR acceptUnderscores & (ch = "_"))
226 OR (s.len = max);
227 IF (returnQualIdents IN s.opts) & (ch = ".") & (s.len < max) THEN
228 REPEAT
229 s.string[s.len] := ch; INC(s.len); Get(s, ch)
230 UNTIL
231 ~( ("0" <= ch) & (ch <= "9")
232 OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
233 OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D7X) & (ch # 0F7X)
234 OR acceptUnderscores & (ch = "_") )
235 OR (s.len = max)
236 END;
237 IF s.len = max THEN DEC(s.len); s.type := invalid END; (* ident too long *)
238 s.string[s.len] := 0X
239 END Name;
241 PROCEDURE DoubleQuotedString (VAR s: Scanner);
242 VAR max, pos: INTEGER; ch: CHAR;
243 BEGIN
244 pos := s.rider.Pos();
245 s.type := string; s.len := 0; max := LEN(s.string) - 1; Get(s, ch);
246 WHILE (ch # '"') & (ch # 0X) & (s.len < max) DO
247 s.string[s.len] := ch; INC(s.len);
248 Get(s, ch)
249 END;
250 s.string[s.len] := 0X;
251 IF ch = '"' THEN Get(s, ch)
252 ELSE s.type := invalid; s.rider.SetPos(pos (* s.rider.Pos() - s.len - 1 *)); Get(s, ch)
253 END
254 END DoubleQuotedString;
256 PROCEDURE SingleQuotedString (VAR s: Scanner);
257 VAR max, pos: INTEGER; ch: CHAR;
258 BEGIN
259 pos := s.rider.Pos();
260 s.type := string; s.len := 0; max := LEN(s.string) - 1; Get(s, ch);
261 WHILE (ch # "'") & (ch # 0X) & (s.len < max) DO
262 s.string[s.len] := ch; INC(s.len);
263 Get(s, ch)
264 END;
265 s.string[s.len] := 0X;
266 IF s.len = 1 THEN s.type := char; s.char := s.string[0] END;
267 IF ch = "'" THEN Get(s, ch)
268 ELSE s.type := invalid; s.rider.SetPos(pos (* s.rider.Pos() - s.len - 1 *)); Get(s, ch)
269 END
270 END SingleQuotedString;
272 PROCEDURE Char (VAR s: Scanner);
273 VAR ch: CHAR;
274 BEGIN
275 ch := s.rider.char;
276 IF ch # 0X THEN
277 s.type := char; s.char := ch; s.string[0] := ch; s.string[1] := 0X; Get(s, ch)
278 ELSE s.type := invalid
279 END
280 END Char;
282 PROCEDURE View (VAR s: Scanner);
283 VAR ch: CHAR;
284 BEGIN
285 s.type := view; s.view := s.rider.view; s.w := s.rider.w; s.h := s.rider.h;
286 IF maskViews IN s.opts THEN
287 IF s.rider.char # TextModels.viewcode THEN
288 s.type := char; s.char := s.rider.char; s.string[0] := s.char; s.string[1] := 0X
289 END
290 END;
291 Get(s, ch)
292 END View;
295 PROCEDURE (VAR s: Scanner) ConnectTo* (text: TextModels.Model), NEW;
296 BEGIN
297 IF text # NIL THEN
298 s.rider := text.NewReader(s.rider); s.SetPos(0); s.SetOpts({})
299 ELSE
300 s.rider := NIL
301 END
302 END ConnectTo;
304 PROCEDURE (VAR s: Scanner) SetPos* (pos: INTEGER), NEW;
305 BEGIN
306 s.rider.SetPos(pos); s.start := pos;
307 s.lines := 0; s.paras := 0; s.type := invalid
308 END SetPos;
310 PROCEDURE (VAR s: Scanner) SetOpts* (opts: SET), NEW;
311 BEGIN
312 s.opts := opts
313 END SetOpts;
315 PROCEDURE (VAR s: Scanner) Pos* (): INTEGER, NEW;
316 BEGIN
317 RETURN s.rider.Pos()
318 END Pos;
320 PROCEDURE (VAR s: Scanner) Skip* (OUT ch: CHAR), NEW;
321 VAR c, v: BOOLEAN;
322 BEGIN
323 IF s.opts * {returnCtrlChars, returnViews} = {} THEN
324 ch := s.rider.char;
325 WHILE ((ch <= " ") OR (ch = TextModels.digitspace) OR (ch = TextModels.nbspace))
326 & ~s.rider.eot DO
327 IF ch = LINE THEN INC(s.lines)
328 ELSIF ch = PARA THEN INC(s.paras)
329 END;
330 Get(s, ch)
331 END
332 ELSE
333 c := returnCtrlChars IN s.opts;
334 v := returnViews IN s.opts;
335 ch := s.rider.char;
336 WHILE ((ch <= " ") OR (ch = TextModels.digitspace) OR (ch = TextModels.nbspace))
337 & ~s.rider.eot
338 & (~c OR (ch # TAB) & (ch # LINE) & (ch # PARA))
339 & (~v OR (ch # VIEW) OR (s.rider.view = NIL)) DO
340 IF ch = LINE THEN INC(s.lines)
341 ELSIF ch = PARA THEN INC(s.paras)
342 END;
343 Get(s, ch)
344 END
345 END;
346 IF ~s.rider.eot THEN s.start := s.rider.Pos() - 1
347 ELSE s.start := s.rider.Base().Length(); s.type := eot
348 END
349 END Skip;
351 PROCEDURE (VAR s: Scanner) Scan*, NEW;
352 VAR sign, neg: BOOLEAN; ch: CHAR;
353 BEGIN
354 s.Skip(ch);
355 IF s.type # eot THEN
356 neg := (ch = "-"); sign := neg OR (ch = "+");
357 IF sign THEN s.char := ch; Get(s, ch) END;
358 IF ("0" <= ch) & (ch <= "9") THEN Number(s, neg)
359 ELSIF sign THEN s.type := char; (* return prefetched sign w/o trailing number *)
360 s.string[0] := s.char; s.string[1] := 0X
361 ELSE
362 CASE ch OF
363 | "A" .. "Z", "a" .. "z", 0C0X .. 0D6X, 0D8X .. 0F6X, 0F8X .. 0FFX: Name(s)
364 | '"': DoubleQuotedString(s)
365 | "'": SingleQuotedString(s)
366 | TAB: s.type := tab; Get(s, ch)
367 | LINE: s.type := line; Get(s, ch)
368 | PARA: s.type := para; Get(s, ch)
369 | VIEW:
370 IF s.rider.view # NIL THEN View(s) ELSE Char(s) END
371 | "{":
372 IF interpretSets IN s.opts THEN Set(s) ELSE Char(s) END
373 | "$":
374 IF interpretBools IN s.opts THEN Boolean(s) ELSE Char(s) END
375 | "_":
376 IF acceptUnderscores THEN Name(s) ELSE Char(s) END
377 ELSE Char(s)
378 END
379 END
380 END
381 END Scan;
384 (** scanning utilities **)
386 PROCEDURE IsQualIdent* (IN s: ARRAY OF CHAR): BOOLEAN;
387 VAR i: INTEGER; ch: CHAR;
388 BEGIN
389 ch := s[0]; i := 1;
390 IF ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
391 OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X) THEN
392 REPEAT
393 ch := s[i]; INC(i)
394 UNTIL
395 ~( ("0" <= ch) & (ch <= "9")
396 OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
397 OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X)
398 OR (ch = "_") );
399 IF ch = "." THEN
400 INC(i);
401 REPEAT
402 ch := s[i]; INC(i)
403 UNTIL
404 ~( ("0" <= ch) & (ch <= "9")
405 OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
406 OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X)
407 OR (ch = "_") );
408 RETURN ch = 0X
409 ELSE
410 RETURN FALSE
411 END
412 ELSE
413 RETURN FALSE
414 END
415 END IsQualIdent;
417 PROCEDURE ScanQualIdent* (VAR s: Scanner; OUT x: ARRAY OF CHAR; OUT done: BOOLEAN);
418 VAR mod: String; i, j, len, start: INTEGER; ch: CHAR;
419 BEGIN
420 done := FALSE;
421 IF s.type = string THEN
422 IF IsQualIdent(s.string) THEN
423 IF s.len < LEN(x) THEN
424 x := s.string$; done := TRUE
425 END
426 ELSE
427 mod := s.string; len := s.len; start := s.start;
428 s.Scan;
429 IF (s.type = char) & (s.char = ".") THEN
430 s.Scan;
431 IF (s.type = string) & (len + 1 + s.len < LEN(x)) THEN
432 i := 0; ch := mod[0]; WHILE ch # 0X DO x[i] := ch; INC(i); ch := mod[i] END;
433 x[i] := "."; INC(i);
434 j := 0; ch := s.string[0];
435 WHILE ch # 0X DO x[i] := ch; INC(i); INC(j); ch := s.string[j] END;
436 x[i] := 0X; done := TRUE
437 END
438 END;
439 IF ~done THEN s.SetPos(start); s.Scan() END
440 END
441 END
442 END ScanQualIdent;
445 (** Formatter **)
447 PROCEDURE ^ (VAR f: Formatter) SetPos* (pos: INTEGER), NEW;
448 PROCEDURE ^ (VAR f: Formatter) WriteIntForm* (x: LONGINT;
449 base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN), NEW;
450 PROCEDURE ^ (VAR f: Formatter) WriteRealForm* (x: REAL;
451 precision, minW, expW: INTEGER; fillCh: CHAR), NEW;
452 PROCEDURE ^ (VAR f: Formatter) WriteViewForm* (v: Views.View; w, h: INTEGER), NEW;
455 PROCEDURE (VAR f: Formatter) ConnectTo* (text: TextModels.Model), NEW;
456 BEGIN
457 IF text # NIL THEN
458 f.rider := text.NewWriter(f.rider); f.SetPos(text.Length())
459 ELSE
460 f.rider := NIL
461 END
462 END ConnectTo;
464 PROCEDURE (VAR f: Formatter) SetPos* (pos: INTEGER), NEW;
465 BEGIN
466 f.rider.SetPos(pos)
467 END SetPos;
469 PROCEDURE (VAR f: Formatter) Pos* (): INTEGER, NEW;
470 BEGIN
471 RETURN f.rider.Pos()
472 END Pos;
475 PROCEDURE (VAR f: Formatter) WriteChar* (x: CHAR), NEW;
476 BEGIN
477 IF (x >= " ") & (x # 7FX) THEN
478 f.rider.WriteChar(x)
479 ELSE
480 f.rider.WriteChar(" ");
481 f.WriteIntForm(ORD(x), charCode, 3, "0", showBase);
482 f.rider.WriteChar(" ")
483 END
484 END WriteChar;
486 PROCEDURE (VAR f: Formatter) WriteInt* (x: LONGINT), NEW;
487 BEGIN
488 f.WriteIntForm(x, decimal, 0, TextModels.digitspace, hideBase)
489 END WriteInt;
491 PROCEDURE (VAR f: Formatter) WriteSString* (x: ARRAY OF SHORTCHAR), NEW;
492 VAR i: INTEGER;
493 BEGIN
494 i := 0; WHILE x[i] # 0X DO f.WriteChar(x[i]); INC(i) END
495 END WriteSString;
497 PROCEDURE (VAR f: Formatter) WriteString* (x: ARRAY OF CHAR), NEW;
498 VAR i: INTEGER;
499 BEGIN
500 i := 0; WHILE x[i] # 0X DO f.WriteChar(x[i]); INC(i) END
501 END WriteString;
503 PROCEDURE (VAR f: Formatter) WriteReal* (x: REAL), NEW;
504 VAR m: ARRAY 256 OF CHAR;
505 BEGIN
506 Strings.RealToString(x, m); f.WriteString(m)
507 END WriteReal;
509 PROCEDURE (VAR f: Formatter) WriteBool* (x: BOOLEAN), NEW;
510 BEGIN
511 IF x THEN f.WriteString("$TRUE") ELSE f.WriteString("$FALSE") END
512 END WriteBool;
514 PROCEDURE (VAR f: Formatter) WriteSet* (x: SET), NEW;
515 VAR i: INTEGER;
516 BEGIN
517 f.WriteChar("{"); i := MIN(SET);
518 WHILE x # {} DO
519 IF i IN x THEN f.WriteInt(i); EXCL(x, i);
520 IF (i + 2 <= MAX(SET)) & (i+1 IN x) & (i+2 IN x) THEN f.WriteString("..");
521 x := x - {i+1, i+2}; INC(i, 3);
522 WHILE (i <= MAX(SET)) & (i IN x) DO EXCL(x, i); INC(i) END;
523 f.WriteInt(i-1)
524 END;
525 IF x # {} THEN f.WriteString(", ") END
526 END;
527 INC(i)
528 END;
529 f.WriteChar("}")
530 END WriteSet;
532 PROCEDURE (VAR f: Formatter) WriteTab*, NEW;
533 BEGIN
534 f.rider.WriteChar(TAB)
535 END WriteTab;
537 PROCEDURE (VAR f: Formatter) WriteLn*, NEW;
538 BEGIN
539 f.rider.WriteChar(LINE)
540 END WriteLn;
542 PROCEDURE (VAR f: Formatter) WritePara*, NEW;
543 BEGIN
544 f.rider.WriteChar(PARA)
545 END WritePara;
547 PROCEDURE (VAR f: Formatter) WriteView* (v: Views.View), NEW;
548 BEGIN
549 f.WriteViewForm(v, Views.undefined, Views.undefined)
550 END WriteView;
553 PROCEDURE (VAR f: Formatter) WriteIntForm* (x: LONGINT;
554 base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN
555 ), NEW;
556 VAR s: ARRAY 80 OF CHAR;
557 BEGIN
558 Strings.IntToStringForm(x, base, minWidth, fillCh, showBase, s);
559 f.WriteString(s)
560 END WriteIntForm;
562 PROCEDURE (VAR f: Formatter) WriteRealForm* (x: REAL;
563 precision, minW, expW: INTEGER; fillCh: CHAR
564 ), NEW;
565 VAR s: ARRAY 256 OF CHAR;
566 BEGIN
567 Strings.RealToStringForm(x, precision, minW, expW, fillCh, s); f.WriteString(s)
568 END WriteRealForm;
571 PROCEDURE (VAR f: Formatter) WriteViewForm* (v: Views.View; w, h: INTEGER), NEW;
572 BEGIN
573 f.rider.WriteView(v, w, h)
574 END WriteViewForm;
576 PROCEDURE (VAR f: Formatter) WriteParamMsg* (msg, p0, p1, p2: ARRAY OF CHAR), NEW;
577 VAR s: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR;
578 BEGIN
579 Dialog.MapParamString(msg, p0, p1, p2, s);
580 i := 0; ch := s[0];
581 WHILE ch # 0X DO
582 IF ch = LINE THEN f.WriteLn
583 ELSIF ch = PARA THEN f.WritePara
584 ELSIF ch = TAB THEN f.WriteTab
585 ELSIF ch >= " " THEN f.WriteChar(ch)
586 END;
587 INC(i); ch := s[i]
588 END
589 END WriteParamMsg;
591 PROCEDURE (VAR f: Formatter) WriteMsg* (msg: ARRAY OF CHAR), NEW;
592 BEGIN
593 f.WriteParamMsg(msg, "", "", "")
594 END WriteMsg;
596 END TextMappers.