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 *); |