home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #3.1 / RBBSIABOX31.cdr / finc / filter.pas < prev    next >
Pascal/Delphi Source File  |  1984-09-28  |  3KB  |  69 lines

  1. Program FilterSample (input, output);   {r filter.pas xa4 prosig}
  2.  
  3. { This sample program allows the use of I/O Redirection from the MS-DOS
  4.   command line. It replaces the standard Turbo Input and Output routines
  5.   with ones using MS-DOS function calls 3F and 40 - which support the I/O
  6.   redirection capabilities of MS-DOS 2.0 and above. Note that due to the
  7.   use of the eof function, this function will only work on text files which
  8.   end in a CTRL-Z.
  9.  
  10.   Note that this routine is relatively slow due to single byte calls of
  11.   the MS-DOS functions.
  12.  
  13.   Sample usage:
  14.  
  15.    Display a file on the standard output device: filter <filein
  16.    Copy a file:                                  filter <filein >fileout
  17. }
  18.  
  19. type RegPack = record
  20.                  AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAGS : integer;
  21.                end;
  22.  
  23. var Registers : RegPack;
  24.     Ch        : char;
  25.  
  26. Function ReadDirect : char;
  27. var ss, oo : integer;
  28.   begin
  29.     ss := seg(input);              { Use Character Buffer in Input file FIB }
  30.     oo := ofs(input)+2;
  31.     Registers.AX := $3F00;         { DOS Read Device Function }
  32.     Registers.BX := $0000;         { Standard Input Device Handle }
  33.     Registers.CX := $0001;         { Number of Bytes to Read }
  34.     Registers.DS := ss;            { Buffer Location - Segment }
  35.     Registers.DX := oo;            { Buffer Location - Offset }
  36.     Intr ($21, Registers);
  37.     ReadDirect := chr(mem[ss:oo]); { Get the Character Just Read }
  38.   end;
  39.  
  40. Procedure WriteDirect (OutputCh : char);
  41.   begin
  42.     Registers.AX := $4000;         { DOS Write Device Function }
  43.     Registers.BX := $0001;         { Standard Output Device Handle }
  44.     Registers.CX := $0001;         { Number of Bytes to Write }
  45.     Registers.DS := seg(OutputCh); { Buffer Location - Segment }
  46.     Registers.DX := ofs(outputch); { Buffer Location - Offset }
  47.     Intr ($21, Registers);
  48.   end;
  49.  
  50. Procedure Initialize;
  51. var oo, ss : integer;
  52.   begin
  53.     ss := seg(ConOutPtr);            { Segment Pointer ... }
  54.     oo := ofs(ConOutPtr);            { ... and Offset }
  55.     memw[ss:oo] := ofs(WriteDirect); { Replace it with ours }
  56.     ss := seg(ConInPtr);
  57.     oo := ofs(ConInPtr);
  58.     memw[ss:oo] := ofs(ReadDirect);  { Replace this one too }
  59.   end;
  60.  
  61.  
  62. begin
  63.   Initialize;        { Go set up pointers to our routines }
  64.   repeat
  65.     Read(kbd,ch);    { Read Kbd to avoid echo on Read Input }
  66.     Write(ch);
  67.   until eof(input);  { Turbo blows up on plain old eof; }
  68. end.
  69.