]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/FindFiles.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / HiiPack / FindFiles.c
1 /*++
2
3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 FindFiles.c
15
16 Abstract:
17
18 OS-specific functions to assist in finding files in
19 subdirectories.
20
21 --*/
22
23 #include <windows.h>
24 #include <direct.h>
25 //
26 // #include <io.h> // for _chmod()
27 //
28 #include <sys/stat.h>
29 //
30 // #include <errno.h> // for errno
31 //
32 #include <stdio.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <ctype.h>
36
37 #include "HiiPack.h"
38
39 extern
40 void
41 Error (
42 char *Name,
43 UINT32 LineNumber,
44 UINT32 MessageCode,
45 char *Text,
46 char *MsgFmt,
47 ...
48 );
49
50 static
51 int
52 ProcessDirectory (
53 char *RootDirectory,
54 char *FileMask,
55 FIND_FILE_CALLBACK Callback
56 );
57
58 /*****************************************************************************/
59 int
60 FindFiles (
61 char *RootDirectory,
62 char *FileMask,
63 FIND_FILE_CALLBACK Callback
64 )
65 /*++
66
67 Routine Description:
68 Find files of a given name under a root directory
69
70 Arguments:
71 RootDirectory - base directory -- look in this directory and
72 all its subdirectories for files matching FileMask.
73 FileMask - file mask of files to find
74 Callback - function to call for each file found
75
76 Returns:
77
78 --*/
79 {
80 char FullPath[MAX_PATH];
81 //
82 // If RootDirectory is relative, then append to cwd.
83 //
84 if (isalpha (RootDirectory[0]) && (RootDirectory[1] == ':')) {
85 strcpy (FullPath, RootDirectory);
86 } else {
87 //
88 // Get current working directory
89 //
90 if (_getcwd (FullPath, sizeof (FullPath)) == NULL) {
91 Error (NULL, 0, 0, "failed to get current working directory", NULL);
92 return 1;
93 }
94 //
95 // Append the relative path they passed in
96 //
97 if (FullPath[strlen (FullPath) - 1] != '\\') {
98 strcat (FullPath, "\\");
99 }
100
101 strcat (FullPath, RootDirectory);
102 }
103
104 if (FullPath[strlen (FullPath) - 1] == '\\') {
105 FullPath[strlen (FullPath) - 1] = 0;
106 }
107 //
108 // Process the directory
109 //
110 return ProcessDirectory (FullPath, FileMask, Callback);
111 }
112
113 static
114 int
115 ProcessDirectory (
116 char *RootDirectory,
117 char *FileMask,
118 FIND_FILE_CALLBACK Callback
119 )
120 /*++
121
122 Routine Description:
123 Process a directory to find all files matching a given file mask
124
125 Arguments:
126 RootDirectory - base directory -- look in this directory and
127 all its subdirectories for files matching FileMask.
128 FileMask - file mask of files to find
129 Callback - function to call for each file found
130
131 Returns:
132
133 --*/
134 {
135 HANDLE Handle;
136 WIN32_FIND_DATA FindData;
137 char TempName[MAX_PATH];
138
139 Handle = INVALID_HANDLE_VALUE;
140 //
141 // Concatenate the filemask to the directory to create the full
142 // path\mask path name.
143 //
144 strcpy (TempName, RootDirectory);
145 strcat (TempName, "\\");
146 strcat (TempName, FileMask);
147 memset (&FindData, 0, sizeof (FindData));
148 Handle = FindFirstFile (TempName, &FindData);
149 if (Handle != INVALID_HANDLE_VALUE) {
150 do {
151 if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
152 strcpy (TempName, RootDirectory);
153 strcat (TempName, "\\");
154 strcat (TempName, FindData.cFileName);
155 if (Callback (TempName) != 0) {
156 goto Done;
157 }
158 }
159 } while (FindNextFile (Handle, &FindData));
160 }
161
162 if (Handle != INVALID_HANDLE_VALUE) {
163 FindClose (Handle);
164 Handle = INVALID_HANDLE_VALUE;
165 }
166 //
167 // Now create a *.* file mask to get all subdirectories and recursive call this
168 // function to handle each one found.
169 //
170 strcpy (TempName, RootDirectory);
171 strcat (TempName, "\\*.*");
172 memset (&FindData, 0, sizeof (FindData));
173 Handle = FindFirstFile (TempName, &FindData);
174 //
175 // Loop until no more files/directories
176 //
177 if (Handle != INVALID_HANDLE_VALUE) {
178 do {
179 if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
180 //
181 // Make sure it's not "." or ".."
182 //
183 if ((strcmp (FindData.cFileName, ".") != 0) && (strcmp (FindData.cFileName, "..") != 0)) {
184 //
185 // Found a valid directory. Put it all together and make a recursive call
186 // to process it.
187 //
188 strcpy (TempName, RootDirectory);
189 strcat (TempName, "\\");
190 strcat (TempName, FindData.cFileName);
191 if (ProcessDirectory (TempName, FileMask, Callback) != 0) {
192 goto Done;
193 }
194 }
195 }
196 } while (FindNextFile (Handle, &FindData));
197 }
198
199 Done:
200 //
201 // Free the handle
202 //
203 if (Handle != INVALID_HANDLE_VALUE) {
204 FindClose (Handle);
205 }
206
207 return 0;
208 }