[Back to PARSING SWAG index] [Back to Main SWAG index] [Original]
{===========================================================================
BBS: Canada Remote Systems
From: RYAN THOMPSON
Subj: RE: COMMAND LINE PARSING
>>> Quoting from Chet Kress to Frans Van Duinen about Command Line Parsing
CK> FVD>I want to pass to my BP 7 program a few parameters, one of which
CK> FVD>has embedded (or even trailing) blanks. The naive approach of
CK> FVD>PROCFAX PROCFAX.CFG \PCB\MAIN\MSGS58 "FAX MAIL" does not work.
CK> FVD>Currently I pick up FAX and MAIL as two parameters and
CK> FVD>string, but I want to allow multiple embedded/trailing blanks.
Here's a set of routines to do just what you want.
Parameters Returns the number of parameters on the command line. Does
not include switches.
Parameter(n) Returns the nth parameter, ignoring switches and passing
strings in quotes as " or ' followed by the entire string
including any imbedded spaces.
SwitchThere(x) Returns True if the switch specified by the character
passed is present on the command line.
SwitchData(x) Returns the data following the switch character if the
switch character specified is present on the command line.
SwitchNum(x) Returns the position on the command line of the switch
specified. Skips parameters. }
Function SwitchNum(S : String) : Integer;
Var
Temp : String;
X,
Y : Integer;
Begin
Temp:= '';
X:= ParamCount;
Y:= 0;
while (X > 0) and (Y = 0) do begin
Temp:= ParamStr(X);
if (Temp[1] = '/') or (Temp[1] = '-') then
if UpCase(Temp[2]) = UpString(S) then Y:= X;
Dec(X);
end;
SwitchNum:= Y;
End;
Function SwitchThere(S : String) : Boolean;
Begin
SwitchThere:= not (SwitchNum(S) = 0);
End;
Function SwitchData(S : String) : String;
Var
Temp : String;
Begin
If SwitchNum(S) > 0 then begin
Temp:= ParamStr(SwitchNum(S));
Delete(Temp, 1, 2);
end
else Temp:= '';
SwitchData:= Temp;
End;
Function Parameter(N : Byte) : String;
Var
X,
Count : Byte;
Parm,
Temp : String;
Begin
X:= 0;
Count:= 0;
Parm:= '';
If ParamCount > 0 then repeat
Inc(X);
Temp:= ParamStr(X);
If (Temp[1] = '"') or (Temp[1] = '''') then begin
Parm:= Temp;
If X < ParamCount then repeat
Inc(X);
Parm:= Parm + ' ' + ParamStr(X);
until (Parm[Length(Parm)] = '"') or
(Parm[Length(Parm)] = '''') or (X = ParamCount);
Inc(Count);
end
else if (Temp[1] <> '/') and (Temp[1] <> '-')
then begin
Inc(Count);
Parm:= Temp;
end;
until (X = ParamCount) or (Count = N);
If Count = N then Parameter:= Parm
else Parameter:= '';
End;
Function Parameters : Byte;
Var
X : Byte;
Begin
X:= 0;
If ParamCount > 0 then begin
Repeat
Inc(X)
Until Parameter(X) = '';
Parameters:= X - 1;
end
else Parameters:= 0;
End;
{
For example, the command line:
TESTPRG /C INPUT.DAT /X67 "first one"
Parameters returns 2
Parameter(1) returns INPUT.DAT
Parameter(2) returns "first one
SwitchThere('F') returns false
SwitchData('X') returns 67
Notice that in quoted parameters, the first quote is returned- this allows
you to check for " vs. ', which you could use as the difference between case
sensitive and non-case-sensitive. A simple Delete(S,1,1) can remove it from
the string for use. }
[Back to PARSING SWAG index] [Back to Main SWAG index] [Original]