Browse Source

* Add Delphi-Compatible new findCmdLineSwitch overload

Michaël Van Canneyt 8 months ago
parent
commit
0c83b3dc6c
2 changed files with 55 additions and 1 deletions
  1. 50 0
      rtl/objpas/sysutils/sysstr.inc
  2. 5 1
      rtl/objpas/sysutils/sysstrh.inc

+ 50 - 0
rtl/objpas/sysutils/sysstr.inc

@@ -2621,6 +2621,56 @@ begin
 end;
 
 
+
+function FindCmdLineSwitch(const Switch: string; var Value: string; IgnoreCase: Boolean = True; const SwitchTypes: TCmdLineSwitchTypes = [clstValueNextParam, clstValueAppended]): Boolean;
+
+const
+{$IFDEF WINDOWS}
+  SwitchChars = ['-','/'];
+{$ELSE}
+  SwitchChars = ['-'];
+{$ENDIF}
+
+Var
+  I,L,SL : Integer;
+  S,T,R : String;
+
+begin
+  Result:=False;
+  S:=Switch;
+  If IgnoreCase then
+    S:=UpperCase(S);
+  SL:=Length(S);
+  I:=ParamCount;
+  While (Not Result) and (I>0) do
+    begin
+    L:=Length(Paramstr(I));
+    If (L>0) and (ParamStr(I)[1] in SwitchChars) then
+      begin
+      T:=Copy(ParamStr(I),2,SL);
+      If IgnoreCase then
+        T:=UpperCase(T);
+      R:=Copy(ParamStr(I),2+SL);
+      Result:=(S=T);
+      end;
+    If Result then
+      begin
+      if clstValueAppended in SwitchTypes then
+        begin
+        if (R<>'') and (R[1]=':') then
+          Delete(R,1,1);
+        Value:=R;
+        end;
+      if (R='') and (clstValueNextParam in SwitchTypes) then
+        begin
+        if (I<ParamCount) then
+          Value:=Paramstr(I+1);
+        end;
+      end;
+    Dec(i);
+    end;
+end;
+
 Function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet;IgnoreCase: Boolean): Boolean;
 
 Var

+ 5 - 1
rtl/objpas/sysutils/sysstrh.inc

@@ -287,9 +287,13 @@ Type
   TSysCharSet = Set of AnsiChar;
   PSysCharSet = ^TSysCharSet;
 
-Function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet;IgnoreCase: Boolean): Boolean;
+  TCmdLineSwitchType = (clstValueNextParam, clstValueAppended);
+  TCmdLineSwitchTypes = Set of TCmdLineSwitchType;
+
+Function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet; IgnoreCase: Boolean): Boolean;
 Function FindCmdLineSwitch(const Switch: string; IgnoreCase: Boolean): Boolean;
 Function FindCmdLineSwitch(const Switch: string): Boolean;
+function FindCmdLineSwitch(const Switch: string; var Value: string; IgnoreCase: Boolean = True; const SwitchTypes: TCmdLineSwitchTypes = [clstValueNextParam, clstValueAppended]): Boolean;
 
 function WrapText(const Line, BreakStr: string; const BreakChars: TSysCharSet;  MaxCol: Integer): string;
 function WrapText(const Line: string; MaxCol: Integer): string;