1 /* Copyright (C) 2002-2013 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist output contributed by Paul Thomas
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran runtime library (libgfortran).
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 Libgfortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
36 #define star_fill(p, n) memset(p, '*', n)
38 typedef unsigned char uchar
;
40 /* Helper functions for character(kind=4) internal units. These are needed
41 by write_float.def. */
44 memcpy4 (gfc_char4_t
*dest
, const char *source
, int k
)
48 const char *p
= source
;
49 for (j
= 0; j
< k
; j
++)
50 *dest
++ = (gfc_char4_t
) *p
++;
53 /* This include contains the heart and soul of formatted floating point. */
54 #include "write_float.def"
56 /* Write out default char4. */
59 write_default_char4 (st_parameter_dt
*dtp
, const gfc_char4_t
*source
,
60 int src_len
, int w_len
)
67 /* Take care of preceding blanks. */
71 p
= write_block (dtp
, k
);
74 if (is_char4_unit (dtp
))
76 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
83 /* Get ready to handle delimiters if needed. */
84 switch (dtp
->u
.p
.current_unit
->delim_status
)
86 case DELIM_APOSTROPHE
:
97 /* Now process the remaining characters, one at a time. */
98 for (j
= 0; j
< src_len
; j
++)
101 if (is_char4_unit (dtp
))
104 /* Handle delimiters if any. */
105 if (c
== d
&& d
!= ' ')
107 p
= write_block (dtp
, 2);
110 q
= (gfc_char4_t
*) p
;
115 p
= write_block (dtp
, 1);
118 q
= (gfc_char4_t
*) p
;
124 /* Handle delimiters if any. */
125 if (c
== d
&& d
!= ' ')
127 p
= write_block (dtp
, 2);
134 p
= write_block (dtp
, 1);
138 *p
= c
> 255 ? '?' : (uchar
) c
;
144 /* Write out UTF-8 converted from char4. */
147 write_utf8_char4 (st_parameter_dt
*dtp
, gfc_char4_t
*source
,
148 int src_len
, int w_len
)
153 static const uchar masks
[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
154 static const uchar limits
[6] = { 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };
158 /* Take care of preceding blanks. */
162 p
= write_block (dtp
, k
);
168 /* Get ready to handle delimiters if needed. */
169 switch (dtp
->u
.p
.current_unit
->delim_status
)
171 case DELIM_APOSTROPHE
:
182 /* Now process the remaining characters, one at a time. */
183 for (j
= k
; j
< src_len
; j
++)
188 /* Handle the delimiters if any. */
189 if (c
== d
&& d
!= ' ')
191 p
= write_block (dtp
, 2);
198 p
= write_block (dtp
, 1);
206 /* Convert to UTF-8 sequence. */
212 *--q
= ((c
& 0x3F) | 0x80);
216 while (c
>= 0x3F || (c
& limits
[nbytes
-1]));
218 *--q
= (c
| masks
[nbytes
-1]);
220 p
= write_block (dtp
, nbytes
);
232 write_a (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
, int len
)
237 wlen
= f
->u
.string
.length
< 0
238 || (f
->format
== FMT_G
&& f
->u
.string
.length
== 0)
239 ? len
: f
->u
.string
.length
;
242 /* If this is formatted STREAM IO convert any embedded line feed characters
243 to CR_LF on systems that use that sequence for newlines. See F2003
244 Standard sections 10.6.3 and 9.9 for further information. */
245 if (is_stream_io (dtp
))
247 const char crlf
[] = "\r\n";
251 /* Write out any padding if needed. */
254 p
= write_block (dtp
, wlen
- len
);
257 memset (p
, ' ', wlen
- len
);
260 /* Scan the source string looking for '\n' and convert it if found. */
261 for (i
= 0; i
< wlen
; i
++)
263 if (source
[i
] == '\n')
265 /* Write out the previously scanned characters in the string. */
268 p
= write_block (dtp
, bytes
);
271 memcpy (p
, &source
[q
], bytes
);
276 /* Write out the CR_LF sequence. */
278 p
= write_block (dtp
, 2);
287 /* Write out any remaining bytes if no LF was found. */
290 p
= write_block (dtp
, bytes
);
293 memcpy (p
, &source
[q
], bytes
);
299 p
= write_block (dtp
, wlen
);
303 if (unlikely (is_char4_unit (dtp
)))
305 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
307 memcpy4 (p4
, source
, wlen
);
310 memset4 (p4
, ' ', wlen
- len
);
311 memcpy4 (p4
+ wlen
- len
, source
, len
);
317 memcpy (p
, source
, wlen
);
320 memset (p
, ' ', wlen
- len
);
321 memcpy (p
+ wlen
- len
, source
, len
);
329 /* The primary difference between write_a_char4 and write_a is that we have to
330 deal with writing from the first byte of the 4-byte character and pay
331 attention to the most significant bytes. For ENCODING="default" write the
332 lowest significant byte. If the 3 most significant bytes contain
333 non-zero values, emit a '?'. For ENCODING="utf-8", convert the UCS-32 value
334 to the UTF-8 encoded string before writing out. */
337 write_a_char4 (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
, int len
)
342 wlen
= f
->u
.string
.length
< 0
343 || (f
->format
== FMT_G
&& f
->u
.string
.length
== 0)
344 ? len
: f
->u
.string
.length
;
346 q
= (gfc_char4_t
*) source
;
348 /* If this is formatted STREAM IO convert any embedded line feed characters
349 to CR_LF on systems that use that sequence for newlines. See F2003
350 Standard sections 10.6.3 and 9.9 for further information. */
351 if (is_stream_io (dtp
))
353 const gfc_char4_t crlf
[] = {0x000d,0x000a};
358 /* Write out any padding if needed. */
362 p
= write_block (dtp
, wlen
- len
);
365 memset (p
, ' ', wlen
- len
);
368 /* Scan the source string looking for '\n' and convert it if found. */
369 qq
= (gfc_char4_t
*) source
;
370 for (i
= 0; i
< wlen
; i
++)
374 /* Write out the previously scanned characters in the string. */
377 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
378 write_utf8_char4 (dtp
, q
, bytes
, 0);
380 write_default_char4 (dtp
, q
, bytes
, 0);
384 /* Write out the CR_LF sequence. */
385 write_default_char4 (dtp
, crlf
, 2, 0);
391 /* Write out any remaining bytes if no LF was found. */
394 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
395 write_utf8_char4 (dtp
, q
, bytes
, 0);
397 write_default_char4 (dtp
, q
, bytes
, 0);
403 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
404 write_utf8_char4 (dtp
, q
, len
, wlen
);
406 write_default_char4 (dtp
, q
, len
, wlen
);
413 static GFC_INTEGER_LARGEST
414 extract_int (const void *p
, int len
)
416 GFC_INTEGER_LARGEST i
= 0;
426 memcpy ((void *) &tmp
, p
, len
);
433 memcpy ((void *) &tmp
, p
, len
);
440 memcpy ((void *) &tmp
, p
, len
);
447 memcpy ((void *) &tmp
, p
, len
);
451 #ifdef HAVE_GFC_INTEGER_16
455 memcpy ((void *) &tmp
, p
, len
);
461 internal_error (NULL
, "bad integer kind");
467 static GFC_UINTEGER_LARGEST
468 extract_uint (const void *p
, int len
)
470 GFC_UINTEGER_LARGEST i
= 0;
480 memcpy ((void *) &tmp
, p
, len
);
481 i
= (GFC_UINTEGER_1
) tmp
;
487 memcpy ((void *) &tmp
, p
, len
);
488 i
= (GFC_UINTEGER_2
) tmp
;
494 memcpy ((void *) &tmp
, p
, len
);
495 i
= (GFC_UINTEGER_4
) tmp
;
501 memcpy ((void *) &tmp
, p
, len
);
502 i
= (GFC_UINTEGER_8
) tmp
;
505 #ifdef HAVE_GFC_INTEGER_16
509 GFC_INTEGER_16 tmp
= 0;
510 memcpy ((void *) &tmp
, p
, len
);
511 i
= (GFC_UINTEGER_16
) tmp
;
516 internal_error (NULL
, "bad integer kind");
524 write_l (st_parameter_dt
*dtp
, const fnode
*f
, char *source
, int len
)
528 GFC_INTEGER_LARGEST n
;
530 wlen
= (f
->format
== FMT_G
&& f
->u
.w
== 0) ? 1 : f
->u
.w
;
532 p
= write_block (dtp
, wlen
);
536 n
= extract_int (source
, len
);
538 if (unlikely (is_char4_unit (dtp
)))
540 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
541 memset4 (p4
, ' ', wlen
-1);
542 p4
[wlen
- 1] = (n
) ? 'T' : 'F';
546 memset (p
, ' ', wlen
-1);
547 p
[wlen
- 1] = (n
) ? 'T' : 'F';
552 write_boz (st_parameter_dt
*dtp
, const fnode
*f
, const char *q
, int n
)
554 int w
, m
, digits
, nzero
, nblank
;
562 if (m
== 0 && n
== 0)
567 p
= write_block (dtp
, w
);
570 if (unlikely (is_char4_unit (dtp
)))
572 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
573 memset4 (p4
, ' ', w
);
582 /* Select a width if none was specified. The idea here is to always
586 w
= ((digits
< m
) ? m
: digits
);
588 p
= write_block (dtp
, w
);
596 /* See if things will work. */
598 nblank
= w
- (nzero
+ digits
);
600 if (unlikely (is_char4_unit (dtp
)))
602 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
605 memset4 (p4
, '*', w
);
609 if (!dtp
->u
.p
.no_leading_blank
)
611 memset4 (p4
, ' ', nblank
);
613 memset4 (p4
, '0', nzero
);
615 memcpy4 (p4
, q
, digits
);
619 memset4 (p4
, '0', nzero
);
621 memcpy4 (p4
, q
, digits
);
623 memset4 (p4
, ' ', nblank
);
624 dtp
->u
.p
.no_leading_blank
= 0;
635 if (!dtp
->u
.p
.no_leading_blank
)
637 memset (p
, ' ', nblank
);
639 memset (p
, '0', nzero
);
641 memcpy (p
, q
, digits
);
645 memset (p
, '0', nzero
);
647 memcpy (p
, q
, digits
);
649 memset (p
, ' ', nblank
);
650 dtp
->u
.p
.no_leading_blank
= 0;
658 write_decimal (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
,
660 const char *(*conv
) (GFC_INTEGER_LARGEST
, char *, size_t))
662 GFC_INTEGER_LARGEST n
= 0;
663 int w
, m
, digits
, nsign
, nzero
, nblank
;
667 char itoa_buf
[GFC_BTOA_BUF_SIZE
];
670 m
= f
->format
== FMT_G
? -1 : f
->u
.integer
.m
;
672 n
= extract_int (source
, len
);
675 if (m
== 0 && n
== 0)
680 p
= write_block (dtp
, w
);
683 if (unlikely (is_char4_unit (dtp
)))
685 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
686 memset4 (p4
, ' ', w
);
693 sign
= calculate_sign (dtp
, n
< 0);
696 nsign
= sign
== S_NONE
? 0 : 1;
698 /* conv calls itoa which sets the negative sign needed
699 by write_integer. The sign '+' or '-' is set below based on sign
700 calculated above, so we just point past the sign in the string
701 before proceeding to avoid double signs in corner cases.
703 q
= conv (n
, itoa_buf
, sizeof (itoa_buf
));
709 /* Select a width if none was specified. The idea here is to always
713 w
= ((digits
< m
) ? m
: digits
) + nsign
;
715 p
= write_block (dtp
, w
);
723 /* See if things will work. */
725 nblank
= w
- (nsign
+ nzero
+ digits
);
727 if (unlikely (is_char4_unit (dtp
)))
729 gfc_char4_t
* p4
= (gfc_char4_t
*) p
;
732 memset4 (p4
, '*', w
);
736 memset4 (p4
, ' ', nblank
);
751 memset4 (p4
, '0', nzero
);
754 memcpy4 (p4
, q
, digits
);
764 memset (p
, ' ', nblank
);
779 memset (p
, '0', nzero
);
782 memcpy (p
, q
, digits
);
789 /* Convert unsigned octal to ascii. */
792 otoa (GFC_UINTEGER_LARGEST n
, char *buffer
, size_t len
)
796 assert (len
>= GFC_OTOA_BUF_SIZE
);
801 p
= buffer
+ GFC_OTOA_BUF_SIZE
- 1;
806 *--p
= '0' + (n
& 7);
814 /* Convert unsigned binary to ascii. */
817 btoa (GFC_UINTEGER_LARGEST n
, char *buffer
, size_t len
)
821 assert (len
>= GFC_BTOA_BUF_SIZE
);
826 p
= buffer
+ GFC_BTOA_BUF_SIZE
- 1;
831 *--p
= '0' + (n
& 1);
838 /* The following three functions, btoa_big, otoa_big, and ztoa_big, are needed
839 to convert large reals with kind sizes that exceed the largest integer type
840 available on certain platforms. In these cases, byte by byte conversion is
841 performed. Endianess is taken into account. */
843 /* Conversion to binary. */
846 btoa_big (const char *s
, char *buffer
, int len
, GFC_UINTEGER_LARGEST
*n
)
855 for (i
= 0; i
< len
; i
++)
859 /* Test for zero. Needed by write_boz later. */
863 for (j
= 0; j
< 8; j
++)
865 *q
++ = (c
& 128) ? '1' : '0';
873 const char *p
= s
+ len
- 1;
874 for (i
= 0; i
< len
; i
++)
878 /* Test for zero. Needed by write_boz later. */
882 for (j
= 0; j
< 8; j
++)
884 *q
++ = (c
& 128) ? '1' : '0';
896 /* Move past any leading zeros. */
897 while (*buffer
== '0')
904 /* Conversion to octal. */
907 otoa_big (const char *s
, char *buffer
, int len
, GFC_UINTEGER_LARGEST
*n
)
913 q
= buffer
+ GFC_OTOA_BUF_SIZE
- 1;
919 const char *p
= s
+ len
- 1;
923 /* Test for zero. Needed by write_boz later. */
927 for (j
= 0; j
< 3 && i
< len
; j
++)
929 octet
|= (c
& 1) << j
;
948 /* Test for zero. Needed by write_boz later. */
952 for (j
= 0; j
< 3 && i
< len
; j
++)
954 octet
|= (c
& 1) << j
;
971 /* Move past any leading zeros. */
978 /* Conversion to hexidecimal. */
981 ztoa_big (const char *s
, char *buffer
, int len
, GFC_UINTEGER_LARGEST
*n
)
983 static char a
[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
984 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
995 for (i
= 0; i
< len
; i
++)
997 /* Test for zero. Needed by write_boz later. */
1001 h
= (*p
>> 4) & 0x0F;
1009 const char *p
= s
+ len
- 1;
1010 for (i
= 0; i
< len
; i
++)
1012 /* Test for zero. Needed by write_boz later. */
1016 h
= (*p
>> 4) & 0x0F;
1028 /* Move past any leading zeros. */
1029 while (*buffer
== '0')
1035 /* gfc_itoa()-- Integer to decimal conversion.
1036 The itoa function is a widespread non-standard extension to standard
1037 C, often declared in <stdlib.h>. Even though the itoa defined here
1038 is a static function we take care not to conflict with any prior
1039 non-static declaration. Hence the 'gfc_' prefix, which is normally
1040 reserved for functions with external linkage. */
1043 gfc_itoa (GFC_INTEGER_LARGEST n
, char *buffer
, size_t len
)
1047 GFC_UINTEGER_LARGEST t
;
1049 assert (len
>= GFC_ITOA_BUF_SIZE
);
1059 t
= -n
; /*must use unsigned to protect from overflow*/
1062 p
= buffer
+ GFC_ITOA_BUF_SIZE
- 1;
1067 *--p
= '0' + (t
% 10);
1078 write_i (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1080 write_decimal (dtp
, f
, p
, len
, (void *) gfc_itoa
);
1085 write_b (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
, int len
)
1088 char itoa_buf
[GFC_BTOA_BUF_SIZE
];
1089 GFC_UINTEGER_LARGEST n
= 0;
1091 if (len
> (int) sizeof (GFC_UINTEGER_LARGEST
))
1093 p
= btoa_big (source
, itoa_buf
, len
, &n
);
1094 write_boz (dtp
, f
, p
, n
);
1098 n
= extract_uint (source
, len
);
1099 p
= btoa (n
, itoa_buf
, sizeof (itoa_buf
));
1100 write_boz (dtp
, f
, p
, n
);
1106 write_o (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
, int len
)
1109 char itoa_buf
[GFC_OTOA_BUF_SIZE
];
1110 GFC_UINTEGER_LARGEST n
= 0;
1112 if (len
> (int) sizeof (GFC_UINTEGER_LARGEST
))
1114 p
= otoa_big (source
, itoa_buf
, len
, &n
);
1115 write_boz (dtp
, f
, p
, n
);
1119 n
= extract_uint (source
, len
);
1120 p
= otoa (n
, itoa_buf
, sizeof (itoa_buf
));
1121 write_boz (dtp
, f
, p
, n
);
1126 write_z (st_parameter_dt
*dtp
, const fnode
*f
, const char *source
, int len
)
1129 char itoa_buf
[GFC_XTOA_BUF_SIZE
];
1130 GFC_UINTEGER_LARGEST n
= 0;
1132 if (len
> (int) sizeof (GFC_UINTEGER_LARGEST
))
1134 p
= ztoa_big (source
, itoa_buf
, len
, &n
);
1135 write_boz (dtp
, f
, p
, n
);
1139 n
= extract_uint (source
, len
);
1140 p
= gfc_xtoa (n
, itoa_buf
, sizeof (itoa_buf
));
1141 write_boz (dtp
, f
, p
, n
);
1147 write_d (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1149 write_float (dtp
, f
, p
, len
, 0);
1154 write_e (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1156 write_float (dtp
, f
, p
, len
, 0);
1161 write_f (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1163 write_float (dtp
, f
, p
, len
, 0);
1168 write_en (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1170 write_float (dtp
, f
, p
, len
, 0);
1175 write_es (st_parameter_dt
*dtp
, const fnode
*f
, const char *p
, int len
)
1177 write_float (dtp
, f
, p
, len
, 0);
1181 /* Take care of the X/TR descriptor. */
1184 write_x (st_parameter_dt
*dtp
, int len
, int nspaces
)
1188 p
= write_block (dtp
, len
);
1191 if (nspaces
> 0 && len
- nspaces
>= 0)
1193 if (unlikely (is_char4_unit (dtp
)))
1195 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1196 memset4 (&p4
[len
- nspaces
], ' ', nspaces
);
1199 memset (&p
[len
- nspaces
], ' ', nspaces
);
1204 /* List-directed writing. */
1207 /* Write a single character to the output. Returns nonzero if
1208 something goes wrong. */
1211 write_char (st_parameter_dt
*dtp
, int c
)
1215 p
= write_block (dtp
, 1);
1218 if (unlikely (is_char4_unit (dtp
)))
1220 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1231 /* Write a list-directed logical value. */
1234 write_logical (st_parameter_dt
*dtp
, const char *source
, int length
)
1236 write_char (dtp
, extract_int (source
, length
) ? 'T' : 'F');
1240 /* Write a list-directed integer value. */
1243 write_integer (st_parameter_dt
*dtp
, const char *source
, int length
)
1249 char itoa_buf
[GFC_ITOA_BUF_SIZE
];
1251 q
= gfc_itoa (extract_int (source
, length
), itoa_buf
, sizeof (itoa_buf
));
1276 digits
= strlen (q
);
1280 p
= write_block (dtp
, width
);
1284 if (unlikely (is_char4_unit (dtp
)))
1286 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1287 if (dtp
->u
.p
.no_leading_blank
)
1289 memcpy4 (p4
, q
, digits
);
1290 memset4 (p4
+ digits
, ' ', width
- digits
);
1294 memset4 (p4
, ' ', width
- digits
);
1295 memcpy4 (p4
+ width
- digits
, q
, digits
);
1300 if (dtp
->u
.p
.no_leading_blank
)
1302 memcpy (p
, q
, digits
);
1303 memset (p
+ digits
, ' ', width
- digits
);
1307 memset (p
, ' ', width
- digits
);
1308 memcpy (p
+ width
- digits
, q
, digits
);
1313 /* Write a list-directed string. We have to worry about delimiting
1314 the strings if the file has been opened in that mode. */
1317 write_character (st_parameter_dt
*dtp
, const char *source
, int kind
, int length
)
1322 switch (dtp
->u
.p
.current_unit
->delim_status
)
1324 case DELIM_APOSTROPHE
:
1343 for (i
= 0; i
< length
; i
++)
1348 p
= write_block (dtp
, length
+ extra
);
1352 if (unlikely (is_char4_unit (dtp
)))
1354 gfc_char4_t d4
= (gfc_char4_t
) d
;
1355 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1358 memcpy4 (p4
, source
, length
);
1363 for (i
= 0; i
< length
; i
++)
1365 *p4
++ = (gfc_char4_t
) source
[i
];
1376 memcpy (p
, source
, length
);
1381 for (i
= 0; i
< length
; i
++)
1395 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
1396 write_utf8_char4 (dtp
, (gfc_char4_t
*) source
, length
, 0);
1398 write_default_char4 (dtp
, (gfc_char4_t
*) source
, length
, 0);
1402 p
= write_block (dtp
, 1);
1405 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
1406 write_utf8_char4 (dtp
, (gfc_char4_t
*) source
, length
, 0);
1408 write_default_char4 (dtp
, (gfc_char4_t
*) source
, length
, 0);
1410 p
= write_block (dtp
, 1);
1417 /* Set an fnode to default format. */
1420 set_fnode_default (st_parameter_dt
*dtp
, fnode
*f
, int length
)
1446 internal_error (&dtp
->common
, "bad real kind");
1451 /* Output a real number with default format. To guarantee that a
1452 binary -> decimal -> binary roundtrip conversion recovers the
1453 original value, IEEE 754-2008 requires 9, 17, 21 and 36 significant
1454 digits for REAL kinds 4, 8, 10, and 16, respectively. Thus, we use
1455 1PG16.9E2 for REAL(4), 1PG25.17E3 for REAL(8), 1PG30.21E4 for
1456 REAL(10) and 1PG45.36E4 for REAL(16). The exception is that the
1457 Fortran standard requires outputting an extra digit when the scale
1458 factor is 1 and when the magnitude of the value is such that E
1459 editing is used. However, gfortran compensates for this, and thus
1460 for list formatted the same number of significant digits is
1461 generated both when using F and E editing. */
1464 write_real (st_parameter_dt
*dtp
, const char *source
, int length
)
1467 int org_scale
= dtp
->u
.p
.scale_factor
;
1468 dtp
->u
.p
.scale_factor
= 1;
1469 set_fnode_default (dtp
, &f
, length
);
1470 write_float (dtp
, &f
, source
, length
, 1);
1471 dtp
->u
.p
.scale_factor
= org_scale
;
1474 /* Similar to list formatted REAL output, for kPG0 where k > 0 we
1475 compensate for the extra digit. */
1478 write_real_g0 (st_parameter_dt
*dtp
, const char *source
, int length
, int d
)
1482 set_fnode_default (dtp
, &f
, length
);
1486 /* Compensate for extra digits when using scale factor, d is not
1487 specified, and the magnitude is such that E editing is used. */
1488 if (dtp
->u
.p
.scale_factor
> 0 && d
== 0)
1492 dtp
->u
.p
.g0_no_blanks
= 1;
1493 write_float (dtp
, &f
, source
, length
, comp_d
);
1494 dtp
->u
.p
.g0_no_blanks
= 0;
1499 write_complex (st_parameter_dt
*dtp
, const char *source
, int kind
, size_t size
)
1502 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_POINT
? ',' : ';';
1504 if (write_char (dtp
, '('))
1506 write_real (dtp
, source
, kind
);
1508 if (write_char (dtp
, semi_comma
))
1510 write_real (dtp
, source
+ size
/ 2, kind
);
1512 write_char (dtp
, ')');
1516 /* Write the separator between items. */
1519 write_separator (st_parameter_dt
*dtp
)
1523 p
= write_block (dtp
, options
.separator_len
);
1526 if (unlikely (is_char4_unit (dtp
)))
1528 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1529 memcpy4 (p4
, options
.separator
, options
.separator_len
);
1532 memcpy (p
, options
.separator
, options
.separator_len
);
1536 /* Write an item with list formatting.
1537 TODO: handle skipping to the next record correctly, particularly
1541 list_formatted_write_scalar (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1544 if (dtp
->u
.p
.current_unit
== NULL
)
1547 if (dtp
->u
.p
.first_item
)
1549 dtp
->u
.p
.first_item
= 0;
1550 write_char (dtp
, ' ');
1554 if (type
!= BT_CHARACTER
|| !dtp
->u
.p
.char_flag
||
1555 dtp
->u
.p
.current_unit
->delim_status
!= DELIM_NONE
)
1556 write_separator (dtp
);
1562 write_integer (dtp
, p
, kind
);
1565 write_logical (dtp
, p
, kind
);
1568 write_character (dtp
, p
, kind
, size
);
1571 write_real (dtp
, p
, kind
);
1574 write_complex (dtp
, p
, kind
, size
);
1577 internal_error (&dtp
->common
, "list_formatted_write(): Bad type");
1580 dtp
->u
.p
.char_flag
= (type
== BT_CHARACTER
);
1585 list_formatted_write (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1586 size_t size
, size_t nelems
)
1590 size_t stride
= type
== BT_CHARACTER
?
1591 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
1595 /* Big loop over all the elements. */
1596 for (elem
= 0; elem
< nelems
; elem
++)
1598 dtp
->u
.p
.item_count
++;
1599 list_formatted_write_scalar (dtp
, type
, tmp
+ elem
* stride
, kind
, size
);
1605 nml_write_obj writes a namelist object to the output stream. It is called
1606 recursively for derived type components:
1607 obj = is the namelist_info for the current object.
1608 offset = the offset relative to the address held by the object for
1609 derived type arrays.
1610 base = is the namelist_info of the derived type, when obj is a
1612 base_name = the full name for a derived type, including qualifiers
1614 The returned value is a pointer to the object beyond the last one
1615 accessed, including nested derived types. Notice that the namelist is
1616 a linear linked list of objects, including derived types and their
1617 components. A tree, of sorts, is implied by the compound names of
1618 the derived type components and this is how this function recurses through
1621 /* A generous estimate of the number of characters needed to print
1622 repeat counts and indices, including commas, asterices and brackets. */
1624 #define NML_DIGITS 20
1627 namelist_write_newline (st_parameter_dt
*dtp
)
1629 if (!is_internal_unit (dtp
))
1632 write_character (dtp
, "\r\n", 1, 2);
1634 write_character (dtp
, "\n", 1, 1);
1639 if (is_array_io (dtp
))
1644 int length
= dtp
->u
.p
.current_unit
->bytes_left
;
1646 p
= write_block (dtp
, length
);
1650 if (unlikely (is_char4_unit (dtp
)))
1652 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
1653 memset4 (p4
, ' ', length
);
1656 memset (p
, ' ', length
);
1658 /* Now that the current record has been padded out,
1659 determine where the next record in the array is. */
1660 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
1663 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
1666 /* Now seek to this record */
1667 record
= record
* dtp
->u
.p
.current_unit
->recl
;
1669 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
1671 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
1675 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
1679 write_character (dtp
, " ", 1, 1);
1683 static namelist_info
*
1684 nml_write_obj (st_parameter_dt
*dtp
, namelist_info
* obj
, index_type offset
,
1685 namelist_info
* base
, char * base_name
)
1691 index_type obj_size
;
1695 index_type elem_ctr
;
1696 size_t obj_name_len
;
1701 size_t ext_name_len
;
1702 char rep_buff
[NML_DIGITS
];
1703 namelist_info
* cmp
;
1704 namelist_info
* retval
= obj
->next
;
1705 size_t base_name_len
;
1706 size_t base_var_name_len
;
1708 unit_delim tmp_delim
;
1710 /* Set the character to be used to separate values
1711 to a comma or semi-colon. */
1714 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_POINT
? ',' : ';';
1716 /* Write namelist variable names in upper case. If a derived type,
1717 nothing is output. If a component, base and base_name are set. */
1719 if (obj
->type
!= BT_DERIVED
)
1721 namelist_write_newline (dtp
);
1722 write_character (dtp
, " ", 1, 1);
1727 len
= strlen (base
->var_name
);
1728 base_name_len
= strlen (base_name
);
1729 for (dim_i
= 0; dim_i
< base_name_len
; dim_i
++)
1731 cup
= toupper ((int) base_name
[dim_i
]);
1732 write_character (dtp
, &cup
, 1, 1);
1735 clen
= strlen (obj
->var_name
);
1736 for (dim_i
= len
; dim_i
< clen
; dim_i
++)
1738 cup
= toupper ((int) obj
->var_name
[dim_i
]);
1739 write_character (dtp
, &cup
, 1, 1);
1741 write_character (dtp
, "=", 1, 1);
1744 /* Counts the number of data output on a line, including names. */
1754 obj_size
= size_from_real_kind (len
);
1758 obj_size
= size_from_complex_kind (len
);
1762 obj_size
= obj
->string_length
;
1770 obj_size
= obj
->size
;
1772 /* Set the index vector and count the number of elements. */
1775 for (dim_i
= 0; dim_i
< (size_t) obj
->var_rank
; dim_i
++)
1777 obj
->ls
[dim_i
].idx
= GFC_DESCRIPTOR_LBOUND(obj
, dim_i
);
1778 nelem
= nelem
* GFC_DESCRIPTOR_EXTENT (obj
, dim_i
);
1781 /* Main loop to output the data held in the object. */
1784 for (elem_ctr
= 0; elem_ctr
< nelem
; elem_ctr
++)
1787 /* Build the pointer to the data value. The offset is passed by
1788 recursive calls to this function for arrays of derived types.
1789 Is NULL otherwise. */
1791 p
= (void *)(obj
->mem_pos
+ elem_ctr
* obj_size
);
1794 /* Check for repeat counts of intrinsic types. */
1796 if ((elem_ctr
< (nelem
- 1)) &&
1797 (obj
->type
!= BT_DERIVED
) &&
1798 !memcmp (p
, (void*)(p
+ obj_size
), obj_size
))
1803 /* Execute a repeated output. Note the flag no_leading_blank that
1804 is used in the functions used to output the intrinsic types. */
1810 snprintf(rep_buff
, NML_DIGITS
, " %d*", rep_ctr
);
1811 write_character (dtp
, rep_buff
, 1, strlen (rep_buff
));
1812 dtp
->u
.p
.no_leading_blank
= 1;
1816 /* Output the data, if an intrinsic type, or recurse into this
1817 routine to treat derived types. */
1823 write_integer (dtp
, p
, len
);
1827 write_logical (dtp
, p
, len
);
1831 tmp_delim
= dtp
->u
.p
.current_unit
->delim_status
;
1832 if (dtp
->u
.p
.nml_delim
== '"')
1833 dtp
->u
.p
.current_unit
->delim_status
= DELIM_QUOTE
;
1834 if (dtp
->u
.p
.nml_delim
== '\'')
1835 dtp
->u
.p
.current_unit
->delim_status
= DELIM_APOSTROPHE
;
1836 write_character (dtp
, p
, 1, obj
->string_length
);
1837 dtp
->u
.p
.current_unit
->delim_status
= tmp_delim
;
1841 write_real (dtp
, p
, len
);
1845 dtp
->u
.p
.no_leading_blank
= 0;
1847 write_complex (dtp
, p
, len
, obj_size
);
1852 /* To treat a derived type, we need to build two strings:
1853 ext_name = the name, including qualifiers that prepends
1854 component names in the output - passed to
1856 obj_name = the derived type name with no qualifiers but %
1857 appended. This is used to identify the
1860 /* First ext_name => get length of all possible components */
1862 base_name_len
= base_name
? strlen (base_name
) : 0;
1863 base_var_name_len
= base
? strlen (base
->var_name
) : 0;
1864 ext_name_len
= base_name_len
+ base_var_name_len
1865 + strlen (obj
->var_name
) + obj
->var_rank
* NML_DIGITS
+ 1;
1866 ext_name
= (char*)xmalloc (ext_name_len
);
1868 memcpy (ext_name
, base_name
, base_name_len
);
1869 clen
= strlen (obj
->var_name
+ base_var_name_len
);
1870 memcpy (ext_name
+ base_name_len
,
1871 obj
->var_name
+ base_var_name_len
, clen
);
1873 /* Append the qualifier. */
1875 tot_len
= base_name_len
+ clen
;
1876 for (dim_i
= 0; dim_i
< (size_t) obj
->var_rank
; dim_i
++)
1880 ext_name
[tot_len
] = '(';
1883 snprintf (ext_name
+ tot_len
, ext_name_len
- tot_len
, "%d",
1884 (int) obj
->ls
[dim_i
].idx
);
1885 tot_len
+= strlen (ext_name
+ tot_len
);
1886 ext_name
[tot_len
] = ((int) dim_i
== obj
->var_rank
- 1) ? ')' : ',';
1890 ext_name
[tot_len
] = '\0';
1894 obj_name_len
= strlen (obj
->var_name
) + 1;
1895 obj_name
= xmalloc (obj_name_len
+1);
1896 memcpy (obj_name
, obj
->var_name
, obj_name_len
-1);
1897 memcpy (obj_name
+ obj_name_len
-1, "%", 2);
1899 /* Now loop over the components. Update the component pointer
1900 with the return value from nml_write_obj => this loop jumps
1901 past nested derived types. */
1903 for (cmp
= obj
->next
;
1904 cmp
&& !strncmp (cmp
->var_name
, obj_name
, obj_name_len
);
1907 retval
= nml_write_obj (dtp
, cmp
,
1908 (index_type
)(p
- obj
->mem_pos
),
1917 internal_error (&dtp
->common
, "Bad type for namelist write");
1920 /* Reset the leading blank suppression, write a comma (or semi-colon)
1921 and, if 5 values have been output, write a newline and advance
1922 to column 2. Reset the repeat counter. */
1924 dtp
->u
.p
.no_leading_blank
= 0;
1925 write_character (dtp
, &semi_comma
, 1, 1);
1929 namelist_write_newline (dtp
);
1930 write_character (dtp
, " ", 1, 1);
1935 /* Cycle through and increment the index vector. */
1940 for (dim_i
= 0; nml_carry
&& (dim_i
< (size_t) obj
->var_rank
); dim_i
++)
1942 obj
->ls
[dim_i
].idx
+= nml_carry
;
1944 if (obj
->ls
[dim_i
].idx
> GFC_DESCRIPTOR_UBOUND(obj
,dim_i
))
1946 obj
->ls
[dim_i
].idx
= GFC_DESCRIPTOR_LBOUND(obj
,dim_i
);
1952 /* Return a pointer beyond the furthest object accessed. */
1958 /* This is the entry function for namelist writes. It outputs the name
1959 of the namelist and iterates through the namelist by calls to
1960 nml_write_obj. The call below has dummys in the arguments used in
1961 the treatment of derived types. */
1964 namelist_write (st_parameter_dt
*dtp
)
1966 namelist_info
* t1
, *t2
, *dummy
= NULL
;
1968 index_type dummy_offset
= 0;
1970 char * dummy_name
= NULL
;
1971 unit_delim tmp_delim
= DELIM_UNSPECIFIED
;
1973 /* Set the delimiter for namelist output. */
1974 tmp_delim
= dtp
->u
.p
.current_unit
->delim_status
;
1976 dtp
->u
.p
.nml_delim
= tmp_delim
== DELIM_APOSTROPHE
? '\'' : '"';
1978 /* Temporarily disable namelist delimters. */
1979 dtp
->u
.p
.current_unit
->delim_status
= DELIM_NONE
;
1981 write_character (dtp
, "&", 1, 1);
1983 /* Write namelist name in upper case - f95 std. */
1984 for (i
= 0 ;i
< dtp
->namelist_name_len
;i
++ )
1986 c
= toupper ((int) dtp
->namelist_name
[i
]);
1987 write_character (dtp
, &c
, 1 ,1);
1990 if (dtp
->u
.p
.ionml
!= NULL
)
1992 t1
= dtp
->u
.p
.ionml
;
1996 t1
= nml_write_obj (dtp
, t2
, dummy_offset
, dummy
, dummy_name
);
2000 namelist_write_newline (dtp
);
2001 write_character (dtp
, " /", 1, 2);
2002 /* Restore the original delimiter. */
2003 dtp
->u
.p
.current_unit
->delim_status
= tmp_delim
;