-/**\r
- Convert language code from RFC3066 to ISO639-2.\r
-\r
- @param LanguageRfc3066 RFC3066 language code.\r
- @param LanguageIso639 ISO639-2 language code.\r
-\r
- @retval EFI_SUCCESS Language code converted.\r
- @retval EFI_NOT_FOUND Language code not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertRfc3066LanguageToIso639Language (\r
- IN CHAR8 *LanguageRfc3066,\r
- OUT CHAR8 *LanguageIso639\r
- )\r
-{\r
- UINTN Index;\r
-\r
- if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {\r
- CopyMem (LanguageIso639, LanguageRfc3066, 3);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {\r
- CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Convert language code from ISO639-2 to RFC3066 and return the converted language.\r
- Caller is responsible for freeing the allocated buffer.\r
-\r
- LanguageIso639 contain a single ISO639-2 code such as\r
- "eng" or "fra".\r
-\r
- If LanguageIso639 is NULL, then ASSERT.\r
- If LanguageRfc3066 is NULL, then ASSERT.\r
-\r
- @param LanguageIso639 ISO639-2 language code.\r
-\r
- @return the allocated buffer or NULL, if the language is not found.\r
-\r
-**/\r
-CHAR8*\r
-EFIAPI\r
-ConvertIso639LanguageToRfc3066Language (\r
- IN CONST CHAR8 *LanguageIso639\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *Rfc3066Language;\r
- \r
- for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3) == 0) {\r
- Rfc3066Language = AllocateZeroPool (3);\r
- if (Rfc3066Language != NULL) {\r
- Rfc3066Language = CopyMem (Rfc3066Language, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
- }\r
- return Rfc3066Language;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will\r
- be converted to "engfra".\r
-\r
- @param SupportedLanguages The RFC3066 language list.\r
-\r
- @return The ISO639-2 language list.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-Rfc3066ToIso639 (\r
- CHAR8 *SupportedLanguages\r
- )\r
-{\r
- CHAR8 *Languages;\r
- CHAR8 *ReturnValue;\r
- CHAR8 *LangCodes;\r
- CHAR8 *LangRfc3066;\r
- CHAR8 LangIso639[ISO_639_2_ENTRY_SIZE];\r
- UINTN LanguageSize;\r
- EFI_STATUS Status;\r
-\r
- LanguageSize = AsciiStrSize (SupportedLanguages);\r
- ReturnValue = AllocateZeroPool (LanguageSize);\r
- if (ReturnValue == NULL) {\r
- return ReturnValue;\r
- }\r
-\r
- //\r
- // Allocate working buffer to contain substring in SupportedLanguages;\r
- //\r
- LangRfc3066 = AllocatePool (LanguageSize);\r
- if (LangRfc3066 == NULL) {\r
- FreePool (ReturnValue);\r
- return NULL;\r
- }\r
- Languages = ReturnValue;\r
- LangCodes = SupportedLanguages;\r
- while (*LangCodes != 0) {\r
- HiiLibGetNextLanguage (&LangCodes, LangRfc3066);\r
-\r
- Status = ConvertRfc3066LanguageToIso639Language (LangRfc3066, LangIso639);\r
- if (!EFI_ERROR (Status)) {\r
- CopyMem (Languages, LangIso639, 3);\r
- Languages = Languages + 3;\r
- }\r
- }\r
-\r
- FreePool (LangRfc3066);\r
- return ReturnValue;\r
-}\r
-\r
-\r