Selaa lähdekoodia

* Added option to fetch all errors

git-svn-id: trunk@21873 -
michael 13 vuotta sitten
vanhempi
commit
53186644a7
1 muutettua tiedostoa jossa 28 lisäystä ja 20 poistoa
  1. 28 20
      packages/fcl-base/src/custapp.pp

+ 28 - 20
packages/fcl-base/src/custapp.pp

@@ -62,10 +62,10 @@ Type
     Function GetOptionValue(Const C: Char; Const S : String) : String;
     Function HasOption(Const S : String) : Boolean;
     Function HasOption(Const C : Char; Const S : String) : Boolean;
-    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; Opts,NonOpts : TStrings) : String;
-    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings) : String;
-    Function CheckOptions(Const ShortOptions : String; Const LongOpts : Array of string) : String;
-    Function CheckOptions(Const ShortOptions : String; Const LongOpts : String) : String;
+    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; Opts,NonOpts : TStrings; AllErrors : Boolean = False) : String;
+    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; AllErrors : Boolean = False) : String;
+    Function CheckOptions(Const ShortOptions : String; Const LongOpts : Array of string; AllErrors : Boolean = False) : String;
+    Function CheckOptions(Const ShortOptions : String; Const LongOpts : String; AllErrors : Boolean = False) : String;
     Procedure GetEnvironmentList(List : TStrings;NamesOnly : Boolean);
     Procedure GetEnvironmentList(List : TStrings);
     Procedure Log(EventType : TEventType; const Msg : String);
@@ -390,10 +390,10 @@ begin
 end;
 
 
-Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const Longopts : TStrings) : String;
+Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; AllErrors : Boolean = False) : String;
 
 begin
-  Result:=CheckOptions(ShortOptions,LongOpts,Nil,Nil);
+  Result:=CheckOptions(ShortOptions,LongOpts,Nil,Nil,AllErrors);
 end;
 
 ResourceString
@@ -401,7 +401,7 @@ ResourceString
   SErrNoOptionAllowed = 'Option at position %d does not allow an argument: %s';
   SErrOptionNeeded = 'Option at position %d needs an argument : %s';
 
-Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; Opts,NonOpts : TStrings) : String;
+Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; Opts,NonOpts : TStrings; AllErrors : Boolean = False) : String;
 
 Var
   I,J,L,P : Integer;
@@ -430,6 +430,14 @@ Var
     Result:=(I<>-1);
   end;
 
+  Procedure AddToResult(Const Msg : string);
+  
+  begin
+    If (Result<>'') then
+      Result:=Result+sLineBreak;
+    Result:=Result+Msg;  
+  end;
+
 begin
   If CaseSensitiveOptions then
     SO:=Shortoptions
@@ -437,7 +445,7 @@ begin
     SO:=LowerCase(Shortoptions);
   Result:='';
   I:=1;
-  While (I<=ParamCount) and (Result='') do
+  While (I<=ParamCount) and ((Result='') or AllErrors) do
     begin
     O:=Paramstr(I);
     If (Length(O)=0) or (O[1]<>FOptionChar) then
@@ -448,7 +456,7 @@ begin
     else
       begin
       If (Length(O)<2) then
-        Result:=Format(SErrInvalidOption,[i,O])
+        AddToResult(Format(SErrInvalidOption,[i,O]))
       else
         begin
         HaveArg:=False;
@@ -469,19 +477,19 @@ begin
           If FindLongopt(O) then
             begin
             If HaveArg then
-              Result:=Format(SErrNoOptionAllowed,[I,O])
+              AddToResult(Format(SErrNoOptionAllowed,[I,O]))
             end
           else
             begin // Required argument
             If FindLongOpt(O+':') then
               begin
               If Not HaveArg then
-                Result:=Format(SErrOptionNeeded,[I,O]);
+                AddToResult(Format(SErrOptionNeeded,[I,O]));
               end
             else
               begin // Optional Argument.
               If not FindLongOpt(O+'::') then
-                Result:=Format(SErrInvalidOption,[I,O]);
+                AddToResult(Format(SErrInvalidOption,[I,O]));
               end;
             end;
           end
@@ -494,11 +502,11 @@ begin
             O:=LowerCase(O);
           L:=Length(O);
           J:=2;
-          While (result='') and (J<=L) do
+          While ((Result='') or AllErrors) and (J<=L) do
             begin
             P:=Pos(O[J],ShortOptions);
             If (P=0) or (O[j]=':') then
-              Result:=Format(SErrInvalidOption,[I,O[J]])
+              AddToResult(Format(SErrInvalidOption,[I,O[J]]))
             else
               begin
               If (P<Length(ShortOptions)) and (Shortoptions[P+1]=':') then
@@ -506,7 +514,7 @@ begin
                 // Required argument
                 If ((P+1)=Length(ShortOptions)) or (Shortoptions[P+2]<>':') Then
                   If (J<L) or not haveArg then // Must be last in multi-opt !!
-                    Result:=Format(SErrOptionNeeded,[I,O[J]]);
+                    AddToResult(Format(SErrOptionNeeded,[I,O[J]]));
                 O:=O[j]; // O is added to arguments.
                 end;
               end;
@@ -518,7 +526,7 @@ begin
             O:=O[Length(O)]; // O is added to arguments !
             end;
           end;
-        If HaveArg and (Result='') then
+        If HaveArg and ((Result='') or AllErrors) then
           If Assigned(Opts) then
             Opts.Add(O+'='+OV);
         end;
@@ -527,7 +535,7 @@ begin
     end;
 end;
 
-Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const LongOpts : Array of string) : String;
+Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const LongOpts : Array of string; AllErrors : Boolean = False) : String;
 
 Var
   L : TStringList;
@@ -538,13 +546,13 @@ begin
   Try
     For I:=0 to High(LongOpts) do
       L.Add(LongOpts[i]);
-    Result:=CheckOptions(ShortOptions,L);
+    Result:=CheckOptions(ShortOptions,L,AllErrors);
   Finally
     L.Free;
   end;
 end;
 
-Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const LongOpts : String) : String;
+Function TCustomApplication.CheckOptions(Const ShortOptions : String; Const LongOpts : String; AllErrors : Boolean = False) : String;
 
 Const
   SepChars = ' '#10#13#9;
@@ -569,7 +577,7 @@ begin
         L.Add(Copy(LongOpts,I,(J-I)));
       I:=J+1;
       end;
-    Result:=CheckOptions(Shortoptions,L);
+    Result:=CheckOptions(Shortoptions,L,AllErrors);
   Finally
     L.Free;
   end;