source: trunk/mesoscale/LMD_MM_MARS/SRC/WPS/ungrib/src/cio.c @ 87

Last change on this file since 87 was 11, checked in by aslmd, 14 years ago

spiga@svn-planeto:ajoute le modele meso-echelle martien

File size: 7.0 KB
Line 
1/*  FILE: cio.c  */
2/*  C functions to write bytes to UNIX files - called from FORTRAN */
3/*  copen
4    bnread
5    bnwrit
6    cclose */
7/*  bsrfil */
8/*  870417  */
9
10#if defined(CRAY)
11
12#define copen COPEN
13#define cclose CCLOSE
14#define bnread BNREAD
15#define bnseek BNSEEK
16
17#endif
18
19/* length of the char string from the fortran file is 132, plus one for null terminator */
20#define FORT_FILE_LEN 133
21
22#if defined (SGI) || defined (SOLARIS) || defined (SUN) || defined (DEC) || defined (ALPHA) || defined (_UNDERSCORE) || defined (LINUX) || defined (LINUXG95)
23
24#define copen copen_
25#define cclose cclose_
26#define bnread bnread_
27#define bnseek bnseek_
28
29#endif
30
31#include <stdio.h>
32#include <fcntl.h>
33#include <errno.h>
34#include <sys/types.h>
35#include <unistd.h>
36#include <sys/ioctl.h>
37#include <sys/uio.h>
38
39/* ****************************************************************** */
40
41copen(unit, nunit, name, mode, err, oflag)
42 /*
43  * unit  = Fortran unit number
44  * nunit = UNIX file descriptor associated with 'unit'
45  * name  = UNIX file name
46  * mode  = 0 : write only - file will be created if it doesn't exist,
47                           - otherwise will be rewritten
48          = 1 : read only
49          = 2 : read/write
50  * err   = 0 : no error opening file.
51         != 0 : Error opening file
52  * oflag =  0 : no notification if file opened OK (errors are printed)
53          =  1 : file name and unit number printed (and errors)
54          = -1 : no print at all (not even errors)
55  */
56    int             *unit;
57    int             *nunit;
58    int             *mode;
59    int             *err;
60    int             *oflag;
61    char            name[FORT_FILE_LEN];
62{
63    int             fd, i;
64    char            fname[FORT_FILE_LEN];
65    extern int      errno;      /* I/O error return */
66
67    if (*oflag >= 1)
68        printf("Copen: File = %s\nFortran Unit = %d\n", name, *unit);
69
70    /* strip trailing blanks and add null character to name */
71    for (i = 0; name[i] != ' ' && name[i] != '\0' && i < FORT_FILE_LEN; ++i)
72        fname[i] = name[i];
73    fname[i] = '\0';
74
75/* if (*mode == 0)    WRITE ONLY
76   printf ("UNIX File descriptor: %d\n", fd = open (fname, O_WRONLY));
77     printf ("UNIX File descriptor: %d\n", fd = creat (fname, 0777));
78   else if (*mode == 1)   READ ONLY
79     printf ("UNIX File descriptor: %d\n", fd = open (fname, O_RDONLY));
80   else   READ/WRITE
81     printf ("UNIX File descriptor: %d\n", fd = open (fname, O_RDWR));*/
82
83    if (*mode == 0)             /* WRITE ONLY */
84        fd = creat(fname, 0777);
85    else if (*mode == 1)        /* READ ONLY */
86        fd = open(fname, O_RDONLY);
87    else                        /* READ/WRITE */
88        fd = open(fname, O_RDWR);
89    if (*oflag >= 1)
90        printf("UNIX File descriptor: %d\n\n", fd);
91
92    *err = 0;
93    if (fd == -1) {             /* error opening file */
94      if (*oflag >= 0){
95        printf("Error opening %s  Error status: %d\n", fname, errno);
96        perror("copen.c");
97      };
98      *err = errno;
99    };
100
101    *nunit = fd;
102    return (0);
103}
104
105/* ****************************************************************** */
106bnseek(fd, bread, mode, iprint)
107
108/*  Move the read/write file pointer
109       fd     : Unix file descriptor.
110       bread  : Number of bytes to move the pointer.
111       mode   : How to move the pointer:
112               = 0 : move the pointer ahead BREAD bytes.
113               < 0 : move the pointer to location BREAD.
114               > 0 : move the pointer to the end + BREAD bytes. (?)
115       iprint : Flag to turn on (iprint = 1)  or off (iprint = 0) print.
116
117   Location 0 [bnseek(fd,0,-1,0)] puts us just before the first byte,
118   so the next bnread will get byte 1.
119*/
120
121    int            *fd, *bread, *mode, *iprint;
122
123{
124    off_t           i, offset;
125    int             how_to_space;
126
127    if (*mode == 0)
128        how_to_space = SEEK_CUR;
129    else if (*mode < 0)
130        how_to_space = SEEK_SET;
131    else
132        how_to_space = SEEK_END;
133
134    offset = *bread;
135    i = lseek(*fd, offset, how_to_space);
136    if (*iprint != 0) 
137       printf(" lseek return=%d, *mode=%d\n", i, *mode);
138
139    return(0);
140}
141
142/* ****************************************************************** */
143
144bnread(fd, buf, nbuf, bread, ios, idiag)
145 /*
146  * fd = UNIX file descriptor number (NOT a Fortran unit)
147  * buf = area into which to read
148  * nbuf = number of bytes to read from fd
149  * bread = number actually read
150  * ios = error number returned to Fortran:
151          1 = End of File
152          2 = Error in reading
153  * idiag : if non-zero, error and EOF messages will be printed
154  */
155
156    int            *fd, *nbuf, buf[], *bread, *ios, *idiag;
157{
158    int             bytesread;
159
160/*  printf ("BNREAD Fd = %d Nbuf = %d\n", *fd, *nbuf);  */
161    bytesread = read(*fd, buf, *nbuf);
162/*  printf ("Bytes %d   stat %d\n", bytesread, errno);  */
163
164    if (bytesread == -1) {      /* error reading file */
165        if (*idiag != 0)
166            printf("Error reading C unit %d\n", *fd);
167        perror("bnread.c");
168        *ios = 2;
169        /*  *ios = errno; */
170    } else if (bytesread == 0) {/* end-of-file on input */
171        if (*idiag != 0)
172            printf("End of file on C unit %d\n", *fd);
173            *ios = 1; 
174        /*  *ios = errno; */
175    } else {                    /* read OK */
176
177        /*
178         * printf ("BNREAD - bytes read = %d   Buf = %d %d %d\n", bytesread,
179         * buf[0], buf[1], buf[2]);
180         */ 
181        *ios = 0;
182    };
183
184    *bread = bytesread;
185    return(0);
186}
187
188/* ****************************************************************** */
189
190bnwrit_(fd, buf, nbuf, bwritten, err, idiag)
191    int            *fd, *nbuf, buf[], *bwritten, *err, *idiag;
192
193 /*
194  * fd = UNIX file descriptor number (NOT a Fortran unit) buf = area from
195  * which to write nbuf = number of bytes to write to fd bwritten = number
196  * actually written err = UNIX error number returned to FORTRAN idiag : if
197  * non-zero, error and EOF messages will be printed
198  */
199
200{
201    int             byteswritten;
202
203    /*
204     * printf ("BNWRIT Fd = %d Nbuf = %d   Buf = %d %d %d\n", fd, *nbuf,
205     * buf[0], buf[1], buf[2]);
206     */
207    byteswritten = write(*fd, buf, *nbuf);
208    /* printf ("Bytes %d   stat %d\n", byteswritten, errno);  */
209
210    *err = 0;
211    if (byteswritten == -1) {   /* error writing file */
212        if (*idiag != 0)
213            printf("Error writing C unit %d\n", *fd);
214        perror("bnwrit.c");
215        *err = errno;
216    };
217
218    *bwritten = byteswritten;
219    return(0);
220}
221
222/* ****************************************************************** */
223
224cclose(nunit, iprint, err)
225/*
226Close a C (UNIX?) file descriptor:
227  nunit  : (INPUT)  : The C (UNIX?) file descriptor to close.
228  iprint : (INPUT)  : Print flag ( iprint == 0 : no print on successful close)
229                                 ( iprint != 0 : Some printout)
230  err    : (OUTPUT) : Error flag ( err = 0 : Successful close)
231                                 ( err = 1 : Error on close)
232     */
233    int            *nunit, *iprint, *err;
234{
235    extern int      errno;      /* I/O error return */
236    int             istat;
237
238    if ( *iprint != 0 )
239      printf("\n *** CCLOSE : Closing file descriptor: NUNIT = %d \n", 
240             *nunit);
241
242    istat = close(*nunit);
243    if (istat == 0) {
244      if ( *iprint != 0 )
245        printf(" *** CCLOSE successful: File descriptor: NUNIT = %d \n", 
246               *nunit);
247    }
248    else
249      printf("CCLOSE error: %d : File descriptor NUNIT = %d \n", 
250             istat, *nunit);
251
252    *err = istat;
253    return(0);
254}
Note: See TracBrowser for help on using the repository browser.