source: trunk/src/kernel32/lang.cpp@ 7849

Last change on this file since 7849 was 7849, checked in by sandervl, 24 years ago

logging updates

File size: 28.2 KB
Line 
1/* $Id: lang.cpp,v 1.40 2002-02-09 12:45:13 sandervl Exp $ */
2/*
3 * Win32 language API functions for OS/2
4 *
5 * Copyright 1998 Sander van Leeuwen
6 * Copyright 1998 Patrick Haller
7 * Copyright 1999 Przemyslaw Dobrowolski
8 *
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13#include <os2win.h>
14#include <winnls.h>
15#include <stdlib.h>
16#include <stdio.h>
17#include <string.h>
18#include <odinwrap.h>
19#include <heapstring.h>
20#include <win\winreg.h>
21#include <winos2def.h>
22#include "unicode.h"
23#include "oslibmisc.h"
24#include <wprocess.h>
25#include <uniconv.h>
26
27#define DBG_LOCALLOG DBG_lang
28#include "dbglocal.h"
29
30ODINDEBUGCHANNEL(KERNEL32-LANG)
31
32static ULONG defaultLanguage = 0;
33
34//******************************************************************************
35//******************************************************************************
36void WIN32API SetDefaultLanguage(DWORD deflang)
37{
38 defaultLanguage = deflang;
39}
40//******************************************************************************
41//******************************************************************************
42ULONG GetLanguageId()
43{
44 if(defaultLanguage == 0) {
45 switch(OSLibQueryCountry()) {
46 case CC_USA:
47 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
48 break;
49 case CC_CANADA:
50 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
51 break;
52 case CC_LATIN_AMERICA:
53 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
54 break;
55 case CC_GREECE:
56 defaultLanguage = MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
57 break;
58 case CC_NETHERLANDS:
59 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
60 break;
61 case CC_BELGIUM:
62 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN);
63 break;
64 case CC_FRANCE:
65 defaultLanguage = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
66 break;
67 case CC_SPAIN:
68 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
69 break;
70 case CC_ITALY:
71 defaultLanguage = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
72 break;
73 case CC_SWITZERLAND:
74 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
75 break;
76 case CC_AUSTRIA:
77 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
78 break;
79 case CC_UNITED_KINGDOM:
80 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
81 break;
82 case CC_DENMARK:
83 defaultLanguage = MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
84 break;
85 case CC_SWEDEN:
86 defaultLanguage = MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
87 break;
88 case CC_NORWAY:
89 defaultLanguage = MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
90 break;
91 case CC_WEST_GERMANY:
92 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
93 break;
94 case CC_MEXICO:
95 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
96 break;
97 case CC_BRAZIL:
98 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
99 break;
100 case CC_AUSTRALIA:
101 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
102 break;
103 case CC_NEW_ZEALAND:
104 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
105 break;
106 case CC_JAPAN:
107 defaultLanguage = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
108 break;
109 case CC_KOREA:
110 defaultLanguage = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
111 break;
112 case CC_CHINA:
113 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
114 break;
115 case CC_TAIWAN:
116 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
117 break;
118 case CC_TURKEY:
119 defaultLanguage = MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
120 break;
121 case CC_PORTUGAL:
122 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
123 break;
124 case CC_LUXEMBOURG:
125 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
126 break;
127 case CC_ICELAND:
128 defaultLanguage = MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
129 break;
130 case CC_FINLAND:
131 defaultLanguage = MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
132 break;
133 case CC_CZECH_REPUBLIC:
134 defaultLanguage = MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
135 break;
136 case CC_SLOVAK_REPUBLIC:
137 defaultLanguage = MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
138 break;
139 case CC_POLAND:
140 defaultLanguage = MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT);
141 break;
142 default:
143 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
144 break;
145 }
146 }
147 return defaultLanguage;
148}
149//******************************************************************************
150//******************************************************************************
151LCID WIN32API GetUserDefaultLCID(void)
152{
153 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
154 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
155}
156//******************************************************************************
157//******************************************************************************
158LCID WIN32API GetSystemDefaultLCID(void)
159{
160 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", GetUserDefaultLCID()));
161 return GetUserDefaultLCID();
162}
163//******************************************************************************
164//******************************************************************************
165LANGID WIN32API GetUserDefaultLangID()
166{
167 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
168 return(GetLanguageId());
169}
170//******************************************************************************
171//******************************************************************************
172LANGID WIN32API GetSystemDefaultLangID(void)
173{
174 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", GetUserDefaultLangID()));
175 return GetUserDefaultLangID();
176}
177
178//******************************************************************************
179//******************************************************************************
180static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
181{
182 if (wbuf)
183 {
184 if (*pLen > lstrlenW(lpUniStr))
185 lstrcpyW(wbuf,lpUniStr);
186 else
187 {
188 SetLastError(ERROR_INSUFFICIENT_BUFFER);
189 *pLen=0;
190 return FALSE;
191 }
192 }
193
194 *pLen=lstrlenW(lpUniStr)+1; // + null terminator
195
196 return TRUE;
197}
198//replaced by Wine functions in ole2nls.c
199#if 0
200//******************************************************************************
201//******************************************************************************
202static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
203{
204 if (wbuf)
205 {
206// if (*pLen >= sizeof(WCHAR))
207 if (*pLen >= 2)
208 {
209 wbuf[0]=(WCHAR)'0'+wcUniChar;
210 wbuf[1]=0;
211 }
212 else
213 {
214 SetLastError(ERROR_INSUFFICIENT_BUFFER);
215 *pLen=0;
216 return FALSE;
217 }
218 }
219
220 *pLen=2;
221
222 return TRUE;
223}
224
225/*****************************************************************************
226 * Name : DWORD GetLocaleInfoW
227 * Purpose : The GetLocaleInfoW function returns specific locale information
228 * Parameters: LCID lcid locale identifier
229 * LCTYPE LCType type of information
230 * LPSTRW wbuf address of buffer for information
231 * int len size of buffer
232 * Variables :
233 * Result : size of target buffer
234 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
235 *
236 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
237 * LOCALE_IMEASURE - return '0' like English US
238 * LOCALE_INEGNUMBER - return '1' like English US
239 * LOCALE_ICURRDIGITS - return '2' like English US
240 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
241 * LOCALE_SGROUPING and
242 * LOCALE_SMONGROUPING are tested only with Polish & English languages
243 * LOCALE_SMONTHNAME13 and
244 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
245 * LOCALE_FONTSIGNATURE - return empty string like English US
246 *
247 * Status : FULLY TESTED
248 *
249 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
250 *****************************************************************************/
251int WIN32API GetLocaleInfoW(LCID lcid, LCTYPE LCType, LPWSTR wbuf,
252 int len)
253{
254 LocaleObject locale_object = NULL;
255 struct UniLconv *puni_lconv = NULL;
256 WCHAR *pInfoItem;
257 int rc;
258 COUNTRYCODE Country = {0};
259 COUNTRYINFO CtryInfo = {0};
260 ULONG ulInfoLen = 0;
261
262 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
263
264 if (len && (! wbuf) )
265 {
266 SetLastError(ERROR_INSUFFICIENT_BUFFER);
267 return 0;
268 }
269
270 if (wbuf) *wbuf==0;
271
272 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
273
274 if ( rc == ULS_SUCCESS )
275 {
276 UniQueryLocaleInfo(locale_object, &puni_lconv);
277
278 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
279
280 ulInfoLen = len; // Now we use this variable as returned length info
281
282 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
283
284 switch(LCType)
285 {
286 case LOCALE_SDECIMAL:
287 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
288 break;
289
290 case LOCALE_IMEASURE: // Fixme!
291 // only like English US
292 LocaleFromUniChar(0,wbuf,&ulInfoLen);
293 break;
294
295 case LOCALE_INEGNUMBER: // Fixme!
296 // only like English US
297 LocaleFromUniChar(1,wbuf,&ulInfoLen);
298 break;
299
300 case LOCALE_ICURRDIGITS:// Fixme!
301 // only like English US
302 LocaleFromUniChar(2,wbuf,&ulInfoLen);
303 break;
304
305 case LOCALE_STHOUSAND:
306 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
307 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
308 if(defaultLanguage == CC_CZECH_REPUBLIC) {
309 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
310 }
311 break;
312
313 case LOCALE_SGROUPING: // tested only with Polish & English
314 if (wbuf)
315 {
316 if (puni_lconv->grouping)
317 {
318 if (len >= 3*sizeof(WCHAR))
319 {
320 wbuf[0]='0'+*puni_lconv->grouping;
321 wbuf[1]=(WCHAR)';';
322 wbuf[2]=(WCHAR)'0';
323 wbuf[3]=0;
324 ulInfoLen=4;
325 }
326 else
327 {
328 SetLastError(ERROR_INSUFFICIENT_BUFFER);
329 break;
330 }
331 }
332 else
333 {
334 wbuf[0]=20; // Windows return space!!
335 ulInfoLen=2;
336 }
337 }
338 else
339 ulInfoLen=2;
340 break;
341
342 case LOCALE_SMONGROUPING: // tested only with Polish & English
343 if (wbuf)
344 {
345 if (puni_lconv->mon_grouping)
346 {
347 if (len >= 3*sizeof(WCHAR))
348 {
349 wbuf[0]='0'+*puni_lconv->mon_grouping;
350 wbuf[1]=(WCHAR)';';
351 wbuf[2]=(WCHAR)'0';
352 wbuf[3]=0;
353 ulInfoLen=4;
354 }
355 else
356 {
357 SetLastError(ERROR_INSUFFICIENT_BUFFER);
358 break;
359 }
360 }
361 else
362 {
363 wbuf[0]=20; // Windows return space!!
364 ulInfoLen=2;
365 }
366 }
367 else
368 ulInfoLen=2;
369 break;
370
371
372 case LOCALE_SCURRENCY:
373 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
374 break;
375
376 case LOCALE_SMONDECIMALSEP:
377 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
378 break;
379
380 case LOCALE_SMONTHOUSANDSEP:
381 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
382 break;
383
384 case LOCALE_SPOSITIVESIGN:
385 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
386 break;
387
388 case LOCALE_SNEGATIVESIGN:
389 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
390 break;
391
392 case LOCALE_IPOSSIGNPOSN:
393 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
394 break;
395
396 case LOCALE_INEGSIGNPOSN:
397 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
398 break;
399
400 case LOCALE_IPOSSYMPRECEDES:
401 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
402 break;
403
404 case LOCALE_IPOSSEPBYSPACE:
405 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
406 break;
407
408 case LOCALE_INEGSYMPRECEDES:
409 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
410 break;
411
412 case LOCALE_INEGSEPBYSPACE:
413 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
414 break;
415
416 case LOCALE_S1159:
417 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
418 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
419 UniFreeMem(pInfoItem);
420 break;
421
422 case LOCALE_S2359:
423 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
424 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
425 UniFreeMem(pInfoItem);
426 break;
427
428 case LOCALE_IDEFAULTLANGUAGE:
429 strcpyW(wbuf, (LPWSTR)L"0409");
430 ulInfoLen = 5;
431 break;
432 case LOCALE_ILANGUAGE:
433 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
434 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
435 UniFreeMem(pInfoItem);
436 break;
437
438 case LOCALE_INEGCURR:
439 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
440 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
441 UniFreeMem(pInfoItem);
442 break;
443
444 case LOCALE_ICURRENCY:
445 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
446 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
447 UniFreeMem(pInfoItem);
448 break;
449
450
451
452 case LOCALE_SNATIVELANGNAME:
453 case LOCALE_SLANGUAGE:
454 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
455 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
456 UniFreeMem(pInfoItem);
457 break;
458
459 case LOCALE_SABBREVLANGNAME:
460 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
461 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
462 UniFreeMem(pInfoItem);
463 break;
464
465 case LOCALE_IDEFAULTCOUNTRY:
466 case LOCALE_ICOUNTRY:
467 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
468 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
469 UniFreeMem(pInfoItem);
470 break;
471
472 case LOCALE_SENGLANGUAGE:
473 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
474 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
475 UniFreeMem(pInfoItem);
476 break;
477
478 case LOCALE_SENGCOUNTRY:
479 case LOCALE_SCOUNTRY:
480 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
481 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
482 UniFreeMem(pInfoItem);
483 break;
484
485 case LOCALE_SABBREVCTRYNAME:
486 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
487 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
488 UniFreeMem(pInfoItem);
489 break;
490
491 case LOCALE_SNATIVECTRYNAME:
492 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
493 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
494 UniFreeMem(pInfoItem);
495 break;
496
497 case LOCALE_SNATIVEDIGITS:
498 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
499 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
500 UniFreeMem(pInfoItem);
501 break;
502
503
504 case LOCALE_IDEFAULTCODEPAGE:
505 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
506 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
507 UniFreeMem(pInfoItem);
508 break;
509
510 case LOCALE_IDEFAULTANSICODEPAGE:
511 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
512 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
513 UniFreeMem(pInfoItem);
514 break;
515
516 case LOCALE_IDEFAULTMACCODEPAGE:
517 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
518 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
519 UniFreeMem(pInfoItem);
520 break;
521
522 case LOCALE_SLIST:
523 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
524 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
525 UniFreeMem(pInfoItem);
526 break;
527
528 case LOCALE_SINTLSYMBOL:
529 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
530 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
531 UniFreeMem(pInfoItem);
532 break;
533
534 case LOCALE_IFIRSTDAYOFWEEK:
535 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
536 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
537 UniFreeMem(pInfoItem);
538 break;
539
540 case LOCALE_SDAYNAME7:
541 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
542 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
543 UniFreeMem(pInfoItem);
544 break;
545
546 case LOCALE_SDAYNAME1:
547 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
548 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
549 UniFreeMem(pInfoItem);
550 break;
551
552 case LOCALE_SDAYNAME2:
553 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
554 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
555 UniFreeMem(pInfoItem);
556 break;
557
558 case LOCALE_SDAYNAME3:
559 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
560 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
561 UniFreeMem(pInfoItem);
562 break;
563
564 case LOCALE_SDAYNAME4:
565 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
566 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
567 UniFreeMem(pInfoItem);
568 break;
569
570 case LOCALE_SDAYNAME5:
571 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
572 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
573 UniFreeMem(pInfoItem);
574 break;
575
576 case LOCALE_SDAYNAME6:
577 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
578 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
579 UniFreeMem(pInfoItem);
580 break;
581
582 case LOCALE_SABBREVDAYNAME7:
583 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
584 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
585 UniFreeMem(pInfoItem);
586 break;
587
588 case LOCALE_SABBREVDAYNAME1:
589 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
590 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
591 UniFreeMem(pInfoItem);
592 break;
593
594 case LOCALE_SABBREVDAYNAME2:
595 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
596 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
597 UniFreeMem(pInfoItem);
598 break;
599
600 case LOCALE_SABBREVDAYNAME3:
601 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
602 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
603 UniFreeMem(pInfoItem);
604 break;
605
606 case LOCALE_SABBREVDAYNAME4:
607 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
608 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
609 UniFreeMem(pInfoItem);
610 break;
611
612 case LOCALE_SABBREVDAYNAME5:
613 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
614 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
615 UniFreeMem(pInfoItem);
616 break;
617
618 case LOCALE_SABBREVDAYNAME6:
619 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
620 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
621 UniFreeMem(pInfoItem);
622 break;
623
624 case LOCALE_SMONTHNAME1:
625 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
626 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
627 UniFreeMem(pInfoItem);
628 break;
629
630 case LOCALE_SMONTHNAME2:
631 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
632 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
633 UniFreeMem(pInfoItem);
634 break;
635
636 case LOCALE_SMONTHNAME3:
637 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
638 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
639 UniFreeMem(pInfoItem);
640 break;
641
642 case LOCALE_SMONTHNAME4:
643 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
644 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
645 UniFreeMem(pInfoItem);
646 break;
647
648 case LOCALE_SMONTHNAME5:
649 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
650 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
651 UniFreeMem(pInfoItem);
652 break;
653
654 case LOCALE_SMONTHNAME6:
655 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
656 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
657 UniFreeMem(pInfoItem);
658 break;
659
660 case LOCALE_SMONTHNAME7:
661 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
662 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
663 UniFreeMem(pInfoItem);
664 break;
665
666 case LOCALE_SMONTHNAME8:
667 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
668 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
669 UniFreeMem(pInfoItem);
670 break;
671
672 case LOCALE_SMONTHNAME9:
673 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
674 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
675 UniFreeMem(pInfoItem);
676 break;
677
678 case LOCALE_SMONTHNAME10:
679 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
680 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
681 UniFreeMem(pInfoItem);
682 break;
683
684 case LOCALE_SMONTHNAME11:
685 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
686 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
687 UniFreeMem(pInfoItem);
688 break;
689
690 case LOCALE_SMONTHNAME12:
691 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
692 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
693 UniFreeMem(pInfoItem);
694 break;
695
696 case LOCALE_FONTSIGNATURE: // FixMe!!!
697 case LOCALE_SABBREVMONTHNAME13:
698 case LOCALE_SMONTHNAME13:
699 if(wbuf) {
700 *wbuf = 0;
701 }
702 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
703 break;
704
705 case LOCALE_SABBREVMONTHNAME1:
706 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
707 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
708 UniFreeMem(pInfoItem);
709 break;
710
711 case LOCALE_SABBREVMONTHNAME2:
712 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
713 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
714 UniFreeMem(pInfoItem);
715 break;
716
717 case LOCALE_SABBREVMONTHNAME3:
718 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
719 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
720 UniFreeMem(pInfoItem);
721 break;
722
723 case LOCALE_SABBREVMONTHNAME4:
724 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
725 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
726 UniFreeMem(pInfoItem);
727 break;
728
729 case LOCALE_SABBREVMONTHNAME5:
730 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
731 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
732 UniFreeMem(pInfoItem);
733 break;
734
735 case LOCALE_SABBREVMONTHNAME6:
736 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
737 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
738 UniFreeMem(pInfoItem);
739 break;
740
741 case LOCALE_SABBREVMONTHNAME7:
742 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
743 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
744 UniFreeMem(pInfoItem);
745 break;
746
747 case LOCALE_SABBREVMONTHNAME8:
748 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
749 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
750 UniFreeMem(pInfoItem);
751 break;
752
753 case LOCALE_SABBREVMONTHNAME9:
754 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
755 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
756 UniFreeMem(pInfoItem);
757 break;
758
759 case LOCALE_SABBREVMONTHNAME10:
760 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
761 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
762 UniFreeMem(pInfoItem);
763 break;
764
765 case LOCALE_SABBREVMONTHNAME11:
766 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
767 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
768 UniFreeMem(pInfoItem);
769 break;
770
771 case LOCALE_SABBREVMONTHNAME12:
772 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
773 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
774 UniFreeMem(pInfoItem);
775 break;
776
777 case LOCALE_SDATE:
778 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
779 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
780 UniFreeMem(pInfoItem);
781 break;
782
783 case LOCALE_STIME:
784 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
785 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
786 UniFreeMem(pInfoItem);
787 break;
788
789 case LOCALE_IDATE:
790 case LOCALE_ILDATE:
791 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
792 break;
793
794 case LOCALE_ITIME:
795 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
796 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
797 UniFreeMem(pInfoItem);
798 break;
799
800 case LOCALE_SSHORTDATE:
801 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
802 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
803 UniFreeMem(pInfoItem);
804 break;
805
806 case LOCALE_SLONGDATE:
807 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
808 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
809 UniFreeMem(pInfoItem);
810 break;
811
812
813 case LOCALE_STIMEFORMAT:
814 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
815 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
816 UniFreeMem(pInfoItem);
817 break;
818
819 case LOCALE_SISO639LANGNAME:
820 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
821 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
822 UniFreeMem(pInfoItem);
823 break;
824
825 case LOCALE_SISO3166CTRYNAME:
826 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
827 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
828 UniFreeMem(pInfoItem);
829 break;
830
831 default:
832 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
833 if (wbuf)
834 {
835 wbuf[0] = (WCHAR) '1';
836 wbuf[1] = 0;
837 }
838 ulInfoLen=2;
839 break;
840
841 }
842 UniFreeLocaleInfo(puni_lconv);
843 UniFreeLocaleObject(locale_object);
844 }
845 else
846 return (0);
847
848 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
849
850 return (ulInfoLen);
851}
852/*****************************************************************************
853 * Name : DWORD GetLocaleInfoA
854 * Purpose : The GetLocaleInfoA function returns specific locale information
855 * Parameters: LCID lcid locale identifier
856 * LCTYPE LCType type of information
857 * LPSTR buf address of buffer for information
858 * int len size of buffer
859 * Variables :
860 * Result : size of target buffer
861 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
862 * look into GetLocaleInfoW
863 *
864 * Status : TESTED
865 *
866 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
867 *****************************************************************************/
868int WIN32API GetLocaleInfoA(LCID lcid, LCTYPE LCType, LPSTR buf, int len)
869{
870 LPWSTR lpWStr;
871 int ret_len;
872
873 if (len && (! buf) )
874 {
875 SetLastError(ERROR_INSUFFICIENT_BUFFER);
876 return 0;
877 }
878
879 dprintf(("KERNEL32: GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
880
881 if (buf)
882 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
883 else
884 lpWStr=NULL; // Query for buffer size
885
886 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
887
888 if (ret_len && buf)
889 UnicodeToAscii(lpWStr,buf);
890
891 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
892
893 dprintf(("KERNEL32: GetLocaleInfoA returned %d -> %s",ret_len, (ret_len) ? buf : NULL));
894
895 return (ret_len);
896}
897#endif
898//******************************************************************************
899//******************************************************************************
900LCID WIN32API GetThreadLocale()
901{
902 TEB *teb = GetThreadTEB();
903
904 if(teb == NULL) {
905 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
906 return FALSE;
907 }
908 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
909 return(teb->o.odin.lcid);
910}
911//******************************************************************************
912//******************************************************************************
913BOOL WIN32API SetThreadLocale(LCID locale)
914{
915 TEB *teb = GetThreadTEB();
916
917 if(teb == NULL) {
918 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
919 return FALSE;
920 }
921 dprintf(("KERNEL32: SetThreadLocale %x", locale));
922 teb->o.odin.lcid = locale;
923 return(TRUE);
924}
925//******************************************************************************
926//******************************************************************************
Note: See TracBrowser for help on using the repository browser.