1/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
2   Contributed by Janne Blomqvist
3
4This file is part of the GNU Fortran runtime library (libgfortran).
5
6Libgfortran is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 3, or (at your option)
9any later version.
10
11Libgfortran is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23<http://www.gnu.org/licenses/>.  */
24
25#ifndef GFOR_UNIX_H
26#define GFOR_UNIX_H
27
28#include "io.h"
29
30struct stream_vtable
31{
32  ssize_t (* const read) (struct stream *, void *, ssize_t);
33  ssize_t (* const write) (struct stream *, const void *, ssize_t);
34  gfc_offset (* const seek) (struct stream *, gfc_offset, int);
35  gfc_offset (* const tell) (struct stream *);
36  gfc_offset (* const size) (struct stream *);
37  /* Avoid keyword truncate due to AIX namespace collision.  */
38  int (* const trunc) (struct stream *, gfc_offset);
39  int (* const flush) (struct stream *);
40  int (* const close) (struct stream *);
41  int (* const markeor) (struct stream *);
42};
43
44struct stream
45{
46  const struct stream_vtable *vptr;
47};
48
49/* Inline functions for doing file I/O given a stream.  */
50static inline ssize_t
51sread (stream *s, void *buf, ssize_t nbyte)
52{
53  return s->vptr->read (s, buf, nbyte);
54}
55
56static inline ssize_t
57swrite (stream *s, const void *buf, ssize_t nbyte)
58{
59  return s->vptr->write (s, buf, nbyte);
60}
61
62static inline gfc_offset
63sseek (stream *s, gfc_offset offset, int whence)
64{
65  return s->vptr->seek (s, offset, whence);
66}
67
68static inline gfc_offset
69stell (stream *s)
70{
71  return s->vptr->tell (s);
72}
73
74static inline gfc_offset
75ssize (stream *s)
76{
77  return s->vptr->size (s);
78}
79
80static inline int
81struncate (stream *s, gfc_offset length)
82{
83  return s->vptr->trunc (s, length);
84}
85
86static inline int
87sflush (stream *s)
88{
89  return s->vptr->flush (s);
90}
91
92static inline int
93sclose (stream *s)
94{
95  return s->vptr->close (s);
96}
97
98static inline int
99smarkeor (stream *s)
100{
101  return s->vptr->markeor (s);
102}
103
104
105extern int compare_files (stream *, stream *);
106internal_proto(compare_files);
107
108extern stream *open_external (st_parameter_open *, unit_flags *);
109internal_proto(open_external);
110
111extern stream *open_internal (char *, size_t, gfc_offset);
112internal_proto(open_internal);
113
114extern stream *open_internal4 (char *, size_t, gfc_offset);
115internal_proto(open_internal4);
116
117extern char *mem_alloc_w (stream *, size_t *);
118internal_proto(mem_alloc_w);
119
120extern char *mem_alloc_r (stream *, size_t *);
121internal_proto(mem_alloc_r);
122
123extern gfc_char4_t *mem_alloc_w4 (stream *, size_t *);
124internal_proto(mem_alloc_w4);
125
126extern char *mem_alloc_r4 (stream *, size_t *);
127internal_proto(mem_alloc_r4);
128
129extern stream *input_stream (void);
130internal_proto(input_stream);
131
132extern stream *output_stream (void);
133internal_proto(output_stream);
134
135extern stream *error_stream (void);
136internal_proto(error_stream);
137
138extern int compare_file_filename (gfc_unit *, const char *, gfc_charlen_type);
139internal_proto(compare_file_filename);
140
141extern gfc_unit *find_file (const char *file, gfc_charlen_type file_len);
142internal_proto(find_file);
143
144extern int close_share (gfc_unit *);
145internal_proto(close_share);
146
147extern int file_exists (const char *file, gfc_charlen_type file_len);
148internal_proto(file_exists);
149
150extern GFC_IO_INT file_size (const char *file, gfc_charlen_type file_len);
151internal_proto(file_size);
152
153extern const char *inquire_sequential (const char *, gfc_charlen_type);
154internal_proto(inquire_sequential);
155
156extern const char *inquire_direct (const char *, gfc_charlen_type);
157internal_proto(inquire_direct);
158
159extern const char *inquire_formatted (const char *, gfc_charlen_type);
160internal_proto(inquire_formatted);
161
162extern const char *inquire_unformatted (const char *, gfc_charlen_type);
163internal_proto(inquire_unformatted);
164
165extern const char *inquire_read (const char *, gfc_charlen_type);
166internal_proto(inquire_read);
167
168extern const char *inquire_write (const char *, gfc_charlen_type);
169internal_proto(inquire_write);
170
171extern const char *inquire_readwrite (const char *, gfc_charlen_type);
172internal_proto(inquire_readwrite);
173
174extern void flush_if_preconnected (stream *);
175internal_proto(flush_if_preconnected);
176
177extern int stream_isatty (stream *);
178internal_proto(stream_isatty);
179
180#ifndef TTY_NAME_MAX
181#ifdef _POSIX_TTY_NAME_MAX
182#define TTY_NAME_MAX _POSIX_TTY_NAME_MAX
183#else
184/* sysconf(_SC_TTY_NAME_MAX) = 32 which should be enough.  */
185#define TTY_NAME_MAX 32
186#endif
187#endif
188
189extern int stream_ttyname (stream *, char *, size_t);
190internal_proto(stream_ttyname);
191
192#endif
193