Also update the URL to the CeCILL license. Thanks to Paul for noticing that
[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.1-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_mfprintf(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:
95         case 6:
96             isSTD = TRUE;
97             break;
98         default:
99             isSTD = FALSE;
100             fileMode = GetFileModeOpenedInScilab(param1);
101             break;
102     }
103
104
105     /* checks file mode */
106     /* bug 3898 */
107     /* read only attrib 1xx*/
108     if ( (fileMode >= 100) && (fileMode < 200) && !isSTD)
109     {
110         Scierror(999, _("%s: Wrong file mode: READ only.\n"), fname);
111         return 0;
112     }
113
114     for (i = 0; i < (int)strlen(ptrFormat); i++)
115     {
116         if (ptrFormat[i] == '%')
117         {
118             NumberPercent++;
119             if (ptrFormat[i + 1] == '%')
120             {
121                 NumberPercent--;
122                 i++;
123             }
124         }
125     }
126
127     if (NumberPercent < Rhs - 2)
128     {
129         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), fname, NumberPercent + 2);
130         return 0;
131     }
132
133     mx = 0;
134     if (Rhs >= 3)
135     {
136         GetMatrixdims(3, &mx, &nk);
137         for (k = 4; k <= Rhs; k++)
138         {
139             GetMatrixdims(k, &mk, &nk);
140             mx = Min(mx, mk);
141         }
142     }
143     lcount = 1;
144     if (Rhs == 2)
145     {
146         rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0);
147     }
148     else while (1)
149         {
150             if ((rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0)) < 0)
151             {
152                 break;
153             }
154             lcount++;
155             if (lcount > mx)
156             {
157                 break;
158             }
159         }
160     if (rval == RET_BUG)
161     {
162         return 0;
163     }
164     LhsVar(1) = 0; /** No return value **/
165     PutLhsVar();
166     return 0;
167 }
168 /*--------------------------------------------------------------------------*/