Coverity: Localization module Resource Leaks 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         if (pathLocales)
68         {
69             FREE(pathLocales);
70             pathLocales = NULL;
71         }
72
73         pathLocales = (char *)MALLOC(sizeof(char) * (strlen(SCIpath) + strlen("/..") + strlen(PATHLOCALIZATIONFILE) + 1));
74         strcpy(pathLocales, SCIpath);
75         strcat(pathLocales, "/..");
76         strcat(pathLocales, PATHLOCALIZATIONFILE);
77         if (bindtextdomain(NAMELOCALIZATIONDOMAIN, pathLocales) == NULL || !isdir(pathLocales))
78         {
79             /* when it is installed on the system for example /usr/share/locale/ */
80             fprintf(stderr, "Warning: Localization issue: Error while binding the domain from %s or %s: Switch to the default language (English).\n", pathLocales, previousPathLocales);
81
82             // Set default behaviour
83             textdomain(NAMELOCALIZATIONDOMAIN);
84             bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN, "UTF-8");
85 #ifndef _MSC_VER
86             setlanguage(L"");
87 #else
88             /* We look if registry value LANGUAGE exists */
89             /* If not exists the "" means that we will try to use the language of the system.*/
90             {
91                 wchar_t* loadLanguage = getLanguagePreferences();
92                 setlanguage(loadLanguage);
93                 if (loadLanguage)
94                 {
95                     FREE(loadLanguage);
96                     loadLanguage = NULL;
97                 }
98             }
99 #endif
100
101             if (previousPathLocales)
102             {
103                 FREE(previousPathLocales);
104                 previousPathLocales = NULL;
105             }
106             if (pathLocales)
107             {
108                 FREE(pathLocales);
109                 pathLocales = NULL;
110             }
111             if (SCIpath)
112             {
113                 FREE(SCIpath);
114                 SCIpath = NULL;
115             }
116             return FALSE;
117         }
118         if (previousPathLocales)
119         {
120             FREE(previousPathLocales);
121             previousPathLocales = NULL;
122         }
123     }
124
125     if (SCIpath)
126     {
127         FREE(SCIpath);
128         SCIpath = NULL;
129     }
130     if (pathLocales)
131     {
132         FREE(pathLocales);
133         pathLocales = NULL;
134     }
135
136     /* set domain for future gettext() calls */
137     ret = textdomain(NAMELOCALIZATIONDOMAIN);
138     if (ret == NULL)
139     {
140         fprintf(stderr, "Localization: Error while declaring the text domain %s\n", NAMELOCALIZATIONDOMAIN);
141         return FALSE;
142     }
143     bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN, "UTF-8"); /*such that gettext and dgettext return UTF8 string*/
144 #ifndef _MSC_VER
145     /* Here, the "" means that we will try to use the language of the system
146      * first. If it doesn't work, we switch back to default (English) */
147 #ifdef FORCE_LOCALE_EN_US
148     setlanguage(L"C");
149 #else
150     setlanguage(L"");
151 #endif
152 #else
153     /* We look if registry value LANGUAGE exists */
154     /* If not exists the "" means that we will try to use the language of the system.*/
155     {
156 #ifdef FORCE_LOCALE_EN_US
157         setlanguage(L"en_US");
158 #else
159         wchar_t *loadLanguage = getLanguagePreferences();
160         setlanguage(loadLanguage);
161         if (loadLanguage)
162         {
163             FREE(loadLanguage);
164             loadLanguage = NULL;
165         }
166 #endif
167     }
168 #endif
169     return TRUE;
170 #else
171     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");
172     return FALSE;
173 #endif
174 }
175 /*--------------------------------------------------------------------------*/
176