Coverity: completion module resource leaks fixed
[scilab.git] / scilab / modules / completion / src / cpp / UnknownMlistFieldsGetter.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
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 "FieldsManager.hxx"
17 #include "UnknownMlistFieldsGetter.hxx"
18
19 extern "C"
20 {
21 #include "freeArrayOfString.h"
22 #include "api_scilab.h"
23 #include "sci_malloc.h"
24 }
25
26 namespace org_modules_completion
27 {
28
29 const char ** UnknownMlistFieldsGetter::getFieldsName(const std::string & typeName, int * mlist, char ** fieldPath, const int fieldPathLen, int * fieldsSize) const
30 {
31     return getFieldsName(mlist, fieldPath + 1, fieldPathLen - 1, fieldsSize);
32 }
33
34 const char ** UnknownMlistFieldsGetter::getFieldsName(int * mlist, char ** fieldPath, const int fieldPathLen, int * fieldsSize)
35 {
36     int rows;
37     int cols;
38     int rc;
39     int * piLen = 0;
40     char ** pstData = 0;
41     int nbItem;
42     int * fieldsAddr = 0;
43     SciErr sciErr;
44     const char ** fields = 0;
45
46     *fieldsSize = 0;
47
48     sciErr = getListItemNumber(NULL, mlist, &nbItem);
49     if (sciErr.iErr)
50     {
51         return 0;
52     }
53
54     if (nbItem == 0)
55     {
56         return 0;
57     }
58
59     sciErr = getListItemAddress(NULL, mlist, 1, &fieldsAddr);
60     if (sciErr.iErr)
61     {
62         return 0;
63     }
64
65     if (getAllocatedMatrixOfString(NULL, fieldsAddr, &rows, &cols, &pstData))
66     {
67         return 0;
68     }
69
70     rc = rows * cols;
71     if (rc == 1)
72     {
73         freeArrayOfString(pstData, rc);
74         return 0;
75     }
76
77     if (fieldPathLen == 0)
78     {
79         *fieldsSize = rc - 1;
80         fields = (const char **)MALLOC(sizeof(char *) **fieldsSize);
81         memcpy(fields, pstData + 1, sizeof(char *) **fieldsSize);
82         FREE(pstData[0]);
83         FREE(pstData);
84
85         return fields;
86     }
87
88     for (int i = 1; i < rc; i++)
89     {
90         if (!strcmp(pstData[i], fieldPath[0]))
91         {
92             freeArrayOfString(pstData, rc);
93             int * itemAddr = 0;
94             sciErr = getListItemAddress(NULL, mlist, i + 1, &itemAddr);
95             if (sciErr.iErr)
96             {
97                 return 0;
98             }
99
100             return FieldsManager::getFields(itemAddr, fieldPath, fieldPathLen, fieldsSize);
101         }
102     }
103     freeArrayOfString(pstData, rc);
104
105     return 0;
106 }
107 }