OSDN Git Service

2010-03-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / libgfortran / io / read.c
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
4
5 This file is part of the GNU Fortran 95 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 <errno.h>
32 #include <ctype.h>
33 #include <stdlib.h>
34 #include <assert.h>
35
36 typedef unsigned char uchar;
37
38 /* read.c -- Deal with formatted reads */
39
40
41 /* set_integer()-- All of the integer assignments come here to
42  * actually place the value into memory.  */
43
44 void
45 set_integer (void *dest, GFC_INTEGER_LARGEST value, int length)
46 {
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_value()-- Given a length (kind), return the maximum signed or
90  * unsigned value */
91
92 GFC_UINTEGER_LARGEST
93 max_value (int length, int signed_flag)
94 {
95   GFC_UINTEGER_LARGEST value;
96 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
97   int n;
98 #endif
99
100   switch (length)
101     {
102 #if defined HAVE_GFC_REAL_16 || defined HAVE_GFC_REAL_10
103     case 16:
104     case 10:
105       value = 1;
106       for (n = 1; n < 4 * length; n++)
107         value = (value << 2) + 3;
108       if (! signed_flag)
109         value = 2*value+1;
110       break;
111 #endif
112     case 8:
113       value = signed_flag ? 0x7fffffffffffffff : 0xffffffffffffffff;
114       break;
115     case 4:
116       value = signed_flag ? 0x7fffffff : 0xffffffff;
117       break;
118     case 2:
119       value = signed_flag ? 0x7fff : 0xffff;
120       break;
121     case 1:
122       value = signed_flag ? 0x7f : 0xff;
123       break;
124     default:
125       internal_error (NULL, "Bad integer kind");
126     }
127
128   return value;
129 }
130
131
132 /* convert_real()-- Convert a character representation of a floating
133  * point number to the machine number.  Returns nonzero if there is a
134  * range problem during conversion.  Note: many architectures
135  * (e.g. IA-64, HP-PA) require that the storage pointed to by the dest
136  * argument is properly aligned for the type in question.  TODO:
137  * handle not-a-numbers and infinities.  */
138
139 int
140 convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int length)
141 {
142   errno = 0;
143
144   switch (length)
145     {
146     case 4:
147       *((GFC_REAL_4*) dest) =
148 #if defined(HAVE_STRTOF)
149         gfc_strtof (buffer, NULL);
150 #else
151         (GFC_REAL_4) gfc_strtod (buffer, NULL);
152 #endif
153       break;
154
155     case 8:
156       *((GFC_REAL_8*) dest) = gfc_strtod (buffer, NULL);
157       break;
158
159 #if defined(HAVE_GFC_REAL_10) && defined (HAVE_STRTOLD)
160     case 10:
161       *((GFC_REAL_10*) dest) = gfc_strtold (buffer, NULL);
162       break;
163 #endif
164
165 #if defined(HAVE_GFC_REAL_16) && defined (HAVE_STRTOLD)
166     case 16:
167       *((GFC_REAL_16*) dest) = gfc_strtold (buffer, NULL);
168       break;
169 #endif
170
171     default:
172       internal_error (&dtp->common, "Unsupported real kind during IO");
173     }
174
175   if (errno == EINVAL)
176     {
177       generate_error (&dtp->common, LIBERROR_READ_VALUE,
178                       "Error during floating point read");
179       next_record (dtp, 1);
180       return 1;
181     }
182
183   return 0;
184 }
185
186
187 /* read_l()-- Read a logical value */
188
189 void
190 read_l (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
191 {
192   char *p;
193   int w;
194
195   w = f->u.w;
196
197   p = read_block_form (dtp, &w);
198
199   if (p == NULL)
200     return;
201
202   while (*p == ' ')
203     {
204       if (--w == 0)
205         goto bad;
206       p++;
207     }
208
209   if (*p == '.')
210     {
211       if (--w == 0)
212         goto bad;
213       p++;
214     }
215
216   switch (*p)
217     {
218     case 't':
219     case 'T':
220       set_integer (dest, (GFC_INTEGER_LARGEST) 1, length);
221       break;
222     case 'f':
223     case 'F':
224       set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
225       break;
226     default:
227     bad:
228       generate_error (&dtp->common, LIBERROR_READ_VALUE,
229                       "Bad value on logical read");
230       next_record (dtp, 1);
231       break;
232     }
233 }
234
235
236 static gfc_char4_t
237 read_utf8 (st_parameter_dt *dtp, int *nbytes) 
238 {
239   static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
240   static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
241   int i, nb, nread;
242   gfc_char4_t c;
243   char *s;
244
245   *nbytes = 1;
246
247   s = read_block_form (dtp, nbytes);
248   if (s == NULL)
249     return 0;
250
251   /* If this is a short read, just return.  */
252   if (*nbytes == 0)
253     return 0;
254
255   c = (uchar) s[0];
256   if (c < 0x80)
257     return c;
258
259   /* The number of leading 1-bits in the first byte indicates how many
260      bytes follow.  */
261   for (nb = 2; nb < 7; nb++)
262     if ((c & ~masks[nb-1]) == patns[nb-1])
263       goto found;
264   goto invalid;
265         
266  found:
267   c = (c & masks[nb-1]);
268   nread = nb - 1;
269
270   s = read_block_form (dtp, &nread);
271   if (s == NULL)
272     return 0;
273   /* Decode the bytes read.  */
274   for (i = 1; i < nb; i++)
275     {
276       gfc_char4_t n = *s++;
277
278       if ((n & 0xC0) != 0x80)
279         goto invalid;
280
281       c = ((c << 6) + (n & 0x3F));
282     }
283
284   /* Make sure the shortest possible encoding was used.  */
285   if (c <=      0x7F && nb > 1) goto invalid;
286   if (c <=     0x7FF && nb > 2) goto invalid;
287   if (c <=    0xFFFF && nb > 3) goto invalid;
288   if (c <=  0x1FFFFF && nb > 4) goto invalid;
289   if (c <= 0x3FFFFFF && nb > 5) goto invalid;
290
291   /* Make sure the character is valid.  */
292   if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
293     goto invalid;
294
295   return c;
296       
297  invalid:
298   generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
299   return (gfc_char4_t) '?';
300 }
301
302
303 static void
304 read_utf8_char1 (st_parameter_dt *dtp, char *p, int len, int width)
305 {
306   gfc_char4_t c;
307   char *dest;
308   int nbytes;
309   int i, j;
310
311   len = (width < len) ? len : width;
312
313   dest = (char *) p;
314
315   /* Proceed with decoding one character at a time.  */
316   for (j = 0; j < len; j++, dest++)
317     {
318       c = read_utf8 (dtp, &nbytes);
319
320       /* Check for a short read and if so, break out.  */
321       if (nbytes == 0)
322         break;
323
324       *dest = c > 255 ? '?' : (uchar) c;
325     }
326
327   /* If there was a short read, pad the remaining characters.  */
328   for (i = j; i < len; i++)
329     *dest++ = ' ';
330   return;
331 }
332
333 static void
334 read_default_char1 (st_parameter_dt *dtp, char *p, int len, int width)
335 {
336   char *s;
337   int m, n;
338
339   s = read_block_form (dtp, &width);
340   
341   if (s == NULL)
342     return;
343   if (width > len)
344      s += (width - len);
345
346   m = (width > len) ? len : width;
347   memcpy (p, s, m);
348
349   n = len - width;
350   if (n > 0)
351     memset (p + m, ' ', n);
352 }
353
354
355 static void
356 read_utf8_char4 (st_parameter_dt *dtp, void *p, int len, int width)
357 {
358   gfc_char4_t *dest;
359   int nbytes;
360   int i, j;
361
362   len = (width < len) ? len : width;
363
364   dest = (gfc_char4_t *) p;
365
366   /* Proceed with decoding one character at a time.  */
367   for (j = 0; j < len; j++, dest++)
368     {
369       *dest = read_utf8 (dtp, &nbytes);
370
371       /* Check for a short read and if so, break out.  */
372       if (nbytes == 0)
373         break;
374     }
375
376   /* If there was a short read, pad the remaining characters.  */
377   for (i = j; i < len; i++)
378     *dest++ = (gfc_char4_t) ' ';
379   return;
380 }
381
382
383 static void
384 read_default_char4 (st_parameter_dt *dtp, char *p, int len, int width)
385 {
386   char *s;
387   gfc_char4_t *dest;
388   int m, n;
389
390   s = read_block_form (dtp, &width);
391   
392   if (s == NULL)
393     return;
394   if (width > len)
395      s += (width - len);
396
397   m = ((int) width > len) ? len : (int) width;
398   
399   dest = (gfc_char4_t *) p;
400   
401   for (n = 0; n < m; n++, dest++, s++)
402     *dest = (unsigned char ) *s;
403
404   for (n = 0; n < len - (int) width; n++, dest++)
405     *dest = (unsigned char) ' ';
406 }
407
408
409 /* read_a()-- Read a character record into a KIND=1 character destination,
410    processing UTF-8 encoding if necessary.  */
411
412 void
413 read_a (st_parameter_dt *dtp, const fnode *f, char *p, int length)
414 {
415   int wi;
416   int w;
417
418   wi = f->u.w;
419   if (wi == -1) /* '(A)' edit descriptor  */
420     wi = length;
421   w = wi;
422
423   /* Read in w characters, treating comma as not a separator.  */
424   dtp->u.p.sf_read_comma = 0;
425
426   if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
427     read_utf8_char1 (dtp, p, length, w);
428   else
429     read_default_char1 (dtp, p, length, w);
430
431   dtp->u.p.sf_read_comma =
432     dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
433 }
434
435
436 /* read_a_char4()-- Read a character record into a KIND=4 character destination,
437    processing UTF-8 encoding if necessary.  */
438
439 void
440 read_a_char4 (st_parameter_dt *dtp, const fnode *f, char *p, int length)
441 {
442   int w;
443
444   w = f->u.w;
445   if (w == -1) /* '(A)' edit descriptor  */
446     w = length;
447
448   /* Read in w characters, treating comma as not a separator.  */
449   dtp->u.p.sf_read_comma = 0;
450
451   if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
452     read_utf8_char4 (dtp, p, length, w);
453   else
454     read_default_char4 (dtp, p, length, w);
455   
456   dtp->u.p.sf_read_comma =
457     dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
458 }
459
460 /* eat_leading_spaces()-- Given a character pointer and a width,
461  * ignore the leading spaces.  */
462
463 static char *
464 eat_leading_spaces (int *width, char *p)
465 {
466   for (;;)
467     {
468       if (*width == 0 || *p != ' ')
469         break;
470
471       (*width)--;
472       p++;
473     }
474
475   return p;
476 }
477
478
479 static char
480 next_char (st_parameter_dt *dtp, char **p, int *w)
481 {
482   char c, *q;
483
484   if (*w == 0)
485     return '\0';
486
487   q = *p;
488   c = *q++;
489   *p = q;
490
491   (*w)--;
492
493   if (c != ' ')
494     return c;
495   if (dtp->u.p.blank_status != BLANK_UNSPECIFIED)
496     return ' ';  /* return a blank to signal a null */ 
497
498   /* At this point, the rest of the field has to be trailing blanks */
499
500   while (*w > 0)
501     {
502       if (*q++ != ' ')
503         return '?';
504       (*w)--;
505     }
506
507   *p = q;
508   return '\0';
509 }
510
511
512 /* read_decimal()-- Read a decimal integer value.  The values here are
513  * signed values. */
514
515 void
516 read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
517 {
518   GFC_UINTEGER_LARGEST value, maxv, maxv_10;
519   GFC_INTEGER_LARGEST v;
520   int w, negative; 
521   char c, *p;
522
523   w = f->u.w;
524
525   p = read_block_form (dtp, &w);
526
527   if (p == NULL)
528     return;
529
530   p = eat_leading_spaces (&w, p);
531   if (w == 0)
532     {
533       set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
534       return;
535     }
536
537   maxv = max_value (length, 1);
538   maxv_10 = maxv / 10;
539
540   negative = 0;
541   value = 0;
542
543   switch (*p)
544     {
545     case '-':
546       negative = 1;
547       /* Fall through */
548
549     case '+':
550       p++;
551       if (--w == 0)
552         goto bad;
553       /* Fall through */
554
555     default:
556       break;
557     }
558
559   /* At this point we have a digit-string */
560   value = 0;
561
562   for (;;)
563     {
564       c = next_char (dtp, &p, &w);
565       if (c == '\0')
566         break;
567         
568       if (c == ' ')
569         {
570           if (dtp->u.p.blank_status == BLANK_NULL) continue;
571           if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
572         }
573         
574       if (c < '0' || c > '9')
575         goto bad;
576
577       if (value > maxv_10 && compile_options.range_check == 1)
578         goto overflow;
579
580       c -= '0';
581       value = 10 * value;
582
583       if (value > maxv - c && compile_options.range_check == 1)
584         goto overflow;
585       value += c;
586     }
587
588   v = value;
589   if (negative)
590     v = -v;
591
592   set_integer (dest, v, length);
593   return;
594
595  bad:
596   generate_error (&dtp->common, LIBERROR_READ_VALUE,
597                   "Bad value during integer read");
598   next_record (dtp, 1);
599   return;
600
601  overflow:
602   generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
603                   "Value overflowed during integer read");
604   next_record (dtp, 1);
605
606 }
607
608
609 /* read_radix()-- This function reads values for non-decimal radixes.
610  * The difference here is that we treat the values here as unsigned
611  * values for the purposes of overflow.  If minus sign is present and
612  * the top bit is set, the value will be incorrect. */
613
614 void
615 read_radix (st_parameter_dt *dtp, const fnode *f, char *dest, int length,
616             int radix)
617 {
618   GFC_UINTEGER_LARGEST value, maxv, maxv_r;
619   GFC_INTEGER_LARGEST v;
620   int w, negative;
621   char c, *p;
622
623   w = f->u.w;
624
625   p = read_block_form (dtp, &w);
626
627   if (p == NULL)
628     return;
629
630   p = eat_leading_spaces (&w, p);
631   if (w == 0)
632     {
633       set_integer (dest, (GFC_INTEGER_LARGEST) 0, length);
634       return;
635     }
636
637   maxv = max_value (length, 0);
638   maxv_r = maxv / radix;
639
640   negative = 0;
641   value = 0;
642
643   switch (*p)
644     {
645     case '-':
646       negative = 1;
647       /* Fall through */
648
649     case '+':
650       p++;
651       if (--w == 0)
652         goto bad;
653       /* Fall through */
654
655     default:
656       break;
657     }
658
659   /* At this point we have a digit-string */
660   value = 0;
661
662   for (;;)
663     {
664       c = next_char (dtp, &p, &w);
665       if (c == '\0')
666         break;
667       if (c == ' ')
668         {
669           if (dtp->u.p.blank_status == BLANK_NULL) continue;
670           if (dtp->u.p.blank_status == BLANK_ZERO) c = '0';
671         }
672
673       switch (radix)
674         {
675         case 2:
676           if (c < '0' || c > '1')
677             goto bad;
678           break;
679
680         case 8:
681           if (c < '0' || c > '7')
682             goto bad;
683           break;
684
685         case 16:
686           switch (c)
687             {
688             case '0':
689             case '1':
690             case '2':
691             case '3':
692             case '4':
693             case '5':
694             case '6':
695             case '7':
696             case '8':
697             case '9':
698               break;
699
700             case 'a':
701             case 'b':
702             case 'c':
703             case 'd':
704             case 'e':
705             case 'f':
706               c = c - 'a' + '9' + 1;
707               break;
708
709             case 'A':
710             case 'B':
711             case 'C':
712             case 'D':
713             case 'E':
714             case 'F':
715               c = c - 'A' + '9' + 1;
716               break;
717
718             default:
719               goto bad;
720             }
721
722           break;
723         }
724
725       if (value > maxv_r)
726         goto overflow;
727
728       c -= '0';
729       value = radix * value;
730
731       if (maxv - c < value)
732         goto overflow;
733       value += c;
734     }
735
736   v = value;
737   if (negative)
738     v = -v;
739
740   set_integer (dest, v, length);
741   return;
742
743  bad:
744   generate_error (&dtp->common, LIBERROR_READ_VALUE,
745                   "Bad value during integer read");
746   next_record (dtp, 1);
747   return;
748
749  overflow:
750   generate_error (&dtp->common, LIBERROR_READ_OVERFLOW,
751                   "Value overflowed during integer read");
752   next_record (dtp, 1);
753
754 }
755
756
757 /* read_f()-- Read a floating point number with F-style editing, which
758    is what all of the other floating point descriptors behave as.  The
759    tricky part is that optional spaces are allowed after an E or D,
760    and the implicit decimal point if a decimal point is not present in
761    the input.  */
762
763 void
764 read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
765 {
766   int w, seen_dp, exponent;
767   int exponent_sign;
768   const char *p;
769   char *buffer;
770   char *out;
771   int seen_int_digit; /* Seen a digit before the decimal point?  */
772   int seen_dec_digit; /* Seen a digit after the decimal point?  */
773
774   seen_dp = 0;
775   seen_int_digit = 0;
776   seen_dec_digit = 0;
777   exponent_sign = 1;
778   exponent = 0;
779   w = f->u.w;
780
781   /* Read in the next block.  */
782   p = read_block_form (dtp, &w);
783   if (p == NULL)
784     return;
785   p = eat_leading_spaces (&w, (char*) p);
786   if (w == 0)
787     goto zero;
788
789   /* In this buffer we're going to re-format the number cleanly to be parsed
790      by convert_real in the end; this assures we're using strtod from the
791      C library for parsing and thus probably get the best accuracy possible.
792      This process may add a '+0.0' in front of the number as well as change the
793      exponent because of an implicit decimal point or the like.  Thus allocating
794      strlen ("+0.0e-1000") == 10 characters plus one for NUL more than the
795      original buffer had should be enough.  */
796   buffer = gfc_alloca (w + 11);
797   out = buffer;
798
799   /* Optional sign */
800   if (*p == '-' || *p == '+')
801     {
802       if (*p == '-')
803         *(out++) = '-';
804       ++p;
805       --w;
806     }
807
808   p = eat_leading_spaces (&w, (char*) p);
809   if (w == 0)
810     goto zero;
811
812   /* Process the mantissa string.  */
813   while (w > 0)
814     {
815       switch (*p)
816         {
817         case ',':
818           if (dtp->u.p.current_unit->decimal_status != DECIMAL_COMMA)
819             goto bad_float;
820           /* Fall through.  */
821         case '.':
822           if (seen_dp)
823             goto bad_float;
824           if (!seen_int_digit)
825             *(out++) = '0';
826           *(out++) = '.';
827           seen_dp = 1;
828           break;
829
830         case ' ':
831           if (dtp->u.p.blank_status == BLANK_ZERO)
832             {
833               *(out++) = '0';
834               goto found_digit;
835             }
836           else if (dtp->u.p.blank_status == BLANK_NULL)
837             break;
838           else
839             /* TODO: Should we check instead that there are only trailing
840                blanks here, as is done below for exponents?  */
841             goto done;
842           /* Fall through.  */
843         case '0':
844         case '1':
845         case '2':
846         case '3':
847         case '4':
848         case '5':
849         case '6':
850         case '7':
851         case '8':
852         case '9':
853           *(out++) = *p;
854 found_digit:
855           if (!seen_dp)
856             seen_int_digit = 1;
857           else
858             seen_dec_digit = 1;
859           break;
860
861         case '-':
862         case '+':
863           goto exponent;
864
865         case 'e':
866         case 'E':
867         case 'd':
868         case 'D':
869           ++p;
870           --w;
871           goto exponent;
872
873         default:
874           goto bad_float;
875         }
876
877       ++p;
878       --w;
879     }
880   
881   /* No exponent has been seen, so we use the current scale factor.  */
882   exponent = - dtp->u.p.scale_factor;
883   goto done;
884
885   /* At this point the start of an exponent has been found.  */
886 exponent:
887   p = eat_leading_spaces (&w, (char*) p);
888   if (*p == '-' || *p == '+')
889     {
890       if (*p == '-')
891         exponent_sign = -1;
892       ++p;
893       --w;
894     }
895
896   /* At this point a digit string is required.  We calculate the value
897      of the exponent in order to take account of the scale factor and
898      the d parameter before explict conversion takes place.  */
899
900   if (w == 0)
901     goto bad_float;
902
903   if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
904     {
905       while (w > 0 && isdigit (*p))
906         {
907           exponent *= 10;
908           exponent += *p - '0';
909           ++p;
910           --w;
911         }
912         
913       /* Only allow trailing blanks.  */
914       while (w > 0)
915         {
916           if (*p != ' ')
917             goto bad_float;
918           ++p;
919           --w;
920         }
921     }    
922   else  /* BZ or BN status is enabled.  */
923     {
924       while (w > 0)
925         {
926           if (*p == ' ')
927             {
928               if (dtp->u.p.blank_status == BLANK_ZERO)
929                 exponent *= 10;
930               else
931                 assert (dtp->u.p.blank_status == BLANK_NULL);
932             }
933           else if (!isdigit (*p))
934             goto bad_float;
935           else
936             {
937               exponent *= 10;
938               exponent += *p - '0';
939             }
940
941           ++p;
942           --w;
943         }
944     }
945
946   exponent *= exponent_sign;
947
948 done:
949   /* Use the precision specified in the format if no decimal point has been
950      seen.  */
951   if (!seen_dp)
952     exponent -= f->u.real.d;
953
954   /* Output a trailing '0' after decimal point if not yet found.  */
955   if (seen_dp && !seen_dec_digit)
956     *(out++) = '0';
957
958   /* Print out the exponent to finish the reformatted number.  Maximum 4
959      digits for the exponent.  */
960   if (exponent != 0)
961     {
962       int dig;
963
964       *(out++) = 'e';
965       if (exponent < 0)
966         {
967           *(out++) = '-';
968           exponent = - exponent;
969         }
970
971       assert (exponent < 10000);
972       for (dig = 3; dig >= 0; --dig)
973         {
974           out[dig] = (char) ('0' + exponent % 10);
975           exponent /= 10;
976         }
977       out += 4;
978     }
979   *(out++) = '\0';
980
981   /* Do the actual conversion.  */
982   convert_real (dtp, dest, buffer, length);
983
984   return;
985
986   /* The value read is zero.  */
987 zero:
988   switch (length)
989     {
990       case 4:
991         *((GFC_REAL_4 *) dest) = 0.0;
992         break;
993
994       case 8:
995         *((GFC_REAL_8 *) dest) = 0.0;
996         break;
997
998 #ifdef HAVE_GFC_REAL_10
999       case 10:
1000         *((GFC_REAL_10 *) dest) = 0.0;
1001         break;
1002 #endif
1003
1004 #ifdef HAVE_GFC_REAL_16
1005       case 16:
1006         *((GFC_REAL_16 *) dest) = 0.0;
1007         break;
1008 #endif
1009
1010       default:
1011         internal_error (&dtp->common, "Unsupported real kind during IO");
1012     }
1013   return;
1014
1015 bad_float:
1016   generate_error (&dtp->common, LIBERROR_READ_VALUE,
1017                   "Bad value during floating point read");
1018   next_record (dtp, 1);
1019   return;
1020 }
1021
1022
1023 /* read_x()-- Deal with the X/TR descriptor.  We just read some data
1024  * and never look at it. */
1025
1026 void
1027 read_x (st_parameter_dt *dtp, int n)
1028 {
1029   int length;
1030   char *p, q;
1031
1032   if ((dtp->u.p.current_unit->pad_status == PAD_NO || is_internal_unit (dtp))
1033        && dtp->u.p.current_unit->bytes_left < n)
1034     n = dtp->u.p.current_unit->bytes_left;
1035     
1036   if (n == 0)
1037     return;
1038
1039   length = n;
1040
1041   if (is_internal_unit (dtp))
1042     {
1043       p = mem_alloc_r (dtp->u.p.current_unit->s, &length);
1044       if (unlikely (length < n))
1045         n = length;
1046       goto done;
1047     }
1048
1049   p = fbuf_read (dtp->u.p.current_unit, &length);
1050   if (p == NULL)
1051     {
1052       hit_eof (dtp);
1053       return;
1054     }
1055   
1056   if (length == 0 && dtp->u.p.item_count == 1)
1057     {
1058       if (dtp->u.p.current_unit->pad_status == PAD_NO)
1059         {
1060           hit_eof (dtp);
1061           return;
1062         }
1063       else
1064         return;
1065     }
1066
1067   n = 0;
1068   while (n < length)
1069     {
1070       q = *p;
1071       if (q == '\n' || q == '\r')
1072         {
1073           /* Unexpected end of line. Set the position.  */
1074           fbuf_seek (dtp->u.p.current_unit, n + 1 ,SEEK_CUR);
1075           dtp->u.p.sf_seen_eor = 1;
1076
1077           /* If we encounter a CR, it might be a CRLF.  */
1078           if (q == '\r') /* Probably a CRLF */
1079             {
1080               /* See if there is an LF. Use fbuf_read rather then fbuf_getc so
1081                  the position is not advanced unless it really is an LF.  */
1082               int readlen = 1;
1083               p = fbuf_read (dtp->u.p.current_unit, &readlen);
1084               if (*p == '\n' && readlen == 1)
1085                 {
1086                   dtp->u.p.sf_seen_eor = 2;
1087                   fbuf_seek (dtp->u.p.current_unit, 1 ,SEEK_CUR);
1088                 }
1089             }
1090           goto done;
1091         }
1092       n++;
1093       p++;
1094     } 
1095
1096   fbuf_seek (dtp->u.p.current_unit, n, SEEK_CUR);
1097   
1098  done:
1099   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
1100     dtp->u.p.size_used += (GFC_IO_INT) n;
1101   dtp->u.p.current_unit->bytes_left -= n;
1102   dtp->u.p.current_unit->strm_pos += (gfc_offset) n;
1103 }
1104