]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgfortran/io/read.c
Update copyright years.
[thirdparty/gcc.git] / libgfortran / io / read.c
1 /* Copyright (C) 2002-2020 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 F2003 I/O support contributed by Jerry DeLisle
4
5 This file is part of the GNU Fortran runtime library (libgfortran).
6
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)
10 any later version.
11
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.
16
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.
20
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/>. */
25
26 #include "io.h"
27 #include "fbuf.h"
28 #include "format.h"
29 #include "unix.h"
30 #include <string.h>
31 #include <ctype.h>
32 #include <assert.h>
33 #include "async.h"
34
35 typedef unsigned char uchar;
36
37 /* read.c -- Deal with formatted reads */
38
39
40 /* set_integer()-- All of the integer assignments come here to
41 actually place the value into memory. */
42
43 void
44 set_integer (void *dest, GFC_INTEGER_LARGEST value, int length)
45 {
46 NOTE ("set_integer: %lld %p", (long long int) value, dest);
47 switch (length)
48 {
49 #ifdef HAVE_GFC_INTEGER_16
50 /* length=10 comes about for kind=10 real/complex BOZ, cf. PR41711. */
51 case 10:
52 case 16:
53 {
54 GFC_INTEGER_16 tmp = value;
55 memcpy (dest, (void *) &tmp, length);
56 }
57 break;
58 #endif
59 case 8:
60 {
61 GFC_INTEGER_8 tmp = value;
62 memcpy (dest, (void *) &tmp, length);
63 }
64 break;
65 case 4:
66 {
67 GFC_INTEGER_4 tmp = value;
68 memcpy (dest, (void *) &tmp, length);
69 }
70 break;
71 case 2:
72 {
73 GFC_INTEGER_2 tmp = value;
74 memcpy (dest, (void *) &tmp, length);
75 }
76 break;
77 case 1:
78 {
79 GFC_INTEGER_1 tmp = value;
80 memcpy (dest, (void *) &tmp, length);
81 }
82 break;
83 default:
84 internal_error (NULL, "Bad integer kind");
85 }
86 }
87
88
89 /* Max signed value of size give by length argument. */
90
91 GFC_UINTEGER_LARGEST
92 si_max (int length)
93 {
94 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
95 GFC_UINTEGER_LARGEST value;
96 #endif
97
98 switch (length)
99 {
100 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
101 case 16:
102 case 10:
103 value = 1;
104 for (int n = 1; n < 4 * length; n++)
105 value = (value << 2) + 3;
106 return value;
107 #endif
108 case 8:
109 return GFC_INTEGER_8_HUGE;
110 case 4:
111 return GFC_INTEGER_4_HUGE;
112 case 2:
113 return GFC_INTEGER_2_HUGE;
114 case 1:
115 return GFC_INTEGER_1_HUGE;
116 default:
117 internal_error (NULL, "Bad integer kind");
118 }
119 }
120
121
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. */
127
128 int
129 convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int length)
130 {
131 char *endptr = NULL;
132 int round_mode, old_round_mode;
133
134 switch (dtp->u.p.current_unit->round_status)
135 {
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;
142 break;
143 default:
144 round_mode = dtp->u.p.current_unit->round_status;
145 break;
146 }
147
148 old_round_mode = get_fpu_rounding_mode();
149 set_fpu_rounding_mode (round_mode);
150
151 switch (length)
152 {
153 case 4:
154 *((GFC_REAL_4*) dest) =
155 #if defined(HAVE_STRTOF)
156 gfc_strtof (buffer, &endptr);
157 #else
158 (GFC_REAL_4) gfc_strtod (buffer, &endptr);
159 #endif
160 break;
161
162 case 8:
163 *((GFC_REAL_8*) dest) = gfc_strtod (buffer, &endptr);
164 break;
165
166 #if defined(HAVE_GFC_REAL_10) && defined (HAVE_STRTOLD)
167 case 10:
168 *((GFC_REAL_10*) dest) = gfc_strtold (buffer, &endptr);
169 break;
170 #endif
171
172 #if defined(HAVE_GFC_REAL_16)
173 # if defined(GFC_REAL_16_IS_FLOAT128)
174 case 16:
175 *((GFC_REAL_16*) dest) = __qmath_(strtoflt128) (buffer, &endptr);
176 break;
177 # elif defined(HAVE_STRTOLD)
178 case 16:
179 *((GFC_REAL_16*) dest) = gfc_strtold (buffer, &endptr);
180 break;
181 # endif
182 #endif
183
184 default:
185 internal_error (&dtp->common, "Unsupported real kind during IO");
186 }
187
188 set_fpu_rounding_mode (old_round_mode);
189
190 if (buffer == endptr)
191 {
192 generate_error (&dtp->common, LIBERROR_READ_VALUE,
193 "Error during floating point read");
194 next_record (dtp, 1);
195 return 1;
196 }
197
198 return 0;
199 }
200
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. */
205
206 int
207 convert_infnan (st_parameter_dt *dtp, void *dest, const char *buffer,
208 int length)
209 {
210 const char *s = buffer;
211 int is_inf, plus = 1;
212
213 if (*s == '+')
214 s++;
215 else if (*s == '-')
216 {
217 s++;
218 plus = 0;
219 }
220
221 is_inf = *s == 'i';
222
223 switch (length)
224 {
225 case 4:
226 if (is_inf)
227 *((GFC_REAL_4*) dest) = plus ? __builtin_inff () : -__builtin_inff ();
228 else
229 *((GFC_REAL_4*) dest) = plus ? __builtin_nanf ("") : -__builtin_nanf ("");
230 break;
231
232 case 8:
233 if (is_inf)
234 *((GFC_REAL_8*) dest) = plus ? __builtin_inf () : -__builtin_inf ();
235 else
236 *((GFC_REAL_8*) dest) = plus ? __builtin_nan ("") : -__builtin_nan ("");
237 break;
238
239 #if defined(HAVE_GFC_REAL_10)
240 case 10:
241 if (is_inf)
242 *((GFC_REAL_10*) dest) = plus ? __builtin_infl () : -__builtin_infl ();
243 else
244 *((GFC_REAL_10*) dest) = plus ? __builtin_nanl ("") : -__builtin_nanl ("");
245 break;
246 #endif
247
248 #if defined(HAVE_GFC_REAL_16)
249 # if defined(GFC_REAL_16_IS_FLOAT128)
250 case 16:
251 *((GFC_REAL_16*) dest) = __qmath_(strtoflt128) (buffer, NULL);
252 break;
253 # else
254 case 16:
255 if (is_inf)
256 *((GFC_REAL_16*) dest) = plus ? __builtin_infl () : -__builtin_infl ();
257 else
258 *((GFC_REAL_16*) dest) = plus ? __builtin_nanl ("") : -__builtin_nanl ("");
259 break;
260 # endif
261 #endif
262
263 default:
264 internal_error (&dtp->common, "Unsupported real kind during IO");
265 }
266
267 return 0;
268 }
269
270
271 /* read_l()-- Read a logical value */
272
273 void
274 read_l (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
275 {
276 char *p;
277 size_t w;
278
279 w = f->u.w;
280
281 p = read_block_form (dtp, &w);
282
283 if (p == NULL)
284 return;
285
286 while (*p == ' ')
287 {
288 if (--w == 0)
289 goto bad;
290 p++;
291 }
292
293 if (*p == '.')
294 {
295 if (--w == 0)
296 goto bad;
297 p++;
298 }
299
300 switch (*p)
301 {
302 case 't':
303 case 'T':
304 set_integer (dest, (GFC_INTEGER_LARGEST) 1, length);
305 break;
306 case 'f':
307 case 'F':
308 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
309 break;
310 default:
311 bad:
312 generate_error (&dtp->common, LIBERROR_READ_VALUE,
313 "Bad value on logical read");
314 next_record (dtp, 1);
315 break;
316 }
317 }
318
319
320 static gfc_char4_t
321 read_utf8 (st_parameter_dt *dtp, size_t *nbytes)
322 {
323 static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
324 static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
325 size_t nb, nread;
326 gfc_char4_t c;
327 char *s;
328
329 *nbytes = 1;
330
331 s = read_block_form (dtp, nbytes);
332 if (s == NULL)
333 return 0;
334
335 /* If this is a short read, just return. */
336 if (*nbytes == 0)
337 return 0;
338
339 c = (uchar) s[0];
340 if (c < 0x80)
341 return c;
342
343 /* The number of leading 1-bits in the first byte indicates how many
344 bytes follow. */
345 for (nb = 2; nb < 7; nb++)
346 if ((c & ~masks[nb-1]) == patns[nb-1])
347 goto found;
348 goto invalid;
349
350 found:
351 c = (c & masks[nb-1]);
352 nread = nb - 1;
353
354 s = read_block_form (dtp, &nread);
355 if (s == NULL)
356 return 0;
357 /* Decode the bytes read. */
358 for (size_t i = 1; i < nb; i++)
359 {
360 gfc_char4_t n = *s++;
361
362 if ((n & 0xC0) != 0x80)
363 goto invalid;
364
365 c = ((c << 6) + (n & 0x3F));
366 }
367
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;
374
375 /* Make sure the character is valid. */
376 if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
377 goto invalid;
378
379 return c;
380
381 invalid:
382 generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
383 return (gfc_char4_t) '?';
384 }
385
386
387 static void
388 read_utf8_char1 (st_parameter_dt *dtp, char *p, size_t len, size_t width)
389 {
390 gfc_char4_t c;
391 char *dest;
392 size_t nbytes, j;
393
394 len = (width < len) ? len : width;
395
396 dest = (char *) p;
397
398 /* Proceed with decoding one character at a time. */
399 for (j = 0; j < len; j++, dest++)
400 {
401 c = read_utf8 (dtp, &nbytes);
402
403 /* Check for a short read and if so, break out. */
404 if (nbytes == 0)
405 break;
406
407 *dest = c > 255 ? '?' : (uchar) c;
408 }
409
410 /* If there was a short read, pad the remaining characters. */
411 for (size_t i = j; i < len; i++)
412 *dest++ = ' ';
413 return;
414 }
415
416 static void
417 read_default_char1 (st_parameter_dt *dtp, char *p, size_t len, size_t width)
418 {
419 char *s;
420 size_t m;
421
422 s = read_block_form (dtp, &width);
423
424 if (s == NULL)
425 return;
426 if (width > len)
427 s += (width - len);
428
429 m = (width > len) ? len : width;
430 memcpy (p, s, m);
431
432 if (len > width)
433 memset (p + m, ' ', len - width);
434 }
435
436
437 static void
438 read_utf8_char4 (st_parameter_dt *dtp, void *p, size_t len, size_t width)
439 {
440 gfc_char4_t *dest;
441 size_t nbytes, j;
442
443 len = (width < len) ? len : width;
444
445 dest = (gfc_char4_t *) p;
446
447 /* Proceed with decoding one character at a time. */
448 for (j = 0; j < len; j++, dest++)
449 {
450 *dest = read_utf8 (dtp, &nbytes);
451
452 /* Check for a short read and if so, break out. */
453 if (nbytes == 0)
454 break;
455 }
456
457 /* If there was a short read, pad the remaining characters. */
458 for (size_t i = j; i < len; i++)
459 *dest++ = (gfc_char4_t) ' ';
460 return;
461 }
462
463
464 static void
465 read_default_char4 (st_parameter_dt *dtp, char *p, size_t len, size_t width)
466 {
467 size_t m, n;
468 gfc_char4_t *dest;
469
470 if (is_char4_unit(dtp))
471 {
472 gfc_char4_t *s4;
473
474 s4 = (gfc_char4_t *) read_block_form4 (dtp, &width);
475
476 if (s4 == NULL)
477 return;
478 if (width > len)
479 s4 += (width - len);
480
481 m = (width > len) ? len : width;
482
483 dest = (gfc_char4_t *) p;
484
485 for (n = 0; n < m; n++)
486 *dest++ = *s4++;
487
488 if (len > width)
489 {
490 for (n = 0; n < len - width; n++)
491 *dest++ = (gfc_char4_t) ' ';
492 }
493 }
494 else
495 {
496 char *s;
497
498 s = read_block_form (dtp, &width);
499
500 if (s == NULL)
501 return;
502 if (width > len)
503 s += (width - len);
504
505 m = (width > len) ? len : width;
506
507 dest = (gfc_char4_t *) p;
508
509 for (n = 0; n < m; n++, dest++, s++)
510 *dest = (unsigned char ) *s;
511
512 if (len > width)
513 {
514 for (n = 0; n < len - width; n++, dest++)
515 *dest = (unsigned char) ' ';
516 }
517 }
518 }
519
520
521 /* read_a()-- Read a character record into a KIND=1 character destination,
522 processing UTF-8 encoding if necessary. */
523
524 void
525 read_a (st_parameter_dt *dtp, const fnode *f, char *p, size_t length)
526 {
527 size_t w;
528
529 if (f->u.w == -1) /* '(A)' edit descriptor */
530 w = length;
531 else
532 w = f->u.w;
533
534 /* Read in w characters, treating comma as not a separator. */
535 dtp->u.p.sf_read_comma = 0;
536
537 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
538 read_utf8_char1 (dtp, p, length, w);
539 else
540 read_default_char1 (dtp, p, length, w);
541
542 dtp->u.p.sf_read_comma =
543 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
544 }
545
546
547 /* read_a_char4()-- Read a character record into a KIND=4 character destination,
548 processing UTF-8 encoding if necessary. */
549
550 void
551 read_a_char4 (st_parameter_dt *dtp, const fnode *f, char *p, size_t length)
552 {
553 size_t w;
554
555 if (f->u.w == -1) /* '(A)' edit descriptor */
556 w = length;
557 else
558 w = f->u.w;
559
560 /* Read in w characters, treating comma as not a separator. */
561 dtp->u.p.sf_read_comma = 0;
562
563 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
564 read_utf8_char4 (dtp, p, length, w);
565 else
566 read_default_char4 (dtp, p, length, w);
567
568 dtp->u.p.sf_read_comma =
569 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
570 }
571
572 /* eat_leading_spaces()-- Given a character pointer and a width,
573 ignore the leading spaces. */
574
575 static char *
576 eat_leading_spaces (size_t *width, char *p)
577 {
578 for (;;)
579 {
580 if (*width == 0 || *p != ' ')
581 break;
582
583 (*width)--;
584 p++;
585 }
586
587 return p;
588 }
589
590
591 static char
592 next_char (st_parameter_dt *dtp, char **p, size_t *w)
593 {
594 char c, *q;
595
596 if (*w == 0)
597 return '\0';
598
599 q = *p;
600 c = *q++;
601 *p = q;
602
603 (*w)--;
604
605 if (c != ' ')
606 return c;
607 if (dtp->u.p.blank_status != BLANK_UNSPECIFIED)
608 return ' '; /* return a blank to signal a null */
609
610 /* At this point, the rest of the field has to be trailing blanks */
611
612 while (*w > 0)
613 {
614 if (*q++ != ' ')
615 return '?';
616 (*w)--;
617 }
618
619 *p = q;
620 return '\0';
621 }
622
623
624 /* read_decimal()-- Read a decimal integer value. The values here are
625 signed values. */
626
627 void
628 read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
629 {
630 GFC_UINTEGER_LARGEST value, maxv, maxv_10;
631 GFC_INTEGER_LARGEST v;
632 size_t w;
633 int negative;
634 char c, *p;
635
636 w = f->u.w;
637
638 /* This is a legacy extension, and the frontend will only allow such cases
639 * through when -fdec-format-defaults is passed.
640 */
641 if (w == (size_t) DEFAULT_WIDTH)
642 w = default_width_for_integer (length);
643
644 p = read_block_form (dtp, &w);
645
646 if (p == NULL)
647 return;
648
649 p = eat_leading_spaces (&w, p);
650 if (w == 0)
651 {
652 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
653 return;
654 }
655
656 negative = 0;
657
658 switch (*p)
659 {
660 case '-':
661 negative = 1;
662 /* Fall through */
663
664 case '+':
665 p++;
666 if (--w == 0)
667 goto bad;
668 /* Fall through */
669
670 default:
671 break;
672 }
673
674 maxv = si_max (length);
675 if (negative)
676 maxv++;
677 maxv_10 = maxv / 10;
678
679 /* At this point we have a digit-string */
680 value = 0;
681
682 for (;;)
683 {
684 c = next_char (dtp, &p, &w);
685 if (c == '\0')
686 break;
687
688 if (c == ' ')
689 {
690 if (dtp->u.p.blank_status == BLANK_NULL)
691 {
692 /* Skip spaces. */
693 for ( ; w > 0; p++, w--)
694 if (*p != ' ') break;
695 continue;
696 }
697 if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
698 }
699
700 if (c < '0' || c > '9')
701 goto bad;
702
703 if (value > maxv_10)
704 goto overflow;
705
706 c -= '0';
707 value = 10 * value;
708
709 if (value > maxv - c)
710 goto overflow;
711 value += c;
712 }
713
714 if (negative)
715 v = -value;
716 else
717 v = value;
718
719 set_integer (dest, v, length);
720 return;
721
722 bad:
723 generate_error (&dtp->common, LIBERROR_READ_VALUE,
724 "Bad value during integer read");
725 next_record (dtp, 1);
726 return;
727
728 overflow:
729 generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
730 "Value overflowed during integer read");
731 next_record (dtp, 1);
732
733 }
734
735
736 /* read_radix()-- This function reads values for non-decimal radixes.
737 The difference here is that we treat the values here as unsigned
738 values for the purposes of overflow. If minus sign is present and
739 the top bit is set, the value will be incorrect. */
740
741 void
742 read_radix (st_parameter_dt *dtp, const fnode *f, char *dest, int length,
743 int radix)
744 {
745 GFC_UINTEGER_LARGEST value, maxv, maxv_r;
746 GFC_INTEGER_LARGEST v;
747 size_t w;
748 int negative;
749 char c, *p;
750
751 w = f->u.w;
752
753 p = read_block_form (dtp, &w);
754
755 if (p == NULL)
756 return;
757
758 p = eat_leading_spaces (&w, p);
759 if (w == 0)
760 {
761 set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
762 return;
763 }
764
765 /* Maximum unsigned value, assuming two's complement. */
766 maxv = 2 * si_max (length) + 1;
767 maxv_r = maxv / radix;
768
769 negative = 0;
770 value = 0;
771
772 switch (*p)
773 {
774 case '-':
775 negative = 1;
776 /* Fall through */
777
778 case '+':
779 p++;
780 if (--w == 0)
781 goto bad;
782 /* Fall through */
783
784 default:
785 break;
786 }
787
788 /* At this point we have a digit-string */
789 value = 0;
790
791 for (;;)
792 {
793 c = next_char (dtp, &p, &w);
794 if (c == '\0')
795 break;
796 if (c == ' ')
797 {
798 if (dtp->u.p.blank_status == BLANK_NULL) continue;
799 if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
800 }
801
802 switch (radix)
803 {
804 case 2:
805 if (c < '0' || c > '1')
806 goto bad;
807 break;
808
809 case 8:
810 if (c < '0' || c > '7')
811 goto bad;
812 break;
813
814 case 16:
815 switch (c)
816 {
817 case '0':
818 case '1':
819 case '2':
820 case '3':
821 case '4':
822 case '5':
823 case '6':
824 case '7':
825 case '8':
826 case '9':
827 break;
828
829 case 'a':
830 case 'b':
831 case 'c':
832 case 'd':
833 case 'e':
834 case 'f':
835 c = c - 'a' + '9' + 1;
836 break;
837
838 case 'A':
839 case 'B':
840 case 'C':
841 case 'D':
842 case 'E':
843 case 'F':
844 c = c - 'A' + '9' + 1;
845 break;
846
847 default:
848 goto bad;
849 }
850
851 break;
852 }
853
854 if (value > maxv_r)
855 goto overflow;
856
857 c -= '0';
858 value = radix * value;
859
860 if (maxv - c < value)
861 goto overflow;
862 value += c;
863 }
864
865 v = value;
866 if (negative)
867 v = -v;
868
869 set_integer (dest, v, length);
870 return;
871
872 bad:
873 generate_error (&dtp->common, LIBERROR_READ_VALUE,
874 "Bad value during integer read");
875 next_record (dtp, 1);
876 return;
877
878 overflow:
879 generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
880 "Value overflowed during integer read");
881 next_record (dtp, 1);
882
883 }
884
885
886 /* read_f()-- Read a floating point number with F-style editing, which
887 is what all of the other floating point descriptors behave as. The
888 tricky part is that optional spaces are allowed after an E or D,
889 and the implicit decimal point if a decimal point is not present in
890 the input. */
891
892 void
893 read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
894 {
895 #define READF_TMP 50
896 char tmp[READF_TMP];
897 size_t buf_size = 0;
898 size_t w;
899 int seen_dp, exponent;
900 int exponent_sign;
901 const char *p;
902 char *buffer;
903 char *out;
904 int seen_int_digit; /* Seen a digit before the decimal point? */
905 int seen_dec_digit; /* Seen a digit after the decimal point? */
906
907 seen_dp = 0;
908 seen_int_digit = 0;
909 seen_dec_digit = 0;
910 exponent_sign = 1;
911 exponent = 0;
912 w = f->u.w;
913 buffer = tmp;
914
915 /* Read in the next block. */
916 p = read_block_form (dtp, &w);
917 if (p == NULL)
918 return;
919 p = eat_leading_spaces (&w, (char*) p);
920 if (w == 0)
921 goto zero;
922
923 /* In this buffer we're going to re-format the number cleanly to be parsed
924 by convert_real in the end; this assures we're using strtod from the
925 C library for parsing and thus probably get the best accuracy possible.
926 This process may add a '+0.0' in front of the number as well as change the
927 exponent because of an implicit decimal point or the like. Thus allocating
928 strlen ("+0.0e-1000") == 10 characters plus one for NUL more than the
929 original buffer had should be enough. */
930 buf_size = w + 11;
931 if (buf_size > READF_TMP)
932 buffer = xmalloc (buf_size);
933
934 out = buffer;
935
936 /* Optional sign */
937 if (*p == '-' || *p == '+')
938 {
939 if (*p == '-')
940 *(out++) = '-';
941 ++p;
942 --w;
943 }
944
945 p = eat_leading_spaces (&w, (char*) p);
946 if (w == 0)
947 goto zero;
948
949 /* Check for Infinity or NaN. */
950 if (unlikely ((w >= 3 && (*p == 'i' || *p == 'I' || *p == 'n' || *p == 'N'))))
951 {
952 int seen_paren = 0;
953 char *save = out;
954
955 /* Scan through the buffer keeping track of spaces and parenthesis. We
956 null terminate the string as soon as we see a left paren or if we are
957 BLANK_NULL mode. Leading spaces have already been skipped above,
958 trailing spaces are ignored by converting to '\0'. A space
959 between "NaN" and the optional perenthesis is not permitted. */
960 while (w > 0)
961 {
962 *out = tolower (*p);
963 switch (*p)
964 {
965 case ' ':
966 if (dtp->u.p.blank_status == BLANK_ZERO)
967 {
968 *out = '0';
969 break;
970 }
971 *out = '\0';
972 if (seen_paren == 1)
973 goto bad_float;
974 break;
975 case '(':
976 seen_paren++;
977 *out = '\0';
978 break;
979 case ')':
980 if (seen_paren++ != 1)
981 goto bad_float;
982 break;
983 default:
984 if (!isalnum (*out))
985 goto bad_float;
986 }
987 --w;
988 ++p;
989 ++out;
990 }
991
992 *out = '\0';
993
994 if (seen_paren != 0 && seen_paren != 2)
995 goto bad_float;
996
997 if ((strcmp (save, "inf") == 0) || (strcmp (save, "infinity") == 0))
998 {
999 if (seen_paren)
1000 goto bad_float;
1001 }
1002 else if (strcmp (save, "nan") != 0)
1003 goto bad_float;
1004
1005 convert_infnan (dtp, dest, buffer, length);
1006 if (buf_size > READF_TMP)
1007 free (buffer);
1008 return;
1009 }
1010
1011 /* Process the mantissa string. */
1012 while (w > 0)
1013 {
1014 switch (*p)
1015 {
1016 case ',':
1017 if (dtp->u.p.current_unit->decimal_status != DECIMAL_COMMA)
1018 goto bad_float;
1019 /* Fall through. */
1020 case '.':
1021 if (seen_dp)
1022 goto bad_float;
1023 if (!seen_int_digit)
1024 *(out++) = '0';
1025 *(out++) = '.';
1026 seen_dp = 1;
1027 break;
1028
1029 case ' ':
1030 if (dtp->u.p.blank_status == BLANK_ZERO)
1031 {
1032 *(out++) = '0';
1033 goto found_digit;
1034 }
1035 else if (dtp->u.p.blank_status == BLANK_NULL)
1036 break;
1037 else
1038 /* TODO: Should we check instead that there are only trailing
1039 blanks here, as is done below for exponents? */
1040 goto done;
1041 /* Fall through. */
1042 case '0':
1043 case '1':
1044 case '2':
1045 case '3':
1046 case '4':
1047 case '5':
1048 case '6':
1049 case '7':
1050 case '8':
1051 case '9':
1052 *(out++) = *p;
1053 found_digit:
1054 if (!seen_dp)
1055 seen_int_digit = 1;
1056 else
1057 seen_dec_digit = 1;
1058 break;
1059
1060 case '-':
1061 case '+':
1062 goto exponent;
1063
1064 case 'e':
1065 case 'E':
1066 case 'd':
1067 case 'D':
1068 case 'q':
1069 case 'Q':
1070 ++p;
1071 --w;
1072 goto exponent;
1073
1074 default:
1075 goto bad_float;
1076 }
1077
1078 ++p;
1079 --w;
1080 }
1081
1082 /* No exponent has been seen, so we use the current scale factor. */
1083 exponent = - dtp->u.p.scale_factor;
1084 goto done;
1085
1086 /* At this point the start of an exponent has been found. */
1087 exponent:
1088 p = eat_leading_spaces (&w, (char*) p);
1089 if (*p == '-' || *p == '+')
1090 {
1091 if (*p == '-')
1092 exponent_sign = -1;
1093 ++p;
1094 --w;
1095 }
1096
1097 /* At this point a digit string is required. We calculate the value
1098 of the exponent in order to take account of the scale factor and
1099 the d parameter before explict conversion takes place. */
1100
1101 if (w == 0)
1102 {
1103 /* Extension: allow default exponent of 0 when omitted. */
1104 if (dtp->common.flags & IOPARM_DT_DEC_EXT)
1105 goto done;
1106 else
1107 goto bad_float;
1108 }
1109
1110 if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
1111 {
1112 while (w > 0 && isdigit (*p))
1113 {
1114 exponent *= 10;
1115 exponent += *p - '0';
1116 ++p;
1117 --w;
1118 }
1119
1120 /* Only allow trailing blanks. */
1121 while (w > 0)
1122 {
1123 if (*p != ' ')
1124 goto bad_float;
1125 ++p;
1126 --w;
1127 }
1128 }
1129 else /* BZ or BN status is enabled. */
1130 {
1131 while (w > 0)
1132 {
1133 if (*p == ' ')
1134 {
1135 if (dtp->u.p.blank_status == BLANK_ZERO)
1136 exponent *= 10;
1137 else
1138 assert (dtp->u.p.blank_status == BLANK_NULL);
1139 }
1140 else if (!isdigit (*p))
1141 goto bad_float;
1142 else
1143 {
1144 exponent *= 10;
1145 exponent += *p - '0';
1146 }
1147
1148 ++p;
1149 --w;
1150 }
1151 }
1152
1153 exponent *= exponent_sign;
1154
1155 done:
1156 /* Use the precision specified in the format if no decimal point has been
1157 seen. */
1158 if (!seen_dp)
1159 exponent -= f->u.real.d;
1160
1161 /* Output a trailing '0' after decimal point if not yet found. */
1162 if (seen_dp && !seen_dec_digit)
1163 *(out++) = '0';
1164 /* Handle input of style "E+NN" by inserting a 0 for the
1165 significand. */
1166 else if (!seen_int_digit && !seen_dec_digit)
1167 {
1168 notify_std (&dtp->common, GFC_STD_LEGACY,
1169 "REAL input of style 'E+NN'");
1170 *(out++) = '0';
1171 }
1172
1173 /* Print out the exponent to finish the reformatted number. Maximum 4
1174 digits for the exponent. */
1175 if (exponent != 0)
1176 {
1177 int dig;
1178
1179 *(out++) = 'e';
1180 if (exponent < 0)
1181 {
1182 *(out++) = '-';
1183 exponent = - exponent;
1184 }
1185
1186 if (exponent >= 10000)
1187 goto bad_float;
1188
1189 for (dig = 3; dig >= 0; --dig)
1190 {
1191 out[dig] = (char) ('0' + exponent % 10);
1192 exponent /= 10;
1193 }
1194 out += 4;
1195 }
1196 *(out++) = '\0';
1197
1198 /* Do the actual conversion. */
1199 convert_real (dtp, dest, buffer, length);
1200 if (buf_size > READF_TMP)
1201 free (buffer);
1202 return;
1203
1204 /* The value read is zero. */
1205 zero:
1206 switch (length)
1207 {
1208 case 4:
1209 *((GFC_REAL_4 *) dest) = 0.0;
1210 break;
1211
1212 case 8:
1213 *((GFC_REAL_8 *) dest) = 0.0;
1214 break;
1215
1216 #ifdef HAVE_GFC_REAL_10
1217 case 10:
1218 *((GFC_REAL_10 *) dest) = 0.0;
1219 break;
1220 #endif
1221
1222 #ifdef HAVE_GFC_REAL_16
1223 case 16:
1224 *((GFC_REAL_16 *) dest) = 0.0;
1225 break;
1226 #endif
1227
1228 default:
1229 internal_error (&dtp->common, "Unsupported real kind during IO");
1230 }
1231 return;
1232
1233 bad_float:
1234 if (buf_size > READF_TMP)
1235 free (buffer);
1236 generate_error (&dtp->common, LIBERROR_READ_VALUE,
1237 "Bad value during floating point read");
1238 next_record (dtp, 1);
1239 return;
1240 }
1241
1242
1243 /* read_x()-- Deal with the X/TR descriptor. We just read some data
1244 and never look at it. */
1245
1246 void
1247 read_x (st_parameter_dt *dtp, size_t n)
1248 {
1249 size_t length;
1250 int q, q2;
1251
1252 if ((dtp->u.p.current_unit->pad_status == PAD_NO || is_internal_unit (dtp))
1253 && dtp->u.p.current_unit->bytes_left < (gfc_offset) n)
1254 n = dtp->u.p.current_unit->bytes_left;
1255
1256 if (n == 0)
1257 return;
1258
1259 length = n;
1260
1261 if (is_internal_unit (dtp))
1262 {
1263 mem_alloc_r (dtp->u.p.current_unit->s, &length);
1264 if (unlikely (length < n))
1265 n = length;
1266 goto done;
1267 }
1268
1269 if (dtp->u.p.sf_seen_eor)
1270 return;
1271
1272 n = 0;
1273 while (n < length)
1274 {
1275 q = fbuf_getc (dtp->u.p.current_unit);
1276 if (q == EOF)
1277 break;
1278 else if (dtp->u.p.current_unit->flags.cc != CC_NONE
1279 && (q == '\n' || q == '\r'))
1280 {
1281 /* Unexpected end of line. Set the position. */
1282 dtp->u.p.sf_seen_eor = 1;
1283
1284 /* If we see an EOR during non-advancing I/O, we need to skip
1285 the rest of the I/O statement. Set the corresponding flag. */
1286 if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
1287 dtp->u.p.eor_condition = 1;
1288
1289 /* If we encounter a CR, it might be a CRLF. */
1290 if (q == '\r') /* Probably a CRLF */
1291 {
1292 /* See if there is an LF. */
1293 q2 = fbuf_getc (dtp->u.p.current_unit);
1294 if (q2 == '\n')
1295 dtp->u.p.sf_seen_eor = 2;
1296 else if (q2 != EOF) /* Oops, seek back. */
1297 fbuf_seek (dtp->u.p.current_unit, -1, SEEK_CUR);
1298 }
1299 goto done;
1300 }
1301 n++;
1302 }
1303
1304 done:
1305 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
1306 dtp->u.p.current_unit->has_size)
1307 dtp->u.p.current_unit->size_used += (GFC_IO_INT) n;
1308 dtp->u.p.current_unit->bytes_left -= n;
1309 dtp->u.p.current_unit->strm_pos += (gfc_offset) n;
1310 }
1311