longwholeio.mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. IMPLEMENTATION MODULE LongWholeIO;
  2. (* Builds the decimal text (64-bit) and writes it through IOChan. *)
  3. IMPORT IOChan;
  4. PROCEDURE CardToStr (card : LONGCARD; VAR s : ARRAY OF CHAR);
  5. VAR tmp : ARRAY [0 .. 31] OF CHAR;
  6. i, k : CARDINAL;
  7. v : LONGCARD;
  8. BEGIN
  9. v := card; i := 0;
  10. IF v = 0 THEN tmp[0] := "0"; i := 1
  11. ELSE
  12. WHILE (v > 0) AND (i <= HIGH(tmp)) DO
  13. tmp[i] := CHR(ORD("0") + INT32MOD(v, 10));
  14. v := v DIV 10;
  15. INC(i)
  16. END
  17. END;
  18. k := 0;
  19. WHILE (i > 0) AND (k <= HIGH(s)) DO
  20. DEC(i);
  21. s[k] := tmp[i]; INC(k)
  22. END;
  23. IF k <= HIGH(s) THEN s[k] := CHR(0) END
  24. END CardToStr;
  25. PROCEDURE INT32MOD (x, y : LONGCARD) : CARDINAL;
  26. BEGIN
  27. RETURN VAL(CARDINAL, x MOD y)
  28. END INT32MOD;
  29. PROCEDURE WritePadded (cid : IOChan.ChanId; VAR s : ARRAY OF CHAR;
  30. width : CARDINAL);
  31. VAR n, i : CARDINAL;
  32. pad : ARRAY [0 .. 127] OF CHAR;
  33. BEGIN
  34. n := 0;
  35. WHILE (n <= HIGH(s)) AND (s[n] # CHR(0)) DO INC(n) END;
  36. IF width > n THEN
  37. i := 0;
  38. WHILE (i < width - n) AND (i <= HIGH(pad)) DO
  39. pad[i] := " "; INC(i)
  40. END;
  41. pad[i] := CHR(0);
  42. IOChan.WriteString(cid, pad)
  43. END;
  44. IOChan.WriteString(cid, s)
  45. END WritePadded;
  46. PROCEDURE WriteInt (cid : IOChan.ChanId; int : LONGINT; width : CARDINAL);
  47. VAR s : ARRAY [0 .. 63] OF CHAR;
  48. v : LONGCARD;
  49. neg : BOOLEAN;
  50. n, k : CARDINAL;
  51. BEGIN
  52. IF int < 0 THEN neg := TRUE; v := LONGCARD(-int)
  53. ELSE neg := FALSE; v := LONGCARD(int)
  54. END;
  55. CardToStr(v, s);
  56. IF neg THEN
  57. n := 0; WHILE (n <= HIGH(s)) AND (s[n] # CHR(0)) DO INC(n) END;
  58. IF n < HIGH(s) THEN
  59. k := n;
  60. WHILE k > 0 DO s[k] := s[k-1]; DEC(k) END;
  61. s[0] := "-"
  62. END
  63. END;
  64. WritePadded(cid, s, width)
  65. END WriteInt;
  66. PROCEDURE WriteCard (cid : IOChan.ChanId; card : LONGCARD; width : CARDINAL);
  67. VAR s : ARRAY [0 .. 63] OF CHAR;
  68. BEGIN
  69. CardToStr(card, s);
  70. WritePadded(cid, s, width)
  71. END WriteCard;
  72. PROCEDURE ReadInt (cid : IOChan.ChanId; VAR int : LONGINT);
  73. VAR s : ARRAY [0 .. 63] OF CHAR;
  74. i, k : CARDINAL;
  75. neg, seen : BOOLEAN;
  76. v : LONGCARD;
  77. BEGIN
  78. IOChan.ReadString(cid, s);
  79. i := 0; neg := FALSE; seen := FALSE; v := 0;
  80. WHILE (i <= HIGH(s)) AND (s[i] = " ") DO INC(i) END;
  81. IF s[i] = "-" THEN neg := TRUE; INC(i)
  82. ELSIF s[i] = "+" THEN INC(i)
  83. END;
  84. WHILE (i <= HIGH(s)) AND (s[i] >= "0") AND (s[i] <= "9") DO
  85. v := v * 10 + LONGCARD(ORD(s[i]) - ORD("0"));
  86. seen := TRUE; INC(i)
  87. END;
  88. IF neg THEN int := -LONGINT(v) ELSE int := LONGINT(v) END
  89. END ReadInt;
  90. PROCEDURE ReadCard (cid : IOChan.ChanId; VAR card : LONGCARD);
  91. VAR s : ARRAY [0 .. 63] OF CHAR;
  92. i : CARDINAL;
  93. v : LONGCARD;
  94. BEGIN
  95. IOChan.ReadString(cid, s);
  96. i := 0; v := 0;
  97. WHILE (i <= HIGH(s)) AND (s[i] = " ") DO INC(i) END;
  98. WHILE (i <= HIGH(s)) AND (s[i] >= "0") AND (s[i] <= "9") DO
  99. v := v * 10 + LONGCARD(ORD(s[i]) - ORD("0"));
  100. INC(i)
  101. END;
  102. card := v
  103. END ReadCard;
  104. END LongWholeIO.