| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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.
|