|
View:
New views
6 Messages
—
Rating Filter:
Alert me
|
|
|
[Patch, libfortran] Split io.h into multiple include filesHi,
the attached patch splits io.h into multiple include files such that a few of the components of the I/O library now have their own header files. This makes it easier to get a grip on the structure, makes dependencies between components slightly easier to grasp, and reduces the compilation cascade if one edits one of the new lower level headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? 2009-10-31 Janne Blomqvist <jb@...> * Makefile.am (gfor_io_headers): Add fbuf.h, format.h, unix.h. * Makefile.in: Regenerated. * io/fbuf.h: New file. * io/format.h: New file. * io/unix.h: New file. * io/io.h (struct stream): Move to unix.h, add forward declaration. (sread): Likewise. (swrite): Likewise. (sseek): Likewise. (stell): Likewise. (struncate): Likewise. (sflush): Likewise. (sflush): Likewise. (sclose): Likewise. (compared_files): Move prototype to unix.h. (open_external): Likewise. (open_internal): Likewise. (mem_alloc_w): Likewise. (mem_alloc_r): Likewise. (input_stream): Likewise. (output_stream): Likewise. (error_stream): Likewise. (compare_file_filename): Likewise. (find_file): Likewise. (delete_file): Likewise. (file_exists): Likewise. (inquire_sequential): Likewise. (inquire_direct): Likewise. (inquire_formatted): Likewise. (inquire_unformatted): Likewise. (inquire_read): Likewise. (inquire_write): Likewise. (inquire_readwrite): Likewise. (file_length): Likewise. (is_seekable): Likewise. (is_special): Likewise. (flush_if_preconnected): Likewise. (empty_internal_buffer): Likewise. (stream_isatty): Likewise. (stream_ttyname): Likewise. (unpack_filename): Likewise. (struct fbuf): Move to fbuf.h, add forward declaration. (fbuf_init): Move prototype to fbuf.h. (fbuf_destroy): Likewise. (fbuf_reset): Likewise. (fbuf_alloc): Likewise. (fbuf_flush): Likewise. (fbuf_seek): Likewise. (fbuf_read): Likewise. (fbuf_getc_refill): Likewise. (fbuf_getc): Move inline function to fbuf.h. (enum format_token): Move to format.h. (struct fnode): Move to format.h, add forward declaration. (parse_format): Move prototype to format.h. (next_format): Likewise. (unget_format): Likewise. (format_error): Likewise. (free_format_data): Likewise. (free_format_hash_table): Likewise. (init_format_hash): Likewise. (free_format_hash): Likewise. * io/close.c: Include unix.h. * io/fbuf.c: Include fbuf.h and unix.h. * io/file_pos.c: Include fbuf.h and unix.h. * io/format.c: Include format.h. * io/inquire.c: Include unix.h. * io/intrinsics.c: Include fbuf.h and unix.h. * io/list_read.c: Include fbuf.h and unix.h. * io/open.c: Include fbuf.h and unix.h. * io/read.c: Include format.h. * io/transfer.c: Include fbuf.h, format.h, and unix.h. * io/unit.c: Likewise. * io/unix.c: Include unix.h. * io/write.c: Include format.h and unix.h. -- Janne Blomqvist [includefix.diff] diff --git a/libgfortran/Makefile.am b/libgfortran/Makefile.am index c2fd941..db086bb 100644 --- a/libgfortran/Makefile.am +++ b/libgfortran/Makefile.am @@ -59,7 +59,10 @@ io/write.c \ io/fbuf.c gfor_io_headers= \ -io/io.h +io/io.h \ +io/fbuf.h \ +io/format.h \ +io/unix.h gfor_helper_src= \ intrinsics/associated.c \ diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c index 848b7c9..1a4d7d1 100644 --- a/libgfortran/io/close.c +++ b/libgfortran/io/close.c @@ -23,6 +23,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "unix.h" #include <limits.h> typedef enum diff --git a/libgfortran/io/fbuf.c b/libgfortran/io/fbuf.c index e1daa0d..d79cf15 100644 --- a/libgfortran/io/fbuf.c +++ b/libgfortran/io/fbuf.c @@ -24,6 +24,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "io.h" +#include "fbuf.h" +#include "unix.h" #include <string.h> #include <stdlib.h> @@ -37,7 +39,7 @@ fbuf_init (gfc_unit * u, int len) if (len == 0) len = 512; /* Default size. */ - u->fbuf = get_mem (sizeof (fbuf)); + u->fbuf = get_mem (sizeof (struct fbuf)); u->fbuf->buf = get_mem (len); u->fbuf->len = len; u->fbuf->act = u->fbuf->pos = 0; diff --git a/libgfortran/io/fbuf.h b/libgfortran/io/fbuf.h new file mode 100644 index 0000000..368cec2 --- /dev/null +++ b/libgfortran/io/fbuf.h @@ -0,0 +1,81 @@ +/* Copyright (C) 2009 + Free Software Foundation, Inc. + Contributed by Janne Blomqvist + +This file is part of the GNU Fortran 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 3, or (at your option) +any later version. + +Libgfortran is distributed in the hope that it will be useful, +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. + +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. + +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 +<http://www.gnu.org/licenses/>. */ + +#include "io.h" + +#ifndef GFOR_FBUF_H +#define GFOR_FBUF_H + + +/* Formatting buffer. This is a temporary scratch buffer used by + formatted read and writes. After every formatted I/O 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. */ + +struct fbuf +{ + char *buf; /* Start of buffer. */ + int len; /* Length of buffer. */ + int act; /* Active bytes in buffer. */ + int pos; /* Current position in buffer. */ +}; + +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); +} + +#endif diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c index c169017..f7d9499 100644 --- a/libgfortran/io/file_pos.c +++ b/libgfortran/io/file_pos.c @@ -23,6 +23,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "fbuf.h" +#include "unix.h" #include <string.h> /* file_pos.c-- Implement the file positioning statements, i.e. BACKSPACE, diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c index 0ee60ea..cafea87 100644 --- a/libgfortran/io/format.c +++ b/libgfortran/io/format.c @@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see * interpretation during I/O statements */ #include "io.h" +#include "format.h" #include <ctype.h> #include <string.h> #include <stdbool.h> diff --git a/libgfortran/io/format.h b/libgfortran/io/format.h new file mode 100644 index 0000000..c338daa --- /dev/null +++ b/libgfortran/io/format.h @@ -0,0 +1,118 @@ +/* Copyright (C) 2009 + Free Software Foundation, Inc. + Contributed by Janne Blomqvist + +This file is part of the GNU Fortran 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 3, or (at your option) +any later version. + +Libgfortran is distributed in the hope that it will be useful, +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. + +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. + +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 +<http://www.gnu.org/licenses/>. */ + +#include "io.h" + +#ifndef GFOR_FORMAT_H +#define GFOR_FORMAT_H + +/* 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, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ +} +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. */ + +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; + +}; + + +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 (struct format_data *); +internal_proto(free_format_data); + +extern void free_format_hash_table (gfc_unit *); +internal_proto(free_format_hash_table); + +extern void init_format_hash (st_parameter_dt *); +internal_proto(init_format_hash); + +extern void free_format_hash (st_parameter_dt *); +internal_proto(free_format_hash); + +#endif diff --git a/libgfortran/io/inquire.c b/libgfortran/io/inquire.c index 015b68a..c36b9e5 100644 --- a/libgfortran/io/inquire.c +++ b/libgfortran/io/inquire.c @@ -26,6 +26,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Implement the non-IOLENGTH variant of the INQUIRY statement */ #include "io.h" +#include "unix.h" static const char undefined[] = "UNDEFINED"; diff --git a/libgfortran/io/intrinsics.c b/libgfortran/io/intrinsics.c index 0e33e84..9428b75 100644 --- a/libgfortran/io/intrinsics.c +++ b/libgfortran/io/intrinsics.c @@ -24,6 +24,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "fbuf.h" +#include "unix.h" #ifdef HAVE_STDLIB_H #include <stdlib.h> diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 51143f5..b24f810 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -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. */ @@ -131,7 +81,7 @@ array_loop_spec; /* A stucture to build a hash table for format data. */ -#define FORMAT_HASH_SIZE 16 +#define FORMAT_HASH_SIZE 16 typedef struct format_hash_entry { @@ -386,8 +336,6 @@ typedef struct } st_parameter_inquire; -struct gfc_unit; -struct format_data; #define IOPARM_DT_LIST_FORMAT (1 << 7) #define IOPARM_DT_NAMELIST_READ_MODE (1 << 8) @@ -564,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; @@ -645,152 +575,6 @@ typedef struct gfc_unit } 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, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ -} -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 */ @@ -847,31 +631,6 @@ internal_proto(get_unique_unit_number); 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 (struct format_data *); -internal_proto(free_format_data); - -extern void free_format_hash_table (gfc_unit *); -internal_proto(free_format_hash_table); - -extern void init_format_hash (st_parameter_dt *); -internal_proto(init_format_hash); - -extern void free_format_hash (st_parameter_dt *); -internal_proto(free_format_hash); /* transfer.c */ @@ -1014,39 +773,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 *); diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index d8ad602..c281e34 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -27,6 +27,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "io.h" +#include "fbuf.h" +#include "unix.h" #include <string.h> #include <stdlib.h> #include <ctype.h> diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index d5b4007..bca2106 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -25,6 +25,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "fbuf.h" +#include "unix.h" #include <unistd.h> #include <string.h> #include <errno.h> diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 23a8fa3..a5cb97a 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -24,6 +24,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "format.h" #include <string.h> #include <errno.h> #include <ctype.h> diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 06a1d2e..b5f52b1 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -29,6 +29,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* transfer.c -- Top level handling of data transfer statements. */ #include "io.h" +#include "fbuf.h" +#include "format.h" +#include "unix.h" #include <string.h> #include <assert.h> #include <stdlib.h> diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index 5dc3538..3eb66e9 100644 --- a/libgfortran/io/unit.c +++ b/libgfortran/io/unit.c @@ -24,6 +24,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "fbuf.h" +#include "format.h" +#include "unix.h" #include <stdlib.h> #include <string.h> diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 4ecba3a..d385b04 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -27,6 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Unix stream I/O module */ #include "io.h" +#include "unix.h" #include <stdlib.h> #include <limits.h> diff --git a/libgfortran/io/unix.h b/libgfortran/io/unix.h new file mode 100644 index 0000000..721c63c --- /dev/null +++ b/libgfortran/io/unix.h @@ -0,0 +1,169 @@ +/* Copyright (C) 2009 + Free Software Foundation, Inc. + Contributed by Janne Blomqvist + +This file is part of the GNU Fortran 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 3, or (at your option) +any later version. + +Libgfortran is distributed in the hope that it will be useful, +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. + +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. + +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 +<http://www.gnu.org/licenses/>. */ + +#include "io.h" + +#ifndef GFOR_UNIX_H +#define GFOR_UNIX_H + +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 *); +}; + +/* 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); +} + + +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); + + +#endif diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 8a1c20a..6348246 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -26,6 +26,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include "io.h" +#include "format.h" +#include "unix.h" #include <assert.h> #include <string.h> #include <ctype.h> |
|
|
Re: [Patch, libfortran] Split io.h into multiple include filesOn 10/30/2009 04:20 PM, Janne Blomqvist wrote:
> Hi, > > the attached patch splits io.h into multiple include files such that a > few of the components of the I/O library now have their own header > files. This makes it easier to get a grip on the structure, makes > dependencies between components slightly easier to grasp, and reduces > the compilation cascade if one edits one of the new lower level > headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? > Not all that necessary but I have no preferences. OK Jerry |
|
|
Re: [Patch, libfortran] Split io.h into multiple include filesOn Sun, Nov 01, 2009 at 05:13:35PM -0800, Jerry DeLisle wrote:
> On 10/30/2009 04:20 PM, Janne Blomqvist wrote: > >Hi, > > > >the attached patch splits io.h into multiple include files such that a > >few of the components of the I/O library now have their own header > >files. This makes it easier to get a grip on the structure, makes > >dependencies between components slightly easier to grasp, and reduces > >the compilation cascade if one edits one of the new lower level > >headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? > > > Not all that necessary but I have no preferences. OK > Jerry, I was going to let you weigh in on this patch because you and Janne are the 2 (along with Thomas) that do the most work in libgfortran. I'll, however, state that I support Jannei's attempt to make the headers a little more sane. I've thought about break up gfortran.h, but haven't acted about that urge. -- Steve |
|
|
Re: [Patch, libfortran] Split io.h into multiple include filesOn 11/01/2009 05:48 PM, Steve Kargl wrote:
> On Sun, Nov 01, 2009 at 05:13:35PM -0800, Jerry DeLisle wrote: >> On 10/30/2009 04:20 PM, Janne Blomqvist wrote: >>> Hi, >>> >>> the attached patch splits io.h into multiple include files such that a >>> few of the components of the I/O library now have their own header >>> files. This makes it easier to get a grip on the structure, makes >>> dependencies between components slightly easier to grasp, and reduces >>> the compilation cascade if one edits one of the new lower level >>> headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? >>> >> Not all that necessary but I have no preferences. OK >> > > Jerry, > > I was going to let you weigh in on this patch because you > and Janne are the 2 (along with Thomas) that do the most > work in libgfortran. I'll, however, state that I support > Jannei's attempt to make the headers a little more sane. > I've thought about break up gfortran.h, but haven't acted > about that urge. > with it. There are some BOZ buffer constants in libgfortran.h that ought to be in io.h and the gfc_xtoa is in error.c and it ought to be in write.c The prototype is in libgfortran.h because the routine is shared between error.c and write.c. Maybe we need a utility.h and utility.c or similar to round up a lot of these. Regardless, I am really Ok with Janne's patch and more then grateful for the asyncio endeavor he is launching into. Jerry |
|
|
Re: [Patch, libfortran] Split io.h into multiple include filesOn Mon, Nov 2, 2009 at 03:13, Jerry DeLisle <jvdelisle@...> wrote:
> On 10/30/2009 04:20 PM, Janne Blomqvist wrote: >> >> Hi, >> >> the attached patch splits io.h into multiple include files such that a >> few of the components of the I/O library now have their own header >> files. This makes it easier to get a grip on the structure, makes >> dependencies between components slightly easier to grasp, and reduces >> the compilation cascade if one edits one of the new lower level >> headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? >> > Not all that necessary but I have no preferences. OK Thanks, committed as r153825. I agree it's strictly speaking not necessary, but I think it makes maintenance slightly easier. -- Janne Blomqvist |
|
|
Re: [Patch, libfortran] Split io.h into multiple include filesOn Mon, Nov 2, 2009 at 23:55, Janne Blomqvist <blomqvist.janne@...> wrote:
> On Mon, Nov 2, 2009 at 03:13, Jerry DeLisle <jvdelisle@...> wrote: >> On 10/30/2009 04:20 PM, Janne Blomqvist wrote: >>> >>> Hi, >>> >>> the attached patch splits io.h into multiple include files such that a >>> few of the components of the I/O library now have their own header >>> files. This makes it easier to get a grip on the structure, makes >>> dependencies between components slightly easier to grasp, and reduces >>> the compilation cascade if one edits one of the new lower level >>> headers. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? >>> >> Not all that necessary but I have no preferences. OK > > Thanks, committed as r153825. I agree it's strictly speaking not > necessary, but I think it makes maintenance slightly easier. Er, make that r153827. Incidentally, bootstrap broken for 153825 & 153826. -- Janne Blomqvist |
| Free embeddable forum powered by Nabble | Forum Help |