52d87a979a13cd703e941f7734bbafcbf5530cf1
[scilab.git] / scilab / modules / output_stream / sci_gateway / c / sci_msprintf.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA
4 * Copyright (C) DIGITEO - 2010 - Allan CORNET
5
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at    
10 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 *
12 */
13 #include "gw_output_stream.h"
14 #include "Scierror.h"
15 #include "MALLOC.h"
16 #include "stack-c.h"
17 #include "do_xxprintf.h"
18 #include "localization.h"
19 #include "freeArrayOfString.h"
20 #include "strsubst.h"
21 /*--------------------------------------------------------------------------*/
22 int sci_msprintf(char *fname,unsigned long fname_len)
23 {
24     char **lstr = NULL;
25     static int l1 = 0, m1 = 0, n1 = 0, n2 = 0, lcount = 0, rval = 0, blk = 200;
26     static int k = 0;
27     char ** strs = NULL;
28     char *str = NULL, *str1 = NULL;
29     int n = 0, nmax = 0, cat_to_last = 0, ll = 0;
30
31     char *ptrFormat   = NULL;
32     int i             = 0;
33     int NumberPercent = 0;
34     int NumberCols    = 0;
35
36     Nbvars = 0;
37     CheckRhs(1,1000);
38     CheckLhs(0,1);
39
40     if ( Rhs < 1 )
41     {
42         Scierror(999,_("%s: Wrong number of input arguments: at least %d expected.\n"),fname,1);
43         return 0;
44     }
45
46     for (k=2;k<=Rhs;k++)
47     {
48         if ( (VarType(k) != sci_matrix) && (VarType(k) != sci_strings) )
49         {
50             OverLoad(k);
51             return 0;
52         }
53     }
54
55     GetRhsVar(1,STRING_DATATYPE,&m1,&n1,&l1);
56
57     ptrFormat = strsub(cstk(l1), "\\t", "\t");
58
59     for( i=0; i<(int)strlen(ptrFormat); i++)
60     {
61         if (ptrFormat[i]=='%')
62         {
63             NumberPercent++;
64             if (ptrFormat[i+1]=='%')
65             {
66                 NumberPercent--;i++;
67             }
68         }
69     }
70
71     if ( (Rhs - 1) > NumberPercent )
72     {
73         if (ptrFormat)
74         {
75             FREE(ptrFormat);
76             ptrFormat = NULL;
77         }
78         Scierror(999,_("%s: Wrong number of input arguments: at most %d expected.\n"),fname,NumberPercent);
79         return 0;
80     }
81
82     if( Rhs > 1 )
83     {
84         for( i = 2 ; i <= Rhs ; i++ )
85         {
86             int mk = 0;
87             int nk = 0;
88             GetMatrixdims(i,&mk,&nk);
89             NumberCols += nk;
90         }
91     }
92
93     if ( NumberCols != NumberPercent )
94     {
95         if (ptrFormat)
96         {
97             FREE(ptrFormat);
98             ptrFormat = NULL;
99         }
100         Scierror(999,_("%s: Wrong number of input arguments: data doesn't fit with format.\n"),fname);
101         return 0;
102     }
103
104     n           = 0; /* output line counter */
105     nmax        = 0;
106     strs        = NULL;
107     lcount      = 1;
108     cat_to_last = 0;
109
110     while (1)
111     {
112         if ((rval = do_xxprintf("msprintf",(FILE *) 0, ptrFormat, Rhs, 1, lcount,(char **) &lstr)) < 0) break;
113
114         lcount++;
115         str =(char *) lstr;
116         if ( str == NULL )
117         {
118             if (ptrFormat)
119             {
120                 FREE(ptrFormat);
121                 ptrFormat = NULL;
122             }
123             Scierror(999,_("%s: Wrong value of input argument %d: data doesn't fit with format.\n"),fname,1);
124             return 0;
125         }
126         str1 = str;
127         while (*str != '\0')  
128         {
129             if (strncmp(str,"\\n",2) ==0) 
130             {
131                 k = (int)(str - str1);
132                 if (! cat_to_last) 
133                 { 
134                     /*add a new line */
135                     if (n==nmax) 
136                     {
137                         nmax+=blk;
138                         if (strs) 
139                         {
140                             strs = (char **) REALLOC(strs,nmax*sizeof(char **));
141                         } 
142                         else 
143                         {
144                             strs = (char **) MALLOC(nmax*sizeof(char **));
145                         }
146
147                         if ( strs == NULL) 
148                         {
149                             if (ptrFormat)
150                             {
151                                 FREE(ptrFormat);
152                                 ptrFormat = NULL;
153                             }
154
155                             Scierror(999,_("%s: No more memory.\n"),fname);
156                             return 0;
157                         }
158                     }
159                     if ((strs[n]=MALLOC((k+1))) == NULL) 
160                     {
161                         if (ptrFormat)
162                         {
163                             FREE(ptrFormat);
164                             ptrFormat = NULL;
165                         }
166
167                         Scierror(999,_("%s: No more memory.\n"),fname);
168                         return 0;
169                     }
170                     strncpy(strs[n],str1, k);
171                     strs[n][k]='\0';
172                     n++;
173                 }
174                 else 
175                 { /* cat to previous line */
176                     ll=(int)strlen(strs[n-1]);
177                     if ((strs[n-1]=REALLOC(strs[n-1],(k+1+ll))) == NULL) 
178                     {
179                         if (ptrFormat)
180                         {
181                             FREE(ptrFormat);
182                             ptrFormat = NULL;
183                         }
184
185                         Scierror(999,_("%s: No more memory.\n"),fname);
186                         return 0;
187                     }
188                     strncpy(&(strs[n-1][ll]),str1, k);
189                     strs[n-1][k+ll]='\0';
190                 }
191                 k=0;
192                 str+=2;
193                 str1=str;
194                 cat_to_last=0;
195             }
196             else
197             {
198                 str++;
199             }
200         }
201         k=(int)(str-str1); /* @TODO add comment */
202         if (k>0) {
203             if ((! cat_to_last) || (n == 0)) { /*add a new line */
204                 if (n==nmax) 
205                 {
206                     nmax+=blk;
207                     if (strs)
208                     {
209                         if ((strs = (char **) REALLOC(strs,nmax*sizeof(char **))) == NULL) 
210                         {
211                             if (ptrFormat)
212                             {
213                                 FREE(ptrFormat);
214                                 ptrFormat = NULL;
215                             }
216
217                             Scierror(999,_("%s: No more memory.\n"),fname);
218                             return 0;
219                         }
220                     }
221                     else
222                     {
223                         if ( (strs = (char **) MALLOC(nmax*sizeof(char **))) == NULL) 
224                         {
225                             if (ptrFormat)
226                             {
227                                 FREE(ptrFormat);
228                                 ptrFormat = NULL;
229                             }
230
231                             Scierror(999,_("%s: No more memory.\n"),fname);
232                             return 0;
233                         }
234                     }
235
236                 }
237
238                 if ((strs[n]=MALLOC((k+1))) == NULL) 
239                 {
240                     if (ptrFormat)
241                     {
242                         FREE(ptrFormat);
243                         ptrFormat = NULL;
244                     }
245
246                     Scierror(999,_("%s: No more memory.\n"),fname);
247                     return 0;
248                 }
249                 strncpy(strs[n],str1, k);
250                 strs[n][k]='\0';
251                 n++;
252
253             }
254             else { /* cat to previous line */
255                 ll=(int)strlen(strs[n-1]);
256                 if ((strs[n-1]=REALLOC(strs[n-1],(k+1+ll))) == NULL) 
257                 {
258                     if (ptrFormat)
259                     {
260                         FREE(ptrFormat);
261                         ptrFormat = NULL;
262                     }
263
264                     Scierror(999,_("%s: No more memory.\n"),fname);
265                     return 0;
266                 }
267                 strncpy(&(strs[n-1][ll]),str1, k);
268                 strs[n-1][k+ll]='\0';
269             }
270         }
271         if (strncmp(str-2,"\\n",2) !=0) cat_to_last=1;
272         if (Rhs == 1) break;
273
274     }
275
276     if (ptrFormat)
277     {
278         FREE(ptrFormat);
279         ptrFormat = NULL;
280     }
281
282     if (rval == RET_BUG) return 0;
283     /** Create a Scilab String : lstr must not be freed **/
284     n2=1;
285     CreateVarFromPtr(Rhs+1,MATRIX_OF_STRING_DATATYPE, &n, &n2, strs);
286
287     freeArrayOfString(strs, n);
288
289     LhsVar(1)=Rhs+1;
290     PutLhsVar();
291     return 0;
292 }
293 /*--------------------------------------------------------------------------*/