X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libgfortran%2Fio%2Fio.h;h=acbec77e62a6c43c464d9ba647121dedae7b9915;hb=64b1f82917a68f2b02df92f765380b899b7f31b8;hp=e0b251a5a82bcbccd028121a63fcb4749ddecbbc;hpb=4827c15351d2fe0acc50be35fae9cafb3914dfac;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index e0b251a5a82..acbec77e62a 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -1,11 +1,13 @@ -/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. Contributed by Andy Vaught + F2003 I/O support contributed by Jerry DeLisle This file is part of the GNU Fortran 95 runtime library (libgfortran). Libgfortran is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. Libgfortran is distributed in the hope that it will be useful, @@ -13,39 +15,25 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with Libgfortran; see the file COPYING. If not, write to -the Free Software Foundation, 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. -/* As a special exception, if you link this library with other files, - some of which are compiled with GCC, to produce an executable, - this library does not by itself cause the resulting executable - to be covered by the GNU General Public License. - This exception does not however invalidate any other reasons why - the executable file might be covered by the GNU General Public License. */ +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ #ifndef GFOR_IO_H #define GFOR_IO_H /* IO library include. */ -#include #include "libgfortran.h" -#ifdef HAVE_PRAGMA_WEAK -/* Used by gthr.h. */ -#define SUPPORTS_WEAK 1 -#endif - -#ifdef _AIX -#undef _LARGE_FILES -#define _LARGE_FILE_API -#endif +#include #include -#define DEFAULT_TEMPDIR "/tmp" - /* Basic types used in data transfers. */ typedef enum @@ -54,42 +42,22 @@ typedef enum } bt; - -typedef enum -{ SUCCESS = 1, FAILURE } -try; - +/* Forward declarations. */ struct st_parameter_dt; +typedef struct stream stream; +struct fbuf; +struct format_data; +typedef struct fnode fnode; +struct gfc_unit; -typedef struct stream -{ - char *(*alloc_w_at) (struct stream *, int *, gfc_offset); - char *(*alloc_r_at) (struct stream *, int *, gfc_offset); - try (*sfree) (struct stream *); - try (*close) (struct stream *); - try (*seek) (struct stream *, gfc_offset); - try (*truncate) (struct stream *); - int (*read) (struct stream *, void *, size_t *); - int (*write) (struct stream *, const void *, size_t *); -} -stream; - - -/* Macros for doing file I/O given a stream. */ -#define sfree(s) ((s)->sfree)(s) -#define sclose(s) ((s)->close)(s) +/* Macros for testing what kinds of I/O we are doing. */ -#define salloc_r(s, len) ((s)->alloc_r_at)(s, len, -1) -#define salloc_w(s, len) ((s)->alloc_w_at)(s, len, -1) +#define is_array_io(dtp) ((dtp)->internal_unit_desc) -#define salloc_r_at(s, len, where) ((s)->alloc_r_at)(s, len, where) -#define salloc_w_at(s, len, where) ((s)->alloc_w_at)(s, len, where) +#define is_internal_unit(dtp) ((dtp)->u.p.unit_is_internal) -#define sseek(s, pos) ((s)->seek)(s, pos) -#define struncate(s) ((s)->truncate)(s) -#define sread(s, buf, nbytes) ((s)->read)(s, buf, nbytes) -#define swrite(s, buf, nbytes) ((s)->write)(s, buf, nbytes) +#define is_stream_io(dtp) ((dtp)->u.p.current_unit->flags.access == ACCESS_STREAM) /* The array_loop_spec contains the variables for the loops over index ranges that are encountered. Since the variables can be negative, ssize_t @@ -111,6 +79,18 @@ typedef struct array_loop_spec } array_loop_spec; +/* A stucture to build a hash table for format data. */ + +#define FORMAT_HASH_SIZE 16 + +typedef struct format_hash_entry +{ + char *key; + gfc_charlen_type key_len; + struct format_data *hashed_fmt; +} +format_hash_entry; + /* Representation of a namelist object in libgfortran Namelist Records @@ -118,7 +98,7 @@ array_loop_spec; or &GROUPNAME OBJECT=value[s] [,OBJECT=value[s]]...&END - The object can be a fully qualified, compound name for an instrinsic + The object can be a fully qualified, compound name for an intrinsic type, derived types or derived type components. So, a substring a(:)%b(4)%ch(2:4)(1:7) has to be treated correctly in namelist read. Hence full information about the structure of the object has @@ -132,9 +112,8 @@ array_loop_spec; typedef struct namelist_type { - /* Object type, stored as GFC_DTYPE_xxxx. */ - bt type; + dtype type; /* Object name. */ char * var_name; @@ -166,7 +145,7 @@ namelist_info; /* Options for the OPEN statement. */ typedef enum -{ ACCESS_SEQUENTIAL, ACCESS_DIRECT, ACCESS_APPEND, +{ ACCESS_SEQUENTIAL, ACCESS_DIRECT, ACCESS_APPEND, ACCESS_STREAM, ACCESS_UNSPECIFIED } unit_access; @@ -208,6 +187,25 @@ typedef enum unit_pad; typedef enum +{ DECIMAL_POINT, DECIMAL_COMMA, DECIMAL_UNSPECIFIED } +unit_decimal; + +typedef enum +{ ENCODING_UTF8, ENCODING_DEFAULT, ENCODING_UNSPECIFIED } +unit_encoding; + +typedef enum +{ ROUND_UP, ROUND_DOWN, ROUND_ZERO, ROUND_NEAREST, ROUND_COMPATIBLE, + ROUND_PROCDEFINED, ROUND_UNSPECIFIED } +unit_round; + +/* NOTE: unit_sign must correspond with the sign_status enumerator in + st_parameter_dt to not break the ABI. */ +typedef enum +{ SIGN_PROCDEFINED, SIGN_SUPPRESS, SIGN_PLUS, SIGN_UNSPECIFIED } +unit_sign; + +typedef enum { ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED } unit_advance; @@ -215,6 +213,14 @@ typedef enum {READING, WRITING} unit_mode; +typedef enum +{ ASYNC_YES, ASYNC_NO, ASYNC_UNSPECIFIED } +unit_async; + +typedef enum +{ SIGN_S, SIGN_SS, SIGN_SP } +unit_sign_s; + #define CHARACTER1(name) \ char * name; \ gfc_charlen_type name ## _len @@ -222,41 +228,6 @@ unit_mode; gfc_charlen_type name ## _len; \ char * name -#define IOPARM_LIBRETURN_MASK (3 << 0) -#define IOPARM_LIBRETURN_OK (0 << 0) -#define IOPARM_LIBRETURN_ERROR (1 << 0) -#define IOPARM_LIBRETURN_END (2 << 0) -#define IOPARM_LIBRETURN_EOR (3 << 0) -#define IOPARM_ERR (1 << 2) -#define IOPARM_END (1 << 3) -#define IOPARM_EOR (1 << 4) -#define IOPARM_HAS_IOSTAT (1 << 5) -#define IOPARM_HAS_IOMSG (1 << 6) - -#define IOPARM_COMMON_MASK ((1 << 7) - 1) - -typedef struct st_parameter_common -{ - GFC_INTEGER_4 flags; - GFC_INTEGER_4 unit; - const char *filename; - GFC_INTEGER_4 line; - CHARACTER2 (iomsg); - GFC_INTEGER_4 *iostat; -} -st_parameter_common; - -#define IOPARM_OPEN_HAS_RECL_IN (1 << 7) -#define IOPARM_OPEN_HAS_FILE (1 << 8) -#define IOPARM_OPEN_HAS_STATUS (1 << 9) -#define IOPARM_OPEN_HAS_ACCESS (1 << 10) -#define IOPARM_OPEN_HAS_FORM (1 << 11) -#define IOPARM_OPEN_HAS_BLANK (1 << 12) -#define IOPARM_OPEN_HAS_POSITION (1 << 13) -#define IOPARM_OPEN_HAS_ACTION (1 << 14) -#define IOPARM_OPEN_HAS_DELIM (1 << 15) -#define IOPARM_OPEN_HAS_PAD (1 << 16) - typedef struct { st_parameter_common common; @@ -270,6 +241,13 @@ typedef struct CHARACTER2 (action); CHARACTER1 (delim); CHARACTER2 (pad); + CHARACTER1 (convert); + CHARACTER2 (decimal); + CHARACTER1 (encoding); + CHARACTER2 (round); + CHARACTER1 (sign); + CHARACTER2 (asynchronous); + GFC_INTEGER_4 *newunit; } st_parameter_open; @@ -294,28 +272,41 @@ st_parameter_filepos; #define IOPARM_INQUIRE_HAS_NAMED (1 << 10) #define IOPARM_INQUIRE_HAS_NEXTREC (1 << 11) #define IOPARM_INQUIRE_HAS_RECL_OUT (1 << 12) -#define IOPARM_INQUIRE_HAS_FILE (1 << 13) -#define IOPARM_INQUIRE_HAS_ACCESS (1 << 14) -#define IOPARM_INQUIRE_HAS_FORM (1 << 15) -#define IOPARM_INQUIRE_HAS_BLANK (1 << 16) -#define IOPARM_INQUIRE_HAS_POSITION (1 << 17) -#define IOPARM_INQUIRE_HAS_ACTION (1 << 18) -#define IOPARM_INQUIRE_HAS_DELIM (1 << 19) -#define IOPARM_INQUIRE_HAS_PAD (1 << 20) -#define IOPARM_INQUIRE_HAS_NAME (1 << 21) -#define IOPARM_INQUIRE_HAS_SEQUENTIAL (1 << 22) -#define IOPARM_INQUIRE_HAS_DIRECT (1 << 23) -#define IOPARM_INQUIRE_HAS_FORMATTED (1 << 24) -#define IOPARM_INQUIRE_HAS_UNFORMATTED (1 << 25) -#define IOPARM_INQUIRE_HAS_READ (1 << 26) -#define IOPARM_INQUIRE_HAS_WRITE (1 << 27) -#define IOPARM_INQUIRE_HAS_READWRITE (1 << 28) +#define IOPARM_INQUIRE_HAS_STRM_POS_OUT (1 << 13) +#define IOPARM_INQUIRE_HAS_FILE (1 << 14) +#define IOPARM_INQUIRE_HAS_ACCESS (1 << 15) +#define IOPARM_INQUIRE_HAS_FORM (1 << 16) +#define IOPARM_INQUIRE_HAS_BLANK (1 << 17) +#define IOPARM_INQUIRE_HAS_POSITION (1 << 18) +#define IOPARM_INQUIRE_HAS_ACTION (1 << 19) +#define IOPARM_INQUIRE_HAS_DELIM (1 << 20) +#define IOPARM_INQUIRE_HAS_PAD (1 << 21) +#define IOPARM_INQUIRE_HAS_NAME (1 << 22) +#define IOPARM_INQUIRE_HAS_SEQUENTIAL (1 << 23) +#define IOPARM_INQUIRE_HAS_DIRECT (1 << 24) +#define IOPARM_INQUIRE_HAS_FORMATTED (1 << 25) +#define IOPARM_INQUIRE_HAS_UNFORMATTED (1 << 26) +#define IOPARM_INQUIRE_HAS_READ (1 << 27) +#define IOPARM_INQUIRE_HAS_WRITE (1 << 28) +#define IOPARM_INQUIRE_HAS_READWRITE (1 << 29) +#define IOPARM_INQUIRE_HAS_CONVERT (1 << 30) +#define IOPARM_INQUIRE_HAS_FLAGS2 (1 << 31) + +#define IOPARM_INQUIRE_HAS_ASYNCHRONOUS (1 << 0) +#define IOPARM_INQUIRE_HAS_DECIMAL (1 << 1) +#define IOPARM_INQUIRE_HAS_ENCODING (1 << 2) +#define IOPARM_INQUIRE_HAS_ROUND (1 << 3) +#define IOPARM_INQUIRE_HAS_SIGN (1 << 4) +#define IOPARM_INQUIRE_HAS_PENDING (1 << 5) +#define IOPARM_INQUIRE_HAS_SIZE (1 << 6) +#define IOPARM_INQUIRE_HAS_ID (1 << 7) typedef struct { st_parameter_common common; GFC_INTEGER_4 *exist, *opened, *number, *named; GFC_INTEGER_4 *nextrec, *recl_out; + GFC_IO_INT *strm_pos_out; CHARACTER1 (file); CHARACTER2 (access); CHARACTER1 (form); @@ -332,11 +323,19 @@ typedef struct CHARACTER2 (read); CHARACTER1 (write); CHARACTER2 (readwrite); + CHARACTER1 (convert); + GFC_INTEGER_4 flags2; + CHARACTER1 (asynchronous); + CHARACTER2 (decimal); + CHARACTER1 (encoding); + CHARACTER2 (round); + CHARACTER1 (sign); + GFC_INTEGER_4 *pending; + GFC_IO_INT *size; + GFC_INTEGER_4 *id; } st_parameter_inquire; -struct gfc_unit; -struct format_data; #define IOPARM_DT_LIST_FORMAT (1 << 7) #define IOPARM_DT_NAMELIST_READ_MODE (1 << 8) @@ -347,14 +346,25 @@ struct format_data; #define IOPARM_DT_HAS_ADVANCE (1 << 13) #define IOPARM_DT_HAS_INTERNAL_UNIT (1 << 14) #define IOPARM_DT_HAS_NAMELIST_NAME (1 << 15) +#define IOPARM_DT_HAS_ID (1 << 16) +#define IOPARM_DT_HAS_POS (1 << 17) +#define IOPARM_DT_HAS_ASYNCHRONOUS (1 << 18) +#define IOPARM_DT_HAS_BLANK (1 << 19) +#define IOPARM_DT_HAS_DECIMAL (1 << 20) +#define IOPARM_DT_HAS_DELIM (1 << 21) +#define IOPARM_DT_HAS_PAD (1 << 22) +#define IOPARM_DT_HAS_ROUND (1 << 23) +#define IOPARM_DT_HAS_SIGN (1 << 24) +#define IOPARM_DT_HAS_F2003 (1 << 25) /* Internal use bit. */ #define IOPARM_DT_IONML_SET (1 << 31) + typedef struct st_parameter_dt { st_parameter_common common; - GFC_INTEGER_4 rec; - GFC_INTEGER_4 *size, *iolength; + GFC_IO_INT rec; + GFC_IO_INT *size, *iolength; gfc_array_char *internal_unit_desc; CHARACTER1 (format); CHARACTER2 (advance); @@ -369,22 +379,27 @@ typedef struct st_parameter_dt void (*transfer) (struct st_parameter_dt *, bt, void *, int, size_t, size_t); struct gfc_unit *current_unit; - int item_count; /* Item number in a formatted data transfer. */ + /* Item number in a formatted data transfer. Also used in namelist + read_logical as an index into line_buffer. */ + int item_count; unit_mode mode; unit_blank blank_status; - enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status; + unit_sign sign_status; int scale_factor; int max_pos; /* Maximum righthand column written to. */ /* Number of skips + spaces to be done for T and X-editing. */ int skips; /* Number of spaces to be done for T and X-editing. */ int pending_spaces; + /* Whether an EOR condition was encountered. Value is: + 0 if no EOR was encountered + 1 if an EOR was encountered due to a 1-byte marker (LF) + 2 if an EOR was encountered due to a 2-bytes marker (CRLF) */ + int sf_seen_eor; unit_advance advance_status; - unsigned reversion_flag : 1; /* Format reversion has occurred. */ unsigned first_item : 1; unsigned seen_dollar : 1; - unsigned sf_seen_eor : 1; unsigned eor_condition : 1; unsigned no_leading_blank : 1; unsigned char_flag : 1; @@ -399,7 +414,24 @@ typedef struct st_parameter_dt to flag read errors and return, so that an attempt can be made to read a new object name. */ unsigned nml_read_error : 1; - /* 20 unused bits. */ + /* A sequential formatted read specific flag used to signal that a + character string is being read so don't use commas to shorten a + formatted field width. */ + unsigned sf_read_comma : 1; + /* A namelist specific flag used to enable reading input from + line_buffer for logical reads. */ + unsigned line_buffer_enabled : 1; + /* An internal unit specific flag used to identify that the associated + unit is internal. */ + unsigned unit_is_internal : 1; + /* An internal unit specific flag to signify an EOF condition for list + directed read. */ + unsigned at_eof : 1; + /* Used for g0 floating point output. */ + unsigned g0_no_blanks : 1; + /* Used to signal use of free_format_data. */ + unsigned format_not_saved : 1; + /* 14 unused bits. */ char last_char; char nml_delim; @@ -414,17 +446,47 @@ typedef struct st_parameter_dt struct format_data *fmt; jmp_buf *eof_jump; namelist_info *ionml; - - /* Storage area for values except for strings. Must be large - enough to hold a complex value (two reals) of the largest - kind. */ + /* A flag used to identify when a non-standard expanded namelist read + has occurred. */ + int expanded_read; + /* Storage area for values except for strings. Must be + large enough to hold a complex value (two reals) of the + largest kind. */ char value[32]; + GFC_IO_INT size_used; } p; + /* This pad size must be equal to the pad_size declared in + trans-io.c (gfc_build_io_library_fndecls). The above structure + must be smaller or equal to this array. */ char pad[16 * sizeof (char *) + 32 * sizeof (int)]; } u; + GFC_INTEGER_4 *id; + GFC_IO_INT pos; + CHARACTER1 (asynchronous); + CHARACTER2 (blank); + CHARACTER1 (decimal); + CHARACTER2 (delim); + CHARACTER1 (pad); + CHARACTER2 (round); + CHARACTER1 (sign); } st_parameter_dt; +/* Ensure st_parameter_dt's u.pad is bigger or equal to u.p. */ +extern char check_st_parameter_dt[sizeof (((st_parameter_dt *) 0)->u.pad) + >= sizeof (((st_parameter_dt *) 0)->u.p) + ? 1 : -1]; + +#define IOPARM_WAIT_HAS_ID (1 << 7) + +typedef struct +{ + st_parameter_common common; + CHARACTER1 (id); +} +st_parameter_wait; + + #undef CHARACTER1 #undef CHARACTER2 @@ -439,17 +501,17 @@ typedef struct unit_position position; unit_status status; unit_pad pad; + unit_convert convert; + int has_recl; + unit_decimal decimal; + unit_encoding encoding; + unit_round round; + unit_sign sign; + unit_async async; } unit_flags; -/* The default value of record length for preconnected units is defined - here. This value can be overriden by an environment variable. - Default value is 1 Gb. */ - -#define DEFAULT_RECL 1073741824 - - typedef struct gfc_unit { int unit_number; @@ -459,19 +521,32 @@ typedef struct gfc_unit struct gfc_unit *left, *right; int priority; - int read_bad, current_record; + int read_bad, current_record, saved_pos, previous_nonadvancing_write; + enum { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE } endfile; unit_mode mode; unit_flags flags; + unit_pad pad_status; + unit_decimal decimal_status; + unit_delim delim_status; + unit_round round_status; + + /* recl -- Record length of the file. + last_record -- Last record number read or written + maxrec -- Maximum record number in a direct access file + bytes_left -- Bytes left in current record. + strm_pos -- Current position in file for STREAM I/O. + recl_subrecord -- Maximum length for subrecord. + bytes_left_subrecord -- Bytes left in current subrecord. */ + gfc_offset recl, last_record, maxrec, bytes_left, strm_pos, + recl_subrecord, bytes_left_subrecord; - /* recl -- Record length of the file. - last_record -- Last record number read or written - maxrec -- Maximum record number in a direct access file - bytes_left -- Bytes left in current record. */ - gfc_offset recl, last_record, maxrec, bytes_left; + /* Set to 1 if we have read a subrecord. */ + + int continued; __gthread_mutex_t lock; /* Number of threads waiting to acquire this unit's lock. @@ -491,172 +566,15 @@ typedef struct gfc_unit int file_len; char *file; -} -gfc_unit; - -/* Format tokens. Only about half of these can be stored in the - format nodes. */ - -typedef enum -{ - FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD, - FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL, - FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING, - FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F, - FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END -} -format_token; - - -/* Format nodes. A format string is converted into a tree of these - structures, which is traversed as part of a data transfer statement. */ - -typedef struct fnode -{ - format_token format; - int repeat; - struct fnode *next; - char *source; - - union - { - struct - { - int w, d, e; - } - real; - - struct - { - int length; - char *p; - } - string; - - struct - { - int w, m; - } - integer; - - int w; - int k; - int r; - int n; - - struct fnode *child; - } - u; - - /* Members for traversing the tree during data transfer. */ - - int count; - struct fnode *current; + /* The format hash table. */ + struct format_hash_entry format_hash_table[FORMAT_HASH_SIZE]; + + /* Formatting buffer. */ + struct fbuf *fbuf; } -fnode; - - -/* unix.c */ - -extern int move_pos_offset (stream *, int); -internal_proto(move_pos_offset); - -extern int compare_files (stream *, stream *); -internal_proto(compare_files); - -extern stream *open_external (st_parameter_open *, unit_flags *); -internal_proto(open_external); - -extern stream *open_internal (char *, int); -internal_proto(open_internal); - -extern stream *input_stream (void); -internal_proto(input_stream); - -extern stream *output_stream (void); -internal_proto(output_stream); - -extern stream *error_stream (void); -internal_proto(error_stream); - -extern int compare_file_filename (gfc_unit *, const char *, int); -internal_proto(compare_file_filename); - -extern gfc_unit *find_file (const char *file, gfc_charlen_type file_len); -internal_proto(find_file); - -extern void flush_all_units (void); -internal_proto(flush_all_units); - -extern int stream_at_bof (stream *); -internal_proto(stream_at_bof); - -extern int stream_at_eof (stream *); -internal_proto(stream_at_eof); - -extern int delete_file (gfc_unit *); -internal_proto(delete_file); - -extern int file_exists (const char *file, gfc_charlen_type file_len); -internal_proto(file_exists); - -extern const char *inquire_sequential (const char *, int); -internal_proto(inquire_sequential); - -extern const char *inquire_direct (const char *, int); -internal_proto(inquire_direct); - -extern const char *inquire_formatted (const char *, int); -internal_proto(inquire_formatted); - -extern const char *inquire_unformatted (const char *, int); -internal_proto(inquire_unformatted); - -extern const char *inquire_read (const char *, int); -internal_proto(inquire_read); - -extern const char *inquire_write (const char *, int); -internal_proto(inquire_write); - -extern const char *inquire_readwrite (const char *, int); -internal_proto(inquire_readwrite); - -extern gfc_offset file_length (stream *); -internal_proto(file_length); - -extern gfc_offset file_position (stream *); -internal_proto(file_position); - -extern int is_seekable (stream *); -internal_proto(is_seekable); - -extern int is_preconnected (stream *); -internal_proto(is_preconnected); - -extern void flush_if_preconnected (stream *); -internal_proto(flush_if_preconnected); - -extern void empty_internal_buffer(stream *); -internal_proto(empty_internal_buffer); - -extern try flush (stream *); -internal_proto(flush); - -extern int stream_isatty (stream *); -internal_proto(stream_isatty); - -extern char * stream_ttyname (stream *); -internal_proto(stream_ttyname); - -extern gfc_offset stream_offset (stream *s); -internal_proto(stream_offset); - -extern int unit_to_fd (int); -internal_proto(unit_to_fd); +gfc_unit; -extern int unpack_filename (char *, const char *, int); -internal_proto(unpack_filename); /* unit.c */ @@ -664,6 +582,10 @@ internal_proto(unpack_filename); extern gfc_offset max_offset; internal_proto(max_offset); +/* Unit number to be assigned when NEWUNIT is used in an OPEN statement. */ +extern GFC_INTEGER_4 next_available_newunit; +internal_proto(next_available_newunit); + /* Unit tree root. */ extern gfc_unit *unit_root; internal_proto(unit_root); @@ -674,17 +596,17 @@ internal_proto(unit_lock); extern int close_unit (gfc_unit *); internal_proto(close_unit); -extern int is_internal_unit (st_parameter_dt *); -internal_proto(is_internal_unit); +extern gfc_unit *get_internal_unit (st_parameter_dt *); +internal_proto(get_internal_unit); -extern int is_array_io (st_parameter_dt *); -internal_proto(is_array_io); +extern void free_internal_unit (st_parameter_dt *); +internal_proto(free_internal_unit); extern gfc_unit *find_unit (int); internal_proto(find_unit); extern gfc_unit *find_or_create_unit (int); -internal_proto(find_unit); +internal_proto(find_or_create_unit); extern gfc_unit *get_unit (st_parameter_dt *, int); internal_proto(get_unit); @@ -692,30 +614,23 @@ internal_proto(get_unit); extern void unlock_unit (gfc_unit *); internal_proto(unlock_unit); -/* open.c */ - -extern void test_endfile (gfc_unit *); -internal_proto(test_endfile); +extern void update_position (gfc_unit *); +internal_proto(update_position); -extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *); -internal_proto(new_unit); - -/* format.c */ +extern void finish_last_advance_record (gfc_unit *u); +internal_proto (finish_last_advance_record); -extern void parse_format (st_parameter_dt *); -internal_proto(parse_format); +extern int unit_truncate (gfc_unit *, gfc_offset, st_parameter_common *); +internal_proto (unit_truncate); -extern const fnode *next_format (st_parameter_dt *); -internal_proto(next_format); +extern GFC_INTEGER_4 get_unique_unit_number (st_parameter_open *); +internal_proto(get_unique_unit_number); -extern void unget_format (st_parameter_dt *, const fnode *); -internal_proto(unget_format); +/* open.c */ -extern void format_error (st_parameter_dt *, const fnode *, const char *); -internal_proto(format_error); +extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *); +internal_proto(new_unit); -extern void free_format_data (st_parameter_dt *); -internal_proto(free_format_data); /* transfer.c */ @@ -724,21 +639,32 @@ internal_proto(free_format_data); extern const char *type_name (bt); internal_proto(type_name); -extern void *read_block (st_parameter_dt *, int *); -internal_proto(read_block); +extern void * read_block_form (st_parameter_dt *, int *); +internal_proto(read_block_form); extern void *write_block (st_parameter_dt *, int); internal_proto(write_block); -extern gfc_offset next_array_record (st_parameter_dt *, array_loop_spec *); +extern gfc_offset next_array_record (st_parameter_dt *, array_loop_spec *, + int*); internal_proto(next_array_record); -extern gfc_offset init_loop_spec (gfc_array_char *, array_loop_spec *); +extern gfc_offset init_loop_spec (gfc_array_char *, array_loop_spec *, + gfc_offset *); internal_proto(init_loop_spec); extern void next_record (st_parameter_dt *, int); internal_proto(next_record); +extern void reverse_memcpy (void *, const void *, size_t); +internal_proto (reverse_memcpy); + +extern void st_wait (st_parameter_wait *); +export_proto(st_wait); + +extern void hit_eof (st_parameter_dt *); +internal_proto(hit_eof); + /* read.c */ extern void set_integer (void *, GFC_INTEGER_LARGEST, int); @@ -753,6 +679,9 @@ internal_proto(convert_real); extern void read_a (st_parameter_dt *, const fnode *, char *, int); internal_proto(read_a); +extern void read_a_char4 (st_parameter_dt *, const fnode *, char *, int); +internal_proto(read_a); + extern void read_f (st_parameter_dt *, const fnode *, char *, int); internal_proto(read_f); @@ -788,6 +717,9 @@ internal_proto(namelist_write); extern void write_a (st_parameter_dt *, const fnode *, const char *, int); internal_proto(write_a); +extern void write_a_char4 (st_parameter_dt *, const fnode *, const char *, int); +internal_proto(write_a_char4); + extern void write_b (st_parameter_dt *, const fnode *, const char *, int); internal_proto(write_b); @@ -815,6 +747,12 @@ internal_proto(write_l); extern void write_o (st_parameter_dt *, const fnode *, const char *, int); internal_proto(write_o); +extern void write_real (st_parameter_dt *, const char *, int); +internal_proto(write_real); + +extern void write_real_g0 (st_parameter_dt *, const char *, int, int); +internal_proto(write_real_g0); + extern void write_x (st_parameter_dt *, int, int); internal_proto(write_x); @@ -825,10 +763,6 @@ extern void list_formatted_write (st_parameter_dt *, bt, void *, int, size_t, size_t); internal_proto(list_formatted_write); -/* error.c */ -extern try notify_std (int, const char *); -internal_proto(notify_std); - /* size_from_kind.c */ extern size_t size_from_real_kind (int); internal_proto(size_from_real_kind); @@ -836,6 +770,7 @@ internal_proto(size_from_real_kind); extern size_t size_from_complex_kind (int); internal_proto(size_from_complex_kind); + /* lock.c */ extern void free_ionml (st_parameter_dt *); internal_proto(free_ionml); @@ -873,3 +808,4 @@ dec_waiting_unlocked (gfc_unit *u) } #endif +