Commit 1b72a563 by Justin Squirek Committed by Pierre-Marie de Rodat

[Ada] Argument_String_To_List creates empty items from whitespace

This patch corrects an issue whereby leading whitespace in a non-quoted
argument list passed to Argument_String_To_List caused extraneous empty
arguments to be returned.

2018-07-17  Justin Squirek  <squirek@adacore.com>

gcc/ada/

	* libgnat/s-os_lib.adb (Argument_String_To_List): Fix trimming of
	whitespace.

gcc/testsuite/

	* gnat.dg/split_args.adb: New testcase.

From-SVN: r262783
parent e6bc029a
2018-07-17 Justin Squirek <squirek@adacore.com>
* libgnat/s-os_lib.adb (Argument_String_To_List): Fix trimming of
whitespace.
2018-07-17 Hristian Kirtchev <kirtchev@adacore.com> 2018-07-17 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Has_Visible_State): Do not consider constants as * sem_prag.adb (Has_Visible_State): Do not consider constants as
......
...@@ -178,7 +178,6 @@ package body System.OS_Lib is ...@@ -178,7 +178,6 @@ package body System.OS_Lib is
return Len; return Len;
end Args_Length; end Args_Length;
----------------------------- -----------------------------
-- Argument_String_To_List -- -- Argument_String_To_List --
----------------------------- -----------------------------
...@@ -191,6 +190,9 @@ package body System.OS_Lib is ...@@ -191,6 +190,9 @@ package body System.OS_Lib is
Idx : Integer; Idx : Integer;
New_Argc : Natural := 0; New_Argc : Natural := 0;
Backqd : Boolean := False;
Quoted : Boolean := False;
Cleaned : String (1 .. Arg_String'Length); Cleaned : String (1 .. Arg_String'Length);
Cleaned_Idx : Natural; Cleaned_Idx : Natural;
-- A cleaned up version of the argument. This function is taking -- A cleaned up version of the argument. This function is taking
...@@ -205,14 +207,17 @@ package body System.OS_Lib is ...@@ -205,14 +207,17 @@ package body System.OS_Lib is
Idx := Arg_String'First; Idx := Arg_String'First;
loop loop
exit when Idx > Arg_String'Last; -- Skip extraneous spaces
declare while Idx <= Arg_String'Last and then Arg_String (Idx) = ' ' loop
Backqd : Boolean := False; Idx := Idx + 1;
Quoted : Boolean := False; end loop;
exit when Idx > Arg_String'Last;
begin
Cleaned_Idx := Cleaned'First; Cleaned_Idx := Cleaned'First;
Backqd := False;
Quoted := False;
loop loop
-- An unquoted space is the end of an argument -- An unquoted space is the end of an argument
...@@ -267,13 +272,6 @@ package body System.OS_Lib is ...@@ -267,13 +272,6 @@ package body System.OS_Lib is
New_Argc := New_Argc + 1; New_Argc := New_Argc + 1;
New_Argv (New_Argc) := New_Argv (New_Argc) :=
new String'(Cleaned (Cleaned'First .. Cleaned_Idx - 1)); new String'(Cleaned (Cleaned'First .. Cleaned_Idx - 1));
-- Skip extraneous spaces
while Idx <= Arg_String'Last and then Arg_String (Idx) = ' ' loop
Idx := Idx + 1;
end loop;
end;
end loop; end loop;
return new Argument_List'(New_Argv (1 .. New_Argc)); return new Argument_List'(New_Argv (1 .. New_Argc));
......
2018-07-17 Justin Squirek <squirek@adacore.com>
* gnat.dg/split_args.adb: New testcase.
2018-07-17 Ed Schonberg <schonberg@adacore.com> 2018-07-17 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/discr54.adb, gnat.dg/discr54_pkg.ads: New testcase. * gnat.dg/discr54.adb, gnat.dg/discr54_pkg.ads: New testcase.
......
-- { dg-do run }
-- { dg-options "-gnatws" }
with System.OS_Lib; use System.OS_Lib;
procedure Split_Args is
X : constant Argument_List_Access :=
Argument_String_To_List (" -v");
begin
if X'Length /= 1 then
raise Program_Error;
end if;
end Split_Args;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment