/* Copyright (C) 2009-2016 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 . */ #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, FMT_DT } 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; struct { char *string; int string_len; gfc_array_i4 *vlist; } udf; /* User Defined Format. */ 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 (st_parameter_dt *); internal_proto(free_format); 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