17e625479a8779162c8d2bfdb13e32c0d4782db3
[scilab.git] / scilab / modules / api_scilab / tests / unit_tests / string_reading_api.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2010 - DIGITEO
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 "api_scilab.h"
17 #include "Scierror.h"
18 #include "localization.h"
19 #include "sciprint.h"
20 #include "sci_malloc.h"
21
22 int read_string(char *fname, void* pvApiCtx)
23 {
24     SciErr sciErr;
25     int i, j;
26     int iLen            = 0;
27     //variable info
28     int iRows           = 0;
29     int iCols           = 0;
30     int* piAddr         = NULL;
31     int* piLen          = NULL;
32     char** pstData      = NULL;
33     //output variable
34     int iRowsOut        = 1;
35     int iColsOut        = 1;
36     char* pstOut        = NULL;
37     //check input and output arguments
38
39     CheckInputArgument(pvApiCtx, 1, 1);
40     CheckOutputArgument(pvApiCtx, 1, 1);
41
42     //get variable address
43     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
44     if (sciErr.iErr)
45     {
46         printError(&sciErr, 0);
47         return 0;
48     }
49
50     //first call to retrieve dimensions
51     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL);
52     if (sciErr.iErr)
53     {
54         printError(&sciErr, 0);
55         return 0;
56     }
57
58     piLen = (int*)MALLOC(sizeof(int) * iRows * iCols);
59
60     //second call to retrieve length of each string
61     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, NULL);
62     if (sciErr.iErr)
63     {
64         printError(&sciErr, 0);
65         return 0;
66     }
67
68     pstData = (char**)MALLOC(sizeof(char*) * iRows * iCols);
69     for (i = 0 ; i < iRows * iCols ; i++)
70     {
71         pstData[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));//+ 1 for null termination
72     }
73
74     //third call to retrieve data
75     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, pstData);
76     if (sciErr.iErr)
77     {
78         printError(&sciErr, 0);
79         return 0;
80     }
81
82     //computer length of all strings
83     for (i = 0 ; i < iRows * iCols ; i++)
84     {
85         iLen += piLen[i];
86     }
87
88     //alloc output variable
89     pstOut = (char*)MALLOC(sizeof(char) * (iLen + iRows * iCols));
90     //initialize string to 0x00
91     memset(pstOut, 0x00, sizeof(char) * (iLen + iRows * iCols));
92
93     //concat input strings in output string
94     for (i = 0 ; i < iRows ; i++)
95     {
96         for (j = 0 ; j < iCols ; j++)
97         {
98             int iCurLen = strlen(pstOut);
99             if (iCurLen)
100             {
101                 strcat(pstOut, " ");
102             }
103             strcpy(pstOut + strlen(pstOut), pstData[j * iRows + i]);
104         }
105     }
106
107     //create new variable
108     sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRowsOut, iColsOut, &pstOut);
109     if (sciErr.iErr)
110     {
111         printError(&sciErr, 0);
112         return 0;
113     }
114
115     //free memory
116     FREE(piLen);
117
118     for (i = 0 ; i < iRows * iCols ; i++)
119     {
120         FREE(pstData[i]);
121     }
122
123     FREE(pstData);
124     FREE(pstOut);
125     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
126     return 0;
127 }