Coverity: Localization module Resource Leaks fixed
[scilab.git] / scilab / modules / localization / sci_gateway / c / sci_gettext.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
4 * Copyright (C) 2009-2012 - DIGITEO - Allan CORNET
5 * Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
6 *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15 *
16 */
17 #include <string.h>
18 #include <stdlib.h>
19 #include "sci_malloc.h"
20 #include "localization.h"
21 #include "gw_localization.h"
22 #include "api_scilab.h"
23 #include "Scierror.h"
24 #include "strsubst.h"
25 #include "os_string.h"
26 #include "freeArrayOfString.h"
27
28 /*--------------------------------------------------------------------------*/
29 static char *convertString_dgettext(const char *domain, const char *pStr);
30 /*--------------------------------------------------------------------------*/
31 int sci_gettext(char *fname, void* pvApiCtx)
32 {
33     SciErr sciErr;
34     int *piAddressVarOne = NULL;
35     char* pstDomain = NULL;
36     char **TranslatedStrings = NULL;
37     int m = 0;
38     int n = 0;
39     char **StringsToTranslate = NULL;
40     int i = 0;
41
42     int iCurrentRhs = 1;
43
44     int iRhs = nbInputArgument(pvApiCtx);
45     int iLhs = nbOutputArgument(pvApiCtx);
46
47     CheckInputArgument(pvApiCtx, 1, 2);
48     CheckOutputArgument(pvApiCtx, 0, 1);
49
50     if (iRhs == 2)
51     {
52         //get domain name
53         sciErr = getVarAddressFromPosition(pvApiCtx, iCurrentRhs, &piAddressVarOne);
54         if (sciErr.iErr)
55         {
56             printError(&sciErr, 0);
57             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, iCurrentRhs);
58         }
59
60         if (isStringType(pvApiCtx, piAddressVarOne) == 0 || isScalar(pvApiCtx, piAddressVarOne) == 0)
61         {
62             Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), fname, iCurrentRhs);
63             return 0;
64         }
65
66         if (getAllocatedSingleString(pvApiCtx, piAddressVarOne, &pstDomain))
67         {
68             Scierror(999, _("%s: No more memory.\n"), fname);
69             return 0;
70         }
71
72         iCurrentRhs++;
73     }
74
75     sciErr = getVarAddressFromPosition(pvApiCtx, iCurrentRhs, &piAddressVarOne);
76     if (sciErr.iErr)
77     {
78         printError(&sciErr, 0);
79         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, iCurrentRhs);
80     }
81
82     if (isStringType(pvApiCtx, piAddressVarOne) == 0)
83     {
84         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1);
85         freeAllocatedSingleString(pstDomain);
86         return 0;
87     }
88
89     if (getAllocatedMatrixOfString(pvApiCtx, piAddressVarOne, &m, &n, &StringsToTranslate) != 0)
90     {
91         Scierror(999, _("%s: No more memory.\n"), fname);
92         freeAllocatedSingleString(pstDomain);
93         return 0;
94     }
95
96     TranslatedStrings = (char **)MALLOC(sizeof(char*) * (m * n));
97     if (TranslatedStrings == NULL)
98     {
99         Scierror(999, _("%s: No more memory.\n"), fname);
100         freeAllocatedSingleString(pstDomain);
101         freeAllocatedMatrixOfString(m, n, StringsToTranslate);
102         StringsToTranslate = NULL;
103         return 0;
104     }
105
106     for (i = 0; i < m * n; i++)
107     {
108         if (strcmp(StringsToTranslate[i], "") == 0)
109         {
110             TranslatedStrings[i] = strdup("");
111         }
112         else
113         {
114             //if pstDomain is NULL, default domain will be use
115             TranslatedStrings[i] = convertString_dgettext(pstDomain, StringsToTranslate[i]);
116         }
117     }
118
119     freeAllocatedSingleString(pstDomain);
120     freeAllocatedMatrixOfString(m, n, StringsToTranslate);
121     StringsToTranslate = NULL;
122
123     sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, m, n, TranslatedStrings);
124     freeArrayOfString(TranslatedStrings, m * n);
125     TranslatedStrings = NULL;
126
127     if (sciErr.iErr)
128     {
129         printError(&sciErr, 0);
130         Scierror(999, _("%s: Memory allocation error.\n"), fname);
131         return 0;
132     }
133
134     LhsVar(1) = Rhs + 1;
135     PutLhsVar();
136     return 0;
137 }
138 /*--------------------------------------------------------------------------*/
139 static char *convertString_dgettext(const char *domain, const char *pStr)
140 {
141     char *pStrConverted = NULL;
142
143     if (pStr)
144     {
145         BOOL revertStrsub = FALSE;
146         char *TranslatedString = NULL;
147         char *tmpStr = NULL;
148         if (strchr(pStr, '\\') != NULL)
149         {
150             char *tmpStr1 = NULL;
151             char *tmpStr2 = NULL;
152             /* There is an \ in the string process to replace */
153
154             /* We always have something from this functions because gettext
155             * is returning the same string if it cannot find it */
156
157             tmpStr1 = strsub((char*)pStr, "\\n", "\n"); /* linefeed */
158             tmpStr2 = strsub(tmpStr1, "\\t", "\t"); /* horizontal tab */
159             if (tmpStr1)
160             {
161                 FREE(tmpStr1);
162                 tmpStr1 = NULL;
163             }
164
165             tmpStr1 = strsub(tmpStr2, "\\r", "\r"); /* carriage return */
166             if (tmpStr2)
167             {
168                 FREE(tmpStr2);
169                 tmpStr2 = NULL;
170             }
171
172             tmpStr2 = strsub(tmpStr1, "\\v", "\v"); /* vertical tab */
173             if (tmpStr1)
174             {
175                 FREE(tmpStr1);
176                 tmpStr1 = NULL;
177             }
178
179             tmpStr1 = strsub(tmpStr2, "\\f", "\f"); /* form feed */
180             if (tmpStr2)
181             {
182                 FREE(tmpStr2);
183                 tmpStr2 = NULL;
184             }
185
186             tmpStr2 = strsub(tmpStr1, "\\\\", "\\"); /* backslash */
187             if (tmpStr1)
188             {
189                 FREE(tmpStr1);
190                 tmpStr1 = NULL;
191             }
192
193             tmpStr1 = strsub(tmpStr2, "\\\"", "\""); /* double quote */
194             if (tmpStr2)
195             {
196                 FREE(tmpStr2);
197                 tmpStr2 = NULL;
198             }
199
200             revertStrsub = TRUE;
201             tmpStr = strdup(tmpStr1);
202             if (tmpStr1)
203             {
204                 FREE(tmpStr1);
205                 tmpStr1 = NULL;
206             }
207         }
208         else
209         {
210             revertStrsub = FALSE;
211             tmpStr = strdup(pStr);
212         }
213
214         TranslatedString = strdup(dgettext(domain, tmpStr));
215         if (tmpStr)
216         {
217             FREE(tmpStr);
218             tmpStr = NULL;
219         }
220
221         /* Add removed slashes */
222         if (revertStrsub)
223         {
224             char *tmpStr1 = NULL;
225             char *tmpStr2 = NULL;
226
227             tmpStr1 = strsub(TranslatedString, "\\", "\\\\"); /* backslash */
228
229             tmpStr2 = strsub(tmpStr1, "\f", "\\f"); /* form feed */
230             if (tmpStr1)
231             {
232                 FREE(tmpStr1);
233                 tmpStr1 = NULL;
234             }
235
236             tmpStr1 = strsub(tmpStr2, "\n", "\\n"); /* linefeed */
237             if (tmpStr2)
238             {
239                 FREE(tmpStr2);
240                 tmpStr2 = NULL;
241             }
242
243             tmpStr2 = strsub(tmpStr1, "\t", "\\t"); /* horizontal tab */
244             if (tmpStr1)
245             {
246                 FREE(tmpStr1);
247                 tmpStr1 = NULL;
248             }
249
250             tmpStr1 = strsub(tmpStr2, "\r", "\\r"); /* carriage return */
251             if (tmpStr2)
252             {
253                 FREE(tmpStr2);
254                 tmpStr2 = NULL;
255             }
256
257             tmpStr2 = strsub(tmpStr1, "\v", "\\v"); /* vertical tab */
258             if (tmpStr1)
259             {
260                 FREE(tmpStr1);
261                 tmpStr1 = NULL;
262             }
263
264             if (TranslatedString)
265             {
266                 FREE(TranslatedString);
267                 TranslatedString = NULL;
268             }
269
270             TranslatedString = strdup(tmpStr2);
271
272             if (tmpStr2)
273             {
274                 FREE(tmpStr2);
275                 tmpStr2 = NULL;
276             }
277         }
278         pStrConverted = TranslatedString;
279     }
280     return pStrConverted;
281 }
282 /*--------------------------------------------------------------------------*/