Merge commit 'refs/remotes/origin/5.1'
[scilab.git] / scilab / modules / fileio / sci_gateway / c / sci_mfprintf.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA
4  * ...
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 "Scierror.h"
14 #include "stack-c.h"
15 #include "do_xxprintf.h"
16 #include "gw_fileio.h"
17 #include "filesmanagement.h"
18 #include "localization.h"
19 #include "BOOL.h"
20 #include "scilabmode.h"
21 /*--------------------------------------------------------------------------*/ 
22 #ifdef _MSC_VER
23 static BOOL forceSTDERRredirect = TRUE;
24 #endif
25 /*--------------------------------------------------------------------------*/ 
26 int sci_fprintf(char *fname,unsigned long fname_len)
27 {
28         FILE *f;
29         BOOL isSTD = FALSE;
30         int fileMode = 0;
31         int l1 = 0, m1 = 0, n1 = 0;
32         int l2 = 0,m2 = 0,n2 = 0;
33         int lcount = 0,rval = 0, mx = 0, mk = 0, nk = 0, k = 0;
34         char *ptrFormat = NULL;
35         int i = 0;
36         int NumberPercent = 0;
37         int param1 = 0;
38
39         Nbvars = 0;
40         CheckRhs(1, 1000);
41         CheckLhs(0, 1);
42         if ( Rhs < 2 ) 
43         { 
44                 Scierror(999, _("%s: Wrong number of input arguments: At least %d expected.\n"),fname,2);
45                 return 0;
46         }
47         for ( k = 3; k <= Rhs; k++) 
48         {
49                 if (VarType(k) !=sci_matrix && VarType(k) !=sci_strings) 
50                 {
51                         OverLoad(k);
52                         return 0;
53                 }
54         }
55         GetRhsVar(1, MATRIX_OF_INTEGER_DATATYPE, &m1, &n1, &l1); /* file id */
56         GetRhsVar(2, STRING_DATATYPE, &m2, &n2, &l2); /* format */
57         ptrFormat = cstk(l2);
58
59         param1 = *istk(l1);
60
61         switch (param1)
62         {
63         case 0:
64                 #ifdef _MSC_VER
65                 if ( (getScilabMode()  == SCILAB_STD) && (forceSTDERRredirect == TRUE) )
66                 {
67                         /*  Console redirect stderr --> CONOUT$*/
68                         freopen("CONOUT$", "wb", stderr); 
69                         forceSTDERRredirect = FALSE;
70                 }
71                 #endif
72                 f = stderr;
73                 break;
74         case 5:
75                 // stdin; 
76                 f = (FILE *)0;
77                 break;
78         case 6:
79                 f = stdout;
80                 break;
81         default:
82                 f = GetFileOpenedInScilab(param1);
83                 break;
84         }
85
86         if (f == (FILE *)0 )
87         {
88                 Scierror(999,_("%s: Wrong file descriptor: %d.\n"),fname,*istk(l1));
89                 return 0;
90         }
91
92         switch (param1)
93         {
94         case 0: case 6:
95                 isSTD = TRUE;
96                 break;
97         default:
98                 isSTD = FALSE;
99                 fileMode = GetFileModeOpenedInScilab(param1);
100                 break;
101         }
102
103         
104         /* checks file mode */
105         /* bug 3898 */
106         /* read only attrib 1xx*/
107         if ( (fileMode >= 100) && (fileMode < 200) && !isSTD)
108         {
109                 Scierror(999,_("%s: Wrong file mode: READ only.\n"),fname);
110                 return 0;
111         }
112
113         for(i = 0; i < (int)strlen(ptrFormat); i++)
114         {
115                 if (ptrFormat[i] == '%') 
116                 {
117                         NumberPercent++;
118                         if (ptrFormat[i+1] == '%') 
119                         {
120                                 NumberPercent--;
121                                 i++;
122                         }
123                 }
124         }
125
126         if (NumberPercent < Rhs-2)
127         {
128                 Scierror(999,_("%s: Wrong number of input arguments: %d expected.\n"),fname,NumberPercent+2);
129                 return 0;
130         }
131
132         mx = 0;
133         if (Rhs >= 3) 
134         {
135                 GetMatrixdims(3, &mx, &nk);
136                 for (k = 4; k <= Rhs; k++) 
137                 {
138                         GetMatrixdims(k, &mk, &nk);
139                         mx = Min(mx, mk);
140                 }
141         }
142         lcount = 1;
143         if (Rhs == 2) 
144         {
145                 rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0);
146         }
147         else while (1) 
148         {
149                 if ((rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0)) < 0) break;
150                 lcount++;
151                 if (lcount > mx) break;
152         }
153         if (rval == RET_BUG) return 0;
154         LhsVar(1) = 0; /** No return value **/
155         PutLhsVar();
156         return 0;
157
158 /*--------------------------------------------------------------------------*/