123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /* Copyright (C) 2009-2015 Free Software Foundation, Inc.
- Contributed by Janne Blomqvist
- This file is part of the GNU Fortran runtime library (libgfortran).
- Libgfortran is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- Libgfortran is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- Under Section 7 of GPL version 3, you are granted additional
- permissions described in the GCC Runtime Library Exception, version
- 3.1, as published by the Free Software Foundation.
- You should have received a copy of the GNU General Public License and
- a copy of the GCC Runtime Library Exception along with this program;
- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- <http://www.gnu.org/licenses/>. */
- #ifndef GFOR_FORMAT_H
- #define GFOR_FORMAT_H
- #include "io.h"
- /* Format tokens. Only about half of these can be stored in the
- format nodes. */
- typedef enum
- {
- FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
- FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL,
- FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
- FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
- FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, FMT_DC,
- FMT_DP, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ
- }
- format_token;
- /* Format nodes. A format string is converted into a tree of these
- structures, which is traversed as part of a data transfer statement. */
- struct fnode
- {
- format_token format;
- int repeat;
- struct fnode *next;
- char *source;
- union
- {
- struct
- {
- int w, d, e;
- }
- real;
- struct
- {
- int length;
- char *p;
- }
- string;
- struct
- {
- int w, m;
- }
- integer;
- int w;
- int k;
- int r;
- int n;
- struct fnode *child;
- }
- u;
- /* Members for traversing the tree during data transfer. */
- int count;
- struct fnode *current;
- };
- /* A storage structures for format node data. */
- #define FARRAY_SIZE 64
- typedef struct fnode_array
- {
- struct fnode_array *next;
- fnode array[FARRAY_SIZE];
- }
- fnode_array;
- typedef struct format_data
- {
- char *format_string, *string;
- const char *error;
- char error_element;
- format_token saved_token;
- int value, format_string_len, reversion_ok;
- fnode *avail;
- const fnode *saved_format;
- fnode_array *last;
- fnode_array array;
- }
- format_data;
- extern void parse_format (st_parameter_dt *);
- internal_proto(parse_format);
- extern const fnode *next_format (st_parameter_dt *);
- internal_proto(next_format);
- extern void unget_format (st_parameter_dt *, const fnode *);
- internal_proto(unget_format);
- extern void format_error (st_parameter_dt *, const fnode *, const char *);
- internal_proto(format_error);
- extern void free_format_data (struct format_data *);
- internal_proto(free_format_data);
- extern void free_format_hash_table (gfc_unit *);
- internal_proto(free_format_hash_table);
- extern void init_format_hash (st_parameter_dt *);
- internal_proto(init_format_hash);
- extern void free_format_hash (st_parameter_dt *);
- internal_proto(free_format_hash);
- #endif
|