INOUT.MOD 6.0 KB

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