]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgfortran/io/io.h
1 /* Copyright (C) 2002-2003 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)
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. */
24 /* IO library include. */
27 #include "libgfortran.h"
28 #define DEFAULT_TEMPDIR "/var/tmp"
30 /* Basic types used in data transfers. */
33 { BT_NULL
, BT_INTEGER
, BT_LOGICAL
, BT_CHARACTER
, BT_REAL
,
40 { SUCCESS
= 1, FAILURE
}
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
*);
55 /* Macros for doing file I/O given a stream. */
57 #define sfree(s) ((s)->sfree)(s)
58 #define sclose(s) ((s)->close)(s)
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)
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)
66 #define sseek(s, pos) ((s)->seek)(s, pos)
67 #define struncate(s) ((s)->truncate)(s)
69 /* Namelist represent object */
72 &groupname object=value [,object=value].../
74 &groupname object=value [,object=value]...&groupname
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.
83 All these requirements need a new data structure to record all info
87 typedef struct namelist_type
94 struct namelist_type
* next
;
98 /* Options for the OPEN statement. */
101 { ACCESS_SEQUENTIAL
, ACCESS_DIRECT
,
107 { ACTION_READ
, ACTION_WRITE
, ACTION_READWRITE
,
113 { BLANK_NULL
, BLANK_ZERO
, BLANK_UNSPECIFIED
}
117 { DELIM_NONE
, DELIM_APOSTROPHE
, DELIM_QUOTE
,
123 { FORM_FORMATTED
, FORM_UNFORMATTED
, FORM_UNSPECIFIED
}
127 { POSITION_ASIS
, POSITION_REWIND
, POSITION_APPEND
,
133 { STATUS_UNKNOWN
, STATUS_OLD
, STATUS_NEW
, STATUS_SCRATCH
,
134 STATUS_REPLACE
, STATUS_UNSPECIFIED
139 { PAD_YES
, PAD_NO
, PAD_UNSPECIFIED
}
143 { ADVANCE_YES
, ADVANCE_NO
, ADVANCE_UNSPECIFIED
}
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. */
158 int err
, end
, eor
, list_format
; /* These are flags, not values. */
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
175 int *iostat
, *exist
, *opened
, *number
, *named
, rec
, *nextrec
, *size
;
205 int internal_unit_len
;
221 /* namelist related data */
222 char * namelist_name
;
223 int namelist_name_len
;
224 int namelist_read_mode
;
230 #define ioparm prefix(ioparm)
231 extern st_parameter ioparm
;
233 #define ionml prefix(ionml)
234 extern namelist_info
* ionml
;
244 unit_position position
;
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. */
254 #define DEFAULT_RECL 10000
257 typedef struct unit_t
263 struct unit_t
*left
, *right
; /* Treap links. */
266 int read_bad
, current_record
;
268 { NO_ENDFILE
, AT_ENDFILE
, AFTER_ENDFILE
}
272 offset_t recl
, last_record
, maxrec
, bytes_left
;
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. */
280 char file
[1]; /* Filename is allocated at the end of the structure. */
284 /* Global variables. Putting these in a structure makes it easier to
285 maintain, particularly with the constraint of a prefix. */
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. */
299 enum {READING
, WRITING
} mode
;
301 unit_blank blank_status
;
302 enum {SIGN_S
, SIGN_SS
, SIGN_SP
} sign_status
;
313 #define current_unit prefix(current_unit)
314 extern unit_t
*current_unit
;
316 /* Format tokens. Only about half of these can be stored in the
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
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. */
370 /* Members for traversing the tree during data transfer. */
373 struct fnode
*current
;
381 #define sys_exit prefix(sys_exit)
382 void sys_exit (int) __attribute__ ((noreturn
));
384 #define move_pos_offset prefix(move_pos_offset)
385 int move_pos_offset (stream
*, int);
387 #define get_oserror prefix(get_oserror)
388 const char *get_oserror (void);
390 #define compare_files prefix(compare_files)
391 int compare_files (stream
*, stream
*);
393 #define init_error_stream prefix(init_error_stream)
394 stream
*init_error_stream (void);
396 #define open_external prefix(open_external)
397 stream
*open_external (unit_action
, unit_status
);
399 #define open_internal prefix(open_internal)
400 stream
*open_internal (char *, int);
402 #define input_stream prefix(input_stream)
403 stream
*input_stream (void);
405 #define output_stream prefix(output_stream)
406 stream
*output_stream (void);
408 #define compare_file_filename prefix(compare_file_filename)
409 int compare_file_filename (stream
*, const char *, int);
411 #define find_file prefix(find_file)
412 unit_t
*find_file (void);
414 #define stream_at_bof prefix(stream_at_bof)
415 int stream_at_bof (stream
*);
417 #define stream_at_eof prefix(stream_at_eof)
418 int stream_at_eof (stream
*);
420 #define delete_file prefix(delete_file)
421 int delete_file (unit_t
*);
423 #define file_exists prefix(file_exists)
424 int file_exists (void);
426 #define inquire_sequential prefix(inquire_sequential)
427 const char *inquire_sequential (const char *, int);
429 #define inquire_direct prefix(inquire_direct)
430 const char *inquire_direct (const char *, int);
432 #define inquire_formatted prefix(inquire_formatted)
433 const char *inquire_formatted (const char *, int);
435 #define inquire_unformatted prefix(inquire_unformatted)
436 const char *inquire_unformatted (const char *, int);
438 #define inquire_read prefix(inquire_read)
439 const char *inquire_read (const char *, int);
441 #define inquire_write prefix(inquire_write)
442 const char *inquire_write (const char *, int);
444 #define inquire_readwrite prefix(inquire_readwrite)
445 const char *inquire_readwrite (const char *, int);
447 #define file_length prefix(file_length)
448 offset_t
file_length (stream
*);
450 #define file_position prefix(file_position)
451 offset_t
file_position (stream
*);
453 #define is_seekable prefix(is_seekable)
454 int is_seekable (stream
*);
456 #define empty_internal_buffer prefix(empty_internal_buffer)
457 void empty_internal_buffer(stream
*);
462 #define insert_unit prefix(insert_unix)
463 void insert_unit (unit_t
*);
465 #define close_unit prefix(close_unit)
466 int close_unit (unit_t
*);
468 #define is_internal_unit prefix(is_internal_unit)
469 int is_internal_unit (void);
471 #define find_unit prefix(find_unit)
472 unit_t
*find_unit (int);
474 #define get_unit prefix(get_unit)
475 unit_t
*get_unit (int);
479 #define test_endfile prefix(test_endfile)
480 void test_endfile (unit_t
*);
482 #define new_unit prefix(new_unit)
483 void new_unit (unit_flags
*);
487 #define parse_format prefix(parse_format)
488 void parse_format (void);
490 #define next_format prefix(next_format)
491 fnode
*next_format (void);
493 #define unget_format prefix(unget_format)
494 void unget_format (fnode
*);
496 #define format_error prefix(format_error)
497 void format_error (fnode
*, const char *);
499 #define free_fnodes prefix(free_fnodes)
500 void free_fnodes (void);
504 #define SCRATCH_SIZE 300
506 #define scratch prefix(scratch)
507 extern char scratch
[];
509 #define type_name prefix(type_name)
510 const char *type_name (bt
);
512 #define read_block prefix(read_block)
513 void *read_block (int *);
515 #define write_block prefix(write_block)
516 void *write_block (int);
518 #define transfer_integer prefix(transfer_integer)
519 void transfer_integer (void *, int);
521 #define transfer_real prefix(transfer_real)
522 void transfer_real (void *, int);
524 #define transfer_logical prefix(transfer_logical)
525 void transfer_logical (void *, int);
527 #define transfer_character prefix(transfer_character)
528 void transfer_character (void *, int);
530 #define transfer_complex prefix(transfer_complex)
531 void transfer_complex (void *, int);
533 #define next_record prefix(next_record)
534 void next_record (int);
536 #define st_set_nml_var_int prefix(st_set_nml_var_int)
537 void st_set_nml_var_int (void * , char * , int , int );
539 #define st_set_nml_var_float prefix(st_set_nml_var_float)
540 void st_set_nml_var_float (void * , char * , int , int );
542 #define st_set_nml_var_char prefix(st_set_nml_var_char)
543 void st_set_nml_var_char (void * , char * , int , int );
545 #define st_set_nml_var_complex prefix(st_set_nml_var_complex)
546 void st_set_nml_var_complex (void * , char * , int , int );
548 #define st_set_nml_var_log prefix(st_set_nml_var_log)
549 void st_set_nml_var_log (void * , char * , int , int );
553 #define set_integer prefix(set_integer)
554 void set_integer (void *, int64_t, int);
556 #define max_value prefix(max_value)
557 uint64_t max_value (int, int);
559 #define convert_real prefix(convert_real)
560 int convert_real (void *, const char *, int);
562 #define read_a prefix(read_a)
563 void read_a (fnode
*, char *, int);
565 #define read_f prefix(read_f)
566 void read_f (fnode
*, char *, int);
568 #define read_l prefix(read_l)
569 void read_l (fnode
*, char *, int);
571 #define read_x prefix(read_x)
572 void read_x (fnode
*);
574 #define read_radix prefix(read_radix)
575 void read_radix (fnode
*, char *, int, int);
577 #define read_decimal prefix(read_decimal)
578 void read_decimal (fnode
*, char *, int);
582 #define list_formatted_read prefix(list_formatted_read)
583 void list_formatted_read (bt
, void *, int);
585 #define finish_list_read prefix(finish_list_read)
586 void finish_list_read (void);
588 #define init_at_eol prefix(init_at_eol)
591 #define namelist_read prefix(namelist_read)
592 void namelist_read();
594 #define namelist_write prefix(namelist_write)
595 void namelist_write();
599 #define write_a prefix(write_a)
600 void write_a (fnode
*, const char *, int);
602 #define write_b prefix(write_b)
603 void write_b (fnode
*, const char *, int);
605 #define write_d prefix(write_d)
606 void write_d (fnode
*, const char *, int);
608 #define write_e prefix(write_e)
609 void write_e (fnode
*, const char *, int);
611 #define write_en prefix(write_en)
612 void write_en (fnode
*, const char *, int);
614 #define write_es prefix(write_es)
615 void write_es (fnode
*, const char *, int);
617 #define write_f prefix(write_f)
618 void write_f (fnode
*, const char *, int);
620 #define write_i prefix(write_i)
621 void write_i (fnode
*, const char *, int);
623 #define write_l prefix(write_l)
624 void write_l (fnode
*, char *, int);
626 #define write_o prefix(write_o)
627 void write_o (fnode
*, const char *, int);
629 #define write_x prefix(write_x)
630 void write_x (fnode
*);
632 #define write_z prefix(write_z)
633 void write_z (fnode
*, const char *, int);
635 #define list_formatted_write prefix(list_formatted_write)
636 void list_formatted_write (bt
, void *, int);
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)