IMPLEMENTATION MODULE LongWholeIO; (* Builds the decimal text (64-bit) and writes it through IOChan. *) IMPORT IOChan; PROCEDURE CardToStr (card : LONGCARD; VAR s : ARRAY OF CHAR); VAR tmp : ARRAY [0 .. 31] OF CHAR; i, k : CARDINAL; v : LONGCARD; BEGIN v := card; i := 0; IF v = 0 THEN tmp[0] := "0"; i := 1 ELSE WHILE (v > 0) AND (i <= HIGH(tmp)) DO tmp[i] := CHR(ORD("0") + INT32MOD(v, 10)); v := v DIV 10; INC(i) END END; k := 0; WHILE (i > 0) AND (k <= HIGH(s)) DO DEC(i); s[k] := tmp[i]; INC(k) END; IF k <= HIGH(s) THEN s[k] := CHR(0) END END CardToStr; PROCEDURE INT32MOD (x, y : LONGCARD) : CARDINAL; BEGIN RETURN VAL(CARDINAL, x MOD y) END INT32MOD; PROCEDURE WritePadded (cid : IOChan.ChanId; VAR s : ARRAY OF CHAR; width : CARDINAL); VAR n, i : CARDINAL; pad : ARRAY [0 .. 127] OF CHAR; BEGIN n := 0; WHILE (n <= HIGH(s)) AND (s[n] # CHR(0)) DO INC(n) END; IF width > n THEN i := 0; WHILE (i < width - n) AND (i <= HIGH(pad)) DO pad[i] := " "; INC(i) END; pad[i] := CHR(0); IOChan.WriteString(cid, pad) END; IOChan.WriteString(cid, s) END WritePadded; PROCEDURE WriteInt (cid : IOChan.ChanId; int : LONGINT; width : CARDINAL); VAR s : ARRAY [0 .. 63] OF CHAR; v : LONGCARD; neg : BOOLEAN; n, k : CARDINAL; BEGIN IF int < 0 THEN neg := TRUE; v := LONGCARD(-int) ELSE neg := FALSE; v := LONGCARD(int) END; CardToStr(v, s); IF neg THEN n := 0; WHILE (n <= HIGH(s)) AND (s[n] # CHR(0)) DO INC(n) END; IF n < HIGH(s) THEN k := n; WHILE k > 0 DO s[k] := s[k-1]; DEC(k) END; s[0] := "-" END END; WritePadded(cid, s, width) END WriteInt; PROCEDURE WriteCard (cid : IOChan.ChanId; card : LONGCARD; width : CARDINAL); VAR s : ARRAY [0 .. 63] OF CHAR; BEGIN CardToStr(card, s); WritePadded(cid, s, width) END WriteCard; PROCEDURE ReadInt (cid : IOChan.ChanId; VAR int : LONGINT); VAR s : ARRAY [0 .. 63] OF CHAR; i, k : CARDINAL; neg, seen : BOOLEAN; v : LONGCARD; BEGIN IOChan.ReadString(cid, s); i := 0; neg := FALSE; seen := FALSE; v := 0; WHILE (i <= HIGH(s)) AND (s[i] = " ") DO INC(i) END; IF s[i] = "-" THEN neg := TRUE; INC(i) ELSIF s[i] = "+" THEN INC(i) END; WHILE (i <= HIGH(s)) AND (s[i] >= "0") AND (s[i] <= "9") DO v := v * 10 + LONGCARD(ORD(s[i]) - ORD("0")); seen := TRUE; INC(i) END; IF neg THEN int := -LONGINT(v) ELSE int := LONGINT(v) END END ReadInt; PROCEDURE ReadCard (cid : IOChan.ChanId; VAR card : LONGCARD); VAR s : ARRAY [0 .. 63] OF CHAR; i : CARDINAL; v : LONGCARD; BEGIN IOChan.ReadString(cid, s); i := 0; v := 0; WHILE (i <= HIGH(s)) AND (s[i] = " ") DO INC(i) END; WHILE (i <= HIGH(s)) AND (s[i] >= "0") AND (s[i] <= "9") DO v := v * 10 + LONGCARD(ORD(s[i]) - ORD("0")); INC(i) END; card := v END ReadCard; END LongWholeIO.