bug 3898 3897 3896 3895
[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 /*--------------------------------------------------------------------------*/ 
20 int int_objfprintf(char *fname,unsigned long fname_len)
21 {
22         FILE *f;
23         int fileMode = 0;
24         int l1 = 0, m1 = 0, n1 = 0;
25         int l2 = 0,m2 = 0,n2 = 0;
26         int lcount = 0,rval = 0, mx = 0, mk = 0, nk = 0, k = 0;
27         char *ptrFormat = NULL;
28         int i = 0;
29         int NumberPercent = 0;
30         int param1 = 0;
31
32         Nbvars = 0;
33         CheckRhs(1, 1000);
34         CheckLhs(0, 1);
35         if ( Rhs < 2 ) 
36         { 
37                 Scierror(999, _("%s: Wrong number of input arguments: At least %d expected.\n"),fname,2);
38                 return 0;
39         }
40         for ( k = 3; k <= Rhs; k++) 
41         {
42                 if (VarType(k) !=sci_matrix && VarType(k) !=sci_strings) 
43                 {
44                         OverLoad(k);
45                         return 0;
46                 }
47         }
48         GetRhsVar(1, MATRIX_OF_INTEGER_DATATYPE, &m1, &n1, &l1); /* file id */
49         GetRhsVar(2, STRING_DATATYPE, &m2, &n2, &l2); /* format */
50         ptrFormat = cstk(l2);
51
52         param1 = *istk(l1);
53
54         f = GetFileOpenedInScilab(param1);
55         if (f == (FILE *)0)
56         {
57                 Scierror(999,_("%s: Wrong file descriptor: %d.\n"),fname,*istk(l1));
58                 return 0;
59         }
60
61         fileMode = GetFileModeOpenedInScilab(param1);
62         /* checks file mode */
63         /* bug 3898 */
64         /* read only attrib 1xx*/
65         if ( (fileMode >= 100) && (fileMode < 200) )
66         {
67                 Scierror(999,_("%s: Wrong file mode: READ only.\n"),fname);
68                 return 0;
69         }
70
71         for(i = 0; i < (int)strlen(ptrFormat); i++)
72         {
73                 if (ptrFormat[i] == '%') 
74                 {
75                         NumberPercent++;
76                         if (ptrFormat[i+1] == '%') 
77                         {
78                                 NumberPercent--;
79                                 i++;
80                         }
81                 }
82         }
83
84         if (NumberPercent < Rhs-2)
85         {
86                 Scierror(999,_("%s: Wrong number of input arguments: %d expected.\n"),fname,NumberPercent+2);
87                 return 0;
88         }
89
90         mx = 0;
91         if (Rhs >= 3) 
92         {
93                 GetMatrixdims(3, &mx, &nk);
94                 for (k = 4; k <= Rhs; k++) 
95                 {
96                         GetMatrixdims(k, &mk, &nk);
97                         mx = Min(mx, mk);
98                 }
99         }
100         lcount = 1;
101         if (Rhs == 2) 
102         {
103                 rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0);
104         }
105         else while (1) 
106         {
107                 if ((rval = do_xxprintf("fprintf", f, cstk(l2), Rhs, 2, lcount, (char **)0)) < 0) break;
108                 lcount++;
109                 if (lcount > mx) break;
110         }
111         if (rval == RET_BUG) return 0;
112         LhsVar(1) = 0; /** No return value **/
113         PutLhsVar();
114         return 0;
115
116 /*--------------------------------------------------------------------------*/