OSDN Git Service

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