[Ada] Improve end of command line arguments detection

Message ID 20191212100430.GA114620@adacore.com
State New
Headers show
Series
  • [Ada] Improve end of command line arguments detection
Related show

Commit Message

Pierre-Marie de Rodat Dec. 12, 2019, 10:04 a.m.
Add routine Get_Argument with End_Of_Arguments Boolean out parameter
into GNAT.Command_Line API to distinguish between the empty argument and
the end of arguments.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.

Patch

--- gcc/ada/libgnat/g-comlin.adb
+++ gcc/ada/libgnat/g-comlin.adb
@@ -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;

--- gcc/ada/libgnat/g-comlin.ads
+++ gcc/ada/libgnat/g-comlin.ads
@@ -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.