Merge remote-tracking branch 'origin/master' into YaSp
[scilab.git] / scilab / modules / localization / src / c / getLcidString.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 /*--------------------------------------------------------------------------*/
13 #include <string.h>
14 #include <stdio.h>
15 #ifdef _MSC_VER
16 #include <Windows.h>
17 #include "LocaleNameToLCID_Windows.h"
18 #endif
19 #include "os_strdup.h"
20 #include "getLcidString.h"
21 #include "MALLOC.h"
22 #include "charEncoding.h"
23 #include "stack-def.h"
24 /*--------------------------------------------------------------------------*/
25 #define DEFAULT_EN_LCID "0x0409"
26 /*--------------------------------------------------------------------------*/
27 #ifdef _MSC_VER
28 /* replaces '_' by '-' windows local format and convert to wide string */
29 static wchar_t *getWindowsLocaleFormat(const char *pStrLocale);
30 #endif
31 /*--------------------------------------------------------------------------*/
32 char *getLcidString(const char *pStrLocale)
33 {
34     char *pStrLCID = NULL;
35
36     if (pStrLocale == NULL) 
37     {
38         return os_strdup(DEFAULT_EN_LCID);
39     }
40 #ifdef _MSC_VER
41     if ((strcmp(pStrLocale, "") == 0) || (strcmp(pStrLocale, "C") == 0))
42     {
43         return os_strdup(DEFAULT_EN_LCID);
44     }
45     else
46     {
47         wchar_t *wLocale = getWindowsLocaleFormat(pStrLocale);
48         LCID lcid = dllLocaleNameToLCID(wLocale, 0);
49
50         if (lcid == 0)
51         {
52             pStrLCID = os_strdup(DEFAULT_EN_LCID);
53         }
54         else
55         {
56             pStrLCID = (char *)MALLOC(sizeof(char)*bsiz);
57             if (pStrLCID)
58             {
59                 sprintf(pStrLCID, "0x0%x", lcid);
60             }
61         }
62     }
63 #else
64     /* this routines not used on others platforms */
65     pStrLCID = os_strdup(DEFAULT_EN_LCID);
66 #endif
67     return pStrLCID;
68 }
69 /*--------------------------------------------------------------------------*/
70 #ifdef _MSC_VER
71 static wchar_t *getWindowsLocaleFormat(const char *pStrLocale)
72 {
73     wchar_t *Locale = NULL;
74     if (pStrLocale)
75     {
76         wchar_t *pwStrLocale = to_wide_string(pStrLocale);
77         if (pwStrLocale)
78         {
79             wchar_t *pos = wcschr(pwStrLocale, L'_');
80             if (pos)
81             {
82                 *pos = L'-';
83             }
84             Locale = pwStrLocale;
85         }
86     }
87     return Locale;
88 }
89 #endif
90 /*--------------------------------------------------------------------------*/