2005-04-15 Thomas Koenig <Thomas.Koenig@online.de>
[official-gcc.git] / libgfortran / io / io.h
blob05c4355ad006f69fa39da1f10551af002ae30591
1 /* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
6 Libgfortran is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 Libgfortran is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Libgfortran; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* As a special exception, if you link this library with other files,
22 some of which are compiled with GCC, to produce an executable,
23 this library does not by itself cause the resulting executable
24 to be covered by the GNU General Public License.
25 This exception does not however invalidate any other reasons why
26 the executable file might be covered by the GNU General Public License. */
28 #ifndef GFOR_IO_H
29 #define GFOR_IO_H
31 /* IO library include. */
33 #include <setjmp.h>
34 #include "libgfortran.h"
36 #define DEFAULT_TEMPDIR "/var/tmp"
38 /* Basic types used in data transfers. */
40 typedef enum
41 { BT_NULL, BT_INTEGER, BT_LOGICAL, BT_CHARACTER, BT_REAL,
42 BT_COMPLEX
44 bt;
47 typedef enum
48 { SUCCESS = 1, FAILURE }
49 try;
51 typedef struct stream
53 char *(*alloc_w_at) (struct stream *, int *, gfc_offset);
54 char *(*alloc_r_at) (struct stream *, int *, gfc_offset);
55 try (*sfree) (struct stream *);
56 try (*close) (struct stream *);
57 try (*seek) (struct stream *, gfc_offset);
58 try (*truncate) (struct stream *);
60 stream;
63 /* Macros for doing file I/O given a stream. */
65 #define sfree(s) ((s)->sfree)(s)
66 #define sclose(s) ((s)->close)(s)
68 #define salloc_r(s, len) ((s)->alloc_r_at)(s, len, -1)
69 #define salloc_w(s, len) ((s)->alloc_w_at)(s, len, -1)
71 #define salloc_r_at(s, len, where) ((s)->alloc_r_at)(s, len, where)
72 #define salloc_w_at(s, len, where) ((s)->alloc_w_at)(s, len, where)
74 #define sseek(s, pos) ((s)->seek)(s, pos)
75 #define struncate(s) ((s)->truncate)(s)
77 /* Namelist represent object */
79 Namelist Records
80 &groupname object=value [,object=value].../
82 &groupname object=value [,object=value]...&groupname
84 Even more complex, during the execution of a program containing a
85 namelist READ statement, you can specify a question mark character(?)
86 or a question mark character preceded by an equal sign(=?) to get
87 the information of the namelist group. By '?', the name of variables
88 in the namelist will be displayed, by '=?', the name and value of
89 variables will be displayed.
91 All these requirements need a new data structure to record all info
92 about the namelist.
95 typedef struct namelist_type
97 char * var_name;
98 void * mem_pos;
99 int value_acquired;
100 int len;
101 int string_length;
102 bt type;
103 struct namelist_type * next;
105 namelist_info;
107 /* Options for the OPEN statement. */
109 typedef enum
110 { ACCESS_SEQUENTIAL, ACCESS_DIRECT,
111 ACCESS_UNSPECIFIED
113 unit_access;
115 typedef enum
116 { ACTION_READ, ACTION_WRITE, ACTION_READWRITE,
117 ACTION_UNSPECIFIED
119 unit_action;
121 typedef enum
122 { BLANK_NULL, BLANK_ZERO, BLANK_UNSPECIFIED }
123 unit_blank;
125 typedef enum
126 { DELIM_NONE, DELIM_APOSTROPHE, DELIM_QUOTE,
127 DELIM_UNSPECIFIED
129 unit_delim;
131 typedef enum
132 { FORM_FORMATTED, FORM_UNFORMATTED, FORM_UNSPECIFIED }
133 unit_form;
135 typedef enum
136 { POSITION_ASIS, POSITION_REWIND, POSITION_APPEND,
137 POSITION_UNSPECIFIED
139 unit_position;
141 typedef enum
142 { STATUS_UNKNOWN, STATUS_OLD, STATUS_NEW, STATUS_SCRATCH,
143 STATUS_REPLACE, STATUS_UNSPECIFIED
145 unit_status;
147 typedef enum
148 { PAD_YES, PAD_NO, PAD_UNSPECIFIED }
149 unit_pad;
151 typedef enum
152 { ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED }
153 unit_advance;
155 typedef enum
156 {READING, WRITING}
157 unit_mode;
159 /* Statement parameters. These are all the things that can appear in
160 an I/O statement. Some are inputs and some are outputs, but none
161 are both. All of these values are initially zeroed and are zeroed
162 at the end of a library statement. The relevant values need to be
163 set before entry to an I/O statement. This structure needs to be
164 duplicated by the back end. */
166 typedef struct
168 GFC_INTEGER_4 unit;
169 GFC_INTEGER_4 err, end, eor, list_format; /* These are flags, not values. */
171 /* Return values from library statements. These are returned only if
172 the labels are specified in the statement itself and the condition
173 occurs. In most cases, none of the labels are specified and the
174 return value does not have to be checked. Must be consistent with
175 the front end. */
177 enum
179 LIBRARY_OK = 0,
180 LIBRARY_ERROR,
181 LIBRARY_END,
182 LIBRARY_EOR
184 library_return;
186 GFC_INTEGER_4 *iostat, *exist, *opened, *number, *named;
187 GFC_INTEGER_4 rec;
188 GFC_INTEGER_4 *nextrec, *size;
190 GFC_INTEGER_4 recl_in;
191 GFC_INTEGER_4 *recl_out;
193 GFC_INTEGER_4 *iolength;
195 #define CHARACTER(name) \
196 char * name; \
197 gfc_charlen_type name ## _len
198 CHARACTER (file);
199 CHARACTER (status);
200 CHARACTER (access);
201 CHARACTER (form);
202 CHARACTER (blank);
203 CHARACTER (position);
204 CHARACTER (action);
205 CHARACTER (delim);
206 CHARACTER (pad);
207 CHARACTER (format);
208 CHARACTER (advance);
209 CHARACTER (name);
210 CHARACTER (internal_unit);
211 CHARACTER (sequential);
212 CHARACTER (direct);
213 CHARACTER (formatted);
214 CHARACTER (unformatted);
215 CHARACTER (read);
216 CHARACTER (write);
217 CHARACTER (readwrite);
219 /* namelist related data */
220 CHARACTER (namelist_name);
221 GFC_INTEGER_4 namelist_read_mode;
223 #undef CHARACTER
225 st_parameter;
227 extern st_parameter ioparm;
228 iexport_data_proto(ioparm);
230 extern namelist_info * ionml;
231 internal_proto(ionml);
233 typedef struct
235 unit_access access;
236 unit_action action;
237 unit_blank blank;
238 unit_delim delim;
239 unit_form form;
240 int is_notpadded;
241 unit_position position;
242 unit_status status;
243 unit_pad pad;
245 unit_flags;
248 /* The default value of record length for preconnected units is defined
249 here. This value can be overriden by an environment variable.
250 Default value is 1 Gb. */
252 #define DEFAULT_RECL 1073741824
255 typedef struct gfc_unit
257 int unit_number;
259 stream *s;
261 struct gfc_unit *left, *right; /* Treap links. */
262 int priority;
264 int read_bad, current_record;
265 enum
266 { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
267 endfile;
269 unit_mode mode;
270 unit_flags flags;
271 gfc_offset recl, last_record, maxrec, bytes_left;
273 /* recl -- Record length of the file.
274 last_record -- Last record number read or written
275 maxrec -- Maximum record number in a direct access file
276 bytes_left -- Bytes left in current record. */
278 int file_len;
279 char file[1]; /* Filename is allocated at the end of the structure. */
281 gfc_unit;
283 /* Global variables. Putting these in a structure makes it easier to
284 maintain, particularly with the constraint of a prefix. */
286 typedef struct
288 int in_library; /* Nonzero if a library call is being processed. */
289 int size; /* Bytes processed by the current data-transfer statement. */
290 gfc_offset max_offset; /* Maximum file offset. */
291 int item_count; /* Item number in a formatted data transfer. */
292 int reversion_flag; /* Format reversion has occurred. */
293 int first_item;
295 gfc_unit *unit_root;
296 int seen_dollar;
298 unit_mode mode;
300 unit_blank blank_status;
301 enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status;
302 int scale_factor;
303 jmp_buf eof_jump;
305 global_t;
307 extern global_t g;
308 internal_proto(g);
310 extern gfc_unit *current_unit;
311 internal_proto(current_unit);
313 /* Format tokens. Only about half of these can be stored in the
314 format nodes. */
316 typedef enum
318 FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
319 FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL,
320 FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
321 FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
322 FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END
324 format_token;
327 /* Format nodes. A format string is converted into a tree of these
328 structures, which is traversed as part of a data transfer statement. */
330 typedef struct fnode
332 format_token format;
333 int repeat;
334 struct fnode *next;
335 char *source;
337 union
339 struct
341 int w, d, e;
343 real;
345 struct
347 int length;
348 char *p;
350 string;
352 struct
354 int w, m;
356 integer;
358 int w;
359 int k;
360 int r;
361 int n;
363 struct fnode *child;
367 /* Members for traversing the tree during data transfer. */
369 int count;
370 struct fnode *current;
373 fnode;
376 /* unix.c */
378 extern int move_pos_offset (stream *, int);
379 internal_proto(move_pos_offset);
381 extern int compare_files (stream *, stream *);
382 internal_proto(compare_files);
384 extern stream *init_error_stream (void);
385 internal_proto(init_error_stream);
387 extern stream *open_external (unit_flags *);
388 internal_proto(open_external);
390 extern stream *open_internal (char *, int);
391 internal_proto(open_internal);
393 extern stream *input_stream (void);
394 internal_proto(input_stream);
396 extern stream *output_stream (void);
397 internal_proto(output_stream);
399 extern stream *error_stream (void);
400 internal_proto(error_stream);
402 extern int compare_file_filename (stream *, const char *, int);
403 internal_proto(compare_file_filename);
405 extern gfc_unit *find_file (void);
406 internal_proto(find_file);
408 extern int stream_at_bof (stream *);
409 internal_proto(stream_at_bof);
411 extern int stream_at_eof (stream *);
412 internal_proto(stream_at_eof);
414 extern int delete_file (gfc_unit *);
415 internal_proto(delete_file);
417 extern int file_exists (void);
418 internal_proto(file_exists);
420 extern const char *inquire_sequential (const char *, int);
421 internal_proto(inquire_sequential);
423 extern const char *inquire_direct (const char *, int);
424 internal_proto(inquire_direct);
426 extern const char *inquire_formatted (const char *, int);
427 internal_proto(inquire_formatted);
429 extern const char *inquire_unformatted (const char *, int);
430 internal_proto(inquire_unformatted);
432 extern const char *inquire_read (const char *, int);
433 internal_proto(inquire_read);
435 extern const char *inquire_write (const char *, int);
436 internal_proto(inquire_write);
438 extern const char *inquire_readwrite (const char *, int);
439 internal_proto(inquire_readwrite);
441 extern gfc_offset file_length (stream *);
442 internal_proto(file_length);
444 extern gfc_offset file_position (stream *);
445 internal_proto(file_position);
447 extern int is_seekable (stream *);
448 internal_proto(is_seekable);
450 extern void empty_internal_buffer(stream *);
451 internal_proto(empty_internal_buffer);
453 extern try flush (stream *);
454 internal_proto(flush);
456 extern int unit_to_fd (int);
457 internal_proto(unit_to_fd);
459 /* unit.c */
461 extern void insert_unit (gfc_unit *);
462 internal_proto(insert_unit);
464 extern int close_unit (gfc_unit *);
465 internal_proto(close_unit);
467 extern int is_internal_unit (void);
468 internal_proto(is_internal_unit);
470 extern gfc_unit *find_unit (int);
471 internal_proto(find_unit);
473 extern gfc_unit *get_unit (int);
474 internal_proto(get_unit);
476 /* open.c */
478 extern void test_endfile (gfc_unit *);
479 internal_proto(test_endfile);
481 extern void new_unit (unit_flags *);
482 internal_proto(new_unit);
484 /* format.c */
486 extern void parse_format (void);
487 internal_proto(parse_format);
489 extern fnode *next_format (void);
490 internal_proto(next_format);
492 extern void unget_format (fnode *);
493 internal_proto(unget_format);
495 extern void format_error (fnode *, const char *);
496 internal_proto(format_error);
498 extern void free_fnodes (void);
499 internal_proto(free_fnodes);
501 /* transfer.c */
503 #define SCRATCH_SIZE 300
505 extern char scratch[];
506 internal_proto(scratch);
508 extern const char *type_name (bt);
509 internal_proto(type_name);
511 extern void *read_block (int *);
512 internal_proto(read_block);
514 extern void *write_block (int);
515 internal_proto(write_block);
517 extern void next_record (int);
518 internal_proto(next_record);
520 /* read.c */
522 extern void set_integer (void *, int64_t, int);
523 internal_proto(set_integer);
525 extern uint64_t max_value (int, int);
526 internal_proto(max_value);
528 extern int convert_real (void *, const char *, int);
529 internal_proto(convert_real);
531 extern void read_a (fnode *, char *, int);
532 internal_proto(read_a);
534 extern void read_f (fnode *, char *, int);
535 internal_proto(read_f);
537 extern void read_l (fnode *, char *, int);
538 internal_proto(read_l);
540 extern void read_x (fnode *);
541 internal_proto(read_x);
543 extern void read_radix (fnode *, char *, int, int);
544 internal_proto(read_radix);
546 extern void read_decimal (fnode *, char *, int);
547 internal_proto(read_decimal);
549 /* list_read.c */
551 extern void list_formatted_read (bt, void *, int);
552 internal_proto(list_formatted_read);
554 extern void finish_list_read (void);
555 internal_proto(finish_list_read);
557 extern void init_at_eol();
558 internal_proto(init_at_eol);
560 extern void namelist_read();
561 internal_proto(namelist_read);
563 extern void namelist_write();
564 internal_proto(namelist_write);
566 /* write.c */
568 extern void write_a (fnode *, const char *, int);
569 internal_proto(write_a);
571 extern void write_b (fnode *, const char *, int);
572 internal_proto(write_b);
574 extern void write_d (fnode *, const char *, int);
575 internal_proto(write_d);
577 extern void write_e (fnode *, const char *, int);
578 internal_proto(write_e);
580 extern void write_en (fnode *, const char *, int);
581 internal_proto(write_en);
583 extern void write_es (fnode *, const char *, int);
584 internal_proto(write_es);
586 extern void write_f (fnode *, const char *, int);
587 internal_proto(write_f);
589 extern void write_i (fnode *, const char *, int);
590 internal_proto(write_i);
592 extern void write_l (fnode *, char *, int);
593 internal_proto(write_l);
595 extern void write_o (fnode *, const char *, int);
596 internal_proto(write_o);
598 extern void write_x (fnode *);
599 internal_proto(write_x);
601 extern void write_z (fnode *, const char *, int);
602 internal_proto(write_z);
604 extern void list_formatted_write (bt, void *, int);
605 internal_proto(list_formatted_write);
607 #endif