| Index: gcc/libgfortran/io/io.h
|
| diff --git a/gcc/libgfortran/io/io.h b/gcc/libgfortran/io/io.h
|
| index d3c658901a1a9d66b224466f3022f027c0c1b7dd..acbec77e62a6c43c464d9ba647121dedae7b9915 100644
|
| --- a/gcc/libgfortran/io/io.h
|
| +++ b/gcc/libgfortran/io/io.h
|
| @@ -1,4 +1,4 @@
|
| -/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
| +/* 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
|
| @@ -42,63 +42,13 @@ typedef enum
|
| }
|
| bt;
|
|
|
| +/* Forward declarations. */
|
| struct st_parameter_dt;
|
| -
|
| -typedef struct stream
|
| -{
|
| - ssize_t (*read) (struct stream *, void *, ssize_t);
|
| - ssize_t (*write) (struct stream *, const void *, ssize_t);
|
| - off_t (*seek) (struct stream *, off_t, int);
|
| - off_t (*tell) (struct stream *);
|
| - /* Avoid keyword truncate due to AIX namespace collision. */
|
| - int (*trunc) (struct stream *, off_t);
|
| - int (*flush) (struct stream *);
|
| - int (*close) (struct stream *);
|
| -}
|
| -stream;
|
| -
|
| -/* Inline functions for doing file I/O given a stream. */
|
| -static inline ssize_t
|
| -sread (stream * s, void * buf, ssize_t nbyte)
|
| -{
|
| - return s->read (s, buf, nbyte);
|
| -}
|
| -
|
| -static inline ssize_t
|
| -swrite (stream * s, const void * buf, ssize_t nbyte)
|
| -{
|
| - return s->write (s, buf, nbyte);
|
| -}
|
| -
|
| -static inline off_t
|
| -sseek (stream * s, off_t offset, int whence)
|
| -{
|
| - return s->seek (s, offset, whence);
|
| -}
|
| -
|
| -static inline off_t
|
| -stell (stream * s)
|
| -{
|
| - return s->tell (s);
|
| -}
|
| -
|
| -static inline int
|
| -struncate (stream * s, off_t length)
|
| -{
|
| - return s->trunc (s, length);
|
| -}
|
| -
|
| -static inline int
|
| -sflush (stream * s)
|
| -{
|
| - return s->flush (s);
|
| -}
|
| -
|
| -static inline int
|
| -sclose (stream * s)
|
| -{
|
| - return s->close (s);
|
| -}
|
| +typedef struct stream stream;
|
| +struct fbuf;
|
| +struct format_data;
|
| +typedef struct fnode fnode;
|
| +struct gfc_unit;
|
|
|
|
|
| /* Macros for testing what kinds of I/O we are doing. */
|
| @@ -129,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
|
| @@ -151,7 +113,7 @@ array_loop_spec;
|
| typedef struct namelist_type
|
| {
|
| /* Object type, stored as GFC_DTYPE_xxxx. */
|
| - bt type;
|
| + dtype type;
|
|
|
| /* Object name. */
|
| char * var_name;
|
| @@ -285,6 +247,7 @@ typedef struct
|
| CHARACTER2 (round);
|
| CHARACTER1 (sign);
|
| CHARACTER2 (asynchronous);
|
| + GFC_INTEGER_4 *newunit;
|
| }
|
| st_parameter_open;
|
|
|
| @@ -368,13 +331,11 @@ typedef struct
|
| CHARACTER2 (round);
|
| CHARACTER1 (sign);
|
| GFC_INTEGER_4 *pending;
|
| - GFC_INTEGER_4 *size;
|
| + 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)
|
| @@ -468,7 +429,9 @@ typedef struct st_parameter_dt
|
| unsigned at_eof : 1;
|
| /* Used for g0 floating point output. */
|
| unsigned g0_no_blanks : 1;
|
| - /* 15 unused bits. */
|
| + /* Used to signal use of free_format_data. */
|
| + unsigned format_not_saved : 1;
|
| + /* 14 unused bits. */
|
|
|
| char last_char;
|
| char nml_delim;
|
| @@ -549,24 +512,6 @@ typedef struct
|
| unit_flags;
|
|
|
|
|
| -/* Formatting buffer. This is a temporary scratch buffer. Currently used only
|
| - by formatted writes. After every
|
| - formatted write statement, this buffer is flushed. This buffer is needed since
|
| - not all devices are seekable, and T or TL edit descriptors require
|
| - moving backwards in the record. However, advance='no' complicates the
|
| - situation, so the buffer must only be partially flushed from the end of the
|
| - last flush until the current position in the record. */
|
| -
|
| -typedef struct fbuf
|
| -{
|
| - char *buf; /* Start of buffer. */
|
| - int len; /* Length of buffer. */
|
| - int act; /* Active bytes in buffer. */
|
| - int pos; /* Current position in buffer. */
|
| -}
|
| -fbuf;
|
| -
|
| -
|
| typedef struct gfc_unit
|
| {
|
| int unit_number;
|
| @@ -587,6 +532,7 @@ typedef struct gfc_unit
|
| 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
|
| @@ -621,157 +567,14 @@ typedef struct gfc_unit
|
| int file_len;
|
| char *file;
|
|
|
| + /* The format hash table. */
|
| + struct format_hash_entry format_hash_table[FORMAT_HASH_SIZE];
|
| +
|
| /* Formatting buffer. */
|
| struct fbuf *fbuf;
|
| }
|
| 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, FMT_DC,
|
| - FMT_DP
|
| -}
|
| -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;
|
| -
|
| -}
|
| -fnode;
|
| -
|
| -
|
| -/* unix.c */
|
| -
|
| -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, gfc_offset);
|
| -internal_proto(open_internal);
|
| -
|
| -extern char * mem_alloc_w (stream *, int *);
|
| -internal_proto(mem_alloc_w);
|
| -
|
| -extern char * mem_alloc_r (stream *, int *);
|
| -internal_proto(mem_alloc_w);
|
| -
|
| -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 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 int is_seekable (stream *);
|
| -internal_proto(is_seekable);
|
| -
|
| -extern int is_special (stream *);
|
| -internal_proto(is_special);
|
| -
|
| -extern void flush_if_preconnected (stream *);
|
| -internal_proto(flush_if_preconnected);
|
| -
|
| -extern void empty_internal_buffer(stream *);
|
| -internal_proto(empty_internal_buffer);
|
| -
|
| -extern int stream_isatty (stream *);
|
| -internal_proto(stream_isatty);
|
| -
|
| -extern char * stream_ttyname (stream *);
|
| -internal_proto(stream_ttyname);
|
| -
|
| -extern int unpack_filename (char *, const char *, int);
|
| -internal_proto(unpack_filename);
|
|
|
| /* unit.c */
|
|
|
| @@ -779,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);
|
| @@ -816,27 +623,14 @@ internal_proto (finish_last_advance_record);
|
| extern int unit_truncate (gfc_unit *, gfc_offset, st_parameter_common *);
|
| internal_proto (unit_truncate);
|
|
|
| +extern GFC_INTEGER_4 get_unique_unit_number (st_parameter_open *);
|
| +internal_proto(get_unique_unit_number);
|
| +
|
| /* open.c */
|
|
|
| extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *);
|
| internal_proto(new_unit);
|
|
|
| -/* format.c */
|
| -
|
| -extern void parse_format (st_parameter_dt *);
|
| -internal_proto(parse_format);
|
| -
|
| -extern const fnode *next_format (st_parameter_dt *);
|
| -internal_proto(next_format);
|
| -
|
| -extern void unget_format (st_parameter_dt *, const fnode *);
|
| -internal_proto(unget_format);
|
| -
|
| -extern void format_error (st_parameter_dt *, const fnode *, const char *);
|
| -internal_proto(format_error);
|
| -
|
| -extern void free_format_data (st_parameter_dt *);
|
| -internal_proto(free_format_data);
|
|
|
| /* transfer.c */
|
|
|
| @@ -848,9 +642,6 @@ internal_proto(type_name);
|
| extern void * read_block_form (st_parameter_dt *, int *);
|
| internal_proto(read_block_form);
|
|
|
| -extern char *read_sf (st_parameter_dt *, int *, int);
|
| -internal_proto(read_sf);
|
| -
|
| extern void *write_block (st_parameter_dt *, int);
|
| internal_proto(write_block);
|
|
|
| @@ -979,39 +770,6 @@ internal_proto(size_from_real_kind);
|
| extern size_t size_from_complex_kind (int);
|
| internal_proto(size_from_complex_kind);
|
|
|
| -/* fbuf.c */
|
| -extern void fbuf_init (gfc_unit *, int);
|
| -internal_proto(fbuf_init);
|
| -
|
| -extern void fbuf_destroy (gfc_unit *);
|
| -internal_proto(fbuf_destroy);
|
| -
|
| -extern int fbuf_reset (gfc_unit *);
|
| -internal_proto(fbuf_reset);
|
| -
|
| -extern char * fbuf_alloc (gfc_unit *, int);
|
| -internal_proto(fbuf_alloc);
|
| -
|
| -extern int fbuf_flush (gfc_unit *, unit_mode);
|
| -internal_proto(fbuf_flush);
|
| -
|
| -extern int fbuf_seek (gfc_unit *, int, int);
|
| -internal_proto(fbuf_seek);
|
| -
|
| -extern char * fbuf_read (gfc_unit *, int *);
|
| -internal_proto(fbuf_read);
|
| -
|
| -/* Never call this function, only use fbuf_getc(). */
|
| -extern int fbuf_getc_refill (gfc_unit *);
|
| -internal_proto(fbuf_getc_refill);
|
| -
|
| -static inline int
|
| -fbuf_getc (gfc_unit * u)
|
| -{
|
| - if (u->fbuf->pos < u->fbuf->act)
|
| - return (unsigned char) u->fbuf->buf[u->fbuf->pos++];
|
| - return fbuf_getc_refill (u);
|
| -}
|
|
|
| /* lock.c */
|
| extern void free_ionml (st_parameter_dt *);
|
|
|