Coverity #1099102, #1099103, #1321340 fixed
[scilab.git] / scilab / modules / localization / src / c / InitializeLocalization.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
4  * Copyright (C) 2011 - 2011 - DIGITEO - Bruno JOFRET
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16 #include <stdio.h>
17 #include <string.h>
18 #include <stdlib.h>
19 #include "machine.h"
20 #ifndef _MSC_VER
21 #ifdef HAVE_LIBINTL_H
22 #include <libintl.h>
23 #ifdef HAVE_LOCALE_H
24 #include <locale.h>
25 #else
26 #error "Cannot find locale.h despite that libintl.h is available"
27 #endif
28 #endif
29 #else
30 #include <libintl.h>
31 #include <locale.h>
32 #endif
33
34 #include "sci_malloc.h"
35 #include "InitializeLocalization.h"
36 #include "localization.h"
37 #include "sci_path.h"
38 #include "scilabDefaults.h"
39 #include "setgetlanguage.h"
40 #include "isdir.h"
41 #include "os_string.h"
42 #ifdef _MSC_VER
43 #include "LanguagePreferences_Windows.h"
44 #endif
45
46 //#define FORCE_LOCALE_EN_US
47 /*--------------------------------------------------------------------------*/
48
49 BOOL InitializeLocalization(void)
50 {
51 #ifdef HAVE_LIBINTL_H
52
53     char *SCIpath = getSCI();
54     char *pathLocales = NULL;
55     char *previousPathLocales = NULL;
56     char *ret = NULL;
57
58     /* set directory containing message catalogs */
59     pathLocales = (char *)MALLOC(sizeof(char) * (strlen(SCIpath) + strlen(PATHLOCALIZATIONFILE) + 1));
60
61     strcpy(pathLocales, SCIpath);
62     strcat(pathLocales, PATHLOCALIZATIONFILE);
63     if (bindtextdomain(NAMELOCALIZATIONDOMAIN, pathLocales) == NULL || !isdir(pathLocales))
64     {
65         /* source tree and classic build */
66         previousPathLocales = os_strdup(pathLocales);
67         FREE(pathLocales);
68         pathLocales = NULL;
69
70         pathLocales = (char *)MALLOC(sizeof(char) * (strlen(SCIpath) + strlen("/..") + strlen(PATHLOCALIZATIONFILE) + 1));
71         strcpy(pathLocales, SCIpath);
72         strcat(pathLocales, "/..");
73         strcat(pathLocales, PATHLOCALIZATIONFILE);
74         if (bindtextdomain(NAMELOCALIZATIONDOMAIN, pathLocales) == NULL || !isdir(pathLocales))
75         {
76             /* when it is installed on the system for example /usr/share/locale/ */
77             fprintf(stderr, "Warning: Localization issue: Error while binding the domain from %s or %s: Switch to the default language (English).\n", pathLocales, previousPathLocales);
78
79             // Set default behaviour
80             textdomain(NAMELOCALIZATIONDOMAIN);
81             bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN, "UTF-8");
82 #ifndef _MSC_VER
83             setlanguage(L"");
84 #else
85             /* We look if registry value LANGUAGE exists */
86             /* If not exists the "" means that we will try to use the language of the system.*/
87             {
88                 wchar_t* loadLanguage = getLanguagePreferences();
89                 setlanguage(loadLanguage);
90                 if (loadLanguage)
91                 {
92                     FREE(loadLanguage);
93                     loadLanguage = NULL;
94                 }
95             }
96 #endif
97
98             if (previousPathLocales)
99             {
100                 FREE(previousPathLocales);
101                 previousPathLocales = NULL;
102             }
103             FREE(pathLocales);
104             pathLocales = NULL;
105             FREE(SCIpath);
106             SCIpath = NULL;
107             return FALSE;
108         }
109         if (previousPathLocales)
110         {
111             FREE(previousPathLocales);
112             previousPathLocales = NULL;
113         }
114     }
115
116     FREE(SCIpath);
117     SCIpath = NULL;
118     FREE(pathLocales);
119     pathLocales = NULL;
120
121     /* set domain for future gettext() calls */
122     ret = textdomain(NAMELOCALIZATIONDOMAIN);
123     if (ret == NULL)
124     {
125         fprintf(stderr, "Localization: Error while declaring the text domain %s\n", NAMELOCALIZATIONDOMAIN);
126         return FALSE;
127     }
128     bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN, "UTF-8"); /*such that gettext and dgettext return UTF8 string*/
129 #ifndef _MSC_VER
130     /* Here, the "" means that we will try to use the language of the system
131      * first. If it doesn't work, we switch back to default (English) */
132 #ifdef FORCE_LOCALE_EN_US
133     setlanguage(L"C");
134 #else
135     setlanguage(L"");
136 #endif
137 #else
138     /* We look if registry value LANGUAGE exists */
139     /* If not exists the "" means that we will try to use the language of the system.*/
140     {
141 #ifdef FORCE_LOCALE_EN_US
142         setlanguage(L"en_US");
143 #else
144         wchar_t *loadLanguage = getLanguagePreferences();
145         setlanguage(loadLanguage);
146         if (loadLanguage)
147         {
148             FREE(loadLanguage);
149             loadLanguage = NULL;
150         }
151 #endif
152     }
153 #endif
154     return TRUE;
155 #else
156     fprintf(stderr, "Localization: setlocale didn't exist on the computer used to compile Scilab ! This is abnormal ! No localization will be working for this distribution of Scilab.\n");
157     return FALSE;
158 #endif
159 }
160 /*--------------------------------------------------------------------------*/
161