=========================================================================== BBS: Canada Remote Systems Date: 08-10-93 (01:00) Number: 33744 From: RYAN THOMPSON Refer#: NONE To: TERRY GRANT @ 912/701 Recvd: NO Subj: RE: COMMAND LINE PARSING Conf: (1221) F-PASCAL --------------------------------------------------------------------------- >>> Quoting message from Terry Grant @ 912/701 to All >>> Original sent 07 Aug 93 20:36:00 about Command Line Parsing TG> Hello All! TG> TG> After working on this for awhile, I thought mabe someone else could help TG> me out a little here. All I need this to do is Parse the command line for TG> seven parameters, TG> TG> The BaudRate (/B), TG> : TG> and Overlay Size (/O). TG> TG> My Main problem here is, it will SEE the command line, But WILL NOT allow TG> me to use anything AFTER the Switch ? Like /B2400 ! Sure thing! I once wrote a unit which among other things has some neat parsing for the command line. Here's a snippet: {- Top -} Function SwitchNum(S : String) : Integer; { If a switch character specified exists, return which position } { it is in on the command line. Used internally. } 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; { Returns TRUE if a switch of the character specified exists. } Begin If SwitchNum(S) = 0 then SwitchThere:= False else SwitchThere:= True; End; Function SwitchData(S : String) : String; { Return the data following a switch: /B2400 returns 2400. } 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; { Returns the Nth command line parameter. Parameters in quotes } { are returned with the spaces in between: /D Test "One Two" } { Returns >Test< for Parameter(1) and >"One Two< for Parameter(2) } { This allows you to, if you like, see what type of quote was } { used, for perhaps literal vs. translate to ALL CAPS. } 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; { Return the number of non-switch parameters on the command line. } 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; {- Fin -} A few examples: If SwitchThere('?') then DisplayHelp; If SwitchThere('B') then BaudString:= SwitchData('B'); If Parameters < 1 then begin WriteLn('Too few parms'); Halt; end; For X:= 1 to Parameters do begin Param[X]:= Parameter(X); end; Sample command lines: TESTPROG /D /F TEST /B2400 "This is a test" /M- Parameters returns 2, Parameter(1) returns TEST Parameter(2) returns "This is a test SwitchThere('L') returns False SwitchData('M') returns - SwitchData('G') returns null. I hope this helps you out! It could be optimized a lot by simply reading all of the parameters into an array in your initialization code, to eliminate all of the redundant parsing, but I don't think that parsing time for a few hundred characters at most is a limiting factor of any sort. ;-) bye Ryan --- Renegade v07-17 Beta