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

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

added exception stack dump code; GetLocaleInfoA fixes

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