(********************************************************
**  PROGRAM TITLE:      ConChar
**
**  WRITTEN BY:         RAYMOND E. PENLEY
**  DATE WRITTEN:       19 June 1980
**
**  WRITTEN FOR:        PASCAL/Z USERS
**
**
********************************************************)
Program CONCHARDEMO;
LABEL   999; { Fatal error }
CONST
 default = 80;         { Default length of strings }
 input   = 0;          { *** Implementation dependent *** }
 strmax  = 255;
 space   = ' ';
TYPE
 Linebuffer = STRING 80;{ Command line input buffer }
(*---Pascal/Z needs these TYPE definitions---<UGLY UGLY UGLY>---*)
 str0     = STRING 0 ;
 str255   = STRING strmax;
VAR
 bell          : char;
 Cmlline       : STRING default;{ this prgms Console input buffer }
 Cmllen        : integer;
 fatal_error   : boolean;
 Text_file,
 Work_file     : Text;

(*---Pascal/Z needs these definitions---<UGLY UGLY UGLY>---*)
Function length(x: str255): integer; external;
Procedure setlength(var x: str0; y: integer); external;

Procedure GCML( VAR Line : Linebuffer;
               VAR len  : integer );
{       Read the system input buffer.
       This MUST be the first read in the
       entire program.
RETURNS:
 len = 0 if buffer is empty
       else the length of line
 Line = operating system buffer
        <in uppercase>

GLOBAL  Linebuffer : string 80;
}
begin
 setlength(line,0);
 len := 0;
 If not eoln(input) then
   begin{  read from the input buffer  }
       readln(line);
       len := length(line);
   end{  read from the input buffer  };
End{of GCML};

Procedure ConnectFiles;
LABEL   3;
CONST   FSpecLeng = 14; { Max length of total CP/M file Identifier }

TYPE       fspecs = array[1..FSpecLeng] of char;
       FileSpecs = array[1..2] of fspecs;
       extension = array[1..4] of char;
       FileNames = array[1..FSpecLeng] of char;

VAR     fspec: FileSpecs;
        flen: 0..FSpecLeng;
      Cmlptr: 1..80;
       CmlCh: char;
ext_specified: boolean;
         pos: 0..255;

  Procedure FILE_SCAN;
  begin
  (* OPEN file "fspec[2]" for READ<INPUT> assign Text_file *)
       RESET(fspec[2],Text_file);
    If not EOF(Text_file) then
  (* OPEN file "fspec[1]" for WRITE<OUTPUT> assign Work_File *)
       REWRITE(fspec[1],Work_File)
     Else
       begin
         Write('File ', fspec[2],'not found.');
         {EXIT}fatal_error := true;
       end;
  end{of file scan};

  Procedure QUIT;
  begin
    Writeln(bell,' Command Line error.');
    Writeln('Your Command line --->',Cmlline);
    Writeln('You entered ',Cmllen:3,' characters');
    writeln;
    write(  '< (dr unit:)Input File name.PAS > ');
    writeln('< (dr unit:)Output File name(.XRF) >');
    writeln;
    writeln('Input file must be a Pascal progam.');
    writeln('Output file name may have an extension of your choice.');
    writeln('If not specified the output file ext = .XRF');
    writeln('() = otional');
    writeln;writeln;
    fatal_error := true;
  end;

  Procedure Next_ClmCh;
  begin
    If (Cmlptr >= Cmllen) then fatal_error := true
    Else
      begin
        Cmlptr := Cmlptr + 1;
        CmlCh := Cmlline[Cmlptr];
      end;
  end;

  Procedure GetFspec( IO: integer; dfltext: extension );
  LABEL        4;

     Procedure Get_Next;
     begin
       If (flen >= FSpecLeng) then fatal_error := true
       Else
         begin
            FSPEC[IO][flen] := CmlCh;
            flen := flen + 1;
            Next_ClmCh;
         end;
     end;

  begin{ get fspec }
    FSPEC[IO] := '              ';
    flen := 1;
    ext_specified := false;
    while CmlCh IN ['A'..'Z','0'..'9',':','.'] do
      begin
        If not ext_specified then
           ext_specified := (CmlCh='.');
        Get_Next;If fatal_error then{EXIT}goto 4;
      end;
    If (flen > 1) and (not ext_specified) then
      for pos := 1 to 4 do
        begin
          FSPEC[IO][flen] := dfltext[pos];
          flen := flen + 1;
        end;
  4:
  end{ Get Fspec };

begin{  ConnectFiles  }
{  Read the system input buffer into Cmlline   }
 GCML(CmlLine,Cmllen);
 If (Cmllen=0) then{EXIT}
    begin fatal_error := true;goto 3 end;
 CmlCh := CmlLine[1];
 Cmlptr := 1;
 Cmllen := Cmllen + 1;
 CmlLine[Cmllen] := space;
 While (CmlCh = space) AND (not fatal_error) do Next_ClmCh;
 Getfspec(2,'.PAS');
 If flen=1 then
   begin
       Write( 'No Input File Specified.');
       fatal_error := true;
       {EXIT}goto 3;
   end;
 Next_ClmCh;
 While (CmlCh = space) AND (not fatal_error) do Next_ClmCh;
 Getfspec(1,'.XRF');
 If flen=1 then
   begin
       Write( 'No Output File Specified.');
       fatal_error := true;
       {EXIT}goto 3;
   end;
  FILE_SCAN;
3: If fatal_error then QUIT;
end{ Connect files };

Procedure Initialize;
LABEL   5;
begin
 fatal_error := false;
 bell := chr(7);
 ConnectFiles;
 If fatal_error then goto 5;
 {                                     }
 {  continue with initialization now   }
 {                                     }
5:
end;

begin(*---ConChar Demo---*)
 writeln(' ':15,'---   Command Line Input Demo  ---');
 writeln;writeln;
 writeln('This program reads directly from the system buffer.');
 writeln('Proper execution will provide your program with:');
 writeln(' 1. a drive unit and a file name so you can');
 writeln('    open a file for input.');
 writeln(' 2. A drive unit and a file name for an output');
 writeln('    file. The extension defaults to .XRF if not specified.');
 Writeln('Execute this program like so:');
 writeln('   CONCHAR  A:input file.PAS  B:output file.XRF');
 writeln;writeln;
 Initialize;
 If fatal_error then{HALT} goto 999;
 Writeln('---End of program');
 writeln;
999:{Fatal error}
end.