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

Last change on this file since 3746 was 3746, checked in by sandervl, 25 years ago

Resource lookup fix (type '#') + misc changes/fixes

File size: 34.9 KB
Line 
1/* $Id: lang.cpp,v 1.23 2000-06-23 19:02:37 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 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#include <os2win.h>
13#include <winnls.h>
14#include <stdlib.h>
15#include <stdio.h>
16#include <string.h>
17#include <odinwrap.h>
18#include <heapstring.h>
19#include <win\winreg.h>
20#include <winos2def.h>
21#include "unicode.h"
22#include "oslibmisc.h"
23
24#define DBG_LOCALLOG DBG_lang
25#include "dbglocal.h"
26
27ODINDEBUGCHANNEL(KERNEL32-LANG)
28
29//******************************************************************************
30//******************************************************************************
31ULONG GetLanguageId()
32{
33 static ULONG defaultLanguage = 0;
34
35 if(defaultLanguage == 0) {
36 switch(OSLibQueryCountry()) {
37 case CC_USA:
38 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
39 break;
40 case CC_CANADA:
41 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
42 break;
43 case CC_LATIN_AMERICA:
44 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
45 break;
46 case CC_GREECE:
47 defaultLanguage = MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
48 break;
49 case CC_NETHERLANDS:
50 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
51 break;
52 case CC_BELGIUM:
53 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN);
54 break;
55 case CC_FRANCE:
56 defaultLanguage = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
57 break;
58 case CC_SPAIN:
59 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
60 break;
61 case CC_ITALY:
62 defaultLanguage = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
63 break;
64 case CC_SWITZERLAND:
65 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
66 break;
67 case CC_AUSTRIA:
68 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
69 break;
70 case CC_UNITED_KINGDOM:
71 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
72 break;
73 case CC_DENMARK:
74 defaultLanguage = MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
75 break;
76 case CC_SWEDEN:
77 defaultLanguage = MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
78 break;
79 case CC_NORWAY:
80 defaultLanguage = MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
81 break;
82 case CC_WEST_GERMANY:
83 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
84 break;
85 case CC_MEXICO:
86 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
87 break;
88 case CC_BRAZIL:
89 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
90 break;
91 case CC_AUSTRALIA:
92 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
93 break;
94 case CC_NEW_ZEALAND:
95 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
96 break;
97 case CC_JAPAN:
98 defaultLanguage = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
99 break;
100 case CC_KOREA:
101 defaultLanguage = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
102 break;
103 case CC_CHINA:
104 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
105 break;
106 case CC_TAIWAN:
107 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
108 break;
109 case CC_TURKEY:
110 defaultLanguage = MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
111 break;
112 case CC_PORTUGAL:
113 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
114 break;
115 case CC_LUXEMBOURG:
116 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
117 break;
118 case CC_ICELAND:
119 defaultLanguage = MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
120 break;
121 case CC_FINLAND:
122 defaultLanguage = MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
123 break;
124 case CC_CZECH_REPUBLIC:
125 defaultLanguage = MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
126 break;
127 case CC_SLOVAK_REPUBLIC:
128 defaultLanguage = MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
129 break;
130 default:
131 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
132 break;
133 }
134 }
135 return defaultLanguage;
136}
137//******************************************************************************
138//******************************************************************************
139BOOL WIN32API IsValidCodePage(UINT CodePage)
140{
141 dprintf(("KERNEL32: IsValidCodePage %d not implemented", CodePage));
142 return(TRUE);
143}
144//******************************************************************************
145//******************************************************************************
146LCID WIN32API GetUserDefaultLCID(void)
147{
148 dprintf(("KERNEL32: OS2GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
149 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
150}
151//******************************************************************************
152//******************************************************************************
153LCID WIN32API GetSystemDefaultLCID(void)
154{
155 dprintf(("KERNEL32: OS2GetSystemDefaultLCID: returns %x", MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)));
156 return(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); //US English
157}
158//******************************************************************************
159//******************************************************************************
160LANGID WIN32API GetUserDefaultLangID()
161{
162 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
163 return(GetLanguageId());
164}
165//******************************************************************************
166//******************************************************************************
167LANGID WIN32API GetSystemDefaultLangID(void)
168{
169 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)));
170 return(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
171}
172
173//******************************************************************************
174//******************************************************************************
175static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
176{
177 if (wbuf)
178 {
179 if (*pLen > UniStrlen(lpUniStr))
180 UniStrcpy(wbuf,lpUniStr);
181 else
182 {
183 SetLastError(ERROR_INSUFFICIENT_BUFFER);
184 *pLen=0;
185 return FALSE;
186 }
187 }
188
189 *pLen=UniStrlen(lpUniStr)+1; // + null terminator
190
191 return TRUE;
192}
193//******************************************************************************
194//******************************************************************************
195static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
196{
197 if (wbuf)
198 {
199// if (*pLen >= sizeof(WCHAR))
200 if (*pLen >= 2)
201 {
202 wbuf[0]=(WCHAR)'0'+wcUniChar;
203 wbuf[1]=0;
204 }
205 else
206 {
207 SetLastError(ERROR_INSUFFICIENT_BUFFER);
208 *pLen=0;
209 return FALSE;
210 }
211 }
212
213 *pLen=2;
214
215 return TRUE;
216}
217
218/*****************************************************************************
219 * Name : DWORD GetLocaleInfoW
220 * Purpose : The GetLocaleInfoW function returns specific locale information
221 * Parameters: LCID lcid locale identifier
222 * LCTYPE LCType type of information
223 * LPSTRW wbuf address of buffer for information
224 * int len size of buffer
225 * Variables :
226 * Result : size of target buffer
227 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
228 *
229 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
230 * LOCALE_IMEASURE - return '0' like English US
231 * LOCALE_INEGNUMBER - return '1' like English US
232 * LOCALE_ICURRDIGITS - return '2' like English US
233 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
234 * LOCALE_SGROUPING and
235 * LOCALE_SMONGROUPING are tested only with Polish & English languages
236 * LOCALE_SMONTHNAME13 and
237 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
238 * LOCALE_FONTSIGNATURE - return empty string like English US
239 *
240 * Status : FULLY TESTED
241 *
242 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
243 *****************************************************************************/
244ODINFUNCTION4(int, GetLocaleInfoW, LCID, lcid, LCTYPE, LCType, LPWSTR, wbuf,
245 int, len)
246{
247 LocaleObject locale_object = NULL;
248 struct UniLconv *puni_lconv = NULL;
249 WCHAR *pInfoItem;
250 int rc;
251 COUNTRYCODE Country = {0};
252 COUNTRYINFO CtryInfo = {0};
253 ULONG ulInfoLen = 0;
254
255 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
256
257 if (len && (! wbuf) )
258 {
259 SetLastError(ERROR_INSUFFICIENT_BUFFER);
260 return 0;
261 }
262
263 if (wbuf) *wbuf==0;
264
265 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
266
267 if ( rc == ULS_SUCCESS )
268 {
269 UniQueryLocaleInfo(locale_object, &puni_lconv);
270
271 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
272
273 ulInfoLen = len; // Now we use this variable as returned length info
274
275 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
276
277 switch(LCType)
278 {
279 case LOCALE_SDECIMAL:
280 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
281 break;
282
283 case LOCALE_IMEASURE: // Fixme!
284 // only like English US
285 LocaleFromUniChar(0,wbuf,&ulInfoLen);
286 break;
287
288 case LOCALE_INEGNUMBER: // Fixme!
289 // only like English US
290 LocaleFromUniChar(1,wbuf,&ulInfoLen);
291 break;
292
293 case LOCALE_ICURRDIGITS:// Fixme!
294 // only like English US
295 LocaleFromUniChar(2,wbuf,&ulInfoLen);
296 break;
297
298 case LOCALE_STHOUSAND:
299 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
300 break;
301
302 case LOCALE_SGROUPING: // tested only with Polish & English
303 if (wbuf)
304 {
305 if (puni_lconv->grouping)
306 {
307 if (len >= 3*sizeof(WCHAR))
308 {
309 wbuf[0]='0'+*puni_lconv->grouping;
310 wbuf[1]=(WCHAR)';';
311 wbuf[2]=(WCHAR)'0';
312 wbuf[3]=0;
313 ulInfoLen=4;
314 }
315 else
316 {
317 SetLastError(ERROR_INSUFFICIENT_BUFFER);
318 break;
319 }
320 }
321 else
322 {
323 wbuf[0]=20; // Windows return space!!
324 ulInfoLen=2;
325 }
326 }
327 else
328 ulInfoLen=2;
329 break;
330
331 case LOCALE_SMONGROUPING: // tested only with Polish & English
332 if (wbuf)
333 {
334 if (puni_lconv->mon_grouping)
335 {
336 if (len >= 3*sizeof(WCHAR))
337 {
338 wbuf[0]='0'+*puni_lconv->mon_grouping;
339 wbuf[1]=(WCHAR)';';
340 wbuf[2]=(WCHAR)'0';
341 wbuf[3]=0;
342 ulInfoLen=4;
343 }
344 else
345 {
346 SetLastError(ERROR_INSUFFICIENT_BUFFER);
347 break;
348 }
349 }
350 else
351 {
352 wbuf[0]=20; // Windows return space!!
353 ulInfoLen=2;
354 }
355 }
356 else
357 ulInfoLen=2;
358 break;
359
360
361 case LOCALE_SCURRENCY:
362 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
363 break;
364
365 case LOCALE_SMONDECIMALSEP:
366 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
367 break;
368
369 case LOCALE_SMONTHOUSANDSEP:
370 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
371 break;
372
373 case LOCALE_SPOSITIVESIGN:
374 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
375 break;
376
377 case LOCALE_SNEGATIVESIGN:
378 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
379 break;
380
381 case LOCALE_IPOSSIGNPOSN:
382 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
383 break;
384
385 case LOCALE_INEGSIGNPOSN:
386 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
387 break;
388
389 case LOCALE_IPOSSYMPRECEDES:
390 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
391 break;
392
393 case LOCALE_IPOSSEPBYSPACE:
394 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
395 break;
396
397 case LOCALE_INEGSYMPRECEDES:
398 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
399 break;
400
401 case LOCALE_INEGSEPBYSPACE:
402 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
403 break;
404
405 case LOCALE_S1159:
406 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
407 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
408 UniFreeMem(pInfoItem);
409 break;
410
411 case LOCALE_S2359:
412 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
413 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
414 UniFreeMem(pInfoItem);
415 break;
416
417 case LOCALE_IDEFAULTLANGUAGE:
418 case LOCALE_ILANGUAGE:
419 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
420 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
421 UniFreeMem(pInfoItem);
422 break;
423
424 case LOCALE_INEGCURR:
425 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
426 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
427 UniFreeMem(pInfoItem);
428 break;
429
430 case LOCALE_ICURRENCY:
431 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
432 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
433 UniFreeMem(pInfoItem);
434 break;
435
436
437
438 case LOCALE_SNATIVELANGNAME:
439 case LOCALE_SLANGUAGE:
440 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
441 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
442 UniFreeMem(pInfoItem);
443 break;
444
445 case LOCALE_SABBREVLANGNAME:
446 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
447 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
448 UniFreeMem(pInfoItem);
449 break;
450
451 case LOCALE_IDEFAULTCOUNTRY:
452 case LOCALE_ICOUNTRY:
453 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
454 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
455 UniFreeMem(pInfoItem);
456 break;
457
458 case LOCALE_SENGLANGUAGE:
459 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
460 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
461 UniFreeMem(pInfoItem);
462 break;
463
464 case LOCALE_SENGCOUNTRY:
465 case LOCALE_SCOUNTRY:
466 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
467 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
468 UniFreeMem(pInfoItem);
469 break;
470
471 case LOCALE_SABBREVCTRYNAME:
472 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
473 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
474 UniFreeMem(pInfoItem);
475 break;
476
477 case LOCALE_SNATIVECTRYNAME:
478 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
479 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
480 UniFreeMem(pInfoItem);
481 break;
482
483 case LOCALE_SNATIVEDIGITS:
484 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
485 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
486 UniFreeMem(pInfoItem);
487 break;
488
489
490 case LOCALE_IDEFAULTCODEPAGE:
491 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
492 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
493 UniFreeMem(pInfoItem);
494 break;
495
496 case LOCALE_IDEFAULTANSICODEPAGE:
497 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
498 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
499 UniFreeMem(pInfoItem);
500 break;
501
502 case LOCALE_IDEFAULTMACCODEPAGE:
503 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
504 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
505 UniFreeMem(pInfoItem);
506 break;
507
508 case LOCALE_SLIST:
509 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
510 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
511 UniFreeMem(pInfoItem);
512 break;
513
514 case LOCALE_SINTLSYMBOL:
515 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
516 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
517 UniFreeMem(pInfoItem);
518 break;
519
520 case LOCALE_SDAYNAME7:
521 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
522 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
523 UniFreeMem(pInfoItem);
524 break;
525
526 case LOCALE_SDAYNAME1:
527 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
528 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
529 UniFreeMem(pInfoItem);
530 break;
531
532 case LOCALE_SDAYNAME2:
533 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
534 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
535 UniFreeMem(pInfoItem);
536 break;
537
538 case LOCALE_SDAYNAME3:
539 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
540 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
541 UniFreeMem(pInfoItem);
542 break;
543
544 case LOCALE_SDAYNAME4:
545 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
546 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
547 UniFreeMem(pInfoItem);
548 break;
549
550 case LOCALE_SDAYNAME5:
551 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
552 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
553 UniFreeMem(pInfoItem);
554 break;
555
556 case LOCALE_SDAYNAME6:
557 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
558 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
559 UniFreeMem(pInfoItem);
560 break;
561
562 case LOCALE_SABBREVDAYNAME7:
563 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
564 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
565 UniFreeMem(pInfoItem);
566 break;
567
568 case LOCALE_SABBREVDAYNAME1:
569 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
570 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
571 UniFreeMem(pInfoItem);
572 break;
573
574 case LOCALE_SABBREVDAYNAME2:
575 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
576 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
577 UniFreeMem(pInfoItem);
578 break;
579
580 case LOCALE_SABBREVDAYNAME3:
581 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
582 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
583 UniFreeMem(pInfoItem);
584 break;
585
586 case LOCALE_SABBREVDAYNAME4:
587 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
588 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
589 UniFreeMem(pInfoItem);
590 break;
591
592 case LOCALE_SABBREVDAYNAME5:
593 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
594 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
595 UniFreeMem(pInfoItem);
596 break;
597
598 case LOCALE_SABBREVDAYNAME6:
599 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
600 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
601 UniFreeMem(pInfoItem);
602 break;
603
604 case LOCALE_SMONTHNAME1:
605 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
606 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
607 UniFreeMem(pInfoItem);
608 break;
609
610 case LOCALE_SMONTHNAME2:
611 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
612 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
613 UniFreeMem(pInfoItem);
614 break;
615
616 case LOCALE_SMONTHNAME3:
617 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
618 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
619 UniFreeMem(pInfoItem);
620 break;
621
622 case LOCALE_SMONTHNAME4:
623 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
624 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
625 UniFreeMem(pInfoItem);
626 break;
627
628 case LOCALE_SMONTHNAME5:
629 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
630 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
631 UniFreeMem(pInfoItem);
632 break;
633
634 case LOCALE_SMONTHNAME6:
635 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
636 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
637 UniFreeMem(pInfoItem);
638 break;
639
640 case LOCALE_SMONTHNAME7:
641 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
642 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
643 UniFreeMem(pInfoItem);
644 break;
645
646 case LOCALE_SMONTHNAME8:
647 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
648 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
649 UniFreeMem(pInfoItem);
650 break;
651
652 case LOCALE_SMONTHNAME9:
653 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
654 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
655 UniFreeMem(pInfoItem);
656 break;
657
658 case LOCALE_SMONTHNAME10:
659 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
660 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
661 UniFreeMem(pInfoItem);
662 break;
663
664 case LOCALE_SMONTHNAME11:
665 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
666 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
667 UniFreeMem(pInfoItem);
668 break;
669
670 case LOCALE_SMONTHNAME12:
671 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
672 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
673 UniFreeMem(pInfoItem);
674 break;
675
676 case LOCALE_FONTSIGNATURE: // FixMe!!!
677 case LOCALE_SABBREVMONTHNAME13:
678 case LOCALE_SMONTHNAME13:
679 if(wbuf) {
680 *wbuf = 0;
681 }
682 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
683 break;
684
685 case LOCALE_SABBREVMONTHNAME1:
686 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
687 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
688 UniFreeMem(pInfoItem);
689 break;
690
691 case LOCALE_SABBREVMONTHNAME2:
692 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
693 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
694 UniFreeMem(pInfoItem);
695 break;
696
697 case LOCALE_SABBREVMONTHNAME3:
698 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
699 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
700 UniFreeMem(pInfoItem);
701 break;
702
703 case LOCALE_SABBREVMONTHNAME4:
704 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
705 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
706 UniFreeMem(pInfoItem);
707 break;
708
709 case LOCALE_SABBREVMONTHNAME5:
710 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
711 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
712 UniFreeMem(pInfoItem);
713 break;
714
715 case LOCALE_SABBREVMONTHNAME6:
716 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
717 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
718 UniFreeMem(pInfoItem);
719 break;
720
721 case LOCALE_SABBREVMONTHNAME7:
722 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
723 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
724 UniFreeMem(pInfoItem);
725 break;
726
727 case LOCALE_SABBREVMONTHNAME8:
728 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
729 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
730 UniFreeMem(pInfoItem);
731 break;
732
733 case LOCALE_SABBREVMONTHNAME9:
734 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
735 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
736 UniFreeMem(pInfoItem);
737 break;
738
739 case LOCALE_SABBREVMONTHNAME10:
740 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
741 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
742 UniFreeMem(pInfoItem);
743 break;
744
745 case LOCALE_SABBREVMONTHNAME11:
746 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
747 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
748 UniFreeMem(pInfoItem);
749 break;
750
751 case LOCALE_SABBREVMONTHNAME12:
752 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
753 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
754 UniFreeMem(pInfoItem);
755 break;
756
757 case LOCALE_SDATE:
758 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
759 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
760 UniFreeMem(pInfoItem);
761 break;
762
763 case LOCALE_STIME:
764 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
765 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
766 UniFreeMem(pInfoItem);
767 break;
768
769 case LOCALE_IDATE:
770 case LOCALE_ILDATE:
771 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
772 break;
773
774 case LOCALE_ITIME:
775 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
776 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
777 UniFreeMem(pInfoItem);
778 break;
779
780 case LOCALE_SSHORTDATE:
781 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
782 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
783 UniFreeMem(pInfoItem);
784 break;
785
786 case LOCALE_SLONGDATE:
787 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
788 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
789 UniFreeMem(pInfoItem);
790 break;
791
792
793 case LOCALE_STIMEFORMAT:
794 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
795 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
796 UniFreeMem(pInfoItem);
797 break;
798
799 case LOCALE_SISO639LANGNAME:
800 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
801 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
802 UniFreeMem(pInfoItem);
803 break;
804
805 case LOCALE_SISO3166CTRYNAME:
806 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
807 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
808 UniFreeMem(pInfoItem);
809 break;
810
811 default:
812 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
813 if (wbuf)
814 {
815 wbuf[0] = (WCHAR) '1';
816 wbuf[1] = 0;
817 }
818 ulInfoLen=2;
819 break;
820
821 }
822 UniFreeLocaleInfo(puni_lconv);
823 UniFreeLocaleObject(locale_object);
824 }
825 else
826 return (0);
827
828 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
829
830 return (ulInfoLen);
831}
832/*****************************************************************************
833 * Name : DWORD GetLocaleInfoA
834 * Purpose : The GetLocaleInfoA function returns specific locale information
835 * Parameters: LCID lcid locale identifier
836 * LCTYPE LCType type of information
837 * LPSTR buf address of buffer for information
838 * int len size of buffer
839 * Variables :
840 * Result : size of target buffer
841 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
842 * look into GetLocaleInfoW
843 *
844 * Status : TESTED
845 *
846 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
847 *****************************************************************************/
848ODINFUNCTION4(int, GetLocaleInfoA, LCID, lcid, LCTYPE, LCType, LPSTR, buf,
849 int, len)
850{
851 LPWSTR lpWStr;
852 int ret_len;
853
854 if (len && (! buf) )
855 {
856 SetLastError(ERROR_INSUFFICIENT_BUFFER);
857 return 0;
858 }
859
860 dprintf(("KERNEL32: OS2GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
861
862 if (buf)
863 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
864 else
865 lpWStr=NULL; // Query for buffer size
866
867 ret_len = ODIN_GetLocaleInfoW(lcid, LCType, lpWStr, len);
868
869 if (ret_len && buf)
870 UnicodeToAscii(lpWStr,buf);
871
872 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
873
874 dprintf(("KERNEL32: OS2GetLocaleInfoA returned %d\n",ret_len));
875
876 return (ret_len);
877}
878//******************************************************************************
879//******************************************************************************
880BOOL WIN32API IsValidLocale(LCID Locale, DWORD dwFlags)
881{
882 dprintf(("KERNEL32: OS2IsValidLocale, always returns TRUE\n"));
883 return(TRUE);
884}
885//******************************************************************************
886//******************************************************************************
887LCID WIN32API GetThreadLocale()
888{
889 dprintf(("KERNEL32: OS2GetThreadLocale always return US English!\n"));
890 return(0x409); //US English
891}
892//******************************************************************************
893//******************************************************************************
894//******************************************************************************
895BOOL WIN32API SetThreadLocale( LCID locale )
896{
897 dprintf(("KERNEL32: OS2SetThreadLocale not implemented!\n"));
898 return(TRUE);
899}
900//******************************************************************************
901//******************************************************************************
902BOOL WIN32API EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc,
903 DWORD dwFlags)
904{
905 dprintf(("EnumSystemLocalesA %X %X\n", lpLocaleEnumProc, dwFlags));
906 if(lpLocaleEnumProc == NULL || ((dwFlags & LCID_INSTALLED) && (dwFlags & LCID_SUPPORTED))) {
907 dprintf(("Invalid parameter\n"));
908 SetLastError(ERROR_INVALID_PARAMETER);
909 return(FALSE);
910 }
911 lpLocaleEnumProc("OS/2 US English");
912 return(TRUE);
913}
914//******************************************************************************
915//******************************************************************************
916BOOL WIN32API EnumSystemLocalesW(LOCALE_ENUMPROCW lpLocaleEnumProc,
917 DWORD dwFlags)
918{
919 WCHAR locStr[32];
920
921 dprintf(("EnumSystemLocalesW %X %X\n", lpLocaleEnumProc, dwFlags));
922 if(lpLocaleEnumProc == NULL || ((dwFlags & LCID_INSTALLED) && (dwFlags & LCID_SUPPORTED))) {
923 dprintf(("Invalid parameter\n"));
924 SetLastError(ERROR_INVALID_PARAMETER);
925 return(FALSE);
926 }
927 AsciiToUnicode("OS/2 US English", locStr);
928 lpLocaleEnumProc(locStr);
929 return(TRUE);
930}
931//******************************************************************************
932//******************************************************************************
933
934
935/*****************************************************************************
936 * Name : BOOL SetLocaleInfoA
937 * Purpose : The SetLocaleInfoA function sets an item of locale information.
938 * It does so by making an entry in the process portion of the
939 * locale table. This setting only affects the user override portion
940 * of the locale settings; it does not set the system defaults.
941 * Only certain types of locale information, or LCTYPE values, can
942 * be set by this function. See the following Remarks section for a
943 * list of valid LCTYPE values.
944 * The locale information is always passed in as a null-terminated
945 * Unicode string in the Unicode (W) version of the function, and as
946 * a null-terminated ANSI string in the ANSI (A) version. No integers
947 * are allowed by this function; any numeric values must be specified
948 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
949 * noted in Locale Identifiers.
950 * Parameters: LCID Locale locale identifier
951 * LCTYPE LCType type of information to set
952 * LPCTSTR lpLCData pointer to information to set
953 * Variables :
954 * Result : TRUE / FALSE
955 * Remark :
956 * Status : UNTESTED STUB
957 *
958 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
959 *****************************************************************************/
960
961BOOL WIN32API SetLocaleInfoA(LCID Locale,
962 LCTYPE LCType,
963 LPCSTR lpLCData)
964{
965 dprintf(("KERNEL32: SetLocaleInfoA(%08xh,%08xh,%08xh) not implemented.\n",
966 Locale,
967 LCType,
968 lpLCData));
969
970 return (FALSE);
971}
972
973
974/*****************************************************************************
975 * Name : BOOL SetLocaleInfoW
976 * Purpose : The SetLocaleInfoW function sets an item of locale information.
977 * It does so by making an entry in the process portion of the
978 * locale table. This setting only affects the user override portion
979 * of the locale settings; it does not set the system defaults.
980 * Only certain types of locale information, or LCTYPE values, can
981 * be set by this function. See the following Remarks section for a
982 * list of valid LCTYPE values.
983 * The locale information is always passed in as a null-terminated
984 * Unicode string in the Unicode (W) version of the function, and as
985 * a null-terminated ANSI string in the ANSI (A) version. No integers
986 * are allowed by this function; any numeric values must be specified
987 * as Unicode or ANSI text. Each LCTYPE has a particular format, as
988 * noted in Locale Identifiers.
989 * Parameters: LCID Locale locale identifier
990 * LCTYPE LCType type of information to set
991 * LPCTSTR lpLCData pointer to information to set
992 * Variables :
993 * Result : TRUE / FALSE
994 * Remark :
995 * Status : UNTESTED STUB
996 *
997 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
998 *****************************************************************************/
999
1000BOOL WIN32API SetLocaleInfoW(LCID Locale,
1001 LCTYPE LCType,
1002 LPCWSTR lpLCData)
1003{
1004 dprintf(("KERNEL32: SetLocaleInfoW(%08xh,%08xh,%08xh) not implemented.\n",
1005 Locale,
1006 LCType,
1007 lpLCData));
1008
1009 return (FALSE);
1010}
1011
1012
1013/*****************************************************************************
1014 * Name :
1015 * Purpose :
1016 * Parameters:
1017 * Variables :
1018 * Result :
1019 * Remark :
1020 * Status : UNTESTED STUB
1021 *
1022 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1023 *****************************************************************************/
1024
1025ODINFUNCTION3(DWORD,VerLanguageNameA,DWORD, wLang,
1026 LPSTR, szLang,
1027 DWORD, nSize)
1028{
1029 char buffer[80];
1030 LPCSTR name;
1031 DWORD result;
1032
1033 dprintf(("KERNEL32: VerLanguageNameA not implemented"));
1034
1035 /*
1036 * First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1037 * from the registry.
1038 */
1039
1040#if 0
1041PHS: disabled because if interlinkage with registry
1042 sprintf( buffer,
1043 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
1044 wLang );
1045
1046 result = RegQueryValueA(HKEY_LOCAL_MACHINE,
1047 buffer,
1048 szLang,
1049 (LPLONG)&nSize );
1050 if (result == ERROR_SUCCESS ||
1051 result == ERROR_MORE_DATA)
1052 return nSize;
1053#endif
1054
1055 /*
1056 * If that fails, use the internal table
1057 * (actually, Windows stores the names in a string table resource ...)
1058 */
1059
1060 lstrcpynA(szLang,
1061 "Language-Neutral",
1062 nSize);
1063
1064 return strlen(szLang);
1065}
1066
1067/*****************************************************************************
1068 * Name :
1069 * Purpose :
1070 * Parameters:
1071 * Variables :
1072 * Result :
1073 * Remark :
1074 * Status : UNTESTED STUB
1075 *
1076 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
1077 *****************************************************************************/
1078
1079ODINFUNCTION3(DWORD,VerLanguageNameW,DWORD, wLang,
1080 LPWSTR, szLang,
1081 DWORD, nSize)
1082{
1083 LPSTR szLangA;
1084 DWORD rc;
1085
1086 if ( (szLang == NULL) ||
1087 (nSize == 0) ) // validate parameters
1088 return 0;
1089
1090 szLangA = (LPSTR)HEAP_malloc(nSize + 1);
1091 rc = VerLanguageNameA(wLang,
1092 szLangA,
1093 nSize);
1094 if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
1095 AsciiToUnicodeN(szLangA,
1096 szLang,
1097 nSize);
1098 HEAP_free(szLangA);
1099 return rc;
1100}
1101
1102
Note: See TracBrowser for help on using the repository browser.