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

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

strncpy call changes + language api updates/fixes

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