annotate gcc/ada/cstreams.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /****************************************************************************
kono
parents:
diff changeset
2 * *
kono
parents:
diff changeset
3 * GNAT RUN-TIME COMPONENTS *
kono
parents:
diff changeset
4 * *
kono
parents:
diff changeset
5 * C S T R E A M S *
kono
parents:
diff changeset
6 * *
kono
parents:
diff changeset
7 * Auxiliary C functions for Interfaces.C.Streams *
kono
parents:
diff changeset
8 * *
kono
parents:
diff changeset
9 * Copyright (C) 1992-2017, Free Software Foundation, Inc. *
kono
parents:
diff changeset
10 * *
kono
parents:
diff changeset
11 * GNAT is free software; you can redistribute it and/or modify it under *
kono
parents:
diff changeset
12 * terms of the GNU General Public License as published by the Free Soft- *
kono
parents:
diff changeset
13 * ware Foundation; either version 3, or (at your option) any later ver- *
kono
parents:
diff changeset
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
kono
parents:
diff changeset
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
kono
parents:
diff changeset
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
kono
parents:
diff changeset
17 * *
kono
parents:
diff changeset
18 * As a special exception under Section 7 of GPL version 3, you are granted *
kono
parents:
diff changeset
19 * additional permissions described in the GCC Runtime Library Exception, *
kono
parents:
diff changeset
20 * version 3.1, as published by the Free Software Foundation. *
kono
parents:
diff changeset
21 * *
kono
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License and *
kono
parents:
diff changeset
23 * a copy of the GCC Runtime Library Exception along with this program; *
kono
parents:
diff changeset
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
kono
parents:
diff changeset
25 * <http://www.gnu.org/licenses/>. *
kono
parents:
diff changeset
26 * *
kono
parents:
diff changeset
27 * GNAT was originally developed by the GNAT team at New York University. *
kono
parents:
diff changeset
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
kono
parents:
diff changeset
29 * *
kono
parents:
diff changeset
30 ****************************************************************************/
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* Routines required for implementing routines in Interfaces.C.Streams. */
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 #ifndef _LARGEFILE_SOURCE
kono
parents:
diff changeset
35 #define _LARGEFILE_SOURCE
kono
parents:
diff changeset
36 #endif
kono
parents:
diff changeset
37 #define _FILE_OFFSET_BITS 64
kono
parents:
diff changeset
38 /* the define above will make off_t a 64bit type on GNU/Linux */
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 #include <stdio.h>
kono
parents:
diff changeset
41 #include <sys/types.h>
kono
parents:
diff changeset
42 #include <sys/stat.h>
kono
parents:
diff changeset
43 #include <unistd.h>
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 #ifdef _AIX
kono
parents:
diff changeset
46 /* needed to avoid conflicting declarations */
kono
parents:
diff changeset
47 #include <unistd.h>
kono
parents:
diff changeset
48 #include <sys/mman.h>
kono
parents:
diff changeset
49 #endif
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 #ifdef __vxworks
kono
parents:
diff changeset
52 #include "vxWorks.h"
kono
parents:
diff changeset
53 #endif
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 #ifdef IN_RTS
kono
parents:
diff changeset
56 #include "tconfig.h"
kono
parents:
diff changeset
57 #include "tsystem.h"
kono
parents:
diff changeset
58 #include <sys/stat.h>
kono
parents:
diff changeset
59 #else
kono
parents:
diff changeset
60 #include "config.h"
kono
parents:
diff changeset
61 #include "system.h"
kono
parents:
diff changeset
62 #endif
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 #include "adaint.h"
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 #ifdef __cplusplus
kono
parents:
diff changeset
67 extern "C" {
kono
parents:
diff changeset
68 #endif
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 #ifdef __linux__
kono
parents:
diff changeset
71 /* Don't use macros on GNU/Linux since they cause incompatible changes between
kono
parents:
diff changeset
72 glibc 2.0 and 2.1 */
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 #ifdef stderr
kono
parents:
diff changeset
75 # undef stderr
kono
parents:
diff changeset
76 #endif
kono
parents:
diff changeset
77 #ifdef stdin
kono
parents:
diff changeset
78 # undef stdin
kono
parents:
diff changeset
79 #endif
kono
parents:
diff changeset
80 #ifdef stdout
kono
parents:
diff changeset
81 # undef stdout
kono
parents:
diff changeset
82 #endif
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 #endif
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 /* Don't use macros versions of this functions on VxWorks since they cause
kono
parents:
diff changeset
87 imcompatible changes in some VxWorks versions */
kono
parents:
diff changeset
88 #ifdef __vxworks
kono
parents:
diff changeset
89 #undef getchar
kono
parents:
diff changeset
90 #undef putchar
kono
parents:
diff changeset
91 #undef feof
kono
parents:
diff changeset
92 #undef ferror
kono
parents:
diff changeset
93 #undef fileno
kono
parents:
diff changeset
94 #endif
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 /* The _IONBF value in MINGW32 stdio.h is wrong. */
kono
parents:
diff changeset
97 #if defined (WINNT) || defined (_WINNT)
kono
parents:
diff changeset
98 #if OLD_MINGW
kono
parents:
diff changeset
99 #undef _IONBF
kono
parents:
diff changeset
100 #define _IONBF 0004
kono
parents:
diff changeset
101 #endif
kono
parents:
diff changeset
102 #endif
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 int
kono
parents:
diff changeset
105 __gnat_feof (FILE *stream)
kono
parents:
diff changeset
106 {
kono
parents:
diff changeset
107 return (feof (stream));
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 int
kono
parents:
diff changeset
111 __gnat_ferror (FILE *stream)
kono
parents:
diff changeset
112 {
kono
parents:
diff changeset
113 return (ferror (stream));
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 int
kono
parents:
diff changeset
117 __gnat_fileno (FILE *stream)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 return (fileno (stream));
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 /* on some systems, the constants for seek are not defined, if so, then
kono
parents:
diff changeset
123 provide the conventional definitions */
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 #ifndef SEEK_SET
kono
parents:
diff changeset
126 #define SEEK_SET 0 /* Set file pointer to offset */
kono
parents:
diff changeset
127 #define SEEK_CUR 1 /* Set file pointer to its current value plus offset */
kono
parents:
diff changeset
128 #define SEEK_END 2 /* Set file pointer to the size of the file plus offset */
kono
parents:
diff changeset
129 #endif
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 /* if L_tmpnam is not set, use a large number that should be safe */
kono
parents:
diff changeset
132 #ifndef L_tmpnam
kono
parents:
diff changeset
133 #define L_tmpnam 256
kono
parents:
diff changeset
134 #endif
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 int __gnat_constant_eof = EOF;
kono
parents:
diff changeset
137 int __gnat_constant_iofbf = _IOFBF;
kono
parents:
diff changeset
138 int __gnat_constant_iolbf = _IOLBF;
kono
parents:
diff changeset
139 int __gnat_constant_ionbf = _IONBF;
kono
parents:
diff changeset
140 int __gnat_constant_l_tmpnam = L_tmpnam;
kono
parents:
diff changeset
141 int __gnat_constant_seek_cur = SEEK_CUR;
kono
parents:
diff changeset
142 int __gnat_constant_seek_end = SEEK_END;
kono
parents:
diff changeset
143 int __gnat_constant_seek_set = SEEK_SET;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 FILE *
kono
parents:
diff changeset
146 __gnat_constant_stderr (void)
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148 return stderr;
kono
parents:
diff changeset
149 }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 FILE *
kono
parents:
diff changeset
152 __gnat_constant_stdin (void)
kono
parents:
diff changeset
153 {
kono
parents:
diff changeset
154 return stdin;
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 FILE *
kono
parents:
diff changeset
158 __gnat_constant_stdout (void)
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 return stdout;
kono
parents:
diff changeset
161 }
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 char *
kono
parents:
diff changeset
164 __gnat_full_name (char *nam, char *buffer)
kono
parents:
diff changeset
165 {
kono
parents:
diff changeset
166 #ifdef RTSS
kono
parents:
diff changeset
167 /* RTSS applications have no current-directory notion, so RTSS file I/O
kono
parents:
diff changeset
168 requests must use fully qualified path names, such as:
kono
parents:
diff changeset
169 c:\temp\MyFile.txt (for a file system object)
kono
parents:
diff changeset
170 \\.\MyDevice0 (for a device object)
kono
parents:
diff changeset
171 */
kono
parents:
diff changeset
172 if (nam[1] == ':' || nam[0] == '\\')
kono
parents:
diff changeset
173 strcpy (buffer, nam);
kono
parents:
diff changeset
174 else
kono
parents:
diff changeset
175 buffer[0] = '\0';
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 #elif defined (__MINGW32__)
kono
parents:
diff changeset
178 /* If this is a device file return it as is;
kono
parents:
diff changeset
179 under Windows NT a device file ends with ":". */
kono
parents:
diff changeset
180 if (nam[strlen (nam) - 1] == ':')
kono
parents:
diff changeset
181 strcpy (buffer, nam);
kono
parents:
diff changeset
182 else
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 char *p;
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 _fullpath (buffer, nam, __gnat_max_path_len);
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 for (p = buffer; *p; p++)
kono
parents:
diff changeset
189 if (*p == '/')
kono
parents:
diff changeset
190 *p = '\\';
kono
parents:
diff changeset
191 }
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 #elif defined (__FreeBSD__) || defined (__DragonFly__) || defined (__OpenBSD__)
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 /* Use realpath function which resolves links and references to . and ..
kono
parents:
diff changeset
196 on those Unix systems that support it. Note that GNU/Linux provides it but
kono
parents:
diff changeset
197 cannot handle more than 5 symbolic links in a full name, so we use the
kono
parents:
diff changeset
198 getcwd approach instead. */
kono
parents:
diff changeset
199 realpath (nam, buffer);
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 #elif defined (__vxworks)
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 /* On VxWorks systems, an absolute path can be represented (depending on
kono
parents:
diff changeset
204 the host platform) as either /dir/file, or device:/dir/file, or
kono
parents:
diff changeset
205 device:drive_letter:/dir/file. Use the __gnat_is_absolute_path
kono
parents:
diff changeset
206 to verify it. */
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 int length;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 if (__gnat_is_absolute_path (nam, strlen (nam)))
kono
parents:
diff changeset
211 strcpy (buffer, nam);
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 else
kono
parents:
diff changeset
214 {
kono
parents:
diff changeset
215 length = __gnat_max_path_len;
kono
parents:
diff changeset
216 __gnat_get_current_dir (buffer, &length);
kono
parents:
diff changeset
217 strncat (buffer, nam, __gnat_max_path_len - length - 1);
kono
parents:
diff changeset
218 }
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 #else
kono
parents:
diff changeset
221 if (nam[0] != '/')
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 char *p = getcwd (buffer, __gnat_max_path_len);
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 if (p == 0)
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 buffer[0] = '\0';
kono
parents:
diff changeset
228 return 0;
kono
parents:
diff changeset
229 }
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 /* If the name returned is an absolute path, it is safe to append '/'
kono
parents:
diff changeset
233 to the path and concatenate the name of the file. */
kono
parents:
diff changeset
234 if (buffer[0] == '/')
kono
parents:
diff changeset
235 strcat (buffer, "/");
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 strcat (buffer, nam);
kono
parents:
diff changeset
238 }
kono
parents:
diff changeset
239 else
kono
parents:
diff changeset
240 strcpy (buffer, nam);
kono
parents:
diff changeset
241 #endif
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 return buffer;
kono
parents:
diff changeset
244 }
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 #ifdef _WIN32
kono
parents:
diff changeset
247 /* On Windows we want to use the fseek/fteel supporting large files. This
kono
parents:
diff changeset
248 issue is due to the fact that a long on Win64 is still a 32 bits value */
kono
parents:
diff changeset
249 __int64
kono
parents:
diff changeset
250 __gnat_ftell64 (FILE *stream)
kono
parents:
diff changeset
251 {
kono
parents:
diff changeset
252 return _ftelli64 (stream);
kono
parents:
diff changeset
253 }
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 int
kono
parents:
diff changeset
256 __gnat_fseek64 (FILE *stream, __int64 offset, int origin)
kono
parents:
diff changeset
257 {
kono
parents:
diff changeset
258 return _fseeki64 (stream, offset, origin);
kono
parents:
diff changeset
259 }
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 #elif defined (__linux__) || defined (__sun__) || defined (__FreeBSD__) \
kono
parents:
diff changeset
262 || defined (__APPLE__)
kono
parents:
diff changeset
263 /* section for platforms having ftello/fseeko */
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 __int64
kono
parents:
diff changeset
266 __gnat_ftell64 (FILE *stream)
kono
parents:
diff changeset
267 {
kono
parents:
diff changeset
268 return (__int64)ftello (stream);
kono
parents:
diff changeset
269 }
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 int
kono
parents:
diff changeset
272 __gnat_fseek64 (FILE *stream, __int64 offset, int origin)
kono
parents:
diff changeset
273 {
kono
parents:
diff changeset
274 /* make sure that the offset is not bigger than the OS off_t, if so return
kono
parents:
diff changeset
275 with error as this mean that we are trying to handle files larger than
kono
parents:
diff changeset
276 2Gb on a patform not supporting it. */
kono
parents:
diff changeset
277 if ((off_t)offset == offset)
kono
parents:
diff changeset
278 return fseeko (stream, (off_t) offset, origin);
kono
parents:
diff changeset
279 else
kono
parents:
diff changeset
280 return -1;
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 #else
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 __int64
kono
parents:
diff changeset
286 __gnat_ftell64 (FILE *stream)
kono
parents:
diff changeset
287 {
kono
parents:
diff changeset
288 return (__int64)ftell (stream);
kono
parents:
diff changeset
289 }
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 int
kono
parents:
diff changeset
292 __gnat_fseek64 (FILE *stream, __int64 offset, int origin)
kono
parents:
diff changeset
293 {
kono
parents:
diff changeset
294 /* make sure that the offset is not bigger than the OS off_t, if so return
kono
parents:
diff changeset
295 with error as this mean that we are trying to handle files larger than
kono
parents:
diff changeset
296 2Gb on a patform not supporting it. */
kono
parents:
diff changeset
297 if ((off_t)offset == offset)
kono
parents:
diff changeset
298 return fseek (stream, (off_t) offset, origin);
kono
parents:
diff changeset
299 else
kono
parents:
diff changeset
300 return -1;
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302 #endif
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 /* Returns true if the path names a fifo (i.e. a named pipe). */
kono
parents:
diff changeset
305 int
kono
parents:
diff changeset
306 __gnat_is_fifo (const char* path)
kono
parents:
diff changeset
307 {
kono
parents:
diff changeset
308 /* Posix defines S_ISFIFO as a macro. If the macro doesn't exist, we return
kono
parents:
diff changeset
309 false. */
kono
parents:
diff changeset
310 #ifdef S_ISFIFO
kono
parents:
diff changeset
311 struct stat buf;
kono
parents:
diff changeset
312 const int status = stat(path, &buf);
kono
parents:
diff changeset
313 if (status == 0)
kono
parents:
diff changeset
314 return S_ISFIFO(buf.st_mode);
kono
parents:
diff changeset
315 #endif
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 /* S_ISFIFO is not available, or stat got an error (probably
kono
parents:
diff changeset
318 file not found). */
kono
parents:
diff changeset
319 return 0;
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 #ifdef __cplusplus
kono
parents:
diff changeset
323 }
kono
parents:
diff changeset
324 #endif