adaint.h, adaint.c (__gnat_open): Added.
[gcc.git] / gcc / ada / adaint.h
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * A D A I N T *
6 * *
7 * C Header File *
8 * *
9 * Copyright (C) 1992-2014, Free Software Foundation, Inc. *
10 * *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 3, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
17 * *
18 * As a special exception under Section 7 of GPL version 3, you are granted *
19 * additional permissions described in the GCC Runtime Library Exception, *
20 * version 3.1, as published by the Free Software Foundation. *
21 * *
22 * You should have received a copy of the GNU General Public License and *
23 * a copy of the GCC Runtime Library Exception along with this program; *
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
25 * <http://www.gnu.org/licenses/>. *
26 * *
27 * GNAT was originally developed by the GNAT team at New York University. *
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
29 * *
30 ****************************************************************************/
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #include <sys/stat.h>
37 #include <stdio.h>
38
39 #ifdef _WIN32
40 #include "mingw32.h"
41 #endif
42
43 #include <dirent.h>
44
45 /* Constants used for the form parameter encoding values */
46 #define Encoding_UTF8 0 /* UTF-8 */
47 #define Encoding_8bits 1 /* Standard 8bits, CP_ACP on Windows. */
48 #define Encoding_Unspecified 2 /* Based on GNAT_CODE_PAGE env variable. */
49
50 /* Large file support. It is unclear what portable mechanism we can use to
51 determine at compile time what support the system offers for large files.
52 For now we just list the platforms we have manually tested. */
53
54 #if defined (__GLIBC__) || defined (sun)
55 #define GNAT_FOPEN fopen64
56 #define GNAT_OPEN open64
57 #define GNAT_STAT stat64
58 #define GNAT_FSTAT fstat64
59 #define GNAT_LSTAT lstat64
60 #define GNAT_STRUCT_STAT struct stat64
61 #else
62 #define GNAT_FOPEN fopen
63 #define GNAT_OPEN open
64 #define GNAT_STAT stat
65 #define GNAT_FSTAT fstat
66 #define GNAT_LSTAT lstat
67 #define GNAT_STRUCT_STAT struct stat
68 #endif
69
70 /* Type corresponding to GNAT.OS_Lib.OS_Time */
71 #if defined (_WIN64)
72 typedef long long OS_Time;
73 #else
74 typedef long OS_Time;
75 #endif
76
77 #define __int64 long long
78
79 /* A lazy cache for the attributes of a file. On some systems, a single call to
80 stat() will give all this information, so it is better than doing a system
81 call every time. On other systems this require several system calls.
82 */
83
84 struct file_attributes {
85 int error;
86 /* Errno value returned by stat()/fstat(). If non-zero, other fields should
87 * be considered as invalid.
88 */
89
90 unsigned char exists;
91
92 unsigned char writable;
93 unsigned char readable;
94 unsigned char executable;
95
96 unsigned char symbolic_link;
97 unsigned char regular;
98 unsigned char directory;
99
100 OS_Time timestamp;
101 long file_length;
102 };
103 /* WARNING: changing the size here might require changing the constant
104 * File_Attributes_Size in osint.ads (which should be big enough to
105 * fit the above struct on any system)
106 */
107
108 extern int __gnat_max_path_len;
109 extern OS_Time __gnat_current_time (void);
110 extern void __gnat_current_time_string (char *);
111 extern void __gnat_to_gm_time (OS_Time *, int *, int *,
112 int *, int *,
113 int *, int *);
114 extern void __gnat_to_os_time (OS_Time *, int, int, int,
115 int, int, int);
116 extern int __gnat_get_maximum_file_name_length (void);
117 extern int __gnat_get_switches_case_sensitive (void);
118 extern int __gnat_get_file_names_case_sensitive (void);
119 extern int __gnat_get_env_vars_case_sensitive (void);
120 extern char __gnat_get_default_identifier_character_set (void);
121 extern void __gnat_get_current_dir (char *, int *);
122 extern void __gnat_get_object_suffix_ptr (int *,
123 const char **);
124 extern void __gnat_get_executable_suffix_ptr (int *,
125 const char **);
126 extern void __gnat_get_debuggable_suffix_ptr (int *,
127 const char **);
128 extern int __gnat_readlink (char *, char *,
129 size_t);
130 extern int __gnat_symlink (char *, char *);
131 extern int __gnat_try_lock (char *, char *);
132 extern int __gnat_open_new (char *, int);
133 extern int __gnat_open_new_temp (char *, int);
134 extern int __gnat_mkdir (char *, int);
135 extern int __gnat_stat (char *,
136 GNAT_STRUCT_STAT *);
137 extern int __gnat_unlink (char *);
138 extern int __gnat_rename (char *, char *);
139 extern int __gnat_chdir (char *);
140 extern int __gnat_rmdir (char *);
141
142 extern FILE *__gnat_fopen (char *, char *, int,
143 char *);
144 extern FILE *__gnat_freopen (char *, char *, FILE *,
145 int, char *);
146 extern int __gnat_open (char *, int);
147 extern int __gnat_open_read (char *, int);
148 extern int __gnat_open_rw (char *, int);
149 extern int __gnat_open_create (char *, int);
150 extern int __gnat_create_output_file (char *);
151 extern int __gnat_create_output_file_new (char *);
152
153 extern int __gnat_open_append (char *, int);
154 extern long __gnat_file_length (int);
155 extern long __gnat_named_file_length (char *);
156 extern void __gnat_tmp_name (char *);
157 extern DIR *__gnat_opendir (char *);
158 extern char *__gnat_readdir (DIR *, char *, int *);
159 extern int __gnat_closedir (DIR *);
160 extern int __gnat_readdir_is_thread_safe (void);
161
162 extern OS_Time __gnat_file_time_name (char *);
163 extern OS_Time __gnat_file_time_fd (int);
164 /* return -1 in case of error */
165
166 extern void __gnat_set_file_time_name (char *, time_t);
167
168 extern int __gnat_dup (int);
169 extern int __gnat_dup2 (int, int);
170 extern int __gnat_file_exists (char *);
171 extern int __gnat_is_regular_file (char *);
172 extern int __gnat_is_absolute_path (char *,int);
173 extern int __gnat_is_directory (char *);
174 extern int __gnat_is_writable_file (char *);
175 extern int __gnat_is_readable_file (char *name);
176 extern int __gnat_is_executable_file (char *name);
177
178 extern void __gnat_reset_attributes (struct file_attributes *);
179 extern int __gnat_error_attributes (struct file_attributes *);
180 extern long __gnat_file_length_attr (int, char *, struct file_attributes *);
181 extern OS_Time __gnat_file_time_name_attr (char *, struct file_attributes *);
182 extern OS_Time __gnat_file_time_fd_attr (int, struct file_attributes *);
183 extern int __gnat_file_exists_attr (char *, struct file_attributes *);
184 extern int __gnat_is_regular_file_attr (char *, struct file_attributes *);
185 extern int __gnat_is_directory_attr (char *, struct file_attributes *);
186 extern int __gnat_is_readable_file_attr (char *, struct file_attributes *);
187 extern int __gnat_is_writable_file_attr (char *, struct file_attributes *);
188 extern int __gnat_is_executable_file_attr (char *, struct file_attributes *);
189 extern int __gnat_is_symbolic_link_attr (char *, struct file_attributes *);
190
191 extern void __gnat_set_non_writable (char *name);
192 extern void __gnat_set_writable (char *name);
193 extern void __gnat_set_executable (char *name, int);
194 extern void __gnat_set_readable (char *name);
195 extern void __gnat_set_non_readable (char *name);
196 extern int __gnat_is_symbolic_link (char *name);
197 extern int __gnat_portable_spawn (char *[]);
198 extern int __gnat_portable_no_block_spawn (char *[]);
199 extern int __gnat_portable_wait (int *);
200 extern char *__gnat_locate_exec (char *, char *);
201 extern char *__gnat_locate_exec_on_path (char *);
202 extern char *__gnat_locate_regular_file (char *, char *);
203 extern void __gnat_maybe_glob_args (int *, char ***);
204 extern void __gnat_os_exit (int);
205 extern char *__gnat_get_libraries_from_registry (void);
206 extern int __gnat_to_canonical_file_list_init (char *, int);
207 extern char *__gnat_to_canonical_file_list_next (void);
208 extern void __gnat_to_canonical_file_list_free (void);
209 extern char *__gnat_to_canonical_dir_spec (char *, int);
210 extern char *__gnat_to_canonical_file_spec (char *);
211 extern char *__gnat_to_host_dir_spec (char *, int);
212 extern char *__gnat_to_host_file_spec (char *);
213 extern char *__gnat_to_canonical_path_spec (char *);
214 extern void __gnat_adjust_os_resource_limits (void);
215 extern void convert_addresses (const char *, void *, int,
216 void *, int *);
217 extern int __gnat_copy_attribs (char *, char *, int);
218 extern int __gnat_feof (FILE *);
219 extern int __gnat_ferror (FILE *);
220 extern int __gnat_fileno (FILE *);
221 extern int __gnat_is_regular_file_fd (int);
222 extern FILE *__gnat_constant_stderr (void);
223 extern FILE *__gnat_constant_stdin (void);
224 extern FILE *__gnat_constant_stdout (void);
225 extern char *__gnat_full_name (char *, char *);
226
227 extern int __gnat_arg_count (void);
228 extern int __gnat_len_arg (int);
229 extern void __gnat_fill_arg (char *, int);
230 extern int __gnat_env_count (void);
231 extern int __gnat_len_env (int);
232 extern void __gnat_fill_env (char *, int);
233
234 /* Routines for interface to scanf and printf functions for integer values */
235
236 extern int get_int (void);
237 extern void put_int (int);
238 extern void put_int_stderr (int);
239 extern int get_char (void);
240 extern void put_char (int);
241 extern void put_char_stderr (int);
242 extern char *mktemp (char *);
243
244 extern void __gnat_set_exit_status (int);
245
246 extern int __gnat_expect_fork (void);
247 extern void __gnat_expect_portable_execvp (char *, char *[]);
248 extern int __gnat_pipe (int *);
249 extern int __gnat_expect_poll (int *, int, int, int *);
250 extern void __gnat_set_binary_mode (int);
251 extern void __gnat_set_text_mode (int);
252 extern void __gnat_set_mode (int,int);
253 extern char *__gnat_ttyname (int);
254 extern int __gnat_lseek (int, long, int);
255 extern int __gnat_set_close_on_exec (int, int);
256 extern int __gnat_dup (int);
257 extern int __gnat_dup2 (int, int);
258
259 /* large file support */
260 extern __int64 __gnat_ftell64 (FILE *);
261 extern int __gnat_fseek64 (FILE *, __int64, int);
262
263 extern int __gnat_number_of_cpus (void);
264
265 extern void __gnat_os_filename (char *, char *, char *,
266 int *, char *, int *);
267
268 extern char * __gnat_locate_executable_file (char *, char *);
269 extern char * __gnat_locate_file_with_predicate (char *, char *,
270 int (*)(char*));
271
272 #if defined (__ANDROID__)
273 #undef linux
274 extern void *__gnat_lwp_self (void);
275
276 #elif defined (linux)
277 extern void *__gnat_lwp_self (void);
278
279 /* Routines for interface to required CPU set primitives */
280
281 #include <sched.h>
282
283 extern cpu_set_t *__gnat_cpu_alloc (size_t);
284 extern size_t __gnat_cpu_alloc_size (size_t);
285 extern void __gnat_cpu_free (cpu_set_t *);
286 extern void __gnat_cpu_zero (size_t, cpu_set_t *);
287 extern void __gnat_cpu_set (int, size_t, cpu_set_t *);
288 #endif
289
290 #if defined (_WIN32)
291 /* Interface to delete a handle from internally maintained list of child
292 process handles on Windows */
293 extern void
294 __gnat_win32_remove_handle (HANDLE h, int pid);
295 #endif
296
297 #ifdef IN_RTS
298 /* Portable definition of strdup, which is not available on all systems. */
299 #define xstrdup(S) strcpy ((char *) malloc (strlen (S) + 1), S)
300 #endif
301
302 /* This function returns the version of GCC being used. Here it's GCC 3. */
303 extern int get_gcc_version (void);
304
305 extern int __gnat_binder_supports_auto_init (void);
306 extern int __gnat_sals_init_using_constructors (void);
307
308 extern const void * __gnat_get_executable_load_address (void);
309
310 #ifdef __cplusplus
311 }
312 #endif