[Ada] Improve end of command line arguments detection
authorDmitriy Anisimkov <anisimko@adacore.com>
Thu, 12 Dec 2019 10:01:41 +0000 (10:01 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 12 Dec 2019 10:01:41 +0000 (10:01 +0000)
2019-12-12  Dmitriy Anisimkov  <anisimko@adacore.com>

gcc/ada/

* libgnat/g-comlin.ads (Get_Argument): New routine similar to
original Get_Argument but with one more out parameter
End_Of_Arguments.
(Get_Arguments): Comment improved.
* libgnat/g-comlin.adb (Get_Argument): Implementation taken from
original Get_Argument and improved.
(Get_Argument): Calls new routine Get_Argument with additional
parameter.

From-SVN: r279277

gcc/ada/ChangeLog
gcc/ada/libgnat/g-comlin.adb
gcc/ada/libgnat/g-comlin.ads

index e454613bd289bfa6cb05bf2d80d85a54adea8844..8756dd7c7b794a0c6706393fb4c81fc095dd44fd 100644 (file)
@@ -1,3 +1,14 @@
+2019-12-12  Dmitriy Anisimkov  <anisimko@adacore.com>
+
+       * libgnat/g-comlin.ads (Get_Argument): New routine similar to
+       original Get_Argument but with one more out parameter
+       End_Of_Arguments.
+       (Get_Arguments): Comment improved.
+       * libgnat/g-comlin.adb (Get_Argument): Implementation taken from
+       original Get_Argument and improved.
+       (Get_Argument): Calls new routine Get_Argument with additional
+       parameter.
+
 2019-12-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils.c (potential_alignment_gap): Delete.
index e3fac5bc82f1c566723c37fccbde72ca08df6cdb..ec057a9d94ff67f7ae256d744e3109a8b6a5a551 100644 (file)
@@ -385,10 +385,25 @@ package body GNAT.Command_Line is
    ------------------
 
    function Get_Argument
-     (Do_Expansion : Boolean    := False;
+     (Do_Expansion : Boolean := False;
       Parser       : Opt_Parser := Command_Line_Parser) return String
    is
+      End_Of_Args : Boolean;
    begin
+      return Get_Argument (Do_Expansion, Parser, End_Of_Args);
+   end Get_Argument;
+
+   ------------------
+   -- Get_Argument --
+   ------------------
+
+   function Get_Argument
+     (Do_Expansion     : Boolean    := False;
+      Parser           : Opt_Parser := Command_Line_Parser;
+      End_Of_Arguments : out Boolean) return String is
+   begin
+      End_Of_Arguments := False;
+
       if Parser.In_Expansion then
          declare
             S : constant String := Expansion (Parser.Expansion_It);
@@ -415,6 +430,7 @@ package body GNAT.Command_Line is
             end loop;
 
          else
+            End_Of_Arguments := True;
             return String'(1 .. 0 => ' ');
          end if;
 
@@ -436,9 +452,11 @@ package body GNAT.Command_Line is
       end loop;
 
       if Parser.Current_Argument > Parser.Arg_Count then
+         End_Of_Arguments := True;
          return String'(1 .. 0 => ' ');
+
       elsif Parser.Section (Parser.Current_Argument) = 0 then
-         return Get_Argument (Do_Expansion);
+         return Get_Argument (Do_Expansion, Parser, End_Of_Arguments);
       end if;
 
       Parser.Current_Argument := Parser.Current_Argument + 1;
@@ -451,13 +469,10 @@ package body GNAT.Command_Line is
                       Argument (Parser, Parser.Current_Argument - 1);
          begin
             for Index in Arg'Range loop
-               if Arg (Index) = '*'
-                 or else Arg (Index) = '?'
-                 or else Arg (Index) = '['
-               then
+               if Arg (Index) in '*' | '?' | '[' then
                   Parser.In_Expansion := True;
                   Start_Expansion (Parser.Expansion_It, Arg);
-                  return Get_Argument (Do_Expansion, Parser);
+                  return Get_Argument (Do_Expansion, Parser, End_Of_Arguments);
                end if;
             end loop;
          end;
index 188b03506ad7ffe2e2f8469b70ae8cd26c8bc738..34feee7b96ef4b2bbbe08e2d9b19f3697a9dc9b1 100644 (file)
@@ -462,8 +462,9 @@ package GNAT.Command_Line is
    function Get_Argument
      (Do_Expansion : Boolean := False;
       Parser       : Opt_Parser := Command_Line_Parser) return String;
-   --  Returns the next element on the command line that is not a switch.  This
-   --  function should not be called before Getopt has returned ASCII.NUL.
+   --  Returns the next element on the command line that is not a switch. This
+   --  function should be called either after Getopt has returned ASCII.NUL or
+   --  after Getopt procedure call.
    --
    --  If Do_Expansion is True, then the parameter on the command line will
    --  be considered as a filename with wildcards, and will be expanded. The
@@ -472,6 +473,16 @@ package GNAT.Command_Line is
    --  When there are no more arguments on the command line, this function
    --  returns an empty string.
 
+   function Get_Argument
+     (Do_Expansion     : Boolean    := False;
+      Parser           : Opt_Parser := Command_Line_Parser;
+      End_Of_Arguments : out Boolean) return String;
+   --  The same as above but able to distinguish empty element in argument list
+   --  from end of arguments.
+   --  End_Of_Arguments is True if the end of the command line has been reached
+   --  (i.e. all available arguments have been returned by previous calls to
+   --  Get_Argument).
+
    function Parameter
      (Parser : Opt_Parser := Command_Line_Parser) return String;
    --  Returns parameter associated with the last switch returned by Getopt.