Coverity: Localization module Resource Leaks fixed
[scilab.git] / scilab / modules / localization / sci_gateway / c / sci_addlocalizationdomain.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15 /*--------------------------------------------------------------------------*/
16 #include <string.h>
17 #include <stdlib.h>
18 #include "sci_malloc.h"
19 #include "localization.h"
20 #include "gw_localization.h"
21 #include "api_scilab.h"
22 #include "Scierror.h"
23 #include "strsubst.h"
24 #include "freeArrayOfString.h"
25 #include "expandPathVariable.h"
26
27 int sci_addlocalizationdomain(char *fname, void* pvApiCtx)
28 {
29     SciErr sciErr;
30     int* piAddr1 = NULL;
31     char* pstDomain = NULL;
32
33     int* piAddr2 = NULL;
34     char* pstPath = NULL;
35     char* expandedPath = NULL;
36
37     char* pstRet = NULL;
38
39     int iRhs = nbInputArgument(pvApiCtx);
40     int iLhs = nbOutputArgument(pvApiCtx);
41
42
43     CheckInputArgument(pvApiCtx, 2, 2);
44     CheckOutputArgument(pvApiCtx, 1, 1);
45
46     //get domain name
47     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
48     if (sciErr.iErr)
49     {
50         printError(&sciErr, 0);
51         Scierror(999, _("%s: Can not read input argument #%d.\n"), "addlocalizationdomain", 1);
52         return 0;
53     }
54
55     if (isStringType(pvApiCtx, piAddr1) == 0 || isScalar(pvApiCtx, piAddr1) == 0)
56     {
57         Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), "addlocalizationdomain", 1);
58         return 0;
59     }
60
61     if (getAllocatedSingleString(pvApiCtx, piAddr1, &pstDomain))
62     {
63         Scierror(999, _("%s: Memory allocation error.\n"), "addlocalizationdomain");
64         return 0;
65     }
66
67     //get domain path
68     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
69     if (sciErr.iErr)
70     {
71         printError(&sciErr, 0);
72         Scierror(999, _("%s: Can not read input argument #%d.\n"), "addlocalizationdomain", 2);
73         freeAllocatedSingleString(pstDomain);
74         return 0;
75     }
76
77     if (isStringType(pvApiCtx, piAddr2) == 0 || isScalar(pvApiCtx, piAddr2) == 0)
78     {
79         Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), "addlocalizationdomain", 2);
80         freeAllocatedSingleString(pstDomain);
81         return 0;
82     }
83
84     if (getAllocatedSingleString(pvApiCtx, piAddr2, &pstPath))
85     {
86         Scierror(999, _("%s: Memory allocation error.\n"), "addlocalizationdomain");
87         freeAllocatedSingleString(pstDomain);
88         return 0;
89     }
90
91     expandedPath = expandPathVariable(pstPath);
92     pstRet = bindtextdomain(pstDomain, expandedPath);
93
94     freeAllocatedSingleString(pstPath);
95     FREE(expandedPath);
96
97     if (pstRet == NULL)
98     {
99         Scierror(999, _("%s: Unable to add new domain %s.\n"), "addlocalizationdomain", pstDomain);
100         freeAllocatedSingleString(pstDomain);
101         return 0;
102     }
103
104     bind_textdomain_codeset (pstDomain, "UTF-8"); /*such that gettext and dgettext return UTF8 string*/
105
106     if (createScalarBoolean(pvApiCtx, iRhs + 1, 1))
107     {
108         Scierror(999, _("%s: Unable to add new domain %s.\n"), "addlocalizationdomain", pstDomain);
109         freeAllocatedSingleString(pstDomain);
110         return 0;
111     }
112
113     freeAllocatedSingleString(pstDomain);
114     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
115     ReturnArguments(pvApiCtx);
116     return 0;
117 }