1 (* Copyright (C) 2015-2024 Free Software Foundation, Inc. *)
2 (* This file is part of GNU Modula-2.
4 GNU Modula-2 is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 3, or (at your option) any later
9 GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 You should have received a copy of the GNU General Public License along
15 with gm2; see the file COPYING. If not, write to the Free Software
16 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
18 IMPLEMENTATION MODULE mcPrintf ;
20 FROM SFIO IMPORT WriteS ;
21 FROM FIO IMPORT StdOut ;
22 FROM DynamicStrings IMPORT String, string, InitString, KillString, InitStringCharStar, Mark ;
23 FROM StrLib IMPORT StrLen ;
24 FROM FormatStrings IMPORT Sprintf0, Sprintf1, Sprintf2, Sprintf3, Sprintf4 ;
25 FROM nameKey IMPORT Name, keyToCharStar ;
29 isDigit - returns TRUE if, ch, is a character 0..9
32 PROCEDURE isDigit (ch: CHAR) : BOOLEAN ;
34 RETURN (ch>='0') AND (ch<='9')
42 PROCEDURE cast (VAR a: ARRAY OF BYTE; b: ARRAY OF BYTE) ;
46 IF HIGH (a) = HIGH (b)
48 FOR i := 0 TO HIGH (a) DO
58 TranslateNameToCharStar - takes a format specification string, a, and
59 if they consist of of %a then this is translated
60 into a String and %a is replaced by %s.
63 PROCEDURE TranslateNameToCharStar (VAR a: ARRAY OF CHAR;
64 n: CARDINAL) : BOOLEAN ;
73 IF (a[i]='%') AND (i+1<h)
75 IF (a[i+1]='a') AND (argno=n)
90 END TranslateNameToCharStar ;
94 fprintf0 - writes out an array to, file, after the escape sequences
98 PROCEDURE fprintf0 (file: File; a: ARRAY OF CHAR) ;
100 IF KillString (WriteS (file, Sprintf0 (InitString (a)))) = NIL
106 PROCEDURE fprintf1 (file: File; a: ARRAY OF CHAR; w: ARRAY OF BYTE) ;
111 IF TranslateNameToCharStar (a, 1)
114 s := Mark (InitStringCharStar (keyToCharStar (n))) ;
115 t := Mark (InitString (a)) ;
118 t := Mark (InitString (a)) ;
121 IF KillString (WriteS (file, s)) = NIL
127 PROCEDURE fprintf2 (file: File; a: ARRAY OF CHAR; w1, w2: ARRAY OF BYTE) ;
135 IF TranslateNameToCharStar (a, 1)
138 s1 := Mark (InitStringCharStar (keyToCharStar (n))) ;
141 IF TranslateNameToCharStar (a, 2)
144 s2 := Mark (InitStringCharStar (keyToCharStar (n))) ;
149 {} : s := Sprintf2 (Mark (InitString (a)), w1, w2) |
150 {1} : s := Sprintf2 (Mark (InitString (a)), s1, w2) |
151 {2} : s := Sprintf2 (Mark (InitString (a)), w1, s2) |
152 {1,2}: s := Sprintf2 (Mark (InitString (a)), s1, s2)
157 IF KillString (WriteS (file, s)) = NIL
163 PROCEDURE fprintf3 (file: File; a: ARRAY OF CHAR;
164 w1, w2, w3: ARRAY OF BYTE) ;
167 s, s1, s2, s3: String ;
171 IF TranslateNameToCharStar (a, 1)
174 s1 := Mark (InitStringCharStar (keyToCharStar (n))) ;
177 IF TranslateNameToCharStar (a, 2)
180 s2 := Mark (InitStringCharStar (keyToCharStar (n))) ;
183 IF TranslateNameToCharStar (a, 3)
186 s3 := Mark (InitStringCharStar (keyToCharStar (n))) ;
191 {} : s := Sprintf3 (Mark (InitString (a)), w1, w2, w3) |
192 {1} : s := Sprintf3 (Mark (InitString (a)), s1, w2, w3) |
193 {2} : s := Sprintf3 (Mark (InitString (a)), w1, s2, w3) |
194 {1,2} : s := Sprintf3 (Mark (InitString (a)), s1, s2, w3) |
195 {3} : s := Sprintf3 (Mark (InitString (a)), w1, w2, s3) |
196 {1,3} : s := Sprintf3 (Mark (InitString (a)), s1, w2, s3) |
197 {2,3} : s := Sprintf3 (Mark (InitString (a)), w1, s2, s3) |
198 {1,2,3}: s := Sprintf3 (Mark (InitString (a)), s1, s2, s3)
203 IF KillString(WriteS(file, s))=NIL
209 PROCEDURE fprintf4 (file: File; a: ARRAY OF CHAR;
210 w1, w2, w3, w4: ARRAY OF BYTE) ;
213 s, s1, s2, s3, s4: String ;
217 IF TranslateNameToCharStar (a, 1)
220 s1 := Mark (InitStringCharStar (keyToCharStar (n))) ;
223 IF TranslateNameToCharStar (a, 2)
226 s2 := Mark (InitStringCharStar (keyToCharStar (n))) ;
229 IF TranslateNameToCharStar (a, 3)
232 s3 := Mark (InitStringCharStar (keyToCharStar (n))) ;
235 IF TranslateNameToCharStar (a, 4)
238 s4 := Mark (InitStringCharStar (keyToCharStar (n))) ;
243 {} : s := Sprintf4 (Mark(InitString (a)), w1, w2, w3, w4) |
244 {1} : s := Sprintf4 (Mark(InitString (a)), s1, w2, w3, w4) |
245 {2} : s := Sprintf4 (Mark(InitString (a)), w1, s2, w3, w4) |
246 {1,2} : s := Sprintf4 (Mark(InitString (a)), s1, s2, w3, w4) |
247 {3} : s := Sprintf4 (Mark(InitString (a)), w1, w2, s3, w4) |
248 {1,3} : s := Sprintf4 (Mark(InitString (a)), s1, w2, s3, w4) |
249 {2,3} : s := Sprintf4 (Mark(InitString (a)), w1, s2, s3, w4) |
250 {1,2,3} : s := Sprintf4 (Mark(InitString (a)), s1, s2, s3, w4) |
251 {4} : s := Sprintf4 (Mark(InitString (a)), w1, w2, w3, s4) |
252 {1,4} : s := Sprintf4 (Mark(InitString (a)), s1, w2, w3, s4) |
253 {2,4} : s := Sprintf4 (Mark(InitString (a)), w1, s2, w3, s4) |
254 {1,2,4} : s := Sprintf4 (Mark(InitString (a)), s1, s2, w3, s4) |
255 {3,4} : s := Sprintf4 (Mark(InitString (a)), w1, w2, s3, s4) |
256 {1,3,4} : s := Sprintf4 (Mark(InitString (a)), s1, w2, s3, s4) |
257 {2,3,4} : s := Sprintf4 (Mark(InitString (a)), w1, s2, s3, s4) |
258 {1,2,3,4}: s := Sprintf4 (Mark(InitString (a)), s1, s2, s3, s4)
263 IF KillString (WriteS (file, s)) = NIL
270 printf0 - writes out an array to, StdOut, after the escape
271 sequences have been translated.
274 PROCEDURE printf0 (a: ARRAY OF CHAR) ;
280 PROCEDURE printf1 (a: ARRAY OF CHAR;
283 fprintf1 (StdOut, a, w)
287 PROCEDURE printf2 (a: ARRAY OF CHAR;
288 w1, w2: ARRAY OF BYTE) ;
290 fprintf2 (StdOut, a, w1, w2)
294 PROCEDURE printf3 (a: ARRAY OF CHAR;
295 w1, w2, w3: ARRAY OF BYTE) ;
297 fprintf3 (StdOut, a, w1, w2, w3)
301 PROCEDURE printf4 (a: ARRAY OF CHAR;
302 w1, w2, w3, w4: ARRAY OF BYTE) ;
304 fprintf4 (StdOut, a, w1, w2, w3, w4)