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)
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. */
31 /* IO library include. */
34 #include "libgfortran.h"
36 #define DEFAULT_TEMPDIR "/var/tmp"
38 /* Basic types used in data transfers. */
41 { BT_NULL
, BT_INTEGER
, BT_LOGICAL
, BT_CHARACTER
, BT_REAL
,
48 { SUCCESS
= 1, FAILURE
}
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
*);
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 */
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
95 typedef struct namelist_type
103 struct namelist_type
* next
;
107 /* Options for the OPEN statement. */
110 { ACCESS_SEQUENTIAL
, ACCESS_DIRECT
,
116 { ACTION_READ
, ACTION_WRITE
, ACTION_READWRITE
,
122 { BLANK_NULL
, BLANK_ZERO
, BLANK_UNSPECIFIED
}
126 { DELIM_NONE
, DELIM_APOSTROPHE
, DELIM_QUOTE
,
132 { FORM_FORMATTED
, FORM_UNFORMATTED
, FORM_UNSPECIFIED
}
136 { POSITION_ASIS
, POSITION_REWIND
, POSITION_APPEND
,
142 { STATUS_UNKNOWN
, STATUS_OLD
, STATUS_NEW
, STATUS_SCRATCH
,
143 STATUS_REPLACE
, STATUS_UNSPECIFIED
148 { PAD_YES
, PAD_NO
, PAD_UNSPECIFIED
}
152 { ADVANCE_YES
, ADVANCE_NO
, ADVANCE_UNSPECIFIED
}
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. */
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
186 GFC_INTEGER_4
*iostat
, *exist
, *opened
, *number
, *named
;
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) \
197 gfc_charlen_type name ## _len
203 CHARACTER (position
);
210 CHARACTER (internal_unit
);
211 CHARACTER (sequential
);
213 CHARACTER (formatted
);
214 CHARACTER (unformatted
);
217 CHARACTER (readwrite
);
219 /* namelist related data */
220 CHARACTER (namelist_name
);
221 GFC_INTEGER_4 namelist_read_mode
;
227 extern st_parameter ioparm
;
228 iexport_data_proto(ioparm
);
230 extern namelist_info
* ionml
;
231 internal_proto(ionml
);
241 unit_position position
;
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
261 struct gfc_unit
*left
, *right
; /* Treap links. */
264 int read_bad
, current_record
;
266 { NO_ENDFILE
, AT_ENDFILE
, AFTER_ENDFILE
}
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. */
279 char file
[1]; /* Filename is allocated at the end of the structure. */
283 /* Global variables. Putting these in a structure makes it easier to
284 maintain, particularly with the constraint of a prefix. */
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. */
300 unit_blank blank_status
;
301 enum {SIGN_S
, SIGN_SS
, SIGN_SP
} sign_status
;
310 extern gfc_unit
*current_unit
;
311 internal_proto(current_unit
);
313 /* Format tokens. Only about half of these can be stored in the
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
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. */
367 /* Members for traversing the tree during data transfer. */
370 struct fnode
*current
;
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
);
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
);
478 extern void test_endfile (gfc_unit
*);
479 internal_proto(test_endfile
);
481 extern void new_unit (unit_flags
*);
482 internal_proto(new_unit
);
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
);
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
);
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
);
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
);
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
);