OSDN Git Service

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