diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2018-01-07 12:17:52 +0200 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2018-01-07 12:17:52 +0200 |
commit | ea99ec5bd62c0d14023aac0316f4286193db9434 (patch) | |
tree | 36694f3e28c6ca161e719f0dc4e69779533ff1fa /libgfortran/io/transfer.c | |
parent | c7c9468a6c1e21bb140f62d97d427352d90556bc (diff) | |
download | gcc-ea99ec5bd62c0d14023aac0316f4286193db9434.zip gcc-ea99ec5bd62c0d14023aac0316f4286193db9434.tar.gz gcc-ea99ec5bd62c0d14023aac0316f4286193db9434.tar.bz2 |
PR 78534, 83704 Handle large formatted I/O
In order to handle large characters when doing formatted I/O, use
size_t and ptrdiff_t for lengths. Compared to the previous patch,
based on discussions on IRC use size_t for sizes that don't need to be
negative rather than ptrdiff_t everywhere.
Regtested on x86_64-pc-linux-gnu, approved as part of the PR 78534
approval, committed to trunk.
libgfortran/ChangeLog:
2018-01-07 Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/78534
PR fortran/83704
* io/fbuf.c (fbuf_init): Use size_t instead of int for length.
(fbuf_debug): Convert debug output to unsigned long.
(fbuf_reset): Use ptrdiff_t for return value.
(fbuf_alloc): Use size_t for length argument.
(fbuf_flush): Handle large buffers.
(fbuf_flush_list): Likewise.
(fbuf_seek): Use ptrdiff_t for offset and return value.
(fbuf_read): Use size_t for length argument.
(fbuf_getc_refill): Use size_t to match fbuf_read.
* io/fbuf.h (struct fbuf): Use size_t for lengths.
(fbuf_init): Use size_t instead of int for length.
(fbuf_reset): Use ptrdiff_t for return value.
(fbuf_alloc): Use size_t for length argument.
(fbuf_seek): Use ptrdiff_t for offset and return value.
(fbuf_read): Use size_t for length argument.
* io/io.h (read_block_form): Likewise.
(read_block_form4): Likewise.
(write_block): Likewise.
(read_a): Likewise.
(read_a_char4): Likewise.
(read_x): Likewise.
(write_a): Likewise.
(write_a_char4): Likewise.
* io/list_read.c (list_formatted_read_scalar): Use size_t to
handle large buffers.
* io/read.c (read_l): Likewise.
(read_utf8): Likewise.
(read_utf8_char1): Likewise.
(read_default_char1): Likewise.
(read_utf8_char4): Likewise.
(read_default_char4): Likewise.
(read_a): Likewise.
(read_a_char4): Likewise.
(eat_leading_spaces): Likewise.
(next_char): Likewise.
(read_decimal): Likewise.
(read_radix): Likewise.
(read_f): Likewise.
(read_x): Likewise.
* io/transfer.c (read_sf_internal): Likewise.
(read_sf): Likewise.
(read_block_form): Likewise.
(read_block_form4): Likewise.
(write_block): Likewise.
(formatted_transfer_scalar_write): Likewise.
(next_record_w): Likewise.
* io/unix.c (mem_alloc_r): Likewise.
(mem_alloc_r4): Likewise.
(mem_alloc_w): Likewise.
(mem_alloc_w4): Likewise.
(mem_read): Likewise.
(mem_read4): Likewise.
(mem_write): Likewise.
(mem_write4): Likewise.
(open_internal): Likewise.
(open_internal4): Likewise.
* io/unix.h (open_internal): Likewise.
(open_internal4): Likewise.
(mem_alloc_w): Likewise.
(mem_alloc_r): Likewise.
(mem_alloc_w4): Likewise.
(mem_alloc_r4): Likewise.
* io/write.c (write_check_cc): Likewise.
(write_cc): Likewise.
(write_a): Likewise.
(write_a_char4): Likewise.
From-SVN: r256322
Diffstat (limited to 'libgfortran/io/transfer.c')
-rw-r--r-- | libgfortran/io/transfer.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 4aafcd0..f9c8696 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -223,11 +223,11 @@ current_mode (st_parameter_dt *dtp) /* Read sequential file - internal unit */ static char * -read_sf_internal (st_parameter_dt *dtp, int *length) +read_sf_internal (st_parameter_dt *dtp, size_t *length) { static char *empty_string[0]; char *base = NULL; - int lorig; + size_t lorig; /* Zero size array gives internal unit len of 0. Nothing to read. */ if (dtp->internal_unit_len == 0 @@ -256,11 +256,10 @@ read_sf_internal (st_parameter_dt *dtp, int *length) lorig = *length; if (is_char4_unit(dtp)) { - int i; gfc_char4_t *p = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s, length); base = fbuf_alloc (dtp->u.p.current_unit, lorig); - for (i = 0; i < *length; i++, p++) + for (size_t i = 0; i < *length; i++, p++) base[i] = *p > 255 ? '?' : (unsigned char) *p; } else @@ -297,11 +296,12 @@ read_sf_internal (st_parameter_dt *dtp, int *length) /* Read sequential file - external unit */ static char * -read_sf (st_parameter_dt *dtp, int *length) +read_sf (st_parameter_dt *dtp, size_t *length) { static char *empty_string[0]; + size_t lorig, n; int q, q2; - int n, lorig, seen_comma; + int seen_comma; /* If we have seen an eor previously, return a length of 0. The caller is responsible for correctly padding the input field. */ @@ -439,10 +439,10 @@ read_sf (st_parameter_dt *dtp, int *length) short reads. */ void * -read_block_form (st_parameter_dt *dtp, int *nbytes) +read_block_form (st_parameter_dt *dtp, size_t *nbytes) { char *source; - int norig; + size_t norig; if (!is_stream_io (dtp)) { @@ -534,11 +534,11 @@ read_block_form (st_parameter_dt *dtp, int *nbytes) a character(kind=4) variable. Note: Portions of this code borrowed from read_sf_internal. */ void * -read_block_form4 (st_parameter_dt *dtp, int *nbytes) +read_block_form4 (st_parameter_dt *dtp, size_t *nbytes) { static gfc_char4_t *empty_string[0]; gfc_char4_t *source; - int lorig; + size_t lorig; if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes) *nbytes = dtp->u.p.current_unit->bytes_left; @@ -743,7 +743,7 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t nbytes) fill in. Returns NULL on error. */ void * -write_block (st_parameter_dt *dtp, int length) +write_block (st_parameter_dt *dtp, size_t length) { char *dest; @@ -1792,7 +1792,7 @@ static void formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kind, size_t size) { - int pos, bytes_used; + gfc_offset pos, bytes_used; const fnode *f; format_token t; int n; @@ -1856,10 +1856,10 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kin { if (dtp->u.p.skips > 0) { - int tmp; + gfc_offset tmp; write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces); - tmp = (int)(dtp->u.p.current_unit->recl - - dtp->u.p.current_unit->bytes_left); + tmp = dtp->u.p.current_unit->recl + - dtp->u.p.current_unit->bytes_left; dtp->u.p.max_pos = dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp; dtp->u.p.skips = 0; @@ -1875,8 +1875,8 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kin dtp->u.p.skips = dtp->u.p.pending_spaces = 0; } - bytes_used = (int)(dtp->u.p.current_unit->recl - - dtp->u.p.current_unit->bytes_left); + bytes_used = dtp->u.p.current_unit->recl + - dtp->u.p.current_unit->bytes_left; if (is_stream_io(dtp)) bytes_used = 0; @@ -2231,7 +2231,7 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kin p = ((char *) p) + size; } - pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left); + pos = dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left; dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos; } @@ -3691,8 +3691,8 @@ next_record_w (st_parameter_dt *dtp, int done) { char *p; /* Internal unit, so must fit in memory. */ - ptrdiff_t length, m, record; - ptrdiff_t max_pos = max_pos_off; + size_t length, m, record; + size_t max_pos = max_pos_off; if (is_array_io (dtp)) { int finished; @@ -3714,7 +3714,7 @@ next_record_w (st_parameter_dt *dtp, int done) generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL); return; } - length = ((ptrdiff_t) dtp->u.p.current_unit->recl - max_pos); + length = ((size_t) dtp->u.p.current_unit->recl - max_pos); } p = write_block (dtp, length); @@ -3737,7 +3737,7 @@ next_record_w (st_parameter_dt *dtp, int done) dtp->u.p.current_unit->endfile = AT_ENDFILE; /* Now seek to this record */ - record = record * ((ptrdiff_t) dtp->u.p.current_unit->recl); + record = record * ((size_t) dtp->u.p.current_unit->recl); if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0) { @@ -3767,7 +3767,7 @@ next_record_w (st_parameter_dt *dtp, int done) generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL); return; } - length = (ptrdiff_t) dtp->u.p.current_unit->recl + length = (size_t) dtp->u.p.current_unit->recl - max_pos; } else |