xref: /netbsd-src/external/gpl3/gcc.old/dist/libgfortran/io/unix.h (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1*4c3eb207Smrg /* Copyright (C) 2009-2020 Free Software Foundation, Inc.
2627f7eb2Smrg    Contributed by Janne Blomqvist
3627f7eb2Smrg 
4627f7eb2Smrg This file is part of the GNU Fortran runtime library (libgfortran).
5627f7eb2Smrg 
6627f7eb2Smrg Libgfortran is free software; you can redistribute it and/or modify
7627f7eb2Smrg it under the terms of the GNU General Public License as published by
8627f7eb2Smrg the Free Software Foundation; either version 3, or (at your option)
9627f7eb2Smrg any later version.
10627f7eb2Smrg 
11627f7eb2Smrg Libgfortran is distributed in the hope that it will be useful,
12627f7eb2Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
13627f7eb2Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14627f7eb2Smrg GNU General Public License for more details.
15627f7eb2Smrg 
16627f7eb2Smrg Under Section 7 of GPL version 3, you are granted additional
17627f7eb2Smrg permissions described in the GCC Runtime Library Exception, version
18627f7eb2Smrg 3.1, as published by the Free Software Foundation.
19627f7eb2Smrg 
20627f7eb2Smrg You should have received a copy of the GNU General Public License and
21627f7eb2Smrg a copy of the GCC Runtime Library Exception along with this program;
22627f7eb2Smrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23627f7eb2Smrg <http://www.gnu.org/licenses/>.  */
24627f7eb2Smrg 
25627f7eb2Smrg #ifndef GFOR_UNIX_H
26627f7eb2Smrg #define GFOR_UNIX_H
27627f7eb2Smrg 
28627f7eb2Smrg #include "io.h"
29627f7eb2Smrg 
30627f7eb2Smrg struct stream_vtable
31627f7eb2Smrg {
32627f7eb2Smrg   ssize_t (* const read) (struct stream *, void *, ssize_t);
33627f7eb2Smrg   ssize_t (* const write) (struct stream *, const void *, ssize_t);
34627f7eb2Smrg   gfc_offset (* const seek) (struct stream *, gfc_offset, int);
35627f7eb2Smrg   gfc_offset (* const tell) (struct stream *);
36627f7eb2Smrg   gfc_offset (* const size) (struct stream *);
37627f7eb2Smrg   /* Avoid keyword truncate due to AIX namespace collision.  */
38627f7eb2Smrg   int (* const trunc) (struct stream *, gfc_offset);
39627f7eb2Smrg   int (* const flush) (struct stream *);
40627f7eb2Smrg   int (* const close) (struct stream *);
41627f7eb2Smrg   int (* const markeor) (struct stream *);
42627f7eb2Smrg };
43627f7eb2Smrg 
44627f7eb2Smrg struct stream
45627f7eb2Smrg {
46627f7eb2Smrg   const struct stream_vtable *vptr;
47627f7eb2Smrg };
48627f7eb2Smrg 
49627f7eb2Smrg /* Inline functions for doing file I/O given a stream.  */
50627f7eb2Smrg static inline ssize_t
sread(stream * s,void * buf,ssize_t nbyte)51627f7eb2Smrg sread (stream *s, void *buf, ssize_t nbyte)
52627f7eb2Smrg {
53627f7eb2Smrg   return s->vptr->read (s, buf, nbyte);
54627f7eb2Smrg }
55627f7eb2Smrg 
56627f7eb2Smrg static inline ssize_t
swrite(stream * s,const void * buf,ssize_t nbyte)57627f7eb2Smrg swrite (stream *s, const void *buf, ssize_t nbyte)
58627f7eb2Smrg {
59627f7eb2Smrg   return s->vptr->write (s, buf, nbyte);
60627f7eb2Smrg }
61627f7eb2Smrg 
62627f7eb2Smrg static inline gfc_offset
sseek(stream * s,gfc_offset offset,int whence)63627f7eb2Smrg sseek (stream *s, gfc_offset offset, int whence)
64627f7eb2Smrg {
65627f7eb2Smrg   return s->vptr->seek (s, offset, whence);
66627f7eb2Smrg }
67627f7eb2Smrg 
68627f7eb2Smrg static inline gfc_offset
stell(stream * s)69627f7eb2Smrg stell (stream *s)
70627f7eb2Smrg {
71627f7eb2Smrg   return s->vptr->tell (s);
72627f7eb2Smrg }
73627f7eb2Smrg 
74627f7eb2Smrg static inline gfc_offset
ssize(stream * s)75627f7eb2Smrg ssize (stream *s)
76627f7eb2Smrg {
77627f7eb2Smrg   return s->vptr->size (s);
78627f7eb2Smrg }
79627f7eb2Smrg 
80627f7eb2Smrg static inline int
struncate(stream * s,gfc_offset length)81627f7eb2Smrg struncate (stream *s, gfc_offset length)
82627f7eb2Smrg {
83627f7eb2Smrg   return s->vptr->trunc (s, length);
84627f7eb2Smrg }
85627f7eb2Smrg 
86627f7eb2Smrg static inline int
sflush(stream * s)87627f7eb2Smrg sflush (stream *s)
88627f7eb2Smrg {
89627f7eb2Smrg   return s->vptr->flush (s);
90627f7eb2Smrg }
91627f7eb2Smrg 
92627f7eb2Smrg static inline int
sclose(stream * s)93627f7eb2Smrg sclose (stream *s)
94627f7eb2Smrg {
95627f7eb2Smrg   return s->vptr->close (s);
96627f7eb2Smrg }
97627f7eb2Smrg 
98627f7eb2Smrg static inline int
smarkeor(stream * s)99627f7eb2Smrg smarkeor (stream *s)
100627f7eb2Smrg {
101627f7eb2Smrg   return s->vptr->markeor (s);
102627f7eb2Smrg }
103627f7eb2Smrg 
104627f7eb2Smrg 
105627f7eb2Smrg extern int compare_files (stream *, stream *);
106627f7eb2Smrg internal_proto(compare_files);
107627f7eb2Smrg 
108627f7eb2Smrg extern stream *open_external (st_parameter_open *, unit_flags *);
109627f7eb2Smrg internal_proto(open_external);
110627f7eb2Smrg 
111627f7eb2Smrg extern stream *open_internal (char *, size_t, gfc_offset);
112627f7eb2Smrg internal_proto(open_internal);
113627f7eb2Smrg 
114627f7eb2Smrg extern stream *open_internal4 (char *, size_t, gfc_offset);
115627f7eb2Smrg internal_proto(open_internal4);
116627f7eb2Smrg 
117627f7eb2Smrg extern char *mem_alloc_w (stream *, size_t *);
118627f7eb2Smrg internal_proto(mem_alloc_w);
119627f7eb2Smrg 
120627f7eb2Smrg extern char *mem_alloc_r (stream *, size_t *);
121627f7eb2Smrg internal_proto(mem_alloc_r);
122627f7eb2Smrg 
123627f7eb2Smrg extern gfc_char4_t *mem_alloc_w4 (stream *, size_t *);
124627f7eb2Smrg internal_proto(mem_alloc_w4);
125627f7eb2Smrg 
126627f7eb2Smrg extern char *mem_alloc_r4 (stream *, size_t *);
127627f7eb2Smrg internal_proto(mem_alloc_r4);
128627f7eb2Smrg 
129627f7eb2Smrg extern stream *input_stream (void);
130627f7eb2Smrg internal_proto(input_stream);
131627f7eb2Smrg 
132627f7eb2Smrg extern stream *output_stream (void);
133627f7eb2Smrg internal_proto(output_stream);
134627f7eb2Smrg 
135627f7eb2Smrg extern stream *error_stream (void);
136627f7eb2Smrg internal_proto(error_stream);
137627f7eb2Smrg 
138627f7eb2Smrg extern int compare_file_filename (gfc_unit *, const char *, gfc_charlen_type);
139627f7eb2Smrg internal_proto(compare_file_filename);
140627f7eb2Smrg 
141627f7eb2Smrg extern gfc_unit *find_file (const char *file, gfc_charlen_type file_len);
142627f7eb2Smrg internal_proto(find_file);
143627f7eb2Smrg 
144627f7eb2Smrg extern int close_share (gfc_unit *);
145627f7eb2Smrg internal_proto(close_share);
146627f7eb2Smrg 
147627f7eb2Smrg extern int file_exists (const char *file, gfc_charlen_type file_len);
148627f7eb2Smrg internal_proto(file_exists);
149627f7eb2Smrg 
150627f7eb2Smrg extern GFC_IO_INT file_size (const char *file, gfc_charlen_type file_len);
151627f7eb2Smrg internal_proto(file_size);
152627f7eb2Smrg 
153627f7eb2Smrg extern const char *inquire_sequential (const char *, gfc_charlen_type);
154627f7eb2Smrg internal_proto(inquire_sequential);
155627f7eb2Smrg 
156627f7eb2Smrg extern const char *inquire_direct (const char *, gfc_charlen_type);
157627f7eb2Smrg internal_proto(inquire_direct);
158627f7eb2Smrg 
159627f7eb2Smrg extern const char *inquire_formatted (const char *, gfc_charlen_type);
160627f7eb2Smrg internal_proto(inquire_formatted);
161627f7eb2Smrg 
162627f7eb2Smrg extern const char *inquire_unformatted (const char *, gfc_charlen_type);
163627f7eb2Smrg internal_proto(inquire_unformatted);
164627f7eb2Smrg 
165627f7eb2Smrg extern const char *inquire_read (const char *, gfc_charlen_type);
166627f7eb2Smrg internal_proto(inquire_read);
167627f7eb2Smrg 
168627f7eb2Smrg extern const char *inquire_write (const char *, gfc_charlen_type);
169627f7eb2Smrg internal_proto(inquire_write);
170627f7eb2Smrg 
171627f7eb2Smrg extern const char *inquire_readwrite (const char *, gfc_charlen_type);
172627f7eb2Smrg internal_proto(inquire_readwrite);
173627f7eb2Smrg 
174627f7eb2Smrg extern void flush_if_preconnected (stream *);
175627f7eb2Smrg internal_proto(flush_if_preconnected);
176627f7eb2Smrg 
177627f7eb2Smrg extern int stream_isatty (stream *);
178627f7eb2Smrg internal_proto(stream_isatty);
179627f7eb2Smrg 
180627f7eb2Smrg #ifndef TTY_NAME_MAX
181627f7eb2Smrg #ifdef _POSIX_TTY_NAME_MAX
182627f7eb2Smrg #define TTY_NAME_MAX _POSIX_TTY_NAME_MAX
183627f7eb2Smrg #else
184627f7eb2Smrg /* sysconf(_SC_TTY_NAME_MAX) = 32 which should be enough.  */
185627f7eb2Smrg #define TTY_NAME_MAX 32
186627f7eb2Smrg #endif
187627f7eb2Smrg #endif
188627f7eb2Smrg 
189627f7eb2Smrg extern int stream_ttyname (stream *, char *, size_t);
190627f7eb2Smrg internal_proto(stream_ttyname);
191627f7eb2Smrg 
192627f7eb2Smrg #endif
193