]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgfortran/io/format.c
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
2 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran 95 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 2, or (at your option)
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
22 Libgfortran is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with Libgfortran; see the file COPYING. If not, write to
29 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
30 Boston, MA 02110-1301, USA. */
33 /* format.c-- parse a FORMAT string into a binary format suitable for
34 * interpretation during I/O statements */
40 #define FARRAY_SIZE 64
42 typedef struct fnode_array
44 struct fnode_array
*next
;
45 fnode array
[FARRAY_SIZE
];
49 typedef struct format_data
51 char *format_string
, *string
;
53 format_token saved_token
;
54 int value
, format_string_len
, reversion_ok
;
56 const fnode
*saved_format
;
62 static const fnode colon_node
= { FMT_COLON
, 0, NULL
, NULL
, {{ 0, 0, 0 }}, 0,
67 static const char posint_required
[] = "Positive width required in format",
68 period_required
[] = "Period required in format",
69 nonneg_required
[] = "Nonnegative width required in format",
70 unexpected_element
[] = "Unexpected element in format",
71 unexpected_end
[] = "Unexpected end of format string",
72 bad_string
[] = "Unterminated character constant in format",
73 bad_hollerith
[] = "Hollerith constant extends past the end of the format",
74 reversion_error
[] = "Exhausted data descriptors in format",
75 zero_width
[] = "Zero width in format descriptor";
77 /* next_char()-- Return the next character in the format string.
78 * Returns -1 when the string is done. If the literal flag is set,
79 * spaces are significant, otherwise they are not. */
82 next_char (format_data
*fmt
, int literal
)
88 if (fmt
->format_string_len
== 0)
91 fmt
->format_string_len
--;
92 c
= toupper (*fmt
->format_string
++);
94 while ((c
== ' ' || c
== '\t') && !literal
);
100 /* unget_char()-- Back up one character position. */
102 #define unget_char(fmt) \
103 { fmt->format_string--; fmt->format_string_len++; }
106 /* get_fnode()-- Allocate a new format node, inserting it into the
107 * current singly linked list. These are initially allocated from the
111 get_fnode (format_data
*fmt
, fnode
**head
, fnode
**tail
, format_token t
)
115 if (fmt
->avail
== &fmt
->last
->array
[FARRAY_SIZE
])
117 fmt
->last
->next
= get_mem (sizeof (fnode_array
));
118 fmt
->last
= fmt
->last
->next
;
119 fmt
->last
->next
= NULL
;
120 fmt
->avail
= &fmt
->last
->array
[0];
123 memset (f
, '\0', sizeof (fnode
));
135 f
->source
= fmt
->format_string
;
140 /* free_format_data()-- Free all allocated format data. */
143 free_format_data (st_parameter_dt
*dtp
)
145 fnode_array
*fa
, *fa_next
;
146 format_data
*fmt
= dtp
->u
.p
.fmt
;
151 for (fa
= fmt
->array
.next
; fa
; fa
= fa_next
)
162 /* format_lex()-- Simple lexical analyzer for getting the next token
163 * in a FORMAT string. We support a one-level token pushback in the
164 * fmt->saved_token variable. */
167 format_lex (format_data
*fmt
)
174 if (fmt
->saved_token
!= FMT_NONE
)
176 token
= fmt
->saved_token
;
177 fmt
->saved_token
= FMT_NONE
;
182 c
= next_char (fmt
, 0);
191 c
= next_char (fmt
, 0);
198 fmt
->value
= c
- '0';
202 c
= next_char (fmt
, 0);
206 fmt
->value
= 10 * fmt
->value
+ c
- '0';
212 fmt
->value
= -fmt
->value
;
213 token
= FMT_SIGNED_INT
;
226 fmt
->value
= c
- '0';
230 c
= next_char (fmt
, 0);
234 fmt
->value
= 10 * fmt
->value
+ c
- '0';
238 token
= (fmt
->value
== 0) ? FMT_ZERO
: FMT_POSINT
;
262 switch (next_char (fmt
, 0))
291 switch (next_char (fmt
, 0))
308 switch (next_char (fmt
, 0))
328 fmt
->string
= fmt
->format_string
;
329 fmt
->value
= 0; /* This is the length of the string */
333 c
= next_char (fmt
, 1);
336 token
= FMT_BADSTRING
;
337 fmt
->error
= bad_string
;
343 c
= next_char (fmt
, 1);
347 token
= FMT_BADSTRING
;
348 fmt
->error
= bad_string
;
386 switch (next_char (fmt
, 0))
418 switch (next_char (fmt
, 0))
446 /* parse_format_list()-- Parse a format list. Assumes that a left
447 * paren has already been seen. Returns a list representing the
448 * parenthesis node which contains the rest of the list. */
451 parse_format_list (st_parameter_dt
*dtp
)
454 format_token t
, u
, t2
;
456 format_data
*fmt
= dtp
->u
.p
.fmt
;
460 /* Get the next format item */
462 t
= format_lex (fmt
);
469 t
= format_lex (fmt
);
473 get_fnode (fmt
, &head
, &tail
, FMT_LPAREN
);
474 tail
->repeat
= repeat
;
475 tail
->u
.child
= parse_format_list (dtp
);
476 if (fmt
->error
!= NULL
)
482 get_fnode (fmt
, &head
, &tail
, FMT_SLASH
);
483 tail
->repeat
= repeat
;
487 get_fnode (fmt
, &head
, &tail
, FMT_X
);
489 tail
->u
.k
= fmt
->value
;
500 get_fnode (fmt
, &head
, &tail
, FMT_LPAREN
);
502 tail
->u
.child
= parse_format_list (dtp
);
503 if (fmt
->error
!= NULL
)
508 case FMT_SIGNED_INT
: /* Signed integer can only precede a P format. */
509 case FMT_ZERO
: /* Same for zero. */
510 t
= format_lex (fmt
);
513 fmt
->error
= "Expected P edit descriptor in format";
518 get_fnode (fmt
, &head
, &tail
, FMT_P
);
519 tail
->u
.k
= fmt
->value
;
522 t
= format_lex (fmt
);
523 if (t
== FMT_F
|| t
== FMT_EN
|| t
== FMT_ES
|| t
== FMT_D
524 || t
== FMT_G
|| t
== FMT_E
)
530 fmt
->saved_token
= t
;
533 case FMT_P
: /* P and X require a prior number */
534 fmt
->error
= "P descriptor requires leading scale factor";
541 If we would be pedantic in the library, we would have to reject
542 an X descriptor without an integer prefix:
544 fmt->error = "X descriptor requires leading space count";
547 However, this is an extension supported by many Fortran compilers,
548 including Cray, HP, AIX, and IRIX. Therefore, we allow it in the
549 runtime library, and make the front end reject it if the compiler
550 is in pedantic mode. The interpretation of 'X' is '1X'.
552 get_fnode (fmt
, &head
, &tail
, FMT_X
);
558 get_fnode (fmt
, &head
, &tail
, FMT_STRING
);
560 tail
->u
.string
.p
= fmt
->string
;
561 tail
->u
.string
.length
= fmt
->value
;
567 notify_std (&dtp
->common
, GFC_STD_F2003
, "Fortran 2003: DC or DP "
568 "descriptor not allowed");
575 get_fnode (fmt
, &head
, &tail
, t
);
580 get_fnode (fmt
, &head
, &tail
, FMT_COLON
);
585 get_fnode (fmt
, &head
, &tail
, FMT_SLASH
);
591 get_fnode (fmt
, &head
, &tail
, FMT_DOLLAR
);
593 notify_std (&dtp
->common
, GFC_STD_GNU
, "Extension: $ descriptor");
600 t2
= format_lex (fmt
);
601 if (t2
!= FMT_POSINT
)
603 fmt
->error
= posint_required
;
606 get_fnode (fmt
, &head
, &tail
, t
);
607 tail
->u
.n
= fmt
->value
;
627 get_fnode (fmt
, &head
, &tail
, FMT_STRING
);
629 if (fmt
->format_string_len
< 1)
631 fmt
->error
= bad_hollerith
;
635 tail
->u
.string
.p
= fmt
->format_string
;
636 tail
->u
.string
.length
= 1;
639 fmt
->format_string
++;
640 fmt
->format_string_len
--;
645 fmt
->error
= unexpected_end
;
655 fmt
->error
= unexpected_element
;
659 /* In this state, t must currently be a data descriptor. Deal with
660 things that can/must follow the descriptor */
665 t
= format_lex (fmt
);
668 fmt
->error
= "Repeat count cannot follow P descriptor";
672 fmt
->saved_token
= t
;
673 get_fnode (fmt
, &head
, &tail
, FMT_P
);
678 t
= format_lex (fmt
);
681 if (notification_std(GFC_STD_GNU
) == ERROR
)
683 fmt
->error
= posint_required
;
688 fmt
->saved_token
= t
;
689 fmt
->value
= 1; /* Default width */
690 notify_std (&dtp
->common
, GFC_STD_GNU
, posint_required
);
694 get_fnode (fmt
, &head
, &tail
, FMT_L
);
695 tail
->u
.n
= fmt
->value
;
696 tail
->repeat
= repeat
;
700 t
= format_lex (fmt
);
703 fmt
->error
= zero_width
;
709 fmt
->saved_token
= t
;
710 fmt
->value
= -1; /* Width not present */
713 get_fnode (fmt
, &head
, &tail
, FMT_A
);
714 tail
->repeat
= repeat
;
715 tail
->u
.n
= fmt
->value
;
724 get_fnode (fmt
, &head
, &tail
, t
);
725 tail
->repeat
= repeat
;
727 u
= format_lex (fmt
);
728 if (t
== FMT_G
&& u
== FMT_ZERO
)
730 if (notification_std (GFC_STD_F2008
) == ERROR
731 || dtp
->u
.p
.mode
== READING
)
733 fmt
->error
= zero_width
;
739 if (t
== FMT_F
|| dtp
->u
.p
.mode
== WRITING
)
741 if (u
!= FMT_POSINT
&& u
!= FMT_ZERO
)
743 fmt
->error
= nonneg_required
;
751 fmt
->error
= posint_required
;
756 tail
->u
.real
.w
= fmt
->value
;
758 t
= format_lex (fmt
);
761 /* We treat a missing decimal descriptor as 0. Note: This is only
762 allowed if -std=legacy, otherwise an error occurs. */
763 if (compile_options
.warn_std
!= 0)
765 fmt
->error
= period_required
;
768 fmt
->saved_token
= t
;
773 t
= format_lex (fmt
);
774 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
776 fmt
->error
= nonneg_required
;
780 tail
->u
.real
.d
= fmt
->value
;
782 if (t
== FMT_D
|| t
== FMT_F
)
787 /* Look for optional exponent */
788 t
= format_lex (fmt
);
790 fmt
->saved_token
= t
;
793 t
= format_lex (fmt
);
796 fmt
->error
= "Positive exponent width required in format";
800 tail
->u
.real
.e
= fmt
->value
;
806 if (repeat
> fmt
->format_string_len
)
808 fmt
->error
= bad_hollerith
;
812 get_fnode (fmt
, &head
, &tail
, FMT_STRING
);
814 tail
->u
.string
.p
= fmt
->format_string
;
815 tail
->u
.string
.length
= repeat
;
818 fmt
->format_string
+= fmt
->value
;
819 fmt
->format_string_len
-= repeat
;
827 get_fnode (fmt
, &head
, &tail
, t
);
828 tail
->repeat
= repeat
;
830 t
= format_lex (fmt
);
832 if (dtp
->u
.p
.mode
== READING
)
836 fmt
->error
= posint_required
;
842 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
844 fmt
->error
= nonneg_required
;
849 tail
->u
.integer
.w
= fmt
->value
;
850 tail
->u
.integer
.m
= -1;
852 t
= format_lex (fmt
);
855 fmt
->saved_token
= t
;
859 t
= format_lex (fmt
);
860 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
862 fmt
->error
= nonneg_required
;
866 tail
->u
.integer
.m
= fmt
->value
;
869 if (tail
->u
.integer
.w
!= 0 && tail
->u
.integer
.m
> tail
->u
.integer
.w
)
871 fmt
->error
= "Minimum digits exceeds field width";
878 fmt
->error
= unexpected_element
;
882 /* Between a descriptor and what comes next */
884 t
= format_lex (fmt
);
895 get_fnode (fmt
, &head
, &tail
, t
);
900 fmt
->error
= unexpected_end
;
904 /* Assume a missing comma, this is a GNU extension */
908 /* Optional comma is a weird between state where we've just finished
909 reading a colon, slash or P descriptor. */
911 t
= format_lex (fmt
);
920 default: /* Assume that we have another format item */
921 fmt
->saved_token
= t
;
932 /* format_error()-- Generate an error message for a format statement.
933 * If the node that gives the location of the error is NULL, the error
934 * is assumed to happen at parse time, and the current location of the
937 * We generate a message showing where the problem is. We take extra
938 * care to print only the relevant part of the format if it is longer
939 * than a standard 80 column display. */
942 format_error (st_parameter_dt
*dtp
, const fnode
*f
, const char *message
)
944 int width
, i
, j
, offset
;
945 char *p
, buffer
[300];
946 format_data
*fmt
= dtp
->u
.p
.fmt
;
949 fmt
->format_string
= f
->source
;
951 sprintf (buffer
, "%s\n", message
);
953 j
= fmt
->format_string
- dtp
->format
;
955 offset
= (j
> 60) ? j
- 40 : 0;
958 width
= dtp
->format_len
- offset
;
963 /* Show the format */
965 p
= strchr (buffer
, '\0');
967 memcpy (p
, dtp
->format
+ offset
, width
);
972 /* Show where the problem is */
974 for (i
= 1; i
< j
; i
++)
980 generate_error (&dtp
->common
, LIBERROR_FORMAT
, buffer
);
984 /* parse_format()-- Parse a format string. */
987 parse_format (st_parameter_dt
*dtp
)
991 dtp
->u
.p
.fmt
= fmt
= get_mem (sizeof (format_data
));
992 fmt
->format_string
= dtp
->format
;
993 fmt
->format_string_len
= dtp
->format_len
;
996 fmt
->saved_token
= FMT_NONE
;
1000 /* Initialize variables used during traversal of the tree */
1002 fmt
->reversion_ok
= 0;
1003 fmt
->saved_format
= NULL
;
1005 /* Allocate the first format node as the root of the tree */
1007 fmt
->last
= &fmt
->array
;
1008 fmt
->last
->next
= NULL
;
1009 fmt
->avail
= &fmt
->array
.array
[0];
1011 memset (fmt
->avail
, 0, sizeof (*fmt
->avail
));
1012 fmt
->avail
->format
= FMT_LPAREN
;
1013 fmt
->avail
->repeat
= 1;
1016 if (format_lex (fmt
) == FMT_LPAREN
)
1017 fmt
->array
.array
[0].u
.child
= parse_format_list (dtp
);
1019 fmt
->error
= "Missing initial left parenthesis in format";
1022 format_error (dtp
, NULL
, fmt
->error
);
1026 /* revert()-- Do reversion of the format. Control reverts to the left
1027 * parenthesis that matches the rightmost right parenthesis. From our
1028 * tree structure, we are looking for the rightmost parenthesis node
1029 * at the second level, the first level always being a single
1030 * parenthesis node. If this node doesn't exit, we use the top
1034 revert (st_parameter_dt
*dtp
)
1037 format_data
*fmt
= dtp
->u
.p
.fmt
;
1039 dtp
->u
.p
.reversion_flag
= 1;
1043 for (f
= fmt
->array
.array
[0].u
.child
; f
; f
= f
->next
)
1044 if (f
->format
== FMT_LPAREN
)
1047 /* If r is NULL because no node was found, the whole tree will be used */
1049 fmt
->array
.array
[0].current
= r
;
1050 fmt
->array
.array
[0].count
= 0;
1054 /* next_format0()-- Get the next format node without worrying about
1055 * reversion. Returns NULL when we hit the end of the list.
1056 * Parenthesis nodes are incremented after the list has been
1057 * exhausted, other nodes are incremented before they are returned. */
1059 static const fnode
*
1060 next_format0 (fnode
* f
)
1067 if (f
->format
!= FMT_LPAREN
)
1070 if (f
->count
<= f
->repeat
)
1077 /* Deal with a parenthesis node */
1079 for (; f
->count
< f
->repeat
; f
->count
++)
1081 if (f
->current
== NULL
)
1082 f
->current
= f
->u
.child
;
1084 for (; f
->current
!= NULL
; f
->current
= f
->current
->next
)
1086 r
= next_format0 (f
->current
);
1097 /* next_format()-- Return the next format node. If the format list
1098 * ends up being exhausted, we do reversion. Reversion is only
1099 * allowed if we've seen a data descriptor since the
1100 * initialization or the last reversion. We return NULL if there
1101 * are no more data descriptors to return (which is an error
1105 next_format (st_parameter_dt
*dtp
)
1109 format_data
*fmt
= dtp
->u
.p
.fmt
;
1111 if (fmt
->saved_format
!= NULL
)
1112 { /* Deal with a pushed-back format node */
1113 f
= fmt
->saved_format
;
1114 fmt
->saved_format
= NULL
;
1118 f
= next_format0 (&fmt
->array
.array
[0]);
1121 if (!fmt
->reversion_ok
)
1124 fmt
->reversion_ok
= 0;
1127 f
= next_format0 (&fmt
->array
.array
[0]);
1130 format_error (dtp
, NULL
, reversion_error
);
1134 /* Push the first reverted token and return a colon node in case
1135 * there are no more data items. */
1137 fmt
->saved_format
= f
;
1141 /* If this is a data edit descriptor, then reversion has become OK. */
1145 if (!fmt
->reversion_ok
&&
1146 (t
== FMT_I
|| t
== FMT_B
|| t
== FMT_O
|| t
== FMT_Z
|| t
== FMT_F
||
1147 t
== FMT_E
|| t
== FMT_EN
|| t
== FMT_ES
|| t
== FMT_G
|| t
== FMT_L
||
1148 t
== FMT_A
|| t
== FMT_D
))
1149 fmt
->reversion_ok
= 1;
1154 /* unget_format()-- Push the given format back so that it will be
1155 * returned on the next call to next_format() without affecting
1156 * counts. This is necessary when we've encountered a data
1157 * descriptor, but don't know what the data item is yet. The format
1158 * node is pushed back, and we return control to the main program,
1159 * which calls the library back with the data item (or not). */
1162 unget_format (st_parameter_dt
*dtp
, const fnode
*f
)
1164 dtp
->u
.p
.fmt
->saved_format
= f
;