Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11094 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
208
EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/FindFiles.c
Normal file
208
EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/FindFiles.c
Normal file
@@ -0,0 +1,208 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
FindFiles.c
|
||||
|
||||
Abstract:
|
||||
|
||||
OS-specific functions to assist in finding files in
|
||||
subdirectories.
|
||||
|
||||
--*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <direct.h>
|
||||
//
|
||||
// #include <io.h> // for _chmod()
|
||||
//
|
||||
#include <sys/stat.h>
|
||||
//
|
||||
// #include <errno.h> // for errno
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "HiiPack.h"
|
||||
|
||||
extern
|
||||
void
|
||||
Error (
|
||||
char *Name,
|
||||
UINT32 LineNumber,
|
||||
UINT32 MessageCode,
|
||||
char *Text,
|
||||
char *MsgFmt,
|
||||
...
|
||||
);
|
||||
|
||||
static
|
||||
int
|
||||
ProcessDirectory (
|
||||
char *RootDirectory,
|
||||
char *FileMask,
|
||||
FIND_FILE_CALLBACK Callback
|
||||
);
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
FindFiles (
|
||||
char *RootDirectory,
|
||||
char *FileMask,
|
||||
FIND_FILE_CALLBACK Callback
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Find files of a given name under a root directory
|
||||
|
||||
Arguments:
|
||||
RootDirectory - base directory -- look in this directory and
|
||||
all its subdirectories for files matching FileMask.
|
||||
FileMask - file mask of files to find
|
||||
Callback - function to call for each file found
|
||||
|
||||
Returns:
|
||||
|
||||
--*/
|
||||
{
|
||||
char FullPath[MAX_PATH];
|
||||
//
|
||||
// If RootDirectory is relative, then append to cwd.
|
||||
//
|
||||
if (isalpha (RootDirectory[0]) && (RootDirectory[1] == ':')) {
|
||||
strcpy (FullPath, RootDirectory);
|
||||
} else {
|
||||
//
|
||||
// Get current working directory
|
||||
//
|
||||
if (_getcwd (FullPath, sizeof (FullPath)) == NULL) {
|
||||
Error (NULL, 0, 0, "failed to get current working directory", NULL);
|
||||
return 1;
|
||||
}
|
||||
//
|
||||
// Append the relative path they passed in
|
||||
//
|
||||
if (FullPath[strlen (FullPath) - 1] != '\\') {
|
||||
strcat (FullPath, "\\");
|
||||
}
|
||||
|
||||
strcat (FullPath, RootDirectory);
|
||||
}
|
||||
|
||||
if (FullPath[strlen (FullPath) - 1] == '\\') {
|
||||
FullPath[strlen (FullPath) - 1] = 0;
|
||||
}
|
||||
//
|
||||
// Process the directory
|
||||
//
|
||||
return ProcessDirectory (FullPath, FileMask, Callback);
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
ProcessDirectory (
|
||||
char *RootDirectory,
|
||||
char *FileMask,
|
||||
FIND_FILE_CALLBACK Callback
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Process a directory to find all files matching a given file mask
|
||||
|
||||
Arguments:
|
||||
RootDirectory - base directory -- look in this directory and
|
||||
all its subdirectories for files matching FileMask.
|
||||
FileMask - file mask of files to find
|
||||
Callback - function to call for each file found
|
||||
|
||||
Returns:
|
||||
|
||||
--*/
|
||||
{
|
||||
HANDLE Handle;
|
||||
WIN32_FIND_DATA FindData;
|
||||
char TempName[MAX_PATH];
|
||||
|
||||
Handle = INVALID_HANDLE_VALUE;
|
||||
//
|
||||
// Concatenate the filemask to the directory to create the full
|
||||
// path\mask path name.
|
||||
//
|
||||
strcpy (TempName, RootDirectory);
|
||||
strcat (TempName, "\\");
|
||||
strcat (TempName, FileMask);
|
||||
memset (&FindData, 0, sizeof (FindData));
|
||||
Handle = FindFirstFile (TempName, &FindData);
|
||||
if (Handle != INVALID_HANDLE_VALUE) {
|
||||
do {
|
||||
if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
|
||||
strcpy (TempName, RootDirectory);
|
||||
strcat (TempName, "\\");
|
||||
strcat (TempName, FindData.cFileName);
|
||||
if (Callback (TempName) != 0) {
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
} while (FindNextFile (Handle, &FindData));
|
||||
}
|
||||
|
||||
if (Handle != INVALID_HANDLE_VALUE) {
|
||||
FindClose (Handle);
|
||||
Handle = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
//
|
||||
// Now create a *.* file mask to get all subdirectories and recursive call this
|
||||
// function to handle each one found.
|
||||
//
|
||||
strcpy (TempName, RootDirectory);
|
||||
strcat (TempName, "\\*.*");
|
||||
memset (&FindData, 0, sizeof (FindData));
|
||||
Handle = FindFirstFile (TempName, &FindData);
|
||||
//
|
||||
// Loop until no more files/directories
|
||||
//
|
||||
if (Handle != INVALID_HANDLE_VALUE) {
|
||||
do {
|
||||
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
//
|
||||
// Make sure it's not "." or ".."
|
||||
//
|
||||
if ((strcmp (FindData.cFileName, ".") != 0) && (strcmp (FindData.cFileName, "..") != 0)) {
|
||||
//
|
||||
// Found a valid directory. Put it all together and make a recursive call
|
||||
// to process it.
|
||||
//
|
||||
strcpy (TempName, RootDirectory);
|
||||
strcat (TempName, "\\");
|
||||
strcat (TempName, FindData.cFileName);
|
||||
if (ProcessDirectory (TempName, FileMask, Callback) != 0) {
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (FindNextFile (Handle, &FindData));
|
||||
}
|
||||
|
||||
Done:
|
||||
//
|
||||
// Free the handle
|
||||
//
|
||||
if (Handle != INVALID_HANDLE_VALUE) {
|
||||
FindClose (Handle);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user