]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgfortran/io/io.h
Merge tree-ssa-20020619-branch into mainline.
[thirdparty/gcc.git] / libgfortran / io / io.h
1 /* Copyright (C) 2002-2003 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3
4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
5
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.
10
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.
15
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. */
20
21 #ifndef GFOR_IO_H
22 #define GFOR_IO_H
23
24 /* IO library include. */
25
26 #include <setjmp.h>
27 #include "libgfortran.h"
28 #define DEFAULT_TEMPDIR "/var/tmp"
29
30 /* Basic types used in data transfers. */
31
32 typedef enum
33 { BT_NULL, BT_INTEGER, BT_LOGICAL, BT_CHARACTER, BT_REAL,
34 BT_COMPLEX
35 }
36 bt;
37
38
39 typedef enum
40 { SUCCESS = 1, FAILURE }
41 try;
42
43 typedef struct stream
44 {
45 char *(*alloc_w_at) (struct stream *, int *, offset_t);
46 char *(*alloc_r_at) (struct stream *, int *, offset_t);
47 try (*sfree) (struct stream *);
48 try (*close) (struct stream *);
49 try (*seek) (struct stream *, offset_t);
50 try (*truncate) (struct stream *);
51 }
52 stream;
53
54
55 /* Macros for doing file I/O given a stream. */
56
57 #define sfree(s) ((s)->sfree)(s)
58 #define sclose(s) ((s)->close)(s)
59
60 #define salloc_r(s, len) ((s)->alloc_r_at)(s, len, -1)
61 #define salloc_w(s, len) ((s)->alloc_w_at)(s, len, -1)
62
63 #define salloc_r_at(s, len, where) ((s)->alloc_r_at)(s, len, where)
64 #define salloc_w_at(s, len, where) ((s)->alloc_w_at)(s, len, where)
65
66 #define sseek(s, pos) ((s)->seek)(s, pos)
67 #define struncate(s) ((s)->truncate)(s)
68
69 /* Namelist represent object */
70 /*
71 Namelist Records
72 &groupname object=value [,object=value].../
73 or
74 &groupname object=value [,object=value]...&groupname
75
76 Even more complex, during the execution of a program containing a
77 namelist READ statement, you can specify a question mark character(?)
78 or a question mark character preceded by an equal sign(=?) to get
79 the information of the namelist group. By '?', the name of variables
80 in the namelist will be displayed, by '=?', the name and value of
81 variables will be displayed.
82
83 All these requirements need a new data structure to record all info
84 about the namelist.
85 */
86
87 typedef struct namelist_type
88 {
89 char * var_name;
90 void * mem_pos;
91 int value_acquired;
92 int len;
93 bt type;
94 struct namelist_type * next;
95 }
96 namelist_info;
97
98 /* Options for the OPEN statement. */
99
100 typedef enum
101 { ACCESS_SEQUENTIAL, ACCESS_DIRECT,
102 ACCESS_UNSPECIFIED
103 }
104 unit_access;
105
106 typedef enum
107 { ACTION_READ, ACTION_WRITE, ACTION_READWRITE,
108 ACTION_UNSPECIFIED
109 }
110 unit_action;
111
112 typedef enum
113 { BLANK_NULL, BLANK_ZERO, BLANK_UNSPECIFIED }
114 unit_blank;
115
116 typedef enum
117 { DELIM_NONE, DELIM_APOSTROPHE, DELIM_QUOTE,
118 DELIM_UNSPECIFIED
119 }
120 unit_delim;
121
122 typedef enum
123 { FORM_FORMATTED, FORM_UNFORMATTED, FORM_UNSPECIFIED }
124 unit_form;
125
126 typedef enum
127 { POSITION_ASIS, POSITION_REWIND, POSITION_APPEND,
128 POSITION_UNSPECIFIED
129 }
130 unit_position;
131
132 typedef enum
133 { STATUS_UNKNOWN, STATUS_OLD, STATUS_NEW, STATUS_SCRATCH,
134 STATUS_REPLACE, STATUS_UNSPECIFIED
135 }
136 unit_status;
137
138 typedef enum
139 { PAD_YES, PAD_NO, PAD_UNSPECIFIED }
140 unit_pad;
141
142 typedef enum
143 { ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED }
144 unit_advance;
145
146
147
148 /* Statement parameters. These are all the things that can appear in
149 an I/O statement. Some are inputs and some are outputs, but none
150 are both. All of these values are initially zeroed and are zeroed
151 at the end of a library statement. The relevant values need to be
152 set before entry to an I/O statement. This structure needs to be
153 duplicated by the back end. */
154
155 typedef struct
156 {
157 int unit;
158 int err, end, eor, list_format; /* These are flags, not values. */
159
160 /* Return values from library statements. These are returned only if
161 the labels are specified in the statement itself and the condition
162 occurs. In most cases, none of the labels are specified and the
163 return value does not have to be checked. Must be consistent with
164 the front end. */
165
166 enum
167 {
168 LIBRARY_OK = 0,
169 LIBRARY_ERROR,
170 LIBRARY_END,
171 LIBRARY_EOR
172 }
173 library_return;
174
175 int *iostat, *exist, *opened, *number, *named, rec, *nextrec, *size;
176
177 int recl_in;
178 int *recl_out;
179
180 char *file;
181 int file_len;
182 char *status;
183 int status_len;
184 char *access;
185 int access_len;
186 char *form;
187 int form_len;
188 char *blank;
189 int blank_len;
190 char *position;
191 int position_len;
192 char *action;
193 int action_len;
194 char *delim;
195 int delim_len;
196 char *pad;
197 int pad_len;
198 char *format;
199 int format_len;
200 char *advance;
201 int advance_len;
202 char *name;
203 int name_len;
204 char *internal_unit;
205 int internal_unit_len;
206 char *sequential;
207 int sequential_len;
208 char *direct;
209 int direct_len;
210 char *formatted;
211 int formatted_len;
212 char *unformatted;
213 int unformatted_len;
214 char *read;
215 int read_len;
216 char *write;
217 int write_len;
218 char *readwrite;
219 int readwrite_len;
220
221 /* namelist related data */
222 char * namelist_name;
223 int namelist_name_len;
224 int namelist_read_mode;
225 }
226 st_parameter;
227
228
229
230 #define ioparm prefix(ioparm)
231 extern st_parameter ioparm;
232
233 #define ionml prefix(ionml)
234 extern namelist_info * ionml;
235
236 typedef struct
237 {
238 unit_access access;
239 unit_action action;
240 unit_blank blank;
241 unit_delim delim;
242 unit_form form;
243 int is_notpadded;
244 unit_position position;
245 unit_status status;
246 unit_pad pad;
247 }
248 unit_flags;
249
250
251 /* The default value of record length is defined here. This value can
252 be overriden by the OPEN statement or by an environment variable. */
253
254 #define DEFAULT_RECL 10000
255
256
257 typedef struct unit_t
258 {
259 int unit_number;
260
261 stream *s;
262
263 struct unit_t *left, *right; /* Treap links. */
264 int priority;
265
266 int read_bad, current_record;
267 enum
268 { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
269 endfile;
270
271 unit_flags flags;
272 offset_t recl, last_record, maxrec, bytes_left;
273
274 /* recl -- Record length of the file.
275 last_record -- Last record number read or written
276 maxrec -- Maximum record number in a direct access file
277 bytes_left -- Bytes left in current record. */
278
279 int file_len;
280 char file[1]; /* Filename is allocated at the end of the structure. */
281 }
282 unit_t;
283
284 /* Global variables. Putting these in a structure makes it easier to
285 maintain, particularly with the constraint of a prefix. */
286
287 typedef struct
288 {
289 int in_library; /* Nonzero if a library call is being processed. */
290 int size; /* Bytes processed by the current data-transfer statement. */
291 offset_t max_offset; /* Maximum file offset. */
292 int item_count; /* Item number in a formatted data transfer. */
293 int reversion_flag; /* Format reversion has occurred. */
294 int first_item;
295
296 unit_t *unit_root;
297 int seen_dollar;
298
299 enum {READING, WRITING} mode;
300
301 unit_blank blank_status;
302 enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status;
303 int scale_factor;
304 jmp_buf eof_jump;
305 }
306 global_t;
307
308
309 #define g prefix(g)
310 extern global_t g;
311
312
313 #define current_unit prefix(current_unit)
314 extern unit_t *current_unit;
315
316 /* Format tokens. Only about half of these can be stored in the
317 format nodes. */
318
319 typedef enum
320 {
321 FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
322 FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL,
323 FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
324 FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
325 FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END
326 }
327 format_token;
328
329
330 /* Format nodes. A format string is converted into a tree of these
331 structures, which is traversed as part of a data transfer statement. */
332
333 typedef struct fnode
334 {
335 format_token format;
336 int repeat;
337 struct fnode *next;
338 char *source;
339
340 union
341 {
342 struct
343 {
344 int w, d, e;
345 }
346 real;
347
348 struct
349 {
350 int length;
351 char *p;
352 }
353 string;
354
355 struct
356 {
357 int w, m;
358 }
359 integer;
360
361 int w;
362 int k;
363 int r;
364 int n;
365
366 struct fnode *child;
367 }
368 u;
369
370 /* Members for traversing the tree during data transfer. */
371
372 int count;
373 struct fnode *current;
374
375 }
376 fnode;
377
378
379 /* unix.c */
380
381 #define sys_exit prefix(sys_exit)
382 void sys_exit (int) __attribute__ ((noreturn));
383
384 #define move_pos_offset prefix(move_pos_offset)
385 int move_pos_offset (stream *, int);
386
387 #define get_oserror prefix(get_oserror)
388 const char *get_oserror (void);
389
390 #define compare_files prefix(compare_files)
391 int compare_files (stream *, stream *);
392
393 #define init_error_stream prefix(init_error_stream)
394 stream *init_error_stream (void);
395
396 #define open_external prefix(open_external)
397 stream *open_external (unit_action, unit_status);
398
399 #define open_internal prefix(open_internal)
400 stream *open_internal (char *, int);
401
402 #define input_stream prefix(input_stream)
403 stream *input_stream (void);
404
405 #define output_stream prefix(output_stream)
406 stream *output_stream (void);
407
408 #define compare_file_filename prefix(compare_file_filename)
409 int compare_file_filename (stream *, const char *, int);
410
411 #define find_file prefix(find_file)
412 unit_t *find_file (void);
413
414 #define stream_at_bof prefix(stream_at_bof)
415 int stream_at_bof (stream *);
416
417 #define stream_at_eof prefix(stream_at_eof)
418 int stream_at_eof (stream *);
419
420 #define delete_file prefix(delete_file)
421 int delete_file (unit_t *);
422
423 #define file_exists prefix(file_exists)
424 int file_exists (void);
425
426 #define inquire_sequential prefix(inquire_sequential)
427 const char *inquire_sequential (const char *, int);
428
429 #define inquire_direct prefix(inquire_direct)
430 const char *inquire_direct (const char *, int);
431
432 #define inquire_formatted prefix(inquire_formatted)
433 const char *inquire_formatted (const char *, int);
434
435 #define inquire_unformatted prefix(inquire_unformatted)
436 const char *inquire_unformatted (const char *, int);
437
438 #define inquire_read prefix(inquire_read)
439 const char *inquire_read (const char *, int);
440
441 #define inquire_write prefix(inquire_write)
442 const char *inquire_write (const char *, int);
443
444 #define inquire_readwrite prefix(inquire_readwrite)
445 const char *inquire_readwrite (const char *, int);
446
447 #define file_length prefix(file_length)
448 offset_t file_length (stream *);
449
450 #define file_position prefix(file_position)
451 offset_t file_position (stream *);
452
453 #define is_seekable prefix(is_seekable)
454 int is_seekable (stream *);
455
456 #define empty_internal_buffer prefix(empty_internal_buffer)
457 void empty_internal_buffer(stream *);
458
459
460 /* unit.c */
461
462 #define insert_unit prefix(insert_unix)
463 void insert_unit (unit_t *);
464
465 #define close_unit prefix(close_unit)
466 int close_unit (unit_t *);
467
468 #define is_internal_unit prefix(is_internal_unit)
469 int is_internal_unit (void);
470
471 #define find_unit prefix(find_unit)
472 unit_t *find_unit (int);
473
474 #define get_unit prefix(get_unit)
475 unit_t *get_unit (int);
476
477 /* open.c */
478
479 #define test_endfile prefix(test_endfile)
480 void test_endfile (unit_t *);
481
482 #define new_unit prefix(new_unit)
483 void new_unit (unit_flags *);
484
485 /* format.c */
486
487 #define parse_format prefix(parse_format)
488 void parse_format (void);
489
490 #define next_format prefix(next_format)
491 fnode *next_format (void);
492
493 #define unget_format prefix(unget_format)
494 void unget_format (fnode *);
495
496 #define format_error prefix(format_error)
497 void format_error (fnode *, const char *);
498
499 #define free_fnodes prefix(free_fnodes)
500 void free_fnodes (void);
501
502 /* transfer.c */
503
504 #define SCRATCH_SIZE 300
505
506 #define scratch prefix(scratch)
507 extern char scratch[];
508
509 #define type_name prefix(type_name)
510 const char *type_name (bt);
511
512 #define read_block prefix(read_block)
513 void *read_block (int *);
514
515 #define write_block prefix(write_block)
516 void *write_block (int);
517
518 #define transfer_integer prefix(transfer_integer)
519 void transfer_integer (void *, int);
520
521 #define transfer_real prefix(transfer_real)
522 void transfer_real (void *, int);
523
524 #define transfer_logical prefix(transfer_logical)
525 void transfer_logical (void *, int);
526
527 #define transfer_character prefix(transfer_character)
528 void transfer_character (void *, int);
529
530 #define transfer_complex prefix(transfer_complex)
531 void transfer_complex (void *, int);
532
533 #define next_record prefix(next_record)
534 void next_record (int);
535
536 #define st_set_nml_var_int prefix(st_set_nml_var_int)
537 void st_set_nml_var_int (void * , char * , int , int );
538
539 #define st_set_nml_var_float prefix(st_set_nml_var_float)
540 void st_set_nml_var_float (void * , char * , int , int );
541
542 #define st_set_nml_var_char prefix(st_set_nml_var_char)
543 void st_set_nml_var_char (void * , char * , int , int );
544
545 #define st_set_nml_var_complex prefix(st_set_nml_var_complex)
546 void st_set_nml_var_complex (void * , char * , int , int );
547
548 #define st_set_nml_var_log prefix(st_set_nml_var_log)
549 void st_set_nml_var_log (void * , char * , int , int );
550
551 /* read.c */
552
553 #define set_integer prefix(set_integer)
554 void set_integer (void *, int64_t, int);
555
556 #define max_value prefix(max_value)
557 uint64_t max_value (int, int);
558
559 #define convert_real prefix(convert_real)
560 int convert_real (void *, const char *, int);
561
562 #define read_a prefix(read_a)
563 void read_a (fnode *, char *, int);
564
565 #define read_f prefix(read_f)
566 void read_f (fnode *, char *, int);
567
568 #define read_l prefix(read_l)
569 void read_l (fnode *, char *, int);
570
571 #define read_x prefix(read_x)
572 void read_x (fnode *);
573
574 #define read_radix prefix(read_radix)
575 void read_radix (fnode *, char *, int, int);
576
577 #define read_decimal prefix(read_decimal)
578 void read_decimal (fnode *, char *, int);
579
580 /* list_read.c */
581
582 #define list_formatted_read prefix(list_formatted_read)
583 void list_formatted_read (bt, void *, int);
584
585 #define finish_list_read prefix(finish_list_read)
586 void finish_list_read (void);
587
588 #define init_at_eol prefix(init_at_eol)
589 void init_at_eol();
590
591 #define namelist_read prefix(namelist_read)
592 void namelist_read();
593
594 #define namelist_write prefix(namelist_write)
595 void namelist_write();
596
597 /* write.c */
598
599 #define write_a prefix(write_a)
600 void write_a (fnode *, const char *, int);
601
602 #define write_b prefix(write_b)
603 void write_b (fnode *, const char *, int);
604
605 #define write_d prefix(write_d)
606 void write_d (fnode *, const char *, int);
607
608 #define write_e prefix(write_e)
609 void write_e (fnode *, const char *, int);
610
611 #define write_en prefix(write_en)
612 void write_en (fnode *, const char *, int);
613
614 #define write_es prefix(write_es)
615 void write_es (fnode *, const char *, int);
616
617 #define write_f prefix(write_f)
618 void write_f (fnode *, const char *, int);
619
620 #define write_i prefix(write_i)
621 void write_i (fnode *, const char *, int);
622
623 #define write_l prefix(write_l)
624 void write_l (fnode *, char *, int);
625
626 #define write_o prefix(write_o)
627 void write_o (fnode *, const char *, int);
628
629 #define write_x prefix(write_x)
630 void write_x (fnode *);
631
632 #define write_z prefix(write_z)
633 void write_z (fnode *, const char *, int);
634
635 #define list_formatted_write prefix(list_formatted_write)
636 void list_formatted_write (bt, void *, int);
637
638
639 #define st_open prefix(st_open)
640 #define st_close prefix(st_close)
641 #define st_inquire prefix(st_inquire)
642 #define st_rewind prefix(st_rewind)
643 #define st_read prefix(st_read)
644 #define st_read_done prefix(st_read_done)
645 #define st_write prefix(st_write)
646 #define st_write_done prefix(st_write_done)
647 #define st_backspace prefix(st_backspace)
648 #define st_endfile prefix(st_endfile)
649
650
651 void __MAIN (void);
652
653 #endif