diff options
author | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-13 20:28:08 +0000 |
---|---|---|
committer | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-13 20:28:08 +0000 |
commit | 1316e8f038a8b9009d9e3a7fbe5a02e03de634ab (patch) | |
tree | 6519779ba74e7e856024b0c512587694f342c5db /libgfortran/io/read.c | |
parent | 5ccd29b1395498fb7240b0c43a98dfc59d34405c (diff) | |
download | gcc-1316e8f038a8b9009d9e3a7fbe5a02e03de634ab.tar.gz |
2008-06-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/35863
* libgfortran.h: Change l8_to_l4_offset to big_endian and add endian_off.
* runtime/main.c: Fix error in comment. Change l8_to_l4_offset to
big_endian. (determine_endianness): Add endian_off and set its value
according to big_endian.
* gfortran.map: Add symbol for new _gfortran_transfer_character_wide.
* io/io.h: Add prototype declarations for new functions.
* io/list_read.c (list_formatted_read_scalar): Modify to handle kind=4.
(list_formatted_read): Calculate stride based on kind for character type
and use it when calling list_formatted_read_scalar.
* io/inquire.c (inquire_via_unit): Change l8_to_l4_offset to big_endian.
* io/open.c (st_open): Change l8_to_l4_offset to big_endian.
* io/read.c (read_a_char4): New function to handle formatted read.
* io/write.c: Define GFC_CHAR4(x) to improve readability of code.
(write_a_char4): New function to handle formatted write.
(write_character): Modify to accept the kind parameter and adjust for
endianess of the machine. (list_formatted_write): Calculate the stride
resulting from the kind and adjust the list_formatted_write_scalar call
accordingly. (nml_write_obj): Adjust calls to write_character.
(namelist_write): Likewise.
* io/transfer.c (formatted_transfer_scaler): Rename 'len' argument to
'kind' argument to better describe what it is. Add calls to new
functions for kind == 4. (formatted_transfer): Modify to handle the case
of type character and kind equals 4 to pass in the kind to the transfer
routines. (transfer_character_wide): Add this new function.
(transfer_array): Don't set kind to the character string length. Adjust
strides bases on character kind.
(unformatted_read): Adjust size based on kind for character types.
(unformatted_write): Likewise. (data_transfer_init): Change
l8_to_l4_offset to big_endian.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136763 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran/io/read.c')
-rw-r--r-- | libgfortran/io/read.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index a09d663dc1c..11a1ac018f7 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -270,6 +270,43 @@ read_a (st_parameter_dt *dtp, const fnode *f, char *p, int length) memset (p + m, ' ', n); } +void +read_a_char4 (st_parameter_dt *dtp, const fnode *f, char *p, int length) +{ + char *s; + gfc_char4_t *dest; + int m, n, wi, status; + size_t w; + + wi = f->u.w; + if (wi == -1) /* '(A)' edit descriptor */ + wi = length; + + w = wi; + + s = gfc_alloca (w); + + /* Read in w bytes, treating comma as not a separator. */ + dtp->u.p.sf_read_comma = 0; + status = read_block_form (dtp, s, &w); + dtp->u.p.sf_read_comma = + dtp->u.p.decimal_status == DECIMAL_COMMA ? 0 : 1; + + if (status == FAILURE) + return; + if (w > (size_t) length) + s += (w - length); + + m = ((int) w > length) ? length : (int) w; + + dest = (gfc_char4_t *) p; + + for (n = 0; n < m; n++, dest++, s++) + *dest = (unsigned char ) *s; + + for (n = 0; n < length - (int) w; n++, dest++) + *dest = (unsigned char) ' '; +} /* eat_leading_spaces()-- Given a character pointer and a width, * ignore the leading spaces. */ |