adagsl_335d13f0/toolkit/adalib/src/dirwalk.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
with Ada.Directories ;

procedure dirwalk( context : context_type ;
                   dirname : string ;
                   pattern : string ;
                   processor : access procedure ( context : context_type ;
                                                  filename : in string )
                   ) is

   search   : Ada.Directories.Search_Type;
   searchd  : Ada.Directories.Search_Type;
   direntry : Ada.Directories.Directory_Entry_Type;
   filter   : Ada.Directories.Filter_Type;
   use Ada.Directories;

begin

    filter := [Ada.Directories.Ordinary_File => True, others => False];

    Ada.Directories.Start_Search (search, dirname, pattern, filter);
    while Ada.Directories.More_Entries (search) loop
       Ada.Directories.Get_Next_Entry (search, direntry);
       processor (context , Ada.Directories.Full_Name (direntry));
    end loop;
    Ada.Directories.End_Search (search);

    filter := [Ada.Directories.Directory => True, others => False];
    Ada.Directories.Start_Search
      (searchd,
       Ada.Directories.Full_Name (dirname),
       "*",
       filter);
    while Ada.Directories.More_Entries (searchd) loop
       Ada.Directories.Get_Next_Entry (searchd, direntry);
       if Ada.Directories.Simple_Name (direntry) /= "."
         and then Ada.Directories.Simple_Name (direntry) /= ".."
       then
          dirwalk (context , Ada.Directories.Full_Name (direntry), pattern, processor);
       end if;
    end loop;
    Ada.Directories.End_Search (search);

end dirwalk ;