home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549b.lha / M2P_v1.0_sources / source.lzh / FIO.mpp < prev    next >
Text File  |  1991-08-10  |  22KB  |  717 lines

  1. (*======================================================================*)
  2. (*                   Amiga Modula-2 support routines                    *)
  3. (*======================================================================*)
  4.  
  5. IMPLEMENTATION MODULE FIO;
  6.  
  7. (*----------------------------------------------------------------------*
  8.  * Imports *** SOME IMPLEMENTATION DEPENDENT ***                        *
  9.  *----------------------------------------------------------------------*)
  10.  
  11. IMPORT SYSTEM;
  12. IMPORT FStorage;
  13. IMPORT ASCII;
  14. IMPORT Strings;
  15.  
  16. @IF    M2S THEN
  17.    @DEFINE TRAPC
  18.    IMPORT CtrlC;
  19.    IMPORT RunTime;
  20.    IMPORT DOS;
  21.    FROM DOSProcess IMPORT ProcessPtr;
  22. @ELSIF TDI THEN
  23.    IMPORT AMIGAX;
  24.    IMPORT DOSFiles;
  25.    IMPORT Libraries,DOSLibrary;
  26.    FROM DOSExtensions IMPORT ProcessPtr;
  27. @END
  28.  
  29. @INCLUDE "MACROS"
  30.  
  31. (*----------------------------------------------------------------------*
  32.  * Constants for configuring to personal preferences                    *
  33.  *----------------------------------------------------------------------*)
  34.  
  35. CONST BufferSize    = 4096;
  36.       MaxFileName   = 256;
  37.       MaxPrompt     = 80;
  38.  
  39. (*----------------------------------------------------------------------*)
  40. (* The IMPLEMENTATION DEPENDENT 'real' file type.                       *)
  41. (*----------------------------------------------------------------------*)
  42.  
  43. TYPE  RealFileType = @IF    M2S THEN DOS.FileHandle;
  44.                      @ELSIF TDI THEN DOSFiles.FileHandle;
  45.                      @ELSE
  46.                            (* insert implementation specific type here *)
  47.                      @END
  48.  
  49. (*----------------------------------------------------------------------*)
  50. (* The buffered FILE structure                                          *)
  51. (*----------------------------------------------------------------------*)
  52.  
  53. TYPE  Access = (Closed,Read,Write);
  54.  
  55.       AccessSet = SET OF Access;
  56.  
  57.       FILE = POINTER TO FHBlock;
  58.       FHBlock = RECORD
  59.                    Next:          FILE;
  60.                    Handle:        RealFileType;
  61.                    Mode:          Access; 
  62.                    CharsRead:     CARDINAL;
  63.                    Count:         CARDINAL;
  64.                    Prompt:        ARRAY [0..MaxPrompt] OF CHAR;
  65.                    Info:          ARRAY [0..BufferSize] OF CHAR;
  66.                 END;
  67.  
  68. (*----------------------------------------------------------------------*)
  69.  
  70. TYPE  Chars = [00C..37C];
  71.       Terms = SET OF Chars;
  72.  
  73. CONST Space         = ' ';
  74.       Terminators   = Terms{ASCII.NUL,ASCII.EOL,ASCII.EOF};
  75.       WhiteSpace    = Terms{ASCII.EOL,ASCII.HT};
  76.     
  77. (*----------------------------------------------------------------------*)
  78.                
  79. VAR Files:  FILE;                       (* the tracking list      *)
  80.  
  81. VAR InpBLK: FHBlock;                    (* predefined structures  *)
  82.     OutBLK: FHBlock;                    (* for INPUT and OUTPUT   *)
  83.  
  84. VAR WB:     BOOLEAN;                    (* started from workbench?*)
  85.     process:ProcessPtr;
  86.  
  87. (*----------------------------------------------------------------------*)
  88.  
  89. @IF FORWARD THEN
  90.    PROCEDURE OSOpen(VAR F: RealFileType; 
  91.                     FileName: ARRAY OF CHAR):BOOLEAN;           FORWARD;
  92.    PROCEDURE OSAppend(VAR F: RealFileType; 
  93.                       FileName: ARRAY OF CHAR):BOOLEAN;         FORWARD;
  94.    PROCEDURE OSCreate(VAR F: RealFileType; 
  95.                       FileName: ARRAY OF CHAR):BOOLEAN;         FORWARD;
  96.    PROCEDURE OSClose(VAR F: RealFileType);                      FORWARD;
  97.    PROCEDURE Flush(Output: FILE);                               FORWARD;
  98.    PROCEDURE ReadInfo(Input: FILE);                             FORWARD;
  99. @END
  100.  
  101. (*----------------------------------------------------------------------*)
  102. (* Adds a file to the file list with the given permissions.  If it      *)
  103. (* could not allocate storage, it closes the file and exits.  Otherwise *)
  104. (* it returns a pointer to the file structure.                          *)
  105. (*----------------------------------------------------------------------*)
  106.  
  107. @NoLongAddressing
  108.  
  109. PROCEDURE AddFile(VAR F: RealFileType; Permission: Access):FILE;
  110.  
  111. VAR file:  FILE;
  112.  
  113. BEGIN
  114.    FStorage.ALLOCATE(file,SYSTEM.TSIZE(FHBlock));
  115.    IF file # NIL THEN
  116.       WITH file^ DO
  117.          Mode:=Permission;                (* init. file struc *)
  118.          Handle:=F;
  119.          Count:=0;                        (* buffer empty *)
  120.          CharsRead:=BufferSize+999;       (* forces read  *)
  121.          Prompt[0]:=ASCII.NUL;
  122.          Next:=Files;
  123.       END;
  124.       Files:=file;
  125.    ELSE
  126.       OSClose(F);
  127.    END;
  128.    RETURN file;
  129. END AddFile;
  130.  
  131. (*----------------------------------------------------------------------*)
  132. (* Opens a read-only file.                                              *)
  133. (*----------------------------------------------------------------------*)
  134.  
  135. @NoCopyStrings
  136. @LongAddressing
  137.  
  138. PROCEDURE Open(FileName: ARRAY OF CHAR):FILE;
  139.  
  140. VAR handle:  RealFileType;
  141.  
  142. BEGIN
  143.    IF OSOpen(handle,FileName) THEN
  144.       RETURN AddFile(handle,Read);
  145.    ELSE
  146.       RETURN NIL;
  147.    END;
  148. END Open;
  149.  
  150. (*----------------------------------------------------------------------*)
  151. (* Opens a write-only file which writing is to begin after the last     *)
  152. (* position of the file.                                                *)
  153. (*----------------------------------------------------------------------*)
  154.  
  155. @NoCopyStrings
  156.  
  157. PROCEDURE Append(FileName: ARRAY OF CHAR):FILE;
  158.  
  159. VAR handle:  RealFileType;
  160.  
  161. BEGIN
  162.    IF OSAppend(handle,FileName) THEN
  163.       RETURN AddFile(handle,Write);
  164.    ELSE
  165.       RETURN NIL;
  166.    END;
  167. END Append;
  168.  
  169. (*----------------------------------------------------------------------*)
  170. (* Creates or overwrites a file.                                        *)
  171. (*----------------------------------------------------------------------*)
  172.  
  173. @NoCopyStrings
  174.  
  175. PROCEDURE Create(FileName: ARRAY OF CHAR):FILE;
  176.  
  177. VAR handle:  RealFileType;
  178.  
  179. BEGIN
  180.    IF OSCreate(handle,FileName) THEN
  181.       RETURN AddFile(handle,Write);
  182.    ELSE
  183.       RETURN NIL;
  184.    END;
  185. END Create;
  186.  
  187. (*----------------------------------------------------------------------*
  188.  * Flushes a file's output buffer if it had Write access, OSCloses the  *
  189.  * file, deallocates file header block, and removes file from File list *
  190.  * If the file is not on list, it will do nothing.                      *
  191.  *----------------------------------------------------------------------*)
  192.  
  193. @NoLongAddressing
  194.  
  195. PROCEDURE Close(VAR F: FILE);
  196.  
  197. VAR lead:   FILE;
  198.     follow: FILE;
  199.  
  200. BEGIN
  201.    lead:=Files;                         (* get head of tracking list    *)
  202.    follow:=lead;
  203.    WHILE (lead # NIL) AND (lead # F) DO;
  204.       follow:=lead;
  205.       lead:=lead^.Next;                 (* postcondition:               *)
  206.    END;                                 (*    lead=NIL or lead=F        *)
  207.    
  208.    IF (lead # NIL) AND GoodFILE(F) THEN (* only close it if the FILE    *)
  209.       WITH lead^ DO                     (* is on the list and active    *)
  210.          IF lead=Files THEN
  211.             Files:=Next;
  212.          ELSE
  213.             follow^.Next:=Next;
  214.          END;
  215.          IF Mode = Write THEN
  216.             Flush(lead);
  217.          END;
  218.          Mode:=Closed;
  219.          OSClose(Handle);
  220.       END;
  221.       FStorage.DEALLOCATE(lead,SYSTEM.TSIZE(FHBlock));
  222.    END;
  223. END Close;
  224.  
  225. (*----------------------------------------------------------------------*
  226.  * Determines whether a FILE is a valid pointer or not.                 *
  227.  *----------------------------------------------------------------------*)
  228.  
  229. @LongAddressing
  230.  
  231. PROCEDURE GoodFILE(F: FILE):BOOLEAN;
  232.  
  233. BEGIN
  234.    @MACRO GoodFILE(F) 
  235.           ((@F#NIL) AND 
  236.            (@F^.Mode IN AccessSet{Read,Write})) 
  237.    @ENDM
  238.    RETURN @GoodFILE(F);
  239. END GoodFILE;
  240.  
  241. (*----------------------------------------------------------------------*
  242.  * Set the prompt string for input FILEs.                               *
  243.  *----------------------------------------------------------------------*)
  244.  
  245. @NoCopyStrings
  246.  
  247. PROCEDURE SetPrompt(F: FILE; prompt: ARRAY OF CHAR);
  248. BEGIN
  249.    IF @GoodFILE(F) THEN
  250.       Strings.Assign(prompt,F^.Prompt);
  251.    END
  252. END SetPrompt;
  253.  
  254. (************************************************************************)
  255. (* Input Procedures                                                     *)
  256. (************************************************************************)
  257.  
  258. (*----------------------------------------------------------------------*
  259.  * ReadChar reads the next charactor from the input buffer.  ReadChar   *
  260.  * calls ReadInfo to fill the buffer when the contents OF the buffer    *
  261.  * have been depleted.  It returns the next character IN the buffer     *
  262.  * which has not been read.                                             *                                               *
  263.  *----------------------------------------------------------------------*)
  264.  
  265. PROCEDURE ReadChar(Input: FILE):CHAR;
  266.  
  267. BEGIN
  268.    @IF TRAPC THEN
  269.       CtrlC.Check;
  270.    @END
  271.    IF @GoodFILE(Input) THEN
  272.       WITH Input^ DO 
  273.          IF Mode = Read THEN
  274.             IF CharsRead >= Count THEN
  275.                CharsRead:=0;
  276.                ReadInfo(Input);
  277.             END;
  278.             IF CharsRead < Count THEN
  279.                INC(CharsRead);
  280.                RETURN Info[CharsRead-1];
  281.             END;
  282.          ELSE 
  283.             RETURN ASCII.NUL;
  284.          END;
  285.       END;
  286.    ELSE 
  287.       RETURN ASCII.NUL;
  288.    END;
  289. END ReadChar;
  290.  
  291. (*----------------------------------------------------------------------*
  292.  * ReadString reads a string into the array given.  It reads characters *
  293.  * into the array until either the array is full, or the EOL charactor  *
  294.  * is reached.  It will not read past the end of line.                  *
  295.  *----------------------------------------------------------------------*)
  296.  
  297. PROCEDURE ReadString(Input: FILE; VAR str:ARRAY OF CHAR);
  298.  
  299. VAR 
  300.   index,size : CARDINAL;
  301.   ch         : CHAR;
  302.   
  303. BEGIN
  304.    index:=0;
  305.    size:=HIGH(str);
  306.    LOOP
  307.       IF index > size THEN 
  308.          IF NextChar(Input) IN Terminators THEN 
  309.              ch:=ReadChar(Input); 
  310.          END;
  311.          EXIT;
  312.       END;
  313.       ch := ReadChar(Input);
  314.       IF ch IN Terminators THEN
  315.          str[index] := ASCII.NUL;
  316.          EXIT;
  317.       ELSE
  318.          str[index] := ch;
  319.          INC(index);
  320.       END;
  321.    END;
  322. END ReadString;
  323.  
  324. (*----------------------------------------------------------------------*
  325.  * ReadLn reads all the characters on the current line.  ReadLn calls   *
  326.  * ReadChar and simply discards everything until it sees a EOL char.    *
  327.  *----------------------------------------------------------------------*)
  328.  
  329. PROCEDURE ReadLn(Input: FILE);
  330.  
  331. BEGIN 
  332.    WHILE NOT(ReadChar(Input) IN Terminators) DO END;
  333. END ReadLn;
  334.  
  335. (*----------------------------------------------------------------------*
  336.  * NextChar returns the next of any pending characters, If there are no *
  337.  * pending characters, it will call ReadInfo to get some.  CAVEAT       *
  338.  * EMPTOR!!!  A poorly controlled NextChar, could cause a user to be    *
  339.  * prompted for input.                                                  *
  340.  *----------------------------------------------------------------------*)
  341.  
  342. PROCEDURE NextChar(Input: FILE):CHAR;
  343.  
  344. BEGIN
  345.    IF @GoodFILE(Input) THEN
  346.       WITH Input^ DO 
  347.          IF Mode = Read THEN
  348.             IF CharsRead >= Count THEN
  349.                CharsRead:=0;
  350.                ReadInfo(Input);
  351.             END;
  352.             IF CharsRead < Count THEN
  353.                RETURN Info[CharsRead];
  354.             END;
  355.          ELSE 
  356.             RETURN ASCII.NUL;
  357.          END;
  358.       END;
  359.    ELSE 
  360.       RETURN ASCII.NUL;
  361.    END;
  362. END NextChar;
  363.  
  364. (************************************************************************)
  365. (* Output Procedures                                                    *)
  366. (************************************************************************)
  367.  
  368. (*----------------------------------------------------------------------*
  369.  * WriteChar writes charactors TO the standard output channel.          *
  370.  *----------------------------------------------------------------------*)
  371.  
  372. PROCEDURE WriteChar(Output: FILE; ch:CHAR);
  373.  
  374. BEGIN
  375.    @IF TRAPC THEN
  376.       CtrlC.Check;
  377.    @END
  378.    IF @GoodFILE(Output) THEN
  379.       WITH Output^ DO
  380.          IF Mode = Write THEN
  381.             Info[Count]:=ch;
  382.             INC(Count);
  383.             IF (Count > BufferSize) THEN
  384.                Flush(Output);
  385.             END;
  386.          END;
  387.       END;
  388.    END;
  389. END WriteChar;
  390.  
  391. (*----------------------------------------------------------------------*
  392.  * WriteLn writes a line feed to the standard output channel.  It       *
  393.  * relies on the error checking performed by WriteChar.                 *
  394.  *----------------------------------------------------------------------*)
  395.  
  396. PROCEDURE WriteLn(Output: FILE);
  397.  
  398. BEGIN
  399.    WriteChar(Output,ASCII.EOL); 
  400.    IF Output = OUTPUT THEN 
  401.       Flush(Output); 
  402.    END;
  403. END WriteLn;
  404.  
  405. (*----------------------------------------------------------------------*
  406.  * WriteString writes strings to the standard output channel.  The      *
  407.  * amount which it writes is determined by whether it finds a string    *
  408.  * terminator (NUL) or the actual length of the string.                 *
  409.  *----------------------------------------------------------------------*)
  410.  
  411. @NoCopyStrings
  412.  
  413. PROCEDURE WriteString(Output: FILE; str: ARRAY OF CHAR);
  414.  
  415. VAR len,I: CARDINAL;
  416.   
  417. BEGIN
  418.    len:=Strings.Length(str);
  419.    I:=0;
  420.    WHILE I < len DO
  421.        WriteChar(Output,str[I]);
  422.        INC(I);
  423.    END;
  424. END WriteString;
  425.  
  426. (*----------------------------------------------------------------------*)
  427. (* Writes an unsigned integer recursively, neat no?                     *)
  428. (*----------------------------------------------------------------------*)
  429.  
  430. PROCEDURE WriteCard(Output: FILE; c:CARDINAL);
  431.  
  432. BEGIN
  433.    IF c>9 THEN WriteCard(Output,c DIV 10); END;
  434.    WriteChar(Output,CHR(ORD('0')+(c MOD 10)));
  435. END WriteCard;
  436.  
  437. (*----------------------------------------------------------------------*)
  438. (* Termination PROCEDURE -- Closes out all open files                   *)
  439. (*----------------------------------------------------------------------*)
  440.  
  441. @NoLongAddressing
  442.  
  443. PROCEDURE CloseAllFiles;
  444.  
  445. BEGIN
  446.    WHILE Files # NIL DO
  447.       Close(Files);
  448.    END;
  449.    Flush(OUTPUT);
  450.    IF WB THEN OSClose(OUTPUT^.Handle) END;
  451.    @IF TDI THEN
  452.       Libraries.CloseLibrary(DOSLibrary.DOSBase);
  453.    @END
  454. END CloseAllFiles;
  455.  
  456.  
  457. (************************************************************************)
  458. (* Implementation dependent procedures                                  *)
  459. (************************************************************************)
  460.  
  461. @LongAddressing
  462.  
  463. @MACRO OSGoodFile(F)
  464.    @IF    M2S THEN (@F#NIL)
  465.    @ELSIF TDI THEN (@F#0)
  466.    @ELSE
  467.          (* insert implementation dependent stuff here *)
  468.    @END
  469. @ENDM
  470.  
  471. (*----------------------------------------------------------------------*)
  472. (* Opens a file for read access.  If unsuccessful, it returns false and *)
  473. (* F is left undefined                                                  *)
  474. (*----------------------------------------------------------------------*)
  475.  
  476. @NoCopyStrings
  477.  
  478. PROCEDURE OSOpen(VAR F: RealFileType; FileName: ARRAY OF CHAR):BOOLEAN;
  479.  
  480. VAR @IF M2S THEN
  481.        name:  SYSTEM.ADDRESS;
  482.        FN:    ARRAY [0..MaxFileName] OF CHAR;
  483.     @END
  484.  
  485. BEGIN
  486.    @IF M2S THEN
  487.       name:=SYSTEM.ADR(FN);
  488.       Strings.Assign(FileName,FN);
  489.    @END
  490.  
  491.    @IF    M2S THEN
  492.       F:=DOS.Open(name,DOS.ModeOldFile);
  493.    @ELSIF TDI THEN
  494.       F:=DOSFiles.Open(FileName,DOSFiles.ModeOldFile);
  495.    @ELSE
  496.       (* insert machine dependent stuff here *)
  497.    @END
  498.  
  499.    RETURN @OSGoodFile(F);
  500. END OSOpen;
  501.  
  502. (*----------------------------------------------------------------------*)
  503. (* Opens a file for writing and seeks to the end of that file.          *)
  504. (*----------------------------------------------------------------------*)
  505.  
  506. PROCEDURE OSAppend(VAR F: RealFileType; FileName: ARRAY OF CHAR):BOOLEAN;
  507.  
  508. VAR @IF M2S THEN
  509.        name:  SYSTEM.ADDRESS;
  510.        FN:    ARRAY [0..MaxFileName] OF CHAR;
  511.     @END
  512. VAR stat: LONGINT;
  513.  
  514. BEGIN
  515.    @IF M2S THEN
  516.       name:=SYSTEM.ADR(FN);
  517.       Strings.Assign(FileName,FN);
  518.    @END
  519.  
  520.    @IF    M2S THEN
  521.       F:=DOS.Open(name,DOS.ModeReadWrite);
  522.    @ELSIF TDI THEN
  523.       F:=DOSFiles.Open(FileName,DOSFiles.ModeReadWrite);
  524.    @ELSE
  525.       (* insert machine dependent stuff here *)
  526.    @END
  527.  
  528.    IF @OSGoodFile(F) THEN
  529.       @IF    M2S THEN
  530.          stat:=DOS.Seek(F,LONGINT(0),DOS.OffsetEnd);
  531.       @ELSIF TDI THEN
  532.          stat:=DOSFiles.Seek(F,LONGINT(0),DOSFiles.OffsetEnd);
  533.       @ELSE
  534.          (* insert implementation dependent stuff here *)
  535.       @END
  536.    END;
  537.    RETURN @OSGoodFile(F);
  538. END OSAppend;
  539.  
  540. (*----------------------------------------------------------------------*)
  541. (* Opens a file for writing.  If unsuccessful, it returns false and     *)
  542. (* F is left undefined                                                  *)
  543. (*----------------------------------------------------------------------*)
  544.  
  545. @NoCopyStrings
  546.  
  547. PROCEDURE OSCreate(VAR F: RealFileType; FileName: ARRAY OF CHAR):BOOLEAN;
  548.  
  549. VAR @IF M2S THEN
  550.        name:  SYSTEM.ADDRESS;
  551.        FN:    ARRAY [0..MaxFileName] OF CHAR;
  552.     @END
  553.  
  554. BEGIN
  555.    @IF M2S THEN
  556.       name:=SYSTEM.ADR(FN);
  557.       Strings.Assign(FileName,FN);
  558.    @END
  559.  
  560.    @IF    M2S THEN
  561.       F:=DOS.Open(name,DOS.ModeNewFile);
  562.    @ELSIF TDI THEN
  563.       F:=DOSFiles.Open(FileName,DOSFiles.ModeNewFile);
  564.    @ELSE
  565.       (* insert machine dependent stuff here *)
  566.    @END
  567.  
  568.    RETURN @OSGoodFile(F);
  569. END OSCreate;
  570.  
  571. (*----------------------------------------------------------------------*)
  572. (* Closes a FILE                                                        *)
  573. (*----------------------------------------------------------------------*)
  574.  
  575. PROCEDURE OSClose(VAR F: RealFileType);
  576.  
  577. BEGIN
  578.    @IF    M2S THEN
  579.       DOS.Close(F);
  580.       F:=NIL;
  581.    @ELSIF TDI THEN
  582.       DOSFiles.Close(F);
  583.       F:=0;
  584.    @ELSE
  585.       (* insert implementation defined close here *)
  586.    @END
  587. END OSClose;
  588.  
  589. (*----------------------------------------------------------------------*
  590.  * Flush pending writes out from output buffer.                         *
  591.  *                                                                      *
  592.  * *** IMPLEMENTATION DEPENDENT ***                                     *
  593.  *----------------------------------------------------------------------*)
  594.  
  595. PROCEDURE Flush(Output: FILE);
  596.  
  597. VAR len: LONGINT;
  598.  
  599. BEGIN
  600.   WITH Output^ DO
  601.     IF Count <> 0 THEN
  602.       @IF    M2S THEN
  603.          len:= DOS.Write(Handle,SYSTEM.ADR(Info),Count); 
  604.       @ELSIF TDI THEN
  605.          len:= DOSFiles.Write(Handle,SYSTEM.ADR(Info),LONGINT(Count)); 
  606.       @ELSE
  607.          (* here's where you add stuff for other platforms *)
  608.       @END
  609.       Count:=0;  
  610.     END;
  611.   END;
  612. END Flush;
  613.  
  614. (*----------------------------------------------------------------------*
  615.  * ReadInfo *** IMPLEMENTATION DEPENDENT ***                            *
  616.  *                                                                      *
  617.  * ReadInfo reads info from the standard input, AND stores it in the    *
  618.  * input buffer.  It is local to this module and will require changing  *
  619.  * for different implementations.  This implementation utilizes the     *
  620.  * standard AmigaDOS library read routine to fill the buffer.  When it  *
  621.  * hits EOF, it will tack the EOF charactor onto the end of the buffer. *
  622.  * This way it will be detected by other procedures properly.           *
  623.  *----------------------------------------------------------------------*)
  624.  
  625. PROCEDURE ReadInfo(Input: FILE);
  626.  
  627. BEGIN
  628.    WITH Input^ DO  
  629.       IF Input=INPUT THEN 
  630.          WriteString(OUTPUT,Prompt);
  631.          Flush(OUTPUT); 
  632.       END;
  633.       @IF    M2S THEN
  634.          Count := DOS.Read(Handle,SYSTEM.ADR(Info),BufferSize);
  635.       @ELSIF TDI THEN
  636.          Count := CARDINAL(DOSFiles.Read(Handle,SYSTEM.ADR(Info),BufferSize));
  637.       @ELSE
  638.         (* here's where you add other platforms *)
  639.       @END
  640.       IF Count = 0 THEN
  641.          Info[0]:=ASCII.EOF;
  642.          INC(Count);
  643.       END;
  644.    END;
  645. END ReadInfo;
  646.  
  647.  
  648. (************************************************************************)
  649. (* Initialization for IO                                                *)
  650. (************************************************************************)
  651.  
  652. BEGIN
  653.    @IF TDI THEN
  654.       DOSLibrary.DOSBase:=Libraries.OpenLibrary(DOSLibrary.DOSName,0);
  655.    @END
  656.    
  657.    Window := 'CON:40/50/600/150/FIO';
  658.       
  659.    Files:=NIL;
  660.  
  661.    @IF AMIGA & (M2S|TDI) THEN
  662.       @IF    M2S THEN
  663.          process:=RunTime.CurrentProcess;
  664.       @ELSIF TDI THEN
  665.          process:=AMIGAX.ProcessPtr;
  666.       @ELSE
  667.            (* insert compiler dependent stuff here *)
  668.       @END
  669.       WB:=SYSTEM.ADDRESS(process^.prCLI)=NIL;
  670.    @END
  671.  
  672.    INPUT :=SYSTEM.ADR(InpBLK);
  673.    WITH INPUT^ DO;
  674.       IF WB THEN
  675.          @IF    M2S THEN
  676.             Handle:=DOS.Open(SYSTEM.ADR(Window),DOS.ModeReadWrite);
  677.          @ELSIF TDI THEN
  678.             Handle:=DOSFiles.Open(Window,DOSFiles.ModeReadWrite);
  679.          @ELSE
  680.             (* insert machine dependent stuff here *)
  681.          @END
  682.       ELSE
  683.          @IF    M2S THEN                   (* IMPLEMENTATION DEPENDENT *)
  684.             Handle:=DOS.Input();
  685.          @ELSIF TDI THEN
  686.             Handle:=DOSFiles.Input();
  687.          @ELSE
  688.             (* for other platforms *)
  689.          @END
  690.       END;
  691.       Next:=NIL;
  692.       Mode:=Read;
  693.       Count:=0;
  694.       CharsRead:=BufferSize+999;
  695.       Prompt:='> ';
  696.    END;
  697.  
  698.    OUTPUT:=SYSTEM.ADR(OutBLK);
  699.    WITH OUTPUT^ DO;
  700.       IF WB THEN
  701.          Handle:=INPUT^.Handle;
  702.       ELSE
  703.          @IF    M2S THEN                   (* IMPLEMENTATION DEPENDENT *)
  704.             Handle:=DOS.Output();
  705.          @ELSIF TDI THEN
  706.             Handle:=DOSFiles.Output();
  707.          @ELSE
  708.             (* for other platforms *)
  709.          @END
  710.       END;
  711.       Next:=NIL;
  712.       Mode:=Write;
  713.       Count:=0;
  714.       CharsRead:=BufferSize+999;
  715.    END;
  716. END FIO.
  717.