+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- \r
- UnicodeCollationEng.c\r
-\r
-Abstract:\r
- \r
- Unicode Collation Protocol (English)\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "UnicodeCollationEng.h"\r
-\r
-CHAR8 mEngUpperMap[0x100];\r
-CHAR8 mEngLowerMap[0x100];\r
-CHAR8 mEngInfoMap[0x100];\r
-\r
-CHAR8 mOtherChars[] = {\r
- '0',\r
- '1',\r
- '2',\r
- '3',\r
- '4',\r
- '5',\r
- '6',\r
- '7',\r
- '8',\r
- '9',\r
- '\\',\r
- '.',\r
- '_',\r
- '^',\r
- '$',\r
- '~',\r
- '!',\r
- '#',\r
- '%',\r
- '&',\r
- '-',\r
- '{',\r
- '}',\r
- '(',\r
- ')',\r
- '@',\r
- '`',\r
- '\'',\r
- '\0'\r
-};\r
-\r
-EFI_HANDLE mHandle = NULL;\r
-\r
-EFI_UNICODE_COLLATION_PROTOCOL UnicodeEng = {\r
- EngStriColl,\r
- EngMetaiMatch,\r
- EngStrLwr,\r
- EngStrUpr,\r
- EngFatToStr,\r
- EngStrToFat,\r
- "eng"\r
-};\r
-\r
-//\r
-//\r
-//\r
-EFI_STATUS\r
-InitializeUnicodeCollationEng (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Initializes the Unicode Collation Driver\r
-\r
-Arguments:\r
-\r
- ImageHandle -\r
-\r
- SystemTable -\r
- \r
-Returns:\r
-\r
- EFI_SUCCESS\r
- EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- //\r
- // Initialize mapping tables for the supported languages\r
- //\r
- for (Index = 0; Index < 0x100; Index++) {\r
- mEngUpperMap[Index] = (CHAR8) Index;\r
- mEngLowerMap[Index] = (CHAR8) Index;\r
- mEngInfoMap[Index] = 0;\r
-\r
- if ((Index >= 'a' && Index <= 'z') || (Index >= 0xe0 && Index <= 0xf6) || (Index >= 0xf8 && Index <= 0xfe)) {\r
-\r
- Index2 = Index - 0x20;\r
- mEngUpperMap[Index] = (CHAR8) Index2;\r
- mEngLowerMap[Index2] = (CHAR8) Index;\r
-\r
- mEngInfoMap[Index] |= CHAR_FAT_VALID;\r
- mEngInfoMap[Index2] |= CHAR_FAT_VALID;\r
- }\r
- }\r
-\r
- for (Index = 0; mOtherChars[Index]; Index++) {\r
- Index2 = mOtherChars[Index];\r
- mEngInfoMap[Index2] |= CHAR_FAT_VALID;\r
- }\r
- //\r
- // Create a handle for the device\r
- //\r
- return gBS->InstallProtocolInterface (\r
- &mHandle,\r
- &gEfiUnicodeCollationProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &UnicodeEng\r
- );\r
-}\r
-\r
-INTN\r
-EFIAPI\r
-EngStriColl (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN CHAR16 *s1,\r
- IN CHAR16 *s2\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a case-insensitive comparison of two Null-terminated Unicode strings.\r
- \r
-Arguments:\r
-\r
- This\r
- s1\r
- s2\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- while (*s1) {\r
- if (ToUpper (*s1) != ToUpper (*s2)) {\r
- break;\r
- }\r
-\r
- s1 += 1;\r
- s2 += 1;\r
- }\r
-\r
- return ToUpper (*s1) - ToUpper (*s2);\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-EngStrLwr (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN OUT CHAR16 *Str\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Converts all the Unicode characters in a Null-terminated Unicode string\r
- to lower case Unicode characters.\r
-\r
-Arguments:\r
-\r
- This - A pointer to the EFI_UNICODE_COLLATION_PROTOCOL instance.\r
- Str1 - A pointer to a Null-terminated Unicode string.\r
- Str2 - A pointer to a Null-terminated Unicode string.\r
-\r
-Returns:\r
-\r
- 0 - s1 is equivalent to s2.\r
- > 0 - s1 is lexically greater than s2.\r
- < 0 - s1 is lexically less than s2.\r
-\r
---*/\r
-{\r
- while (*Str) {\r
- *Str = ToLower (*Str);\r
- Str += 1;\r
- }\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-EngStrUpr (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN OUT CHAR16 *Str\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Converts all the Unicode characters in a Null-terminated \r
- Unicode string to upper case Unicode characters.\r
-\r
-Arguments:\r
- This\r
- Str\r
-\r
-Returns:\r
- None\r
- \r
---*/\r
-{\r
- while (*Str) {\r
- *Str = ToUpper (*Str);\r
- Str += 1;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-EngMetaiMatch (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN CHAR16 *String,\r
- IN CHAR16 *Pattern\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a case-insensitive comparison between a Null-terminated\r
- Unicode pattern string and a Null-terminated Unicode string. \r
-\r
- The pattern string can use the '?' wildcard to match any character, \r
- and the '*' wildcard to match any sub-string.\r
-\r
-Arguments:\r
-\r
- This - A pointer to the EFI_UNICODE_COLLATION_PROTOCOL instance.\r
- String - A pointer to a Null-terminated Unicode string.\r
- Pattern - A pointer to a Null-terminated Unicode pattern string.\r
-\r
-Returns:\r
-\r
- TRUE - Pattern was found in String.\r
- FALSE - Pattern was not found in String.\r
-\r
---*/\r
-{\r
- CHAR16 CharC;\r
- CHAR16 CharP;\r
- CHAR16 Index3;\r
-\r
- for (;;) {\r
- CharP = *Pattern;\r
- Pattern += 1;\r
-\r
- switch (CharP) {\r
- case 0:\r
- //\r
- // End of pattern. If end of string, TRUE match\r
- //\r
- if (*String) {\r
- return FALSE;\r
- } else {\r
- return TRUE;\r
- }\r
-\r
- case '*':\r
- //\r
- // Match zero or more chars\r
- //\r
- while (*String) {\r
- if (EngMetaiMatch (This, String, Pattern)) {\r
- return TRUE;\r
- }\r
-\r
- String += 1;\r
- }\r
-\r
- return EngMetaiMatch (This, String, Pattern);\r
-\r
- case '?':\r
- //\r
- // Match any one char\r
- //\r
- if (!*String) {\r
- return FALSE;\r
- }\r
-\r
- String += 1;\r
- break;\r
-\r
- case '[':\r
- //\r
- // Match char set\r
- //\r
- CharC = *String;\r
- if (!CharC) {\r
- //\r
- // syntax problem\r
- //\r
- return FALSE;\r
- }\r
-\r
- Index3 = 0;\r
- CharP = *Pattern++;\r
- while (CharP) {\r
- if (CharP == ']') {\r
- return FALSE;\r
- }\r
-\r
- if (CharP == '-') {\r
- //\r
- // if range of chars, get high range\r
- //\r
- CharP = *Pattern;\r
- if (CharP == 0 || CharP == ']') {\r
- //\r
- // syntax problem\r
- //\r
- return FALSE;\r
- }\r
-\r
- if (ToUpper (CharC) >= ToUpper (Index3) && ToUpper (CharC) <= ToUpper (CharP)) {\r
- //\r
- // if in range, it's a match\r
- //\r
- break;\r
- }\r
- }\r
-\r
- Index3 = CharP;\r
- if (ToUpper (CharC) == ToUpper (CharP)) {\r
- //\r
- // if char matches\r
- //\r
- break;\r
- }\r
-\r
- CharP = *Pattern++;\r
- }\r
- //\r
- // skip to end of match char set\r
- //\r
- while (CharP && CharP != ']') {\r
- CharP = *Pattern;\r
- Pattern += 1;\r
- }\r
-\r
- String += 1;\r
- break;\r
-\r
- default:\r
- CharC = *String;\r
- if (ToUpper (CharC) != ToUpper (CharP)) {\r
- return FALSE;\r
- }\r
-\r
- String += 1;\r
- break;\r
- }\r
- }\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-EngFatToStr (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN UINTN FatSize,\r
- IN CHAR8 *Fat,\r
- OUT CHAR16 *String\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Converts an 8.3 FAT file name using an OEM character set \r
- to a Null-terminated Unicode string.\r
-\r
- BUGBUG: Function has to expand DBCS FAT chars, currently not.\r
-\r
-Arguments:\r
- This\r
- FatSize\r
- Fat\r
- String\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- //\r
- // No DBCS issues, just expand and add null terminate to end of string\r
- //\r
- while (*Fat && FatSize) {\r
- *String = *Fat;\r
- String += 1;\r
- Fat += 1;\r
- FatSize -= 1;\r
- }\r
-\r
- *String = 0;\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-EngStrToFat (\r
- IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
- IN CHAR16 *String,\r
- IN UINTN FatSize,\r
- OUT CHAR8 *Fat\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Converts a Null-terminated Unicode string to legal characters \r
- in a FAT filename using an OEM character set.\r
-\r
- Functions has to crunch string to a fat string. Replacing\r
- any chars that can't be represented in the fat name.\r
-\r
-Arguments:\r
- This\r
- String\r
- FatSize\r
- Fat\r
-\r
-Returns:\r
- TRUE\r
- FALSE\r
---*/\r
-{\r
- BOOLEAN SpecialCharExist;\r
-\r
- SpecialCharExist = FALSE;\r
- while (*String && FatSize) {\r
- //\r
- // Skip '.' or ' ' when making a fat name\r
- //\r
- if (*String != '.' && *String != ' ') {\r
- //\r
- // If this is a valid fat char, move it.\r
- // Otherwise, move a '_' and flag the fact that the name needs an Lfn\r
- //\r
- if (*String < 0x100 && (mEngInfoMap[*String] & CHAR_FAT_VALID)) {\r
- *Fat = mEngUpperMap[*String];\r
- } else {\r
- *Fat = '_';\r
- SpecialCharExist = TRUE;\r
- }\r
-\r
- Fat += 1;\r
- FatSize -= 1;\r
- }\r
-\r
- String += 1;\r
- }\r
- //\r
- // Do not terminate that fat string\r
- //\r
- return SpecialCharExist;\r
-}\r