09f41ddd2edae9bbcd81a0b871b1ce5128f4d05c
[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         return 0;
86     }
87
88     if (getAllocatedMatrixOfString(pvApiCtx, piAddressVarOne, &m, &n, &StringsToTranslate) != 0)
89     {
90         Scierror(999, _("%s: No more memory.\n"), fname);
91         return 0;
92     }
93
94     TranslatedStrings = (char **)MALLOC(sizeof(char*) * (m * n));
95     if (TranslatedStrings == NULL)
96     {
97         freeAllocatedMatrixOfString(m, n, StringsToTranslate);
98         StringsToTranslate = NULL;
99         Scierror(999, _("%s: No more memory.\n"), fname);
100         return 0;
101     }
102
103     for (i = 0; i < m * n; i++)
104     {
105         if (strcmp(StringsToTranslate[i], "") == 0)
106         {
107             TranslatedStrings[i] = strdup("");
108         }
109         else
110         {
111             //if pstDomain is NULL, default domain will be use
112             TranslatedStrings[i] = convertString_dgettext(pstDomain, StringsToTranslate[i]);
113         }
114     }
115
116     freeAllocatedMatrixOfString(m, n, StringsToTranslate);
117     StringsToTranslate = NULL;
118
119     sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, m, n, TranslatedStrings);
120     freeArrayOfString(TranslatedStrings, m * n);
121     TranslatedStrings = NULL;
122
123     if (sciErr.iErr)
124     {
125         printError(&sciErr, 0);
126         Scierror(999, _("%s: Memory allocation error.\n"), fname);
127         return 0;
128     }
129
130     LhsVar(1) = Rhs + 1;
131     PutLhsVar();
132     return 0;
133 }
134 /*--------------------------------------------------------------------------*/
135 static char *convertString_dgettext(const char *domain, const char *pStr)
136 {
137     char *pStrConverted = NULL;
138
139     if (pStr)
140     {
141         BOOL revertStrsub = FALSE;
142         char *TranslatedString = NULL;
143         char *tmpStr = NULL;
144         if (strchr(pStr, '\\') != NULL)
145         {
146             char *tmpStr1 = NULL;
147             char *tmpStr2 = NULL;
148             /* There is an \ in the string process to replace */
149
150             /* We always have something from this functions because gettext
151             * is returning the same string if it cannot find it */
152
153             tmpStr1 = strsub((char*)pStr, "\\n", "\n"); /* linefeed */
154             tmpStr2 = strsub(tmpStr1, "\\t", "\t"); /* horizontal tab */
155             if (tmpStr1)
156             {
157                 FREE(tmpStr1);
158                 tmpStr1 = NULL;
159             }
160
161             tmpStr1 = strsub(tmpStr2, "\\r", "\r"); /* carriage return */
162             if (tmpStr2)
163             {
164                 FREE(tmpStr2);
165                 tmpStr2 = NULL;
166             }
167
168             tmpStr2 = strsub(tmpStr1, "\\v", "\v"); /* vertical tab */
169             if (tmpStr1)
170             {
171                 FREE(tmpStr1);
172                 tmpStr1 = NULL;
173             }
174
175             tmpStr1 = strsub(tmpStr2, "\\f", "\f"); /* form feed */
176             if (tmpStr2)
177             {
178                 FREE(tmpStr2);
179                 tmpStr2 = NULL;
180             }
181
182             tmpStr2 = strsub(tmpStr1, "\\\\", "\\"); /* backslash */
183             if (tmpStr1)
184             {
185                 FREE(tmpStr1);
186                 tmpStr1 = NULL;
187             }
188
189             tmpStr1 = strsub(tmpStr2, "\\\"", "\""); /* double quote */
190             if (tmpStr2)
191             {
192                 FREE(tmpStr2);
193                 tmpStr2 = NULL;
194             }
195
196             revertStrsub = TRUE;
197             tmpStr = strdup(tmpStr1);
198             if (tmpStr1)
199             {
200                 FREE(tmpStr1);
201                 tmpStr1 = NULL;
202             }
203         }
204         else
205         {
206             revertStrsub = FALSE;
207             tmpStr = strdup(pStr);
208         }
209
210         TranslatedString = strdup(dgettext(domain, tmpStr));
211         if (tmpStr)
212         {
213             FREE(tmpStr);
214             tmpStr = NULL;
215         }
216
217         /* Add removed slashes */
218         if (revertStrsub)
219         {
220             char *tmpStr1 = NULL;
221             char *tmpStr2 = NULL;
222
223             tmpStr1 = strsub(TranslatedString, "\\", "\\\\"); /* backslash */
224
225             tmpStr2 = strsub(tmpStr1, "\f", "\\f"); /* form feed */
226             if (tmpStr1)
227             {
228                 FREE(tmpStr1);
229                 tmpStr1 = NULL;
230             }
231
232             tmpStr1 = strsub(tmpStr2, "\n", "\\n"); /* linefeed */
233             if (tmpStr2)
234             {
235                 FREE(tmpStr2);
236                 tmpStr2 = NULL;
237             }
238
239             tmpStr2 = strsub(tmpStr1, "\t", "\\t"); /* horizontal tab */
240             if (tmpStr1)
241             {
242                 FREE(tmpStr1);
243                 tmpStr1 = NULL;
244             }
245
246             tmpStr1 = strsub(tmpStr2, "\r", "\\r"); /* carriage return */
247             if (tmpStr2)
248             {
249                 FREE(tmpStr2);
250                 tmpStr2 = NULL;
251             }
252
253             tmpStr2 = strsub(tmpStr1, "\v", "\\v"); /* vertical tab */
254             if (tmpStr1)
255             {
256                 FREE(tmpStr1);
257                 tmpStr1 = NULL;
258             }
259
260             if (TranslatedString)
261             {
262                 FREE(TranslatedString);
263                 TranslatedString = NULL;
264             }
265
266             TranslatedString = strdup(tmpStr2);
267
268             if (tmpStr2)
269             {
270                 FREE(tmpStr2);
271                 tmpStr2 = NULL;
272             }
273         }
274         pStrConverted = TranslatedString;
275     }
276     return pStrConverted;
277 }
278 /*--------------------------------------------------------------------------*/