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.