05c6746fd1c93e26f8b861799b54eadb5fa7447d
[scilab.git] / scilab / modules / matio / src / c / CreateCharVariable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
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 <string.h>
17
18 #include "api_scilab.h"
19 #include "CreateMatlabVariable.h"
20 #include "freeArrayOfString.h"
21 #include "os_string.h"
22 #include "sci_malloc.h"
23 #include "localization.h"
24 #include "Scierror.h"
25
26 int CreateCharVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
27 {
28     int nbRow = 0, nbCol = 0;
29     char **charData = NULL;
30     int K = 0, L = 0;
31     SciErr sciErr;
32
33     if (matVariable->rank == 2) /* 2-D array */
34     {
35         nbRow = (int)matVariable->dims[0];
36         nbCol = nbRow == 0 ? 0 : 1; /* In Scilab empty string has size 0x0 */
37
38         if (nbRow != 0)
39         {
40             charData =  (char**) MALLOC(sizeof(char*) * nbRow);
41             if (charData == NULL)
42             {
43                 Scierror(999, _("%s: No more memory.\n"), "CreateCharVariable");
44                 return FALSE;
45             }
46         }
47
48         for (K = 0; K < nbRow; K++)
49         {
50             charData[K] =  (char*) MALLOC(sizeof(char*) * (matVariable->dims[1] + 1));
51             if (charData[K] == NULL)
52             {
53                 Scierror(999, _("%s: No more memory.\n"), "CreateCharVariable");
54                 return FALSE;
55             }
56         }
57
58         /* Fill items: data in Matlab file is stored columnwise */
59         for (K = 0; K < (int)matVariable->dims[0]; K++) /* Loop over items */
60         {
61             for (L = 0; L < (int)matVariable->dims[1]; L++) /* Loop over chars */
62             {
63                 charData[K][L] = ((char *)matVariable->data)[L * matVariable->dims[0] + K];
64             }
65             charData[K][L] = '\0';
66         }
67
68         if (nbRow * nbCol != 0)
69         {
70             if (parent == NULL)
71             {
72                 sciErr = createMatrixOfString(pvApiCtx, iVar, nbRow, nbCol, charData);
73                 if (sciErr.iErr)
74                 {
75                     printError(&sciErr, 0);
76                     return 0;
77                 }
78             }
79             else
80             {
81                 sciErr = createMatrixOfStringInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, charData);
82                 if (sciErr.iErr)
83                 {
84                     printError(&sciErr, 0);
85                     return 0;
86                 }
87             }
88         }
89         else /* Empty character string */
90         {
91             if (parent == NULL)
92             {
93                 createSingleString(pvApiCtx, iVar, "\0");
94             }
95             else
96             {
97                 char ** tmp_char = (char **)MALLOC(sizeof(char *));
98                 tmp_char[0] = os_strdup("\0");
99                 sciErr = createMatrixOfStringInList(pvApiCtx, iVar, parent, item_position, 1, 1, tmp_char);
100                 if (sciErr.iErr)
101                 {
102                     printError(&sciErr, 0);
103                     return 0;
104                 }
105                 freeArrayOfString(tmp_char, 1);
106             }
107         }
108
109         freeArrayOfString(charData, nbRow * nbCol);
110     }
111     else /* Multi-dimension array -> Scilab HyperMatrix */
112     {
113         Scierror(999, _("%s: N-D arrays of chars not implemented.\n"), "CreateCharVariable");
114         return FALSE;
115     }
116
117     return TRUE;
118 }