]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/Language.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / Language.c
CommitLineData
f4cd24da
RN
1/** @file\r
2 Language settings\r
3\r
d1102dba 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
f4cd24da
RN
6\r
7**/\r
8\r
9#include "Bds.h"\r
1436aea4 10#define ISO_639_2_ENTRY_SIZE 3\r
f4cd24da
RN
11\r
12/**\r
13 Check if lang is in supported language codes according to language string.\r
14\r
15 This code is used to check if lang is in in supported language codes. It can handle\r
16 RFC4646 and ISO639 language tags.\r
17 In ISO639 language tags, take 3-characters as a delimitation to find matched string.\r
18 In RFC4646 language tags, take semicolon as a delimitation to find matched string.\r
19\r
20 For example:\r
21 SupportedLang = "engfraengfra"\r
22 Iso639Language = TRUE\r
23 Lang = "eng", the return value is "TRUE", or\r
24 Lang = "chs", the return value is "FALSE".\r
25 Another example:\r
26 SupportedLang = "en;fr;en-US;fr-FR"\r
27 Iso639Language = FALSE\r
28 Lang = "en", the return value is "TRUE", or\r
29 Lang = "zh", the return value is "FALSE".\r
30\r
31 @param SupportedLang Platform supported language codes.\r
32 @param Lang Configured language.\r
33 @param Iso639Language A bool value to signify if the handler is operated on ISO639 or RFC4646.\r
34\r
35 @retval TRUE lang is in supported language codes.\r
36 @retval FALSE lang is not in supported language codes.\r
37\r
38**/\r
39BOOLEAN\r
1436aea4
MK
40IsLangInSupportedLangCodes (\r
41 IN CHAR8 *SupportedLang,\r
42 IN CHAR8 *Lang,\r
43 IN BOOLEAN Iso639Language\r
d1102dba 44 )\r
f4cd24da 45{\r
1436aea4
MK
46 UINTN Index;\r
47 UINTN CompareLength;\r
48 UINTN LanguageLength;\r
f4cd24da
RN
49\r
50 if (Iso639Language) {\r
51 CompareLength = ISO_639_2_ENTRY_SIZE;\r
52 for (Index = 0; Index < AsciiStrLen (SupportedLang); Index += CompareLength) {\r
53 if (AsciiStrnCmp (Lang, SupportedLang + Index, CompareLength) == 0) {\r
54 //\r
55 // Successfully find the Lang string in SupportedLang string.\r
56 //\r
57 return TRUE;\r
58 }\r
59 }\r
1436aea4 60\r
f4cd24da
RN
61 return FALSE;\r
62 } else {\r
63 //\r
64 // Compare RFC4646 language code\r
65 //\r
1436aea4
MK
66 for (LanguageLength = 0; Lang[LanguageLength] != '\0'; LanguageLength++) {\r
67 }\r
f4cd24da 68\r
1436aea4 69 for ( ; *SupportedLang != '\0'; SupportedLang += CompareLength) {\r
f4cd24da
RN
70 //\r
71 // Skip ';' characters in SupportedLang\r
72 //\r
1436aea4
MK
73 for ( ; *SupportedLang != '\0' && *SupportedLang == ';'; SupportedLang++) {\r
74 }\r
75\r
f4cd24da
RN
76 //\r
77 // Determine the length of the next language code in SupportedLang\r
78 //\r
1436aea4
MK
79 for (CompareLength = 0; SupportedLang[CompareLength] != '\0' && SupportedLang[CompareLength] != ';'; CompareLength++) {\r
80 }\r
d1102dba
LG
81\r
82 if ((CompareLength == LanguageLength) &&\r
1436aea4
MK
83 (AsciiStrnCmp (Lang, SupportedLang, CompareLength) == 0))\r
84 {\r
f4cd24da
RN
85 //\r
86 // Successfully find the Lang string in SupportedLang string.\r
87 //\r
88 return TRUE;\r
89 }\r
90 }\r
1436aea4 91\r
f4cd24da
RN
92 return FALSE;\r
93 }\r
94}\r
95\r
96/**\r
97 Initialize Lang or PlatformLang variable, if Lang or PlatformLang variable is not found,\r
98 or it has been set to an unsupported value(not one of platform supported language codes),\r
99 set the default language code to it.\r
100\r
101 @param LangName Language name, L"Lang" or L"PlatformLang".\r
102 @param SupportedLang Platform supported language codes.\r
103 @param DefaultLang Default language code.\r
104 @param Iso639Language A bool value to signify if the handler is operated on ISO639 or RFC4646,\r
105 TRUE for L"Lang" LangName or FALSE for L"PlatformLang" LangName.\r
106\r
107**/\r
108VOID\r
109InitializeLangVariable (\r
1436aea4
MK
110 IN CHAR16 *LangName,\r
111 IN CHAR8 *SupportedLang,\r
112 IN CHAR8 *DefaultLang,\r
113 IN BOOLEAN Iso639Language\r
f4cd24da
RN
114 )\r
115{\r
1436aea4 116 CHAR8 *Lang;\r
f4cd24da
RN
117\r
118 //\r
119 // Find current Lang or PlatformLang from EFI Variable.\r
120 //\r
1436aea4 121 GetEfiGlobalVariable2 (LangName, (VOID **)&Lang, NULL);\r
f4cd24da
RN
122\r
123 //\r
124 // If Lang or PlatformLang variable is not found,\r
125 // or it has been set to an unsupported value(not one of the supported language codes),\r
126 // set the default language code to it.\r
127 //\r
128 if ((Lang == NULL) || !IsLangInSupportedLangCodes (SupportedLang, Lang, Iso639Language)) {\r
129 //\r
130 // The default language code should be one of the supported language codes.\r
131 //\r
132 ASSERT (IsLangInSupportedLangCodes (SupportedLang, DefaultLang, Iso639Language));\r
133 BdsDxeSetVariableAndReportStatusCodeOnError (\r
134 LangName,\r
135 &gEfiGlobalVariableGuid,\r
136 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
137 AsciiStrSize (DefaultLang),\r
138 DefaultLang\r
139 );\r
140 }\r
141\r
142 if (Lang != NULL) {\r
143 FreePool (Lang);\r
144 }\r
145}\r
146\r
147/**\r
148 Determine the current language that will be used\r
149 based on language related EFI Variables.\r
150\r
151 @param LangCodesSettingRequired - If required to set LangCodes variable\r
152\r
153**/\r
154VOID\r
155InitializeLanguage (\r
1436aea4 156 BOOLEAN LangCodesSettingRequired\r
f4cd24da
RN
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 CHAR8 *LangCodes;\r
161 CHAR8 *PlatformLangCodes;\r
162\r
1436aea4 163 LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);\r
f4cd24da
RN
164 PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);\r
165 if (LangCodesSettingRequired) {\r
166 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
167 //\r
168 // UEFI 2.1 depricated this variable so we support turning it off\r
169 //\r
170 Status = gRT->SetVariable (\r
171 L"LangCodes",\r
172 &gEfiGlobalVariableGuid,\r
173 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
174 AsciiStrSize (LangCodes),\r
175 LangCodes\r
176 );\r
177 //\r
178 // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail.\r
179 //\r
1436aea4 180 ASSERT_EFI_ERROR (Status);\r
f4cd24da
RN
181 }\r
182\r
183 Status = gRT->SetVariable (\r
184 L"PlatformLangCodes",\r
185 &gEfiGlobalVariableGuid,\r
186 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
187 AsciiStrSize (PlatformLangCodes),\r
188 PlatformLangCodes\r
189 );\r
190 //\r
191 // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail.\r
192 //\r
1436aea4 193 ASSERT_EFI_ERROR (Status);\r
f4cd24da
RN
194 }\r
195\r
196 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
197 //\r
198 // UEFI 2.1 depricated this variable so we support turning it off\r
199 //\r
1436aea4 200 InitializeLangVariable (L"Lang", LangCodes, (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang), TRUE);\r
f4cd24da 201 }\r
1436aea4
MK
202\r
203 InitializeLangVariable (L"PlatformLang", PlatformLangCodes, (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang), FALSE);\r
f4cd24da 204}\r