diff --git a/ShellPkg/Include/Library/SortLib.h b/ShellPkg/Include/Library/SortLib.h index 2761994572..e213b7a40e 100644 --- a/ShellPkg/Include/Library/SortLib.h +++ b/ShellPkg/Include/Library/SortLib.h @@ -63,16 +63,35 @@ PerformQuickSort ( /** Function to compare 2 device paths for use as CompareFunction. - @param[in] Buffer1 pointer to Device Path to compare - @param[in] Buffer2 pointer to second DevicePath to compare + @param[in] Buffer1 Pointer to Device Path to compare. + @param[in] Buffer2 Pointer to second DevicePath to compare. - @retval 0 Buffer1 equal to Buffer2 - @return < 0 Buffer1 is less than Buffer2 - @return > 0 Buffer1 is greater than Buffer2 + @retval 0 Buffer1 equal to Buffer2. + @return < 0 Buffer1 is less than Buffer2. + @return > 0 Buffer1 is greater than Buffer2. **/ INTN +EFIAPI DevicePathCompare ( IN VOID *Buffer1, IN VOID *Buffer2 ); + +/** + Function to compare 2 strings without regard to case of the characters. + + @param[in] Buffer1 Pointer to String to compare (CHAR16**). + @param[in] Buffer2 Pointer to second String to compare (CHAR16**). + + @retval 0 Buffer1 equal to Buffer2. + @return < 0 Buffer1 is less than Buffer2. + @return > 0 Buffer1 is greater than Buffer2. +**/ +INTN +EFIAPI +StringNoCaseCompare ( + IN VOID *Buffer1, + IN VOID *Buffer2 + ); + #endif //__SORT_LIB_H__ diff --git a/ShellPkg/Library/BaseSortLib/BaseSortLib.c b/ShellPkg/Library/BaseSortLib/BaseSortLib.c index 8ee9abb3d3..91b2a17e7a 100644 --- a/ShellPkg/Library/BaseSortLib/BaseSortLib.c +++ b/ShellPkg/Library/BaseSortLib/BaseSortLib.c @@ -185,3 +185,26 @@ DevicePathCompare ( ASSERT(FALSE); return 0; } + +/** + Function to compare 2 strings without regard to case of the characters. + + @param[in] Buffer1 Pointer to String to compare. + @param[in] Buffer2 Pointer to second String to compare. + + @retval 0 Buffer1 equal to Buffer2. + @return < 0 Buffer1 is less than Buffer2. + @return > 0 Buffer1 is greater than Buffer2. +**/ +INTN +EFIAPI +StringNoCaseCompare ( + IN VOID *Buffer1, + IN VOID *Buffer2 + ) +{ + ASSERT(FALSE); + return 0; +} + + diff --git a/ShellPkg/Library/UefiSortLib/UefiSortLib.c b/ShellPkg/Library/UefiSortLib/UefiSortLib.c index 08b8169e21..1df45fb5ae 100644 --- a/ShellPkg/Library/UefiSortLib/UefiSortLib.c +++ b/ShellPkg/Library/UefiSortLib/UefiSortLib.c @@ -25,6 +25,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include +STATIC EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathToText = NULL; +STATIC EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL; + + /** Worker function for QuickSorting. This function is identical to PerformQuickSort, except that is uses the pre-allocated buffer so the in place sorting does not need to @@ -199,9 +203,6 @@ DevicePathCompare ( EFI_STATUS Status; INTN RetVal; - STATIC EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevicePathToText = NULL; - STATIC EFI_UNICODE_COLLATION_PROTOCOL *UnicodeCollation = NULL; - DevicePath1 = *(EFI_DEVICE_PATH_PROTOCOL**)Buffer1; DevicePath2 = *(EFI_DEVICE_PATH_PROTOCOL**)Buffer2; @@ -217,36 +218,36 @@ DevicePathCompare ( return 1; } - if (DevicePathToText == NULL) { + if (mDevicePathToText == NULL) { Status = gBS->LocateProtocol( &gEfiDevicePathToTextProtocolGuid, NULL, - (VOID**)&DevicePathToText); + (VOID**)&mDevicePathToText); ASSERT_EFI_ERROR(Status); } - if (UnicodeCollation == NULL) { + if (mUnicodeCollation == NULL) { Status = gBS->LocateProtocol( &gEfiUnicodeCollation2ProtocolGuid, NULL, - (VOID**)&UnicodeCollation); + (VOID**)&mUnicodeCollation); ASSERT_EFI_ERROR(Status); } - TextPath1 = DevicePathToText->ConvertDevicePathToText( + TextPath1 = mDevicePathToText->ConvertDevicePathToText( DevicePath1, FALSE, FALSE); - TextPath2 = DevicePathToText->ConvertDevicePathToText( + TextPath2 = mDevicePathToText->ConvertDevicePathToText( DevicePath2, FALSE, FALSE); - RetVal = UnicodeCollation->StriColl( - UnicodeCollation, + RetVal = mUnicodeCollation->StriColl( + mUnicodeCollation, TextPath1, TextPath2); @@ -254,4 +255,39 @@ DevicePathCompare ( FreePool(TextPath2); return (RetVal); -} \ No newline at end of file +} + +/** + Function to compare 2 strings without regard to case of the characters. + + @param[in] Buffer1 Pointer to String to compare. + @param[in] Buffer2 Pointer to second String to compare. + + @retval 0 Buffer1 equal to Buffer2. + @return < 0 Buffer1 is less than Buffer2. + @return > 0 Buffer1 is greater than Buffer2. +**/ +INTN +EFIAPI +StringNoCaseCompare ( + IN VOID *Buffer1, + IN VOID *Buffer2 + ) +{ + EFI_STATUS Status; + if (mUnicodeCollation == NULL) { + Status = gBS->LocateProtocol( + &gEfiUnicodeCollation2ProtocolGuid, + NULL, + (VOID**)&mUnicodeCollation); + + ASSERT_EFI_ERROR(Status); + } + + return (mUnicodeCollation->StriColl( + mUnicodeCollation, + *(CHAR16**)Buffer1, + *(CHAR16**)Buffer2)); +} + +