]>
Commit | Line | Data |
---|---|---|
93e3992d | 1 | /** @file |
2 | ||
3 | Copyright (c) 2007, Intel Corporation | |
4 | All rights reserved. This program and the accompanying materials | |
5 | are licensed and made available under the terms and conditions of the BSD License | |
6 | which accompanies this distribution. The full text of the license may be found at | |
7 | http://opensource.org/licenses/bsd-license.php | |
8 | ||
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
11 | ||
12 | Module Name: | |
13 | ||
14 | UefiIfrString.c | |
15 | ||
16 | Abstract: | |
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 | // | |
30 | CHAR8 Iso639ToRfc3066ConversionTable[] = | |
31 | "\ | |
32 | aaraa\ | |
33 | abkab\ | |
34 | afraf\ | |
35 | amham\ | |
36 | araar\ | |
37 | asmas\ | |
38 | aymay\ | |
39 | azeaz\ | |
40 | bakba\ | |
41 | belbe\ | |
42 | benbn\ | |
43 | bihbh\ | |
44 | bisbi\ | |
45 | bodbo\ | |
46 | brebr\ | |
47 | bulbg\ | |
48 | catca\ | |
49 | cescs\ | |
50 | corkw\ | |
51 | cosco\ | |
52 | cymcy\ | |
53 | danda\ | |
54 | deude\ | |
55 | dzodz\ | |
56 | ellel\ | |
57 | engen\ | |
58 | epoeo\ | |
59 | estet\ | |
60 | euseu\ | |
61 | faofo\ | |
62 | fasfa\ | |
63 | fijfj\ | |
64 | finfi\ | |
65 | frafr\ | |
66 | fryfy\ | |
67 | gaiga\ | |
68 | gdhgd\ | |
69 | glggl\ | |
70 | grngn\ | |
71 | gujgu\ | |
72 | hauha\ | |
73 | hebhe\ | |
74 | hinhi\ | |
75 | hrvhr\ | |
76 | hunhu\ | |
77 | hyehy\ | |
78 | ikuiu\ | |
79 | ileie\ | |
80 | inaia\ | |
81 | indid\ | |
82 | ipkik\ | |
83 | islis\ | |
84 | itait\ | |
85 | jawjw\ | |
86 | jpnja\ | |
87 | kalkl\ | |
88 | kankn\ | |
89 | kasks\ | |
90 | katka\ | |
91 | kazkk\ | |
92 | khmkm\ | |
93 | kinrw\ | |
94 | kirky\ | |
95 | korko\ | |
96 | kurku\ | |
97 | laolo\ | |
98 | latla\ | |
99 | lavlv\ | |
100 | linln\ | |
101 | litlt\ | |
102 | ltzlb\ | |
103 | malml\ | |
104 | marmr\ | |
105 | mkdmk\ | |
106 | mlgmg\ | |
107 | mltmt\ | |
108 | molmo\ | |
109 | monmn\ | |
110 | mrimi\ | |
111 | msams\ | |
112 | myamy\ | |
113 | nauna\ | |
114 | nepne\ | |
115 | nldnl\ | |
116 | norno\ | |
117 | ocioc\ | |
118 | ormom\ | |
119 | panpa\ | |
120 | polpl\ | |
121 | porpt\ | |
122 | pusps\ | |
123 | quequ\ | |
124 | rohrm\ | |
125 | ronro\ | |
126 | runrn\ | |
127 | rusru\ | |
128 | sagsg\ | |
129 | sansa\ | |
130 | sinsi\ | |
131 | slksk\ | |
132 | slvsl\ | |
133 | smise\ | |
134 | smosm\ | |
135 | snasn\ | |
136 | sndsd\ | |
137 | somso\ | |
138 | sotst\ | |
139 | spaes\ | |
140 | sqisq\ | |
141 | srpsr\ | |
142 | sswss\ | |
143 | sunsu\ | |
144 | swasw\ | |
145 | swesv\ | |
146 | tamta\ | |
147 | tattt\ | |
148 | telte\ | |
149 | tgktg\ | |
150 | tgltl\ | |
151 | thath\ | |
152 | tsnts\ | |
153 | tuktk\ | |
154 | twitw\ | |
155 | uigug\ | |
156 | ukruk\ | |
157 | urdur\ | |
158 | uzbuz\ | |
159 | vievi\ | |
160 | volvo\ | |
161 | wolwo\ | |
162 | xhoxh\ | |
163 | yidyi\ | |
164 | zhaza\ | |
165 | zhozh\ | |
166 | zulzu\ | |
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 | **/ | |
180 | EFI_STATUS | |
181 | ConvertRfc3066LanguageToIso639Language ( | |
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 | **/ | |
213 | CHAR8 * | |
214 | Rfc3066ToIso639 ( | |
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 | **/ | |
254 | EFI_STATUS | |
255 | GetCurrentLanguage ( | |
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 | **/ | |
293 | VOID | |
294 | GetNextLanguage ( | |
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 |