Release 980601
[wine/multimedia.git] / ole / ole2nls.c
blobabba66093c0a8a27fbe7900255234f40080019fd
1 /*
2 * OLE2NLS library
4 * Copyright 1995 Martin von Loewis
5 * Copyright 1998 David Lee Lambert
6 */
8 #include <string.h>
9 #include <ctype.h>
10 #include <stdlib.h>
11 #include "windows.h"
12 #include "heap.h"
13 #include "ole.h"
14 #include "options.h"
15 #include "winnls.h"
16 #include "winreg.h"
17 #include "winerror.h"
18 #include "debug.h"
20 /* Locale name to id map. used by EnumSystemLocales, GetLocalInfoA
21 * MUST contain all #defines from winnls.h
22 * last entry has NULL name, 0 id.
23 */
24 #define LOCALE_ENTRY(x) {#x,LOCALE_##x}
25 static struct tagLOCALE_NAME2ID {
26 char *name;
27 DWORD id;
28 } locale_name2id[]= {
29 LOCALE_ENTRY(ILANGUAGE),
30 LOCALE_ENTRY(SLANGUAGE),
31 LOCALE_ENTRY(SENGLANGUAGE),
32 LOCALE_ENTRY(SABBREVLANGNAME),
33 LOCALE_ENTRY(SNATIVELANGNAME),
34 LOCALE_ENTRY(ICOUNTRY),
35 LOCALE_ENTRY(SCOUNTRY),
36 LOCALE_ENTRY(SENGCOUNTRY),
37 LOCALE_ENTRY(SABBREVCTRYNAME),
38 LOCALE_ENTRY(SNATIVECTRYNAME),
39 LOCALE_ENTRY(IDEFAULTLANGUAGE),
40 LOCALE_ENTRY(IDEFAULTCOUNTRY),
41 LOCALE_ENTRY(IDEFAULTCODEPAGE),
42 LOCALE_ENTRY(IDEFAULTANSICODEPAGE),
43 LOCALE_ENTRY(SLIST),
44 LOCALE_ENTRY(IMEASURE),
45 LOCALE_ENTRY(SDECIMAL),
46 LOCALE_ENTRY(STHOUSAND),
47 LOCALE_ENTRY(SGROUPING),
48 LOCALE_ENTRY(IDIGITS),
49 LOCALE_ENTRY(ILZERO),
50 LOCALE_ENTRY(INEGNUMBER),
51 LOCALE_ENTRY(SNATIVEDIGITS),
52 LOCALE_ENTRY(SCURRENCY),
53 LOCALE_ENTRY(SINTLSYMBOL),
54 LOCALE_ENTRY(SMONDECIMALSEP),
55 LOCALE_ENTRY(SMONTHOUSANDSEP),
56 LOCALE_ENTRY(SMONGROUPING),
57 LOCALE_ENTRY(ICURRDIGITS),
58 LOCALE_ENTRY(IINTLCURRDIGITS),
59 LOCALE_ENTRY(ICURRENCY),
60 LOCALE_ENTRY(INEGCURR),
61 LOCALE_ENTRY(SDATE),
62 LOCALE_ENTRY(STIME),
63 LOCALE_ENTRY(SSHORTDATE),
64 LOCALE_ENTRY(SLONGDATE),
65 LOCALE_ENTRY(STIMEFORMAT),
66 LOCALE_ENTRY(IDATE),
67 LOCALE_ENTRY(ILDATE),
68 LOCALE_ENTRY(ITIME),
69 LOCALE_ENTRY(ITIMEMARKPOSN),
70 LOCALE_ENTRY(ICENTURY),
71 LOCALE_ENTRY(ITLZERO),
72 LOCALE_ENTRY(IDAYLZERO),
73 LOCALE_ENTRY(IMONLZERO),
74 LOCALE_ENTRY(S1159),
75 LOCALE_ENTRY(S2359),
76 LOCALE_ENTRY(ICALENDARTYPE),
77 LOCALE_ENTRY(IOPTIONALCALENDAR),
78 LOCALE_ENTRY(IFIRSTDAYOFWEEK),
79 LOCALE_ENTRY(IFIRSTWEEKOFYEAR),
80 LOCALE_ENTRY(SDAYNAME1),
81 LOCALE_ENTRY(SDAYNAME2),
82 LOCALE_ENTRY(SDAYNAME3),
83 LOCALE_ENTRY(SDAYNAME4),
84 LOCALE_ENTRY(SDAYNAME5),
85 LOCALE_ENTRY(SDAYNAME6),
86 LOCALE_ENTRY(SDAYNAME7),
87 LOCALE_ENTRY(SABBREVDAYNAME1),
88 LOCALE_ENTRY(SABBREVDAYNAME2),
89 LOCALE_ENTRY(SABBREVDAYNAME3),
90 LOCALE_ENTRY(SABBREVDAYNAME4),
91 LOCALE_ENTRY(SABBREVDAYNAME5),
92 LOCALE_ENTRY(SABBREVDAYNAME6),
93 LOCALE_ENTRY(SABBREVDAYNAME7),
94 LOCALE_ENTRY(SMONTHNAME1),
95 LOCALE_ENTRY(SMONTHNAME2),
96 LOCALE_ENTRY(SMONTHNAME3),
97 LOCALE_ENTRY(SMONTHNAME4),
98 LOCALE_ENTRY(SMONTHNAME5),
99 LOCALE_ENTRY(SMONTHNAME6),
100 LOCALE_ENTRY(SMONTHNAME7),
101 LOCALE_ENTRY(SMONTHNAME8),
102 LOCALE_ENTRY(SMONTHNAME9),
103 LOCALE_ENTRY(SMONTHNAME10),
104 LOCALE_ENTRY(SMONTHNAME11),
105 LOCALE_ENTRY(SMONTHNAME12),
106 LOCALE_ENTRY(SMONTHNAME13),
107 LOCALE_ENTRY(SABBREVMONTHNAME1),
108 LOCALE_ENTRY(SABBREVMONTHNAME2),
109 LOCALE_ENTRY(SABBREVMONTHNAME3),
110 LOCALE_ENTRY(SABBREVMONTHNAME4),
111 LOCALE_ENTRY(SABBREVMONTHNAME5),
112 LOCALE_ENTRY(SABBREVMONTHNAME6),
113 LOCALE_ENTRY(SABBREVMONTHNAME7),
114 LOCALE_ENTRY(SABBREVMONTHNAME8),
115 LOCALE_ENTRY(SABBREVMONTHNAME9),
116 LOCALE_ENTRY(SABBREVMONTHNAME10),
117 LOCALE_ENTRY(SABBREVMONTHNAME11),
118 LOCALE_ENTRY(SABBREVMONTHNAME12),
119 LOCALE_ENTRY(SABBREVMONTHNAME13),
120 LOCALE_ENTRY(SPOSITIVESIGN),
121 LOCALE_ENTRY(SNEGATIVESIGN),
122 LOCALE_ENTRY(IPOSSIGNPOSN),
123 LOCALE_ENTRY(INEGSIGNPOSN),
124 LOCALE_ENTRY(IPOSSYMPRECEDES),
125 LOCALE_ENTRY(IPOSSEPBYSPACE),
126 LOCALE_ENTRY(INEGSYMPRECEDES),
127 LOCALE_ENTRY(INEGSEPBYSPACE),
128 /* LOCALE_ENTRY(FONTSIGNATURE),*/
129 {NULL,0},
132 const struct map_lcid2str {
133 LCID langid;
134 const char *langname;
135 } languages[]={
136 {0x0401,"Arabisch"},
137 {0x0402,"Bulgarisch"},
138 {0x0403,"Katalanisch"},
139 {0x0404,"Traditionales Chinesisch"},
140 {0x0405,"Tschecisch"},
141 {0x0406,"Dänisch"},
142 {0x0407,"Deutsch"},
143 {0x0408,"Griechisch"},
144 {0x0409,"Amerikanisches Englisch"},
145 {0x040A,"Kastilisches Spanisch"},
146 {0x040B,"Finnisch"},
147 {0x040C,"Franzvsisch"},
148 {0x040D,"Hebrdisch"},
149 {0x040E,"Ungarisch"},
150 {0x040F,"Isldndisch"},
151 {0x0410,"Italienisch"},
152 {0x0411,"Japanisch"},
153 {0x0412,"Koreanisch"},
154 {0x0413,"Niederldndisch"},
155 {0x0414,"Norwegisch-Bokmal"},
156 {0x0415,"Polnisch"},
157 {0x0416,"Brasilianisches Portugiesisch"},
158 {0x0417,"Rdtoromanisch"},
159 {0x0418,"Rumdnisch"},
160 {0x0419,"Russisch"},
161 {0x041A,"Kroatoserbisch (lateinisch)"},
162 {0x041B,"Slowenisch"},
163 {0x041C,"Albanisch"},
164 {0x041D,"Schwedisch"},
165 {0x041E,"Thai"},
166 {0x041F,"T|rkisch"},
167 {0x0420,"Urdu"},
168 {0x0421,"Bahasa"},
169 {0x0804,"Vereinfachtes Chinesisch"},
170 {0x0807,"Schweizerdeutsch"},
171 {0x0809,"Britisches Englisch"},
172 {0x080A,"Mexikanisches Spanisch"},
173 {0x080C,"Belgisches Franzvsisch"},
174 {0x0810,"Schweizerisches Italienisch"},
175 {0x0813,"Belgisches Niederldndisch"},
176 {0x0814,"Norgwegisch-Nynorsk"},
177 {0x0816,"Portugiesisch"},
178 {0x081A,"Serbokratisch (kyrillisch)"},
179 {0x0C1C,"Kanadisches Franzvsisch"},
180 {0x100C,"Schweizerisches Franzvsisch"},
181 {0x0000,"Unbekannt"},
184 /***********************************************************************
185 * GetUserDefaultLCID (OLE2NLS.1)
187 LCID WINAPI GetUserDefaultLCID()
189 /* Default sorting, neutral sublanguage */
190 switch(Options.language)
192 /* case LANG_Bu: return 0x02; */ /* Bulgarian */
193 /* case LANG_Ch: return 0x04; */ /* Chinese */
194 case LANG_Cz: return 0x05; /* Czech */
195 case LANG_Da: return 0x06; /* Danish */
196 case LANG_De: return 0x07; /* German */
197 /* case LANG_Gr: return 0x08; */ /* Greek */
198 case LANG_En: return 0x09; /* English */
199 case LANG_Es: return 0x0a; /* Spanish */
200 case LANG_Fi: return 0x0b; /* Finnish */
201 case LANG_Fr: return 0x0c; /* French */
202 case LANG_Hu: return 0x0e; /* Hungarian */
203 /* case LANG_Ic: return 0x0f; */ /* Icelandic */
204 case LANG_It: return 0x10; /* Italian */
205 /* case LANG_Jp: return 0x11; */ /* Japanese */
206 case LANG_Ko: return 0x12; /* Korean */
207 /* case LANG_Du: return 0x13; */ /* Dutch */
208 case LANG_No: return 0x14; /* Norwegian */
209 case LANG_Pl: return 0x15; /* Polish */
210 case LANG_Po: return 0x16; /* Portuguese */
211 /* case LANG_Ro: return 0x18; */ /* Romanian */
212 /* case LANG_Ru: return 0x19; */ /* Russian */
213 /* case LANG_Cr: return 0x1a; */ /* Croatian */
214 /* case LANG_Sl: return 0x1b; */ /* Slovak */
215 case LANG_Sw: return 0x1d; /* Swedish */
216 /* case LANG_Tu: return 0x1f; */ /* Turkish */
217 /* case LANG_Sv: return 0x24; */ /* Slovenian */
218 case LANG_Eo: return 0x25; /* Esperanto (not official) */
219 case LANG_Ca: return 0x26; /* Catalan */
221 default:
222 return 0x00; /* Neutral language */
226 /***********************************************************************
227 * GetSystemDefaultLCID (OLE2NLS.2)
229 LCID WINAPI GetSystemDefaultLCID()
231 return GetUserDefaultLCID();
234 /***********************************************************************
235 * GetUserDefaultLangID (OLE2NLS.3)
237 LANGID WINAPI GetUserDefaultLangID()
239 return (WORD)GetUserDefaultLCID();
242 /***********************************************************************
243 * GetSystemDefaultLangID (OLE2NLS.4)
245 LANGID WINAPI GetSystemDefaultLangID()
247 return GetUserDefaultLangID();
250 /***********************************************************************
251 * GetLocaleInfoA (OLE2NLS.5)
252 * Is the last parameter really WORD for Win16?
254 INT16 WINAPI GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
256 return GetLocaleInfo32A(lcid,LCType,buf,len);
259 INT32 WINAPI GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
261 char *retString;
262 int found,i;
264 TRACE(ole,"(%8lX,%8lX,%p,%4X)\n",
265 lcid,LCType,buf,len);
267 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
269 /* As an option, we could obtain the value from win.ini.
270 This would not match the Wine compile-time option.
271 Also, not all identifiers are available from win.ini */
272 retString=0;
273 /* If we are through all of this, retLen should not be zero anymore.
274 If it is, the value is not supported */
275 i=0;
276 while (locale_name2id[i].name!=NULL) {
277 if (LCType == locale_name2id[i].id) {
278 retString = locale_name2id[i].name;
279 break;
281 i++;
283 if (!retString) {
284 WARN(ole,"Unkown LC type %lX\n",LCType);
285 return 0;
288 #define LOCVAL(type,value) case type:retString=value;break;
290 /* Now, the language specific definitions. They don't have to be
291 complete */
292 found=1;
293 switch(Options.language)
295 case LANG_De:
296 switch (LCType) {
297 /* This definitions apply to Germany only. Users in Austria
298 or Switzerland might want to modify them */
299 LOCVAL(LOCALE_ILANGUAGE,"9")
300 LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
301 LOCVAL(LOCALE_SENGLANGUAGE,"German")
302 LOCVAL(LOCALE_SABBREVLANGNAME,"deu")
303 LOCVAL(LOCALE_SNATIVELANGNAME,"Deutsch")
304 LOCVAL(LOCALE_ICOUNTRY,"49")
305 LOCVAL(LOCALE_SCOUNTRY,"Deutschland")
306 LOCVAL(LOCALE_SENGCOUNTRY,"Deutschland")
307 LOCVAL(LOCALE_SABBREVCTRYNAME,"De")
308 LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
309 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
310 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
311 LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
312 /* Dunno
313 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
315 LOCVAL(LOCALE_SLIST,";")
316 LOCVAL(LOCALE_IMEASURE,"0")
317 LOCVAL(LOCALE_SDECIMAL,",")
318 LOCVAL(LOCALE_STHOUSAND,".")
320 LOCVAL(LOCALE_SGROUPING)
322 LOCVAL(LOCALE_IDIGITS,"2")
323 LOCVAL(LOCALE_ILZERO,"1")
325 LOCVAL(LOCALE_INEGNUMBER)
326 Is this "0123456789" ??
327 LOCVAL(LOCALE_SNATIVEDIGITS)
329 LOCVAL(LOCALE_SCURRENCY,"DM")
331 LOCVAL(LOCALE_SINTLSYMBOL)
332 LOCVAL(LOCALE_SMONDECIMALSEP)
333 LOCVAL(LOCALE_SMONTHOUSANDSEP)
334 LOCVAL(LOCALE_SMONGROUPING)
336 LOCVAL(LOCALE_ICURRDIGITS,"2")
338 LOCVAL(LOCALE_IINTLCURRDIGITS)
340 LOCVAL(LOCALE_ICURRENCY,"3")
341 LOCVAL(LOCALE_INEGCURR,"8")
342 LOCVAL(LOCALE_SDATE,".")
343 LOCVAL(LOCALE_STIME,":")
344 LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
345 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
347 LOCVAL(LOCALE_STIMEFORMAT)
349 LOCVAL(LOCALE_IDATE,"1")
351 LOCVAL(LOCALE_ILDATE)
353 LOCVAL(LOCALE_ITIME,"1")
355 LOCVAL(LOCALE_ITIMEMARKPOSN)
356 LOCVAL(LOCALE_ICENTURY)
358 LOCVAL(LOCALE_ITLZERO,"1")
360 LOCVAL(LOCALE_IDAYLZERO)
361 LOCVAL(LOCALE_IMONLZERO)
362 LOCVAL(LOCALE_S1159)
363 LOCVAL(LOCALE_S2359)
364 LOCVAL(LOCALE_ICALENDARTYPE)
365 LOCVAL(LOCALE_IOPTIONALCALENDAR)
366 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
367 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
369 LOCVAL(LOCALE_SDAYNAME1,"Montag")
370 LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
371 LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
372 LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
373 LOCVAL(LOCALE_SDAYNAME5,"Freitag")
374 LOCVAL(LOCALE_SDAYNAME6,"Sonnabend")
375 LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
376 LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
377 LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
378 LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
379 LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
380 LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
381 LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
382 LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
383 LOCVAL(LOCALE_SMONTHNAME1,"Januar")
384 LOCVAL(LOCALE_SMONTHNAME2,"Februar")
385 LOCVAL(LOCALE_SMONTHNAME3,"März")
386 LOCVAL(LOCALE_SMONTHNAME4,"April")
387 LOCVAL(LOCALE_SMONTHNAME5,"Mai")
388 LOCVAL(LOCALE_SMONTHNAME6,"Juni")
389 LOCVAL(LOCALE_SMONTHNAME7,"Juli")
390 LOCVAL(LOCALE_SMONTHNAME8,"August")
391 LOCVAL(LOCALE_SMONTHNAME9,"September")
392 LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
393 LOCVAL(LOCALE_SMONTHNAME11,"November")
394 LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
395 LOCVAL(LOCALE_SMONTHNAME13,"")
396 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
397 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
398 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
399 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
400 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
401 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
402 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
403 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
404 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
405 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
406 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
407 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
408 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
410 LOCVAL(LOCALE_SPOSITIVESIGN)
411 LOCVAL(LOCALE_SNEGATIVESIGN)
412 LOCVAL(LOCALE_IPOSSIGNPOSN)
413 LOCVAL(LOCALE_INEGSIGNPOSN)
414 LOCVAL(LOCALE_IPOSSYMPRECEDES)
415 LOCVAL(LOCALE_IPOSSEPBYSPACE)
416 LOCVAL(LOCALE_INEGSYMPRECEDES)
417 LOCVAL(LOCALE_INEGSEPBYSPACE)
419 default: found=0;break;
421 break; /* LANG(De) */
423 case LANG_Da:
424 switch (LCType) {
425 LOCVAL(LOCALE_ILANGUAGE,"6")
426 LOCVAL(LOCALE_SLANGUAGE,"Dansk")
427 LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
428 LOCVAL(LOCALE_SABBREVLANGNAME,"dan")
429 LOCVAL(LOCALE_SNATIVELANGNAME,"Dansk")
430 LOCVAL(LOCALE_ICOUNTRY,"45")
431 LOCVAL(LOCALE_SCOUNTRY,"Danmark")
432 LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
433 LOCVAL(LOCALE_SABBREVCTRYNAME,"DK")
434 LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
435 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"6")
436 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
437 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
438 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
439 LOCVAL(LOCALE_SLIST,";")
440 LOCVAL(LOCALE_IMEASURE,"0")
441 LOCVAL(LOCALE_SDECIMAL,",")
442 LOCVAL(LOCALE_STHOUSAND,".")
443 /* LOCVAL(LOCALE_SGROUPING) */
444 LOCVAL(LOCALE_IDIGITS,"2")
445 LOCVAL(LOCALE_ILZERO,"1")
446 /* LOCVAL(LOCALE_INEGNUMBER) */
447 /* LOCVAL(LOCALE_SNATIVEDIGITS) */
448 LOCVAL(LOCALE_SCURRENCY,"kr")
449 /* LOCVAL(LOCALE_SINTLSYMBOL) */
450 LOCVAL(LOCALE_SMONDECIMALSEP,",")
451 LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
452 /* LOCVAL(LOCALE_SMONGROUPING) */
453 LOCVAL(LOCALE_ICURRDIGITS,"2")
454 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
455 LOCVAL(LOCALE_ICURRENCY,"3")
456 LOCVAL(LOCALE_INEGCURR,"8")
457 LOCVAL(LOCALE_SDATE,".")
458 LOCVAL(LOCALE_STIME,":")
459 LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
460 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
461 /* LOCVAL(LOCALE_STIMEFORMAT) */
462 LOCVAL(LOCALE_IDATE,"1")
463 /* LOCVAL(LOCALE_ILDATE) */
464 LOCVAL(LOCALE_ITIME,"1")
465 /* LOCVAL(LOCALE_ITIMEMARKPOSN) */
466 /* LOCVAL(LOCALE_ICENTURY) */
467 LOCVAL(LOCALE_ITLZERO,"1")
468 /* LOCVAL(LOCALE_IDAYLZERO) */
469 /* LOCVAL(LOCALE_IMONLZERO) */
470 LOCVAL(LOCALE_S1159, "")
471 LOCVAL(LOCALE_S2359, "")
472 /* LOCVAL(LOCALE_ICALENDARTYPE) */
473 /* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
474 /* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
475 /* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
476 LOCVAL(LOCALE_SDAYNAME1,"Mandag")
477 LOCVAL(LOCALE_SDAYNAME2,"Tirsdag")
478 LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
479 LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
480 LOCVAL(LOCALE_SDAYNAME5,"Fredag")
481 LOCVAL(LOCALE_SDAYNAME6,"Lørdag")
482 LOCVAL(LOCALE_SDAYNAME7,"Søndag")
483 LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
484 LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
485 LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
486 LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
487 LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
488 LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø")
489 LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø")
490 LOCVAL(LOCALE_SMONTHNAME1,"Januar")
491 LOCVAL(LOCALE_SMONTHNAME2,"Februar")
492 LOCVAL(LOCALE_SMONTHNAME3,"Marts")
493 LOCVAL(LOCALE_SMONTHNAME4,"April")
494 LOCVAL(LOCALE_SMONTHNAME5,"Maj")
495 LOCVAL(LOCALE_SMONTHNAME6,"Juni")
496 LOCVAL(LOCALE_SMONTHNAME7,"Juli")
497 LOCVAL(LOCALE_SMONTHNAME8,"August")
498 LOCVAL(LOCALE_SMONTHNAME9,"September")
499 LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
500 LOCVAL(LOCALE_SMONTHNAME11,"November")
501 LOCVAL(LOCALE_SMONTHNAME12,"December")
502 LOCVAL(LOCALE_SMONTHNAME13,"")
503 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
504 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
505 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
506 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
507 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
508 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
509 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
510 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
511 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
512 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
513 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
514 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
515 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
516 LOCVAL(LOCALE_SPOSITIVESIGN, "")
517 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
518 LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
519 LOCVAL(LOCALE_INEGSIGNPOSN, "3")
520 LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
521 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
522 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
523 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
524 default: found=0;break;
526 break; /* LANG(Da) */
528 case LANG_En:
529 switch (LCType) {
530 LOCVAL(LOCALE_ILANGUAGE, "0409")
531 LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
532 LOCVAL(LOCALE_SENGLANGUAGE, "English")
533 LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
534 LOCVAL(LOCALE_SNATIVELANGNAME, "English")
535 LOCVAL(LOCALE_ICOUNTRY, "1")
536 LOCVAL(LOCALE_SCOUNTRY, "United States")
537 LOCVAL(LOCALE_SENGCOUNTRY, "United States")
538 LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
539 LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
540 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
541 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
542 LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
543 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
544 LOCVAL(LOCALE_SLIST, ",")
545 LOCVAL(LOCALE_IMEASURE, "1")
546 LOCVAL(LOCALE_SDECIMAL, ".")
547 LOCVAL(LOCALE_STHOUSAND, ",")
548 LOCVAL(LOCALE_SGROUPING, "3;0")
549 LOCVAL(LOCALE_IDIGITS, "2")
550 LOCVAL(LOCALE_ILZERO, "1")
551 LOCVAL(LOCALE_INEGNUMBER, "1")
552 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
553 LOCVAL(LOCALE_SCURRENCY, "$")
554 LOCVAL(LOCALE_SINTLSYMBOL, "USD")
555 LOCVAL(LOCALE_SMONDECIMALSEP, ".")
556 LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
557 LOCVAL(LOCALE_SMONGROUPING, "3;0")
558 LOCVAL(LOCALE_ICURRDIGITS, "2")
559 LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
560 LOCVAL(LOCALE_ICURRENCY, "0")
561 LOCVAL(LOCALE_INEGCURR, "0")
562 LOCVAL(LOCALE_SDATE, "/")
563 LOCVAL(LOCALE_STIME, ":")
564 LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
565 LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
566 LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
567 LOCVAL(LOCALE_IDATE, "0")
568 LOCVAL(LOCALE_ILDATE, "0")
569 LOCVAL(LOCALE_ITIME, "0")
570 LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
571 LOCVAL(LOCALE_ICENTURY, "0")
572 LOCVAL(LOCALE_ITLZERO, "0")
573 LOCVAL(LOCALE_IDAYLZERO, "0")
574 LOCVAL(LOCALE_IMONLZERO, "0")
575 LOCVAL(LOCALE_S1159, "AM")
576 LOCVAL(LOCALE_S2359, "PM")
577 LOCVAL(LOCALE_ICALENDARTYPE, "1")
578 LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
579 LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
580 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
581 LOCVAL(LOCALE_SDAYNAME1, "Monday")
582 LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
583 LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
584 LOCVAL(LOCALE_SDAYNAME4, "Thursday")
585 LOCVAL(LOCALE_SDAYNAME5, "Friday")
586 LOCVAL(LOCALE_SDAYNAME6, "Saturday")
587 LOCVAL(LOCALE_SDAYNAME7, "Sunday")
588 LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
589 LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
590 LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
591 LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
592 LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
593 LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
594 LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
595 LOCVAL(LOCALE_SMONTHNAME1, "January")
596 LOCVAL(LOCALE_SMONTHNAME2, "February")
597 LOCVAL(LOCALE_SMONTHNAME3, "March")
598 LOCVAL(LOCALE_SMONTHNAME4, "April")
599 LOCVAL(LOCALE_SMONTHNAME5, "May")
600 LOCVAL(LOCALE_SMONTHNAME6, "June")
601 LOCVAL(LOCALE_SMONTHNAME7, "July")
602 LOCVAL(LOCALE_SMONTHNAME8, "August")
603 LOCVAL(LOCALE_SMONTHNAME9, "September")
604 LOCVAL(LOCALE_SMONTHNAME10, "October")
605 LOCVAL(LOCALE_SMONTHNAME11, "November")
606 LOCVAL(LOCALE_SMONTHNAME12, "December")
607 LOCVAL(LOCALE_SMONTHNAME13, "")
608 LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
609 LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
610 LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
611 LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
612 LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
613 LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
614 LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
615 LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
616 LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
617 LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
618 LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
619 LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
620 LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
621 LOCVAL(LOCALE_SPOSITIVESIGN, "")
622 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
623 LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
624 LOCVAL(LOCALE_INEGSIGNPOSN, "0")
625 LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
626 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
627 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
628 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
629 default: found=0;break;
631 break; /* LANG(En) */
633 case LANG_Eo:
634 switch (LCType) {
635 /* LOCVAL(LOCALE_ILANGUAGE,"9") ISO numerical ID for language TODO */
636 LOCVAL(LOCALE_SLANGUAGE,"Esperanto")
637 LOCVAL(LOCALE_SENGLANGUAGE,"Esperanto")
638 /* LOCVAL(LOCALE_SABBREVLANGNAME,"deu") */
639 LOCVAL(LOCALE_SNATIVELANGNAME,"Esperanto")
640 /* LOCVAL(LOCALE_ICOUNTRY,"49") not official in any one country */
641 /* LOCVAL(LOCALE_SCOUNTRY,"Deutschland") */
642 /* LOCVAL(LOCALE_SENGCOUNTRY,"Germany") */
643 /* LOCVAL(LOCALE_SABBREVCTRYNAME,"De") */
644 /* LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland") */
645 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") ISO ID of lang TODO */
646 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49") */
647 LOCVAL(LOCALE_IDEFAULTCODEPAGE,"3") /* is this right? TODO */
648 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"3") /* is this right? TODO */
649 LOCVAL(LOCALE_SLIST,";")
650 LOCVAL(LOCALE_IMEASURE,"0")
651 LOCVAL(LOCALE_SDECIMAL,",")
652 LOCVAL(LOCALE_STHOUSAND,".")
653 /* LOCVAL(LOCALE_SGROUPING) */
654 LOCVAL(LOCALE_IDIGITS,"2")
655 LOCVAL(LOCALE_ILZERO,"1")
656 /* LOCVAL(LOCALE_INEGNUMBER) */
657 /* LOCVAL(LOCALE_SNATIVEDIGITS) */
658 LOCVAL(LOCALE_SCURRENCY,"NLG") /* accounting currency of UEA */
659 /* LOCVAL(LOCALE_SINTLSYMBOL) */
660 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
661 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
662 /* LOCVAL(LOCALE_SMONGROUPING) */
663 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
664 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
665 LOCVAL(LOCALE_ICURRENCY,"3")
666 LOCVAL(LOCALE_INEGCURR,"8")
667 LOCVAL(LOCALE_SDATE,".")
668 LOCVAL(LOCALE_STIME,":")
669 LOCVAL(LOCALE_SSHORTDATE,"yyyy.mm.dd")
670 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
671 /* LOCVAL(LOCALE_STIMEFORMAT) */
672 LOCVAL(LOCALE_IDATE,"1")
673 /* LOCVAL(LOCALE_ILDATE) */
674 LOCVAL(LOCALE_ITIME,"1")
675 /* LOCVAL(LOCALE_ITIMEMARKPOSN) */
676 /* LOCVAL(LOCALE_ICENTURY) */
677 LOCVAL(LOCALE_ITLZERO,"1")
678 /* LOCVAL(LOCALE_IDAYLZERO) */
679 /* LOCVAL(LOCALE_IMONLZERO) */
680 /* LOCVAL(LOCALE_S1159) */
681 /* LOCVAL(LOCALE_S2359) */
682 /* LOCVAL(LOCALE_ICALENDARTYPE) */
683 /* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
684 /* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
685 /* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
686 LOCVAL(LOCALE_SDAYNAME1,"lundo")
687 LOCVAL(LOCALE_SDAYNAME2,"mardo")
688 LOCVAL(LOCALE_SDAYNAME3,"merkredo")
689 LOCVAL(LOCALE_SDAYNAME4,"¼aýdo")
690 LOCVAL(LOCALE_SDAYNAME5,"vendredo")
691 LOCVAL(LOCALE_SDAYNAME6,"sabato")
692 LOCVAL(LOCALE_SDAYNAME7,"dimanæo")
693 LOCVAL(LOCALE_SABBREVDAYNAME1,"lu")
694 LOCVAL(LOCALE_SABBREVDAYNAME2,"ma")
695 LOCVAL(LOCALE_SABBREVDAYNAME3,"me")
696 LOCVAL(LOCALE_SABBREVDAYNAME4,"¼a")
697 LOCVAL(LOCALE_SABBREVDAYNAME5,"ve")
698 LOCVAL(LOCALE_SABBREVDAYNAME6,"sa")
699 LOCVAL(LOCALE_SABBREVDAYNAME7,"di")
700 LOCVAL(LOCALE_SMONTHNAME1,"januaro")
701 LOCVAL(LOCALE_SMONTHNAME2,"februaro")
702 LOCVAL(LOCALE_SMONTHNAME3,"marto")
703 LOCVAL(LOCALE_SMONTHNAME4,"aprilo")
704 LOCVAL(LOCALE_SMONTHNAME5,"majo")
705 LOCVAL(LOCALE_SMONTHNAME6,"junio")
706 LOCVAL(LOCALE_SMONTHNAME7,"julio")
707 LOCVAL(LOCALE_SMONTHNAME8,"aýgusto")
708 LOCVAL(LOCALE_SMONTHNAME9,"septembro")
709 LOCVAL(LOCALE_SMONTHNAME10,"oktobro")
710 LOCVAL(LOCALE_SMONTHNAME11,"novembro")
711 LOCVAL(LOCALE_SMONTHNAME12,"decembro")
712 LOCVAL(LOCALE_SMONTHNAME13,"")
713 LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
714 LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
715 LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
716 LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
717 LOCVAL(LOCALE_SABBREVMONTHNAME5,"maj")
718 LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
719 LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
720 LOCVAL(LOCALE_SABBREVMONTHNAME8,"aýg")
721 LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
722 LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt")
723 LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
724 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dec")
725 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
726 /* LOCVAL(LOCALE_SPOSITIVESIGN) */
727 /* LOCVAL(LOCALE_SNEGATIVESIGN) */
728 /* LOCVAL(LOCALE_IPOSSIGNPOSN) */
729 /* LOCVAL(LOCALE_INEGSIGNPOSN) */
730 /* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
731 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
732 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
733 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
734 default: found=0;break;
736 break; /* LANG(Eo) */
738 case LANG_Fi:
739 switch (LCType) {
740 LOCVAL(LOCALE_ILANGUAGE,"11")
741 LOCVAL(LOCALE_SLANGUAGE,"Suomi")
742 LOCVAL(LOCALE_SENGLANGUAGE,"Finnish")
743 LOCVAL(LOCALE_SABBREVLANGNAME,"fin")
744 LOCVAL(LOCALE_SNATIVELANGNAME,"suomi")
745 LOCVAL(LOCALE_ICOUNTRY,"49")
746 LOCVAL(LOCALE_SCOUNTRY,"Suomi")
747 LOCVAL(LOCALE_SENGCOUNTRY,"Finland")
748 LOCVAL(LOCALE_SABBREVCTRYNAME,"Fin")
749 LOCVAL(LOCALE_SNATIVECTRYNAME,"Suomi")
750 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"11")
751 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"358")
753 LOCVAL(LOCALE_IDEFAULTCODEPAGE)
754 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
756 LOCVAL(LOCALE_SLIST,";")
757 LOCVAL(LOCALE_IMEASURE,"0")
758 LOCVAL(LOCALE_SDECIMAL,",")
759 LOCVAL(LOCALE_STHOUSAND,".")
761 LOCVAL(LOCALE_SGROUPING)
763 LOCVAL(LOCALE_IDIGITS,"2")
764 LOCVAL(LOCALE_ILZERO,"1")
766 LOCVAL(LOCALE_INEGNUMBER)
767 Is this "0123456789" ??
768 LOCVAL(LOCALE_SNATIVEDIGITS)
770 LOCVAL(LOCALE_SCURRENCY,"mk")
772 LOCVAL(LOCALE_SINTLSYMBOL)
773 LOCVAL(LOCALE_SMONDECIMALSEP)
774 LOCVAL(LOCALE_SMONTHOUSANDSEP)
775 LOCVAL(LOCALE_SMONGROUPING)
777 LOCVAL(LOCALE_ICURRDIGITS,"2")
779 LOCVAL(LOCALE_IINTLCURRDIGITS)
781 LOCVAL(LOCALE_ICURRENCY,"3")
782 LOCVAL(LOCALE_INEGCURR,"8")
783 LOCVAL(LOCALE_SDATE,".")
784 LOCVAL(LOCALE_STIME,":")
785 LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
786 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
788 LOCVAL(LOCALE_STIMEFORMAT)
790 LOCVAL(LOCALE_IDATE,"1")
792 LOCVAL(LOCALE_ILDATE)
794 LOCVAL(LOCALE_ITIME,"1")
796 LOCVAL(LOCALE_ITIMEMARKPOSN)
797 LOCVAL(LOCALE_ICENTURY)
799 LOCVAL(LOCALE_ITLZERO,"1")
801 LOCVAL(LOCALE_IDAYLZERO)
802 LOCVAL(LOCALE_IMONLZERO)
804 LOCVAL(LOCALE_S1159, "AM")
805 LOCVAL(LOCALE_S2359, "PM")
807 LOCVAL(LOCALE_ICALENDARTYPE)
808 LOCVAL(LOCALE_IOPTIONALCALENDAR)
809 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
810 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
812 LOCVAL(LOCALE_SDAYNAME1,"maanantai")
813 LOCVAL(LOCALE_SDAYNAME2,"tiistai")
814 LOCVAL(LOCALE_SDAYNAME3,"keskiviikko")
815 LOCVAL(LOCALE_SDAYNAME4,"torstai")
816 LOCVAL(LOCALE_SDAYNAME5,"perjantai")
817 LOCVAL(LOCALE_SDAYNAME6,"lauantai")
818 LOCVAL(LOCALE_SDAYNAME7,"sunnuntai")
819 LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
820 LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
821 LOCVAL(LOCALE_SABBREVDAYNAME3,"Ke")
822 LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
823 LOCVAL(LOCALE_SABBREVDAYNAME5,"Pe")
824 LOCVAL(LOCALE_SABBREVDAYNAME6,"La")
825 LOCVAL(LOCALE_SABBREVDAYNAME7,"Su")
826 LOCVAL(LOCALE_SMONTHNAME1,"tammikuu")
827 LOCVAL(LOCALE_SMONTHNAME2,"helmikuu")
828 LOCVAL(LOCALE_SMONTHNAME3,"maaliskuu")
829 LOCVAL(LOCALE_SMONTHNAME4,"huhtikuu")
830 LOCVAL(LOCALE_SMONTHNAME5,"toukokuu")
831 LOCVAL(LOCALE_SMONTHNAME6,"kesäkuu")
832 LOCVAL(LOCALE_SMONTHNAME7,"heinäkuu")
833 LOCVAL(LOCALE_SMONTHNAME8,"elokuu")
834 LOCVAL(LOCALE_SMONTHNAME9,"syyskuu")
835 LOCVAL(LOCALE_SMONTHNAME10,"lokakuu")
836 LOCVAL(LOCALE_SMONTHNAME11,"marraskuu")
837 LOCVAL(LOCALE_SMONTHNAME12,"joulukuu")
838 LOCVAL(LOCALE_SMONTHNAME13,"")
839 LOCVAL(LOCALE_SABBREVMONTHNAME1,"tammi")
840 LOCVAL(LOCALE_SABBREVMONTHNAME2,"helmi")
841 LOCVAL(LOCALE_SABBREVMONTHNAME3,"maalis")
842 LOCVAL(LOCALE_SABBREVMONTHNAME4,"huhti")
843 LOCVAL(LOCALE_SABBREVMONTHNAME5,"touko")
844 LOCVAL(LOCALE_SABBREVMONTHNAME6,"kesä")
845 LOCVAL(LOCALE_SABBREVMONTHNAME7,"heinä")
846 LOCVAL(LOCALE_SABBREVMONTHNAME8,"elo")
847 LOCVAL(LOCALE_SABBREVMONTHNAME9,"syys")
848 LOCVAL(LOCALE_SABBREVMONTHNAME10,"loka")
849 LOCVAL(LOCALE_SABBREVMONTHNAME11,"marras")
850 LOCVAL(LOCALE_SABBREVMONTHNAME12,"joulu")
851 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
852 LOCVAL(LOCALE_SPOSITIVESIGN, "")
853 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
855 LOCVAL(LOCALE_IPOSSIGNPOSN)
856 LOCVAL(LOCALE_INEGSIGNPOSN)
857 LOCVAL(LOCALE_IPOSSYMPRECEDES)
858 LOCVAL(LOCALE_IPOSSEPBYSPACE)
859 LOCVAL(LOCALE_INEGSYMPRECEDES)
860 LOCVAL(LOCALE_INEGSEPBYSPACE)
862 default: found=0;break;
864 break; /* LANG(Fi) */
866 case LANG_It:
867 switch (LCType) {
868 LOCVAL(LOCALE_ILANGUAGE,"9")
869 LOCVAL(LOCALE_SLANGUAGE,"Italiano")
870 LOCVAL(LOCALE_SENGLANGUAGE,"Italian")
871 LOCVAL(LOCALE_SABBREVLANGNAME,"ita")
872 LOCVAL(LOCALE_SNATIVELANGNAME,"Italiano")
873 LOCVAL(LOCALE_ICOUNTRY,"39")
874 LOCVAL(LOCALE_SCOUNTRY,"Italia")
875 LOCVAL(LOCALE_SENGCOUNTRY,"Italy")
876 LOCVAL(LOCALE_SABBREVCTRYNAME,"It")
877 LOCVAL(LOCALE_SNATIVECTRYNAME,"Italia")
878 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
879 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"39")
880 /* Dunno
881 LOCVAL(LOCALE_IDEFAULTCODEPAGE)
882 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
884 LOCVAL(LOCALE_SLIST,";")
885 LOCVAL(LOCALE_IMEASURE,"0")
886 LOCVAL(LOCALE_SDECIMAL,",")
887 LOCVAL(LOCALE_STHOUSAND,".")
889 LOCVAL(LOCALE_SGROUPING)
891 LOCVAL(LOCALE_IDIGITS,"2")
892 LOCVAL(LOCALE_ILZERO,"1")
894 LOCVAL(LOCALE_INEGNUMBER)
895 Is this "0123456789" ??
896 LOCVAL(LOCALE_SNATIVEDIGITS)
898 LOCVAL(LOCALE_SCURRENCY,"Lit.")
900 LOCVAL(LOCALE_SINTLSYMBOL)
901 LOCVAL(LOCALE_SMONDECIMALSEP)
902 LOCVAL(LOCALE_SMONTHOUSANDSEP)
903 LOCVAL(LOCALE_SMONGROUPING)
905 LOCVAL(LOCALE_ICURRDIGITS,"2")
907 LOCVAL(LOCALE_IINTLCURRDIGITS)
909 LOCVAL(LOCALE_ICURRENCY,"3")
910 LOCVAL(LOCALE_INEGCURR,"8")
911 LOCVAL(LOCALE_SDATE,".")
912 LOCVAL(LOCALE_STIME,":")
913 LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
914 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
916 LOCVAL(LOCALE_STIMEFORMAT)
918 LOCVAL(LOCALE_IDATE,"1")
920 LOCVAL(LOCALE_ILDATE)
922 LOCVAL(LOCALE_ITIME,"1")
924 LOCVAL(LOCALE_ITIMEMARKPOSN)
925 LOCVAL(LOCALE_ICENTURY)
927 LOCVAL(LOCALE_ITLZERO,"1")
929 LOCVAL(LOCALE_IDAYLZERO)
930 LOCVAL(LOCALE_IMONLZERO)
931 LOCVAL(LOCALE_S1159)
932 LOCVAL(LOCALE_S2359)
933 LOCVAL(LOCALE_ICALENDARTYPE)
934 LOCVAL(LOCALE_IOPTIONALCALENDAR)
935 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
936 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
938 LOCVAL(LOCALE_SDAYNAME1,"Lunedi'")
939 LOCVAL(LOCALE_SDAYNAME2,"Martedi'")
940 LOCVAL(LOCALE_SDAYNAME3,"Mercoledi'")
941 LOCVAL(LOCALE_SDAYNAME4,"Giovedi'")
942 LOCVAL(LOCALE_SDAYNAME5,"Venerdi'")
943 LOCVAL(LOCALE_SDAYNAME6,"Sabato")
944 LOCVAL(LOCALE_SDAYNAME7,"Domenica")
945 LOCVAL(LOCALE_SABBREVDAYNAME1,"Lu")
946 LOCVAL(LOCALE_SABBREVDAYNAME2,"Ma")
947 LOCVAL(LOCALE_SABBREVDAYNAME3,"Me")
948 LOCVAL(LOCALE_SABBREVDAYNAME4,"Gi")
949 LOCVAL(LOCALE_SABBREVDAYNAME5,"Ve")
950 LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
951 LOCVAL(LOCALE_SABBREVDAYNAME7,"Do")
952 LOCVAL(LOCALE_SMONTHNAME1,"Gennaio")
953 LOCVAL(LOCALE_SMONTHNAME2,"Febbraio")
954 LOCVAL(LOCALE_SMONTHNAME3,"Marzo")
955 LOCVAL(LOCALE_SMONTHNAME4,"Aprile")
956 LOCVAL(LOCALE_SMONTHNAME5,"Maggio")
957 LOCVAL(LOCALE_SMONTHNAME6,"Giugno")
958 LOCVAL(LOCALE_SMONTHNAME7,"Luglio")
959 LOCVAL(LOCALE_SMONTHNAME8,"Agosto")
960 LOCVAL(LOCALE_SMONTHNAME9,"Settembre")
961 LOCVAL(LOCALE_SMONTHNAME10,"Ottobre")
962 LOCVAL(LOCALE_SMONTHNAME11,"Novembre")
963 LOCVAL(LOCALE_SMONTHNAME12,"Dicembre")
964 LOCVAL(LOCALE_SMONTHNAME13,"")
965 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Gen")
966 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
967 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
968 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
969 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mag")
970 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Giu")
971 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lug")
972 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Ago")
973 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Set")
974 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Ott")
975 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
976 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dic")
977 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
979 LOCVAL(LOCALE_SPOSITIVESIGN)
980 LOCVAL(LOCALE_SNEGATIVESIGN)
981 LOCVAL(LOCALE_IPOSSIGNPOSN)
982 LOCVAL(LOCALE_INEGSIGNPOSN)
983 LOCVAL(LOCALE_IPOSSYMPRECEDES)
984 LOCVAL(LOCALE_IPOSSEPBYSPACE)
985 LOCVAL(LOCALE_INEGSYMPRECEDES)
986 LOCVAL(LOCALE_INEGSEPBYSPACE)
988 default: found=0;break;
990 break; /* LANG(It) */
992 case 0x0809:
993 switch (LCType) {
994 LOCVAL(LOCALE_ILANGUAGE, "0809")
995 LOCVAL(LOCALE_SLANGUAGE, "English (United Kingdom)")
996 LOCVAL(LOCALE_SENGLANGUAGE, "English")
997 LOCVAL(LOCALE_SABBREVLANGNAME, "ENG")
998 LOCVAL(LOCALE_SNATIVELANGNAME, "English")
999 LOCVAL(LOCALE_ICOUNTRY, "44")
1000 LOCVAL(LOCALE_SCOUNTRY, "United Kingdom")
1001 LOCVAL(LOCALE_SENGCOUNTRY, "United Kingdom")
1002 LOCVAL(LOCALE_SABBREVCTRYNAME, "GBR")
1003 LOCVAL(LOCALE_SNATIVECTRYNAME, "United Kingdom")
1004 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
1005 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
1006 LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
1007 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
1008 LOCVAL(LOCALE_SLIST, ",")
1009 LOCVAL(LOCALE_IMEASURE, "0")
1010 LOCVAL(LOCALE_SDECIMAL, ".")
1011 LOCVAL(LOCALE_STHOUSAND, ",")
1012 LOCVAL(LOCALE_SGROUPING, "3;0")
1013 LOCVAL(LOCALE_IDIGITS, "2")
1014 LOCVAL(LOCALE_ILZERO, "1")
1015 LOCVAL(LOCALE_INEGNUMBER, "1")
1016 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
1017 LOCVAL(LOCALE_SCURRENCY, "£")
1018 LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
1019 LOCVAL(LOCALE_SMONDECIMALSEP, ".")
1020 LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
1021 LOCVAL(LOCALE_SMONGROUPING, "3;0")
1022 LOCVAL(LOCALE_ICURRDIGITS, "2")
1023 LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
1024 LOCVAL(LOCALE_ICURRENCY, "0")
1025 LOCVAL(LOCALE_INEGCURR, "1")
1026 LOCVAL(LOCALE_SDATE, "/")
1027 LOCVAL(LOCALE_STIME, ":")
1028 LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
1029 LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
1030 LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
1031 LOCVAL(LOCALE_IDATE, "1")
1032 LOCVAL(LOCALE_ILDATE, "1")
1033 LOCVAL(LOCALE_ITIME, "1")
1034 LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
1035 LOCVAL(LOCALE_ICENTURY, "0")
1036 LOCVAL(LOCALE_ITLZERO, "1")
1037 LOCVAL(LOCALE_IDAYLZERO, "1")
1038 LOCVAL(LOCALE_IMONLZERO, "1")
1039 LOCVAL(LOCALE_S1159, "AM")
1040 LOCVAL(LOCALE_S2359, "PM")
1041 LOCVAL(LOCALE_ICALENDARTYPE, "1")
1042 LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
1043 LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
1044 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
1045 LOCVAL(LOCALE_SDAYNAME1, "Monday")
1046 LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
1047 LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
1048 LOCVAL(LOCALE_SDAYNAME4, "Thursday")
1049 LOCVAL(LOCALE_SDAYNAME5, "Friday")
1050 LOCVAL(LOCALE_SDAYNAME6, "Saturday")
1051 LOCVAL(LOCALE_SDAYNAME7, "Sunday")
1052 LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
1053 LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
1054 LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
1055 LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
1056 LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
1057 LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
1058 LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
1059 LOCVAL(LOCALE_SMONTHNAME1, "January")
1060 LOCVAL(LOCALE_SMONTHNAME2, "February")
1061 LOCVAL(LOCALE_SMONTHNAME3, "March")
1062 LOCVAL(LOCALE_SMONTHNAME4, "April")
1063 LOCVAL(LOCALE_SMONTHNAME5, "May")
1064 LOCVAL(LOCALE_SMONTHNAME6, "June")
1065 LOCVAL(LOCALE_SMONTHNAME7, "July")
1066 LOCVAL(LOCALE_SMONTHNAME8, "August")
1067 LOCVAL(LOCALE_SMONTHNAME9, "September")
1068 LOCVAL(LOCALE_SMONTHNAME10, "October")
1069 LOCVAL(LOCALE_SMONTHNAME11, "November")
1070 LOCVAL(LOCALE_SMONTHNAME12, "December")
1071 LOCVAL(LOCALE_SMONTHNAME13, "")
1072 LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
1073 LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
1074 LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
1075 LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
1076 LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
1077 LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
1078 LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
1079 LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
1080 LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
1081 LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
1082 LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
1083 LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
1084 LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
1085 LOCVAL(LOCALE_SPOSITIVESIGN, "")
1086 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
1087 LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
1088 LOCVAL(LOCALE_INEGSIGNPOSN, "3")
1089 LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
1090 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
1091 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
1092 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
1093 default: found=0;break;
1095 break; /* LANG(0x0809) (U.K. English) */
1097 case LANG_Ko: /* string using codepage 949 */
1098 switch (LCType) {
1099 LOCVAL(LOCALE_ILANGUAGE,"18")
1100 LOCVAL(LOCALE_SLANGUAGE,"\307\321\261\271\276\356")
1101 LOCVAL(LOCALE_SENGLANGUAGE,"Korean")
1102 LOCVAL(LOCALE_SABBREVLANGNAME,"KOR")
1103 LOCVAL(LOCALE_SNATIVELANGNAME,"\307\321\261\271\276\356")
1104 LOCVAL(LOCALE_ICOUNTRY,"82")
1105 LOCVAL(LOCALE_SCOUNTRY,"\264\353\307\321\271\316\261\271")
1106 LOCVAL(LOCALE_SENGCOUNTRY,"Korea (South)")
1107 LOCVAL(LOCALE_SABBREVCTRYNAME,"KOR")
1108 LOCVAL(LOCALE_SNATIVECTRYNAME,"\264\353\307\321\271\316\261\271")
1109 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"18")
1110 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"82")
1111 LOCVAL(LOCALE_IDEFAULTCODEPAGE,"949")
1112 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"949")
1113 LOCVAL(LOCALE_SLIST,",")
1114 LOCVAL(LOCALE_IMEASURE,"0")
1115 LOCVAL(LOCALE_SDECIMAL,".")
1116 LOCVAL(LOCALE_STHOUSAND,",")
1117 LOCVAL(LOCALE_SGROUPING,"3;0")
1118 LOCVAL(LOCALE_IDIGITS,"2")
1119 LOCVAL(LOCALE_ILZERO,"0")
1120 LOCVAL(LOCALE_INEGNUMBER,"1")
1121 LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
1122 LOCVAL(LOCALE_SCURRENCY,"\\")
1123 LOCVAL(LOCALE_SINTLSYMBOL,"Won")
1124 LOCVAL(LOCALE_SMONDECIMALSEP,".")
1125 LOCVAL(LOCALE_SMONTHOUSANDSEP,",")
1126 LOCVAL(LOCALE_SMONGROUPING,"3;0")
1127 LOCVAL(LOCALE_ICURRDIGITS,"2")
1128 LOCVAL(LOCALE_IINTLCURRDIGITS,"2")
1129 LOCVAL(LOCALE_ICURRENCY,"3")
1130 LOCVAL(LOCALE_INEGCURR,"8")
1131 LOCVAL(LOCALE_SDATE,"/")
1132 LOCVAL(LOCALE_STIME,":")
1133 LOCVAL(LOCALE_SSHORTDATE,"yyyy/MM/dd")
1134 LOCVAL(LOCALE_SLONGDATE,"yyyy/MM/dd")
1135 LOCVAL(LOCALE_STIMEFORMAT,"h:mm:ss tt")
1136 LOCVAL(LOCALE_IDATE,"1")
1137 LOCVAL(LOCALE_ILDATE,"1")
1138 LOCVAL(LOCALE_ITIME,"1")
1139 LOCVAL(LOCALE_ITIMEMARKPOSN,"0")
1140 LOCVAL(LOCALE_ICENTURY,"0")
1141 LOCVAL(LOCALE_ITLZERO,"0")
1142 LOCVAL(LOCALE_IDAYLZERO,"0")
1143 LOCVAL(LOCALE_IMONLZERO,"0")
1144 LOCVAL(LOCALE_S1159,"\277\300\300\374")
1145 LOCVAL(LOCALE_S2359,"\277\300\310\304")
1146 LOCVAL(LOCALE_ICALENDARTYPE,"1")
1147 /* Korean Tangun Era calendar */
1148 LOCVAL(LOCALE_IOPTIONALCALENDAR,"5")
1149 LOCVAL(LOCALE_IFIRSTDAYOFWEEK,"6")
1150 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR,"0")
1151 LOCVAL(LOCALE_SDAYNAME1,"\277\371\277\344\300\317")
1152 LOCVAL(LOCALE_SDAYNAME2,"\310\255\277\344\300\317")
1153 LOCVAL(LOCALE_SDAYNAME3,"\274\366\277\344\300\317")
1154 LOCVAL(LOCALE_SDAYNAME4,"\270\361\277\344\300\317")
1155 LOCVAL(LOCALE_SDAYNAME5,"\261\335\277\344\300\317")
1156 LOCVAL(LOCALE_SDAYNAME6,"\305\344\277\344\300\317")
1157 LOCVAL(LOCALE_SDAYNAME7,"\300\317\277\344\300\317")
1158 LOCVAL(LOCALE_SABBREVDAYNAME1,"\277\371")
1159 LOCVAL(LOCALE_SABBREVDAYNAME2,"\310\255")
1160 LOCVAL(LOCALE_SABBREVDAYNAME3,"\274\366")
1161 LOCVAL(LOCALE_SABBREVDAYNAME4,"\270\361")
1162 LOCVAL(LOCALE_SABBREVDAYNAME5,"\261\335")
1163 LOCVAL(LOCALE_SABBREVDAYNAME6,"\305\344")
1164 LOCVAL(LOCALE_SABBREVDAYNAME7,"\300\317")
1165 LOCVAL(LOCALE_SMONTHNAME1,"1\277\371")
1166 LOCVAL(LOCALE_SMONTHNAME2,"2\277\371")
1167 LOCVAL(LOCALE_SMONTHNAME3,"3\277\371")
1168 LOCVAL(LOCALE_SMONTHNAME4,"4\277\371")
1169 LOCVAL(LOCALE_SMONTHNAME5,"5\277\371")
1170 LOCVAL(LOCALE_SMONTHNAME6,"6\277\371")
1171 LOCVAL(LOCALE_SMONTHNAME7,"7\277\371")
1172 LOCVAL(LOCALE_SMONTHNAME8,"8\277\371")
1173 LOCVAL(LOCALE_SMONTHNAME9,"9\277\371")
1174 LOCVAL(LOCALE_SMONTHNAME10,"10\277\371")
1175 LOCVAL(LOCALE_SMONTHNAME11,"11\277\371")
1176 LOCVAL(LOCALE_SMONTHNAME12,"12\277\371")
1177 LOCVAL(LOCALE_SMONTHNAME13,"")
1178 LOCVAL(LOCALE_SABBREVMONTHNAME1,"1\277\371")
1179 LOCVAL(LOCALE_SABBREVMONTHNAME2,"2\277\371")
1180 LOCVAL(LOCALE_SABBREVMONTHNAME3,"3\277\371")
1181 LOCVAL(LOCALE_SABBREVMONTHNAME4,"4\277\371")
1182 LOCVAL(LOCALE_SABBREVMONTHNAME5,"5\277\371")
1183 LOCVAL(LOCALE_SABBREVMONTHNAME6,"6\277\371")
1184 LOCVAL(LOCALE_SABBREVMONTHNAME7,"7\277\371")
1185 LOCVAL(LOCALE_SABBREVMONTHNAME8,"8\277\371")
1186 LOCVAL(LOCALE_SABBREVMONTHNAME9,"9\277\371")
1187 LOCVAL(LOCALE_SABBREVMONTHNAME10,"10\277\371")
1188 LOCVAL(LOCALE_SABBREVMONTHNAME11,"11\277\371")
1189 LOCVAL(LOCALE_SABBREVMONTHNAME12,"12\277\371")
1190 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
1191 LOCVAL(LOCALE_SPOSITIVESIGN,"")
1192 LOCVAL(LOCALE_SNEGATIVESIGN,"-")
1193 LOCVAL(LOCALE_IPOSSIGNPOSN,"3")
1194 LOCVAL(LOCALE_INEGSIGNPOSN,"0")
1195 LOCVAL(LOCALE_IPOSSYMPRECEDES,"3")
1196 LOCVAL(LOCALE_IPOSSEPBYSPACE,"0")
1197 LOCVAL(LOCALE_INEGSYMPRECEDES,"3")
1198 LOCVAL(LOCALE_INEGSEPBYSPACE,"0")
1199 default: found=0;break;
1201 break; /* LANG(Ko) */
1203 case LANG_Hu:
1204 switch (LCType) {
1205 LOCVAL(LOCALE_ILANGUAGE,"9")
1206 LOCVAL(LOCALE_SLANGUAGE,"Magyar")
1207 LOCVAL(LOCALE_SENGLANGUAGE,"Hungarian")
1208 LOCVAL(LOCALE_SABBREVLANGNAME,"hun")
1209 LOCVAL(LOCALE_SNATIVELANGNAME,"Magyar")
1210 LOCVAL(LOCALE_ICOUNTRY,"36")
1211 LOCVAL(LOCALE_SCOUNTRY,"Magyarország")
1212 LOCVAL(LOCALE_SENGCOUNTRY,"Hungary")
1213 LOCVAL(LOCALE_SABBREVCTRYNAME,"Hu")
1214 LOCVAL(LOCALE_SNATIVECTRYNAME,"Magyarország")
1215 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
1216 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"36")
1217 LOCVAL(LOCALE_IDEFAULTCODEPAGE,"852")
1218 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"852")
1219 LOCVAL(LOCALE_SLIST,";")
1220 LOCVAL(LOCALE_IMEASURE,"0")
1221 LOCVAL(LOCALE_SDECIMAL,".")
1222 LOCVAL(LOCALE_STHOUSAND,",")
1224 LOCVAL(LOCALE_SGROUPING)
1226 LOCVAL(LOCALE_IDIGITS,"2")
1227 LOCVAL(LOCALE_ILZERO,"1")
1229 LOCVAL(LOCALE_INEGNUMBER)
1230 Is this "0123456789" ??
1231 LOCVAL(LOCALE_SNATIVEDIGITS)
1233 LOCVAL(LOCALE_SCURRENCY,"Ft")
1235 LOCVAL(LOCALE_SINTLSYMBOL)
1236 LOCVAL(LOCALE_SMONDECIMALSEP)
1237 LOCVAL(LOCALE_SMONTHOUSANDSEP)
1238 LOCVAL(LOCALE_SMONGROUPING)
1240 LOCVAL(LOCALE_ICURRDIGITS,"0")
1242 LOCVAL(LOCALE_IINTLCURRDIGITS)
1244 LOCVAL(LOCALE_ICURRENCY,"3")
1245 LOCVAL(LOCALE_INEGCURR,"8")
1246 LOCVAL(LOCALE_SDATE,"/")
1247 LOCVAL(LOCALE_STIME,":")
1248 LOCVAL(LOCALE_SSHORTDATE,"yyyy.MM.dd")
1249 LOCVAL(LOCALE_SLONGDATE,"ddd, yyyy. MMMM d")
1251 LOCVAL(LOCALE_STIMEFORMAT)
1253 LOCVAL(LOCALE_IDATE,"1")
1255 LOCVAL(LOCALE_ILDATE)
1257 LOCVAL(LOCALE_ITIME,"1")
1259 LOCVAL(LOCALE_ITIMEMARKPOSN)
1260 LOCVAL(LOCALE_ICENTURY)
1262 LOCVAL(LOCALE_ITLZERO,"1")
1264 LOCVAL(LOCALE_IDAYLZERO)
1265 LOCVAL(LOCALE_IMONLZERO)
1266 LOCVAL(LOCALE_S1159)
1267 LOCVAL(LOCALE_S2359)
1268 LOCVAL(LOCALE_ICALENDARTYPE)
1269 LOCVAL(LOCALE_IOPTIONALCALENDAR)
1270 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
1271 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
1273 LOCVAL(LOCALE_SDAYNAME1,"Hétfõ")
1274 LOCVAL(LOCALE_SDAYNAME2,"Kedd")
1275 LOCVAL(LOCALE_SDAYNAME3,"Szerda")
1276 LOCVAL(LOCALE_SDAYNAME4,"Csütörtök")
1277 LOCVAL(LOCALE_SDAYNAME5,"Péntek")
1278 LOCVAL(LOCALE_SDAYNAME6,"Szombat")
1279 LOCVAL(LOCALE_SDAYNAME7,"Vasárnap")
1280 LOCVAL(LOCALE_SABBREVDAYNAME1,"Hé")
1281 LOCVAL(LOCALE_SABBREVDAYNAME2,"Ke")
1282 LOCVAL(LOCALE_SABBREVDAYNAME3,"Se")
1283 LOCVAL(LOCALE_SABBREVDAYNAME4,"Cs")
1284 LOCVAL(LOCALE_SABBREVDAYNAME5,"Pé")
1285 LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
1286 LOCVAL(LOCALE_SABBREVDAYNAME7,"Va")
1287 LOCVAL(LOCALE_SMONTHNAME1,"Január")
1288 LOCVAL(LOCALE_SMONTHNAME2,"Február")
1289 LOCVAL(LOCALE_SMONTHNAME3,"Március")
1290 LOCVAL(LOCALE_SMONTHNAME4,"Április")
1291 LOCVAL(LOCALE_SMONTHNAME5,"Május")
1292 LOCVAL(LOCALE_SMONTHNAME6,"Június")
1293 LOCVAL(LOCALE_SMONTHNAME7,"Július")
1294 LOCVAL(LOCALE_SMONTHNAME8,"Augusztus")
1295 LOCVAL(LOCALE_SMONTHNAME9,"Szeptember")
1296 LOCVAL(LOCALE_SMONTHNAME10,"Október")
1297 LOCVAL(LOCALE_SMONTHNAME11,"November")
1298 LOCVAL(LOCALE_SMONTHNAME12,"December")
1299 LOCVAL(LOCALE_SMONTHNAME13,"")
1300 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
1301 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
1302 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Már")
1303 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Ápr")
1304 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Máj")
1305 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jún")
1306 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Júl")
1307 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
1308 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sze")
1309 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
1310 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
1311 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
1312 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
1314 LOCVAL(LOCALE_SPOSITIVESIGN)
1315 LOCVAL(LOCALE_SNEGATIVESIGN)
1316 LOCVAL(LOCALE_IPOSSIGNPOSN)
1317 LOCVAL(LOCALE_INEGSIGNPOSN)
1318 LOCVAL(LOCALE_IPOSSYMPRECEDES)
1319 LOCVAL(LOCALE_IPOSSEPBYSPACE)
1320 LOCVAL(LOCALE_INEGSYMPRECEDES)
1321 LOCVAL(LOCALE_INEGSEPBYSPACE)
1323 default: found=0;break;
1325 break; /* LANG(En) */
1327 case LANG_Pl:
1328 switch (LCType) {
1329 LOCVAL(LOCALE_ILANGUAGE,"9")
1330 LOCVAL(LOCALE_SLANGUAGE,"Polski")
1331 LOCVAL(LOCALE_SENGLANGUAGE,"Polish")
1332 LOCVAL(LOCALE_SABBREVLANGNAME, "pol")
1333 LOCVAL(LOCALE_SNATIVELANGNAME,"Polski")
1334 LOCVAL(LOCALE_ICOUNTRY,"49")
1335 LOCVAL(LOCALE_SCOUNTRY,"Polska")
1336 LOCVAL(LOCALE_SENGCOUNTRY,"Poland")
1337 LOCVAL(LOCALE_SABBREVCTRYNAME,"Pl")
1338 LOCVAL(LOCALE_SNATIVECTRYNAME,"Polska")
1339 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
1340 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
1341 LOCVAL(LOCALE_IDEFAULTCODEPAGE,"1252")
1342 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"1252")
1343 LOCVAL(LOCALE_SLIST,";")
1344 LOCVAL(LOCALE_IMEASURE,"0")
1345 LOCVAL(LOCALE_SDECIMAL,",")
1346 LOCVAL(LOCALE_STHOUSAND," ")
1348 LOCVAL(LOCALE_SGROUPING)
1350 LOCVAL(LOCALE_IDIGITS,"2")
1351 LOCVAL(LOCALE_ILZERO,"1")
1353 LOCVAL(LOCALE_INEGNUMBER)
1354 Is this "0123456789" ??
1355 LOCVAL(LOCALE_SNATIVEDIGITS)
1357 LOCVAL(LOCALE_SCURRENCY,"z\xB3")
1359 LOCVAL(LOCALE_SINTLSYMBOL)
1360 LOCVAL(LOCALE_SMONDECIMALSEP)
1361 LOCVAL(LOCALE_SMONTHOUSANDSEP)
1362 LOCVAL(LOCALE_SMONGROUPING)
1364 LOCVAL(LOCALE_ICURRDIGITS,"2")
1366 LOCVAL(LOCALE_IINTLCURRDIGITS)
1368 LOCVAL(LOCALE_ICURRENCY,"3")
1369 LOCVAL(LOCALE_INEGCURR,"8")
1370 LOCVAL(LOCALE_SDATE,".")
1371 LOCVAL(LOCALE_STIME,":")
1372 LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
1373 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
1375 LOCVAL(LOCALE_STIMEFORMAT)
1377 LOCVAL(LOCALE_IDATE,"1")
1379 LOCVAL(LOCALE_ILDATE)
1381 LOCVAL(LOCALE_ITIME,"1")
1383 LOCVAL(LOCALE_ITIMEMARKPOSN)
1384 LOCVAL(LOCALE_ICENTURY)
1386 LOCVAL(LOCALE_ITLZERO,"1")
1388 LOCVAL(LOCALE_IDAYLZERO)
1389 LOCVAL(LOCALE_IMONLZERO)
1390 LOCVAL(LOCALE_S1159)
1391 LOCVAL(LOCALE_S2359)
1392 LOCVAL(LOCALE_ICALENDARTYPE)
1393 LOCVAL(LOCALE_IOPTIONALCALENDAR)
1394 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
1395 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
1397 LOCVAL(LOCALE_SDAYNAME1,"Poniedzia\263ek")
1398 LOCVAL(LOCALE_SDAYNAME2,"Wtorek")
1399 LOCVAL(LOCALE_SDAYNAME3,"Sroda")
1400 LOCVAL(LOCALE_SDAYNAME4,"Czwartek")
1401 LOCVAL(LOCALE_SDAYNAME5,"Pi\xB9tek")
1402 LOCVAL(LOCALE_SDAYNAME6,"Sobota")
1403 LOCVAL(LOCALE_SDAYNAME7,"Niedziela")
1404 LOCVAL(LOCALE_SABBREVDAYNAME1,"Po")
1405 LOCVAL(LOCALE_SABBREVDAYNAME2,"Wt")
1406 LOCVAL(LOCALE_SABBREVDAYNAME3,"Sr")
1407 LOCVAL(LOCALE_SABBREVDAYNAME4,"Cz")
1408 LOCVAL(LOCALE_SABBREVDAYNAME5,"Pt")
1409 LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
1410 LOCVAL(LOCALE_SABBREVDAYNAME7,"Ni")
1411 LOCVAL(LOCALE_SMONTHNAME1,"Stycze\xF1")
1412 LOCVAL(LOCALE_SMONTHNAME2,"Luty")
1413 LOCVAL(LOCALE_SMONTHNAME3,"Marzec")
1414 LOCVAL(LOCALE_SMONTHNAME4,"Kwiecie\xF1")
1415 LOCVAL(LOCALE_SMONTHNAME5,"Maj")
1416 LOCVAL(LOCALE_SMONTHNAME6,"Czerwiec")
1417 LOCVAL(LOCALE_SMONTHNAME7,"Lipiec")
1418 LOCVAL(LOCALE_SMONTHNAME8,"Sierpie\xF1")
1419 LOCVAL(LOCALE_SMONTHNAME9,"Wrzesie\xF1")
1420 LOCVAL(LOCALE_SMONTHNAME10,"Pa\237dziernik")
1421 LOCVAL(LOCALE_SMONTHNAME11,"Listapad")
1422 LOCVAL(LOCALE_SMONTHNAME12,"Grudzie\xF1")
1423 LOCVAL(LOCALE_SMONTHNAME13,"")
1424 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Sty")
1425 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Lut")
1426 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
1427 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Kwi")
1428 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
1429 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Cze")
1430 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lip")
1431 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Sie")
1432 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Wrz")
1433 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Pa\x9F")
1434 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Lis")
1435 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Gru")
1436 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
1438 LOCVAL(LOCALE_SPOSITIVESIGN)
1439 LOCVAL(LOCALE_SNEGATIVESIGN)
1440 LOCVAL(LOCALE_IPOSSIGNPOSN)
1441 LOCVAL(LOCALE_INEGSIGNPOSN)
1442 LOCVAL(LOCALE_IPOSSYMPRECEDES)
1443 LOCVAL(LOCALE_IPOSSEPBYSPACE)
1444 LOCVAL(LOCALE_INEGSYMPRECEDES)
1445 LOCVAL(LOCALE_INEGSEPBYSPACE)
1447 default: found=0;break;
1449 break; /* LANG(Pl) */
1451 case LANG_Po:
1452 switch (LCType) {
1453 LOCVAL(LOCALE_ILANGUAGE, "0416")
1454 LOCVAL(LOCALE_SLANGUAGE, "Portugu\352s (Brasil)")
1455 LOCVAL(LOCALE_SENGLANGUAGE, "Protuguese")
1456 LOCVAL(LOCALE_SABBREVLANGNAME, "POR")
1457 LOCVAL(LOCALE_SNATIVELANGNAME, "Portugu\352s")
1458 LOCVAL(LOCALE_ICOUNTRY, "1")
1459 LOCVAL(LOCALE_SCOUNTRY, "Brasil")
1460 LOCVAL(LOCALE_SENGCOUNTRY, "Brazil")
1461 LOCVAL(LOCALE_SABBREVCTRYNAME, "BRA")
1462 LOCVAL(LOCALE_SNATIVECTRYNAME, "Brasil")
1463 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
1464 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
1465 LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
1466 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
1467 LOCVAL(LOCALE_SLIST, ";")
1468 LOCVAL(LOCALE_IMEASURE, "1")
1469 LOCVAL(LOCALE_SDECIMAL, ",")
1470 LOCVAL(LOCALE_STHOUSAND, ".")
1471 LOCVAL(LOCALE_SGROUPING, "3;0")
1472 LOCVAL(LOCALE_IDIGITS, "2")
1473 LOCVAL(LOCALE_ILZERO, "1")
1474 LOCVAL(LOCALE_INEGNUMBER, "1")
1475 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
1476 LOCVAL(LOCALE_SCURRENCY, "$")
1477 LOCVAL(LOCALE_SINTLSYMBOL, "USD")
1478 LOCVAL(LOCALE_SMONDECIMALSEP, ",")
1479 LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
1480 LOCVAL(LOCALE_SMONGROUPING, "3;0")
1481 LOCVAL(LOCALE_ICURRDIGITS, "2")
1482 LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
1483 LOCVAL(LOCALE_ICURRENCY, "0")
1484 LOCVAL(LOCALE_INEGCURR, "0")
1485 LOCVAL(LOCALE_SDATE, "/")
1486 LOCVAL(LOCALE_STIME, ":")
1487 LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
1488 LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
1489 LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
1490 LOCVAL(LOCALE_IDATE, "0")
1491 LOCVAL(LOCALE_ILDATE, "0")
1492 LOCVAL(LOCALE_ITIME, "0")
1493 LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
1494 LOCVAL(LOCALE_ICENTURY, "0")
1495 LOCVAL(LOCALE_ITLZERO, "0")
1496 LOCVAL(LOCALE_IDAYLZERO, "0")
1497 LOCVAL(LOCALE_IMONLZERO, "0")
1498 LOCVAL(LOCALE_S1159, "AM")
1499 LOCVAL(LOCALE_S2359, "PM")
1500 LOCVAL(LOCALE_ICALENDARTYPE, "1")
1501 LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
1502 LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
1503 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
1504 LOCVAL(LOCALE_SDAYNAME1, "Segunda")
1505 LOCVAL(LOCALE_SDAYNAME2, "Ter\347a")
1506 LOCVAL(LOCALE_SDAYNAME3, "Quarta")
1507 LOCVAL(LOCALE_SDAYNAME4, "Quinta")
1508 LOCVAL(LOCALE_SDAYNAME5, "Sexta")
1509 LOCVAL(LOCALE_SDAYNAME6, "S\341bado")
1510 LOCVAL(LOCALE_SDAYNAME7, "Domingo")
1511 LOCVAL(LOCALE_SABBREVDAYNAME1, "Seg")
1512 LOCVAL(LOCALE_SABBREVDAYNAME2, "Ter")
1513 LOCVAL(LOCALE_SABBREVDAYNAME3, "Qua")
1514 LOCVAL(LOCALE_SABBREVDAYNAME4, "Qui")
1515 LOCVAL(LOCALE_SABBREVDAYNAME5, "Sex")
1516 LOCVAL(LOCALE_SABBREVDAYNAME6, "S\341b")
1517 LOCVAL(LOCALE_SABBREVDAYNAME7, "Dom")
1518 LOCVAL(LOCALE_SMONTHNAME1, "Janeiro")
1519 LOCVAL(LOCALE_SMONTHNAME2, "Fevereiro")
1520 LOCVAL(LOCALE_SMONTHNAME3, "Mar\347o")
1521 LOCVAL(LOCALE_SMONTHNAME4, "Abril")
1522 LOCVAL(LOCALE_SMONTHNAME5, "Maio")
1523 LOCVAL(LOCALE_SMONTHNAME6, "Junho")
1524 LOCVAL(LOCALE_SMONTHNAME7, "Julho")
1525 LOCVAL(LOCALE_SMONTHNAME8, "Agosto")
1526 LOCVAL(LOCALE_SMONTHNAME9, "Setembro")
1527 LOCVAL(LOCALE_SMONTHNAME10, "Outubro")
1528 LOCVAL(LOCALE_SMONTHNAME11, "Novembro")
1529 LOCVAL(LOCALE_SMONTHNAME12, "Dezembro")
1530 LOCVAL(LOCALE_SMONTHNAME13, "")
1531 LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
1532 LOCVAL(LOCALE_SABBREVMONTHNAME2, "Fev")
1533 LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
1534 LOCVAL(LOCALE_SABBREVMONTHNAME4, "Abr")
1535 LOCVAL(LOCALE_SABBREVMONTHNAME5, "Mai")
1536 LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
1537 LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
1538 LOCVAL(LOCALE_SABBREVMONTHNAME8, "Ago")
1539 LOCVAL(LOCALE_SABBREVMONTHNAME9, "Set")
1540 LOCVAL(LOCALE_SABBREVMONTHNAME10, "Out")
1541 LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
1542 LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dez")
1543 LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
1544 LOCVAL(LOCALE_SPOSITIVESIGN, "")
1545 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
1546 LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
1547 LOCVAL(LOCALE_INEGSIGNPOSN, "0")
1548 LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
1549 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
1550 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
1551 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
1552 default: found=0;break;
1554 break; /* LANG(Po) */
1556 case LANG_Sw:
1557 switch (LCType) {
1558 LOCVAL(LOCALE_ILANGUAGE,"1d")
1559 LOCVAL(LOCALE_SLANGUAGE,"Svenska")
1560 LOCVAL(LOCALE_SENGLANGUAGE,"Swedish")
1561 LOCVAL(LOCALE_SABBREVLANGNAME,"SV")
1562 LOCVAL(LOCALE_SNATIVELANGNAME,"Svenska")
1563 LOCVAL(LOCALE_ICOUNTRY,"45")
1564 LOCVAL(LOCALE_SCOUNTRY,"SWE")
1565 LOCVAL(LOCALE_SENGCOUNTRY,"Sweden")
1566 LOCVAL(LOCALE_SABBREVCTRYNAME,"SVE")
1567 LOCVAL(LOCALE_SNATIVECTRYNAME,"Sverige")
1568 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"1d")
1569 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
1570 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
1571 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
1572 LOCVAL(LOCALE_SLIST,";")
1573 LOCVAL(LOCALE_IMEASURE,"0")
1574 LOCVAL(LOCALE_SDECIMAL,",")
1575 LOCVAL(LOCALE_STHOUSAND,".")
1576 /* LOCVAL(LOCALE_SGROUPING) */
1577 LOCVAL(LOCALE_IDIGITS,"2")
1578 LOCVAL(LOCALE_ILZERO,"1")
1579 /* LOCVAL(LOCALE_INEGNUMBER) */
1580 /* LOCVAL(LOCALE_SNATIVEDIGITS) */
1581 LOCVAL(LOCALE_SCURRENCY,"kr")
1582 /* LOCVAL(LOCALE_SINTLSYMBOL) */
1583 LOCVAL(LOCALE_SMONDECIMALSEP,",")
1584 LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
1585 /* LOCVAL(LOCALE_SMONGROUPING) */
1586 LOCVAL(LOCALE_ICURRDIGITS,"2")
1587 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
1588 LOCVAL(LOCALE_ICURRENCY,"3")
1589 LOCVAL(LOCALE_INEGCURR,"8")
1590 LOCVAL(LOCALE_SDATE,".")
1591 LOCVAL(LOCALE_STIME,":")
1592 LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
1593 LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
1594 /* LOCVAL(LOCALE_STIMEFORMAT) */
1595 LOCVAL(LOCALE_IDATE,"1")
1596 /* LOCVAL(LOCALE_ILDATE) */
1597 LOCVAL(LOCALE_ITIME,"1")
1598 /* LOCVAL(LOCALE_ITIMEMARKPOSN) */
1599 /* LOCVAL(LOCALE_ICENTURY) */
1600 LOCVAL(LOCALE_ITLZERO,"1")
1601 /* LOCVAL(LOCALE_IDAYLZERO) */
1602 /* LOCVAL(LOCALE_IMONLZERO) */
1603 LOCVAL(LOCALE_S1159, "")
1604 LOCVAL(LOCALE_S2359, "")
1605 /* LOCVAL(LOCALE_ICALENDARTYPE) */
1606 /* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
1607 /* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
1608 /* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
1609 LOCVAL(LOCALE_SDAYNAME1,"Måndag")
1610 LOCVAL(LOCALE_SDAYNAME2,"Tisdag")
1611 LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
1612 LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
1613 LOCVAL(LOCALE_SDAYNAME5,"Fredag")
1614 LOCVAL(LOCALE_SDAYNAME6,"Lördag")
1615 LOCVAL(LOCALE_SDAYNAME7,"Söndag")
1616 LOCVAL(LOCALE_SABBREVDAYNAME1,"Må")
1617 LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
1618 LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
1619 LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
1620 LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
1621 LOCVAL(LOCALE_SABBREVDAYNAME6,"Lö")
1622 LOCVAL(LOCALE_SABBREVDAYNAME7,"Sö")
1623 LOCVAL(LOCALE_SMONTHNAME1,"Januari")
1624 LOCVAL(LOCALE_SMONTHNAME2,"Februari")
1625 LOCVAL(LOCALE_SMONTHNAME3,"Mars")
1626 LOCVAL(LOCALE_SMONTHNAME4,"April")
1627 LOCVAL(LOCALE_SMONTHNAME5,"Maj")
1628 LOCVAL(LOCALE_SMONTHNAME6,"Juni")
1629 LOCVAL(LOCALE_SMONTHNAME7,"Juli")
1630 LOCVAL(LOCALE_SMONTHNAME8,"Augusti")
1631 LOCVAL(LOCALE_SMONTHNAME9,"September")
1632 LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
1633 LOCVAL(LOCALE_SMONTHNAME11,"November")
1634 LOCVAL(LOCALE_SMONTHNAME12,"December")
1635 LOCVAL(LOCALE_SMONTHNAME13,"")
1636 LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
1637 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
1638 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
1639 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
1640 LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
1641 LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
1642 LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
1643 LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
1644 LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
1645 LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
1646 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
1647 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
1648 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
1649 LOCVAL(LOCALE_SPOSITIVESIGN, "")
1650 LOCVAL(LOCALE_SNEGATIVESIGN, "-")
1651 LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
1652 LOCVAL(LOCALE_INEGSIGNPOSN, "3")
1653 LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
1654 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
1655 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
1656 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
1657 default: found=0;break;
1659 break; /* LANG(Sw) */
1661 /*Insert other languages here*/
1663 default:
1664 found=0;
1665 break;
1666 } /* switch */
1668 if(!found) {
1669 ERR(ole,"'%s' not supported for your language.\n",
1670 retString);
1671 retString = "<WINE-NLS-unknown>";
1672 /*return 0;*/
1674 if (buf)
1675 lstrcpyn32A(buf,retString,len);
1676 return strlen(retString)+1;
1679 /***********************************************************************
1680 * GetLocaleInfo32W (KERNEL32.230)
1681 * Is the last parameter really WORD for Win16?
1683 INT32 WINAPI GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
1685 LPSTR abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
1687 INT32 n = GetLocaleInfo32A(lcid, LCType, abuf, len);
1688 if (wbuf)
1689 lstrcpynAtoW(wbuf,abuf,len);
1690 HeapFree(GetProcessHeap(),0,abuf);
1691 return n;
1694 /***********************************************************************
1695 * CompareString16 (OLE2NLS.8)
1697 UINT16 WINAPI CompareString16(DWORD lcid,DWORD fdwStyle,
1698 LPCSTR s1,DWORD l1,LPCSTR s2,DWORD l2)
1700 return (UINT16)CompareString32A(lcid,fdwStyle,s1,l1,s2,l2);
1703 /***********************************************************************
1704 * CompareString32A (KERNEL32.29)
1705 * This implementation ignores the locale
1706 * FIXME
1708 UINT32 WINAPI CompareString32A(DWORD lcid, DWORD fdwStyle,
1709 LPCSTR s1, DWORD l1, LPCSTR s2,DWORD l2)
1711 int len,ret;
1712 if(fdwStyle & NORM_IGNORENONSPACE)
1713 FIXME(ole, "IGNORENONSPACE not supported\n");
1714 if(fdwStyle & NORM_IGNORESYMBOLS)
1715 FIXME(ole, "IGNORESYMBOLS not supported\n");
1716 /* Is strcmp defaulting to string sort or to word sort?? */
1717 /* FIXME: Handle NORM_STRINGSORT */
1718 l1 = (l1==-1)?strlen(s1):l1;
1719 l2 = (l2==-1)?strlen(s2):l2;
1720 len = l1<l2 ? l1:l2;
1721 ret = (fdwStyle & NORM_IGNORECASE) ?
1722 lstrncmpi32A(s1,s2,len) : lstrncmp32A(s1,s2,len);
1723 /* not equal, return 1 or 3 */
1724 if(ret!=0)return ret+2;
1725 /* same len, return 2 */
1726 if(l1==l2)return 2;
1727 /* the longer one is lexically greater */
1728 return (l1<l2)? 1 : 3;
1731 /***********************************************************************
1732 * CompareString32W (KERNEL32.30)
1733 * This implementation ignores the locale
1734 * FIXME
1736 UINT32 WINAPI CompareString32W(DWORD lcid, DWORD fdwStyle,
1737 LPCWSTR s1, DWORD l1, LPCWSTR s2,DWORD l2)
1739 int len,ret;
1740 if(fdwStyle & NORM_IGNORENONSPACE)
1741 FIXME(ole,"IGNORENONSPACE not supprted\n");
1742 if(fdwStyle & NORM_IGNORESYMBOLS)
1743 FIXME(ole,"IGNORESYMBOLS not supported\n");
1745 /* Is strcmp defaulting to string sort or to word sort?? */
1746 /* FIXME: Handle NORM_STRINGSORT */
1747 l1 = (l1==-1)?lstrlen32W(s1):l1;
1748 l2 = (l2==-1)?lstrlen32W(s2):l2;
1749 len = l1<l2 ? l1:l2;
1750 ret = (fdwStyle & NORM_IGNORECASE) ?
1751 lstrncmpi32W(s1,s2,len) : lstrncmp32W(s1,s2,len);
1752 /* not equal, return 1 or 3 */
1753 if(ret!=0) return ret+2;
1754 /* same len, return 2 */
1755 if(l1==l2) return 2;
1756 /* the longer one is lexically greater */
1757 return (l1<l2)? 1 : 3;
1760 /***********************************************************************
1761 * SetLocaleInfoA [KERNEL32.499]
1763 BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
1765 FIXME(ole,"(%ld,%ld,%s): stub\n",lcid,lctype,data);
1766 return TRUE;
1769 /***********************************************************************
1770 * IsValidLocale [KERNEL32.361]
1772 BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags)
1774 /* we support ANY language. Well, at least say that...*/
1775 return TRUE;
1778 /***********************************************************************
1779 * EnumSystemLocales32W [KERNEL32.93]
1781 BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum,
1782 DWORD flags )
1784 int i;
1785 BOOL32 ret;
1786 WCHAR buffer[200];
1787 HKEY xhkey;
1789 TRACE(win32,"(%p,%08lx)\n",lpfnLocaleEnum,flags );
1790 /* see if we can reuse the Win95 registry entries.... */
1791 if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
1792 i=0;
1793 while (1) {
1794 if (ERROR_SUCCESS!=RegEnumKey32W(xhkey,i,buffer,sizeof(buffer)))
1795 break;
1796 if (!lpfnLocaleEnum(buffer))
1797 break;
1798 i++;
1800 RegCloseKey(xhkey);
1801 return TRUE;
1804 i=0;
1805 while (languages[i].langname!=NULL)
1807 LPWSTR cp;
1808 char xbuffer[10];
1810 sprintf(xbuffer,"%08lx",(DWORD)languages[i].langid);
1812 cp = HEAP_strdupAtoW( GetProcessHeap(), 0, xbuffer );
1813 ret = lpfnLocaleEnum(cp);
1814 HeapFree( GetProcessHeap(), 0, cp );
1815 if (!ret) break;
1816 i++;
1818 return TRUE;
1821 /***********************************************************************
1822 * EnumSystemLocales32A [KERNEL32.92]
1824 BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,
1825 DWORD flags)
1827 int i;
1828 CHAR buffer[200];
1829 HKEY xhkey;
1831 TRACE(win32,"(%p,%08lx)\n",
1832 lpfnLocaleEnum,flags
1834 if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
1835 i=0;
1836 while (1) {
1837 if (ERROR_SUCCESS!=RegEnumKey32A(xhkey,i,buffer,sizeof(buffer)))
1838 break;
1839 if (!lpfnLocaleEnum(buffer))
1840 break;
1841 i++;
1843 RegCloseKey(xhkey);
1844 return TRUE;
1846 i=0;
1847 while (languages[i].langname!=NULL) {
1848 sprintf(buffer,"%08lx",(DWORD)languages[i].langid);
1849 if (!lpfnLocaleEnum(buffer))
1850 break;
1851 i++;
1853 return TRUE;
1856 /***********************************************************************
1857 * GetStringTypeA [OLE2NLS.7]
1859 BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,
1860 INT16 cchSrc,LPWORD chartype)
1862 return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
1864 /***********************************************************************
1865 * GetStringTypeA [KERNEL32.277]
1867 BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,
1868 INT32 cchSrc,LPWORD chartype)
1870 return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
1872 /***********************************************************************
1873 * GetStringTypeExA [KERNEL32.276]
1875 BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,
1876 INT32 cchSrc,LPWORD chartype)
1878 int i;
1880 switch (dwInfoType) {
1881 case CT_CTYPE2:
1882 FIXME(ole,"CT_CTYPE2 not supported.\n");
1883 return FALSE;
1884 case CT_CTYPE3:
1885 FIXME(ole,"CT_CTYPE3 not supported.\n");
1886 return FALSE;
1887 default:break;
1889 if (cchSrc==-1)
1890 cchSrc=lstrlen32A(src);
1891 for (i=0;i<cchSrc;i++) {
1892 chartype[i] = 0;
1893 if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
1894 if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
1895 if (islower(src[i])) chartype[i]|=C1_LOWER;
1896 if (isupper(src[i])) chartype[i]|=C1_UPPER;
1897 if (isspace(src[i])) chartype[i]|=C1_SPACE;
1898 if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
1899 if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
1900 /* FIXME: isblank() is a GNU extension */
1901 /* if (isblank(src[i])) chartype[i]|=C1_BLANK; */
1902 if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
1903 /* C1_XDIGIT */
1905 return TRUE;
1908 /*********************************************************************
1909 * GetStringTypeW [KERNEL32.279]
1911 * NOTES
1912 * Yes, this is missing LCID locale. MS fault.
1914 BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,
1915 LPWORD chartype)
1917 return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype);
1920 /*********************************************************************
1921 * GetStringTypeW [KERNEL32.278]
1922 * FIXME: unicode chars are assumed chars
1924 BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,
1925 INT32 cchSrc,LPWORD chartype)
1927 int i;
1929 switch (dwInfoType) {
1930 case CT_CTYPE2:
1931 FIXME(ole,"CT_CTYPE2 not supported.\n");
1932 return FALSE;
1933 case CT_CTYPE3:
1934 FIXME(ole,"CT_CTYPE3 not supported.\n");
1935 return FALSE;
1936 default:break;
1938 if (cchSrc==-1)
1939 cchSrc=lstrlen32W(src);
1940 for (i=0;i<cchSrc;i++) {
1941 chartype[i] = 0;
1942 if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
1943 if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
1944 if (islower(src[i])) chartype[i]|=C1_LOWER;
1945 if (isupper(src[i])) chartype[i]|=C1_UPPER;
1946 if (isspace(src[i])) chartype[i]|=C1_SPACE;
1947 if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
1948 if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
1949 /* FIXME: isblank() is a GNU extension */
1950 /* if (isblank(src[i])) chartype[i]|=C1_BLANK; */
1951 if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
1952 /* C1_XDIGIT */
1954 return TRUE;
1957 /*****************************************************************
1958 * VerLanguageName16 [VER.10]
1960 DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen)
1962 int i;
1963 DWORD result;
1964 char buffer[80];
1966 TRACE(ver,"(%d,%p,%d)\n",langid,langname,langnamelen);
1967 /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1968 * from the registry.
1970 sprintf(buffer,
1971 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
1972 langid);
1973 result = RegQueryValue16(HKEY_LOCAL_MACHINE, buffer, langname,
1974 (LPDWORD)&langnamelen);
1975 if (result == ERROR_SUCCESS) {
1976 langname[langnamelen-1]='\0';
1977 return langnamelen;
1979 /* if that fails, use the internal table */
1980 for (i=0;languages[i].langid!=0;i++)
1981 if (langid==languages[i].langid)
1982 break;
1983 strncpy(langname,languages[i].langname,langnamelen);
1984 langname[langnamelen-1]='\0';
1985 return strlen(languages[i].langname);
1988 /*****************************************************************
1989 * VerLanguageName32A [VERSION.9]
1991 DWORD WINAPI VerLanguageName32A(UINT32 langid,LPSTR langname,
1992 UINT32 langnamelen)
1994 return VerLanguageName16(langid,langname,langnamelen);
1997 /*****************************************************************
1998 * VerLanguageName32W [VERSION.10]
2000 DWORD WINAPI VerLanguageName32W(UINT32 langid,LPWSTR langname,
2001 UINT32 langnamelen)
2003 int i;
2004 LPWSTR keyname;
2005 DWORD result;
2006 char buffer[80];
2008 /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
2009 * from the registry.
2011 sprintf(buffer,
2012 "\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",
2013 langid);
2014 keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
2015 result = RegQueryValue32W(HKEY_LOCAL_MACHINE, keyname, langname,
2016 (LPDWORD)&langnamelen);
2017 HeapFree( GetProcessHeap(), 0, keyname );
2018 if (result != ERROR_SUCCESS) {
2019 /* if that fails, use the internal table */
2020 for (i=0;languages[i].langid!=0;i++)
2021 if (langid==languages[i].langid)
2022 break;
2023 lstrcpyAtoW( langname, languages[i].langname );
2024 langnamelen = strlen(languages[i].langname);
2025 /* same as strlenW(langname); */
2027 return langnamelen;
2030 static int is_punctuation(unsigned char c)
2032 /* punctuation characters are :
2033 39, 45, 127-129, 141-144, 150-151, 157-158, 173 */
2034 if (c>=141)
2036 if (c<=151)
2037 return (c<=144) || (c>=150);
2038 if (c<=158)
2039 return (c>=157);
2040 return (c==173);
2042 if (c>=127)
2043 return (c<=129);
2044 return (c==39) || (c==45);
2047 static int identity(int c)
2049 return c;
2052 static const unsigned char LCM_Unicode_LUT[] = {
2053 7 , 2, /* - 32 */
2054 7 , 28, /* ! - 33 */
2055 7 , 29, /* " - 34 */ /* " */
2056 7 , 31, /* # - 35 */
2057 7 , 33, /* $ - 36 */
2058 7 , 35, /* % - 37 */
2059 7 , 37, /* & - 38 */
2060 6 , 128, /* ' - 39 */
2061 7 , 39, /* ( - 40 */
2062 7 , 42, /* ) - 41 */
2063 7 , 45, /* * - 42 */
2064 8 , 3, /* + - 43 */
2065 7 , 47, /* , - 44 */
2066 6 , 130, /* - - 45 */
2067 7 , 51, /* . - 46 */
2068 7 , 53, /* / - 47 */
2069 12 , 3, /* 0 - 48 */
2070 12 , 33, /* 1 - 49 */
2071 12 , 51, /* 2 - 50 */
2072 12 , 70, /* 3 - 51 */
2073 12 , 88, /* 4 - 52 */
2074 12 , 106, /* 5 - 53 */
2075 12 , 125, /* 6 - 54 */
2076 12 , 144, /* 7 - 55 */
2077 12 , 162, /* 8 - 56 */
2078 12 , 180, /* 9 - 57 */
2079 7 , 55, /* : - 58 */
2080 7 , 58, /* ; - 59 */
2081 8 , 14, /* < - 60 */
2082 8 , 18, /* = - 61 */
2083 8 , 20, /* > - 62 */
2084 7 , 60, /* ? - 63 */
2085 7 , 62, /* @ - 64 */
2086 14 , 2, /* A - 65 */
2087 14 , 9, /* B - 66 */
2088 14 , 10, /* C - 67 */
2089 14 , 26, /* D - 68 */
2090 14 , 33, /* E - 69 */
2091 14 , 35, /* F - 70 */
2092 14 , 37, /* G - 71 */
2093 14 , 44, /* H - 72 */
2094 14 , 50, /* I - 73 */
2095 14 , 53, /* J - 74 */
2096 14 , 54, /* K - 75 */
2097 14 , 72, /* L - 76 */
2098 14 , 81, /* M - 77 */
2099 14 , 112, /* N - 78 */
2100 14 , 124, /* O - 79 */
2101 14 , 126, /* P - 80 */
2102 14 , 137, /* Q - 81 */
2103 14 , 138, /* R - 82 */
2104 14 , 145, /* S - 83 */
2105 14 , 153, /* T - 84 */
2106 14 , 159, /* U - 85 */
2107 14 , 162, /* V - 86 */
2108 14 , 164, /* W - 87 */
2109 14 , 166, /* X - 88 */
2110 14 , 167, /* Y - 89 */
2111 14 , 169, /* Z - 90 */
2112 7 , 63, /* [ - 91 */
2113 7 , 65, /* \ - 92 */
2114 7 , 66, /* ] - 93 */
2115 7 , 67, /* ^ - 94 */
2116 7 , 68, /* _ - 95 */
2117 7 , 72, /* ` - 96 */
2118 14 , 2, /* a - 97 */
2119 14 , 9, /* b - 98 */
2120 14 , 10, /* c - 99 */
2121 14 , 26, /* d - 100 */
2122 14 , 33, /* e - 101 */
2123 14 , 35, /* f - 102 */
2124 14 , 37, /* g - 103 */
2125 14 , 44, /* h - 104 */
2126 14 , 50, /* i - 105 */
2127 14 , 53, /* j - 106 */
2128 14 , 54, /* k - 107 */
2129 14 , 72, /* l - 108 */
2130 14 , 81, /* m - 109 */
2131 14 , 112, /* n - 110 */
2132 14 , 124, /* o - 111 */
2133 14 , 126, /* p - 112 */
2134 14 , 137, /* q - 113 */
2135 14 , 138, /* r - 114 */
2136 14 , 145, /* s - 115 */
2137 14 , 153, /* t - 116 */
2138 14 , 159, /* u - 117 */
2139 14 , 162, /* v - 118 */
2140 14 , 164, /* w - 119 */
2141 14 , 166, /* x - 120 */
2142 14 , 167, /* y - 121 */
2143 14 , 169, /* z - 122 */
2144 7 , 74, /* { - 123 */
2145 7 , 76, /* | - 124 */
2146 7 , 78, /* } - 125 */
2147 7 , 80, /* ~ - 126 */
2148 6 , 29, /* \x7f - 127 */
2149 6 , 30, /* € - 128 */
2150 6 , 31, /* � - 129 */
2151 7 , 123, /* ‚ - 130 */
2152 14 , 35, /* ƒ - 131 */
2153 7 , 127, /* „ - 132 */
2154 10 , 21, /* … - 133 */
2155 10 , 15, /* † - 134 */
2156 10 , 16, /* ‡ - 135 */
2157 7 , 67, /* ˆ - 136 */
2158 10 , 22, /* ‰ - 137 */
2159 14 , 145, /* Š - 138 */
2160 7 , 136, /* ‹ - 139 */
2161 14 + 16 , 124, /* Π- 140 */
2162 6 , 43, /* � - 141 */
2163 6 , 44, /* Ž - 142 */
2164 6 , 45, /* � - 143 */
2165 6 , 46, /* � - 144 */
2166 7 , 121, /* ‘ - 145 */
2167 7 , 122, /* ’ - 146 */
2168 7 , 125, /* “ - 147 */
2169 7 , 126, /* ” - 148 */
2170 10 , 17, /* • - 149 */
2171 6 , 137, /* – - 150 */
2172 6 , 139, /* — - 151 */
2173 7 , 93, /* ˜ - 152 */
2174 14 , 156, /* ™ - 153 */
2175 14 , 145, /* š - 154 */
2176 7 , 137, /* › - 155 */
2177 14 + 16 , 124, /* œ - 156 */
2178 6 , 59, /* � - 157 */
2179 6 , 60, /* ž - 158 */
2180 14 , 167, /* Ÿ - 159 */
2181 7 , 4, /*   - 160 */
2182 7 , 81, /* ¡ - 161 */
2183 10 , 2, /* ¢ - 162 */
2184 10 , 3, /* £ - 163 */
2185 10 , 4, /* ¤ - 164 */
2186 10 , 5, /* ¥ - 165 */
2187 7 , 82, /* ¦ - 166 */
2188 10 , 6, /* § - 167 */
2189 7 , 83, /* ¨ - 168 */
2190 10 , 7, /* © - 169 */
2191 14 , 2, /* ª - 170 */
2192 8 , 24, /* « - 171 */
2193 10 , 8, /* ¬ - 172 */
2194 6 , 131, /* ­ - 173 */
2195 10 , 9, /* ® - 174 */
2196 7 , 84, /* ¯ - 175 */
2197 10 , 10, /* ° - 176 */
2198 8 , 23, /* ± - 177 */
2199 12 , 51, /* ² - 178 */
2200 12 , 70, /* ³ - 179 */
2201 7 , 85, /* ´ - 180 */
2202 10 , 11, /* µ - 181 */
2203 10 , 12, /* ¶ - 182 */
2204 10 , 13, /* · - 183 */
2205 7 , 86, /* ¸ - 184 */
2206 12 , 33, /* ¹ - 185 */
2207 14 , 124, /* º - 186 */
2208 8 , 26, /* » - 187 */
2209 12 , 21, /* ¼ - 188 */
2210 12 , 25, /* ½ - 189 */
2211 12 , 29, /* ¾ - 190 */
2212 7 , 87, /* ¿ - 191 */
2213 14 , 2, /* À - 192 */
2214 14 , 2, /* Á - 193 */
2215 14 , 2, /* Â - 194 */
2216 14 , 2, /* Ã - 195 */
2217 14 , 2, /* Ä - 196 */
2218 14 , 2, /* Å - 197 */
2219 14 + 16 , 2, /* Æ - 198 */
2220 14 , 10, /* Ç - 199 */
2221 14 , 33, /* È - 200 */
2222 14 , 33, /* É - 201 */
2223 14 , 33, /* Ê - 202 */
2224 14 , 33, /* Ë - 203 */
2225 14 , 50, /* Ì - 204 */
2226 14 , 50, /* Í - 205 */
2227 14 , 50, /* Î - 206 */
2228 14 , 50, /* Ï - 207 */
2229 14 , 26, /* Ð - 208 */
2230 14 , 112, /* Ñ - 209 */
2231 14 , 124, /* Ò - 210 */
2232 14 , 124, /* Ó - 211 */
2233 14 , 124, /* Ô - 212 */
2234 14 , 124, /* Õ - 213 */
2235 14 , 124, /* Ö - 214 */
2236 8 , 28, /* × - 215 */
2237 14 , 124, /* Ø - 216 */
2238 14 , 159, /* Ù - 217 */
2239 14 , 159, /* Ú - 218 */
2240 14 , 159, /* Û - 219 */
2241 14 , 159, /* Ü - 220 */
2242 14 , 167, /* Ý - 221 */
2243 14 + 32 , 153, /* Þ - 222 */
2244 14 + 48 , 145, /* ß - 223 */
2245 14 , 2, /* à - 224 */
2246 14 , 2, /* á - 225 */
2247 14 , 2, /* â - 226 */
2248 14 , 2, /* ã - 227 */
2249 14 , 2, /* ä - 228 */
2250 14 , 2, /* å - 229 */
2251 14 + 16 , 2, /* æ - 230 */
2252 14 , 10, /* ç - 231 */
2253 14 , 33, /* è - 232 */
2254 14 , 33, /* é - 233 */
2255 14 , 33, /* ê - 234 */
2256 14 , 33, /* ë - 235 */
2257 14 , 50, /* ì - 236 */
2258 14 , 50, /* í - 237 */
2259 14 , 50, /* î - 238 */
2260 14 , 50, /* ï - 239 */
2261 14 , 26, /* ð - 240 */
2262 14 , 112, /* ñ - 241 */
2263 14 , 124, /* ò - 242 */
2264 14 , 124, /* ó - 243 */
2265 14 , 124, /* ô - 244 */
2266 14 , 124, /* õ - 245 */
2267 14 , 124, /* ö - 246 */
2268 8 , 29, /* ÷ - 247 */
2269 14 , 124, /* ø - 248 */
2270 14 , 159, /* ù - 249 */
2271 14 , 159, /* ú - 250 */
2272 14 , 159, /* û - 251 */
2273 14 , 159, /* ü - 252 */
2274 14 , 167, /* ý - 253 */
2275 14 + 32 , 153, /* þ - 254 */
2276 14 , 167 /* ÿ - 255 */ };
2278 static const unsigned char LCM_Unicode_LUT_2[] = { 33, 44, 145 };
2280 #define LCM_Diacritic_Start 131
2282 static const unsigned char LCM_Diacritic_LUT[] = {
2283 123, /* ƒ - 131 */
2284 2, /* „ - 132 */
2285 2, /* … - 133 */
2286 2, /* † - 134 */
2287 2, /* ‡ - 135 */
2288 3, /* ˆ - 136 */
2289 2, /* ‰ - 137 */
2290 20, /* Š - 138 */
2291 2, /* ‹ - 139 */
2292 2, /* Π- 140 */
2293 2, /* � - 141 */
2294 2, /* Ž - 142 */
2295 2, /* � - 143 */
2296 2, /* � - 144 */
2297 2, /* ‘ - 145 */
2298 2, /* ’ - 146 */
2299 2, /* “ - 147 */
2300 2, /* ” - 148 */
2301 2, /* • - 149 */
2302 2, /* – - 150 */
2303 2, /* — - 151 */
2304 2, /* ˜ - 152 */
2305 2, /* ™ - 153 */
2306 20, /* š - 154 */
2307 2, /* › - 155 */
2308 2, /* œ - 156 */
2309 2, /* � - 157 */
2310 2, /* ž - 158 */
2311 19, /* Ÿ - 159 */
2312 2, /*   - 160 */
2313 2, /* ¡ - 161 */
2314 2, /* ¢ - 162 */
2315 2, /* £ - 163 */
2316 2, /* ¤ - 164 */
2317 2, /* ¥ - 165 */
2318 2, /* ¦ - 166 */
2319 2, /* § - 167 */
2320 2, /* ¨ - 168 */
2321 2, /* © - 169 */
2322 3, /* ª - 170 */
2323 2, /* « - 171 */
2324 2, /* ¬ - 172 */
2325 2, /* ­ - 173 */
2326 2, /* ® - 174 */
2327 2, /* ¯ - 175 */
2328 2, /* ° - 176 */
2329 2, /* ± - 177 */
2330 2, /* ² - 178 */
2331 2, /* ³ - 179 */
2332 2, /* ´ - 180 */
2333 2, /* µ - 181 */
2334 2, /* ¶ - 182 */
2335 2, /* · - 183 */
2336 2, /* ¸ - 184 */
2337 2, /* ¹ - 185 */
2338 3, /* º - 186 */
2339 2, /* » - 187 */
2340 2, /* ¼ - 188 */
2341 2, /* ½ - 189 */
2342 2, /* ¾ - 190 */
2343 2, /* ¿ - 191 */
2344 15, /* À - 192 */
2345 14, /* Á - 193 */
2346 18, /* Â - 194 */
2347 25, /* Ã - 195 */
2348 19, /* Ä - 196 */
2349 26, /* Å - 197 */
2350 2, /* Æ - 198 */
2351 28, /* Ç - 199 */
2352 15, /* È - 200 */
2353 14, /* É - 201 */
2354 18, /* Ê - 202 */
2355 19, /* Ë - 203 */
2356 15, /* Ì - 204 */
2357 14, /* Í - 205 */
2358 18, /* Î - 206 */
2359 19, /* Ï - 207 */
2360 104, /* Ð - 208 */
2361 25, /* Ñ - 209 */
2362 15, /* Ò - 210 */
2363 14, /* Ó - 211 */
2364 18, /* Ô - 212 */
2365 25, /* Õ - 213 */
2366 19, /* Ö - 214 */
2367 2, /* × - 215 */
2368 33, /* Ø - 216 */
2369 15, /* Ù - 217 */
2370 14, /* Ú - 218 */
2371 18, /* Û - 219 */
2372 19, /* Ü - 220 */
2373 14, /* Ý - 221 */
2374 2, /* Þ - 222 */
2375 2, /* ß - 223 */
2376 15, /* à - 224 */
2377 14, /* á - 225 */
2378 18, /* â - 226 */
2379 25, /* ã - 227 */
2380 19, /* ä - 228 */
2381 26, /* å - 229 */
2382 2, /* æ - 230 */
2383 28, /* ç - 231 */
2384 15, /* è - 232 */
2385 14, /* é - 233 */
2386 18, /* ê - 234 */
2387 19, /* ë - 235 */
2388 15, /* ì - 236 */
2389 14, /* í - 237 */
2390 18, /* î - 238 */
2391 19, /* ï - 239 */
2392 104, /* ð - 240 */
2393 25, /* ñ - 241 */
2394 15, /* ò - 242 */
2395 14, /* ó - 243 */
2396 18, /* ô - 244 */
2397 25, /* õ - 245 */
2398 19, /* ö - 246 */
2399 2, /* ÷ - 247 */
2400 33, /* ø - 248 */
2401 15, /* ù - 249 */
2402 14, /* ú - 250 */
2403 18, /* û - 251 */
2404 19, /* ü - 252 */
2405 14, /* ý - 253 */
2406 2, /* þ - 254 */
2407 19, /* ÿ - 255 */
2410 /*************************************************************************
2411 * Convert a string, or generate a sort key from it.
2413 * If (mapflags & LCMAP_SORTKEY), the function will generate
2414 * a sort key for the source string. Else, it will convert it
2415 * accordingly to the flags LCMAP_UPPERCASE, LCMAP_LOWERCASE,...
2417 * RETURNS
2418 * Error : (destination buffer too small) 0.
2419 * Success : length of the result string.
2421 * REMARKS
2422 * If called with scrlen = -1, the function will compute the length
2423 * of the 0-terminated string strsrc by itself.
2425 INT32 WINAPI LCMapString32A(
2426 LCID lcid /* locale identifier created with MAKELCID;
2427 LOCALE_SYSTEM_DEFAULT and LOCALE_USER_DEFAULT are predefined
2428 values. */,
2429 DWORD mapflags /* flags */,
2430 LPCSTR srcstr /* source buffer */,
2431 INT32 srclen /* source length */,
2432 LPSTR dststr /* destination buffer */,
2433 INT32 dstlen /* destination buffer length */)
2435 int i;
2437 TRACE(string,"(0x%04lx,0x%08lx,%s,%d,%p,%d)\n",
2438 lcid,mapflags,srcstr,srclen,dststr,dstlen);
2440 if ((dststr==NULL) || (srcstr==NULL))
2441 return 0;
2442 if (srclen==-1)
2443 srclen = lstrlen32A(srcstr);
2445 if (mapflags & ~ ( LCMAP_UPPERCASE | LCMAP_LOWERCASE | LCMAP_SORTKEY |
2446 SORT_STRINGSORT) )
2448 FIXME(string,"(0x%04lx,0x%08lx,%p,%d,%p,%d): "
2449 "unimplemented flags: 0x%08lx\n",
2450 lcid,mapflags,srcstr,srclen,dststr,dstlen,mapflags);
2453 if ( !(mapflags & LCMAP_SORTKEY) )
2455 int (*f)(int)=identity;
2457 if (dstlen==0)
2458 return srclen; /* dstlen=0 means "do nothing but return required length" */
2459 if (dstlen<srclen)
2460 return 0; /* it's an error */
2461 if (mapflags & LCMAP_UPPERCASE)
2462 f = toupper;
2463 else if (mapflags & LCMAP_LOWERCASE)
2464 f = tolower;
2465 for (i=0; i < srclen; i++)
2466 dststr[i] = (CHAR) f(srcstr[i]);
2467 return srclen;
2470 /* else ... (mapflags & LCMAP_SORTKEY) */
2472 int unicode_len=0;
2473 int case_len=0;
2474 int diacritic_len=0;
2475 char *case_component;
2476 char *diacritic_component;
2477 int room,count;
2478 int flag_stringsort = mapflags & SORT_STRINGSORT;
2480 /* compute how much room we will need */
2481 for (i=0;i<srclen;i++)
2483 int ofs;
2484 if ((srcstr[i]!='\0') && (flag_stringsort || !is_punctuation(srcstr[i])))
2486 unicode_len++;
2487 if(((unsigned char)srcstr[i])<=31)
2489 FIXME(string," control characters in argument string\n");
2490 return 0;
2492 if ( LCM_Unicode_LUT[2*((unsigned char)srcstr[i]-32)] & ~15 )
2493 unicode_len++; /* double letter */
2496 if (isupper(srcstr[i]))
2497 case_len=unicode_len;
2499 ofs = (unsigned char)srcstr[i] - LCM_Diacritic_Start;
2500 if ((ofs>=0) && (LCM_Diacritic_LUT[ofs]!=2))
2501 diacritic_len=unicode_len;
2504 room = 2 * unicode_len /* "unicode" component */
2505 + diacritic_len /* "diacritic" component */
2506 + case_len /* "case" component */
2507 + 4 /* four '\1' separators */
2508 + 1 ; /* terminal '\0' */
2509 if (dstlen==0)
2510 return room;
2511 else if (dstlen<room)
2512 return 0;
2514 /* locate each component, write separators */
2515 diacritic_component = dststr + 2*unicode_len ;
2516 *diacritic_component++ = '\1';
2518 case_component = diacritic_component + diacritic_len ;
2519 *case_component++ = '\1';
2521 /* read source string char by char, write
2522 corresponding weight in each component. */
2523 for (i=0,count=0;count<unicode_len;i++)
2525 unsigned char c=srcstr[i];
2526 if ( (c!='\0') && (flag_stringsort || !is_punctuation(c)) )
2528 int type,longcode;
2529 int LUT_offset = 2*(c-32);
2530 type = LCM_Unicode_LUT[LUT_offset];
2531 longcode = type >> 4;
2532 type &= 15;
2533 dststr[2*count] = type;
2534 dststr[2*count+1] = LCM_Unicode_LUT[LUT_offset+1];
2535 if (longcode)
2537 if (count<case_len)
2538 case_component[count] = ( isupper(srcstr[i]) ? 18 : 2 ) ;
2539 if (count<diacritic_len)
2540 diacritic_component[count] = 2; /* assumption: a double letter
2541 is never accented */
2542 count++;
2544 dststr[2*count] = type;
2545 dststr[2*count+1] = *(LCM_Unicode_LUT_2 - 1 + longcode);
2546 /* 16 in the first column of LCM_Unicode_LUT --> longcode = 1
2547 32 in the first column of LCM_Unicode_LUT --> longcode = 2
2548 48 in the first column of LCM_Unicode_LUT --> longcode = 3 */
2551 if (count<case_len)
2552 case_component[count] = ( isupper(srcstr[i]) ? 18 : 2 ) ;
2553 if (count<diacritic_len)
2555 int ofs = (unsigned char)srcstr[i] - LCM_Diacritic_Start;
2556 diacritic_component[count] = (ofs>=0 ? LCM_Diacritic_LUT[ofs] : 2);
2558 count++;
2561 dststr[room-3] = dststr[room-2] = '\1';
2562 dststr[room-1] = '\0';
2563 return room;
2567 INT32 WINAPI LCMapString32W(
2568 LCID lcid,DWORD mapflags,LPCWSTR srcstr,INT32 srclen,LPWSTR dststr,
2569 INT32 dstlen)
2571 int i;
2573 TRACE(string,"(0x%04lx,0x%08lx,%p,%d,%p,%d)\n",
2574 lcid,mapflags,srcstr,srclen,dststr,dstlen);
2576 if ((dststr==NULL) || (srcstr==NULL))
2577 return 0;
2578 if (srclen==-1)
2579 srclen = lstrlen32W(srcstr);
2580 if (mapflags & LCMAP_SORTKEY)
2582 FIXME(string,"(0x%04lx,0x%08lx,%p,%d,%p,%d): "
2583 "unimplemented flags: 0x%08lx\n",
2584 lcid,mapflags,srcstr,srclen,dststr,dstlen,mapflags);
2585 return 0;
2587 else
2589 int (*f)(int)=identity;
2591 if (dstlen==0)
2592 return srclen;
2593 if (dstlen<srclen)
2594 return 0;
2595 if (mapflags & LCMAP_UPPERCASE)
2596 f = toupper;
2597 else if (mapflags & LCMAP_LOWERCASE)
2598 f = tolower;
2599 for (i=0; i < srclen; i++)
2600 dststr[i] = (WCHAR) f(srcstr[i]);
2601 return srclen;
2606 /*****************************************************************
2608 * OLE_GetFormatA() [internal]
2611 This function implements stuff for GetDateFormat() and
2612 GetTimeFormat().
2614 d single-digit (no leading zero) day (of month)
2615 dd two-digit day (of month)
2616 ddd short day-of-week name
2617 dddd long day-of-week name
2618 M single-digit month
2619 MM two-digit month
2620 MMM short month name
2621 MMMM full month name
2622 y two-digit year, no leading 0
2623 yy two-digit year
2624 yyyy four-digit year
2625 gg era string
2626 h hours with no leading zero (12-hour)
2627 hh hours with full two digits
2628 H hours with no leading zero (24-hour)
2629 HH hours with full two digits
2630 m minutes with no leading zero
2631 mm minutes with full two digits
2632 s seconds with no leading zero
2633 ss seconds with full two digits
2634 t time marker (A or P)
2635 tt time marker (AM, PM)
2636 '' used to quote literal characters
2637 '' (within a quoted string) indicates a literal '
2639 These functions REQUIRE valid locale, date, and format.
2643 INT32 WINAPI OLE_GetFormatA(LCID locale,
2644 DWORD flags,
2645 LPSYSTEMTIME xtime,
2646 LPCSTR format,
2647 LPSTR date, INT32 datelen)
2649 INT32 inpos, outpos;
2650 int count, type, inquote, Overflow;
2651 char buf[40];
2652 int buflen;
2654 const char * _dgfmt[] = { "%d", "%02d" };
2655 const char ** dgfmt = _dgfmt - 1;
2657 /* report, for debugging */
2658 TRACE(ole, "func(%8lx,%8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags,
2659 xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
2660 format, format, date, date, datelen);
2662 /* initalize state variables and output buffer */
2663 inpos = outpos = 0;
2664 count = 0; inquote = 0; Overflow = 0;
2665 type = '\0';
2666 date[0] = buf[0] = '\0';
2668 for (inpos = 0;; inpos++) {
2669 /* TRACE(ole, "STATE inpos=%2d outpos=%2d count=%d inquote=%d type=%c buf,date = %c,%c\n", inpos, outpos, count, inquote, type, buf[inpos], date[outpos]); */
2670 if (inquote) {
2671 if (format[inpos] == '\'') {
2672 if (format[inpos+1] == '\'') {
2673 inpos += 1;
2674 date[outpos++] = '\'';
2675 } else {
2676 inquote = 0;
2677 continue; /* we did nothing to the output */
2679 } else if (format[inpos] == '\0') {
2680 date[outpos++] = '\0';
2681 if (outpos > datelen) Overflow = 1;
2682 break;
2683 } else {
2684 date[outpos++] = format[inpos];
2685 if (outpos > datelen) {
2686 Overflow = 1;
2687 date[outpos-1] = '\0'; /* this is the last place where
2688 it's safe to write */
2689 break;
2692 } else if ( (count && (format[inpos] != type))
2693 || count == 4
2694 || (count == 2 && strchr("ghHmst", type)) )
2696 if (type == 'd') {
2697 if (count == 4) {
2698 GetLocaleInfo32A(locale,
2699 LOCALE_SDAYNAME1
2700 + xtime->wDayOfWeek - 1,
2701 buf, sizeof(buf));
2702 } else if (count == 3) {
2703 GetLocaleInfo32A(locale,
2704 LOCALE_SABBREVDAYNAME1
2705 + xtime->wDayOfWeek - 1,
2706 buf, sizeof(buf));
2707 } else {
2708 sprintf(buf, dgfmt[count], xtime->wDay);
2710 } else if (type == 'M') {
2711 if (count == 3) {
2712 GetLocaleInfo32A(locale,
2713 LOCALE_SABBREVMONTHNAME1
2714 + xtime->wMonth - 1,
2715 buf, sizeof(buf));
2716 } else if (count == 4) {
2717 GetLocaleInfo32A(locale,
2718 LOCALE_SMONTHNAME1
2719 + xtime->wMonth - 1,
2720 buf, sizeof(buf));
2721 } else {
2722 sprintf(buf, dgfmt[count], xtime->wMonth);
2724 } else if (type == 'y') {
2725 if (count == 4) {
2726 sprintf(buf, "%d", xtime->wYear);
2727 } else if (count == 3) {
2728 strcpy(buf, "yyy");
2729 WARN(ole,
2730 "unknown format,\
2731 c=%c, n=%d\n", type, count);
2732 } else {
2733 sprintf(buf, dgfmt[count], xtime->wYear % 100);
2735 } else if (type == 'g') {
2736 if (count == 2) {
2737 FIXME(ole, "LOCALE_ICALENDARTYPE unimp.\n");
2738 strcpy(buf, "AD");
2739 } else {
2740 strcpy(buf, "g");
2741 WARN(ole,
2742 "unknown format, \
2743 c=%c, n=%d\n", type, count);
2745 } else if (type == 'h') {
2746 /* gives us hours 1:00 -- 12:00 */
2747 sprintf(buf, dgfmt[count], (xtime->wHour-1)%12 +1);
2748 } else if (type == 'H') {
2749 /* 24-hour time */
2750 sprintf(buf, dgfmt[count], xtime->wHour);
2751 } else if (type == 'm') {
2752 sprintf(buf, dgfmt[count], xtime->wMinute);
2753 } else if (type == 's') {
2754 sprintf(buf, dgfmt[count], xtime->wSecond);
2755 } else if (type == 't') {
2756 if (count == 1) {
2757 sprintf(buf, "%c", (xtime->wHour < 12) ? 'A' : 'P');
2758 } else if (count == 2) {
2759 /* sprintf(buf, "%s", (xtime->wHour < 12) ? "AM" : "PM"); */
2760 GetLocaleInfo32A(locale,
2761 (xtime->wHour<12)
2762 ? LOCALE_S1159 : LOCALE_S2359,
2763 buf, sizeof(buf));
2767 /* we need to check the next char in the format string
2768 again, no matter what happened */
2769 inpos--;
2771 /* add the contents of buf to the output */
2772 buflen = strlen(buf);
2773 if (outpos + buflen < datelen) {
2774 date[outpos] = '\0'; /* for strcat to hook onto */
2775 strcat(date, buf);
2776 outpos += buflen;
2777 } else {
2778 date[outpos] = '\0';
2779 strncat(date, buf, datelen - outpos);
2780 date[datelen - 1] = '\0';
2781 SetLastError(ERROR_INSUFFICIENT_BUFFER);
2782 WARN(ole, "insufficient buffer\n");
2783 return 0;
2786 /* reset the variables we used to keep track of this item */
2787 count = 0;
2788 type = '\0';
2789 } else if (format[inpos] == '\0') {
2790 /* we can't check for this at the loop-head, because
2791 that breaks the printing of the last format-item */
2792 date[outpos] = '\0';
2793 break;
2794 } else if (count) {
2795 /* continuing a code for an item */
2796 count +=1;
2797 continue;
2798 } else if (strchr("hHmstyMdg", format[inpos])) {
2799 type = format[inpos];
2800 count = 1;
2801 continue;
2802 } else if (format[inpos] == '\'') {
2803 inquote = 1;
2804 continue;
2805 } else {
2806 date[outpos++] = format[inpos];
2808 /* now deal with a possible buffer overflow */
2809 if (outpos >= datelen) {
2810 date[datelen - 1] = '\0';
2811 SetLastError(ERROR_INSUFFICIENT_BUFFER);
2812 return 0;
2816 if (Overflow) {
2817 SetLastError(ERROR_INSUFFICIENT_BUFFER);
2820 /* finish it off with a string terminator */
2821 outpos++;
2822 /* sanity check */
2823 if (outpos > datelen-1) outpos = datelen-1;
2824 date[outpos] = '\0';
2826 TRACE(ole, "OLE_GetFormatA returns string '%s', len %d\n",
2827 date, outpos);
2828 return outpos;
2831 /**************************************************************
2832 * OLE_GetFormatW [internal]
2834 INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags,
2835 LPSYSTEMTIME xtime,
2836 LPCWSTR format,
2837 LPWSTR output, INT32 outlen)
2839 INT32 inpos, outpos;
2840 int count, type=0, inquote;
2841 int Overflow; /* loop check */
2842 int usedate, usetime;
2843 WCHAR buf[40];
2844 int buflen=0;
2845 char abuf[40];
2846 WCHAR arg0[] = {0}, arg1[] = {'%','d',0};
2847 WCHAR arg2[] = {'%','0','2','d',0};
2848 WCHAR *argarr[] = {arg0, arg1, arg2};
2849 int datevars=0, timevars=0;
2851 /* make a debug report */
2852 lstrcpynWtoA(abuf, format, sizeof(format));
2853 TRACE(ole, "args: %8lx, %8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
2854 locale, flags,
2855 xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
2856 abuf, format, output, outlen);
2859 /* initialize state variables */
2860 inpos = outpos = 0;
2861 count = 0;
2862 inquote = Overflow = 0;
2863 /* this is really just a sanity check */
2864 output[0] = buf[0] = 0;
2865 abuf[0] = '\0';
2866 /* for compatibility with official Windows behavior */
2867 usedate = flags & DATE_DATEVARSONLY;
2868 usetime = flags & TIME_TIMEVARSONLY;
2870 /* this loop is the core of the function */
2871 for (inpos = 0; /* we have several break points */ ; inpos++) {
2872 if (inquote) {
2873 if (format[inpos] == (WCHAR) '\'') {
2874 if (format[inpos+1] == '\'') {
2875 inpos++;
2876 output[outpos++] = '\'';
2877 } else {
2878 inquote = 0;
2879 continue;
2881 } else if (format[inpos] == 0) {
2882 output[outpos++] = 0;
2883 if (outpos > outlen) Overflow = 1;
2884 break; /* normal exit (within a quote) */
2885 } else {
2886 output[outpos++] = format[inpos]; /* copy input */
2887 if (outpos > outlen) {
2888 Overflow = 1;
2889 output[outpos-1] = 0;
2890 break;
2893 } else if ( (count && (format[inpos] != type))
2894 || ( (count==4 && type =='y') ||
2895 (count==4 && type =='M') ||
2896 (count==4 && type =='d') ||
2897 (count==2 && type =='g') ||
2898 (count==2 && type =='h') ||
2899 (count==2 && type =='H') ||
2900 (count==2 && type =='m') ||
2901 (count==2 && type =='s') ||
2902 (count==2 && type =='t') ) ) {
2903 if (type == 'd') {
2904 if (count == 3) {
2905 GetLocaleInfo32W(locale,
2906 LOCALE_SDAYNAME1 + xtime->wDayOfWeek -1,
2907 buf, sizeof(buf)/sizeof(WCHAR) );
2908 } else if (count == 3) {
2909 GetLocaleInfo32W(locale,
2910 LOCALE_SABBREVDAYNAME1 +
2911 xtime->wDayOfWeek -1,
2912 buf, sizeof(buf)/sizeof(WCHAR) );
2913 } else {
2914 wsnprintf32W(buf, 5, argarr[count], xtime->wDay );
2916 } else if (type == 'M') {
2917 if (count == 4) {
2918 GetLocaleInfo32W(locale, LOCALE_SMONTHNAME1 +
2919 xtime->wMonth -1, buf,
2920 sizeof(buf)/sizeof(WCHAR) );
2921 } else if (count == 3) {
2922 GetLocaleInfo32W(locale, LOCALE_SABBREVMONTHNAME1 +
2923 xtime->wMonth -1, buf,
2924 sizeof(buf)/sizeof(WCHAR) );
2925 } else {
2926 wsnprintf32W(buf, 5, argarr[count], xtime->wMonth);
2928 } else if (type == 'y') {
2929 if (count == 4) {
2930 wsnprintf32W(buf, 6, argarr[1] /* "%d" */,
2931 xtime->wYear);
2932 } else if (count == 3) {
2933 lstrcpynAtoW(buf, "yyy", 5);
2934 } else {
2935 wsnprintf32W(buf, 6, argarr[count],
2936 xtime->wYear % 100);
2938 } else if (type == 'g') {
2939 if (count == 2) {
2940 FIXME(ole, "LOCALE_ICALENDARTYPE unimplemented\n");
2941 lstrcpynAtoW(buf, "AD", 5);
2942 } else {
2943 /* Win API sez we copy it verbatim */
2944 lstrcpynAtoW(buf, "g", 5);
2946 } else if (type == 'h') {
2947 /* hours 1:00-12:00 --- is this right? */
2948 wsnprintf32W(buf, 5, argarr[count],
2949 (xtime->wHour-1)%12 +1);
2950 } else if (type == 'H') {
2951 wsnprintf32W(buf, 5, argarr[count],
2952 xtime->wHour);
2953 } else if (type == 'm') {
2954 wsnprintf32W(buf, 5, argarr[count],
2955 xtime->wMinute);
2956 } else if (type == 's') {
2957 wsnprintf32W(buf, 5, argarr[count],
2958 xtime->wSecond);
2959 } else if (type == 't') {
2960 GetLocaleInfo32W(locale, (xtime->wHour < 12) ?
2961 LOCALE_S1159 : LOCALE_S2359,
2962 buf, sizeof(buf) );
2963 if (count == 1) {
2964 buf[1] = 0;
2968 /* no matter what happened, we need to check this next
2969 character the next time we loop through */
2970 inpos--;
2972 /* cat buf onto the output */
2973 outlen = lstrlen32W(buf);
2974 if (outpos + buflen < outlen) {
2975 output[outpos] = 0; /* a "hook" for strcat */
2976 lstrcat32W(output, buf);
2977 outpos += buflen;
2978 } else {
2979 output[outpos] = 0;
2980 lstrcatn32W(output, buf, outlen - outpos);
2981 output[outlen - 1] = 0;
2982 Overflow = 1;
2983 break; /* Abnormal exit */
2986 /* reset the variables we used this time */
2987 count = 0;
2988 type = '\0';
2989 } else if (format[inpos] == 0) {
2990 /* we can't check for this at the beginning, because that
2991 would keep us from printing a format spec that ended the
2992 string */
2993 output[outpos] = 0;
2994 break; /* NORMAL EXIT */
2995 } else if (count) {
2996 /* how we keep track of the middle of a format spec */
2997 count++;
2998 continue;
2999 } else if ( (datevars && (format[inpos]=='d' ||
3000 format[inpos]=='M' ||
3001 format[inpos]=='y' ||
3002 format[inpos]=='g') ) ||
3003 (timevars && (format[inpos]=='H' ||
3004 format[inpos]=='h' ||
3005 format[inpos]=='m' ||
3006 format[inpos]=='s' ||
3007 format[inpos]=='t') ) ) {
3008 type = format[inpos];
3009 count = 1;
3010 continue;
3011 } else if (format[inpos] == '\'') {
3012 inquote = 1;
3013 continue;
3014 } else {
3015 /* unquoted literals */
3016 output[outpos++] = format[inpos];
3020 if (Overflow) {
3021 SetLastError(ERROR_INSUFFICIENT_BUFFER);
3022 WARN(ole, " buffer overflow\n");
3025 /* final string terminator and sanity check */
3026 outpos++;
3027 if (outpos > outlen-1) outpos = outlen-1;
3028 output[outpos] = '0';
3030 lstrcpynWtoA(abuf, output, sizeof(abuf) );
3031 TRACE(ole, " returning string \'%s\'\n", abuf);
3033 return (!Overflow) ? outlen : 0;
3038 /*****************************************************************
3039 * GetDateFormat32A() [KERNEL32.310] Makes an ASCII string of the date
3041 * This function uses format to format the date, or, if format
3042 * is NULL, uses the default for the locale. format is a string
3043 * of literal fields and characters as follows:
3045 * - d single-digit (no leading zero) day (of month)
3046 * - dd two-digit day (of month)
3047 * - ddd short day-of-week name
3048 * - dddd long day-of-week name
3049 * - M single-digit month
3050 * - MM two-digit month
3051 * - MMM short month name
3052 * - MMMM full month name
3053 * - y two-digit year, no leading 0
3054 * - yy two-digit year
3055 * - yyyy four-digit year
3056 * - gg era string
3060 INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,
3061 LPSYSTEMTIME xtime,
3062 LPCSTR format, LPSTR date,INT32 datelen)
3065 char format_buf[40];
3066 LPCSTR thisformat;
3067 SYSTEMTIME t;
3068 LPSYSTEMTIME thistime;
3069 LCID thislocale;
3071 INT32 ret;
3073 TRACE(ole,"(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
3074 locale,flags,xtime,format,date,datelen);
3076 if (!locale) {
3077 locale = LOCALE_SYSTEM_DEFAULT;
3080 if (locale == LOCALE_SYSTEM_DEFAULT) {
3081 thislocale = GetSystemDefaultLCID();
3082 } else if (locale == LOCALE_USER_DEFAULT) {
3083 thislocale = GetUserDefaultLCID();
3084 } else {
3085 thislocale = locale;
3088 if (xtime == NULL) {
3089 GetSystemTime(&t);
3090 thistime = &t;
3091 } else {
3092 thistime = xtime;
3095 if (format == NULL) {
3096 GetLocaleInfo32A(thislocale, ((flags&DATE_LONGDATE)
3097 ? LOCALE_SLONGDATE
3098 : LOCALE_SSHORTDATE),
3099 format_buf, sizeof(format_buf));
3100 thisformat = format_buf;
3101 } else {
3102 thisformat = format;
3106 ret = OLE_GetFormatA(thislocale, flags, thistime, thisformat,
3107 date, datelen);
3110 TRACE(ole,
3111 "GetDateFormat32A() returning %d, with data=%s\n",
3112 ret, date);
3113 return ret;
3116 /* ****************************************************************
3117 * GetDateFormat32W() [KERNEL32.311] Makes a Unicode string of the date
3119 * Acts the same as GetDateFormat32A(), except that it's Unicode.
3120 * Accepts & returns sizes as counts of Unicode characters.
3123 INT32 WINAPI GetDateFormat32W(LCID locale,DWORD flags,
3124 LPSYSTEMTIME xtime,
3125 LPCWSTR format,
3126 LPWSTR date, INT32 datelen)
3128 short datearr[] = {'1','9','9','4','-','1','-','1',0};
3130 FIXME(ole, "STUB (should call OLE_GetFormatW)\n");
3131 lstrcpyn32W(date, datearr, datelen);
3132 return ( datelen < 9) ? datelen : 9;
3138 /**************************************************************************
3139 * GetNumberFormat32A (KERNEL32.355)
3140 * NOTE: type of lpFormat should be CONST NUMBERFORMAT
3142 INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags,
3143 LPCSTR lpvalue, char *lpFormat,
3144 LPSTR lpNumberStr, int cchNumber)
3146 int n;
3148 FIXME(file,"%s: stub, no reformating done\n",lpvalue);
3150 n = strlen(lpvalue);
3151 if (cchNumber) {
3152 strncpy(lpNumberStr,lpvalue,cchNumber);
3153 if (cchNumber <= n) {
3154 lpNumberStr[cchNumber-1] = 0;
3155 n = cchNumber-1;
3158 return n;
3163 /*****************************************************************
3165 * GetTimeFormat32A() [KERNEL32.422] Makes an ASCII string of the time
3167 * Formats date according to format, or locale default if format is
3168 * NULL. The format consists of literal characters and fields as follows:
3170 * h hours with no leading zero (12-hour)
3171 * hh hours with full two digits
3172 * H hours with no leading zero (24-hour)
3173 * HH hours with full two digits
3174 * m minutes with no leading zero
3175 * mm minutes with full two digits
3176 * s seconds with no leading zero
3177 * ss seconds with full two digits
3178 * t time marker (A or P)
3179 * tt time marker (AM, PM)
3183 INT32 WINAPI
3184 GetTimeFormat32A(LCID locale, /* in */
3185 DWORD flags, /* in */
3186 LPSYSTEMTIME xtime, /* in */
3187 LPCSTR format, /* in */
3188 LPSTR timestr, /* out */
3189 INT32 timelen /* in */)
3191 LPCSTR realformat;
3192 char fmt_buf[40];
3194 TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
3195 locale,flags,xtime,format,timestr,timelen);
3197 if (format) {
3198 realformat = format;
3199 } else if (locale) {
3200 GetLocaleInfo32A(locale, LOCALE_STIMEFORMAT,
3201 fmt_buf, sizeof(fmt_buf));
3202 realformat = fmt_buf;
3203 } else {
3204 WARN(ole, "Caller gave no locale and no format\n");
3205 realformat = "hh:mm:ss";
3207 if (!locale) {
3208 locale = GetSystemDefaultLCID();
3210 return OLE_GetFormatA(locale, flags, xtime, realformat, timestr, timelen);
3214 /* ****************************************************************
3215 * GetTimeFormat32W() [KERNEL32.423] Makes a Unicode string of the time
3220 INT32 WINAPI
3221 GetTimeFormat32W(LCID locale,DWORD flags,
3222 LPSYSTEMTIME xtime,
3223 LPCWSTR format,
3224 LPWSTR timestr,INT32 timelen)
3226 char debugbuf[40];
3227 WCHAR buf[20];
3228 LPCWSTR realformat=0;
3229 SYSTEMTIME t;
3230 LPSYSTEMTIME realtime;
3231 WCHAR * fmt_buf = NULL;
3232 int fmt_buf_size = 0; /* units of WCHARs */
3233 INT32 retval;
3235 lstrcpynWtoA(debugbuf, format, (sizeof(buf))/2);
3236 TRACE(ole, "GetTimeFormatW len %d flags 0x%lX format >%s<\n",
3237 timelen, flags, debugbuf);
3239 /* Enforce the Windows behavior */
3240 flags |= ~LOCALE_TIMEDATEBOTH;
3241 flags |= TIME_TIMEVARSONLY;
3243 /* take care of the format or locale not being given */
3244 if (format) {
3245 realformat = format;
3246 } else if (locale) {
3247 /* allocate memory */
3248 retval = ERROR_INSUFFICIENT_BUFFER;
3249 fmt_buf = malloc((fmt_buf_size+=7) * sizeof(WCHAR));
3250 if (!fmt_buf)
3251 goto out_nomem;
3253 while(!GetLocaleInfo32W(locale, LOCALE_STIMEFORMAT,
3254 fmt_buf, fmt_buf_size)) {
3255 retval = ERROR_OUTOFMEMORY;
3256 fmt_buf = realloc(fmt_buf,
3257 (fmt_buf_size += 10) * sizeof(WCHAR));
3258 if (!fmt_buf)
3259 goto out_nomem;
3261 realformat = fmt_buf;
3262 } else {
3263 FIXME(ole, "caller gave no locale, no format; what should we do?\n");
3264 SetLastError(ERROR_BAD_FORMAT);
3266 if (!locale)
3267 locale = GetSystemDefaultLCID();
3269 realtime = xtime;
3270 if (!realtime) {
3271 realtime = &t;
3272 GetSystemTime(realtime);
3275 retval = OLE_GetFormatW(locale, flags, realtime, realformat, timestr, timelen);
3276 if (fmt_buf)
3277 free(fmt_buf);
3278 return retval;
3280 out_nomem:
3281 SetLastError(retval);
3282 WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size);
3283 return 0;