1 /* Copyright (C) 2002-2016 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 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/>. */
36 typedef unsigned char uchar
;
38 /* read.c -- Deal with formatted reads */
41 /* set_integer()-- All of the integer assignments come here to
42 actually place the value into memory. */
45 set_integer (void *dest
, GFC_INTEGER_LARGEST value
, int length
)
49 #ifdef HAVE_GFC_INTEGER_16
50 /* length=10 comes about for kind=10 real/complex BOZ, cf. PR41711. */
54 GFC_INTEGER_16 tmp
= value
;
55 memcpy (dest
, (void *) &tmp
, length
);
61 GFC_INTEGER_8 tmp
= value
;
62 memcpy (dest
, (void *) &tmp
, length
);
67 GFC_INTEGER_4 tmp
= value
;
68 memcpy (dest
, (void *) &tmp
, length
);
73 GFC_INTEGER_2 tmp
= value
;
74 memcpy (dest
, (void *) &tmp
, length
);
79 GFC_INTEGER_1 tmp
= value
;
80 memcpy (dest
, (void *) &tmp
, length
);
84 internal_error (NULL
, "Bad integer kind");
89 /* Max signed value of size give by length argument. */
94 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
95 GFC_UINTEGER_LARGEST value
;
100 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
104 for (int n
= 1; n
< 4 * length
; n
++)
105 value
= (value
<< 2) + 3;
109 return GFC_INTEGER_8_HUGE
;
111 return GFC_INTEGER_4_HUGE
;
113 return GFC_INTEGER_2_HUGE
;
115 return GFC_INTEGER_1_HUGE
;
117 internal_error (NULL
, "Bad integer kind");
122 /* convert_real()-- Convert a character representation of a floating
123 point number to the machine number. Returns nonzero if there is an
124 invalid input. Note: many architectures (e.g. IA-64, HP-PA)
125 require that the storage pointed to by the dest argument is
126 properly aligned for the type in question. */
129 convert_real (st_parameter_dt
*dtp
, void *dest
, const char *buffer
, int length
)
132 int round_mode
, old_round_mode
;
134 switch (dtp
->u
.p
.current_unit
->round_status
)
136 case ROUND_COMPATIBLE
:
137 /* FIXME: As NEAREST but round away from zero for a tie. */
138 case ROUND_UNSPECIFIED
:
139 /* Should not occur. */
140 case ROUND_PROCDEFINED
:
141 round_mode
= ROUND_NEAREST
;
144 round_mode
= dtp
->u
.p
.current_unit
->round_status
;
148 old_round_mode
= get_fpu_rounding_mode();
149 set_fpu_rounding_mode (round_mode
);
154 *((GFC_REAL_4
*) dest
) =
155 #if defined(HAVE_STRTOF)
156 gfc_strtof (buffer
, &endptr
);
158 (GFC_REAL_4
) gfc_strtod (buffer
, &endptr
);
163 *((GFC_REAL_8
*) dest
) = gfc_strtod (buffer
, &endptr
);
166 #if defined(HAVE_GFC_REAL_10) && defined (HAVE_STRTOLD)
168 *((GFC_REAL_10
*) dest
) = gfc_strtold (buffer
, &endptr
);
172 #if defined(HAVE_GFC_REAL_16)
173 # if defined(GFC_REAL_16_IS_FLOAT128)
175 *((GFC_REAL_16
*) dest
) = __qmath_(strtoflt128
) (buffer
, &endptr
);
177 # elif defined(HAVE_STRTOLD)
179 *((GFC_REAL_16
*) dest
) = gfc_strtold (buffer
, &endptr
);
185 internal_error (&dtp
->common
, "Unsupported real kind during IO");
188 set_fpu_rounding_mode (old_round_mode
);
190 if (buffer
== endptr
)
192 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
,
193 "Error during floating point read");
194 next_record (dtp
, 1);
201 /* convert_infnan()-- Convert character INF/NAN representation to the
202 machine number. Note: many architectures (e.g. IA-64, HP-PA) require
203 that the storage pointed to by the dest argument is properly aligned
204 for the type in question. */
207 convert_infnan (st_parameter_dt
*dtp
, void *dest
, const char *buffer
,
210 const char *s
= buffer
;
211 int is_inf
, plus
= 1;
227 *((GFC_REAL_4
*) dest
) = plus
? __builtin_inff () : -__builtin_inff ();
229 *((GFC_REAL_4
*) dest
) = plus
? __builtin_nanf ("") : -__builtin_nanf ("");
234 *((GFC_REAL_8
*) dest
) = plus
? __builtin_inf () : -__builtin_inf ();
236 *((GFC_REAL_8
*) dest
) = plus
? __builtin_nan ("") : -__builtin_nan ("");
239 #if defined(HAVE_GFC_REAL_10)
242 *((GFC_REAL_10
*) dest
) = plus
? __builtin_infl () : -__builtin_infl ();
244 *((GFC_REAL_10
*) dest
) = plus
? __builtin_nanl ("") : -__builtin_nanl ("");
248 #if defined(HAVE_GFC_REAL_16)
249 # if defined(GFC_REAL_16_IS_FLOAT128)
251 *((GFC_REAL_16
*) dest
) = __qmath_(strtoflt128
) (buffer
, NULL
);
256 *((GFC_REAL_16
*) dest
) = plus
? __builtin_infl () : -__builtin_infl ();
258 *((GFC_REAL_16
*) dest
) = plus
? __builtin_nanl ("") : -__builtin_nanl ("");
264 internal_error (&dtp
->common
, "Unsupported real kind during IO");
271 /* read_l()-- Read a logical value */
274 read_l (st_parameter_dt
*dtp
, const fnode
*f
, char *dest
, int length
)
281 p
= read_block_form (dtp
, &w
);
304 set_integer (dest
, (GFC_INTEGER_LARGEST
) 1, length
);
308 set_integer (dest
, (GFC_INTEGER_LARGEST
) 0, length
);
312 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
,
313 "Bad value on logical read");
314 next_record (dtp
, 1);
321 read_utf8 (st_parameter_dt
*dtp
, int *nbytes
)
323 static const uchar masks
[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
324 static const uchar patns
[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
331 s
= read_block_form (dtp
, nbytes
);
335 /* If this is a short read, just return. */
343 /* The number of leading 1-bits in the first byte indicates how many
345 for (nb
= 2; nb
< 7; nb
++)
346 if ((c
& ~masks
[nb
-1]) == patns
[nb
-1])
351 c
= (c
& masks
[nb
-1]);
354 s
= read_block_form (dtp
, &nread
);
357 /* Decode the bytes read. */
358 for (i
= 1; i
< nb
; i
++)
360 gfc_char4_t n
= *s
++;
362 if ((n
& 0xC0) != 0x80)
365 c
= ((c
<< 6) + (n
& 0x3F));
368 /* Make sure the shortest possible encoding was used. */
369 if (c
<= 0x7F && nb
> 1) goto invalid
;
370 if (c
<= 0x7FF && nb
> 2) goto invalid
;
371 if (c
<= 0xFFFF && nb
> 3) goto invalid
;
372 if (c
<= 0x1FFFFF && nb
> 4) goto invalid
;
373 if (c
<= 0x3FFFFFF && nb
> 5) goto invalid
;
375 /* Make sure the character is valid. */
376 if (c
> 0x7FFFFFFF || (c
>= 0xD800 && c
<= 0xDFFF))
382 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, "Invalid UTF-8 encoding");
383 return (gfc_char4_t
) '?';
388 read_utf8_char1 (st_parameter_dt
*dtp
, char *p
, int len
, int width
)
395 len
= (width
< len
) ? len
: width
;
399 /* Proceed with decoding one character at a time. */
400 for (j
= 0; j
< len
; j
++, dest
++)
402 c
= read_utf8 (dtp
, &nbytes
);
404 /* Check for a short read and if so, break out. */
408 *dest
= c
> 255 ? '?' : (uchar
) c
;
411 /* If there was a short read, pad the remaining characters. */
412 for (i
= j
; i
< len
; i
++)
418 read_default_char1 (st_parameter_dt
*dtp
, char *p
, int len
, int width
)
423 s
= read_block_form (dtp
, &width
);
430 m
= (width
> len
) ? len
: width
;
435 memset (p
+ m
, ' ', n
);
440 read_utf8_char4 (st_parameter_dt
*dtp
, void *p
, int len
, int width
)
446 len
= (width
< len
) ? len
: width
;
448 dest
= (gfc_char4_t
*) p
;
450 /* Proceed with decoding one character at a time. */
451 for (j
= 0; j
< len
; j
++, dest
++)
453 *dest
= read_utf8 (dtp
, &nbytes
);
455 /* Check for a short read and if so, break out. */
460 /* If there was a short read, pad the remaining characters. */
461 for (i
= j
; i
< len
; i
++)
462 *dest
++ = (gfc_char4_t
) ' ';
468 read_default_char4 (st_parameter_dt
*dtp
, char *p
, int len
, int width
)
473 if (is_char4_unit(dtp
))
477 s4
= (gfc_char4_t
*) read_block_form4 (dtp
, &width
);
484 m
= ((int) width
> len
) ? len
: (int) width
;
486 dest
= (gfc_char4_t
*) p
;
488 for (n
= 0; n
< m
; n
++)
491 for (n
= 0; n
< len
- (int) width
; n
++)
492 *dest
++ = (gfc_char4_t
) ' ';
498 s
= read_block_form (dtp
, &width
);
505 m
= ((int) width
> len
) ? len
: (int) width
;
507 dest
= (gfc_char4_t
*) p
;
509 for (n
= 0; n
< m
; n
++, dest
++, s
++)
510 *dest
= (unsigned char ) *s
;
512 for (n
= 0; n
< len
- (int) width
; n
++, dest
++)
513 *dest
= (unsigned char) ' ';
518 /* read_a()-- Read a character record into a KIND=1 character destination,
519 processing UTF-8 encoding if necessary. */
522 read_a (st_parameter_dt
*dtp
, const fnode
*f
, char *p
, int length
)
528 if (wi
== -1) /* '(A)' edit descriptor */
532 /* Read in w characters, treating comma as not a separator. */
533 dtp
->u
.p
.sf_read_comma
= 0;
535 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
536 read_utf8_char1 (dtp
, p
, length
, w
);
538 read_default_char1 (dtp
, p
, length
, w
);
540 dtp
->u
.p
.sf_read_comma
=
541 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
545 /* read_a_char4()-- Read a character record into a KIND=4 character destination,
546 processing UTF-8 encoding if necessary. */
549 read_a_char4 (st_parameter_dt
*dtp
, const fnode
*f
, char *p
, int length
)
554 if (w
== -1) /* '(A)' edit descriptor */
557 /* Read in w characters, treating comma as not a separator. */
558 dtp
->u
.p
.sf_read_comma
= 0;
560 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
561 read_utf8_char4 (dtp
, p
, length
, w
);
563 read_default_char4 (dtp
, p
, length
, w
);
565 dtp
->u
.p
.sf_read_comma
=
566 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
569 /* eat_leading_spaces()-- Given a character pointer and a width,
570 * ignore the leading spaces. */
573 eat_leading_spaces (int *width
, char *p
)
577 if (*width
== 0 || *p
!= ' ')
589 next_char (st_parameter_dt
*dtp
, char **p
, int *w
)
604 if (dtp
->u
.p
.blank_status
!= BLANK_UNSPECIFIED
)
605 return ' '; /* return a blank to signal a null */
607 /* At this point, the rest of the field has to be trailing blanks */
621 /* read_decimal()-- Read a decimal integer value. The values here are
625 read_decimal (st_parameter_dt
*dtp
, const fnode
*f
, char *dest
, int length
)
627 GFC_UINTEGER_LARGEST value
, maxv
, maxv_10
;
628 GFC_INTEGER_LARGEST v
;
634 p
= read_block_form (dtp
, &w
);
639 p
= eat_leading_spaces (&w
, p
);
642 set_integer (dest
, (GFC_INTEGER_LARGEST
) 0, length
);
664 maxv
= si_max (length
);
669 /* At this point we have a digit-string */
674 c
= next_char (dtp
, &p
, &w
);
680 if (dtp
->u
.p
.blank_status
== BLANK_NULL
)
683 for ( ; w
> 0; p
++, w
--)
684 if (*p
!= ' ') break;
687 if (dtp
->u
.p
.blank_status
== BLANK_ZERO
) c
= '0';
690 if (c
< '0' || c
> '9')
699 if (value
> maxv
- c
)
709 set_integer (dest
, v
, length
);
713 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
,
714 "Bad value during integer read");
715 next_record (dtp
, 1);
719 generate_error (&dtp
->common
, LIBERROR_READ_OVERFLOW
,
720 "Value overflowed during integer read");
721 next_record (dtp
, 1);
726 /* read_radix()-- This function reads values for non-decimal radixes.
727 * The difference here is that we treat the values here as unsigned
728 * values for the purposes of overflow. If minus sign is present and
729 * the top bit is set, the value will be incorrect. */
732 read_radix (st_parameter_dt
*dtp
, const fnode
*f
, char *dest
, int length
,
735 GFC_UINTEGER_LARGEST value
, maxv
, maxv_r
;
736 GFC_INTEGER_LARGEST v
;
742 p
= read_block_form (dtp
, &w
);
747 p
= eat_leading_spaces (&w
, p
);
750 set_integer (dest
, (GFC_INTEGER_LARGEST
) 0, length
);
754 /* Maximum unsigned value, assuming two's complement. */
755 maxv
= 2 * si_max (length
) + 1;
756 maxv_r
= maxv
/ radix
;
777 /* At this point we have a digit-string */
782 c
= next_char (dtp
, &p
, &w
);
787 if (dtp
->u
.p
.blank_status
== BLANK_NULL
) continue;
788 if (dtp
->u
.p
.blank_status
== BLANK_ZERO
) c
= '0';
794 if (c
< '0' || c
> '1')
799 if (c
< '0' || c
> '7')
824 c
= c
- 'a' + '9' + 1;
833 c
= c
- 'A' + '9' + 1;
847 value
= radix
* value
;
849 if (maxv
- c
< value
)
858 set_integer (dest
, v
, length
);
862 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
,
863 "Bad value during integer read");
864 next_record (dtp
, 1);
868 generate_error (&dtp
->common
, LIBERROR_READ_OVERFLOW
,
869 "Value overflowed during integer read");
870 next_record (dtp
, 1);
875 /* read_f()-- Read a floating point number with F-style editing, which
876 is what all of the other floating point descriptors behave as. The
877 tricky part is that optional spaces are allowed after an E or D,
878 and the implicit decimal point if a decimal point is not present in
882 read_f (st_parameter_dt
*dtp
, const fnode
*f
, char *dest
, int length
)
887 int w
, seen_dp
, exponent
;
892 int seen_int_digit
; /* Seen a digit before the decimal point? */
893 int seen_dec_digit
; /* Seen a digit after the decimal point? */
903 /* Read in the next block. */
904 p
= read_block_form (dtp
, &w
);
907 p
= eat_leading_spaces (&w
, (char*) p
);
911 /* In this buffer we're going to re-format the number cleanly to be parsed
912 by convert_real in the end; this assures we're using strtod from the
913 C library for parsing and thus probably get the best accuracy possible.
914 This process may add a '+0.0' in front of the number as well as change the
915 exponent because of an implicit decimal point or the like. Thus allocating
916 strlen ("+0.0e-1000") == 10 characters plus one for NUL more than the
917 original buffer had should be enough. */
919 if (buf_size
> READF_TMP
)
920 buffer
= xmalloc (buf_size
);
925 if (*p
== '-' || *p
== '+')
933 p
= eat_leading_spaces (&w
, (char*) p
);
937 /* Check for Infinity or NaN. */
938 if (unlikely ((w
>= 3 && (*p
== 'i' || *p
== 'I' || *p
== 'n' || *p
== 'N'))))
943 /* Scan through the buffer keeping track of spaces and parenthesis. We
944 null terminate the string as soon as we see a left paren or if we are
945 BLANK_NULL mode. Leading spaces have already been skipped above,
946 trailing spaces are ignored by converting to '\0'. A space
947 between "NaN" and the optional perenthesis is not permitted. */
954 if (dtp
->u
.p
.blank_status
== BLANK_ZERO
)
968 if (seen_paren
++ != 1)
982 if (seen_paren
!= 0 && seen_paren
!= 2)
985 if ((strcmp (save
, "inf") == 0) || (strcmp (save
, "infinity") == 0))
990 else if (strcmp (save
, "nan") != 0)
993 convert_infnan (dtp
, dest
, buffer
, length
);
994 if (buf_size
> READF_TMP
)
999 /* Process the mantissa string. */
1005 if (dtp
->u
.p
.current_unit
->decimal_status
!= DECIMAL_COMMA
)
1011 if (!seen_int_digit
)
1018 if (dtp
->u
.p
.blank_status
== BLANK_ZERO
)
1023 else if (dtp
->u
.p
.blank_status
== BLANK_NULL
)
1026 /* TODO: Should we check instead that there are only trailing
1027 blanks here, as is done below for exponents? */
1070 /* No exponent has been seen, so we use the current scale factor. */
1071 exponent
= - dtp
->u
.p
.scale_factor
;
1074 /* At this point the start of an exponent has been found. */
1076 p
= eat_leading_spaces (&w
, (char*) p
);
1077 if (*p
== '-' || *p
== '+')
1085 /* At this point a digit string is required. We calculate the value
1086 of the exponent in order to take account of the scale factor and
1087 the d parameter before explict conversion takes place. */
1092 if (dtp
->u
.p
.blank_status
== BLANK_UNSPECIFIED
)
1094 while (w
> 0 && isdigit (*p
))
1097 exponent
+= *p
- '0';
1102 /* Only allow trailing blanks. */
1111 else /* BZ or BN status is enabled. */
1117 if (dtp
->u
.p
.blank_status
== BLANK_ZERO
)
1120 assert (dtp
->u
.p
.blank_status
== BLANK_NULL
);
1122 else if (!isdigit (*p
))
1127 exponent
+= *p
- '0';
1135 exponent
*= exponent_sign
;
1138 /* Use the precision specified in the format if no decimal point has been
1141 exponent
-= f
->u
.real
.d
;
1143 /* Output a trailing '0' after decimal point if not yet found. */
1144 if (seen_dp
&& !seen_dec_digit
)
1146 /* Handle input of style "E+NN" by inserting a 0 for the
1148 else if (!seen_int_digit
&& !seen_dec_digit
)
1150 notify_std (&dtp
->common
, GFC_STD_LEGACY
,
1151 "REAL input of style 'E+NN'");
1155 /* Print out the exponent to finish the reformatted number. Maximum 4
1156 digits for the exponent. */
1165 exponent
= - exponent
;
1168 if (exponent
>= 10000)
1171 for (dig
= 3; dig
>= 0; --dig
)
1173 out
[dig
] = (char) ('0' + exponent
% 10);
1180 /* Do the actual conversion. */
1181 convert_real (dtp
, dest
, buffer
, length
);
1182 if (buf_size
> READF_TMP
)
1186 /* The value read is zero. */
1191 *((GFC_REAL_4
*) dest
) = 0.0;
1195 *((GFC_REAL_8
*) dest
) = 0.0;
1198 #ifdef HAVE_GFC_REAL_10
1200 *((GFC_REAL_10
*) dest
) = 0.0;
1204 #ifdef HAVE_GFC_REAL_16
1206 *((GFC_REAL_16
*) dest
) = 0.0;
1211 internal_error (&dtp
->common
, "Unsupported real kind during IO");
1216 if (buf_size
> READF_TMP
)
1218 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
,
1219 "Bad value during floating point read");
1220 next_record (dtp
, 1);
1225 /* read_x()-- Deal with the X/TR descriptor. We just read some data
1226 * and never look at it. */
1229 read_x (st_parameter_dt
*dtp
, int n
)
1233 if ((dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
|| is_internal_unit (dtp
))
1234 && dtp
->u
.p
.current_unit
->bytes_left
< n
)
1235 n
= dtp
->u
.p
.current_unit
->bytes_left
;
1242 if (is_internal_unit (dtp
))
1244 mem_alloc_r (dtp
->u
.p
.current_unit
->s
, &length
);
1245 if (unlikely (length
< n
))
1250 if (dtp
->u
.p
.sf_seen_eor
)
1256 q
= fbuf_getc (dtp
->u
.p
.current_unit
);
1259 else if (q
== '\n' || q
== '\r')
1261 /* Unexpected end of line. Set the position. */
1262 dtp
->u
.p
.sf_seen_eor
= 1;
1264 /* If we see an EOR during non-advancing I/O, we need to skip
1265 the rest of the I/O statement. Set the corresponding flag. */
1266 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
|| dtp
->u
.p
.seen_dollar
)
1267 dtp
->u
.p
.eor_condition
= 1;
1269 /* If we encounter a CR, it might be a CRLF. */
1270 if (q
== '\r') /* Probably a CRLF */
1272 /* See if there is an LF. */
1273 q2
= fbuf_getc (dtp
->u
.p
.current_unit
);
1275 dtp
->u
.p
.sf_seen_eor
= 2;
1276 else if (q2
!= EOF
) /* Oops, seek back. */
1277 fbuf_seek (dtp
->u
.p
.current_unit
, -1, SEEK_CUR
);
1285 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
1286 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) n
;
1287 dtp
->u
.p
.current_unit
->bytes_left
-= n
;
1288 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) n
;