1-- { dg-do compile } 2-- { dg-options "-gnatws -O3" } 3-- { dg-options "-gnatws -O3 -msse" { target i?86-*-* x86_64-*-* } } 4 5with System.Soft_Links; 6 7package body Loop_Optimization9 is 8 9 package SSL renames System.Soft_Links; 10 11 First_Temp_File_Name : constant String := "GNAT-TEMP-000000.TMP"; 12 13 Current_Temp_File_Name : String := First_Temp_File_Name; 14 15 Temp_File_Name_Last_Digit : constant Positive := 16 First_Temp_File_Name'Last - 4; 17 18 function Argument_String_To_List 19 (Arg_String : String) return Argument_List_Access 20 is 21 Max_Args : constant Integer := Arg_String'Length; 22 New_Argv : Argument_List (1 .. Max_Args); 23 New_Argc : Natural := 0; 24 Idx : Integer; 25 26 begin 27 Idx := Arg_String'First; 28 29 loop 30 exit when Idx > Arg_String'Last; 31 32 declare 33 Quoted : Boolean := False; 34 Backqd : Boolean := False; 35 Old_Idx : Integer; 36 37 begin 38 Old_Idx := Idx; 39 40 loop 41 -- An unquoted space is the end of an argument 42 43 if not (Backqd or Quoted) 44 and then Arg_String (Idx) = ' ' 45 then 46 exit; 47 48 -- Start of a quoted string 49 50 elsif not (Backqd or Quoted) 51 and then Arg_String (Idx) = '"' 52 then 53 Quoted := True; 54 55 -- End of a quoted string and end of an argument 56 57 elsif (Quoted and not Backqd) 58 and then Arg_String (Idx) = '"' 59 then 60 Idx := Idx + 1; 61 exit; 62 63 -- Following character is backquoted 64 65 elsif Arg_String (Idx) = '\' then 66 Backqd := True; 67 68 -- Turn off backquoting after advancing one character 69 70 elsif Backqd then 71 Backqd := False; 72 73 end if; 74 75 Idx := Idx + 1; 76 exit when Idx > Arg_String'Last; 77 end loop; 78 79 -- Found an argument 80 81 New_Argc := New_Argc + 1; 82 New_Argv (New_Argc) := 83 new String'(Arg_String (Old_Idx .. Idx - 1)); 84 end; 85 end loop; 86 87 return new Argument_List'(New_Argv (1 .. New_Argc)); 88 end Argument_String_To_List; 89 90 procedure Create_Temp_File_Internal 91 (FD : out File_Descriptor; 92 Name : out String_Access) 93 is 94 Pos : Positive; 95 begin 96 File_Loop : loop 97 Locked : begin 98 Pos := Temp_File_Name_Last_Digit; 99 100 Digit_Loop : 101 loop 102 case Current_Temp_File_Name (Pos) is 103 when '0' .. '8' => 104 Current_Temp_File_Name (Pos) := 105 Character'Succ (Current_Temp_File_Name (Pos)); 106 exit Digit_Loop; 107 108 when '9' => 109 Current_Temp_File_Name (Pos) := '0'; 110 Pos := Pos - 1; 111 112 when others => 113 114 SSL.Unlock_Task.all; 115 FD := 0; 116 Name := null; 117 exit File_Loop; 118 end case; 119 end loop Digit_Loop; 120 end Locked; 121 end loop File_Loop; 122 end Create_Temp_File_Internal; 123 124end Loop_Optimization9; 125