inout.mod 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. (*$V-*)
  2. IMPLEMENTATION MODULE InOut ;
  3. IMPORT FIO,Str,Terminal,ASCII ;
  4. VAR
  5. InputFile,
  6. OutputFile : CARDINAL ;
  7. PROCEDURE AddExt ( VAR fn : ARRAY OF CHAR ; ext : ARRAY OF CHAR ) ;
  8. VAR
  9. i,p : CARDINAL ;
  10. BEGIN
  11. p := Str.Length(fn) ;
  12. i := 1 ;
  13. LOOP
  14. IF (i>p)OR(i=5)OR(fn[p-i] = '\') THEN
  15. Str.Append(fn,'.');
  16. Str.Append(fn,ext);
  17. RETURN ;
  18. END ;
  19. IF fn[p-i]='.' THEN RETURN END ;
  20. INC(i) ;
  21. END ;
  22. END AddExt ;
  23. PROCEDURE OpenInput ( defext : ARRAY OF CHAR ) ;
  24. VAR
  25. fn : FIO.PathStr ;
  26. BEGIN
  27. CloseInput ;
  28. Terminal.WriteString('IN>');
  29. Terminal.ReadString(fn) ;
  30. Terminal.WriteLn ;
  31. IF fn[0]=0C THEN RETURN END ;
  32. AddExt(fn,defext) ;
  33. InputFile := FIO.Open(fn) ;
  34. Done := (FIO.IOresult()=0) ;
  35. IF NOT Done THEN
  36. InputFile := FIO.StandardInput ;
  37. END ;
  38. END OpenInput ;
  39. PROCEDURE OpenOutput ( defext : ARRAY OF CHAR ) ;
  40. VAR
  41. fn : FIO.PathStr ;
  42. BEGIN
  43. CloseOutput ;
  44. Terminal.WriteString('OUT>');
  45. Terminal.ReadString(fn) ;
  46. Terminal.WriteLn ;
  47. IF fn[0]=0C THEN RETURN END ;
  48. AddExt(fn,defext) ;
  49. OutputFile := FIO.Create(fn) ;
  50. Done := (FIO.IOresult()=0) ;
  51. IF NOT Done THEN
  52. OutputFile := FIO.StandardOutput ;
  53. END ;
  54. END OpenOutput ;
  55. PROCEDURE CloseInput ;
  56. BEGIN
  57. IF InputFile<>FIO.StandardInput THEN
  58. FIO.Close(InputFile) ;
  59. Done := (FIO.IOresult()=0) ;
  60. InputFile := FIO.StandardInput ;
  61. ELSE
  62. Done := TRUE ;
  63. END ;
  64. END CloseInput ;
  65. PROCEDURE CloseOutput ;
  66. BEGIN
  67. IF OutputFile<>FIO.StandardOutput THEN
  68. FIO.Close(OutputFile) ;
  69. Done := (FIO.IOresult()=0) ;
  70. OutputFile := FIO.StandardOutput ;
  71. ELSE
  72. Done := TRUE ;
  73. END ;
  74. END CloseOutput ;
  75. PROCEDURE Read ( VAR v : CHAR ) ;
  76. VAR
  77. b : BOOLEAN ;
  78. BEGIN
  79. REPEAT
  80. IF InputFile=FIO.StandardInput THEN
  81. Terminal.Read(v) ;
  82. Done := (v<>CHR(26)) ;
  83. ELSE
  84. v := FIO.RdChar(InputFile) ;
  85. Done := (FIO.IOresult()=0)AND(v<>CHR(26)) ;
  86. END ;
  87. UNTIL v<>ASCII.lf ; (* LF ignored *)
  88. IF v=ASCII.cr THEN
  89. v := EOL ;
  90. END ;
  91. END Read ;
  92. PROCEDURE ReadString ( VAR v : ARRAY OF CHAR ) ;
  93. VAR
  94. c : CHAR ;
  95. line : ARRAY[0..255] OF CHAR ;
  96. p : CARDINAL ;
  97. BEGIN
  98. v[0] := 0C ;
  99. IF InputFile=FIO.StandardInput THEN
  100. Terminal.ReadString(v) ;
  101. termCH := Terminal.termCH ;
  102. Done := (termCH<>CHR(26)) ;
  103. ELSE
  104. p := 0 ;
  105. REPEAT Read(c) UNTIL (c<>' ') OR NOT Done ;
  106. LOOP
  107. IF NOT Done THEN EXIT END ;
  108. IF (c>' ') THEN
  109. IF p<SIZE(line) THEN
  110. line[p] := c ;
  111. INC(p) ;
  112. END ;
  113. ELSE EXIT ;
  114. END ;
  115. Read(c) ;
  116. END ;
  117. termCH := c ;
  118. IF p<SIZE(line) THEN line[p] := CHR(0) END ;
  119. Str.Copy(v,line) ;
  120. END ;
  121. Done := (termCH<>CHR(26)) ;
  122. END ReadString ;
  123. PROCEDURE ReadCard ( VAR v : CARDINAL ) ;
  124. VAR
  125. r : LONGCARD ;
  126. line : ARRAY[0..79] OF CHAR ;
  127. BEGIN
  128. ReadString(line) ;
  129. r := Str.StrToCard(line,10,Done) ;
  130. Done := Done AND (r<=MAX(CARDINAL)) ;
  131. v := CARDINAL(r) ;
  132. END ReadCard ;
  133. PROCEDURE ReadInt ( VAR v : INTEGER ) ;
  134. VAR
  135. r : LONGINT ;
  136. line : ARRAY[0..79] OF CHAR ;
  137. BEGIN
  138. ReadString(line) ;
  139. r := Str.StrToInt(line,10,Done) ;
  140. Done := Done AND (r>=MIN(INTEGER)) AND (r<=MAX(INTEGER)) ;
  141. v := CARDINAL(r) ;
  142. END ReadInt ;
  143. PROCEDURE Write ( v : CHAR ) ;
  144. BEGIN
  145. IF OutputFile=FIO.StandardOutput THEN
  146. IF v=EOL THEN Terminal.WriteLn() ;
  147. ELSE Terminal.Write(v) ;
  148. END ;
  149. Done := TRUE ;
  150. ELSE
  151. IF v=EOL THEN FIO.WrLn(OutputFile) ;
  152. ELSE FIO.WrChar(OutputFile,v) ;
  153. END ;
  154. Done := (FIO.IOresult()=0) ;
  155. END ;
  156. END Write ;
  157. PROCEDURE WriteLn ;
  158. BEGIN
  159. Write(EOL) ;
  160. END WriteLn ;
  161. PROCEDURE WriteString ( v : ARRAY OF CHAR ) ;
  162. VAR
  163. buff : ARRAY[0..256] OF CHAR ;
  164. i,j : CARDINAL ;
  165. c : CHAR ;
  166. PROCEDURE OutBuff ;
  167. BEGIN
  168. IF Done THEN
  169. buff[j] := CHR(0) ;
  170. IF OutputFile=FIO.StandardOutput THEN
  171. Terminal.WriteString(buff) ;
  172. Done := TRUE ;
  173. ELSE
  174. FIO.WrStr(OutputFile,buff) ;
  175. Done := (FIO.IOresult()=0) ;
  176. END ;
  177. j := 0 ;
  178. END ;
  179. END OutBuff;
  180. BEGIN
  181. i := 0 ; j := 0 ;
  182. Done := TRUE ;
  183. LOOP
  184. IF i>HIGH(v) THEN OutBuff ; RETURN END ;
  185. c := v[i] ; INC(i) ;
  186. IF c=CHR(0) THEN OutBuff ; RETURN END ;
  187. IF c=EOL THEN OutBuff ; WriteLn
  188. ELSE
  189. buff[j] := c ; INC(j) ;
  190. IF j=SIZE(buff)-1 THEN OutBuff END ;
  191. END ;
  192. IF NOT Done THEN RETURN END ;
  193. END ;
  194. END WriteString ;
  195. PROCEDURE WriteCard ( v : CARDINAL ; w : CARDINAL ) ;
  196. BEGIN
  197. FIO.WrCard(OutputFile,v,INTEGER(w)) ;
  198. Done := (FIO.IOresult()=0) ;
  199. END WriteCard ;
  200. PROCEDURE WriteInt ( v : INTEGER ; w : CARDINAL ) ;
  201. BEGIN
  202. FIO.WrInt(OutputFile,v,INTEGER(w)) ;
  203. Done := (FIO.IOresult()=0) ;
  204. END WriteInt ;
  205. PROCEDURE WriteOct ( v : CARDINAL ; w : CARDINAL ) ;
  206. VAR s : ARRAY[0..80] OF CHAR;
  207. BEGIN
  208. Str.CardToStr( VAL( LONGCARD,v ),s,8,Done );
  209. IF Done THEN
  210. FIO.WrStrAdj(OutputFile,s,INTEGER(w) );
  211. Done := (FIO.IOresult()=0) ;
  212. END;
  213. END WriteOct ;
  214. PROCEDURE WriteHex ( v : CARDINAL ; w : CARDINAL ) ;
  215. BEGIN
  216. FIO.WrHex(OutputFile,v,INTEGER(w)) ;
  217. Done := (FIO.IOresult()=0) ;
  218. END WriteHex ;
  219. BEGIN
  220. Done := TRUE ;
  221. termCH := CHR(0) ;
  222. InputFile := FIO.StandardInput ;
  223. OutputFile := FIO.StandardOutput ;
  224. FIO.IOcheck := FALSE ;
  225. END InOut.
  226.