]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/IfrSupportLib/UefiIfrString.c
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / MdeModulePkg / Library / IfrSupportLib / UefiIfrString.c
CommitLineData
93e3992d 1/** @file
2
3Copyright (c) 2007, Intel Corporation
4All rights reserved. This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution. The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13
14 UefiIfrString.c
15
16Abstract:
17
18 Common Library Routines to assist to handle String and Language.
19
20
21**/
22
23#include "UefiIfrLibraryInternal.h"
24
25//
26// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
27// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
28// The last 2 CHAR8 values are the ISO 639-1 code.
29//
30CHAR8 Iso639ToRfc3066ConversionTable[] =
31"\
32aaraa\
33abkab\
34afraf\
35amham\
36araar\
37asmas\
38aymay\
39azeaz\
40bakba\
41belbe\
42benbn\
43bihbh\
44bisbi\
45bodbo\
46brebr\
47bulbg\
48catca\
49cescs\
50corkw\
51cosco\
52cymcy\
53danda\
54deude\
55dzodz\
56ellel\
57engen\
58epoeo\
59estet\
60euseu\
61faofo\
62fasfa\
63fijfj\
64finfi\
65frafr\
66fryfy\
67gaiga\
68gdhgd\
69glggl\
70grngn\
71gujgu\
72hauha\
73hebhe\
74hinhi\
75hrvhr\
76hunhu\
77hyehy\
78ikuiu\
79ileie\
80inaia\
81indid\
82ipkik\
83islis\
84itait\
85jawjw\
86jpnja\
87kalkl\
88kankn\
89kasks\
90katka\
91kazkk\
92khmkm\
93kinrw\
94kirky\
95korko\
96kurku\
97laolo\
98latla\
99lavlv\
100linln\
101litlt\
102ltzlb\
103malml\
104marmr\
105mkdmk\
106mlgmg\
107mltmt\
108molmo\
109monmn\
110mrimi\
111msams\
112myamy\
113nauna\
114nepne\
115nldnl\
116norno\
117ocioc\
118ormom\
119panpa\
120polpl\
121porpt\
122pusps\
123quequ\
124rohrm\
125ronro\
126runrn\
127rusru\
128sagsg\
129sansa\
130sinsi\
131slksk\
132slvsl\
133smise\
134smosm\
135snasn\
136sndsd\
137somso\
138sotst\
139spaes\
140sqisq\
141srpsr\
142sswss\
143sunsu\
144swasw\
145swesv\
146tamta\
147tattt\
148telte\
149tgktg\
150tgltl\
151thath\
152tsnts\
153tuktk\
154twitw\
155uigug\
156ukruk\
157urdur\
158uzbuz\
159vievi\
160volvo\
161wolwo\
162xhoxh\
163yidyi\
164zhaza\
165zhozh\
166zulzu\
167";
168
169
170/**
171 Convert language code from RFC3066 to ISO639-2.
172
173 @param LanguageRfc3066 RFC3066 language code.
174 @param LanguageIso639 ISO639-2 language code.
175
176 @retval EFI_SUCCESS Language code converted.
177 @retval EFI_NOT_FOUND Language code not found.
178
179**/
180EFI_STATUS
181ConvertRfc3066LanguageToIso639Language (
182 CHAR8 *LanguageRfc3066,
183 CHAR8 *LanguageIso639
184 )
185{
186 UINTN Index;
187
188 if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {
189 CopyMem (LanguageIso639, LanguageRfc3066, 3);
190 return EFI_SUCCESS;
191 }
192
193 for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {
194 if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {
195 CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);
196 return EFI_SUCCESS;
197 }
198 }
199
200 return EFI_NOT_FOUND;
201}
202
203
204/**
205 Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will
206 be converted to "engfra".
207
208 @param SupportedLanguages The RFC3066 language list.
209
210 @return The ISO639-2 language list.
211
212**/
213CHAR8 *
214Rfc3066ToIso639 (
215 CHAR8 *SupportedLanguages
216 )
217{
218 CHAR8 *Languages;
219 CHAR8 *ReturnValue;
220 CHAR8 *LangCodes;
221 CHAR8 LangRfc3066[RFC_3066_ENTRY_SIZE];
222 CHAR8 LangIso639[ISO_639_2_ENTRY_SIZE];
223 EFI_STATUS Status;
224
225 ReturnValue = AllocateZeroPool (AsciiStrSize (SupportedLanguages));
226 if (ReturnValue == NULL) {
227 return ReturnValue;
228 }
229
230 Languages = ReturnValue;
231 LangCodes = SupportedLanguages;
232 while (*LangCodes != 0) {
233 GetNextLanguage (&LangCodes, LangRfc3066);
234
235 Status = ConvertRfc3066LanguageToIso639Language (LangRfc3066, LangIso639);
236 if (!EFI_ERROR (Status)) {
237 CopyMem (Languages, LangIso639, 3);
238 Languages = Languages + 3;
239 }
240 }
241
242 return ReturnValue;
243}
244
245
246/**
247 Determine what is the current language setting
248
249 @param Lang Pointer of system language
250
251 @return Status code
252
253**/
254EFI_STATUS
255GetCurrentLanguage (
256 OUT CHAR8 *Lang
257 )
258{
259 EFI_STATUS Status;
260 UINTN Size;
261
262 //
263 // Get current language setting
264 //
265 Size = RFC_3066_ENTRY_SIZE;
266 Status = gRT->GetVariable (
267 L"PlatformLang",
268 &gEfiGlobalVariableGuid,
269 NULL,
270 &Size,
271 Lang
272 );
273
274 if (EFI_ERROR (Status)) {
275 AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));
276 }
277
278 return Status;
279}
280
281
282/**
283 Get next language from language code list (with separator ';').
284
285 @param LangCode On input: point to first language in the list. On
286 output: point to next language in the list, or
287 NULL if no more language in the list.
288 @param Lang The first language in the list.
289
290 @return None.
291
292**/
293VOID
294GetNextLanguage (
295 IN OUT CHAR8 **LangCode,
296 OUT CHAR8 *Lang
297 )
298{
299 UINTN Index;
300 CHAR8 *StringPtr;
301
302 if (LangCode == NULL || *LangCode == NULL) {
303 *Lang = 0;
304 return;
305 }
306
307 Index = 0;
308 StringPtr = *LangCode;
309 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
310 Index++;
311 }
312
313 CopyMem (Lang, StringPtr, Index);
314 Lang[Index] = 0;
315
316 if (StringPtr[Index] == ';') {
317 Index++;
318 }
319 *LangCode = StringPtr + Index;
320}
321
322
323/**
324 This function returns the list of supported languages, in the format specified
325