4474387031383da3e47c99e41482124f46aef194
[scilab.git] / scilab / modules / scicos_blocks / src / c / writec.c
1 /*  Scicos
2 *
3 *  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 * See the file ./license.txt
20 */
21 /*--------------------------------------------------------------------------*/
22 #include <stdio.h>
23 #include <string.h>
24 #include "scicos_print.h"
25 #include "machine.h"
26 #include "charEncoding.h"
27 #include "mput.h"
28 #include "localization.h"
29 #include "sci_malloc.h"
30 #include "dynlib_scicos_blocks.h"
31 /*--------------------------------------------------------------------------*/
32 SCICOS_BLOCKS_IMPEXP void writec(int *flag, int *nevprt,
33                                  double *t, double xd[],
34                                  double x[], int *nx,
35                                  double z[], int *nz,
36                                  double tvec[], int *ntvec,
37                                  double rpar[], int *nrpar,
38                                  int ipar[], int *nipar,
39                                  double *inptr[], int insz[],
40                                  int *nin, double *outptr[],
41                                  int outsz[], int *nout)
42 /*
43 ipar[1]   = lfil : file name length
44 ipar[2:4] = fmt  : numbers type ascii code
45 ipar[5]   = n : buffer length in number of records
46 ipar[6]   = swap
47 ipar[7:6+lfil] = character codes for file name
48 */
49
50 {
51     char str[100], type[4];
52     int job = 1, three = 3;
53     FILE *fd = NULL;
54     int n = 0, k = 0, i = 0, ierr = 0;
55     double *buffer = NULL, *record = NULL;
56
57     --ipar;
58     --z;
59     fd = (FILE *)(long)z[2];
60     buffer = (z + 3);
61     ierr = 0;
62     /*
63     k    : record counter within the buffer
64     */
65
66     if (*flag == 2 && *nevprt > 0) /* add a new record to the buffer */
67     {
68         n    = ipar[5];
69         k    = (int)z[1];
70         /* copy current record to output */
71         record = buffer + (k - 1) * (insz[0]);
72
73         for (i = 0; i < insz[0]; i++)
74         {
75             record[i] = *(inptr[0] + i);
76         }
77         if (k < n)
78         {
79             z[1] = z[1] + 1.0;
80         }
81         else  /* buffer is full write it to the file */
82         {
83             for (i = 0; i < three; ++i)
84             {
85                 type[i] = (char) ipar[i + 2];
86             }
87             for (i = 2; i >= 0; i--)
88                 if (type[i] != ' ')
89                 {
90                     type[i + 1] = '\0';
91                     break;
92                 }
93             mput2(fd, ipar[6], buffer, ipar[5]*insz[0], type, &ierr);
94             if (ierr != 0)
95             {
96                 *flag = -3;
97                 return;
98             }
99             z[1] = 1.0;
100         }
101     }
102     else if (*flag == 4)
103     {
104         for (i = 0; i < ipar[1]; ++i)
105         {
106             str[i] = (char) ipar[i + 7];
107         }
108         str[ipar[1]] = '\0';
109         wcfopen(fd, str, "wb");
110         if (!fd )
111         {
112             scicos_print(_("Could not open the file!\n"));
113             *flag = -3;
114             return;
115         }
116         z[2] = (long)fd;
117         z[1] = 1.0;
118     }
119     else if (*flag == 5)
120     {
121         if (z[2] == 0)
122         {
123             return;
124         }
125         k    = (int) z[1];
126         if (k >= 1) /* flush rest of buffer */
127         {
128             for (i = 0; i < three; ++i)
129             {
130                 type[i] = (char) ipar[i + 2];
131             }
132             for (i = 2; i >= 0; i--)
133                 if (type[i] != ' ')
134                 {
135                     type[i + 1] = '\0';
136                     break;
137                 }
138             mput2(fd, ipar[6], buffer, (k - 1)*insz[0], type, &ierr);
139             if (ierr != 0)
140             {
141                 *flag = -3;
142                 return;
143             }
144         }
145         fclose(fd);
146         z[2] = 0.0;
147     }
148     return;
149 }
150 /*--------------------------------------------------------------------------*/
151