(root)/
gcc-13.2.0/
libgfortran/
io/
format.h
       1  /* Copyright (C) 2009-2023 Free Software Foundation, Inc.
       2     Contributed by Janne Blomqvist
       3  
       4  This file is part of the GNU Fortran runtime library (libgfortran).
       5  
       6  Libgfortran is free software; you can redistribute it and/or modify
       7  it under the terms of the GNU General Public License as published by
       8  the Free Software Foundation; either version 3, or (at your option)
       9  any later version.
      10  
      11  Libgfortran is distributed in the hope that it will be useful,
      12  but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  GNU General Public License for more details.
      15  
      16  Under Section 7 of GPL version 3, you are granted additional
      17  permissions described in the GCC Runtime Library Exception, version
      18  3.1, as published by the Free Software Foundation.
      19  
      20  You should have received a copy of the GNU General Public License and
      21  a copy of the GCC Runtime Library Exception along with this program;
      22  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23  <http://www.gnu.org/licenses/>.  */
      24  
      25  #ifndef GFOR_FORMAT_H
      26  #define GFOR_FORMAT_H
      27  
      28  #include "io.h"
      29  
      30  /* Format nodes.  A format string is converted into a tree of these
      31     structures, which is traversed as part of a data transfer statement.  */
      32  
      33  struct fnode
      34  {
      35    format_token format;
      36    int repeat;
      37    struct fnode *next;
      38    char *source;
      39  
      40    union
      41    {
      42      struct
      43      {
      44        int w, d, e;
      45      }
      46      real;
      47  
      48      struct
      49      {
      50        int length;
      51        char *p;
      52      }
      53      string;
      54  
      55      struct
      56      {
      57        int w, m;
      58      }
      59      integer;
      60  
      61      struct
      62      {
      63        char *string;
      64        int string_len;
      65        gfc_full_array_i4 *vlist;
      66      }
      67      udf;  /* User Defined Format.  */
      68  
      69      int w;
      70      int k;
      71      int r;
      72      int n;
      73  
      74      struct fnode *child;
      75    }
      76    u;
      77  
      78    /* Members for traversing the tree during data transfer.  */
      79  
      80    int count;
      81    struct fnode *current;
      82  
      83  };
      84  
      85  
      86  /* A storage structures for format node data.  */
      87  
      88  #define FARRAY_SIZE 64
      89  
      90  typedef struct fnode_array
      91  {
      92    struct fnode_array *next;
      93    fnode array[FARRAY_SIZE];
      94  }
      95  fnode_array;
      96  
      97  
      98  typedef struct format_data
      99  {
     100    char *format_string, *string;
     101    const char *error;
     102    char error_element;
     103    format_token saved_token;
     104    int value, format_string_len, reversion_ok;
     105    fnode *avail;
     106    const fnode *saved_format;
     107    fnode_array *last;
     108    fnode_array array;
     109  }
     110  format_data;
     111  
     112  extern void parse_format (st_parameter_dt *);
     113  internal_proto(parse_format);
     114  
     115  extern const fnode *next_format (st_parameter_dt *);
     116  internal_proto(next_format);
     117  
     118  extern void unget_format (st_parameter_dt *, const fnode *);
     119  internal_proto(unget_format);
     120  
     121  extern void format_error (st_parameter_dt *, const fnode *, const char *);
     122  internal_proto(format_error);
     123  
     124  extern void free_format_data (struct format_data *);
     125  internal_proto(free_format_data);
     126  
     127  extern void free_format (st_parameter_dt *);
     128  internal_proto(free_format);
     129  
     130  extern void free_format_hash_table (gfc_unit *);
     131  internal_proto(free_format_hash_table);
     132  
     133  extern void init_format_hash (st_parameter_dt *);
     134  internal_proto(init_format_hash);
     135  
     136  extern void free_format_hash (st_parameter_dt *);
     137  internal_proto(free_format_hash);
     138  
     139  #endif