packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/lib/multiscope/cmdline.mod

IMPLEMENTATION MODULE CmdLine;

(* Implementation by J. Andrea, Jun.28/92 -dos version *)
(* With help on PSP addresses from Pat Terry *)
(* This code may be freely used and distributed, it may not be sold *)

FROM RTSMain IMPORT cmdLinePtr;
FROM StringOperations IMPORT Assign, SubString, NextBlank, NextNonBlank;

CONST
  max_args = 30;   (* don't expect any more than this many arguments *)
  max_size = 256;  (* max size of command line *)

VAR
  cmd_line        :ARRAY [1..max_size] OF CHAR;
  cmd_len, n_args :CARDINAL;
  
  start, stop     :ARRAY [1..max_args] OF CARDINAL;
  i, j            :CARDINAL;
  
  (* ------------------------------------------- *)
  PROCEDURE WholeCommandLine( VAR line :ARRAY OF CHAR );
  BEGIN
     Assign( cmd_line, line );
  END WholeCommandLine;
  
  (* ------------------------------------------- *)
  PROCEDURE Nargs() :CARDINAL;
  BEGIN
    RETURN n_args;
  END Nargs;
  
  (* ------------------------------------------- *)
  PROCEDURE GetArg( n :CARDINAL; VAR arg :ARRAY OF CHAR );    
  BEGIN
    IF ( n < 1 ) OR ( n > n_args ) THEN
      arg[0] := 0C;
    ELSE
    
      i := stop[n] - start[n] + 1;  (* length of this arg *)

      SubString( cmd_line, start[n], i, arg );

    END;
  END GetArg;
  
  (* ------------------------------------------- *)
  PROCEDURE SetupArgs;
  (* at program startup time, precompute the start and end positions *)
  (* of all the arguments *)
  BEGIN
  
     i := NextNonBlank( cmd_line, 1 );
     WHILE ( n_args < max_args ) & ( i # 0 ) DO
        j := NextBlank( cmd_line, i );

        IF j = 0 THEN
          (* no more blanks, end of arg must be last character *)
          j := cmd_len + 1;
        END;
        
        n_args := n_args + 1;
        start[n_args] := i;
        stop[n_args]  := j - 1;

        i := NextNonBlank( cmd_line, j );
     END;

  END SetupArgs;

  (* ------------------------------------------- *)
  PROCEDURE GetCommandLine;
  (* at program startup time, get the command line from the DOS PSP buffer *)
  TYPE
    Psp = POINTER TO ARRAY [0..max_size-1] OF CHAR;
    
  VAR
    psp_ptr :Psp;
    
  BEGIN
  
     psp_ptr := cmdLinePtr.addr;

     cmd_len := ORD( psp_ptr^[128] );
       
     FOR i := 1 TO cmd_len DO
       cmd_line[i] := psp_ptr^[i+128];
     END;

     IF cmd_len < max_size THEN
       cmd_line[cmd_len+1] := 0C;
     END;
     
   END GetCommandLine;

BEGIN

  n_args      := 0;
  cmd_line[1] := 0C;
  cmd_len     := 0;
  
  GetCommandLine;
  SetupArgs;
    
END CmdLine.