OSDN Git Service

2004-08-18 Victor Leikehman <lei@il.ibm.com>
[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 *, 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
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
156 typedef 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
181   int *iolength;
182
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 }
229 st_parameter;
230
231
232
233 #define ioparm prefix(ioparm)
234 extern st_parameter ioparm;
235
236 #define ionml prefix(ionml)
237 extern namelist_info * ionml;
238
239 typedef 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 }
251 unit_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
260 typedef struct gfc_unit
261 {
262   int unit_number;
263
264   stream *s;
265
266   struct gfc_unit *left, *right;        /* Treap links.  */
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;
275   gfc_offset recl, last_record, maxrec, bytes_left;
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 }
285 gfc_unit;
286
287 /* Global variables.  Putting these in a structure makes it easier to
288    maintain, particularly with the constraint of a prefix.  */
289
290 typedef 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.  */
294   gfc_offset max_offset;        /* Maximum file offset.  */
295   int item_count;       /* Item number in a formatted data transfer.  */
296   int reversion_flag;   /* Format reversion has occurred.  */
297   int first_item;
298
299   gfc_unit *unit_root;
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 }
309 global_t;
310
311
312 #define g prefix(g)
313 extern global_t g;
314
315
316 #define current_unit prefix(current_unit)
317 extern gfc_unit *current_unit;
318
319 /* Format tokens.  Only about half of these can be stored in the
320    format nodes.  */
321
322 typedef 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 }
330 format_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
336 typedef 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 }
379 fnode;
380
381
382 /* unix.c */
383
384 #define sys_exit prefix(sys_exit)
385 void sys_exit (int) __attribute__ ((noreturn));
386
387 #define move_pos_offset prefix(move_pos_offset)
388 int move_pos_offset (stream *, int);
389
390 #define get_oserror prefix(get_oserror)
391 const char *get_oserror (void);
392
393 #define compare_files prefix(compare_files)
394 int compare_files (stream *, stream *);
395
396 #define init_error_stream prefix(init_error_stream)
397 stream *init_error_stream (void);
398
399 #define open_external prefix(open_external)
400 stream *open_external (unit_action, unit_status);
401
402 #define open_internal prefix(open_internal)
403 stream *open_internal (char *, int);
404
405 #define input_stream prefix(input_stream)
406 stream *input_stream (void);
407
408 #define output_stream prefix(output_stream)
409 stream *output_stream (void);
410
411 #define compare_file_filename prefix(compare_file_filename)
412 int compare_file_filename (stream *, const char *, int);
413
414 #define find_file prefix(find_file)
415 gfc_unit *find_file (void);
416
417 #define stream_at_bof prefix(stream_at_bof)
418 int stream_at_bof (stream *);
419
420 #define stream_at_eof prefix(stream_at_eof)
421 int stream_at_eof (stream *);
422
423 #define delete_file prefix(delete_file)
424 int delete_file (gfc_unit *);
425
426 #define file_exists prefix(file_exists)
427 int file_exists (void);
428
429 #define inquire_sequential prefix(inquire_sequential)
430 const char *inquire_sequential (const char *, int);
431
432 #define inquire_direct prefix(inquire_direct)
433 const char *inquire_direct (const char *, int);
434
435 #define inquire_formatted prefix(inquire_formatted)
436 const char *inquire_formatted (const char *, int);
437
438 #define inquire_unformatted prefix(inquire_unformatted)
439 const char *inquire_unformatted (const char *, int);
440
441 #define inquire_read prefix(inquire_read)
442 const char *inquire_read (const char *, int);
443
444 #define inquire_write prefix(inquire_write)
445 const char *inquire_write (const char *, int);
446
447 #define inquire_readwrite prefix(inquire_readwrite)
448 const char *inquire_readwrite (const char *, int);
449
450 #define file_length prefix(file_length)
451 gfc_offset file_length (stream *);
452
453 #define file_position prefix(file_position)
454 gfc_offset file_position (stream *);
455
456 #define is_seekable prefix(is_seekable)
457 int is_seekable (stream *);
458
459 #define empty_internal_buffer prefix(empty_internal_buffer)
460 void empty_internal_buffer(stream *);
461
462 #define flush prefix(flush)
463 try flush (stream *);
464
465
466 /* unit.c */
467
468 #define insert_unit prefix(insert_unix)
469 void insert_unit (gfc_unit *);
470
471 #define close_unit prefix(close_unit)
472 int close_unit (gfc_unit *);
473
474 #define is_internal_unit prefix(is_internal_unit)
475 int is_internal_unit (void);
476
477 #define find_unit prefix(find_unit)
478 gfc_unit *find_unit (int);
479
480 #define get_unit prefix(get_unit)
481 gfc_unit *get_unit (int);
482
483 /* open.c */
484
485 #define test_endfile prefix(test_endfile)
486 void test_endfile (gfc_unit *);
487
488 #define new_unit prefix(new_unit)
489 void new_unit (unit_flags *);
490
491 /* format.c */
492
493 #define parse_format prefix(parse_format)
494 void parse_format (void);
495
496 #define next_format prefix(next_format)
497 fnode *next_format (void);
498
499 #define unget_format prefix(unget_format)
500 void unget_format (fnode *);
501
502 #define format_error prefix(format_error)
503 void format_error (fnode *, const char *);
504
505 #define free_fnodes prefix(free_fnodes)
506 void free_fnodes (void);
507
508 /* transfer.c */
509
510 #define SCRATCH_SIZE 300
511
512 #define scratch prefix(scratch)
513 extern char scratch[];
514
515 #define type_name prefix(type_name)
516 const char *type_name (bt);
517
518 #define read_block prefix(read_block)
519 void *read_block (int *);
520
521 #define write_block prefix(write_block)
522 void *write_block (int);
523
524 #define transfer_integer prefix(transfer_integer)
525 void transfer_integer (void *, int);
526
527 #define transfer_real prefix(transfer_real)
528 void transfer_real (void *, int);
529
530 #define transfer_logical prefix(transfer_logical)
531 void transfer_logical (void *, int);
532
533 #define transfer_character prefix(transfer_character)
534 void transfer_character (void *, int);
535
536 #define transfer_complex prefix(transfer_complex)
537 void transfer_complex (void *, int);
538
539 #define next_record prefix(next_record)
540 void next_record (int);
541
542 #define st_set_nml_var_int prefix(st_set_nml_var_int)
543 void st_set_nml_var_int (void * , char * , int , int );
544
545 #define st_set_nml_var_float prefix(st_set_nml_var_float)
546 void st_set_nml_var_float (void * , char * , int , int );
547
548 #define st_set_nml_var_char prefix(st_set_nml_var_char)
549 void st_set_nml_var_char (void * , char * , int , int, gfc_strlen_type);
550
551 #define st_set_nml_var_complex prefix(st_set_nml_var_complex)
552 void st_set_nml_var_complex (void * , char * , int , int );
553
554 #define st_set_nml_var_log prefix(st_set_nml_var_log)
555 void st_set_nml_var_log (void * , char * , int , int );
556
557 /* read.c */
558
559 #define set_integer prefix(set_integer)
560 void set_integer (void *, int64_t, int);
561
562 #define max_value prefix(max_value)
563 uint64_t max_value (int, int);
564
565 #define convert_real prefix(convert_real)
566 int convert_real (void *, const char *, int);
567
568 #define read_a prefix(read_a)
569 void read_a (fnode *, char *, int);
570
571 #define read_f prefix(read_f)
572 void read_f (fnode *, char *, int);
573
574 #define read_l prefix(read_l)
575 void read_l (fnode *, char *, int);
576
577 #define read_x prefix(read_x)
578 void read_x (fnode *);
579
580 #define read_radix prefix(read_radix)
581 void read_radix (fnode *, char *, int, int);
582
583 #define read_decimal prefix(read_decimal)
584 void read_decimal (fnode *, char *, int);
585
586 /* list_read.c */
587
588 #define list_formatted_read prefix(list_formatted_read)
589 void list_formatted_read (bt, void *, int);
590
591 #define finish_list_read prefix(finish_list_read)
592 void finish_list_read (void);
593
594 #define init_at_eol prefix(init_at_eol)
595 void init_at_eol();
596
597 #define namelist_read prefix(namelist_read)
598 void namelist_read();
599
600 #define namelist_write prefix(namelist_write)
601 void namelist_write();
602
603 /* write.c */
604
605 #define write_a prefix(write_a)
606 void write_a (fnode *, const char *, int);
607
608 #define write_b prefix(write_b)
609 void write_b (fnode *, const char *, int);
610
611 #define write_d prefix(write_d)
612 void write_d (fnode *, const char *, int);
613
614 #define write_e prefix(write_e)
615 void write_e (fnode *, const char *, int);
616
617 #define write_en prefix(write_en)
618 void write_en (fnode *, const char *, int);
619
620 #define write_es prefix(write_es)
621 void write_es (fnode *, const char *, int);
622
623 #define write_f prefix(write_f)
624 void write_f (fnode *, const char *, int);
625
626 #define write_i prefix(write_i)
627 void write_i (fnode *, const char *, int);
628
629 #define write_l prefix(write_l)
630 void write_l (fnode *, char *, int);
631
632 #define write_o prefix(write_o)
633 void write_o (fnode *, const char *, int);
634
635 #define write_x prefix(write_x)
636 void write_x (fnode *);
637
638 #define write_z prefix(write_z)
639 void write_z (fnode *, const char *, int);
640
641 #define list_formatted_write prefix(list_formatted_write)
642 void 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)
648 #define st_iolength prefix(st_iolength)
649 #define st_iolength_done prefix(st_iolength_done)
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
659 void __MAIN (void);
660
661 #endif