DIRECTORY CharIO: TYPE USING [CR, Handle, NumberFormat, SP], ConvertUnsafe: TYPE USING [SubString]; IO: TYPE USING [GetChar, PutChar], CharIOImpl: PROGRAM IMPORTS ConvertUnsafe, IO EXPORTS CharIO = { OPEN CharIO, ConvertUnsafe; GetChar: PUBLIC PROC [in: Handle] RETURNS [CHAR] = { RETURN [in.GetChar[]]}; GetString: PUBLIC PROC [in: Handle, s: LONG STRING, test: PROC [CHAR] RETURNS [BOOL]] = { DO c: CHAR _ '\000; c _ in.GetChar[ ! ANY => {EXIT}]; IF test[c] THEN EXIT; AppendChar[s, c]; ENDLOOP}; PutChar: PUBLIC PROC [out: Handle, c: CHAR] = {out.PutChar[c]}; PutString: PUBLIC PROC [out: Handle, s: LONG STRING] = { IF s # NIL THEN FOR i: CARDINAL IN [0..s.length) DO out.PutChar[s[i]] ENDLOOP}; PutLine: PUBLIC PROC [out: Handle, s: LONG STRING] = { PutString[out, s]; PutChar[out, CR]}; PutSubString: PUBLIC PROC [out: Handle, ss: SubString] = { s: LONG STRING = ss.base; IF s # NIL THEN FOR i: CARDINAL IN [ss.offset .. ss.offset+ss.length) DO out.PutChar[s[i]] ENDLOOP}; GetLine: PUBLIC PROC [in: Handle, s: LONG STRING] = {GetString[in, s, IsCR]}; IsCR: PROC [c: CHAR] RETURNS [BOOL] = {RETURN [c = CR]}; GetId: PUBLIC PROC [in: Handle, s: LONG STRING] = { c: CHAR _ SP; DO c _ GetChar[in ! ANY => {EXIT}]; IF c # SP THEN EXIT; ENDLOOP; UNTIL c = SP OR c = CR DO AppendChar[s, c]; c _ GetChar[in ! ANY => {EXIT}]; ENDLOOP}; AppendChar: PROCEDURE [s: LONG STRING, c: CHARACTER] = BEGIN -- copied from LongStringsA IF s = NIL THEN RETURN; IF s.length >= s.maxlength THEN ERROR; s[s.length] _ c; s.length _ s.length + 1; END; GetNumber: PUBLIC PROC [in: Handle, radix: CARDINAL] RETURNS [UNSPECIFIED] = { number: CARDINAL _ 0; negative: BOOL _ FALSE; s: STRING = [10]; pos, len: CARDINAL _ 0; GetId[in, s]; len _ s.length; IF len > 0 THEN SELECT s[len-1] FROM 'b, 'B => {radix _ 8; len _ len-1}; 'd, 'D => {radix _ 10; len _ len-1}; ENDCASE; IF pos < len AND s[pos] = '- THEN {pos _ pos+1; negative _ TRUE}; FOR pos IN [pos..len) DO number _ number*radix + (s[pos].ORD - '0.ORD); ENDLOOP; IF negative THEN number _ -number; RETURN [number]}; PutNumber: PUBLIC PROC [out: Handle, val: INTEGER, format: NumberFormat] = { i: CARDINAL _ 0; neg: BOOL _ FALSE; fill: CHAR = (IF format.zerofill THEN '0 ELSE ' ); s: STRING = [17]; card: CARDINAL _ val; radix: CARDINAL = format.base; IF radix < 2 OR radix > 36 THEN ERROR; IF val < 0 AND ~format.unsigned THEN {card _ -card; neg _ TRUE}; DO digit: CARDINAL = card MOD radix; s[i] _ VAL[IF digit >= 10 THEN 'A.ORD + (digit-10) ELSE '0.ORD + digit]; i _ i + 1; IF (card _ card/radix) = 0 THEN EXIT; ENDLOOP; s.length _ i; IF neg THEN { i _ i + 1; IF format.zerofill THEN {PutChar[out, '-]; neg _ FALSE}}; THROUGH (i..format.columns] DO PutChar[out, fill] ENDLOOP; IF neg THEN PutChar[out, '-]; i _ s.length; WHILE i > 0 DO PutChar[out, s[i _ i-1]] ENDLOOP}; PutDecimal: PUBLIC PROC [out: Handle, n: INTEGER] = { PutNumber[out, n, NumberFormat[10, FALSE, FALSE, 0]]}; PutOctal: PUBLIC PROC [out: Handle, n: UNSPECIFIED] = { PutNumber[out, n, NumberFormat[8, FALSE, TRUE, 0]]; IF CARDINAL[n] > 7 THEN PutChar[out, 'b]}; }. ÐCharIOImpl.Mesa last edited by Russ Atkinson on 29-Oct-80 10:23:47 last edited by Satterthwaite on December 10, 1982 10:29 am Last Edited by: Maxwell, July 29, 1983 9:45 am String i/o Numerical i/o Ê¿˜Jšœ™Jšœ2™2Jšœ;™;J™.J™šÏk ˜ Jš œœœœœ˜2Jšœœœ ˜&Jšœœœ˜"J˜—š œ œœœœ ˜@Jšœ˜J˜Jšœ ™ J˜š Ïnœœœœœ˜4Jšœ˜J˜—šž œœœœœœœœœ˜Yš˜Jšœœ ˜Jšœœœ˜!Jšœ œœ˜J˜Jšœ˜ J˜——Jšžœœœœ˜?J˜š ž œœœœœ˜8Jšœœœœœœœœ˜OJ˜—š žœœœœœ˜6Jšœ œ˜%J˜—šž œœœ!˜:Jšœœœ ˜šœœ˜Jš œœœ$œœ˜TJ˜——Jš žœœœœœ˜MJ˜Jšžœœœœœœœ˜8J˜š žœœœœœ˜3Jšœœœ˜ š˜Jšœœœ˜ Jšœœœœ˜Jšœ˜—š œœœœ˜J˜Jšœœœ˜ Jšœ˜ ——J˜š ž œ œœœ œ˜6JšœÏc˜!Jšœœœœ˜Jšœœœ˜&Jšœ˜Jšœ˜Jšœ˜—Jšœ™J˜š ž œœœœœ œ˜NJšœœ˜Jšœ œœ˜Jšœœ˜Jšœ œ˜J˜ J˜šœ ˜šœ ˜J˜#J˜$Jšœ˜——Jšœ œ œœ˜Ašœœ ˜Jšœ œœ˜.Jšœ˜—Jšœ œ˜"Jšœ ˜J˜—šž œœœœ˜LJšœœ˜Jšœœœ˜Jš œœœœœ˜2Jšœœ˜Jšœœ˜Jšœœ˜Jšœ œ œœ˜&Jšœ œœœ˜@š˜Jšœœœ˜"Jš œœœ œœœœ ˜HJ˜ Jšœœœ˜%Jšœ˜—J˜ šœœ˜ J˜ Jšœœœ˜:—Jšœœœ˜:Jšœœ˜J˜ Jšœœœ˜1J˜—šž œœœœ˜5Jšœ#œœ˜6J˜—šžœœœ œ˜7Jšœ"œœ˜3Jšœœœ˜*J˜—J˜J˜——…— ¡