diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2008-04-05 22:18:03 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2008-04-05 22:18:03 +0000 |
commit | 10256cbe95ccc432fe9f1aab3c9ccd545dc782ef (patch) | |
tree | f9485223018be46b0b89c551ebd74b08c80fa0cb /libgfortran/io/unix.c | |
parent | 3d3e20df3616f7999bd607306b378a4861cd8b77 (diff) | |
download | gcc-10256cbe95ccc432fe9f1aab3c9ccd545dc782ef.zip gcc-10256cbe95ccc432fe9f1aab3c9ccd545dc782ef.tar.gz gcc-10256cbe95ccc432fe9f1aab3c9ccd545dc782ef.tar.bz2 |
PR fortran/25829 28655
2008-04-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/25829 28655
* gfortran.map: Add new symbol, _gfortran_st_wait.
* libgfortran.h (st_paramter_common): Add new I/O parameters.
* open.c (st_option decimal_opt[], st_option encoding_opt[],
st_option round_opt[], st_option sign_opt[], st_option async_opt[]): New
parameter option arrays. (edit_modes): Add checks for new parameters.
(new_unit): Likewise. (st_open): Likewise.
* list_read.c (CASE_SEPERATORS): Add ';' as a valid separator.
(eat_separator): Handle deimal comma. (read_logical): Fix whitespace.
(parse_real): Handle decimal comma. (read_real): Handle decimal comma.
* read.c (read_a): Use decimal status flag to allow comma in place of a
decimal point. (read_f): Allow comma as acceptable character in float.
According to decimal flag, substitute a period for a comma.
(read_x): If decimal status flag is comma, disable the read_comma flag,
not allowing comma as a delimiter, an extension otherwise.
* io.h: (unit_decimal, unit_encoding, unit_round, unit_sign,
unit_async): New enumerators. Add all new I/O parameters.
* unix.c (unix_stream, int_stream): Add io_mode asychronous I/O control.
(move_pos_offset, fd_alloc_w_at): Fix some whitespace.
(fd_sfree): Use new enumerator. (fd_read): Likewise.
(fd_write): Likewise. (fd_close): Fix whitespace.
(fd_open): Use new enumertors. (tempfile, regular_file,
open_external): Fix whitespace. (output_stream, error_stream): Set
method. (stream_offset): Fix whitespace.
* transfer.c: (st_option decimal_opt[], sign_opt[], blank_opt[]): New
option arrays. (formatted_transfer_scalar): Set sf_read_comma flag
based on new decimal_status flag. (data_transfer_init): Initialize new
parameters. Add checks for decimal, sign, and blank. (st_wait): New stub.
* format.c: (format_lex): Add format specifiers DP, DC, and D.
(parse_format_list): Parse the new specifiers.
* write.c (write_decimal): Use new sign enumerators to set the sign.
(write_complex): Handle decimal comma and semi-colon separator.
(nml_write_obj): Likewise.
* write_float.def: Revise sign enumerators. (calculate_sign): Use new
sign enumerators. (output_float): Likewise. Use new decimal_status flag
to set the decimal character to a point or a comma.
From-SVN: r133943
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r-- | libgfortran/io/unix.c | 85 |
1 files changed, 43 insertions, 42 deletions
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index b6afe8d..3896f04 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -1,6 +1,7 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 +/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 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). @@ -93,8 +94,6 @@ id_from_fd (const int fd) #endif - - #ifndef SSIZE_MAX #define SSIZE_MAX SHRT_MAX #endif @@ -153,7 +152,7 @@ typedef struct int special_file; /* =1 if the fd refers to a special file */ - int unbuffered; /* =1 if the stream is not buffered */ + io_mode method; /* Method of stream I/O being used */ char *buffer; char small_buffer[BUFFER_SIZE]; @@ -184,7 +183,7 @@ typedef struct int special_file; /* =1 if the fd refers to a special file */ - int unbuffered; /* =1 if the stream is not buffered */ + io_mode method; /* Method of stream I/O being used */ char *buffer; } @@ -238,15 +237,15 @@ move_pos_offset (stream* st, int pos_off) str->logical_offset += pos_off; if (str->dirty_offset + str->ndirty > str->logical_offset) - { - if (str->ndirty + pos_off > 0) - str->ndirty += pos_off; - else - { - str->dirty_offset += pos_off + pos_off; - str->ndirty = 0; - } - } + { + if (str->ndirty + pos_off > 0) + str->ndirty += pos_off; + else + { + str->dirty_offset += pos_off + pos_off; + str->ndirty = 0; + } + } return pos_off; } @@ -615,23 +614,23 @@ fd_alloc_w_at (unix_stream * s, int *len, gfc_offset where) || where > s->dirty_offset + s->ndirty || s->dirty_offset > where + *len) { /* Discontiguous blocks, start with a clean buffer. */ - /* Flush the buffer. */ - if (s->ndirty != 0) - fd_flush (s); - s->dirty_offset = where; - s->ndirty = *len; + /* Flush the buffer. */ + if (s->ndirty != 0) + fd_flush (s); + s->dirty_offset = where; + s->ndirty = *len; } else { gfc_offset start; /* Merge with the existing data. */ if (where < s->dirty_offset) - start = where; + start = where; else - start = s->dirty_offset; + start = s->dirty_offset; if (where + *len > s->dirty_offset + s->ndirty) - s->ndirty = where + *len - start; + s->ndirty = where + *len - start; else - s->ndirty = s->dirty_offset + s->ndirty - start; + s->ndirty = s->dirty_offset + s->ndirty - start; s->dirty_offset = start; } @@ -655,7 +654,7 @@ fd_sfree (unix_stream * s) { if (s->ndirty != 0 && (s->buffer != s->small_buffer || options.all_unbuffered || - s->unbuffered)) + s->method == SYNC_UNBUFFERED)) return fd_flush (s); return SUCCESS; @@ -777,7 +776,7 @@ fd_read (unix_stream * s, void * buf, size_t * nbytes) void *p; int tmp, status; - if (*nbytes < BUFFER_SIZE && !s->unbuffered) + if (*nbytes < BUFFER_SIZE && s->method == SYNC_BUFFERED) { tmp = *nbytes; p = fd_alloc_r_at (s, &tmp, -1); @@ -825,7 +824,7 @@ fd_write (unix_stream * s, const void * buf, size_t * nbytes) void *p; int tmp, status; - if (*nbytes < BUFFER_SIZE && !s->unbuffered) + if (*nbytes < BUFFER_SIZE && s->method == SYNC_BUFFERED) { tmp = *nbytes; p = fd_alloc_w_at (s, &tmp, -1); @@ -874,7 +873,7 @@ fd_close (unix_stream * s) if (s->fd != STDOUT_FILENO && s->fd != STDERR_FILENO && s->fd != STDIN_FILENO) { if (close (s->fd) < 0) - return FAILURE; + return FAILURE; } free_mem (s); @@ -887,7 +886,9 @@ static void fd_open (unix_stream * s) { if (isatty (s->fd)) - s->unbuffered = 1; + s->method = SYNC_UNBUFFERED; + else + s->method = SYNC_BUFFERED; s->st.alloc_r_at = (void *) fd_alloc_r_at; s->st.alloc_w_at = (void *) fd_alloc_w_at; @@ -1224,7 +1225,7 @@ tempfile (st_parameter_open *opp) do #if defined(HAVE_CRLF) && defined(O_BINARY) fd = open (template, O_RDWR | O_CREAT | O_EXCL | O_BINARY, - S_IREAD | S_IWRITE); + S_IREAD | S_IWRITE); #else fd = open (template, O_RDWR | O_CREAT | O_EXCL, S_IREAD | S_IWRITE); #endif @@ -1335,11 +1336,11 @@ regular_file (st_parameter_open *opp, unit_flags *flags) if (fd >=0) { flags->action = ACTION_READ; - return fd; /* success */ + return fd; /* success */ } if (errno != EACCES) - return fd; /* failure */ + return fd; /* failure */ /* retry for write-only access */ rwflag = O_WRONLY; @@ -1347,9 +1348,9 @@ regular_file (st_parameter_open *opp, unit_flags *flags) if (fd >=0) { flags->action = ACTION_WRITE; - return fd; /* success */ + return fd; /* success */ } - return fd; /* failure */ + return fd; /* failure */ } @@ -1366,7 +1367,7 @@ open_external (st_parameter_open *opp, unit_flags *flags) { fd = tempfile (opp); if (flags->action == ACTION_UNSPECIFIED) - flags->action = ACTION_READWRITE; + flags->action = ACTION_READWRITE; #if HAVE_UNLINK_OPEN_FILE /* We can unlink scratch files now and it will go away when closed. */ @@ -1431,7 +1432,7 @@ output_stream (void) s = fd_to_stream (STDOUT_FILENO, PROT_WRITE); if (options.unbuffered_preconnected) - ((unix_stream *) s)->unbuffered = 1; + ((unix_stream *) s)->method = SYNC_UNBUFFERED; return s; } @@ -1450,7 +1451,7 @@ error_stream (void) s = fd_to_stream (STDERR_FILENO, PROT_WRITE); if (options.unbuffered_preconnected) - ((unix_stream *) s)->unbuffered = 1; + ((unix_stream *) s)->method = SYNC_UNBUFFERED; return s; } @@ -2050,13 +2051,13 @@ stream_offset (stream *s) the solution used by f2c. Each record contains a pair of length markers: - Length of record n in bytes - Data of record n - Length of record n in bytes + Length of record n in bytes + Data of record n + Length of record n in bytes - Length of record n+1 in bytes - Data of record n+1 - Length of record n+1 in bytes + Length of record n+1 in bytes + Data of record n+1 + Length of record n+1 in bytes The length is stored at the end of a record to allow backspacing to the previous record. Between data transfer statements, the file pointer |