1 /* Copyright (C) 2002, 2003, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 F2003 I/O support contributed by Jerry DeLisle
5 This file is part of the GNU Fortran 95 runtime library (libgfortran).
7 Libgfortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 Libgfortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
33 typedef unsigned char uchar;
35 /* read.c -- Deal with formatted reads */
38 /* set_integer()-- All of the integer assignments come here to
39 * actually place the value into memory. */
42 set_integer (void *dest, GFC_INTEGER_LARGEST value, int length)
46 #ifdef HAVE_GFC_INTEGER_16
49 GFC_INTEGER_16 tmp = value;
50 memcpy (dest, (void *) &tmp, length);
56 GFC_INTEGER_8 tmp = value;
57 memcpy (dest, (void *) &tmp, length);
62 GFC_INTEGER_4 tmp = value;
63 memcpy (dest, (void *) &tmp, length);
68 GFC_INTEGER_2 tmp = value;
69 memcpy (dest, (void *) &tmp, length);
74 GFC_INTEGER_1 tmp = value;
75 memcpy (dest, (void *) &tmp, length);
79 internal_error (NULL, "Bad integer kind");
84 /* max_value()-- Given a length (kind), return the maximum signed or
88 max_value (int length, int signed_flag)
90 GFC_UINTEGER_LARGEST value;
91 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
97 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
101 for (n = 1; n < 4 * length; n++)
102 value = (value << 2) + 3;
108 value = signed_flag ? 0x7fffffffffffffff : 0xffffffffffffffff;
111 value = signed_flag ? 0x7fffffff : 0xffffffff;
114 value = signed_flag ? 0x7fff : 0xffff;
117 value = signed_flag ? 0x7f : 0xff;
120 internal_error (NULL, "Bad integer kind");
127 /* convert_real()-- Convert a character representation of a floating
128 * point number to the machine number. Returns nonzero if there is a
129 * range problem during conversion. Note: many architectures
130 * (e.g. IA-64, HP-PA) require that the storage pointed to by the dest
131 * argument is properly aligned for the type in question. TODO:
132 * handle not-a-numbers and infinities. */
135 convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int length)
142 *((GFC_REAL_4*) dest) =
143 #if defined(HAVE_STRTOF)
144 strtof (buffer, NULL);
146 (GFC_REAL_4) strtod (buffer, NULL);
151 *((GFC_REAL_8*) dest) = strtod (buffer, NULL);
154 #if defined(HAVE_GFC_REAL_10) && defined (HAVE_STRTOLD)
156 *((GFC_REAL_10*) dest) = strtold (buffer, NULL);
160 #if defined(HAVE_GFC_REAL_16) && defined (HAVE_STRTOLD)
162 *((GFC_REAL_16*) dest) = strtold (buffer, NULL);
167 internal_error (&dtp->common, "Unsupported real kind during IO");
172 generate_error (&dtp->common, LIBERROR_READ_VALUE,
173 "Error during floating point read");
174 next_record (dtp, 1);
182 /* read_l()-- Read a logical value */
185 read_l (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
192 p = read_block_form (dtp, &w);
215 set_integer (dest, (GFC_INTEGER_LARGEST) 1, length);
219 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
223 generate_error (&dtp->common, LIBERROR_READ_VALUE,
224 "Bad value on logical read");
225 next_record (dtp, 1);
232 read_utf8 (st_parameter_dt *dtp, int *nbytes)
234 static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
235 static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
242 s = read_block_form (dtp, nbytes);
246 /* If this is a short read, just return. */
254 /* The number of leading 1-bits in the first byte indicates how many
256 for (nb = 2; nb < 7; nb++)
257 if ((c & ~masks[nb-1]) == patns[nb-1])
262 c = (c & masks[nb-1]);
265 s = read_block_form (dtp, &nread);
268 /* Decode the bytes read. */
269 for (i = 1; i < nb; i++)
271 gfc_char4_t n = *s++;
273 if ((n & 0xC0) != 0x80)
276 c = ((c << 6) + (n & 0x3F));
279 /* Make sure the shortest possible encoding was used. */
280 if (c <= 0x7F && nb > 1) goto invalid;
281 if (c <= 0x7FF && nb > 2) goto invalid;
282 if (c <= 0xFFFF && nb > 3) goto invalid;
283 if (c <= 0x1FFFFF && nb > 4) goto invalid;
284 if (c <= 0x3FFFFFF && nb > 5) goto invalid;
286 /* Make sure the character is valid. */
287 if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
293 generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
294 return (gfc_char4_t) '?';
299 read_utf8_char1 (st_parameter_dt *dtp, char *p, int len, int width)
306 len = (width < len) ? len : width;
310 /* Proceed with decoding one character at a time. */
311 for (j = 0; j < len; j++, dest++)
313 c = read_utf8 (dtp, &nbytes);
315 /* Check for a short read and if so, break out. */
319 *dest = c > 255 ? '?' : (uchar) c;
322 /* If there was a short read, pad the remaining characters. */
323 for (i = j; i < len; i++)
329 read_default_char1 (st_parameter_dt *dtp, char *p, int len, int width)
334 s = read_block_form (dtp, &width);
341 m = (width > len) ? len : width;
346 memset (p + m, ' ', n);
351 read_utf8_char4 (st_parameter_dt *dtp, void *p, int len, int width)
357 len = (width < len) ? len : width;
359 dest = (gfc_char4_t *) p;
361 /* Proceed with decoding one character at a time. */
362 for (j = 0; j < len; j++, dest++)
364 *dest = read_utf8 (dtp, &nbytes);
366 /* Check for a short read and if so, break out. */
371 /* If there was a short read, pad the remaining characters. */
372 for (i = j; i < len; i++)
373 *dest++ = (gfc_char4_t) ' ';
379 read_default_char4 (st_parameter_dt *dtp, char *p, int len, int width)
385 s = read_block_form (dtp, &width);
392 m = ((int) width > len) ? len : (int) width;
394 dest = (gfc_char4_t *) p;
396 for (n = 0; n < m; n++, dest++, s++)
397 *dest = (unsigned char ) *s;
399 for (n = 0; n < len - (int) width; n++, dest++)
400 *dest = (unsigned char) ' ';
404 /* read_a()-- Read a character record into a KIND=1 character destination,
405 processing UTF-8 encoding if necessary. */
408 read_a (st_parameter_dt *dtp, const fnode *f, char *p, int length)
414 if (wi == -1) /* '(A)' edit descriptor */
418 /* Read in w characters, treating comma as not a separator. */
419 dtp->u.p.sf_read_comma = 0;
421 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
422 read_utf8_char1 (dtp, p, length, w);
424 read_default_char1 (dtp, p, length, w);
426 dtp->u.p.sf_read_comma =
427 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
431 /* read_a_char4()-- Read a character record into a KIND=4 character destination,
432 processing UTF-8 encoding if necessary. */
435 read_a_char4 (st_parameter_dt *dtp, const fnode *f, char *p, int length)
440 if (w == -1) /* '(A)' edit descriptor */
443 /* Read in w characters, treating comma as not a separator. */
444 dtp->u.p.sf_read_comma = 0;
446 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
447 read_utf8_char4 (dtp, p, length, w);
449 read_default_char4 (dtp, p, length, w);
451 dtp->u.p.sf_read_comma =
452 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
455 /* eat_leading_spaces()-- Given a character pointer and a width,
456 * ignore the leading spaces. */
459 eat_leading_spaces (int *width, char *p)
463 if (*width == 0 || *p != ' ')
475 next_char (st_parameter_dt *dtp, char **p, int *w)
490 if (dtp->u.p.blank_status != BLANK_UNSPECIFIED)
491 return ' '; /* return a blank to signal a null */
493 /* At this point, the rest of the field has to be trailing blanks */
507 /* read_decimal()-- Read a decimal integer value. The values here are
511 read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
513 GFC_UINTEGER_LARGEST value, maxv, maxv_10;
514 GFC_INTEGER_LARGEST v;
520 p = read_block_form (dtp, &w);
525 p = eat_leading_spaces (&w, p);
528 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
532 maxv = max_value (length, 1);
554 /* At this point we have a digit-string */
559 c = next_char (dtp, &p, &w);
565 if (dtp->u.p.blank_status == BLANK_NULL) continue;
566 if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
569 if (c < '0' || c > '9')
572 if (value > maxv_10 && compile_options.range_check == 1)
578 if (value > maxv - c && compile_options.range_check == 1)
587 set_integer (dest, v, length);
591 generate_error (&dtp->common, LIBERROR_READ_VALUE,
592 "Bad value during integer read");
593 next_record (dtp, 1);
597 generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
598 "Value overflowed during integer read");
599 next_record (dtp, 1);
604 /* read_radix()-- This function reads values for non-decimal radixes.
605 * The difference here is that we treat the values here as unsigned
606 * values for the purposes of overflow. If minus sign is present and
607 * the top bit is set, the value will be incorrect. */
610 read_radix (st_parameter_dt *dtp, const fnode *f, char *dest, int length,
613 GFC_UINTEGER_LARGEST value, maxv, maxv_r;
614 GFC_INTEGER_LARGEST v;
620 p = read_block_form (dtp, &w);
625 p = eat_leading_spaces (&w, p);
628 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
632 maxv = max_value (length, 0);
633 maxv_r = maxv / radix;
654 /* At this point we have a digit-string */
659 c = next_char (dtp, &p, &w);
664 if (dtp->u.p.blank_status == BLANK_NULL) continue;
665 if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
671 if (c < '0' || c > '1')
676 if (c < '0' || c > '7')
701 c = c - 'a' + '9' + 1;
710 c = c - 'A' + '9' + 1;
724 value = radix * value;
726 if (maxv - c < value)
735 set_integer (dest, v, length);
739 generate_error (&dtp->common, LIBERROR_READ_VALUE,
740 "Bad value during integer read");
741 next_record (dtp, 1);
745 generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
746 "Value overflowed during integer read");
747 next_record (dtp, 1);
752 /* read_f()-- Read a floating point number with F-style editing, which
753 is what all of the other floating point descriptors behave as. The
754 tricky part is that optional spaces are allowed after an E or D,
755 and the implicit decimal point if a decimal point is not present in
759 read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
761 int w, seen_dp, exponent;
766 int seen_int_digit; /* Seen a digit before the decimal point? */
767 int seen_dec_digit; /* Seen a digit after the decimal point? */
776 /* Read in the next block. */
777 p = read_block_form (dtp, &w);
780 p = eat_leading_spaces (&w, (char*) p);
784 /* In this buffer we're going to re-format the number cleanly to be parsed
785 by convert_real in the end; this assures we're using strtod from the
786 C library for parsing and thus probably get the best accuracy possible.
787 This process may add a '+0.0' in front of the number as well as change the
788 exponent because of an implicit decimal point or the like. Thus allocating
789 strlen ("+0.0e-1000") == 10 characters plus one for NUL more than the
790 original buffer had should be enough. */
791 buffer = gfc_alloca (w + 11);
795 if (*p == '-' || *p == '+')
803 p = eat_leading_spaces (&w, (char*) p);
807 /* Process the mantissa string. */
813 if (dtp->u.p.current_unit->decimal_status != DECIMAL_COMMA)
826 if (dtp->u.p.blank_status == BLANK_ZERO)
831 else if (dtp->u.p.blank_status == BLANK_NULL)
834 /* TODO: Should we check instead that there are only trailing
835 blanks here, as is done below for exponents? */
876 /* No exponent has been seen, so we use the current scale factor. */
877 exponent = - dtp->u.p.scale_factor;
880 /* At this point the start of an exponent has been found. */
882 p = eat_leading_spaces (&w, (char*) p);
883 if (*p == '-' || *p == '+')
891 /* At this point a digit string is required. We calculate the value
892 of the exponent in order to take account of the scale factor and
893 the d parameter before explict conversion takes place. */
898 if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
900 while (w > 0 && isdigit (*p))
903 exponent += *p - '0';
908 /* Only allow trailing blanks. */
917 else /* BZ or BN status is enabled. */
923 if (dtp->u.p.blank_status == BLANK_ZERO)
926 assert (dtp->u.p.blank_status == BLANK_NULL);
928 else if (!isdigit (*p))
933 exponent += *p - '0';
941 exponent *= exponent_sign;
944 /* Use the precision specified in the format if no decimal point has been
947 exponent -= f->u.real.d;
949 /* Output a trailing '0' after decimal point if not yet found. */
950 if (seen_dp && !seen_dec_digit)
953 /* Print out the exponent to finish the reformatted number. Maximum 4
954 digits for the exponent. */
963 exponent = - exponent;
966 assert (exponent < 10000);
967 for (dig = 3; dig >= 0; --dig)
969 out[dig] = (char) ('0' + exponent % 10);
976 /* Do the actual conversion. */
977 convert_real (dtp, dest, buffer, length);
981 /* The value read is zero. */
986 *((GFC_REAL_4 *) dest) = 0.0;
990 *((GFC_REAL_8 *) dest) = 0.0;
993 #ifdef HAVE_GFC_REAL_10
995 *((GFC_REAL_10 *) dest) = 0.0;
999 #ifdef HAVE_GFC_REAL_16
1001 *((GFC_REAL_16 *) dest) = 0.0;
1006 internal_error (&dtp->common, "Unsupported real kind during IO");
1011 generate_error (&dtp->common, LIBERROR_READ_VALUE,
1012 "Bad value during floating point read");
1013 next_record (dtp, 1);
1018 /* read_x()-- Deal with the X/TR descriptor. We just read some data
1019 * and never look at it. */
1022 read_x (st_parameter_dt * dtp, int n)
1024 if ((dtp->u.p.current_unit->pad_status == PAD_NO || is_internal_unit (dtp))
1025 && dtp->u.p.current_unit->bytes_left < n)
1026 n = dtp->u.p.current_unit->bytes_left;
1028 dtp->u.p.sf_read_comma = 0;
1030 read_sf (dtp, &n, 1);
1031 dtp->u.p.sf_read_comma = 1;
1032 dtp->u.p.current_unit->strm_pos += (gfc_offset) n;