diff options
Diffstat (limited to 'Library/UefiShellUfmCommandLib/fs.c')
-rw-r--r-- | Library/UefiShellUfmCommandLib/fs.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/fs.c b/Library/UefiShellUfmCommandLib/fs.c index edde591..fe2d590 100644 --- a/Library/UefiShellUfmCommandLib/fs.c +++ b/Library/UefiShellUfmCommandLib/fs.c @@ -7,6 +7,46 @@ #include "fs.h" +STATIC BOOLEAN search_list(CONST CHAR16 *list, CONST CHAR16 *target, + OUT CHAR16 **var OPTIONAL, CONST BOOLEAN meta, CONST CHAR16 *delimiter) +{ + CHAR16 *temp_list, *temp_str; + CONST CHAR16 *list_walker; + BOOLEAN result; + + for(list_walker = list, temp_list = NULL; + list_walker != NULL && *list_walker != CHAR_NULL; ) + { + temp_list = StrnCatGrow(&temp_list, NULL, list_walker, 0); + ASSERT(temp_list != NULL); + + temp_str = StrStr(temp_list, delimiter); + if(temp_str != NULL) + *temp_str = CHAR_NULL; + + list_walker = StrStr(list_walker, delimiter); + while(list_walker != NULL && *list_walker == *delimiter) + list_walker++; + + if(meta) + result = gUnicodeCollation->MetaiMatch(gUnicodeCollation, temp_list, (CHAR16 *)target); + else + result = (BOOLEAN)(StrCmp(temp_list, target) == 0); + + if(result) { + if(var != NULL) + *var = temp_list; + else + FreePool(temp_list); + return TRUE; + } + FreePool(temp_list); + temp_list = NULL; + } + + return FALSE; +} + struct fs_array *fsa_alloc(EFI_HANDLE *handles, UINTN count) { UINTN i; @@ -28,6 +68,8 @@ struct fs_array *fsa_alloc(EFI_HANDLE *handles, UINTN count) for(i = 0; i < count; i++) { dev_path = DevicePathFromHandle(handles[i]); map_list = gEfiShellProtocol->GetMapFromDevicePath(&dev_path); + search_list(map_list, L"FS*:", &fsa->full_name[i], TRUE, L";"); + ASSERT(fsa->full_name[i] != NULL); } return fsa; |