Release 980517
[wine] / ole / ole2nls.c
1 /*
2  *      OLE2NLS library
3  *
4  *      Copyright 1995  Martin von Loewis
5  *      Copyright 1998  David Lee Lambert
6  */
7
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"
19
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},
130 };
131
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,"Ddnisch"},
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"},
182 };
183
184 /***********************************************************************
185  *           GetUserDefaultLCID       (OLE2NLS.1)
186  */
187 LCID WINAPI GetUserDefaultLCID()
188 {
189 /* Default sorting, neutral sublanguage */
190     switch(Options.language)
191     {
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 */
220
221     default:
222         return 0x00;                   /* Neutral language */
223     }
224 }
225
226 /***********************************************************************
227  *         GetSystemDefaultLCID       (OLE2NLS.2)
228  */
229 LCID WINAPI GetSystemDefaultLCID()
230 {
231         return GetUserDefaultLCID();
232 }
233
234 /***********************************************************************
235  *         GetUserDefaultLangID       (OLE2NLS.3)
236  */
237 LANGID WINAPI GetUserDefaultLangID()
238 {
239         return (WORD)GetUserDefaultLCID();
240 }
241
242 /***********************************************************************
243  *         GetSystemDefaultLangID     (OLE2NLS.4)
244  */
245 LANGID WINAPI GetSystemDefaultLangID()
246 {
247         return GetUserDefaultLangID();
248 }
249
250 /***********************************************************************
251  *         GetLocaleInfoA             (OLE2NLS.5)
252  * Is the last parameter really WORD for Win16?
253  */
254 INT16 WINAPI GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
255 {
256         return GetLocaleInfo32A(lcid,LCType,buf,len);
257 }
258
259 INT32 WINAPI GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
260 {
261         char    *retString;
262         int     found,i;
263
264         TRACE(ole,"(%8lX,%8lX,%p,%4X)\n",
265                         lcid,LCType,buf,len);
266
267         LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
268
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;
280                 }
281                 i++;
282         }
283         if (!retString) {
284                 WARN(ole,"Unkown LC type %lX\n",LCType);
285                 return 0;
286         }
287
288 #define LOCVAL(type,value) case type:retString=value;break;
289
290 /* Now, the language specific definitions. They don't have to be
291    complete */
292     found=1;
293     switch(Options.language)
294     {
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)
314 */
315 LOCVAL(LOCALE_SLIST,";")
316 LOCVAL(LOCALE_IMEASURE,"0")
317 LOCVAL(LOCALE_SDECIMAL,",")
318 LOCVAL(LOCALE_STHOUSAND,".")
319 /*
320 LOCVAL(LOCALE_SGROUPING)
321 */
322 LOCVAL(LOCALE_IDIGITS,"2")
323 LOCVAL(LOCALE_ILZERO,"1")
324 /*
325 LOCVAL(LOCALE_INEGNUMBER)
326 Is this "0123456789" ??
327 LOCVAL(LOCALE_SNATIVEDIGITS)
328 */
329 LOCVAL(LOCALE_SCURRENCY,"DM")
330 /*
331 LOCVAL(LOCALE_SINTLSYMBOL)
332 LOCVAL(LOCALE_SMONDECIMALSEP)
333 LOCVAL(LOCALE_SMONTHOUSANDSEP)
334 LOCVAL(LOCALE_SMONGROUPING)
335 */
336 LOCVAL(LOCALE_ICURRDIGITS,"2")
337 /*
338 LOCVAL(LOCALE_IINTLCURRDIGITS)
339 */
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")
346 /*
347 LOCVAL(LOCALE_STIMEFORMAT)
348 */
349 LOCVAL(LOCALE_IDATE,"1")
350 /*
351 LOCVAL(LOCALE_ILDATE)
352 */
353 LOCVAL(LOCALE_ITIME,"1")
354 /*
355 LOCVAL(LOCALE_ITIMEMARKPOSN)
356 LOCVAL(LOCALE_ICENTURY)
357 */
358 LOCVAL(LOCALE_ITLZERO,"1")
359 /*
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)
368 */
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,"")
409 /*
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)
418 */
419         default: found=0;break;
420         }
421     break;  /* LANG(De) */
422
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;
525         }
526     break; /* LANG(Da) */
527
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;
630         }
631     break;  /* LANG(En) */
632
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;
735         }
736     break;  /* LANG(Eo) */
737
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")
752 /* 
753 LOCVAL(LOCALE_IDEFAULTCODEPAGE)
754 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
755 */
756 LOCVAL(LOCALE_SLIST,";")
757 LOCVAL(LOCALE_IMEASURE,"0")
758 LOCVAL(LOCALE_SDECIMAL,",")
759 LOCVAL(LOCALE_STHOUSAND,".")
760 /*
761 LOCVAL(LOCALE_SGROUPING)
762 */
763 LOCVAL(LOCALE_IDIGITS,"2")
764 LOCVAL(LOCALE_ILZERO,"1")
765 /*
766 LOCVAL(LOCALE_INEGNUMBER)
767 Is this "0123456789" ??
768 LOCVAL(LOCALE_SNATIVEDIGITS)
769 */
770 LOCVAL(LOCALE_SCURRENCY,"mk")
771 /*
772 LOCVAL(LOCALE_SINTLSYMBOL)
773 LOCVAL(LOCALE_SMONDECIMALSEP)
774 LOCVAL(LOCALE_SMONTHOUSANDSEP)
775 LOCVAL(LOCALE_SMONGROUPING)
776 */
777 LOCVAL(LOCALE_ICURRDIGITS,"2")
778 /*
779 LOCVAL(LOCALE_IINTLCURRDIGITS)
780 */
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")
787 /*
788 LOCVAL(LOCALE_STIMEFORMAT)
789 */
790 LOCVAL(LOCALE_IDATE,"1")
791 /*
792 LOCVAL(LOCALE_ILDATE)
793 */
794 LOCVAL(LOCALE_ITIME,"1")
795 /*
796 LOCVAL(LOCALE_ITIMEMARKPOSN)
797 LOCVAL(LOCALE_ICENTURY)
798 */
799 LOCVAL(LOCALE_ITLZERO,"1")
800 /*
801 LOCVAL(LOCALE_IDAYLZERO)
802 LOCVAL(LOCALE_IMONLZERO)
803 */
804 LOCVAL(LOCALE_S1159, "AM")
805 LOCVAL(LOCALE_S2359, "PM")
806 /*
807 LOCVAL(LOCALE_ICALENDARTYPE)
808 LOCVAL(LOCALE_IOPTIONALCALENDAR)
809 LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
810 LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
811 */
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, "-")
854 /*
855 LOCVAL(LOCALE_IPOSSIGNPOSN)
856 LOCVAL(LOCALE_INEGSIGNPOSN)
857 LOCVAL(LOCALE_IPOSSYMPRECEDES)
858 LOCVAL(LOCALE_IPOSSEPBYSPACE)
859 LOCVAL(LOCALE_INEGSYMPRECEDES)
860 LOCVAL(LOCALE_INEGSEPBYSPACE)
861 */
862         default: found=0;break;
863         }
864     break;  /* LANG(Fi) */
865
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)
883 */
884 LOCVAL(LOCALE_SLIST,";")
885 LOCVAL(LOCALE_IMEASURE,"0")
886 LOCVAL(LOCALE_SDECIMAL,",")
887 LOCVAL(LOCALE_STHOUSAND,".")
888 /*
889 LOCVAL(LOCALE_SGROUPING)
890 */
891 LOCVAL(LOCALE_IDIGITS,"2")
892 LOCVAL(LOCALE_ILZERO,"1")
893 /*
894 LOCVAL(LOCALE_INEGNUMBER)
895 Is this "0123456789" ??
896 LOCVAL(LOCALE_SNATIVEDIGITS)
897 */
898 LOCVAL(LOCALE_SCURRENCY,"Lit.")
899 /*
900 LOCVAL(LOCALE_SINTLSYMBOL)
901 LOCVAL(LOCALE_SMONDECIMALSEP)
902 LOCVAL(LOCALE_SMONTHOUSANDSEP)
903 LOCVAL(LOCALE_SMONGROUPING)
904 */
905 LOCVAL(LOCALE_ICURRDIGITS,"2")
906 /*
907 LOCVAL(LOCALE_IINTLCURRDIGITS)
908 */
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")
915 /*
916 LOCVAL(LOCALE_STIMEFORMAT)
917 */
918 LOCVAL(LOCALE_IDATE,"1")
919 /*
920 LOCVAL(LOCALE_ILDATE)
921 */
922 LOCVAL(LOCALE_ITIME,"1")
923 /*
924 LOCVAL(LOCALE_ITIMEMARKPOSN)
925 LOCVAL(LOCALE_ICENTURY)
926 */
927 LOCVAL(LOCALE_ITLZERO,"1")
928 /*
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)
937 */
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,"")
978 /*
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)
987 */
988         default: found=0;break;
989         }
990     break;  /* LANG(It) */
991
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;
1094         }
1095     break; /* LANG(0x0809) (U.K. English) */
1096
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;
1200         }
1201     break;  /* LANG(Ko) */
1202
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,",")
1223 /*
1224 LOCVAL(LOCALE_SGROUPING)
1225 */
1226 LOCVAL(LOCALE_IDIGITS,"2")
1227 LOCVAL(LOCALE_ILZERO,"1")
1228 /*
1229 LOCVAL(LOCALE_INEGNUMBER)
1230 Is this "0123456789" ??
1231 LOCVAL(LOCALE_SNATIVEDIGITS)
1232 */
1233 LOCVAL(LOCALE_SCURRENCY,"Ft")
1234 /*
1235 LOCVAL(LOCALE_SINTLSYMBOL)
1236 LOCVAL(LOCALE_SMONDECIMALSEP)
1237 LOCVAL(LOCALE_SMONTHOUSANDSEP)
1238 LOCVAL(LOCALE_SMONGROUPING)
1239 */
1240 LOCVAL(LOCALE_ICURRDIGITS,"0")
1241 /*
1242 LOCVAL(LOCALE_IINTLCURRDIGITS)
1243 */
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")
1250 /*
1251 LOCVAL(LOCALE_STIMEFORMAT)
1252 */
1253 LOCVAL(LOCALE_IDATE,"1")
1254 /*
1255 LOCVAL(LOCALE_ILDATE)
1256 */
1257 LOCVAL(LOCALE_ITIME,"1")
1258 /*
1259 LOCVAL(LOCALE_ITIMEMARKPOSN)
1260 LOCVAL(LOCALE_ICENTURY)
1261 */
1262 LOCVAL(LOCALE_ITLZERO,"1")
1263 /*
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)
1272 */
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,"")
1313 /*
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)
1322 */
1323         default: found=0;break;
1324         }
1325     break;  /* LANG(En) */
1326
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," ")
1347 /*
1348 LOCVAL(LOCALE_SGROUPING)
1349 */
1350 LOCVAL(LOCALE_IDIGITS,"2")
1351 LOCVAL(LOCALE_ILZERO,"1")
1352 /*
1353 LOCVAL(LOCALE_INEGNUMBER)
1354 Is this "0123456789" ??
1355 LOCVAL(LOCALE_SNATIVEDIGITS)
1356 */
1357 LOCVAL(LOCALE_SCURRENCY,"z\xB3")
1358 /*
1359 LOCVAL(LOCALE_SINTLSYMBOL)
1360 LOCVAL(LOCALE_SMONDECIMALSEP)
1361 LOCVAL(LOCALE_SMONTHOUSANDSEP)
1362 LOCVAL(LOCALE_SMONGROUPING)
1363 */
1364 LOCVAL(LOCALE_ICURRDIGITS,"2")
1365 /*
1366 LOCVAL(LOCALE_IINTLCURRDIGITS)
1367 */
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")
1374 /*
1375 LOCVAL(LOCALE_STIMEFORMAT)
1376 */
1377 LOCVAL(LOCALE_IDATE,"1")
1378 /*
1379 LOCVAL(LOCALE_ILDATE)
1380 */
1381 LOCVAL(LOCALE_ITIME,"1")
1382 /*
1383 LOCVAL(LOCALE_ITIMEMARKPOSN)
1384 LOCVAL(LOCALE_ICENTURY)
1385 */
1386 LOCVAL(LOCALE_ITLZERO,"1")
1387 /*
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)
1396 */
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,"")
1437 /*
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)
1446 */
1447         default: found=0;break;
1448         }
1449     break;  /* LANG(Pl) */
1450
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;
1553         }
1554     break; /* LANG(Po) */
1555
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;
1658         }
1659     break; /* LANG(Sw) */
1660
1661 /*Insert other languages here*/
1662
1663     default:
1664         found=0;
1665         break;
1666     }  /* switch */
1667
1668         if(!found) {
1669                 ERR(ole,"'%s' not supported for your language.\n",
1670                         retString);
1671                 retString = "<WINE-NLS-unknown>";
1672                 /*return 0;*/
1673         }
1674         if (buf)
1675                 lstrcpyn32A(buf,retString,len);
1676         return strlen(retString)+1;
1677 }
1678
1679 /***********************************************************************
1680  *         GetLocaleInfo32W             (KERNEL32.230)
1681  * Is the last parameter really WORD for Win16?
1682  */
1683 INT32 WINAPI GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
1684 {
1685         LPSTR abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
1686
1687         INT32 n = GetLocaleInfo32A(lcid, LCType, abuf, len);
1688         if (wbuf)
1689                 lstrcpynAtoW(wbuf,abuf,len);
1690         HeapFree(GetProcessHeap(),0,abuf);
1691         return n;
1692 }
1693
1694 /***********************************************************************
1695  *           CompareString16       (OLE2NLS.8)
1696  */
1697 UINT16 WINAPI CompareString16(DWORD lcid,DWORD fdwStyle,
1698                               LPCSTR s1,DWORD l1,LPCSTR s2,DWORD l2)
1699 {
1700         return (UINT16)CompareString32A(lcid,fdwStyle,s1,l1,s2,l2);
1701 }
1702
1703 /***********************************************************************
1704  *           CompareString32A   (KERNEL32.29)
1705  * This implementation ignores the locale
1706  * FIXME
1707  */
1708 UINT32 WINAPI CompareString32A(DWORD lcid, DWORD fdwStyle, 
1709                                LPCSTR s1, DWORD l1, LPCSTR s2,DWORD l2)
1710 {
1711         int len,ret;
1712         if(fdwStyle & NORM_IGNORENONSPACE)
1713                 FIXME(ole, "IGNORENONSPACE not supprted\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;
1729 }
1730
1731 /***********************************************************************
1732  *           CompareString32W       (KERNEL32.30)
1733  * This implementation ignores the locale
1734  * FIXME
1735  */
1736 UINT32 WINAPI CompareString32W(DWORD lcid, DWORD fdwStyle, 
1737                                LPCWSTR s1, DWORD l1, LPCWSTR s2,DWORD l2)
1738 {
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");
1744
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;
1758 }
1759
1760 /***********************************************************************
1761  *           SetLocaleInfoA       [KERNEL32.499]
1762  */
1763 BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
1764 {
1765     FIXME(ole,"(%ld,%ld,%s): stub\n",lcid,lctype,data);
1766     return TRUE;
1767 }
1768
1769 /***********************************************************************
1770  *           IsValidLocale       [KERNEL32.361]
1771  */
1772 BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags)
1773 {
1774         /* we support ANY language. Well, at least say that...*/
1775         return TRUE;
1776 }
1777
1778 /***********************************************************************
1779  *              EnumSystemLocales32W                [KERNEL32.93]
1780  */
1781 BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum,
1782                                     DWORD flags )
1783 {
1784         int     i;
1785         BOOL32  ret;
1786         WCHAR   buffer[200];
1787         HKEY    xhkey;
1788
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++;
1799                 }
1800                 RegCloseKey(xhkey);
1801                 return TRUE;
1802         }
1803
1804         i=0;
1805         while (languages[i].langname!=NULL)
1806         {
1807             LPWSTR cp;
1808             char   xbuffer[10];
1809         
1810             sprintf(xbuffer,"%08lx",(DWORD)languages[i].langid);
1811
1812             cp = HEAP_strdupAtoW( GetProcessHeap(), 0, xbuffer );
1813             ret = lpfnLocaleEnum(cp);
1814             HeapFree( GetProcessHeap(), 0, cp );
1815             if (!ret) break;
1816             i++;
1817         }
1818         return TRUE;
1819 }
1820
1821 /***********************************************************************
1822  *              EnumSystemLocales32A                [KERNEL32.92]
1823  */
1824 BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,
1825                                    DWORD flags)
1826 {
1827         int     i;
1828         CHAR    buffer[200];
1829         HKEY    xhkey;
1830
1831         TRACE(win32,"(%p,%08lx)\n",
1832                 lpfnLocaleEnum,flags
1833         );
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++;
1842                 }
1843                 RegCloseKey(xhkey);
1844                 return TRUE;
1845         }
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++;
1852         }
1853         return TRUE;
1854 }
1855
1856 /***********************************************************************
1857  *              GetStringTypeA                [OLE2NLS.7]
1858  */
1859 BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,
1860                               INT16 cchSrc,LPWORD chartype)
1861 {
1862         return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
1863 }
1864 /***********************************************************************
1865  *              GetStringTypeA                [KERNEL32.277]
1866  */
1867 BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,
1868                                INT32 cchSrc,LPWORD chartype)
1869 {
1870         return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
1871 }
1872 /***********************************************************************
1873  *              GetStringTypeExA                [KERNEL32.276]
1874  */
1875 BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,
1876                                  INT32 cchSrc,LPWORD chartype)
1877 {
1878         int     i;
1879
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;
1888         }
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 */
1904         }
1905         return TRUE;
1906 }
1907
1908 /*********************************************************************
1909  *  GetStringTypeW [KERNEL32.279]
1910  *
1911  * NOTES
1912  * Yes, this is missing LCID locale. MS fault.
1913  */
1914 BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,
1915                                LPWORD chartype)
1916 {
1917         return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype);
1918 }
1919
1920 /*********************************************************************
1921  *   GetStringTypeW   [KERNEL32.278]
1922  * FIXME: unicode chars are assumed chars
1923  */
1924 BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,
1925                                  INT32 cchSrc,LPWORD chartype)
1926 {
1927         int     i;
1928
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;
1937         }
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 */
1953         }
1954         return TRUE;
1955 }
1956
1957 /*****************************************************************
1958  * VerLanguageName16   [VER.10] 
1959  */
1960 DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen)
1961 {
1962         int     i;
1963         char    *buf;
1964
1965         TRACE(ver,"(%d,%p,%d)\n",langid,langname,langnamelen);
1966         /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
1967          * from the registry. 
1968          */
1969         buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
1970         sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
1971         if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
1972                 langname[langnamelen-1]='\0';
1973                 return langnamelen;
1974         }
1975         /* if that fails, use the interal table */
1976         for (i=0;languages[i].langid!=0;i++)
1977                 if (langid==languages[i].langid)
1978                         break;
1979         strncpy(langname,languages[i].langname,langnamelen);
1980         langname[langnamelen-1]='\0';
1981         return strlen(languages[i].langname);
1982 }
1983
1984 /*****************************************************************
1985  * VerLanguageName32A                           [VERSION.9] 
1986  */
1987 DWORD WINAPI VerLanguageName32A(UINT32 langid,LPSTR langname,
1988                                 UINT32 langnamelen)
1989 {
1990         return VerLanguageName16(langid,langname,langnamelen);
1991 }
1992
1993 /*****************************************************************
1994  * VerLanguageName32W                           [VERSION.10] 
1995  */
1996 DWORD WINAPI VerLanguageName32W(UINT32 langid,LPWSTR langname,
1997                                 UINT32 langnamelen)
1998 {
1999         int     i;
2000         char    buffer[80];
2001         LPWSTR  keyname;
2002
2003         /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
2004          * from the registry. 
2005          */
2006         sprintf(buffer,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
2007         keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
2008         if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
2009                 HeapFree( GetProcessHeap(), 0, keyname );
2010                 return langnamelen;
2011         }
2012         HeapFree( GetProcessHeap(), 0, keyname );
2013         /* if that fails, use the interal table */
2014         for (i=0;languages[i].langid!=0;i++)
2015                 if (langid==languages[i].langid)
2016                         break;
2017         lstrcpyAtoW( langname, languages[i].langname );
2018         return strlen(languages[i].langname); /* same as strlenW(langname); */
2019 }
2020
2021
2022 INT32 WINAPI LCMapString32A(
2023         LCID lcid,DWORD mapflags,LPCSTR srcstr,INT32 srclen,LPSTR dststr,
2024         INT32 dstlen
2025 ) {
2026         int     i,len;
2027
2028         TRACE(string,"(0x%04lx,0x%08lx,%s,%d,%p,%d)\n",
2029                 lcid,mapflags,srcstr,srclen,dststr,dstlen);
2030         if (!dstlen || !dststr) {
2031                 dststr = (LPSTR)srcstr;
2032         }
2033         if (!srclen) srclen = strlen(srcstr);
2034         if (!dstlen) dstlen = strlen(dststr);
2035         len = dstlen;
2036         if (srclen < len)
2037                 len = srclen;
2038         if (mapflags & LCMAP_LOWERCASE) {
2039                 for (i=0;i<len;i++)
2040                         dststr[i]=tolower(srcstr[i]);
2041                 mapflags &= ~LCMAP_LOWERCASE;
2042         }
2043         if (mapflags & LCMAP_UPPERCASE) {
2044                 for (i=0;i<len;i++)
2045                         dststr[i]=toupper(srcstr[i]);
2046                 mapflags &= ~LCMAP_UPPERCASE;
2047         }
2048         if (mapflags)
2049           {
2050             FIXME(ole,"(0x%04lx,0x%08lx,%p,%d,%p,%d): "
2051                   "unimplemented flags: 0x%08lx\n",
2052                   lcid,mapflags,srcstr,srclen,dststr,dstlen,mapflags);
2053           }
2054         return len;
2055 }
2056
2057 /* FIXME: implement everyhting & correct */
2058
2059 INT32 WINAPI LCMapString32W(
2060         LCID lcid,DWORD mapflags,LPCWSTR srcstr,INT32 srclen,LPWSTR dststr,
2061         INT32 dstlen
2062 ) {
2063         int     i,len;
2064
2065         TRACE(string,"(0x%04lx,0x%08lx,%p,%d,%p,%d)\n",
2066                 lcid,mapflags,srcstr,srclen,dststr,dstlen
2067         );
2068         if (!dstlen || !dststr) {
2069                 dststr = (LPWSTR)srcstr;
2070         }
2071         if (!srclen) srclen = lstrlen32W(srcstr);
2072         if (!dstlen) dstlen = lstrlen32W(dststr);
2073         len = dstlen;
2074         if (srclen < len)
2075                 len = srclen;
2076         if (mapflags & LCMAP_LOWERCASE) {
2077                 for (i=0;i<len;i++)
2078                         dststr[i]=tolower(srcstr[i]);
2079                 mapflags &= ~LCMAP_LOWERCASE;
2080         }
2081         if (mapflags & LCMAP_UPPERCASE) {
2082                 for (i=0;i<len;i++)
2083                         dststr[i]=toupper(srcstr[i]);
2084                 mapflags &= ~LCMAP_UPPERCASE;
2085         }
2086         if (mapflags)
2087           {
2088             FIXME(ole,"(0x%04lx,0x%08lx,%p,%d,%p,%d): "
2089                   "unimplemented flags: 0x%08lx\n",
2090                   lcid,mapflags,srcstr,srclen,dststr,dstlen,mapflags);
2091           }
2092         return len;
2093 }
2094
2095 /*****************************************************************
2096  *
2097  *  OLE_GetFormatA() [internal]
2098
2099
2100  This function implements stuff for GetDateFormat() and 
2101  GetTimeFormat().
2102
2103   d    single-digit (no leading zero) day (of month)
2104   dd   two-digit day (of month)
2105   ddd  short day-of-week name
2106   dddd long day-of-week name
2107   M    single-digit month
2108   MM   two-digit month
2109   MMM  short month name
2110   MMMM full month name
2111   y    two-digit year, no leading 0
2112   yy   two-digit year
2113   yyyy four-digit year
2114   gg   era string
2115   h    hours with no leading zero (12-hour)
2116   hh   hours with full two digits
2117   H    hours with no leading zero (24-hour)
2118   HH   hours with full two digits
2119   m    minutes with no leading zero
2120   mm   minutes with full two digits
2121   s    seconds with no leading zero
2122   ss   seconds with full two digits
2123   t    time marker (A or P)
2124   tt   time marker (AM, PM)
2125   ''   used to quote literal characters
2126   ''   (within a quoted string) indicates a literal '
2127
2128  These functions REQUIRE valid locale, date,  and format. 
2129
2130  */
2131
2132 INT32 WINAPI OLE_GetFormatA(LCID locale,
2133                             DWORD flags,
2134                             LPSYSTEMTIME xtime,
2135                             LPCSTR format, 
2136                             LPSTR date, INT32 datelen)
2137 {
2138    INT32 inpos, outpos;
2139    int count, type, inquote, Overflow;
2140    char buf[40];
2141    int buflen;
2142
2143    const char * _dgfmt[] = { "%d", "%02d" };
2144    const char ** dgfmt = _dgfmt - 1; 
2145
2146    /* report, for debugging */
2147    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,
2148          xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
2149          format, format, date, date, datelen);
2150   
2151    /* initalize state variables and output buffer */
2152    inpos = outpos = 0;
2153    count = 0; inquote = 0; Overflow = 0;
2154    type = '\0';
2155    date[0] = buf[0] = '\0';
2156       
2157    for (inpos = 0;; inpos++) {
2158       /* 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]); */
2159       if (inquote) {
2160          if (format[inpos] == '\'') {
2161             if (format[inpos+1] == '\'') {
2162                inpos += 1;
2163                date[outpos++] = '\'';
2164             } else {
2165                inquote = 0;
2166                continue; /* we did nothing to the output */
2167             }
2168          } else if (format[inpos] == '\0') {
2169             date[outpos++] = '\0';
2170             if (outpos > datelen) Overflow = 1;
2171             break;
2172          } else {
2173             date[outpos++] = format[inpos];
2174             if (outpos > datelen) {
2175                Overflow = 1;
2176                date[outpos-1] = '\0'; /* this is the last place where
2177                                          it's safe to write */
2178                break;
2179             }
2180          }
2181       } else if (  (count && (format[inpos] != type))
2182                    || count == 4
2183                    || (count == 2 && strchr("ghHmst", type)) )
2184        {
2185             if         (type == 'd') {
2186                if        (count == 4) {
2187                   GetLocaleInfo32A(locale,
2188                                    LOCALE_SDAYNAME1
2189                                    + xtime->wDayOfWeek - 1,
2190                                    buf, sizeof(buf));
2191                } else if (count == 3) {
2192                            GetLocaleInfo32A(locale, 
2193                                             LOCALE_SABBREVDAYNAME1 
2194                                             + xtime->wDayOfWeek - 1,
2195                                             buf, sizeof(buf));
2196                       } else {
2197                   sprintf(buf, dgfmt[count], xtime->wDay);
2198                }
2199             } else if (type == 'M') {
2200                if (count == 3) {
2201                   GetLocaleInfo32A(locale, 
2202                                    LOCALE_SABBREVMONTHNAME1
2203                                    + xtime->wMonth - 1,
2204                                    buf, sizeof(buf));
2205                } else if (count == 4) {
2206                   GetLocaleInfo32A(locale,
2207                                    LOCALE_SMONTHNAME1
2208                                    + xtime->wMonth - 1,
2209                                    buf, sizeof(buf));
2210                  } else {
2211                   sprintf(buf, dgfmt[count], xtime->wMonth);
2212                }
2213             } else if (type == 'y') {
2214                if (count == 4) {
2215                       sprintf(buf, "%d", xtime->wYear);
2216                } else if (count == 3) {
2217                   strcpy(buf, "yyy");
2218                   WARN(ole,
2219                               "unknown format,\
2220 c=%c, n=%d\n",  type, count);
2221                  } else {
2222                   sprintf(buf, dgfmt[count], xtime->wYear % 100);
2223                }
2224             } else if (type == 'g') {
2225                if        (count == 2) {
2226                   FIXME(ole, "LOCALE_ICALENDARTYPE unimp.\n");
2227                   strcpy(buf, "AD");
2228             } else {
2229                   strcpy(buf, "g");
2230                   WARN(ole,
2231                                "unknown format, \
2232 c=%c, n=%d\n", type, count);
2233                }
2234             } else if (type == 'h') {
2235                /* gives us hours 1:00 -- 12:00 */
2236                sprintf(buf, dgfmt[count], (xtime->wHour-1)%12 +1);
2237             } else if (type == 'H') {
2238                /* 24-hour time */
2239                sprintf(buf, dgfmt[count], xtime->wHour);
2240             } else if (type == 'm') {
2241                sprintf(buf, dgfmt[count], xtime->wMinute);
2242             } else if (type == 's') {
2243                sprintf(buf, dgfmt[count], xtime->wSecond);
2244             } else if (type == 't') {
2245                if        (count == 1) {
2246                   sprintf(buf, "%c", (xtime->wHour < 12) ? 'A' : 'P');
2247                } else if (count == 2) {
2248                   /* sprintf(buf, "%s", (xtime->wHour < 12) ? "AM" : "PM"); */
2249                   GetLocaleInfo32A(locale,
2250                                    (xtime->wHour<12) 
2251                                    ? LOCALE_S1159 : LOCALE_S2359,
2252                                    buf, sizeof(buf));
2253                }
2254             };
2255
2256             /* we need to check the next char in the format string 
2257                again, no matter what happened */
2258             inpos--;
2259             
2260             /* add the contents of buf to the output */
2261             buflen = strlen(buf);
2262             if (outpos + buflen < datelen) {
2263                date[outpos] = '\0'; /* for strcat to hook onto */
2264                  strcat(date, buf);
2265                outpos += buflen;
2266             } else {
2267                date[outpos] = '\0';
2268                strncat(date, buf, datelen - outpos);
2269                  date[datelen - 1] = '\0';
2270                  SetLastError(ERROR_INSUFFICIENT_BUFFER);
2271                WARN(ole, "insufficient buffer\n");
2272                  return 0;
2273             }
2274
2275             /* reset the variables we used to keep track of this item */
2276             count = 0;
2277             type = '\0';
2278          } else if (format[inpos] == '\0') {
2279             /* we can't check for this at the loop-head, because
2280                that breaks the printing of the last format-item */
2281             date[outpos] = '\0';
2282             break;
2283          } else if (count) {
2284             /* continuing a code for an item */
2285             count +=1;
2286             continue;
2287          } else if (strchr("hHmstyMdg", format[inpos])) {
2288             type = format[inpos];
2289             count = 1;
2290             continue;
2291          } else if (format[inpos] == '\'') {
2292             inquote = 1;
2293             continue;
2294        } else {
2295             date[outpos++] = format[inpos];
2296          }
2297       /* now deal with a possible buffer overflow */
2298       if (outpos >= datelen) {
2299        date[datelen - 1] = '\0';
2300        SetLastError(ERROR_INSUFFICIENT_BUFFER);
2301        return 0;
2302       }
2303    }
2304    
2305    if (Overflow) {
2306       SetLastError(ERROR_INSUFFICIENT_BUFFER);
2307    };
2308
2309    /* finish it off with a string terminator */
2310    outpos++;
2311    /* sanity check */
2312    if (outpos > datelen-1) outpos = datelen-1;
2313    date[outpos] = '\0';
2314    
2315    TRACE(ole, "OLE_GetFormatA returns string '%s', len %d\n",
2316                date, outpos);
2317    return outpos;
2318 }
2319
2320 /**************************************************************
2321  * OLE_GetFormatW  [internal]  
2322  */
2323 INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags,
2324                             LPSYSTEMTIME xtime,
2325                             LPCWSTR format,
2326                             LPWSTR output, INT32 outlen)
2327 {
2328    INT32   inpos, outpos;
2329    int     count, type=0, inquote;
2330    int     Overflow; /* loop check */
2331    int usedate, usetime;
2332    WCHAR   buf[40];
2333    int     buflen=0;
2334    char    abuf[40];
2335    WCHAR   arg0[] = {0}, arg1[] = {'%','d',0};
2336    WCHAR   arg2[] = {'%','0','2','d',0};
2337    WCHAR  *argarr[] = {arg0, arg1, arg2};
2338    int     datevars=0, timevars=0;
2339
2340    /* make a debug report */
2341    lstrcpynWtoA(abuf, format, sizeof(format));
2342    TRACE(ole, "args: %8lx, %8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
2343          locale, flags, 
2344          xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
2345          abuf, format, output, outlen);
2346    
2347
2348    /* initialize state variables */
2349    inpos = outpos = 0;
2350    count = 0;
2351    inquote = Overflow = 0;
2352    /* this is really just a sanity check */
2353    output[0] = buf[0] = 0;
2354    abuf[0] = '\0';
2355    /* for compatibility with official Windows behavior */
2356    usedate = flags & DATE_DATEVARSONLY;
2357    usetime = flags & TIME_TIMEVARSONLY;
2358    
2359    /* this loop is the core of the function */
2360    for (inpos = 0; /* we have several break points */ ; inpos++) {
2361       if (inquote) {
2362          if (format[inpos] == (WCHAR) '\'') {
2363             if (format[inpos+1] == '\'') {
2364                inpos++;
2365                output[outpos++] = '\'';
2366             } else {
2367                inquote = 0;
2368                continue;
2369             }
2370          } else if (format[inpos] == 0) {
2371             output[outpos++] = 0;
2372             if (outpos > outlen) Overflow = 1;
2373             break;  /*  normal exit (within a quote) */
2374          } else {
2375             output[outpos++] = format[inpos]; /* copy input */
2376             if (outpos > outlen) {
2377                Overflow = 1;
2378                output[outpos-1] = 0; 
2379                break;
2380             }
2381          }
2382       } else if (  (count && (format[inpos] != type))
2383                    || ( (count==4 && type =='y') ||
2384                         (count==4 && type =='M') ||
2385                         (count==4 && type =='d') ||
2386                         (count==2 && type =='g') ||
2387                         (count==2 && type =='h') ||
2388                         (count==2 && type =='H') ||
2389                         (count==2 && type =='m') ||
2390                         (count==2 && type =='s') ||
2391                         (count==2 && type =='t') )  ) {
2392          if        (type == 'd') {
2393             if        (count == 3) {
2394                GetLocaleInfo32W(locale,
2395                              LOCALE_SDAYNAME1 + xtime->wDayOfWeek -1,
2396                              buf, sizeof(buf)/sizeof(WCHAR) );
2397             } else if (count == 3) {
2398                GetLocaleInfo32W(locale,
2399                                 LOCALE_SABBREVDAYNAME1 +
2400                                 xtime->wDayOfWeek -1,
2401                                 buf, sizeof(buf)/sizeof(WCHAR) );
2402             } else {
2403                wsnprintf32W(buf, 5, argarr[count], xtime->wDay );
2404             };
2405          } else if (type == 'M') {
2406             if        (count == 4) {
2407                GetLocaleInfo32W(locale,  LOCALE_SMONTHNAME1 +
2408                                 xtime->wMonth -1, buf,
2409                                 sizeof(buf)/sizeof(WCHAR) );
2410             } else if (count == 3) {
2411                GetLocaleInfo32W(locale,  LOCALE_SABBREVMONTHNAME1 +
2412                                 xtime->wMonth -1, buf,
2413                                 sizeof(buf)/sizeof(WCHAR) );
2414             } else {
2415                wsnprintf32W(buf, 5, argarr[count], xtime->wMonth);
2416             }
2417          } else if (type == 'y') {
2418             if        (count == 4) {
2419                wsnprintf32W(buf, 6, argarr[1] /* "%d" */,
2420                          xtime->wYear);
2421             } else if (count == 3) {
2422                lstrcpynAtoW(buf, "yyy", 5);
2423             } else {
2424                wsnprintf32W(buf, 6, argarr[count],
2425                             xtime->wYear % 100);
2426             }
2427          } else if (type == 'g') {
2428             if        (count == 2) {
2429                FIXME(ole, "LOCALE_ICALENDARTYPE unimplemented\n");
2430                lstrcpynAtoW(buf, "AD", 5);
2431             } else {
2432                /* Win API sez we copy it verbatim */
2433                lstrcpynAtoW(buf, "g", 5);
2434             }
2435          } else if (type == 'h') {
2436             /* hours 1:00-12:00 --- is this right? */
2437             wsnprintf32W(buf, 5, argarr[count], 
2438                          (xtime->wHour-1)%12 +1);
2439          } else if (type == 'H') {
2440             wsnprintf32W(buf, 5, argarr[count], 
2441                          xtime->wHour);
2442          } else if (type == 'm') {
2443             wsnprintf32W(buf, 5, argarr[count],
2444                          xtime->wMinute);
2445          } else if (type == 's') {
2446             wsnprintf32W(buf, 5, argarr[count],
2447                          xtime->wSecond);
2448          } else if (type == 't') {
2449             GetLocaleInfo32W(locale, (xtime->wHour < 12) ?
2450                              LOCALE_S1159 : LOCALE_S2359,
2451                              buf, sizeof(buf) );
2452             if        (count == 1) {
2453                buf[1] = 0;
2454             }
2455 }
2456
2457          /* no matter what happened,  we need to check this next 
2458             character the next time we loop through */
2459          inpos--;
2460
2461          /* cat buf onto the output */
2462          outlen = lstrlen32W(buf);
2463          if (outpos + buflen < outlen) {
2464             output[outpos] = 0;  /* a "hook" for strcat */
2465             lstrcat32W(output, buf);
2466             outpos += buflen;
2467          } else {
2468             output[outpos] = 0;
2469             lstrcatn32W(output, buf, outlen - outpos);
2470             output[outlen - 1] = 0;
2471             Overflow = 1;
2472             break; /* Abnormal exit */
2473          }
2474
2475          /* reset the variables we used this time */
2476          count = 0;
2477          type = '\0';
2478       } else if (format[inpos] == 0) {
2479          /* we can't check for this at the beginning,  because that 
2480          would keep us from printing a format spec that ended the 
2481          string */
2482          output[outpos] = 0;
2483          break;  /*  NORMAL EXIT  */
2484       } else if (count) {
2485          /* how we keep track of the middle of a format spec */
2486          count++;
2487          continue;
2488       } else if ( (datevars && (format[inpos]=='d' ||
2489                                 format[inpos]=='M' ||
2490                                 format[inpos]=='y' ||
2491                                 format[inpos]=='g')  ) ||
2492                   (timevars && (format[inpos]=='H' ||
2493                                 format[inpos]=='h' ||
2494                                 format[inpos]=='m' ||
2495                                 format[inpos]=='s' ||
2496                                 format[inpos]=='t') )    ) {
2497          type = format[inpos];
2498          count = 1;
2499          continue;
2500       } else if (format[inpos] == '\'') {
2501          inquote = 1;
2502          continue;
2503       } else {
2504          /* unquoted literals */
2505          output[outpos++] = format[inpos];
2506       }
2507    }
2508
2509    if (Overflow) {
2510       SetLastError(ERROR_INSUFFICIENT_BUFFER);
2511       WARN(ole, " buffer overflow\n");
2512    };
2513
2514    /* final string terminator and sanity check */
2515    outpos++;
2516    if (outpos > outlen-1) outpos = outlen-1;
2517    output[outpos] = '0';
2518
2519    lstrcpynWtoA(abuf, output, sizeof(abuf) );
2520    TRACE(ole, " returning string \'%s\'\n", abuf);
2521         
2522    return (!Overflow) ? outlen : 0;
2523    
2524 }
2525
2526
2527 /*****************************************************************
2528  *  GetDateFormat32A() [KERNEL32.310] Makes an ASCII string of the date
2529  *
2530  * This function uses format to format the date,  or,  if format
2531  * is NULL, uses the default for the locale.  format is a string
2532  * of literal fields and characters as follows:
2533  *
2534  * - d    single-digit (no leading zero) day (of month)
2535  * - dd   two-digit day (of month)
2536  * - ddd  short day-of-week name
2537  * - dddd long day-of-week name
2538  * - M    single-digit month
2539  * - MM   two-digit month
2540  * - MMM  short month name
2541  * - MMMM full month name
2542  * - y    two-digit year, no leading 0
2543  * - yy   two-digit year
2544  * - yyyy four-digit year
2545  * - gg   era string
2546  *
2547  */
2548
2549 INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,
2550                               LPSYSTEMTIME xtime,
2551                               LPCSTR format, LPSTR date,INT32 datelen) 
2552 {
2553    
2554   char format_buf[40];
2555   LPCSTR thisformat;
2556   SYSTEMTIME t;
2557   LPSYSTEMTIME thistime;
2558   LCID thislocale;
2559
2560   INT32 ret;
2561
2562   TRACE(ole,"(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
2563               locale,flags,xtime,format,date,datelen);
2564   
2565   if (!locale) {
2566      locale = LOCALE_SYSTEM_DEFAULT;
2567      };
2568   
2569   if (locale == LOCALE_SYSTEM_DEFAULT) {
2570      thislocale = GetSystemDefaultLCID();
2571   } else if (locale == LOCALE_USER_DEFAULT) {
2572      thislocale = GetUserDefaultLCID();
2573   } else {
2574      thislocale = locale;
2575    };
2576
2577   if (xtime == NULL) {
2578      GetSystemTime(&t);
2579      thistime = &t;
2580   } else {
2581      thistime = xtime;
2582   };
2583
2584   if (format == NULL) {
2585      GetLocaleInfo32A(thislocale, ((flags&DATE_LONGDATE) 
2586                                    ? LOCALE_SLONGDATE
2587                                    : LOCALE_SSHORTDATE),
2588                       format_buf, sizeof(format_buf));
2589      thisformat = format_buf;
2590   } else {
2591      thisformat = format;
2592   };
2593
2594   
2595   ret = OLE_GetFormatA(thislocale, flags, thistime, thisformat, 
2596                        date, datelen);
2597   
2598
2599    TRACE(ole, 
2600                "GetDateFormat32A() returning %d, with data=%s\n",
2601                ret, date);
2602   return ret;
2603 }
2604
2605 /* ****************************************************************
2606  * GetDateFormat32W() [KERNEL32.311] Makes a Unicode string of the date
2607  *
2608  * Acts the same as GetDateFormat32A(),  except that it's Unicode.
2609  * Accepts & returns sizes as counts of Unicode characters.
2610  *
2611  */
2612 INT32 WINAPI GetDateFormat32W(LCID locale,DWORD flags,
2613                               LPSYSTEMTIME xtime,
2614                               LPCWSTR format,
2615                               LPWSTR date, INT32 datelen)
2616 {
2617    short datearr[] = {'1','9','9','4','-','1','-','1',0};
2618
2619    FIXME(ole, "STUB (should call OLE_GetFormatW)\n");   
2620    lstrcpyn32W(date, datearr, datelen);
2621    return (  datelen < 9) ? datelen : 9;
2622    
2623    
2624 }
2625
2626
2627 /**************************************************************************
2628  *              GetNumberFormat32A      (KERNEL32.355)
2629  */
2630 INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags,
2631                                LPCSTR lpvalue,  char *lpFormat,
2632                                LPSTR lpNumberStr, int cchNumber)
2633 /* NOTE: type of lpFormat should be CONST NUMBERFORMAT */
2634
2635 {
2636  int n;
2637
2638  FIXME(file,"%s: stub, no reformating done\n",lpvalue);
2639
2640  n = strlen(lpvalue);
2641  if (cchNumber) { 
2642    strncpy(lpNumberStr,lpvalue,cchNumber);
2643    if (cchNumber <= n) {
2644      lpNumberStr[cchNumber-1] = 0;
2645      n = cchNumber-1;
2646    }
2647  }
2648  return n;
2649 }
2650  
2651
2652
2653 /*****************************************************************
2654  *
2655  * GetTimeFormat32A() [KERNEL32.422] Makes an ASCII string of the time
2656  *
2657  * Formats date according to format,  or locale default if format is
2658  * NULL. The format consists of literal characters and fields as follows:
2659  *
2660  * h  hours with no leading zero (12-hour)
2661  * hh hours with full two digits
2662  * H  hours with no leading zero (24-hour)
2663  * HH hours with full two digits
2664  * m  minutes with no leading zero
2665  * mm minutes with full two digits
2666  * s  seconds with no leading zero
2667  * ss seconds with full two digits
2668  * t  time marker (A or P)
2669  * tt time marker (AM, PM)
2670  *
2671  */
2672
2673 INT32 WINAPI 
2674 GetTimeFormat32A(LCID locale,        /* in  */
2675                  DWORD flags,        /* in  */
2676                  LPSYSTEMTIME xtime, /* in  */ 
2677                  LPCSTR format,      /* in  */
2678                  LPSTR timestr,      /* out */
2679                  INT32 timelen       /* in  */) 
2680 {
2681    LPCSTR realformat;
2682    char fmt_buf[40];
2683    
2684    TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
2685          locale,flags,xtime,format,timestr,timelen);
2686    
2687    if (format) {
2688       realformat = format;
2689    } else if (locale) {
2690       GetLocaleInfo32A(locale, LOCALE_STIMEFORMAT,
2691                        fmt_buf,  sizeof(fmt_buf));
2692       realformat = fmt_buf;
2693    } else {
2694       WARN(ole, "Caller gave no locale and no format\n");
2695       realformat = "hh:mm:ss";
2696    };
2697    if (!locale) {
2698       locale = GetSystemDefaultLCID();
2699    }
2700    return OLE_GetFormatA(locale, flags, xtime, realformat, timestr, timelen);
2701 }
2702
2703
2704 /* ****************************************************************
2705  *  GetTimeFormat32W()  [KERNEL32.423] Makes a Unicode string of the time
2706  * 
2707
2708  *
2709  */
2710
2711 INT32 WINAPI 
2712 GetTimeFormat32W(LCID locale,DWORD flags,
2713                               LPSYSTEMTIME xtime,
2714                               LPCWSTR format, 
2715                               LPWSTR timestr,INT32 timelen) 
2716 {
2717    char debugbuf[40];
2718    WCHAR buf[20];
2719    LPCWSTR realformat=0;
2720    SYSTEMTIME t;
2721    LPSYSTEMTIME realtime;
2722    WCHAR * fmt_buf = NULL;
2723    int fmt_buf_size = 0; /* units of WCHARs */
2724    INT32 retval;
2725    
2726    lstrcpynWtoA(debugbuf, format, (sizeof(buf))/2);
2727    TRACE(ole, "GetTimeFormatW len %d flags 0x%lX format >%s<\n",
2728                 timelen, flags, debugbuf);
2729
2730    /* Enforce the Windows behavior */
2731    flags |= ~LOCALE_TIMEDATEBOTH;
2732    flags |= TIME_TIMEVARSONLY;
2733
2734    /* take care of the format or locale not being given */
2735    if (format) {
2736       realformat = format;
2737    } else if (locale) {
2738       /* allocate memory */
2739       fmt_buf = malloc((fmt_buf_size+=7) * sizeof(WCHAR));
2740       if (!fmt_buf) {
2741          SetLastError(ERROR_INSUFFICIENT_BUFFER);
2742          WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size); 
2743          return 0;
2744       };
2745       while(!GetLocaleInfo32W(locale, LOCALE_STIMEFORMAT,
2746                               fmt_buf, fmt_buf_size)) {
2747          fmt_buf = realloc(fmt_buf, 
2748                            (fmt_buf_size += 10) * sizeof(WCHAR));
2749          if (!fmt_buf) {
2750             SetLastError(ERROR_OUTOFMEMORY);
2751             WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size); 
2752             return 0;
2753          };
2754       };
2755       realformat = fmt_buf;
2756    } else {
2757       FIXME(ole,  "caller gave no locale,  no format;  what should we do?\n");
2758       SetLastError(ERROR_BAD_FORMAT);
2759    };
2760    if (!locale) {
2761       locale = GetSystemDefaultLCID();
2762 }
2763
2764    realtime = xtime;
2765    if (!realtime) {
2766       realtime = &t;
2767       GetSystemTime(realtime);
2768    };
2769
2770
2771    retval = OLE_GetFormatW(locale, flags, realtime, realformat, timestr,  timelen);
2772    if (fmt_buf) free(fmt_buf);
2773    return retval;
2774 }