Refine language conversion in ECP. Create a new library LanguageLib providing functio...
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 May 2009 01:51:35 +0000 (01:51 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 May 2009 01:51:35 +0000 (01:51 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8258 6f19259b-4bc3-4df7-8a09-765794883524

13 files changed:
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c
EdkCompatibilityPkg/Compatibility/Include/Library/LanguageLib.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/Library/LanguageLib.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/Library/LanguageLib.inf [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2OnUcThunk.c
EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2OnUcThunk.inf
EdkCompatibilityPkg/Compatibility/UcOnUc2Thunk/UcOnUc2Thunk.c
EdkCompatibilityPkg/Compatibility/UcOnUc2Thunk/UcOnUc2Thunk.inf
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dsc

index 2b03718..1c0c362 100644 (file)
@@ -66,6 +66,7 @@
   MdeModulePkg/MdeModulePkg.dec\r
   IntelFrameworkPkg/IntelFrameworkPkg.dec\r
   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec\r
+  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
   \r
 [LibraryClasses]\r
   UefiRuntimeServicesTableLib\r
@@ -79,6 +80,7 @@
   PrintLib\r
   UefiLib\r
   PcdLib\r
+  LanguageLib\r
 \r
 [Guids]\r
   gEfiIfrTianoGuid\r
index a25650d..ec7159b 100644 (file)
@@ -305,65 +305,6 @@ HiiFindHandles (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-LangCodes4646To639 (\r
-  IN CHAR8 *LangCodes4646,\r
-  IN CHAR8 **LangCodes639\r
-  )\r
-{\r
-  CHAR8                      *AsciiLangCodes;\r
-  CHAR8                      *Lang;\r
-  UINTN                      Index;\r
-  UINTN                      Count;\r
-  EFI_STATUS                 Status;\r
-\r
-  ASSERT (LangCodes4646 != NULL);\r
-  ASSERT (LangCodes639 != NULL);\r
-  \r
-  //\r
-  // Allocate working buffer to contain substring of LangCodes4646.\r
-  //\r
-  Lang = AllocatePool (AsciiStrSize (LangCodes4646));\r
-  if (Lang == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  //\r
-  // Count the number of RFC 4646 language codes.\r
-  //\r
-  Index = 0;\r
-  AsciiLangCodes = LangCodes4646;\r
-  while (AsciiStrLen (AsciiLangCodes) != 0) {\r
-    GetNextLanguage (&AsciiLangCodes, Lang);\r
-    Index++;\r
-  }\r
-\r
-  Count = Index;\r
-\r
-  //\r
-  // \r
-  //\r
-  *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
-  if (*LangCodes639 == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-\r
-  AsciiLangCodes = LangCodes4646;\r
-\r
-  for (Index = 0; Index < Count; Index++) {\r
-    GetNextLanguage (&AsciiLangCodes, Lang);\r
-    Status = ConvertRfc4646LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
-    ASSERT_EFI_ERROR (Status);\r
-  }\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  FreePool (Lang);\r
-  return Status;\r
-}\r
-\r
 /**\r
   Allows a program to determine the primary languages that are supported on a given handle.\r
 \r
@@ -409,10 +350,9 @@ HiiGetPrimaryLanguages (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-\r
-  LangCodes639 = NULL;\r
-  Status = LangCodes4646To639 (LangCodes4646, &LangCodes639);\r
-  if (EFI_ERROR (Status)) {\r
+  LangCodes639 = ConvertLanguagesRfc4646ToIso639 (LangCodes4646);\r
+  if (LangCodes639 == NULL) {\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
   \r
@@ -427,6 +367,7 @@ HiiGetPrimaryLanguages (
   //\r
   AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
   *LanguageString = UnicodeLangCodes639;\r
+  Status = EFI_SUCCESS;\r
 \r
 Done:\r
   FreePool (LangCodes4646);\r
@@ -551,7 +492,7 @@ HiiGetSecondaryLanguages (
 \r
   UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
 \r
-  PrimaryLang4646 = ConvertIso639LanguageToRfc4646Language (PrimaryLang639);\r
+  PrimaryLang4646 = ConvertLanguagesIso639ToRfc4646 (PrimaryLang639);\r
   ASSERT_EFI_ERROR (PrimaryLang4646 != NULL);\r
 \r
   SecLangCodes4646 = HiiGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang4646);\r
@@ -561,8 +502,9 @@ HiiGetSecondaryLanguages (
     goto Done;\r
   }\r
 \r
-  Status = LangCodes4646To639 (SecLangCodes4646, &SecLangCodes639);\r
-  if (EFI_ERROR (Status)) {\r
+  SecLangCodes639 = ConvertLanguagesIso639ToRfc4646 (SecLangCodes4646);\r
+  if (SecLangCodes639 == NULL) {\r
+    Status =  EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
 \r
@@ -576,6 +518,7 @@ HiiGetSecondaryLanguages (
   // The language returned is in RFC 4646 format.\r
   //\r
   *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
+  Status = EFI_SUCCESS;\r
 \r
 Done:\r
   if (PrimaryLang639 != NULL) {\r
index 1ae31b4..9878df4 100644 (file)
@@ -47,6 +47,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/HiiLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/PcdLib.h>\r
+#include <Library/LanguageLib.h>\r
 \r
 #include <Guid/MdeModuleHii.h>\r
 \r
index daf652c..d0b356b 100644 (file)
@@ -15,299 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
-typedef struct {\r
-  CHAR8 *Iso639;\r
-  CHAR8 *Rfc4646;\r
-} ISO639TORFC4646MAP;\r
-\r
-ISO639TORFC4646MAP Iso639ToRfc4646Map [] = {\r
-    {"eng", "en-US"},\r
-    {"fra", "fr-FR"},\r
-};\r
-\r
-//\r
-// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
-// Each entry is 5 CHAR8 values long.  The first 3 CHAR8 values are the ISO 639-2 code.\r
-// The last 2 CHAR8 values are the ISO 639-1 code.\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc4646ConversionTable[] =\r
-"\\r
-aaraa\\r
-abkab\\r
-afraf\\r
-amham\\r
-araar\\r
-asmas\\r
-aymay\\r
-azeaz\\r
-bakba\\r
-belbe\\r
-benbn\\r
-bihbh\\r
-bisbi\\r
-bodbo\\r
-brebr\\r
-bulbg\\r
-catca\\r
-cescs\\r
-corkw\\r
-cosco\\r
-cymcy\\r
-danda\\r
-deude\\r
-dzodz\\r
-ellel\\r
-engen\\r
-epoeo\\r
-estet\\r
-euseu\\r
-faofo\\r
-fasfa\\r
-fijfj\\r
-finfi\\r
-frafr\\r
-fryfy\\r
-gaiga\\r
-gdhgd\\r
-glggl\\r
-grngn\\r
-gujgu\\r
-hauha\\r
-hebhe\\r
-hinhi\\r
-hrvhr\\r
-hunhu\\r
-hyehy\\r
-ikuiu\\r
-ileie\\r
-inaia\\r
-indid\\r
-ipkik\\r
-islis\\r
-itait\\r
-jawjw\\r
-jpnja\\r
-kalkl\\r
-kankn\\r
-kasks\\r
-katka\\r
-kazkk\\r
-khmkm\\r
-kinrw\\r
-kirky\\r
-korko\\r
-kurku\\r
-laolo\\r
-latla\\r
-lavlv\\r
-linln\\r
-litlt\\r
-ltzlb\\r
-malml\\r
-marmr\\r
-mkdmk\\r
-mlgmg\\r
-mltmt\\r
-molmo\\r
-monmn\\r
-mrimi\\r
-msams\\r
-myamy\\r
-nauna\\r
-nepne\\r
-nldnl\\r
-norno\\r
-ocioc\\r
-ormom\\r
-panpa\\r
-polpl\\r
-porpt\\r
-pusps\\r
-quequ\\r
-rohrm\\r
-ronro\\r
-runrn\\r
-rusru\\r
-sagsg\\r
-sansa\\r
-sinsi\\r
-slksk\\r
-slvsl\\r
-smise\\r
-smosm\\r
-snasn\\r
-sndsd\\r
-somso\\r
-sotst\\r
-spaes\\r
-sqisq\\r
-srpsr\\r
-sswss\\r
-sunsu\\r
-swasw\\r
-swesv\\r
-tamta\\r
-tattt\\r
-telte\\r
-tgktg\\r
-tgltl\\r
-thath\\r
-tsnts\\r
-tuktk\\r
-twitw\\r
-uigug\\r
-ukruk\\r
-urdur\\r
-uzbuz\\r
-vievi\\r
-volvo\\r
-wolwo\\r
-xhoxh\\r
-yidyi\\r
-zhaza\\r
-zhozh\\r
-zulzu\\r
-";\r
-\r
-CHAR8 *\r
-ConvertIso639ToRfc4646 (\r
-  CHAR8 *Iso638Lang\r
-  )\r
-{\r
-  UINTN Index;\r
-  CHAR8 AsciiLanguage[ISO_639_2_ENTRY_SIZE + 1];\r
-  \r
-  AsciiStrnCpy (AsciiLanguage, Iso638Lang, sizeof (AsciiLanguage));\r
-  for (Index = 0; Index < ISO_639_2_ENTRY_SIZE + 1; Index ++) {\r
-       if (AsciiLanguage [Index] == 0) {\r
-               break;\r
-       } else if (AsciiLanguage [Index] >= 'A' && AsciiLanguage [Index] <= 'Z') {\r
-               AsciiLanguage [Index] = (CHAR8) (AsciiLanguage [Index] - 'A' + 'a');\r
-       }\r
-  }\r
-\r
-  for (Index = 0; Index < sizeof (Iso639ToRfc4646Map) / sizeof (Iso639ToRfc4646Map[0]); Index++) {\r
-    if (AsciiStrnCmp (AsciiLanguage, Iso639ToRfc4646Map[Index].Iso639, AsciiStrSize (AsciiLanguage)) == 0) {\r
-      return Iso639ToRfc4646Map[Index].Rfc4646;\r
-    }\r
-  }\r
-\r
-  return (CHAR8 *) NULL;\r
-}\r
-\r
-/**\r
-  Convert language code from RFC4646 to ISO639-2.\r
-\r
-  @param  LanguageRfc4646        RFC4646 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
-ConvertRfc4646LanguageToIso639Language (\r
-  IN  CHAR8   *LanguageRfc4646,\r
-  OUT CHAR8   *LanguageIso639\r
-  )\r
-{\r
-  UINTN  Index;\r
-\r
-  if ((LanguageRfc4646[2] != '-') && (LanguageRfc4646[2] != 0)) {\r
-    CopyMem (LanguageIso639, LanguageRfc4646, 3);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
-    if (CompareMem (LanguageRfc4646, &Iso639ToRfc4646ConversionTable[Index + 3], 2) == 0) {\r
-      CopyMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[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 RFC4646 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 LanguageRfc4646 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
-ConvertIso639LanguageToRfc4646Language (\r
-  IN  CONST CHAR8   *LanguageIso639\r
-  )\r
-{\r
-  UINTN Index;\r
-  CHAR8 *Rfc4646Language;\r
-  \r
-  for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
-    if (CompareMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[Index], 3) == 0) {\r
-      Rfc4646Language = AllocateZeroPool (3);\r
-      if (Rfc4646Language != NULL) {\r
-        Rfc4646Language = CopyMem (Rfc4646Language, &Iso639ToRfc4646ConversionTable[Index + 3], 2);\r
-      }\r
-      return Rfc4646Language;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  Get next language from language code list (with separator ';').\r
-\r
-  If LangCode is NULL, then ASSERT.\r
-  If Lang is NULL, then ASSERT.\r
-\r
-  @param  LangCode    On input: point to first language in the list. On\r
-                                 output: point to next language in the list, or\r
-                                 NULL if no more language in the list.\r
-  @param  Lang           The first language in the list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-GetNextLanguage (\r
-  IN OUT CHAR8      **LangCode,\r
-  OUT CHAR8         *Lang\r
-  )\r
-{\r
-  UINTN  Index;\r
-  CHAR8  *StringPtr;\r
-\r
-  ASSERT (LangCode != NULL);\r
-  ASSERT (*LangCode != NULL);\r
-  ASSERT (Lang != NULL);\r
-\r
-  Index = 0;\r
-  StringPtr = *LangCode;\r
-  while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
-    Index++;\r
-  }\r
-\r
-  CopyMem (Lang, StringPtr, Index);\r
-  Lang[Index] = 0;\r
-\r
-  if (StringPtr[Index] == ';') {\r
-    Index++;\r
-  }\r
-  *LangCode = StringPtr + Index;\r
-}\r
-\r
 /**\r
   Test if all of the characters in a string have corresponding font characters.\r
 \r
@@ -468,7 +175,7 @@ HiiNewString (
     ZeroMem (LanguageCopy, sizeof (LanguageCopy));\r
     CopyMem (LanguageCopy, Language, ISO_639_2_ENTRY_SIZE * sizeof (CHAR16));\r
     UnicodeStrToAsciiStr (LanguageCopy, AsciiLanguage);\r
-    Rfc4646AsciiLanguage = ConvertIso639ToRfc4646 (AsciiLanguage);\r
+    Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (AsciiLanguage);\r
     ASSERT (Rfc4646AsciiLanguage != NULL);\r
   }\r
 \r
@@ -614,7 +321,7 @@ HiiThunkGetString (
     // Caller of Framework HII Interface uses the Language Identification String defined \r
     // in Iso639. So map it to the Language Identifier defined in RFC4646.\r
     //\r
-    Rfc4646AsciiLanguage = ConvertIso639ToRfc4646 (Iso639AsciiLanguage);\r
+    Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (Iso639AsciiLanguage);\r
 \r
     //\r
     // If Rfc4646AsciiLanguage is NULL, more language mapping must be added to \r
diff --git a/EdkCompatibilityPkg/Compatibility/Include/Library/LanguageLib.h b/EdkCompatibilityPkg/Compatibility/Include/Library/LanguageLib.h
new file mode 100644 (file)
index 0000000..cc9a5d3
--- /dev/null
@@ -0,0 +1,116 @@
+/** @file\r
+  Provides functions for language conversion between ISO 639-2 and RFC 4646 styles.\r
+\r
+Copyright (c) 2009, Intel Corporation<BR>\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
+**/\r
+\r
+#ifndef __LANGUAGE_LIB__\r
+#define __LANGUAGE_LIB__\r
+\r
+/**\r
+  Convert an ISO 639-2 language code to a RFC 4646 language code.\r
+  If the ISO 639-2 language code has a corresponding ISO 639-1 code, then the ISO 639-1\r
+  code is returned. Else the original ISO 639-2 code is returned. The returned RFC 4646\r
+  language code is composed of only a primary language subtag.\r
+\r
+  If Iso639Language is NULL, then ASSERT.\r
+  If Rfc4646Language is NULL, then ASSERT.\r
+\r
+  @param[out] Rfc4646Language  Pointers to a buffer large enough for an ASCII string\r
+                               which reprsents a RFC 4646 language code containging only\r
+                               either a ISO 639-1 or ISO 639-2 primary language subtag.\r
+                               This string is Null-terminated.\r
+  @param[in]  Iso639Language   Pointer to a 3-letter ASCII string which represents\r
+                               an ISO 639-2 language code. This string is not required\r
+                               to be Null-terminated.\r
+\r
+  @retval TRUE                 The ISO 639-2 language code was converted to a ISO 639-1 code.\r
+  @retval FALSE                The language code does not have corresponding ISO 639-1 code.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ConvertIso639ToRfc4646 (\r
+  OUT CHAR8        *Rfc4646Language,\r
+  IN  CONST CHAR8  *Iso639Language\r
+  );\r
+\r
+/**\r
+  Convert a RFC 4646 language code to an ISO 639-2 language code. The primary language\r
+  subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code. If the primary\r
+  language subtag is an ISO 639-1 code, then it is converted to its corresponding ISO 639-2\r
+  code (T code if applies). Else the ISO 639-2 code is returned.\r
+\r
+  If Rfc4646Language is NULL, then ASSERT.\r
+  If Iso639Language is NULL, then ASSERT.\r
+\r
+  @param[out] Iso639Language   Pointers to a buffer large enough for a 3-letter ASCII string\r
+                               which reprsents an ISO 639-2 language code. The string is Null-terminated.\r
+  @param[in]  Rfc4646Language  Pointer to a RFC 4646 language code string. This string is terminated\r
+                               by a NULL or a ';' character.\r
+\r
+  @retval TRUE                 Language code converted successfully.\r
+  @retval FALSE                The RFC 4646 language code is invalid or unsupported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ConvertRfc4646ToIso639 (\r
+  OUT CHAR8        *Iso639Language,\r
+  IN  CONST CHAR8  *Rfc4646Language\r
+  );\r
+\r
+/**\r
+  Convert ISO 639-2 language codes to RFC 4646 codes and return the converted codes.\r
+  Caller is responsible for freeing the allocated buffer.\r
+\r
+  If Iso639Languages is NULL, then ASSERT.\r
+\r
+  @param[in] Iso639Languages  Pointers to a Null-terminated ISO 639-2 language codes string containing\r
+                              one or more ISO 639-2 3-letter language codes.\r
+  \r
+  @retval NULL                Invalid ISO 639-2 language code found.\r
+  @retval NULL                Out of memory.\r
+  @retval !NULL               Pointer to the allocate buffer containing the Null-terminated converted language codes string.\r
+                              This string is composed of one or more RFC4646 language codes each of which has only\r
+                              ISO 639-1 2-letter primary language subtag.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+ConvertLanguagesIso639ToRfc4646 (\r
+  IN CONST CHAR8  *Iso639Languages\r
+  );\r
+\r
+/**\r
+  Convert RFC 4646 language codes to ISO 639-2 codes and return the converted codes.\r
+  The primary language subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code.\r
+  Caller is responsible for freeing the allocated buffer.\r
+\r
+  If Rfc4646Languages is NULL, then ASSERT.\r
+\r
+  @param[in] Rfc4646Languages  Pointers to a Null-terminated RFC 4646 language codes string containing\r
+                               one or more RFC 4646 language codes.\r
+  \r
+  @retval NULL                 Invalid or unsupported RFC 4646 language code found.\r
+  @retval NULL                 Out of memory.\r
+  @retval !NULL                Pointer to the allocate buffer containing the Null-terminated converted language codes string.\r
+                               This string is composed of one or more ISO 639-2 language codes.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+ConvertLanguagesRfc4646ToIso639 (\r
+  IN CONST CHAR8  *Rfc4646Languages\r
+  );\r
+\r
+\r
+#endif\r
diff --git a/EdkCompatibilityPkg/Compatibility/Library/LanguageLib.c b/EdkCompatibilityPkg/Compatibility/Library/LanguageLib.c
new file mode 100644 (file)
index 0000000..9015865
--- /dev/null
@@ -0,0 +1,499 @@
+/** @file\r
+  Language Library implementation that provides functions for language conversion\r
+  between ISO 639-2 and RFC 4646 language codes.\r
+\r
+  Copyright (c) 2009, Intel Corporation<BR>\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
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/LanguageLib.h>\r
+\r
+//\r
+// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
+// Each entry is 5 CHAR8 values long.  The first 3 CHAR8 values are the ISO 639-2 code.\r
+// The last 2 CHAR8 values are the ISO 639-1 code.\r
+//\r
+// ISO 639-2 B codes and deprecated ISO 639-1 codes are not supported.\r
+//\r
+// Commonly used language codes such as English and French are put in the front of the table for quick match.\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mIso639ToRfc4646ConversionTable[] =\r
+"\\r
+engen\\r
+frafr\\r
+aaraa\\r
+abkab\\r
+aveae\\r
+afraf\\r
+akaak\\r
+amham\\r
+argan\\r
+araar\\r
+asmas\\r
+avaav\\r
+aymay\\r
+azeaz\\r
+bakba\\r
+belbe\\r
+bulbg\\r
+bihbh\\r
+bisbi\\r
+bambm\\r
+benbn\\r
+bodbo\\r
+brebr\\r
+bosbs\\r
+catca\\r
+chece\\r
+chach\\r
+cosco\\r
+crecr\\r
+cescs\\r
+chucu\\r
+chvcv\\r
+cymcy\\r
+danda\\r
+deude\\r
+divdv\\r
+dzodz\\r
+eweee\\r
+ellel\\r
+epoeo\\r
+spaes\\r
+estet\\r
+euseu\\r
+fasfa\\r
+fulff\\r
+finfi\\r
+fijfj\\r
+faofo\\r
+fryfy\\r
+glega\\r
+glagd\\r
+glggl\\r
+grngn\\r
+gujgu\\r
+glvgv\\r
+hauha\\r
+hebhe\\r
+hinhi\\r
+hmoho\\r
+hrvhr\\r
+hatht\\r
+hunhu\\r
+hyehy\\r
+herhz\\r
+inaia\\r
+indid\\r
+ileie\\r
+iboig\\r
+iiiii\\r
+ipkik\\r
+idoio\\r
+islis\\r
+itait\\r
+ikuiu\\r
+jpnja\\r
+javjv\\r
+katka\\r
+konkg\\r
+kikki\\r
+kuakj\\r
+kazkk\\r
+kalkl\\r
+khmkm\\r
+kankn\\r
+korko\\r
+kaukr\\r
+kasks\\r
+kurku\\r
+komkv\\r
+corkw\\r
+kirky\\r
+latla\\r
+ltzlb\\r
+luglg\\r
+limli\\r
+linln\\r
+laolo\\r
+litlt\\r
+lublu\\r
+lavlv\\r
+mlgmg\\r
+mahmh\\r
+mrimi\\r
+mkdmk\\r
+malml\\r
+monmn\\r
+marmr\\r
+msams\\r
+mltmt\\r
+myamy\\r
+nauna\\r
+nobnb\\r
+ndend\\r
+nepne\\r
+ndong\\r
+nldnl\\r
+nnonn\\r
+norno\\r
+nblnr\\r
+navnv\\r
+nyany\\r
+ocioc\\r
+ojioj\\r
+ormom\\r
+orior\\r
+ossos\\r
+panpa\\r
+plipi\\r
+polpl\\r
+pusps\\r
+porpt\\r
+quequ\\r
+rohrm\\r
+runrn\\r
+ronro\\r
+rusru\\r
+kinrw\\r
+sansa\\r
+srdsc\\r
+sndsd\\r
+smese\\r
+sagsg\\r
+sinsi\\r
+slksk\\r
+slvsl\\r
+smosm\\r
+snasn\\r
+somso\\r
+sqisq\\r
+srpsr\\r
+sswss\\r
+sotst\\r
+sunsu\\r
+swesv\\r
+swasw\\r
+tamta\\r
+telte\\r
+tgktg\\r
+thath\\r
+tirti\\r
+tuktk\\r
+tgltl\\r
+tsntn\\r
+tonto\\r
+turtr\\r
+tsots\\r
+tattt\\r
+twitw\\r
+tahty\\r
+uigug\\r
+ukruk\\r
+urdur\\r
+uzbuz\\r
+venve\\r
+vievi\\r
+volvo\\r
+wlnwa\\r
+wolwo\\r
+xhoxh\\r
+yidyi\\r
+yoryo\\r
+zhaza\\r
+zhozh\\r
+zulzu\\r
+";\r
+\r
+/**\r
+  Converts upper case ASCII characters in an ASCII string to lower case ASCII \r
+  characters in an ASCII string.\r
+\r
+  If a an ASCII character in Source is in the range 'A'..'Z', then it is converted \r
+  to an ASCII character in the range 'a'..'z' in Destination.  Otherwise, no \r
+  conversion is performed.  Length ASCII characters from Source are convertered and\r
+  stored in Destination.\r
+\r
+  @param  Destination  An ASCII string to store the results of the conversion.\r
+  @param  Source       The source ASCII string of the conversion.\r
+  @param  Length       The number of ASCII characters to convert.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+InternalLanguageLibToLower (\r
+  OUT CHAR8        *Destination,\r
+  IN  CONST CHAR8  *Source,\r
+  IN  UINTN        Length\r
+  )\r
+{\r
+  for (; Length > 0; Length--, Destination++, Source++) {\r
+    *Destination = (*Source >= 'A' && *Source <= 'Z') ? *Source + ('a' - 'A') : *Source;\r
+  }\r
+}\r
+\r
+/**\r
+  Convert an ISO 639-2 language code to a RFC 4646 language code.\r
+  If the ISO 639-2 language code has a corresponding ISO 639-1 code, then the ISO 639-1\r
+  code is returned. Else the original ISO 639-2 code is returned. The returned RFC 4646\r
+  language code is composed of only a primary language subtag.\r
+\r
+  If Iso639Language is NULL, then ASSERT.\r
+  If Rfc4646Language is NULL, then ASSERT.\r
+\r
+  @param[out] Rfc4646Language  Pointers to a buffer large enough for an ASCII string\r
+                               which reprsents a RFC 4646 language code containging only\r
+                               either a ISO 639-1 or ISO 639-2 primary language subtag.\r
+                               This string is Null-terminated.\r
+  @param[in]  Iso639Language   Pointer to a 3-letter ASCII string which represents\r
+                               an ISO 639-2 language code. This string is not required\r
+                               to be Null-terminated.\r
+\r
+  @retval TRUE                 The ISO 639-2 language code was converted to a ISO 639-1 code.\r
+  @retval FALSE                The language code does not have corresponding ISO 639-1 code.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ConvertIso639ToRfc4646 (\r
+  OUT CHAR8        *Rfc4646Language,\r
+  IN  CONST CHAR8  *Iso639Language\r
+  )\r
+{\r
+  CONST CHAR8  *Match;\r
+  \r
+  ASSERT (Iso639Language != NULL);\r
+  ASSERT (Rfc4646Language != NULL);\r
+\r
+  //\r
+  // Convert first 3 characters of Iso639Language to lower case ASCII characters in Rfc4646Language\r
+  //\r
+  InternalLanguageLibToLower (Rfc4646Language, Iso639Language, 3);\r
+  Rfc4646Language[3] = '\0';\r
+\r
+  Match = mIso639ToRfc4646ConversionTable;\r
+  do {\r
+    Match = AsciiStrStr (Match, Rfc4646Language);\r
+    if (Match == NULL) {\r
+      return FALSE;\r
+    }\r
+    if (((Match - mIso639ToRfc4646ConversionTable) % 5) == 0) {\r
+      break;\r
+    }\r
+    ++Match;\r
+  } while (TRUE);\r
+  Rfc4646Language[0] = Match[3];\r
+  Rfc4646Language[1] = Match[4];\r
+  Rfc4646Language[2] = '\0';\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Convert a RFC 4646 language code to an ISO 639-2 language code. The primary language\r
+  subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code. If the primary\r
+  language subtag is an ISO 639-1 code, then it is converted to its corresponding ISO 639-2\r
+  code (T code if applies). Else the ISO 639-2 code is returned.\r
+\r
+  If Rfc4646Language is NULL, then ASSERT.\r
+  If Iso639Language is NULL, then ASSERT.\r
+\r
+  @param[out] Iso639Language   Pointers to a buffer large enough for a 3-letter ASCII string\r
+                               which reprsents an ISO 639-2 language code. The string is Null-terminated.\r
+  @param[in]  Rfc4646Language  Pointer to a RFC 4646 language code string. This string is terminated\r
+                               by a NULL or a ';' character.\r
+\r
+  @retval TRUE                 Language code converted successfully.\r
+  @retval FALSE                The RFC 4646 language code is invalid or unsupported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ConvertRfc4646ToIso639 (\r
+  OUT CHAR8        *Iso639Language,\r
+  IN  CONST CHAR8  *Rfc4646Language\r
+  )\r
+{\r
+  CONST CHAR8 *Match;\r
+  \r
+  ASSERT (Rfc4646Language != NULL);\r
+  ASSERT (Iso639Language != NULL);\r
+\r
+  //\r
+  // RFC 4646 language code check before determining \r
+  // if the primary language subtag is ISO 639-1 or 639-2 code\r
+  //\r
+  if (Rfc4646Language[0] == '\0' || Rfc4646Language[1] == '\0') {\r
+    return FALSE;\r
+  }\r
+  \r
+  //\r
+  // Check if the primary language subtag is ISO 639-1 code\r
+  //\r
+  if (Rfc4646Language[2] == ';' || Rfc4646Language[2] == '-' || Rfc4646Language[2] == '\0') {\r
+    //\r
+    // Convert first 2 characters of Rfc4646Language to lower case ASCII characters in Iso639Language\r
+    //\r
+    InternalLanguageLibToLower (Iso639Language, Rfc4646Language, 2);\r
+    //\r
+    // Convert ISO 639-1 code to ISO 639-2 code\r
+    //\r
+    Iso639Language[2] = '\0';\r
+    Match = mIso639ToRfc4646ConversionTable;\r
+    do {\r
+      Match = AsciiStrStr (Match, Iso639Language);\r
+      if (Match == NULL) {\r
+        return FALSE;\r
+      }\r
+      if (((Match - mIso639ToRfc4646ConversionTable) % 5) == 3) {\r
+        break;\r
+      }\r
+      ++Match;\r
+    } while (TRUE);\r
+    Rfc4646Language = Match - 3;\r
+  } else if (!(Rfc4646Language[3] == ';' || Rfc4646Language[3] == '-' || Rfc4646Language[3] == '\0')) {\r
+    return FALSE;\r
+  }\r
+  Iso639Language[0] = Rfc4646Language[0];\r
+  Iso639Language[1] = Rfc4646Language[1];\r
+  Iso639Language[2] = Rfc4646Language[2];\r
+  Iso639Language[3] = '\0';\r
+  return TRUE;  \r
+}\r
+\r
+/**\r
+  Convert ISO 639-2 language codes to RFC 4646 codes and return the converted codes.\r
+  Caller is responsible for freeing the allocated buffer.\r
+\r
+  If Iso639Languages is NULL, then ASSERT.\r
+\r
+  @param[in] Iso639Languages  Pointers to a Null-terminated ISO 639-2 language codes string containing\r
+                              one or more ISO 639-2 3-letter language codes.\r
+  \r
+  @retval NULL                Invalid ISO 639-2 language code found.\r
+  @retval NULL                Out of memory.\r
+  @retval !NULL               Pointer to the allocate buffer containing the Null-terminated converted language codes string.\r
+                              This string is composed of one or more RFC4646 language codes each of which has only\r
+                              ISO 639-1 2-letter primary language subtag.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+ConvertLanguagesIso639ToRfc4646 (\r
+  IN CONST CHAR8  *Iso639Languages\r
+  )\r
+{\r
+  UINTN  Length;\r
+  UINTN  Iso639Index;\r
+  UINTN  Rfc4646Index;\r
+  CHAR8  *Rfc4646Languages;\r
+  \r
+  ASSERT (Iso639Languages != NULL);\r
+  \r
+  //\r
+  // The length of ISO 639-2 lanugage codes string must be multiple of 3\r
+  //\r
+  Length = AsciiStrLen (Iso639Languages);\r
+  if (Length % 3) {\r
+    return NULL;\r
+  }\r
+  \r
+  //\r
+  // Allocate buffer for RFC 4646 language codes string\r
+  //\r
+  Rfc4646Languages = AllocatePool (Length + (Length / 3));\r
+  if (Rfc4646Languages == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  for (Iso639Index = 0, Rfc4646Index = 0; Iso639Languages[Iso639Index] != '\0'; Iso639Index += 3) {\r
+    if (ConvertIso639ToRfc4646 (&Rfc4646Languages[Rfc4646Index], &Iso639Languages[Iso639Index])) {\r
+      Rfc4646Index += 2;\r
+    } else {\r
+      Rfc4646Index += 3;\r
+    }\r
+    Rfc4646Languages[Rfc4646Index++] = ';';\r
+  }\r
+  Rfc4646Languages[Rfc4646Index - 1] = '\0';\r
+  return Rfc4646Languages;\r
+}\r
+\r
+/**\r
+  Convert RFC 4646 language codes to ISO 639-2 codes and return the converted codes.\r
+  The primary language subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code.\r
+  Caller is responsible for freeing the allocated buffer.\r
+\r
+  If Rfc4646Languages is NULL, then ASSERT.\r
+\r
+  @param[in] Rfc4646Languages  Pointers to a Null-terminated RFC 4646 language codes string containing\r
+                               one or more RFC 4646 language codes.\r
+  \r
+  @retval NULL                 Invalid or unsupported RFC 4646 language code found.\r
+  @retval NULL                 Out of memory.\r
+  @retval !NULL                Pointer to the allocate buffer containing the Null-terminated converted language codes string.\r
+                               This string is composed of one or more ISO 639-2 language codes.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+ConvertLanguagesRfc4646ToIso639 (\r
+  IN CONST CHAR8  *Rfc4646Languages\r
+  )\r
+{\r
+  UINTN  NumLanguages;\r
+  UINTN  Iso639Index;\r
+  UINTN  Rfc4646Index;\r
+  CHAR8  *Iso639Languages;\r
+\r
+  ASSERT (Rfc4646Languages != NULL);\r
+\r
+  //\r
+  // Determine the number of languages in the RFC 4646 language codes string\r
+  //\r
+  for (Rfc4646Index = 0, NumLanguages = 1; Rfc4646Languages[Rfc4646Index] != '\0'; Rfc4646Index++) {\r
+    if (Rfc4646Languages[Rfc4646Index] == ';') {\r
+      NumLanguages++;\r
+    }\r
+  }\r
+  \r
+  //\r
+  // Allocate buffer for ISO 639-2 language codes string\r
+  //\r
+  Iso639Languages = AllocateZeroPool (NumLanguages * 3 + 1);\r
+  if (Iso639Languages == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Do the conversion for each RFC 4646 language code\r
+  //\r
+  for (Rfc4646Index = 0, Iso639Index = 0; Rfc4646Languages[Rfc4646Index] != '\0';) {\r
+    if (ConvertRfc4646ToIso639 (&Iso639Languages[Iso639Index], &Rfc4646Languages[Rfc4646Index])) {\r
+      Iso639Index += 3;\r
+    } else {\r
+      FreePool (Iso639Languages);\r
+      return NULL;\r
+    }\r
+    //\r
+    // Locate next language code\r
+    //\r
+    while (Rfc4646Languages[Rfc4646Index] != ';' && Rfc4646Languages[Rfc4646Index] != '\0') {\r
+      Rfc4646Index++;\r
+    }\r
+    if (Rfc4646Languages[Rfc4646Index] == ';') {\r
+      Rfc4646Index++;\r
+    }\r
+  }\r
+  Iso639Languages[Iso639Index] = '\0';\r
+  return Iso639Languages;\r
+}\r
+\r
diff --git a/EdkCompatibilityPkg/Compatibility/Library/LanguageLib.inf b/EdkCompatibilityPkg/Compatibility/Library/LanguageLib.inf
new file mode 100644 (file)
index 0000000..1b4aed2
--- /dev/null
@@ -0,0 +1,43 @@
+#/** @file\r
+# Instance of Language Library.\r
+#\r
+# The Language Library implementation that provides functions for language conversion\r
+#  between ISO 639-2 and RFC 4646 language codes.\r
+#\r
+# Copyright (c) 2009, Intel Corporation\r
+#\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
+#  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
+#\r
+#**/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = LanguageLib\r
+  FILE_GUID                      = 283cad13-a151-4d55-be2d-96ea57392a82 \r
+  MODULE_TYPE                    = UEFI_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = LanguageLib|DXE_DRIVER DXE_SAL_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
+\r
+\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources.common]\r
+  LanguageLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
+\r
+[LibraryClasses]\r
+  MemoryAllocationLib\r
+  BaseLib\r
+  DebugLib\r
+\r
index c24bf8d..31aba70 100644 (file)
@@ -31,193 +31,7 @@ Module Name:
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
-\r
-\r
-///\r
-/// The size of a 3 character ISO639 language code.\r
-///\r
-#define ISO_639_2_ENTRY_SIZE            3\r
-\r
-//\r
-// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
-// Each entry is 5 CHAR8 values long.  The first 3 CHAR8 values are the ISO 639-2 code.\r
-// The last 2 CHAR8 values are the ISO 639-1 code.\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc4646ConversionTable[] =\r
-"\\r
-aaraa\\r
-abkab\\r
-afraf\\r
-amham\\r
-araar\\r
-asmas\\r
-aymay\\r
-azeaz\\r
-bakba\\r
-belbe\\r
-benbn\\r
-bihbh\\r
-bisbi\\r
-bodbo\\r
-brebr\\r
-bulbg\\r
-catca\\r
-cescs\\r
-corkw\\r
-cosco\\r
-cymcy\\r
-danda\\r
-deude\\r
-dzodz\\r
-ellel\\r
-engen\\r
-epoeo\\r
-estet\\r
-euseu\\r
-faofo\\r
-fasfa\\r
-fijfj\\r
-finfi\\r
-frafr\\r
-fryfy\\r
-gaiga\\r
-gdhgd\\r
-glggl\\r
-grngn\\r
-gujgu\\r
-hauha\\r
-hebhe\\r
-hinhi\\r
-hrvhr\\r
-hunhu\\r
-hyehy\\r
-ikuiu\\r
-ileie\\r
-inaia\\r
-indid\\r
-ipkik\\r
-islis\\r
-itait\\r
-jawjw\\r
-jpnja\\r
-kalkl\\r
-kankn\\r
-kasks\\r
-katka\\r
-kazkk\\r
-khmkm\\r
-kinrw\\r
-kirky\\r
-korko\\r
-kurku\\r
-laolo\\r
-latla\\r
-lavlv\\r
-linln\\r
-litlt\\r
-ltzlb\\r
-malml\\r
-marmr\\r
-mkdmk\\r
-mlgmg\\r
-mltmt\\r
-molmo\\r
-monmn\\r
-mrimi\\r
-msams\\r
-myamy\\r
-nauna\\r
-nepne\\r
-nldnl\\r
-norno\\r
-ocioc\\r
-ormom\\r
-panpa\\r
-polpl\\r
-porpt\\r
-pusps\\r
-quequ\\r
-rohrm\\r
-ronro\\r
-runrn\\r
-rusru\\r
-sagsg\\r
-sansa\\r
-sinsi\\r
-slksk\\r
-slvsl\\r
-smise\\r
-smosm\\r
-snasn\\r
-sndsd\\r
-somso\\r
-sotst\\r
-spaes\\r
-sqisq\\r
-srpsr\\r
-sswss\\r
-sunsu\\r
-swasw\\r
-swesv\\r
-tamta\\r
-tattt\\r
-telte\\r
-tgktg\\r
-tgltl\\r
-thath\\r
-tsnts\\r
-tuktk\\r
-twitw\\r
-uigug\\r
-ukruk\\r
-urdur\\r
-uzbuz\\r
-vievi\\r
-volvo\\r
-wolwo\\r
-xhoxh\\r
-yidyi\\r
-zhaza\\r
-zhozh\\r
-zulzu\\r
-";\r
-\r
-/**\r
-  Convert language code from ISO639-2 to RFC4646 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 LanguageRfc4646 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
-ConvertIso639LanguageToRfc4646Language (\r
-  IN  CONST CHAR8   *LanguageIso639\r
-  )\r
-{\r
-  UINTN Index;\r
-  CHAR8 *Rfc4646Language;\r
-  \r
-  for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
-    if (CompareMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[Index], 3) == 0) {\r
-      Rfc4646Language = AllocateZeroPool (3);\r
-      if (Rfc4646Language != NULL) {\r
-        Rfc4646Language = CopyMem (Rfc4646Language, &Iso639ToRfc4646ConversionTable[Index + 3], 2);\r
-      }\r
-      return Rfc4646Language;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
+#include <Library/LanguageLib.h>\r
 \r
 /**\r
   Performs a case-insensitive comparison of two Null-terminated Unicode \r
@@ -430,7 +244,7 @@ UcNotificationEvent (
     //\r
     // Fill in rest of private data structure\r
     //\r
-    Private->UC2.SupportedLanguages = ConvertIso639LanguageToRfc4646Language (Private->UC->SupportedLanguages);\r
+    Private->UC2.SupportedLanguages = ConvertLanguagesIso639ToRfc4646 (Private->UC->SupportedLanguages);\r
     if (Private->UC2.SupportedLanguages != NULL) {\r
 \r
       //\r
index be9db28..6c51afb 100644 (file)
@@ -44,6 +44,7 @@
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
   IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
 \r
 [LibraryClasses]\r
   UefiDriverEntryPoint\r
@@ -54,6 +55,7 @@
   MemoryAllocationLib\r
   HiiLib\r
   BaseMemoryLib\r
+  LanguageLib\r
 \r
 [Protocols]\r
   gEfiUnicodeCollation2ProtocolGuid\r
index 094c366..bba93bd 100644 (file)
@@ -31,190 +31,7 @@ Module Name:
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
-\r
-\r
-///\r
-/// The size of a 3 character ISO639 language code.\r
-///\r
-#define ISO_639_2_ENTRY_SIZE            3\r
-\r
-//\r
-// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
-// Each entry is 5 CHAR8 values long.  The first 3 CHAR8 values are the ISO 639-2 code.\r
-// The last 2 CHAR8 values are the ISO 639-1 code.\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc4646ConversionTable[] =\r
-"\\r
-aaraa\\r
-abkab\\r
-afraf\\r
-amham\\r
-araar\\r
-asmas\\r
-aymay\\r
-azeaz\\r
-bakba\\r
-belbe\\r
-benbn\\r
-bihbh\\r
-bisbi\\r
-bodbo\\r
-brebr\\r
-bulbg\\r
-catca\\r
-cescs\\r
-corkw\\r
-cosco\\r
-cymcy\\r
-danda\\r
-deude\\r
-dzodz\\r
-ellel\\r
-engen\\r
-epoeo\\r
-estet\\r
-euseu\\r
-faofo\\r
-fasfa\\r
-fijfj\\r
-finfi\\r
-frafr\\r
-fryfy\\r
-gaiga\\r
-gdhgd\\r
-glggl\\r
-grngn\\r
-gujgu\\r
-hauha\\r
-hebhe\\r
-hinhi\\r
-hrvhr\\r
-hunhu\\r
-hyehy\\r
-ikuiu\\r
-ileie\\r
-inaia\\r
-indid\\r
-ipkik\\r
-islis\\r
-itait\\r
-jawjw\\r
-jpnja\\r
-kalkl\\r
-kankn\\r
-kasks\\r
-katka\\r
-kazkk\\r
-khmkm\\r
-kinrw\\r
-kirky\\r
-korko\\r
-kurku\\r
-laolo\\r
-latla\\r
-lavlv\\r
-linln\\r
-litlt\\r
-ltzlb\\r
-malml\\r
-marmr\\r
-mkdmk\\r
-mlgmg\\r
-mltmt\\r
-molmo\\r
-monmn\\r
-mrimi\\r
-msams\\r
-myamy\\r
-nauna\\r
-nepne\\r
-nldnl\\r
-norno\\r
-ocioc\\r
-ormom\\r
-panpa\\r
-polpl\\r
-porpt\\r
-pusps\\r
-quequ\\r
-rohrm\\r
-ronro\\r
-runrn\\r
-rusru\\r
-sagsg\\r
-sansa\\r
-sinsi\\r
-slksk\\r
-slvsl\\r
-smise\\r
-smosm\\r
-snasn\\r
-sndsd\\r
-somso\\r
-sotst\\r
-spaes\\r
-sqisq\\r
-srpsr\\r
-sswss\\r
-sunsu\\r
-swasw\\r
-swesv\\r
-tamta\\r
-tattt\\r
-telte\\r
-tgktg\\r
-tgltl\\r
-thath\\r
-tsnts\\r
-tuktk\\r
-twitw\\r
-uigug\\r
-ukruk\\r
-urdur\\r
-uzbuz\\r
-vievi\\r
-volvo\\r
-wolwo\\r
-xhoxh\\r
-yidyi\\r
-zhaza\\r
-zhozh\\r
-zulzu\\r
-";\r
-\r
-/**\r
-  Convert language code from RFC4646 to ISO639-2.\r
-\r
-  @param  LanguageRfc4646        RFC4646 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
-ConvertRfc4646LanguageToIso639Language (\r
-  IN  CHAR8   *LanguageRfc4646,\r
-  OUT CHAR8   *LanguageIso639\r
-  )\r
-{\r
-  UINTN  Index;\r
-\r
-  if ((LanguageRfc4646[2] != '-') && (LanguageRfc4646[2] != 0)) {\r
-    CopyMem (LanguageIso639, LanguageRfc4646, 3);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
-    if (CompareMem (LanguageRfc4646, &Iso639ToRfc4646ConversionTable[Index + 3], 2) == 0) {\r
-      CopyMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[Index], 3);\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
+#include <Library/LanguageLib.h>\r
 \r
 /**\r
   Performs a case-insensitive comparison of two Null-terminated Unicode \r
@@ -427,10 +244,9 @@ Uc2NotificationEvent (
     //\r
     // Fill in rest of private data structure\r
     //\r
-    Private->UC.SupportedLanguages = AllocateZeroPool (ISO_639_2_ENTRY_SIZE + 1);\r
-    Status = ConvertRfc4646LanguageToIso639Language (Private->UC2->SupportedLanguages, Private->UC.SupportedLanguages);\r
+    Private->UC.SupportedLanguages = ConvertLanguagesRfc4646ToIso639 (Private->UC2->SupportedLanguages);\r
 \r
-    if (!EFI_ERROR (Status)) {\r
+    if (Private->UC.SupportedLanguages != NULL) {\r
 \r
       //\r
       // Install Firmware Volume Protocol onto same handle\r
index 600a0e6..1c776ce 100644 (file)
@@ -44,6 +44,7 @@
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
   IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+  EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
 \r
 [LibraryClasses]\r
   UefiDriverEntryPoint\r
@@ -54,6 +55,7 @@
   MemoryAllocationLib\r
   HiiLib\r
   BaseMemoryLib\r
+  LanguageLib\r
 \r
 [Protocols]\r
   gEfiUnicodeCollation2ProtocolGuid\r
index 03aeacb..2b57da8 100644 (file)
 #\r
 ################################################################################\r
 [LibraryClasses.common]\r
+  ##  @libraryclass  Provides functions for language conversion between\r
+  #                  ISO 639-2 and RFC 4646 styles.\r
+  ##\r
+  LanguageLib|Compatibility/Include/Library/LanguageLib.h\r
 \r
 [Ppis.common]\r
   gEcpPeiPciCfgPpiGuid                    = { 0xb0ee53d4, 0xa049, 0x4a79, { 0xb2, 0xff, 0x19, 0xd9, 0xfa, 0xef, 0xaa, 0x94 }} \r
index 3cdbba5..9830f4f 100644 (file)
@@ -61,6 +61,7 @@ define GCC_MACRO                 = -DEFI_SPECIFICATION_VERSION=0x00020000 -DPI_S
   PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf\r
   PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf\r
   PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf\r
+  LanguageLib|EdkCompatibilityPkg/Compatibility/Library/LanguageLib.inf\r
   \r
 [LibraryClasses.common.PEIM]\r
   HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf\r