home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / InOut.mod < prev    next >
Text File  |  1997-01-03  |  5KB  |  248 lines

  1. IMPLEMENTATION MODULE InOut;
  2.  
  3. (* (C) Copyright 1994 Marcel Timmermans. All rights reserved. *)
  4.  
  5. FROM SYSTEM IMPORT WORD,ADR,ASSEMBLE,SETREG,ADDRESS     ;
  6. FROM Convert IMPORT IntToStr,CardToStr; 
  7. FROM String IMPORT Length;
  8. FROM Ascii IMPORT nul, lf, eof;
  9. FROM ModulaLib IMPORT Assert, wbStarted, kickVersion, wbenchMsg;
  10. IMPORT DosD,DosL,wb:Workbench;
  11.  
  12.  
  13. CONST
  14.   InOutErr='Cannot open InOut window!';
  15.   StrLen=99;
  16.   RetMsg="\n<< RETURN >>";
  17.  
  18. TYPE 
  19.   String=ARRAY [0..StrLen] OF CHAR;
  20.  
  21. VAR 
  22.   inF, outF: DosD.FileHandlePtr;
  23.   wbm:wb.WBStartupPtr;
  24.   c:CHAR;
  25.  
  26. PROCEDURE Read( VAR ch :CHAR );
  27. (*
  28.     read a character
  29. *)
  30. BEGIN
  31.  IF DosL.Read(inF,ADR(ch),1)#1 THEN ch := eof END;
  32. END Read;
  33.  
  34.  
  35. PROCEDURE ReadString( VAR s :ARRAY OF CHAR );
  36. VAR i:LONGINT;
  37. BEGIN
  38.   i := 0;
  39.   REPEAT
  40.     Read(s[i]);
  41.     IF s[i]=lf THEN s[i] := 0C; RETURN END;
  42.     INC(i);
  43.   UNTIL i=HIGH(s);
  44. END ReadString;
  45.  
  46.  
  47. PROCEDURE ReadLongInt( VAR x :LONGINT );
  48. VAR
  49.   ch: CHAR;
  50.   d: INTEGER;
  51.   neg: BOOLEAN;
  52. BEGIN
  53.   x := 0; 
  54.   neg := FALSE;
  55.   Read(ch);
  56.   WHILE (ch#lf) AND (ch#eof) AND (ch#0C) DO
  57.     IF ch="-" THEN neg := TRUE;
  58.     ELSIF (ch>="0") AND (ch<="9") THEN
  59.       d := ORD(ch)-ORD("0");
  60.       IF (MAX(LONGINT)-d) DIV 10 >= x THEN x := 10*x+d END;
  61.     END;
  62.     Read(ch);
  63.   END;
  64.   IF neg THEN x := -x END;
  65. END ReadLongInt;
  66.  
  67.  
  68. PROCEDURE ReadInt( VAR x :INTEGER );
  69. VAR l:LONGINT;
  70. BEGIN
  71.   ReadLongInt(l);
  72.   x := l MOD MAX(INTEGER);
  73. END ReadInt;
  74.  
  75. PROCEDURE ReadLongCard( VAR x :LONGCARD);
  76. (* Doesn't see minus sign!
  77.    LONGCARD Cannot be signed!!
  78.  *)
  79. VAR
  80.   ch: CHAR;
  81.   d: CARDINAL;
  82. BEGIN
  83.   x := 0;
  84.   Read(ch);
  85.   WHILE (ch#lf) AND (ch#eof) AND (ch#0C) DO
  86.     IF (ch>="0") AND (ch<="9") THEN
  87.       d := ORD(ch)-ORD("0");
  88.       IF (MAX(LONGCARD)-d) DIV 10 >= x THEN x := 10*x+d END;
  89.     END;
  90.     Read(ch);
  91.   END;
  92. END ReadLongCard;
  93.  
  94.  
  95. PROCEDURE ReadCard(VAR x :CARDINAL);
  96. VAR 
  97.  l:LONGCARD;
  98. BEGIN
  99.   ReadLongCard(l);
  100.   x := l MOD MAX(CARDINAL);
  101. END ReadCard;
  102.  
  103.  
  104. PROCEDURE Write( ch :CHAR );
  105. (*
  106.     write the character
  107. *)
  108. BEGIN
  109.  Done:=DosL.Write(outF,ADR(ch),1)=1;
  110. END Write;
  111.  
  112.  
  113. PROCEDURE WriteLn;
  114. (*
  115.     same as: Write( ASCII.EOL )
  116. *)
  117. BEGIN
  118.  Write(lf);
  119. END WriteLn;
  120.  
  121.  
  122. PROCEDURE WriteString( s :ARRAY OF CHAR );
  123. (*$ CopyDyn- *)
  124. (*
  125.     write the string out
  126. *)
  127. VAR i:INTEGER;
  128. BEGIN
  129.  i:=Length(s);
  130.  Done:=DosL.Write(outF,ADR(s),i)=i;
  131. END WriteString;
  132.  
  133.  
  134. PROCEDURE WriteLine( s :ARRAY OF CHAR );
  135. (*$ CopyDyn- *)
  136. BEGIN
  137.  WriteString(s); WriteLn;
  138. END WriteLine;
  139.  
  140.  
  141. PROCEDURE WriteInt( x : LONGINT; n :CARDINAL );
  142. (*
  143.     write the LONGINT right justified in a field of at least n characters.
  144. *)
  145. VAR s:String;
  146. BEGIN
  147.  IntToStr(x,s,n,Done);
  148.  WriteString(s);
  149. END WriteInt;
  150.  
  151.  
  152. PROCEDURE WriteCard( x : LONGCARD; n : CARDINAL);
  153. (*
  154.     write the CARDINAL right justified in a field of at least n characters.
  155. *)
  156. VAR s:String;
  157. BEGIN
  158.  CardToStr(x,s,n,Done);
  159.  WriteString(s);
  160. END WriteCard;
  161.  
  162.  
  163. PROCEDURE WriteOct( x, n :CARDINAL );
  164. (*
  165.     write x in octal format in a right justified field of at least n characters.
  166. *)
  167. BEGIN
  168.   IF x<0 THEN Write("-"); x := -x; DEC(n) END;
  169.   IF n>1 THEN WriteOct(x DIV 8,n-1); x := x MOD 8; END;
  170.   Write(CHAR(x+ORD("0")));
  171. END WriteOct;
  172.  
  173.  
  174. PROCEDURE WriteHex( x : LONGINT; n :CARDINAL );
  175. (*
  176.     write x in hexadecimal in a right justified field of at least n characters.
  177.     IF (n <= 2) AND (x < 100H) THEN 2 digits are written
  178.     ELSE 4 digits are written
  179. *)
  180. BEGIN
  181.   IF x<0 THEN Write("-"); x := -x; DEC(n) END;
  182.   IF n>1 THEN WriteHex(x DIV 16,n-1); x := x MOD 16; END;
  183.   IF x>9 THEN Write(CHAR(x+55)) ELSE Write(CHAR(x+ORD("0"))) END;
  184. END WriteHex;
  185.  
  186. PROCEDURE WriteFormat(template : ARRAY OF CHAR;
  187.                       data : ADDRESS);
  188.  
  189.   BEGIN
  190.     IGNORE DosL.VFPrintf(outF,ADR(template),data);
  191.     IGNORE DosL.Flush(outF);
  192.   END WriteFormat;
  193.  
  194.  
  195. PROCEDURE ConfigWB;
  196. CONST
  197.   ConName='CON:010/030/620/100/';
  198.   ExtStr37='/AUTO/CLOSE';
  199. VAR 
  200.   str:String;
  201. BEGIN
  202.   wbm:=wbenchMsg;
  203.   ASSEMBLE(
  204.     LEA str(A5),A1
  205.     LEA ConName(PC),A0
  206. lp:
  207.     MOVE.B  (A0)+,(A1)+
  208.     TST.B   (A0)
  209.     BNE     lp
  210.       MOVEA.L wbm(A4),A2
  211.       MOVEA.L 36(A2),A3
  212.       MOVEA.L 4(A3),A0
  213. lp1:
  214.     MOVE.B  (A0)+,(A1)+
  215.     TST.B   (A0)
  216.     BNE     lp1
  217.     CMPI.W  #37,kickVersion(A4)
  218.     BLT.S   cont
  219.     LEA     ExtStr37(PC),A0
  220. lp2:
  221.     MOVE.B  (A0)+,(A1)+
  222.     TST.B   (A0)
  223.     BNE     lp2
  224. cont:
  225.     CLR.B   (A1)
  226.   END);    
  227.   inF:=DosL.Open(ADR(str),DosD.oldFile);
  228.   Assert(inF#NIL,ADR(InOutErr));
  229.   outF:=inF;
  230. END ConfigWB;
  231.  
  232. BEGIN
  233.  IF wbStarted THEN
  234.   ConfigWB;
  235.  ELSE
  236.   inF := DosL.Input(); 
  237.   outF:= DosL.Output();
  238.  END;
  239. CLOSE
  240.  IF wbStarted THEN
  241.   IF inF#NIL THEN 
  242.     IGNORE DosL.Write(outF,ADR(RetMsg),SIZE(RetMsg));
  243.     IGNORE DosL.Read(inF,ADR(c),1);
  244.     DosL.Close(inF); 
  245.   END;
  246.  END;
  247. END InOut.mod
  248.