Fix a typo. fisrt => first
[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 - Scilab Consortium Operational Team
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution. The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "api_scilab.h"
14 #include "Scierror.h"
15 #include "localization.h"
16 #include "sciprint.h"
17 #include "MALLOC.h"
18
19 int read_string(char *fname, unsigned long fname_len)
20 {
21     SciErr sciErr;
22     int i, j;
23     int iLen            = 0;
24     //variable info
25     int iRows           = 0;
26     int iCols           = 0;
27     int* piAddr         = NULL;
28     int* piLen          = NULL;
29     char** pstData      = NULL;
30     //output variable
31     int iRowsOut        = 1;
32     int iColsOut        = 1;
33     char* pstOut        = NULL;
34     //check input and output arguments
35
36     CheckInputArgument(pvApiCtx, 1, 1);
37     CheckOutputArgument(pvApiCtx, 1, 1);
38
39     //get variable address
40     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
41     if (sciErr.iErr)
42     {
43         printError(&sciErr, 0);
44         return 0;
45     }
46
47     //first call to retrieve dimensions
48     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL);
49     if (sciErr.iErr)
50     {
51         printError(&sciErr, 0);
52         return 0;
53     }
54
55     piLen = (int*)malloc(sizeof(int) * iRows * iCols);
56
57     //second call to retrieve length of each string
58     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, NULL);
59     if (sciErr.iErr)
60     {
61         printError(&sciErr, 0);
62         return 0;
63     }
64
65     pstData = (char**)malloc(sizeof(char*) * iRows * iCols);
66     for (i = 0 ; i < iRows * iCols ; i++)
67     {
68         pstData[i] = (char*)malloc(sizeof(char) * (piLen[i] + 1));//+ 1 for null termination
69     }
70
71     //third call to retrieve data
72     sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, pstData);
73     if (sciErr.iErr)
74     {
75         printError(&sciErr, 0);
76         return 0;
77     }
78
79     //computer length of all strings
80     for (i = 0 ; i < iRows * iCols ; i++)
81     {
82         iLen += piLen[i];
83     }
84
85     //alloc output variable
86     pstOut = (char*)malloc(sizeof(char) * (iLen + iRows * iCols));
87     //initialize string to 0x00
88     memset(pstOut, 0x00, sizeof(char) * (iLen + iRows * iCols));
89
90     //concat input strings in output string
91     for (i = 0 ; i < iRows ; i++)
92     {
93         for (j = 0 ; j < iCols ; j++)
94         {
95             int iCurLen = strlen(pstOut);
96             if (iCurLen)
97             {
98                 strcat(pstOut, " ");
99             }
100             strcpy(pstOut + strlen(pstOut), pstData[j * iRows + i]);
101         }
102     }
103
104     //create new variable
105     sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + + 1, iRowsOut, iColsOut, &pstOut);
106     if (sciErr.iErr)
107     {
108         printError(&sciErr, 0);
109         return 0;
110     }
111
112     //free memory
113     free(piLen);
114
115     for (i = 0 ; i < iRows * iCols ; i++)
116     {
117         free(pstData[i]);
118     }
119
120     free(pstData);
121     free(pstOut);
122     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + + 1;
123     return 0;
124 }