]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/io/io.h
Update comment for staticp.
[thirdparty/gcc.git] / libgfortran / io / io.h
CommitLineData
7fcb1804 1/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
6de9cd9a
DN
2 Contributed by Andy Vaught
3
4This file is part of the GNU Fortran 95 runtime library (libgfortran).
5
6Libgfortran is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11Libgfortran is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with Libgfortran; see the file COPYING. If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21#ifndef GFOR_IO_H
22#define GFOR_IO_H
23
24/* IO library include. */
25
26#include <setjmp.h>
27#include "libgfortran.h"
28#define DEFAULT_TEMPDIR "/var/tmp"
29
30/* Basic types used in data transfers. */
31
32typedef enum
33{ BT_NULL, BT_INTEGER, BT_LOGICAL, BT_CHARACTER, BT_REAL,
34 BT_COMPLEX
35}
36bt;
37
38
39typedef enum
40{ SUCCESS = 1, FAILURE }
41try;
42
43typedef struct stream
44{
81f4be3c
TS
45 char *(*alloc_w_at) (struct stream *, int *, gfc_offset);
46 char *(*alloc_r_at) (struct stream *, int *, gfc_offset);
6de9cd9a
DN
47 try (*sfree) (struct stream *);
48 try (*close) (struct stream *);
81f4be3c 49 try (*seek) (struct stream *, gfc_offset);
6de9cd9a
DN
50 try (*truncate) (struct stream *);
51}
52stream;
53
54
55/* Macros for doing file I/O given a stream. */
56
57#define sfree(s) ((s)->sfree)(s)
58#define sclose(s) ((s)->close)(s)
59
60#define salloc_r(s, len) ((s)->alloc_r_at)(s, len, -1)
61#define salloc_w(s, len) ((s)->alloc_w_at)(s, len, -1)
62
63#define salloc_r_at(s, len, where) ((s)->alloc_r_at)(s, len, where)
64#define salloc_w_at(s, len, where) ((s)->alloc_w_at)(s, len, where)
65
66#define sseek(s, pos) ((s)->seek)(s, pos)
67#define struncate(s) ((s)->truncate)(s)
68
69/* Namelist represent object */
70/*
71 Namelist Records
72 &groupname object=value [,object=value].../
73 or
74 &groupname object=value [,object=value]...&groupname
75
76 Even more complex, during the execution of a program containing a
77 namelist READ statement, you can specify a question mark character(?)
78 or a question mark character preceded by an equal sign(=?) to get
79 the information of the namelist group. By '?', the name of variables
80 in the namelist will be displayed, by '=?', the name and value of
81 variables will be displayed.
82
83 All these requirements need a new data structure to record all info
84 about the namelist.
85*/
86
87typedef struct namelist_type
88{
89 char * var_name;
90 void * mem_pos;
91 int value_acquired;
92 int len;
3bc268e6 93 int string_length;
6de9cd9a
DN
94 bt type;
95 struct namelist_type * next;
96}
97namelist_info;
98
99/* Options for the OPEN statement. */
100
101typedef enum
102{ ACCESS_SEQUENTIAL, ACCESS_DIRECT,
103 ACCESS_UNSPECIFIED
104}
105unit_access;
106
107typedef enum
108{ ACTION_READ, ACTION_WRITE, ACTION_READWRITE,
109 ACTION_UNSPECIFIED
110}
111unit_action;
112
113typedef enum
114{ BLANK_NULL, BLANK_ZERO, BLANK_UNSPECIFIED }
115unit_blank;
116
117typedef enum
118{ DELIM_NONE, DELIM_APOSTROPHE, DELIM_QUOTE,
119 DELIM_UNSPECIFIED
120}
121unit_delim;
122
123typedef enum
124{ FORM_FORMATTED, FORM_UNFORMATTED, FORM_UNSPECIFIED }
125unit_form;
126
127typedef enum
128{ POSITION_ASIS, POSITION_REWIND, POSITION_APPEND,
129 POSITION_UNSPECIFIED
130}
131unit_position;
132
133typedef enum
134{ STATUS_UNKNOWN, STATUS_OLD, STATUS_NEW, STATUS_SCRATCH,
135 STATUS_REPLACE, STATUS_UNSPECIFIED
136}
137unit_status;
138
139typedef enum
140{ PAD_YES, PAD_NO, PAD_UNSPECIFIED }
141unit_pad;
142
143typedef enum
144{ ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED }
145unit_advance;
146
147
148
149/* Statement parameters. These are all the things that can appear in
150 an I/O statement. Some are inputs and some are outputs, but none
151 are both. All of these values are initially zeroed and are zeroed
152 at the end of a library statement. The relevant values need to be
153 set before entry to an I/O statement. This structure needs to be
154 duplicated by the back end. */
155
156typedef struct
157{
158 int unit;
159 int err, end, eor, list_format; /* These are flags, not values. */
160
161/* Return values from library statements. These are returned only if
162 the labels are specified in the statement itself and the condition
163 occurs. In most cases, none of the labels are specified and the
164 return value does not have to be checked. Must be consistent with
165 the front end. */
166
167 enum
168 {
169 LIBRARY_OK = 0,
170 LIBRARY_ERROR,
171 LIBRARY_END,
172 LIBRARY_EOR
173 }
174 library_return;
175
176 int *iostat, *exist, *opened, *number, *named, rec, *nextrec, *size;
177
178 int recl_in;
179 int *recl_out;
180
8750f9cd
JB
181 int *iolength;
182
6de9cd9a
DN
183 char *file;
184 int file_len;
185 char *status;
186 int status_len;
187 char *access;
188 int access_len;
189 char *form;
190 int form_len;
191 char *blank;
192 int blank_len;
193 char *position;
194 int position_len;
195 char *action;
196 int action_len;
197 char *delim;
198 int delim_len;
199 char *pad;
200 int pad_len;
201 char *format;
202 int format_len;
203 char *advance;
204 int advance_len;
205 char *name;
206 int name_len;
207 char *internal_unit;
208 int internal_unit_len;
209 char *sequential;
210 int sequential_len;
211 char *direct;
212 int direct_len;
213 char *formatted;
214 int formatted_len;
215 char *unformatted;
216 int unformatted_len;
217 char *read;
218 int read_len;
219 char *write;
220 int write_len;
221 char *readwrite;
222 int readwrite_len;
223
224/* namelist related data */
225 char * namelist_name;
226 int namelist_name_len;
227 int namelist_read_mode;
228}
229st_parameter;
230
231
232
233#define ioparm prefix(ioparm)
234extern st_parameter ioparm;
235
236#define ionml prefix(ionml)
237extern namelist_info * ionml;
238
239typedef struct
240{
241 unit_access access;
242 unit_action action;
243 unit_blank blank;
244 unit_delim delim;
245 unit_form form;
246 int is_notpadded;
247 unit_position position;
248 unit_status status;
249 unit_pad pad;
250}
251unit_flags;
252
253
254/* The default value of record length is defined here. This value can
255 be overriden by the OPEN statement or by an environment variable. */
256
257#define DEFAULT_RECL 10000
258
259
909087e0 260typedef struct gfc_unit
6de9cd9a
DN
261{
262 int unit_number;
263
264 stream *s;
265
909087e0 266 struct gfc_unit *left, *right; /* Treap links. */
6de9cd9a
DN
267 int priority;
268
269 int read_bad, current_record;
270 enum
271 { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
272 endfile;
273
274 unit_flags flags;
81f4be3c 275 gfc_offset recl, last_record, maxrec, bytes_left;
6de9cd9a
DN
276
277 /* recl -- Record length of the file.
278 last_record -- Last record number read or written
279 maxrec -- Maximum record number in a direct access file
280 bytes_left -- Bytes left in current record. */
281
282 int file_len;
283 char file[1]; /* Filename is allocated at the end of the structure. */
284}
909087e0 285gfc_unit;
6de9cd9a
DN
286
287/* Global variables. Putting these in a structure makes it easier to
288 maintain, particularly with the constraint of a prefix. */
289
290typedef struct
291{
292 int in_library; /* Nonzero if a library call is being processed. */
293 int size; /* Bytes processed by the current data-transfer statement. */
81f4be3c 294 gfc_offset max_offset; /* Maximum file offset. */
6de9cd9a
DN
295 int item_count; /* Item number in a formatted data transfer. */
296 int reversion_flag; /* Format reversion has occurred. */
297 int first_item;
298
909087e0 299 gfc_unit *unit_root;
6de9cd9a
DN
300 int seen_dollar;
301
302 enum {READING, WRITING} mode;
303
304 unit_blank blank_status;
305 enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status;
306 int scale_factor;
307 jmp_buf eof_jump;
308}
309global_t;
310
311
312#define g prefix(g)
313extern global_t g;
314
315
316#define current_unit prefix(current_unit)
909087e0 317extern gfc_unit *current_unit;
6de9cd9a
DN
318
319/* Format tokens. Only about half of these can be stored in the
320 format nodes. */
321
322typedef enum
323{
324 FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
325 FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL,
326 FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
327 FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
328 FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END
329}
330format_token;
331
332
333/* Format nodes. A format string is converted into a tree of these
334 structures, which is traversed as part of a data transfer statement. */
335
336typedef struct fnode
337{
338 format_token format;
339 int repeat;
340 struct fnode *next;
341 char *source;
342
343 union
344 {
345 struct
346 {
347 int w, d, e;
348 }
349 real;
350
351 struct
352 {
353 int length;
354 char *p;
355 }
356 string;
357
358 struct
359 {
360 int w, m;
361 }
362 integer;
363
364 int w;
365 int k;
366 int r;
367 int n;
368
369 struct fnode *child;
370 }
371 u;
372
373 /* Members for traversing the tree during data transfer. */
374
375 int count;
376 struct fnode *current;
377
378}
379fnode;
380
381
382/* unix.c */
383
384#define sys_exit prefix(sys_exit)
385void sys_exit (int) __attribute__ ((noreturn));
386
387#define move_pos_offset prefix(move_pos_offset)
388int move_pos_offset (stream *, int);
389
390#define get_oserror prefix(get_oserror)
391const char *get_oserror (void);
392
393#define compare_files prefix(compare_files)
394int compare_files (stream *, stream *);
395
396#define init_error_stream prefix(init_error_stream)
397stream *init_error_stream (void);
398
399#define open_external prefix(open_external)
400stream *open_external (unit_action, unit_status);
401
402#define open_internal prefix(open_internal)
403stream *open_internal (char *, int);
404
405#define input_stream prefix(input_stream)
406stream *input_stream (void);
407
408#define output_stream prefix(output_stream)
409stream *output_stream (void);
410
411#define compare_file_filename prefix(compare_file_filename)
412int compare_file_filename (stream *, const char *, int);
413
414#define find_file prefix(find_file)
909087e0 415gfc_unit *find_file (void);
6de9cd9a
DN
416
417#define stream_at_bof prefix(stream_at_bof)
418int stream_at_bof (stream *);
419
420#define stream_at_eof prefix(stream_at_eof)
421int stream_at_eof (stream *);
422
423#define delete_file prefix(delete_file)
909087e0 424int delete_file (gfc_unit *);
6de9cd9a
DN
425
426#define file_exists prefix(file_exists)
427int file_exists (void);
428
429#define inquire_sequential prefix(inquire_sequential)
430const char *inquire_sequential (const char *, int);
431
432#define inquire_direct prefix(inquire_direct)
433const char *inquire_direct (const char *, int);
434
435#define inquire_formatted prefix(inquire_formatted)
436const char *inquire_formatted (const char *, int);
437
438#define inquire_unformatted prefix(inquire_unformatted)
439const char *inquire_unformatted (const char *, int);
440
441#define inquire_read prefix(inquire_read)
442const char *inquire_read (const char *, int);
443
444#define inquire_write prefix(inquire_write)
445const char *inquire_write (const char *, int);
446
447#define inquire_readwrite prefix(inquire_readwrite)
448const char *inquire_readwrite (const char *, int);
449
450#define file_length prefix(file_length)
81f4be3c 451gfc_offset file_length (stream *);
6de9cd9a
DN
452
453#define file_position prefix(file_position)
81f4be3c 454gfc_offset file_position (stream *);
6de9cd9a
DN
455
456#define is_seekable prefix(is_seekable)
457int is_seekable (stream *);
458
459#define empty_internal_buffer prefix(empty_internal_buffer)
460void empty_internal_buffer(stream *);
461
000aa32a
JB
462#define flush prefix(flush)
463try flush (stream *);
464
6de9cd9a
DN
465
466/* unit.c */
467
468#define insert_unit prefix(insert_unix)
909087e0 469void insert_unit (gfc_unit *);
6de9cd9a
DN
470
471#define close_unit prefix(close_unit)
909087e0 472int close_unit (gfc_unit *);
6de9cd9a
DN
473
474#define is_internal_unit prefix(is_internal_unit)
475int is_internal_unit (void);
476
477#define find_unit prefix(find_unit)
909087e0 478gfc_unit *find_unit (int);
6de9cd9a
DN
479
480#define get_unit prefix(get_unit)
909087e0 481gfc_unit *get_unit (int);
6de9cd9a
DN
482
483/* open.c */
484
485#define test_endfile prefix(test_endfile)
909087e0 486void test_endfile (gfc_unit *);
6de9cd9a
DN
487
488#define new_unit prefix(new_unit)
489void new_unit (unit_flags *);
490
491/* format.c */
492
493#define parse_format prefix(parse_format)
494void parse_format (void);
495
496#define next_format prefix(next_format)
497fnode *next_format (void);
498
499#define unget_format prefix(unget_format)
500void unget_format (fnode *);
501
502#define format_error prefix(format_error)
503void format_error (fnode *, const char *);
504
505#define free_fnodes prefix(free_fnodes)
506void free_fnodes (void);
507
508/* transfer.c */
509
510#define SCRATCH_SIZE 300
511
512#define scratch prefix(scratch)
513extern char scratch[];
514
515#define type_name prefix(type_name)
516const char *type_name (bt);
517
518#define read_block prefix(read_block)
519void *read_block (int *);
520
521#define write_block prefix(write_block)
522void *write_block (int);
523
524#define transfer_integer prefix(transfer_integer)
525void transfer_integer (void *, int);
526
527#define transfer_real prefix(transfer_real)
528void transfer_real (void *, int);
529
530#define transfer_logical prefix(transfer_logical)
531void transfer_logical (void *, int);
532
533#define transfer_character prefix(transfer_character)
534void transfer_character (void *, int);
535
536#define transfer_complex prefix(transfer_complex)
537void transfer_complex (void *, int);
538
539#define next_record prefix(next_record)
540void next_record (int);
541
542#define st_set_nml_var_int prefix(st_set_nml_var_int)
543void st_set_nml_var_int (void * , char * , int , int );
544
545#define st_set_nml_var_float prefix(st_set_nml_var_float)
546void st_set_nml_var_float (void * , char * , int , int );
547
548#define st_set_nml_var_char prefix(st_set_nml_var_char)
3bc268e6 549void st_set_nml_var_char (void * , char * , int , int, gfc_strlen_type);
6de9cd9a
DN
550
551#define st_set_nml_var_complex prefix(st_set_nml_var_complex)
552void st_set_nml_var_complex (void * , char * , int , int );
553
554#define st_set_nml_var_log prefix(st_set_nml_var_log)
555void st_set_nml_var_log (void * , char * , int , int );
556
557/* read.c */
558
559#define set_integer prefix(set_integer)
560void set_integer (void *, int64_t, int);
561
562#define max_value prefix(max_value)
563uint64_t max_value (int, int);
564
565#define convert_real prefix(convert_real)
566int convert_real (void *, const char *, int);
567
568#define read_a prefix(read_a)
569void read_a (fnode *, char *, int);
570
571#define read_f prefix(read_f)
572void read_f (fnode *, char *, int);
573
574#define read_l prefix(read_l)
575void read_l (fnode *, char *, int);
576
577#define read_x prefix(read_x)
578void read_x (fnode *);
579
580#define read_radix prefix(read_radix)
581void read_radix (fnode *, char *, int, int);
582
583#define read_decimal prefix(read_decimal)
584void read_decimal (fnode *, char *, int);
585
586/* list_read.c */
587
588#define list_formatted_read prefix(list_formatted_read)
589void list_formatted_read (bt, void *, int);
590
591#define finish_list_read prefix(finish_list_read)
592void finish_list_read (void);
593
594#define init_at_eol prefix(init_at_eol)
595void init_at_eol();
596
597#define namelist_read prefix(namelist_read)
598void namelist_read();
599
600#define namelist_write prefix(namelist_write)
601void namelist_write();
602
603/* write.c */
604
605#define write_a prefix(write_a)
606void write_a (fnode *, const char *, int);
607
608#define write_b prefix(write_b)
609void write_b (fnode *, const char *, int);
610
611#define write_d prefix(write_d)
612void write_d (fnode *, const char *, int);
613
614#define write_e prefix(write_e)
615void write_e (fnode *, const char *, int);
616
617#define write_en prefix(write_en)
618void write_en (fnode *, const char *, int);
619
620#define write_es prefix(write_es)
621void write_es (fnode *, const char *, int);
622
623#define write_f prefix(write_f)
624void write_f (fnode *, const char *, int);
625
626#define write_i prefix(write_i)
627void write_i (fnode *, const char *, int);
628
629#define write_l prefix(write_l)
630void write_l (fnode *, char *, int);
631
632#define write_o prefix(write_o)
633void write_o (fnode *, const char *, int);
634
635#define write_x prefix(write_x)
636void write_x (fnode *);
637
638#define write_z prefix(write_z)
639void write_z (fnode *, const char *, int);
640
641#define list_formatted_write prefix(list_formatted_write)
642void list_formatted_write (bt, void *, int);
643
644
645#define st_open prefix(st_open)
646#define st_close prefix(st_close)
647#define st_inquire prefix(st_inquire)
8750f9cd
JB
648#define st_iolength prefix(st_iolength)
649#define st_iolength_done prefix(st_iolength_done)
6de9cd9a
DN
650#define st_rewind prefix(st_rewind)
651#define st_read prefix(st_read)
652#define st_read_done prefix(st_read_done)
653#define st_write prefix(st_write)
654#define st_write_done prefix(st_write_done)
655#define st_backspace prefix(st_backspace)
656#define st_endfile prefix(st_endfile)
657
658
659void __MAIN (void);
660
661#endif