annotate gcc/ada/libgnat/a-direct.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- A D A . D I R E C T O R I E S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 2004-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Calendar; use Ada.Calendar;
kono
parents:
diff changeset
33 with Ada.Calendar.Formatting; use Ada.Calendar.Formatting;
kono
parents:
diff changeset
34 with Ada.Characters.Handling; use Ada.Characters.Handling;
kono
parents:
diff changeset
35 with Ada.Directories.Validity; use Ada.Directories.Validity;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 with Ada.Directories.Hierarchical_File_Names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 use Ada.Directories.Hierarchical_File_Names;
111
kono
parents:
diff changeset
38 with Ada.Strings.Fixed;
kono
parents:
diff changeset
39 with Ada.Strings.Maps; use Ada.Strings.Maps;
kono
parents:
diff changeset
40 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
41 with Ada.Unchecked_Deallocation;
kono
parents:
diff changeset
42
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
43 with Interfaces.C;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44
111
kono
parents:
diff changeset
45 with System; use System;
kono
parents:
diff changeset
46 with System.CRTL; use System.CRTL;
kono
parents:
diff changeset
47 with System.File_Attributes; use System.File_Attributes;
kono
parents:
diff changeset
48 with System.File_IO; use System.File_IO;
kono
parents:
diff changeset
49 with System.OS_Constants; use System.OS_Constants;
kono
parents:
diff changeset
50 with System.OS_Lib; use System.OS_Lib;
kono
parents:
diff changeset
51 with System.Regexp; use System.Regexp;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 package body Ada.Directories is
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 type Dir_Type_Value is new Address;
kono
parents:
diff changeset
56 -- This is the low-level address directory structure as returned by the C
kono
parents:
diff changeset
57 -- opendir routine.
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 No_Dir : constant Dir_Type_Value := Dir_Type_Value (Null_Address);
kono
parents:
diff changeset
60 -- Null directory value
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 Dir_Separator : constant Character;
kono
parents:
diff changeset
63 pragma Import (C, Dir_Separator, "__gnat_dir_separator");
kono
parents:
diff changeset
64 -- Running system default directory separator
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 Dir_Seps : constant Character_Set := Strings.Maps.To_Set ("/\");
kono
parents:
diff changeset
67 -- UNIX and DOS style directory separators
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 Max_Path : Integer;
kono
parents:
diff changeset
70 pragma Import (C, Max_Path, "__gnat_max_path_len");
kono
parents:
diff changeset
71 -- The maximum length of a path
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 type Search_Data is record
kono
parents:
diff changeset
74 Is_Valid : Boolean := False;
kono
parents:
diff changeset
75 Name : Unbounded_String;
kono
parents:
diff changeset
76 Pattern : Regexp;
kono
parents:
diff changeset
77 Filter : Filter_Type;
kono
parents:
diff changeset
78 Dir : Dir_Type_Value := No_Dir;
kono
parents:
diff changeset
79 Entry_Fetched : Boolean := False;
kono
parents:
diff changeset
80 Dir_Entry : Directory_Entry_Type;
kono
parents:
diff changeset
81 end record;
kono
parents:
diff changeset
82 -- The current state of a search
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 Empty_String : constant String := (1 .. 0 => ASCII.NUL);
kono
parents:
diff changeset
85 -- Empty string, returned by function Extension when there is no extension
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 procedure Free is new Ada.Unchecked_Deallocation (Search_Data, Search_Ptr);
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 procedure Close (Dir : Dir_Type_Value);
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 function File_Exists (Name : String) return Boolean;
kono
parents:
diff changeset
92 -- Returns True if the named file exists
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 procedure Fetch_Next_Entry (Search : Search_Type);
kono
parents:
diff changeset
95 -- Get the next entry in a directory, setting Entry_Fetched if successful
kono
parents:
diff changeset
96 -- or resetting Is_Valid if not.
kono
parents:
diff changeset
97
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 procedure Start_Search_Internal
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 (Search : in out Search_Type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 Directory : String;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 Pattern : String;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102 Filter : Filter_Type := (others => True);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 Force_Case_Insensitive : Boolean);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 -- Similar to Start_Search except we can force a search to be
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 -- case-insensitive, which is important for detecting the name-case
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 -- equivalence for a given directory.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107
111
kono
parents:
diff changeset
108 ---------------
kono
parents:
diff changeset
109 -- Base_Name --
kono
parents:
diff changeset
110 ---------------
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 function Base_Name (Name : String) return String is
kono
parents:
diff changeset
113 Simple : constant String := Simple_Name (Name);
kono
parents:
diff changeset
114 -- Simple'First is guaranteed to be 1
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 begin
kono
parents:
diff changeset
117 -- Look for the last dot in the file name and return the part of the
kono
parents:
diff changeset
118 -- file name preceding this last dot. If the first dot is the first
kono
parents:
diff changeset
119 -- character of the file name, the base name is the empty string.
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 for Pos in reverse Simple'Range loop
kono
parents:
diff changeset
122 if Simple (Pos) = '.' then
kono
parents:
diff changeset
123 return Simple (1 .. Pos - 1);
kono
parents:
diff changeset
124 end if;
kono
parents:
diff changeset
125 end loop;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 -- If there is no dot, return the complete file name
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 return Simple;
kono
parents:
diff changeset
130 end Base_Name;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 -----------
kono
parents:
diff changeset
133 -- Close --
kono
parents:
diff changeset
134 -----------
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 procedure Close (Dir : Dir_Type_Value) is
kono
parents:
diff changeset
137 Discard : Integer;
kono
parents:
diff changeset
138 pragma Warnings (Off, Discard);
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 function closedir (directory : DIRs) return Integer;
kono
parents:
diff changeset
141 pragma Import (C, closedir, "__gnat_closedir");
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 begin
kono
parents:
diff changeset
144 Discard := closedir (DIRs (Dir));
kono
parents:
diff changeset
145 end Close;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 -------------
kono
parents:
diff changeset
148 -- Compose --
kono
parents:
diff changeset
149 -------------
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 function Compose
kono
parents:
diff changeset
152 (Containing_Directory : String := "";
kono
parents:
diff changeset
153 Name : String;
kono
parents:
diff changeset
154 Extension : String := "") return String
kono
parents:
diff changeset
155 is
kono
parents:
diff changeset
156 Result : String (1 .. Containing_Directory'Length +
kono
parents:
diff changeset
157 Name'Length + Extension'Length + 2);
kono
parents:
diff changeset
158 Last : Natural;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 begin
kono
parents:
diff changeset
161 -- First, deal with the invalid cases
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 if Containing_Directory /= ""
kono
parents:
diff changeset
164 and then not Is_Valid_Path_Name (Containing_Directory)
kono
parents:
diff changeset
165 then
kono
parents:
diff changeset
166 raise Name_Error with
kono
parents:
diff changeset
167 "invalid directory path name """ & Containing_Directory & '"';
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 elsif
kono
parents:
diff changeset
170 Extension'Length = 0 and then (not Is_Valid_Simple_Name (Name))
kono
parents:
diff changeset
171 then
kono
parents:
diff changeset
172 raise Name_Error with
kono
parents:
diff changeset
173 "invalid simple name """ & Name & '"';
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 elsif Extension'Length /= 0
kono
parents:
diff changeset
176 and then not Is_Valid_Simple_Name (Name & '.' & Extension)
kono
parents:
diff changeset
177 then
kono
parents:
diff changeset
178 raise Name_Error with
kono
parents:
diff changeset
179 "invalid file name """ & Name & '.' & Extension & '"';
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 -- This is not an invalid case so build the path name
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 else
kono
parents:
diff changeset
184 Last := Containing_Directory'Length;
kono
parents:
diff changeset
185 Result (1 .. Last) := Containing_Directory;
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 -- Add a directory separator if needed
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 if Last /= 0 and then not Is_In (Result (Last), Dir_Seps) then
kono
parents:
diff changeset
190 Last := Last + 1;
kono
parents:
diff changeset
191 Result (Last) := Dir_Separator;
kono
parents:
diff changeset
192 end if;
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 -- Add the file name
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 Result (Last + 1 .. Last + Name'Length) := Name;
kono
parents:
diff changeset
197 Last := Last + Name'Length;
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 -- If extension was specified, add dot followed by this extension
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 if Extension'Length /= 0 then
kono
parents:
diff changeset
202 Last := Last + 1;
kono
parents:
diff changeset
203 Result (Last) := '.';
kono
parents:
diff changeset
204 Result (Last + 1 .. Last + Extension'Length) := Extension;
kono
parents:
diff changeset
205 Last := Last + Extension'Length;
kono
parents:
diff changeset
206 end if;
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 return Result (1 .. Last);
kono
parents:
diff changeset
209 end if;
kono
parents:
diff changeset
210 end Compose;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 --------------------------
kono
parents:
diff changeset
213 -- Containing_Directory --
kono
parents:
diff changeset
214 --------------------------
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 function Containing_Directory (Name : String) return String is
kono
parents:
diff changeset
217 begin
kono
parents:
diff changeset
218 -- First, the invalid case
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
221 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 else
kono
parents:
diff changeset
224 declare
kono
parents:
diff changeset
225 Last_DS : constant Natural :=
kono
parents:
diff changeset
226 Strings.Fixed.Index (Name, Dir_Seps, Going => Strings.Backward);
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 begin
kono
parents:
diff changeset
229 -- If Name indicates a root directory, raise Use_Error, because
kono
parents:
diff changeset
230 -- it has no containing directory.
kono
parents:
diff changeset
231
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 if Is_Parent_Directory_Name (Name)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 or else Is_Current_Directory_Name (Name)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 or else Is_Root_Directory_Name (Name)
111
kono
parents:
diff changeset
235 then
kono
parents:
diff changeset
236 raise Use_Error with
kono
parents:
diff changeset
237 "directory """ & Name & """ has no containing directory";
kono
parents:
diff changeset
238
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
239 elsif Last_DS = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 -- There is no directory separator, so return ".", representing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
241 -- the current working directory.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 return ".";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244
111
kono
parents:
diff changeset
245 else
kono
parents:
diff changeset
246 declare
kono
parents:
diff changeset
247 Last : Positive := Last_DS - Name'First + 1;
kono
parents:
diff changeset
248 Result : String (1 .. Last);
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 begin
kono
parents:
diff changeset
251 Result := Name (Name'First .. Last_DS);
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 -- Remove any trailing directory separator, except as the
kono
parents:
diff changeset
254 -- first character or the first character following a drive
kono
parents:
diff changeset
255 -- number on Windows.
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 while Last > 1 loop
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 exit when Is_Root_Directory_Name (Result (1 .. Last))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 or else (Result (Last) /= Directory_Separator
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 and then Result (Last) /= '/');
111
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 Last := Last - 1;
kono
parents:
diff changeset
263 end loop;
kono
parents:
diff changeset
264
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 return Result (1 .. Last);
111
kono
parents:
diff changeset
266 end;
kono
parents:
diff changeset
267 end if;
kono
parents:
diff changeset
268 end;
kono
parents:
diff changeset
269 end if;
kono
parents:
diff changeset
270 end Containing_Directory;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 ---------------
kono
parents:
diff changeset
273 -- Copy_File --
kono
parents:
diff changeset
274 ---------------
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 procedure Copy_File
kono
parents:
diff changeset
277 (Source_Name : String;
kono
parents:
diff changeset
278 Target_Name : String;
kono
parents:
diff changeset
279 Form : String := "")
kono
parents:
diff changeset
280 is
kono
parents:
diff changeset
281 Success : Boolean;
kono
parents:
diff changeset
282 Mode : Copy_Mode := Overwrite;
kono
parents:
diff changeset
283 Preserve : Attribute := None;
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 begin
kono
parents:
diff changeset
286 -- First, the invalid cases
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 if not Is_Valid_Path_Name (Source_Name) then
kono
parents:
diff changeset
289 raise Name_Error with
kono
parents:
diff changeset
290 "invalid source path name """ & Source_Name & '"';
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 elsif not Is_Valid_Path_Name (Target_Name) then
kono
parents:
diff changeset
293 raise Name_Error with
kono
parents:
diff changeset
294 "invalid target path name """ & Target_Name & '"';
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 elsif not Is_Regular_File (Source_Name) then
kono
parents:
diff changeset
297 raise Name_Error with '"' & Source_Name & """ is not a file";
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 elsif Is_Directory (Target_Name) then
kono
parents:
diff changeset
300 raise Use_Error with "target """ & Target_Name & """ is a directory";
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 else
kono
parents:
diff changeset
303 if Form'Length > 0 then
kono
parents:
diff changeset
304 declare
kono
parents:
diff changeset
305 Formstr : String (1 .. Form'Length + 1);
kono
parents:
diff changeset
306 V1, V2 : Natural;
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 begin
kono
parents:
diff changeset
309 -- Acquire form string, setting required NUL terminator
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Formstr (1 .. Form'Length) := Form;
kono
parents:
diff changeset
312 Formstr (Formstr'Last) := ASCII.NUL;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 -- Convert form string to lower case
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 for J in Formstr'Range loop
kono
parents:
diff changeset
317 if Formstr (J) in 'A' .. 'Z' then
kono
parents:
diff changeset
318 Formstr (J) :=
kono
parents:
diff changeset
319 Character'Val (Character'Pos (Formstr (J)) + 32);
kono
parents:
diff changeset
320 end if;
kono
parents:
diff changeset
321 end loop;
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 -- Check Form
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 Form_Parameter (Formstr, "mode", V1, V2);
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 if V1 = 0 then
kono
parents:
diff changeset
328 Mode := Overwrite;
kono
parents:
diff changeset
329 elsif Formstr (V1 .. V2) = "copy" then
kono
parents:
diff changeset
330 Mode := Copy;
kono
parents:
diff changeset
331 elsif Formstr (V1 .. V2) = "overwrite" then
kono
parents:
diff changeset
332 Mode := Overwrite;
kono
parents:
diff changeset
333 elsif Formstr (V1 .. V2) = "append" then
kono
parents:
diff changeset
334 Mode := Append;
kono
parents:
diff changeset
335 else
kono
parents:
diff changeset
336 raise Use_Error with "invalid Form";
kono
parents:
diff changeset
337 end if;
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 Form_Parameter (Formstr, "preserve", V1, V2);
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 if V1 = 0 then
kono
parents:
diff changeset
342 Preserve := None;
kono
parents:
diff changeset
343 elsif Formstr (V1 .. V2) = "timestamps" then
kono
parents:
diff changeset
344 Preserve := Time_Stamps;
kono
parents:
diff changeset
345 elsif Formstr (V1 .. V2) = "all_attributes" then
kono
parents:
diff changeset
346 Preserve := Full;
kono
parents:
diff changeset
347 elsif Formstr (V1 .. V2) = "no_attributes" then
kono
parents:
diff changeset
348 Preserve := None;
kono
parents:
diff changeset
349 else
kono
parents:
diff changeset
350 raise Use_Error with "invalid Form";
kono
parents:
diff changeset
351 end if;
kono
parents:
diff changeset
352 end;
kono
parents:
diff changeset
353 end if;
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 -- Do actual copy using System.OS_Lib.Copy_File
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 Copy_File (Source_Name, Target_Name, Success, Mode, Preserve);
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 if not Success then
kono
parents:
diff changeset
360 raise Use_Error with "copy of """ & Source_Name & """ failed";
kono
parents:
diff changeset
361 end if;
kono
parents:
diff changeset
362 end if;
kono
parents:
diff changeset
363 end Copy_File;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 ----------------------
kono
parents:
diff changeset
366 -- Create_Directory --
kono
parents:
diff changeset
367 ----------------------
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 procedure Create_Directory
kono
parents:
diff changeset
370 (New_Directory : String;
kono
parents:
diff changeset
371 Form : String := "")
kono
parents:
diff changeset
372 is
kono
parents:
diff changeset
373 C_Dir_Name : constant String := New_Directory & ASCII.NUL;
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 begin
kono
parents:
diff changeset
376 -- First, the invalid case
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 if not Is_Valid_Path_Name (New_Directory) then
kono
parents:
diff changeset
379 raise Name_Error with
kono
parents:
diff changeset
380 "invalid new directory path name """ & New_Directory & '"';
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 else
kono
parents:
diff changeset
383 -- Acquire setting of encoding parameter
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 declare
kono
parents:
diff changeset
386 Formstr : constant String := To_Lower (Form);
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 Encoding : CRTL.Filename_Encoding;
kono
parents:
diff changeset
389 -- Filename encoding specified into the form parameter
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 V1, V2 : Natural;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 begin
kono
parents:
diff changeset
394 Form_Parameter (Formstr, "encoding", V1, V2);
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 if V1 = 0 then
kono
parents:
diff changeset
397 Encoding := CRTL.Unspecified;
kono
parents:
diff changeset
398 elsif Formstr (V1 .. V2) = "utf8" then
kono
parents:
diff changeset
399 Encoding := CRTL.UTF8;
kono
parents:
diff changeset
400 elsif Formstr (V1 .. V2) = "8bits" then
kono
parents:
diff changeset
401 Encoding := CRTL.ASCII_8bits;
kono
parents:
diff changeset
402 else
kono
parents:
diff changeset
403 raise Use_Error with "invalid Form";
kono
parents:
diff changeset
404 end if;
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 if CRTL.mkdir (C_Dir_Name, Encoding) /= 0 then
kono
parents:
diff changeset
407 raise Use_Error with
kono
parents:
diff changeset
408 "creation of new directory """ & New_Directory & """ failed";
kono
parents:
diff changeset
409 end if;
kono
parents:
diff changeset
410 end;
kono
parents:
diff changeset
411 end if;
kono
parents:
diff changeset
412 end Create_Directory;
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 -----------------
kono
parents:
diff changeset
415 -- Create_Path --
kono
parents:
diff changeset
416 -----------------
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 procedure Create_Path
kono
parents:
diff changeset
419 (New_Directory : String;
kono
parents:
diff changeset
420 Form : String := "")
kono
parents:
diff changeset
421 is
kono
parents:
diff changeset
422 New_Dir : String (1 .. New_Directory'Length + 1);
kono
parents:
diff changeset
423 Last : Positive := 1;
kono
parents:
diff changeset
424 Start : Positive := 1;
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 begin
kono
parents:
diff changeset
427 -- First, the invalid case
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 if not Is_Valid_Path_Name (New_Directory) then
kono
parents:
diff changeset
430 raise Name_Error with
kono
parents:
diff changeset
431 "invalid new directory path name """ & New_Directory & '"';
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 else
kono
parents:
diff changeset
434 -- Build New_Dir with a directory separator at the end, so that the
kono
parents:
diff changeset
435 -- complete path will be found in the loop below.
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 New_Dir (1 .. New_Directory'Length) := New_Directory;
kono
parents:
diff changeset
438 New_Dir (New_Dir'Last) := Directory_Separator;
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 -- If host is windows, and the first two characters are directory
kono
parents:
diff changeset
441 -- separators, we have an UNC path. Skip it.
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 if Directory_Separator = '\'
kono
parents:
diff changeset
444 and then New_Dir'Length > 2
kono
parents:
diff changeset
445 and then Is_In (New_Dir (1), Dir_Seps)
kono
parents:
diff changeset
446 and then Is_In (New_Dir (2), Dir_Seps)
kono
parents:
diff changeset
447 then
kono
parents:
diff changeset
448 Start := 2;
kono
parents:
diff changeset
449 loop
kono
parents:
diff changeset
450 Start := Start + 1;
kono
parents:
diff changeset
451 exit when Start = New_Dir'Last
kono
parents:
diff changeset
452 or else Is_In (New_Dir (Start), Dir_Seps);
kono
parents:
diff changeset
453 end loop;
kono
parents:
diff changeset
454 end if;
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 -- Create, if necessary, each directory in the path
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 for J in Start + 1 .. New_Dir'Last loop
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 -- Look for the end of an intermediate directory
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 if not Is_In (New_Dir (J), Dir_Seps) then
kono
parents:
diff changeset
463 Last := J;
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 -- We have found a new intermediate directory each time we find
kono
parents:
diff changeset
466 -- a first directory separator.
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 elsif not Is_In (New_Dir (J - 1), Dir_Seps) then
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 -- No need to create the directory if it already exists
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 if not Is_Directory (New_Dir (1 .. Last)) then
kono
parents:
diff changeset
473 begin
kono
parents:
diff changeset
474 Create_Directory
kono
parents:
diff changeset
475 (New_Directory => New_Dir (1 .. Last), Form => Form);
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 exception
kono
parents:
diff changeset
478 when Use_Error =>
kono
parents:
diff changeset
479 if File_Exists (New_Dir (1 .. Last)) then
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 -- A file with such a name already exists. If it is
kono
parents:
diff changeset
482 -- a directory, then it was apparently just created
kono
parents:
diff changeset
483 -- by another process or thread, and all is well.
kono
parents:
diff changeset
484 -- If it is of some other kind, report an error.
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 if not Is_Directory (New_Dir (1 .. Last)) then
kono
parents:
diff changeset
487 raise Use_Error with
kono
parents:
diff changeset
488 "file """ & New_Dir (1 .. Last) &
kono
parents:
diff changeset
489 """ already exists and is not a directory";
kono
parents:
diff changeset
490 end if;
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 else
kono
parents:
diff changeset
493 -- Create_Directory failed for some other reason:
kono
parents:
diff changeset
494 -- propagate the exception.
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 raise;
kono
parents:
diff changeset
497 end if;
kono
parents:
diff changeset
498 end;
kono
parents:
diff changeset
499 end if;
kono
parents:
diff changeset
500 end if;
kono
parents:
diff changeset
501 end loop;
kono
parents:
diff changeset
502 end if;
kono
parents:
diff changeset
503 end Create_Path;
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 -----------------------
kono
parents:
diff changeset
506 -- Current_Directory --
kono
parents:
diff changeset
507 -----------------------
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 function Current_Directory return String is
kono
parents:
diff changeset
510 Path_Len : Natural := Max_Path;
kono
parents:
diff changeset
511 Buffer : String (1 .. 1 + Max_Path + 1);
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 procedure Local_Get_Current_Dir (Dir : Address; Length : Address);
kono
parents:
diff changeset
514 pragma Import (C, Local_Get_Current_Dir, "__gnat_get_current_dir");
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 begin
kono
parents:
diff changeset
517 Local_Get_Current_Dir (Buffer'Address, Path_Len'Address);
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 if Path_Len = 0 then
kono
parents:
diff changeset
520 raise Use_Error with "current directory does not exist";
kono
parents:
diff changeset
521 end if;
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 -- We need to resolve links because of RM A.16(47), which requires
kono
parents:
diff changeset
524 -- that we not return alternative names for files.
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 return Normalize_Pathname (Buffer (1 .. Path_Len));
kono
parents:
diff changeset
527 end Current_Directory;
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 ----------------------
kono
parents:
diff changeset
530 -- Delete_Directory --
kono
parents:
diff changeset
531 ----------------------
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 procedure Delete_Directory (Directory : String) is
kono
parents:
diff changeset
534 begin
kono
parents:
diff changeset
535 -- First, the invalid cases
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 if not Is_Valid_Path_Name (Directory) then
kono
parents:
diff changeset
538 raise Name_Error with
kono
parents:
diff changeset
539 "invalid directory path name """ & Directory & '"';
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 elsif not Is_Directory (Directory) then
kono
parents:
diff changeset
542 raise Name_Error with '"' & Directory & """ not a directory";
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 -- Do the deletion, checking for error
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 else
kono
parents:
diff changeset
547 declare
kono
parents:
diff changeset
548 C_Dir_Name : constant String := Directory & ASCII.NUL;
kono
parents:
diff changeset
549 begin
kono
parents:
diff changeset
550 if rmdir (C_Dir_Name) /= 0 then
kono
parents:
diff changeset
551 raise Use_Error with
kono
parents:
diff changeset
552 "deletion of directory """ & Directory & """ failed";
kono
parents:
diff changeset
553 end if;
kono
parents:
diff changeset
554 end;
kono
parents:
diff changeset
555 end if;
kono
parents:
diff changeset
556 end Delete_Directory;
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 -----------------
kono
parents:
diff changeset
559 -- Delete_File --
kono
parents:
diff changeset
560 -----------------
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 procedure Delete_File (Name : String) is
kono
parents:
diff changeset
563 Success : Boolean;
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 begin
kono
parents:
diff changeset
566 -- First, the invalid cases
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
569 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 elsif not Is_Regular_File (Name)
kono
parents:
diff changeset
572 and then not Is_Symbolic_Link (Name)
kono
parents:
diff changeset
573 then
kono
parents:
diff changeset
574 raise Name_Error with "file """ & Name & """ does not exist";
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 else
kono
parents:
diff changeset
577 -- Do actual deletion using System.OS_Lib.Delete_File
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 Delete_File (Name, Success);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 if not Success then
kono
parents:
diff changeset
582 raise Use_Error with "file """ & Name & """ could not be deleted";
kono
parents:
diff changeset
583 end if;
kono
parents:
diff changeset
584 end if;
kono
parents:
diff changeset
585 end Delete_File;
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 -----------------
kono
parents:
diff changeset
588 -- Delete_Tree --
kono
parents:
diff changeset
589 -----------------
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 procedure Delete_Tree (Directory : String) is
kono
parents:
diff changeset
592 Search : Search_Type;
kono
parents:
diff changeset
593 Dir_Ent : Directory_Entry_Type;
kono
parents:
diff changeset
594 begin
kono
parents:
diff changeset
595 -- First, the invalid cases
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 if not Is_Valid_Path_Name (Directory) then
kono
parents:
diff changeset
598 raise Name_Error with
kono
parents:
diff changeset
599 "invalid directory path name """ & Directory & '"';
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 elsif not Is_Directory (Directory) then
kono
parents:
diff changeset
602 raise Name_Error with '"' & Directory & """ not a directory";
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 else
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 -- We used to change the current directory to Directory here,
kono
parents:
diff changeset
607 -- allowing the use of a local Simple_Name for all references. This
kono
parents:
diff changeset
608 -- turned out unfriendly to multitasking programs, where tasks
kono
parents:
diff changeset
609 -- running in parallel of this Delete_Tree could see their current
kono
parents:
diff changeset
610 -- directory change unpredictably. We now resort to Full_Name
kono
parents:
diff changeset
611 -- computations to reach files and subdirs instead.
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 Start_Search (Search, Directory => Directory, Pattern => "");
kono
parents:
diff changeset
614 while More_Entries (Search) loop
kono
parents:
diff changeset
615 Get_Next_Entry (Search, Dir_Ent);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 declare
kono
parents:
diff changeset
618 Fname : constant String := Full_Name (Dir_Ent);
kono
parents:
diff changeset
619 Sname : constant String := Simple_Name (Dir_Ent);
kono
parents:
diff changeset
620
kono
parents:
diff changeset
621 begin
kono
parents:
diff changeset
622 if OS_Lib.Is_Directory (Fname) then
kono
parents:
diff changeset
623 if Sname /= "." and then Sname /= ".." then
kono
parents:
diff changeset
624 Delete_Tree (Fname);
kono
parents:
diff changeset
625 end if;
kono
parents:
diff changeset
626 else
kono
parents:
diff changeset
627 Delete_File (Fname);
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629 end;
kono
parents:
diff changeset
630 end loop;
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 End_Search (Search);
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 declare
kono
parents:
diff changeset
635 C_Dir_Name : constant String := Directory & ASCII.NUL;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 begin
kono
parents:
diff changeset
638 if rmdir (C_Dir_Name) /= 0 then
kono
parents:
diff changeset
639 raise Use_Error with
kono
parents:
diff changeset
640 "directory tree rooted at """ &
kono
parents:
diff changeset
641 Directory & """ could not be deleted";
kono
parents:
diff changeset
642 end if;
kono
parents:
diff changeset
643 end;
kono
parents:
diff changeset
644 end if;
kono
parents:
diff changeset
645 end Delete_Tree;
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 ------------
kono
parents:
diff changeset
648 -- Exists --
kono
parents:
diff changeset
649 ------------
kono
parents:
diff changeset
650
kono
parents:
diff changeset
651 function Exists (Name : String) return Boolean is
kono
parents:
diff changeset
652 begin
kono
parents:
diff changeset
653 -- First, the invalid case
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
656 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 else
kono
parents:
diff changeset
659 -- The implementation is in File_Exists
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 return File_Exists (Name);
kono
parents:
diff changeset
662 end if;
kono
parents:
diff changeset
663 end Exists;
kono
parents:
diff changeset
664
kono
parents:
diff changeset
665 ---------------
kono
parents:
diff changeset
666 -- Extension --
kono
parents:
diff changeset
667 ---------------
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 function Extension (Name : String) return String is
kono
parents:
diff changeset
670 begin
kono
parents:
diff changeset
671 -- First, the invalid case
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
674 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
675
kono
parents:
diff changeset
676 else
kono
parents:
diff changeset
677 -- Look for first dot that is not followed by a directory separator
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 for Pos in reverse Name'Range loop
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 -- If a directory separator is found before a dot, there is no
kono
parents:
diff changeset
682 -- extension.
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 if Is_In (Name (Pos), Dir_Seps) then
kono
parents:
diff changeset
685 return Empty_String;
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 elsif Name (Pos) = '.' then
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 -- We found a dot, build the return value with lower bound 1
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 declare
kono
parents:
diff changeset
692 subtype Result_Type is String (1 .. Name'Last - Pos);
kono
parents:
diff changeset
693 begin
kono
parents:
diff changeset
694 return Result_Type (Name (Pos + 1 .. Name'Last));
kono
parents:
diff changeset
695 end;
kono
parents:
diff changeset
696 end if;
kono
parents:
diff changeset
697 end loop;
kono
parents:
diff changeset
698
kono
parents:
diff changeset
699 -- No dot were found, there is no extension
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 return Empty_String;
kono
parents:
diff changeset
702 end if;
kono
parents:
diff changeset
703 end Extension;
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 ----------------------
kono
parents:
diff changeset
706 -- Fetch_Next_Entry --
kono
parents:
diff changeset
707 ----------------------
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 procedure Fetch_Next_Entry (Search : Search_Type) is
kono
parents:
diff changeset
710 Name : String (1 .. NAME_MAX);
kono
parents:
diff changeset
711 Last : Natural;
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 Kind : File_Kind := Ordinary_File;
kono
parents:
diff changeset
714 -- Initialized to avoid a compilation warning
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 Filename_Addr : Address;
kono
parents:
diff changeset
717 Filename_Len : aliased Integer;
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 Buffer : array (1 .. SIZEOF_struct_dirent_alloc) of Character;
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 function readdir_gnat
kono
parents:
diff changeset
722 (Directory : Address;
kono
parents:
diff changeset
723 Buffer : Address;
kono
parents:
diff changeset
724 Last : not null access Integer) return Address;
kono
parents:
diff changeset
725 pragma Import (C, readdir_gnat, "__gnat_readdir");
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 begin
kono
parents:
diff changeset
728 -- Search.Value.Is_Valid is always True when Fetch_Next_Entry is called
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 loop
kono
parents:
diff changeset
731 Filename_Addr :=
kono
parents:
diff changeset
732 readdir_gnat
kono
parents:
diff changeset
733 (Address (Search.Value.Dir),
kono
parents:
diff changeset
734 Buffer'Address,
kono
parents:
diff changeset
735 Filename_Len'Access);
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 -- If no matching entry is found, set Is_Valid to False
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 if Filename_Addr = Null_Address then
kono
parents:
diff changeset
740 Search.Value.Is_Valid := False;
kono
parents:
diff changeset
741 exit;
kono
parents:
diff changeset
742 end if;
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 if Filename_Len > Name'Length then
kono
parents:
diff changeset
745 raise Use_Error with "file name too long";
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 declare
kono
parents:
diff changeset
749 subtype Name_String is String (1 .. Filename_Len);
kono
parents:
diff changeset
750 Dent_Name : Name_String;
kono
parents:
diff changeset
751 for Dent_Name'Address use Filename_Addr;
kono
parents:
diff changeset
752 pragma Import (Ada, Dent_Name);
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 begin
kono
parents:
diff changeset
755 Last := Filename_Len;
kono
parents:
diff changeset
756 Name (1 .. Last) := Dent_Name;
kono
parents:
diff changeset
757 end;
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 -- Check if the entry matches the pattern
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 if Match (Name (1 .. Last), Search.Value.Pattern) then
kono
parents:
diff changeset
762 declare
kono
parents:
diff changeset
763 C_Full_Name : constant String :=
kono
parents:
diff changeset
764 Compose (To_String (Search.Value.Name),
kono
parents:
diff changeset
765 Name (1 .. Last)) & ASCII.NUL;
kono
parents:
diff changeset
766 Full_Name : String renames
kono
parents:
diff changeset
767 C_Full_Name
kono
parents:
diff changeset
768 (C_Full_Name'First .. C_Full_Name'Last - 1);
kono
parents:
diff changeset
769 Found : Boolean := False;
kono
parents:
diff changeset
770 Attr : aliased File_Attributes;
kono
parents:
diff changeset
771 Exists : Integer;
kono
parents:
diff changeset
772 Error : Integer;
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 begin
kono
parents:
diff changeset
775 Reset_Attributes (Attr'Access);
kono
parents:
diff changeset
776 Exists := File_Exists_Attr (C_Full_Name'Address, Attr'Access);
kono
parents:
diff changeset
777 Error := Error_Attributes (Attr'Access);
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 if Error /= 0 then
kono
parents:
diff changeset
780 raise Use_Error
kono
parents:
diff changeset
781 with Full_Name & ": " & Errno_Message (Err => Error);
kono
parents:
diff changeset
782 end if;
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 if Exists = 1 then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 -- Ignore special directories "." and ".."
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
786
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787 if (Full_Name'Length > 1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
788 and then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 Full_Name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
790 (Full_Name'Last - 1 .. Full_Name'Last) = "\.")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
791 or else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
792 (Full_Name'Length > 2
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
793 and then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
794 Full_Name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
795 (Full_Name'Last - 2 .. Full_Name'Last) = "\..")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
796 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
797 Exists := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
798 end if;
111
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 -- Now check if the file kind matches the filter
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 if Is_Regular_File_Attr
kono
parents:
diff changeset
803 (C_Full_Name'Address, Attr'Access) = 1
kono
parents:
diff changeset
804 then
kono
parents:
diff changeset
805 if Search.Value.Filter (Ordinary_File) then
kono
parents:
diff changeset
806 Kind := Ordinary_File;
kono
parents:
diff changeset
807 Found := True;
kono
parents:
diff changeset
808 end if;
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 elsif Is_Directory_Attr
kono
parents:
diff changeset
811 (C_Full_Name'Address, Attr'Access) = 1
kono
parents:
diff changeset
812 then
kono
parents:
diff changeset
813 if Search.Value.Filter (Directory) then
kono
parents:
diff changeset
814 Kind := Directory;
kono
parents:
diff changeset
815 Found := True;
kono
parents:
diff changeset
816 end if;
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 elsif Search.Value.Filter (Special_File) then
kono
parents:
diff changeset
819 Kind := Special_File;
kono
parents:
diff changeset
820 Found := True;
kono
parents:
diff changeset
821 end if;
kono
parents:
diff changeset
822
kono
parents:
diff changeset
823 -- If it does, update Search and return
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 if Found then
kono
parents:
diff changeset
826 Search.Value.Entry_Fetched := True;
kono
parents:
diff changeset
827 Search.Value.Dir_Entry :=
kono
parents:
diff changeset
828 (Is_Valid => True,
kono
parents:
diff changeset
829 Simple => To_Unbounded_String (Name (1 .. Last)),
kono
parents:
diff changeset
830 Full => To_Unbounded_String (Full_Name),
kono
parents:
diff changeset
831 Kind => Kind);
kono
parents:
diff changeset
832 exit;
kono
parents:
diff changeset
833 end if;
kono
parents:
diff changeset
834 end if;
kono
parents:
diff changeset
835 end;
kono
parents:
diff changeset
836 end if;
kono
parents:
diff changeset
837 end loop;
kono
parents:
diff changeset
838 end Fetch_Next_Entry;
kono
parents:
diff changeset
839
kono
parents:
diff changeset
840 -----------------
kono
parents:
diff changeset
841 -- File_Exists --
kono
parents:
diff changeset
842 -----------------
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 function File_Exists (Name : String) return Boolean is
kono
parents:
diff changeset
845 function C_File_Exists (A : Address) return Integer;
kono
parents:
diff changeset
846 pragma Import (C, C_File_Exists, "__gnat_file_exists");
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 C_Name : String (1 .. Name'Length + 1);
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 begin
kono
parents:
diff changeset
851 C_Name (1 .. Name'Length) := Name;
kono
parents:
diff changeset
852 C_Name (C_Name'Last) := ASCII.NUL;
kono
parents:
diff changeset
853 return C_File_Exists (C_Name'Address) = 1;
kono
parents:
diff changeset
854 end File_Exists;
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 --------------
kono
parents:
diff changeset
857 -- Finalize --
kono
parents:
diff changeset
858 --------------
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 procedure Finalize (Search : in out Search_Type) is
kono
parents:
diff changeset
861 begin
kono
parents:
diff changeset
862 if Search.Value /= null then
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 -- Close the directory, if one is open
kono
parents:
diff changeset
865
kono
parents:
diff changeset
866 if Search.Value.Dir /= No_Dir then
kono
parents:
diff changeset
867 Close (Search.Value.Dir);
kono
parents:
diff changeset
868 end if;
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 Free (Search.Value);
kono
parents:
diff changeset
871 end if;
kono
parents:
diff changeset
872 end Finalize;
kono
parents:
diff changeset
873
kono
parents:
diff changeset
874 ---------------
kono
parents:
diff changeset
875 -- Full_Name --
kono
parents:
diff changeset
876 ---------------
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 function Full_Name (Name : String) return String is
kono
parents:
diff changeset
879 begin
kono
parents:
diff changeset
880 -- First, the invalid case
kono
parents:
diff changeset
881
kono
parents:
diff changeset
882 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
883 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 else
kono
parents:
diff changeset
886 -- Build the return value with lower bound 1
kono
parents:
diff changeset
887
kono
parents:
diff changeset
888 -- Use System.OS_Lib.Normalize_Pathname
kono
parents:
diff changeset
889
kono
parents:
diff changeset
890 declare
kono
parents:
diff changeset
891 -- We need to resolve links because of (RM A.16(47)), which says
kono
parents:
diff changeset
892 -- we must not return alternative names for files.
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 Value : constant String := Normalize_Pathname (Name);
kono
parents:
diff changeset
895 subtype Result is String (1 .. Value'Length);
kono
parents:
diff changeset
896
kono
parents:
diff changeset
897 begin
kono
parents:
diff changeset
898 return Result (Value);
kono
parents:
diff changeset
899 end;
kono
parents:
diff changeset
900 end if;
kono
parents:
diff changeset
901 end Full_Name;
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 function Full_Name (Directory_Entry : Directory_Entry_Type) return String is
kono
parents:
diff changeset
904 begin
kono
parents:
diff changeset
905 -- First, the invalid case
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 if not Directory_Entry.Is_Valid then
kono
parents:
diff changeset
908 raise Status_Error with "invalid directory entry";
kono
parents:
diff changeset
909
kono
parents:
diff changeset
910 else
kono
parents:
diff changeset
911 -- The value to return has already been computed
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 return To_String (Directory_Entry.Full);
kono
parents:
diff changeset
914 end if;
kono
parents:
diff changeset
915 end Full_Name;
kono
parents:
diff changeset
916
kono
parents:
diff changeset
917 --------------------
kono
parents:
diff changeset
918 -- Get_Next_Entry --
kono
parents:
diff changeset
919 --------------------
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 procedure Get_Next_Entry
kono
parents:
diff changeset
922 (Search : in out Search_Type;
kono
parents:
diff changeset
923 Directory_Entry : out Directory_Entry_Type)
kono
parents:
diff changeset
924 is
kono
parents:
diff changeset
925 begin
kono
parents:
diff changeset
926 -- First, the invalid case
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 if Search.Value = null or else not Search.Value.Is_Valid then
kono
parents:
diff changeset
929 raise Status_Error with "invalid search";
kono
parents:
diff changeset
930 end if;
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 -- Fetch the next entry, if needed
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 if not Search.Value.Entry_Fetched then
kono
parents:
diff changeset
935 Fetch_Next_Entry (Search);
kono
parents:
diff changeset
936 end if;
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 -- It is an error if no valid entry is found
kono
parents:
diff changeset
939
kono
parents:
diff changeset
940 if not Search.Value.Is_Valid then
kono
parents:
diff changeset
941 raise Status_Error with "no next entry";
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 else
kono
parents:
diff changeset
944 -- Reset Entry_Fetched and return the entry
kono
parents:
diff changeset
945
kono
parents:
diff changeset
946 Search.Value.Entry_Fetched := False;
kono
parents:
diff changeset
947 Directory_Entry := Search.Value.Dir_Entry;
kono
parents:
diff changeset
948 end if;
kono
parents:
diff changeset
949 end Get_Next_Entry;
kono
parents:
diff changeset
950
kono
parents:
diff changeset
951 ----------
kono
parents:
diff changeset
952 -- Kind --
kono
parents:
diff changeset
953 ----------
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 function Kind (Name : String) return File_Kind is
kono
parents:
diff changeset
956 begin
kono
parents:
diff changeset
957 -- First, the invalid case
kono
parents:
diff changeset
958
kono
parents:
diff changeset
959 if not File_Exists (Name) then
kono
parents:
diff changeset
960 raise Name_Error with "file """ & Name & """ does not exist";
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 -- If OK, return appropriate kind
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 elsif Is_Regular_File (Name) then
kono
parents:
diff changeset
965 return Ordinary_File;
kono
parents:
diff changeset
966
kono
parents:
diff changeset
967 elsif Is_Directory (Name) then
kono
parents:
diff changeset
968 return Directory;
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 else
kono
parents:
diff changeset
971 return Special_File;
kono
parents:
diff changeset
972 end if;
kono
parents:
diff changeset
973 end Kind;
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 function Kind (Directory_Entry : Directory_Entry_Type) return File_Kind is
kono
parents:
diff changeset
976 begin
kono
parents:
diff changeset
977 -- First, the invalid case
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 if not Directory_Entry.Is_Valid then
kono
parents:
diff changeset
980 raise Status_Error with "invalid directory entry";
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 else
kono
parents:
diff changeset
983 -- The value to return has already be computed
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 return Directory_Entry.Kind;
kono
parents:
diff changeset
986 end if;
kono
parents:
diff changeset
987 end Kind;
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 -----------------------
kono
parents:
diff changeset
990 -- Modification_Time --
kono
parents:
diff changeset
991 -----------------------
kono
parents:
diff changeset
992
kono
parents:
diff changeset
993 function Modification_Time (Name : String) return Time is
kono
parents:
diff changeset
994 Date : OS_Time;
kono
parents:
diff changeset
995 Year : Year_Type;
kono
parents:
diff changeset
996 Month : Month_Type;
kono
parents:
diff changeset
997 Day : Day_Type;
kono
parents:
diff changeset
998 Hour : Hour_Type;
kono
parents:
diff changeset
999 Minute : Minute_Type;
kono
parents:
diff changeset
1000 Second : Second_Type;
kono
parents:
diff changeset
1001
kono
parents:
diff changeset
1002 begin
kono
parents:
diff changeset
1003 -- First, the invalid cases
kono
parents:
diff changeset
1004
kono
parents:
diff changeset
1005 if not (Is_Regular_File (Name) or else Is_Directory (Name)) then
kono
parents:
diff changeset
1006 raise Name_Error with '"' & Name & """ not a file or directory";
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 else
kono
parents:
diff changeset
1009 Date := File_Time_Stamp (Name);
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 -- Break down the time stamp into its constituents relative to GMT.
kono
parents:
diff changeset
1012 -- This version of Split does not recognize leap seconds or buffer
kono
parents:
diff changeset
1013 -- space for time zone processing.
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 GM_Split (Date, Year, Month, Day, Hour, Minute, Second);
kono
parents:
diff changeset
1016
kono
parents:
diff changeset
1017 -- The result must be in GMT. Ada.Calendar.
kono
parents:
diff changeset
1018 -- Formatting.Time_Of with default time zone of zero (0) is the
kono
parents:
diff changeset
1019 -- routine of choice.
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 return Time_Of (Year, Month, Day, Hour, Minute, Second, 0.0);
kono
parents:
diff changeset
1022 end if;
kono
parents:
diff changeset
1023 end Modification_Time;
kono
parents:
diff changeset
1024
kono
parents:
diff changeset
1025 function Modification_Time
kono
parents:
diff changeset
1026 (Directory_Entry : Directory_Entry_Type) return Ada.Calendar.Time
kono
parents:
diff changeset
1027 is
kono
parents:
diff changeset
1028 begin
kono
parents:
diff changeset
1029 -- First, the invalid case
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 if not Directory_Entry.Is_Valid then
kono
parents:
diff changeset
1032 raise Status_Error with "invalid directory entry";
kono
parents:
diff changeset
1033
kono
parents:
diff changeset
1034 else
kono
parents:
diff changeset
1035 -- The value to return has already be computed
kono
parents:
diff changeset
1036
kono
parents:
diff changeset
1037 return Modification_Time (To_String (Directory_Entry.Full));
kono
parents:
diff changeset
1038 end if;
kono
parents:
diff changeset
1039 end Modification_Time;
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 ------------------
kono
parents:
diff changeset
1042 -- More_Entries --
kono
parents:
diff changeset
1043 ------------------
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 function More_Entries (Search : Search_Type) return Boolean is
kono
parents:
diff changeset
1046 begin
kono
parents:
diff changeset
1047 if Search.Value = null then
kono
parents:
diff changeset
1048 return False;
kono
parents:
diff changeset
1049
kono
parents:
diff changeset
1050 elsif Search.Value.Is_Valid then
kono
parents:
diff changeset
1051
kono
parents:
diff changeset
1052 -- Fetch the next entry, if needed
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 if not Search.Value.Entry_Fetched then
kono
parents:
diff changeset
1055 Fetch_Next_Entry (Search);
kono
parents:
diff changeset
1056 end if;
kono
parents:
diff changeset
1057 end if;
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 return Search.Value.Is_Valid;
kono
parents:
diff changeset
1060 end More_Entries;
kono
parents:
diff changeset
1061
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1062 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1063 -- Name_Case_Equivalence --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1064 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1065
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1066 function Name_Case_Equivalence (Name : String) return Name_Case_Kind is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1067 Dir_Path : Unbounded_String := To_Unbounded_String (Name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1068 S : Search_Type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1069 Test_File : Directory_Entry_Type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1070
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1071 function GNAT_name_case_equivalence return Interfaces.C.int;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1072 pragma Import (C, GNAT_name_case_equivalence,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073 "__gnat_name_case_equivalence");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1074
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1076 -- Check for the invalid case
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1078 if not Is_Valid_Path_Name (Name) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1079 raise Name_Error with "invalid path name """ & Name & '"';
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1080 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1081
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1082 -- We were passed a "full path" to a file and not a directory, so obtain
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1083 -- the containing directory.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1084
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1085 if Is_Regular_File (Name) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1086 Dir_Path := To_Unbounded_String (Containing_Directory (Name));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1087 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1088
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1089 -- Since we must obtain a file within the Name directory, let's grab the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1090 -- first for our test. When the directory is empty, Get_Next_Entry will
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 -- fall through to a Status_Error where we then take the imprecise
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092 -- default for the host OS.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 Start_Search
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1095 (Search => S,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1096 Directory => To_String (Dir_Path),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1097 Pattern => "",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1098 Filter => (Directory => False, others => True));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1099
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1100 loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1101 Get_Next_Entry (S, Test_File);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1102
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1103 -- Check if we have found a "caseable" file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1105 exit when To_Lower (Simple_Name (Test_File)) /=
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106 To_Upper (Simple_Name (Test_File));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1107 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1108
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1109 End_Search (S);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1110
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111 -- Search for files within the directory with the same name, but
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1112 -- differing cases.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1113
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1114 Start_Search_Internal
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1115 (Search => S,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1116 Directory => To_String (Dir_Path),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1117 Pattern => Simple_Name (Test_File),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1118 Filter => (Directory => False, others => True),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1119 Force_Case_Insensitive => True);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1120
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1121 -- We will find at least one match due to the search hitting our test
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1122 -- file.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1123
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1124 Get_Next_Entry (S, Test_File);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1126 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1127 -- If we hit two then we know we have a case-sensitive directory
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1128
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1129 Get_Next_Entry (S, Test_File);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1130 End_Search (S);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1132 return Case_Sensitive;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1133 exception
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1134 when Status_Error =>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1135 null;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1136 end;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1137
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1138 -- Finally, we have a file in the directory whose name is unique and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1139 -- "caseable". Let's test to see if the OS is able to identify the file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1140 -- in multiple cases, which will give us our result without having to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1141 -- resort to defaults.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1142
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1143 if Exists (To_String (Dir_Path) & Directory_Separator
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1144 & To_Lower (Simple_Name (Test_File)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145 and then Exists (To_String (Dir_Path) & Directory_Separator
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1146 & To_Upper (Simple_Name (Test_File)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1147 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1148 return Case_Preserving;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1149 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1150
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1151 return Case_Sensitive;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1152 exception
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1153 when Status_Error =>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1154
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1155 -- There is no unobtrusive way to check for the directory's casing so
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1156 -- return the OS default.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1157
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1158 return Name_Case_Kind'Val (Integer (GNAT_name_case_equivalence));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 end Name_Case_Equivalence;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1160
111
kono
parents:
diff changeset
1161 ------------
kono
parents:
diff changeset
1162 -- Rename --
kono
parents:
diff changeset
1163 ------------
kono
parents:
diff changeset
1164
kono
parents:
diff changeset
1165 procedure Rename (Old_Name, New_Name : String) is
kono
parents:
diff changeset
1166 Success : Boolean;
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 begin
kono
parents:
diff changeset
1169 -- First, the invalid cases
kono
parents:
diff changeset
1170
kono
parents:
diff changeset
1171 if not Is_Valid_Path_Name (Old_Name) then
kono
parents:
diff changeset
1172 raise Name_Error with "invalid old path name """ & Old_Name & '"';
kono
parents:
diff changeset
1173
kono
parents:
diff changeset
1174 elsif not Is_Valid_Path_Name (New_Name) then
kono
parents:
diff changeset
1175 raise Name_Error with "invalid new path name """ & New_Name & '"';
kono
parents:
diff changeset
1176
kono
parents:
diff changeset
1177 elsif not Is_Regular_File (Old_Name)
kono
parents:
diff changeset
1178 and then not Is_Directory (Old_Name)
kono
parents:
diff changeset
1179 then
kono
parents:
diff changeset
1180 raise Name_Error with "old file """ & Old_Name & """ does not exist";
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 elsif Is_Regular_File (New_Name) or else Is_Directory (New_Name) then
kono
parents:
diff changeset
1183 raise Use_Error with
kono
parents:
diff changeset
1184 "new name """ & New_Name
kono
parents:
diff changeset
1185 & """ designates a file that already exists";
kono
parents:
diff changeset
1186
kono
parents:
diff changeset
1187 -- Do actual rename using System.OS_Lib.Rename_File
kono
parents:
diff changeset
1188
kono
parents:
diff changeset
1189 else
kono
parents:
diff changeset
1190 Rename_File (Old_Name, New_Name, Success);
kono
parents:
diff changeset
1191
kono
parents:
diff changeset
1192 if not Success then
kono
parents:
diff changeset
1193
kono
parents:
diff changeset
1194 -- AI05-0231-1: Name_Error should be raised in case a directory
kono
parents:
diff changeset
1195 -- component of New_Name does not exist (as in New_Name =>
kono
parents:
diff changeset
1196 -- "/no-such-dir/new-filename"). ENOENT indicates that. ENOENT
kono
parents:
diff changeset
1197 -- also indicate that the Old_Name does not exist, but we already
kono
parents:
diff changeset
1198 -- checked for that above. All other errors are Use_Error.
kono
parents:
diff changeset
1199
kono
parents:
diff changeset
1200 if Errno = ENOENT then
kono
parents:
diff changeset
1201 raise Name_Error with
kono
parents:
diff changeset
1202 "file """ & Containing_Directory (New_Name) & """ not found";
kono
parents:
diff changeset
1203
kono
parents:
diff changeset
1204 else
kono
parents:
diff changeset
1205 raise Use_Error with
kono
parents:
diff changeset
1206 "file """ & Old_Name & """ could not be renamed";
kono
parents:
diff changeset
1207 end if;
kono
parents:
diff changeset
1208 end if;
kono
parents:
diff changeset
1209 end if;
kono
parents:
diff changeset
1210 end Rename;
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 ------------
kono
parents:
diff changeset
1213 -- Search --
kono
parents:
diff changeset
1214 ------------
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216 procedure Search
kono
parents:
diff changeset
1217 (Directory : String;
kono
parents:
diff changeset
1218 Pattern : String;
kono
parents:
diff changeset
1219 Filter : Filter_Type := (others => True);
kono
parents:
diff changeset
1220 Process : not null access procedure
kono
parents:
diff changeset
1221 (Directory_Entry : Directory_Entry_Type))
kono
parents:
diff changeset
1222 is
kono
parents:
diff changeset
1223 Srch : Search_Type;
kono
parents:
diff changeset
1224 Directory_Entry : Directory_Entry_Type;
kono
parents:
diff changeset
1225
kono
parents:
diff changeset
1226 begin
kono
parents:
diff changeset
1227 Start_Search (Srch, Directory, Pattern, Filter);
kono
parents:
diff changeset
1228 while More_Entries (Srch) loop
kono
parents:
diff changeset
1229 Get_Next_Entry (Srch, Directory_Entry);
kono
parents:
diff changeset
1230 Process (Directory_Entry);
kono
parents:
diff changeset
1231 end loop;
kono
parents:
diff changeset
1232
kono
parents:
diff changeset
1233 End_Search (Srch);
kono
parents:
diff changeset
1234 end Search;
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 -------------------
kono
parents:
diff changeset
1237 -- Set_Directory --
kono
parents:
diff changeset
1238 -------------------
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 procedure Set_Directory (Directory : String) is
kono
parents:
diff changeset
1241 C_Dir_Name : constant String := Directory & ASCII.NUL;
kono
parents:
diff changeset
1242 begin
kono
parents:
diff changeset
1243 if not Is_Valid_Path_Name (Directory) then
kono
parents:
diff changeset
1244 raise Name_Error with
kono
parents:
diff changeset
1245 "invalid directory path name & """ & Directory & '"';
kono
parents:
diff changeset
1246
kono
parents:
diff changeset
1247 elsif not Is_Directory (Directory) then
kono
parents:
diff changeset
1248 raise Name_Error with
kono
parents:
diff changeset
1249 "directory """ & Directory & """ does not exist";
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 elsif chdir (C_Dir_Name) /= 0 then
kono
parents:
diff changeset
1252 raise Name_Error with
kono
parents:
diff changeset
1253 "could not set to designated directory """ & Directory & '"';
kono
parents:
diff changeset
1254 end if;
kono
parents:
diff changeset
1255 end Set_Directory;
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257 -----------------
kono
parents:
diff changeset
1258 -- Simple_Name --
kono
parents:
diff changeset
1259 -----------------
kono
parents:
diff changeset
1260
kono
parents:
diff changeset
1261 function Simple_Name (Name : String) return String is
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 function Simple_Name_Internal (Path : String) return String;
kono
parents:
diff changeset
1264 -- This function does the job
kono
parents:
diff changeset
1265
kono
parents:
diff changeset
1266 --------------------------
kono
parents:
diff changeset
1267 -- Simple_Name_Internal --
kono
parents:
diff changeset
1268 --------------------------
kono
parents:
diff changeset
1269
kono
parents:
diff changeset
1270 function Simple_Name_Internal (Path : String) return String is
kono
parents:
diff changeset
1271 Cut_Start : Natural :=
kono
parents:
diff changeset
1272 Strings.Fixed.Index (Path, Dir_Seps, Going => Strings.Backward);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1273
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1274 -- Cut_End points to the last simple name character
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1275
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1276 Cut_End : Natural := Path'Last;
111
kono
parents:
diff changeset
1277
kono
parents:
diff changeset
1278 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1279 -- Root directories are considered simple
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1280
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1281 if Is_Root_Directory_Name (Path) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1282 return Path;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1283 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1284
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1285 -- Handle trailing directory separators
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1286
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1287 if Cut_Start = Path'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1288 Cut_End := Path'Last - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1289 Cut_Start := Strings.Fixed.Index
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1290 (Path (Path'First .. Path'Last - 1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1291 Dir_Seps, Going => Strings.Backward);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1292 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1293
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1294 -- Cut_Start points to the first simple name character
111
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 Cut_Start := (if Cut_Start = 0 then Path'First else Cut_Start + 1);
kono
parents:
diff changeset
1297
kono
parents:
diff changeset
1298 Check_For_Standard_Dirs : declare
kono
parents:
diff changeset
1299 BN : constant String := Path (Cut_Start .. Cut_End);
kono
parents:
diff changeset
1300
kono
parents:
diff changeset
1301 Has_Drive_Letter : constant Boolean :=
kono
parents:
diff changeset
1302 OS_Lib.Path_Separator /= ':';
kono
parents:
diff changeset
1303 -- If Path separator is not ':' then we are on a DOS based OS
kono
parents:
diff changeset
1304 -- where this character is used as a drive letter separator.
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 begin
kono
parents:
diff changeset
1307 if BN = "." or else BN = ".." then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1308 return BN;
111
kono
parents:
diff changeset
1309
kono
parents:
diff changeset
1310 elsif Has_Drive_Letter
kono
parents:
diff changeset
1311 and then BN'Length > 2
kono
parents:
diff changeset
1312 and then Characters.Handling.Is_Letter (BN (BN'First))
kono
parents:
diff changeset
1313 and then BN (BN'First + 1) = ':'
kono
parents:
diff changeset
1314 then
kono
parents:
diff changeset
1315 -- We have a DOS drive letter prefix, remove it
kono
parents:
diff changeset
1316
kono
parents:
diff changeset
1317 return BN (BN'First + 2 .. BN'Last);
kono
parents:
diff changeset
1318
kono
parents:
diff changeset
1319 else
kono
parents:
diff changeset
1320 return BN;
kono
parents:
diff changeset
1321 end if;
kono
parents:
diff changeset
1322 end Check_For_Standard_Dirs;
kono
parents:
diff changeset
1323 end Simple_Name_Internal;
kono
parents:
diff changeset
1324
kono
parents:
diff changeset
1325 -- Start of processing for Simple_Name
kono
parents:
diff changeset
1326
kono
parents:
diff changeset
1327 begin
kono
parents:
diff changeset
1328 -- First, the invalid case
kono
parents:
diff changeset
1329
kono
parents:
diff changeset
1330 if not Is_Valid_Path_Name (Name) then
kono
parents:
diff changeset
1331 raise Name_Error with "invalid path name """ & Name & '"';
kono
parents:
diff changeset
1332
kono
parents:
diff changeset
1333 else
kono
parents:
diff changeset
1334 -- Build the value to return with lower bound 1
kono
parents:
diff changeset
1335
kono
parents:
diff changeset
1336 declare
kono
parents:
diff changeset
1337 Value : constant String := Simple_Name_Internal (Name);
kono
parents:
diff changeset
1338 subtype Result is String (1 .. Value'Length);
kono
parents:
diff changeset
1339 begin
kono
parents:
diff changeset
1340 return Result (Value);
kono
parents:
diff changeset
1341 end;
kono
parents:
diff changeset
1342 end if;
kono
parents:
diff changeset
1343 end Simple_Name;
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 function Simple_Name
kono
parents:
diff changeset
1346 (Directory_Entry : Directory_Entry_Type) return String is
kono
parents:
diff changeset
1347 begin
kono
parents:
diff changeset
1348 -- First, the invalid case
kono
parents:
diff changeset
1349
kono
parents:
diff changeset
1350 if not Directory_Entry.Is_Valid then
kono
parents:
diff changeset
1351 raise Status_Error with "invalid directory entry";
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 else
kono
parents:
diff changeset
1354 -- The value to return has already be computed
kono
parents:
diff changeset
1355
kono
parents:
diff changeset
1356 return To_String (Directory_Entry.Simple);
kono
parents:
diff changeset
1357 end if;
kono
parents:
diff changeset
1358 end Simple_Name;
kono
parents:
diff changeset
1359
kono
parents:
diff changeset
1360 ----------
kono
parents:
diff changeset
1361 -- Size --
kono
parents:
diff changeset
1362 ----------
kono
parents:
diff changeset
1363
kono
parents:
diff changeset
1364 function Size (Name : String) return File_Size is
kono
parents:
diff changeset
1365 C_Name : String (1 .. Name'Length + 1);
kono
parents:
diff changeset
1366
kono
parents:
diff changeset
1367 function C_Size (Name : Address) return int64;
kono
parents:
diff changeset
1368 pragma Import (C, C_Size, "__gnat_named_file_length");
kono
parents:
diff changeset
1369
kono
parents:
diff changeset
1370 begin
kono
parents:
diff changeset
1371 -- First, the invalid case
kono
parents:
diff changeset
1372
kono
parents:
diff changeset
1373 if not Is_Regular_File (Name) then
kono
parents:
diff changeset
1374 raise Name_Error with "file """ & Name & """ does not exist";
kono
parents:
diff changeset
1375
kono
parents:
diff changeset
1376 else
kono
parents:
diff changeset
1377 C_Name (1 .. Name'Length) := Name;
kono
parents:
diff changeset
1378 C_Name (C_Name'Last) := ASCII.NUL;
kono
parents:
diff changeset
1379 return File_Size (C_Size (C_Name'Address));
kono
parents:
diff changeset
1380 end if;
kono
parents:
diff changeset
1381 end Size;
kono
parents:
diff changeset
1382
kono
parents:
diff changeset
1383 function Size (Directory_Entry : Directory_Entry_Type) return File_Size is
kono
parents:
diff changeset
1384 begin
kono
parents:
diff changeset
1385 -- First, the invalid case
kono
parents:
diff changeset
1386
kono
parents:
diff changeset
1387 if not Directory_Entry.Is_Valid then
kono
parents:
diff changeset
1388 raise Status_Error with "invalid directory entry";
kono
parents:
diff changeset
1389
kono
parents:
diff changeset
1390 else
kono
parents:
diff changeset
1391 -- The value to return has already be computed
kono
parents:
diff changeset
1392
kono
parents:
diff changeset
1393 return Size (To_String (Directory_Entry.Full));
kono
parents:
diff changeset
1394 end if;
kono
parents:
diff changeset
1395 end Size;
kono
parents:
diff changeset
1396
kono
parents:
diff changeset
1397 ------------------
kono
parents:
diff changeset
1398 -- Start_Search --
kono
parents:
diff changeset
1399 ------------------
kono
parents:
diff changeset
1400
kono
parents:
diff changeset
1401 procedure Start_Search
kono
parents:
diff changeset
1402 (Search : in out Search_Type;
kono
parents:
diff changeset
1403 Directory : String;
kono
parents:
diff changeset
1404 Pattern : String;
kono
parents:
diff changeset
1405 Filter : Filter_Type := (others => True))
kono
parents:
diff changeset
1406 is
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1407 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408 Start_Search_Internal (Search, Directory, Pattern, Filter, False);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1409 end Start_Search;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1410
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1411 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412 -- Start_Search_Internal --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1413 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1414
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1415 procedure Start_Search_Internal
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416 (Search : in out Search_Type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 Directory : String;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1418 Pattern : String;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1419 Filter : Filter_Type := (others => True);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 Force_Case_Insensitive : Boolean)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1421 is
111
kono
parents:
diff changeset
1422 function opendir (file_name : String) return DIRs;
kono
parents:
diff changeset
1423 pragma Import (C, opendir, "__gnat_opendir");
kono
parents:
diff changeset
1424
kono
parents:
diff changeset
1425 C_File_Name : constant String := Directory & ASCII.NUL;
kono
parents:
diff changeset
1426 Pat : Regexp;
kono
parents:
diff changeset
1427 Dir : Dir_Type_Value;
kono
parents:
diff changeset
1428
kono
parents:
diff changeset
1429 begin
kono
parents:
diff changeset
1430 -- First, the invalid case Name_Error
kono
parents:
diff changeset
1431
kono
parents:
diff changeset
1432 if not Is_Directory (Directory) then
kono
parents:
diff changeset
1433 raise Name_Error with
kono
parents:
diff changeset
1434 "unknown directory """ & Simple_Name (Directory) & '"';
kono
parents:
diff changeset
1435 end if;
kono
parents:
diff changeset
1436
kono
parents:
diff changeset
1437 -- Check the pattern
kono
parents:
diff changeset
1438
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 declare
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1440 Case_Sensitive : Boolean := Is_Path_Name_Case_Sensitive;
111
kono
parents:
diff changeset
1441 begin
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1442 if Force_Case_Insensitive then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1443 Case_Sensitive := False;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1444 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1445
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1446 Pat :=
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1447 Compile
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1448 (Pattern,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1449 Glob => True,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1450 Case_Sensitive => Case_Sensitive);
111
kono
parents:
diff changeset
1451 exception
kono
parents:
diff changeset
1452 when Error_In_Regexp =>
kono
parents:
diff changeset
1453 Free (Search.Value);
kono
parents:
diff changeset
1454 raise Name_Error with "invalid pattern """ & Pattern & '"';
kono
parents:
diff changeset
1455 end;
kono
parents:
diff changeset
1456
kono
parents:
diff changeset
1457 Dir := Dir_Type_Value (opendir (C_File_Name));
kono
parents:
diff changeset
1458
kono
parents:
diff changeset
1459 if Dir = No_Dir then
kono
parents:
diff changeset
1460 raise Use_Error with
kono
parents:
diff changeset
1461 "unreadable directory """ & Simple_Name (Directory) & '"';
kono
parents:
diff changeset
1462 end if;
kono
parents:
diff changeset
1463
kono
parents:
diff changeset
1464 -- If needed, finalize Search
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 Finalize (Search);
kono
parents:
diff changeset
1467
kono
parents:
diff changeset
1468 -- Allocate the default data
kono
parents:
diff changeset
1469
kono
parents:
diff changeset
1470 Search.Value := new Search_Data;
kono
parents:
diff changeset
1471
kono
parents:
diff changeset
1472 -- Initialize some Search components
kono
parents:
diff changeset
1473
kono
parents:
diff changeset
1474 Search.Value.Filter := Filter;
kono
parents:
diff changeset
1475 Search.Value.Name := To_Unbounded_String (Full_Name (Directory));
kono
parents:
diff changeset
1476 Search.Value.Pattern := Pat;
kono
parents:
diff changeset
1477 Search.Value.Dir := Dir;
kono
parents:
diff changeset
1478 Search.Value.Is_Valid := True;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1479 end Start_Search_Internal;
111
kono
parents:
diff changeset
1480
kono
parents:
diff changeset
1481 end Ada.Directories;