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

Last change on this file since 1708 was 1708, checked in by sandervl, 26 years ago

version loading fixes + heap corruption fix

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