OSDN Git Service

gcc/fortran/
[pf3gnuchains/gcc-fork.git] / libgfortran / io / io.h
1 /* Copyright (C) 2002, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.  */
20
21 /* As a special exception, if you link this library with other files,
22    some of which are compiled with GCC, to produce an executable,
23    this library does not by itself cause the resulting executable
24    to be covered by the GNU General Public License.
25    This exception does not however invalidate any other reasons why
26    the executable file might be covered by the GNU General Public License.  */
27
28 #ifndef GFOR_IO_H
29 #define GFOR_IO_H
30
31 /* IO library include.  */
32
33 #include <setjmp.h>
34 #include "libgfortran.h"
35 #ifdef HAVE_PRAGMA_WEAK
36 /* Used by gthr.h.  */
37 #define SUPPORTS_WEAK 1
38 #endif
39 #include <gthr.h>
40
41 #define DEFAULT_TEMPDIR "/tmp"
42
43 /* Basic types used in data transfers.  */
44
45 typedef enum
46 { BT_NULL, BT_INTEGER, BT_LOGICAL, BT_CHARACTER, BT_REAL,
47   BT_COMPLEX
48 }
49 bt;
50
51
52 typedef enum
53 { SUCCESS = 1, FAILURE }
54 try;
55
56 struct st_parameter_dt;
57
58 typedef struct stream
59 {
60   char *(*alloc_w_at) (struct stream *, int *, gfc_offset);
61   char *(*alloc_r_at) (struct stream *, int *, gfc_offset);
62   try (*sfree) (struct stream *);
63   try (*close) (struct stream *);
64   try (*seek) (struct stream *, gfc_offset);
65   try (*truncate) (struct stream *);
66   int (*read) (struct stream *, void *, size_t *);
67   int (*write) (struct stream *, const void *, size_t *);
68 }
69 stream;
70
71
72 /* Macros for doing file I/O given a stream.  */
73
74 #define sfree(s) ((s)->sfree)(s)
75 #define sclose(s) ((s)->close)(s)
76
77 #define salloc_r(s, len) ((s)->alloc_r_at)(s, len, -1)
78 #define salloc_w(s, len) ((s)->alloc_w_at)(s, len, -1)
79
80 #define salloc_r_at(s, len, where) ((s)->alloc_r_at)(s, len, where)
81 #define salloc_w_at(s, len, where) ((s)->alloc_w_at)(s, len, where)
82
83 #define sseek(s, pos) ((s)->seek)(s, pos)
84 #define struncate(s) ((s)->truncate)(s)
85 #define sread(s, buf, nbytes) ((s)->read)(s, buf, nbytes)
86 #define swrite(s, buf, nbytes) ((s)->write)(s, buf, nbytes)
87
88 /* The array_loop_spec contains the variables for the loops over index ranges
89    that are encountered.  Since the variables can be negative, ssize_t
90    is used.  */
91
92 typedef struct array_loop_spec
93 {
94   /* Index counter for this dimension.  */
95   ssize_t idx;
96
97   /* Start for the index counter.  */
98   ssize_t start;
99
100   /* End for the index counter.  */
101   ssize_t end;
102
103   /* Step for the index counter.  */
104   ssize_t step;
105 }
106 array_loop_spec;
107
108 /* Representation of a namelist object in libgfortran
109
110    Namelist Records
111       &GROUPNAME  OBJECT=value[s] [,OBJECT=value[s]].../
112      or
113       &GROUPNAME  OBJECT=value[s] [,OBJECT=value[s]]...&END
114
115    The object can be a fully qualified, compound name for an instrinsic
116    type, derived types or derived type components.  So, a substring
117    a(:)%b(4)%ch(2:4)(1:7) has to be treated correctly in namelist
118    read. Hence full information about the structure of the object has
119    to be available to list_read.c and write.
120
121    These requirements are met by the following data structures.
122
123    namelist_info type contains all the scalar information about the
124    object and arrays of descriptor_dimension and array_loop_spec types for
125    arrays.  */
126
127 typedef struct namelist_type
128 {
129
130   /* Object type, stored as GFC_DTYPE_xxxx.  */
131   bt type;
132
133   /* Object name.  */
134   char * var_name;
135
136   /* Address for the start of the object's data.  */
137   void * mem_pos;
138
139   /* Flag to show that a read is to be attempted for this node.  */
140   int touched;
141
142   /* Length of intrinsic type in bytes.  */
143   int len;
144
145   /* Rank of the object.  */
146   int var_rank;
147
148   /* Overall size of the object in bytes.  */
149   index_type size;
150
151   /* Length of character string.  */
152   index_type string_length;
153
154   descriptor_dimension * dim;
155   array_loop_spec * ls;
156   struct namelist_type * next;
157 }
158 namelist_info;
159
160 /* Options for the OPEN statement.  */
161
162 typedef enum
163 { ACCESS_SEQUENTIAL, ACCESS_DIRECT, ACCESS_APPEND,
164   ACCESS_UNSPECIFIED
165 }
166 unit_access;
167
168 typedef enum
169 { ACTION_READ, ACTION_WRITE, ACTION_READWRITE,
170   ACTION_UNSPECIFIED
171 }
172 unit_action;
173
174 typedef enum
175 { BLANK_NULL, BLANK_ZERO, BLANK_UNSPECIFIED }
176 unit_blank;
177
178 typedef enum
179 { DELIM_NONE, DELIM_APOSTROPHE, DELIM_QUOTE,
180   DELIM_UNSPECIFIED
181 }
182 unit_delim;
183
184 typedef enum
185 { FORM_FORMATTED, FORM_UNFORMATTED, FORM_UNSPECIFIED }
186 unit_form;
187
188 typedef enum
189 { POSITION_ASIS, POSITION_REWIND, POSITION_APPEND,
190   POSITION_UNSPECIFIED
191 }
192 unit_position;
193
194 typedef enum
195 { STATUS_UNKNOWN, STATUS_OLD, STATUS_NEW, STATUS_SCRATCH,
196   STATUS_REPLACE, STATUS_UNSPECIFIED
197 }
198 unit_status;
199
200 typedef enum
201 { PAD_YES, PAD_NO, PAD_UNSPECIFIED }
202 unit_pad;
203
204 typedef enum
205 { ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED }
206 unit_advance;
207
208 typedef enum
209 {READING, WRITING}
210 unit_mode;
211
212 #define CHARACTER1(name) \
213               char * name; \
214               gfc_charlen_type name ## _len
215 #define CHARACTER2(name) \
216               gfc_charlen_type name ## _len; \
217               char * name
218
219 #define IOPARM_LIBRETURN_MASK           (3 << 0)
220 #define IOPARM_LIBRETURN_OK             (0 << 0)
221 #define IOPARM_LIBRETURN_ERROR          (1 << 0)
222 #define IOPARM_LIBRETURN_END            (2 << 0)
223 #define IOPARM_LIBRETURN_EOR            (3 << 0)
224 #define IOPARM_ERR                      (1 << 2)
225 #define IOPARM_END                      (1 << 3)
226 #define IOPARM_EOR                      (1 << 4)
227 #define IOPARM_HAS_IOSTAT               (1 << 5)
228 #define IOPARM_HAS_IOMSG                (1 << 6)
229
230 #define IOPARM_COMMON_MASK              ((1 << 7) - 1)
231
232 typedef struct st_parameter_common
233 {
234   GFC_INTEGER_4 flags;
235   GFC_INTEGER_4 unit;
236   const char *filename;
237   GFC_INTEGER_4 line;
238   CHARACTER2 (iomsg);
239   GFC_INTEGER_4 *iostat;
240 }
241 st_parameter_common;
242
243 #define IOPARM_OPEN_HAS_RECL_IN         (1 << 7)
244 #define IOPARM_OPEN_HAS_FILE            (1 << 8)
245 #define IOPARM_OPEN_HAS_STATUS          (1 << 9)
246 #define IOPARM_OPEN_HAS_ACCESS          (1 << 10)
247 #define IOPARM_OPEN_HAS_FORM            (1 << 11)
248 #define IOPARM_OPEN_HAS_BLANK           (1 << 12)
249 #define IOPARM_OPEN_HAS_POSITION        (1 << 13)
250 #define IOPARM_OPEN_HAS_ACTION          (1 << 14)
251 #define IOPARM_OPEN_HAS_DELIM           (1 << 15)
252 #define IOPARM_OPEN_HAS_PAD             (1 << 16)
253
254 typedef struct
255 {
256   st_parameter_common common;
257   GFC_INTEGER_4 recl_in;
258   CHARACTER2 (file);
259   CHARACTER1 (status);
260   CHARACTER2 (access);
261   CHARACTER1 (form);
262   CHARACTER2 (blank);
263   CHARACTER1 (position);
264   CHARACTER2 (action);
265   CHARACTER1 (delim);
266   CHARACTER2 (pad);
267 }
268 st_parameter_open;
269
270 #define IOPARM_CLOSE_HAS_STATUS         (1 << 7)
271
272 typedef struct
273 {
274   st_parameter_common common;
275   CHARACTER1 (status);
276 }
277 st_parameter_close;
278
279 typedef struct
280 {
281   st_parameter_common common;
282 }
283 st_parameter_filepos;
284
285 #define IOPARM_INQUIRE_HAS_EXIST        (1 << 7)
286 #define IOPARM_INQUIRE_HAS_OPENED       (1 << 8)
287 #define IOPARM_INQUIRE_HAS_NUMBER       (1 << 9)
288 #define IOPARM_INQUIRE_HAS_NAMED        (1 << 10)
289 #define IOPARM_INQUIRE_HAS_NEXTREC      (1 << 11)
290 #define IOPARM_INQUIRE_HAS_RECL_OUT     (1 << 12)
291 #define IOPARM_INQUIRE_HAS_FILE         (1 << 13)
292 #define IOPARM_INQUIRE_HAS_ACCESS       (1 << 14)
293 #define IOPARM_INQUIRE_HAS_FORM         (1 << 15)
294 #define IOPARM_INQUIRE_HAS_BLANK        (1 << 16)
295 #define IOPARM_INQUIRE_HAS_POSITION     (1 << 17)
296 #define IOPARM_INQUIRE_HAS_ACTION       (1 << 18)
297 #define IOPARM_INQUIRE_HAS_DELIM        (1 << 19)
298 #define IOPARM_INQUIRE_HAS_PAD          (1 << 20)
299 #define IOPARM_INQUIRE_HAS_NAME         (1 << 21)
300 #define IOPARM_INQUIRE_HAS_SEQUENTIAL   (1 << 22)
301 #define IOPARM_INQUIRE_HAS_DIRECT       (1 << 23)
302 #define IOPARM_INQUIRE_HAS_FORMATTED    (1 << 24)
303 #define IOPARM_INQUIRE_HAS_UNFORMATTED  (1 << 25)
304 #define IOPARM_INQUIRE_HAS_READ         (1 << 26)
305 #define IOPARM_INQUIRE_HAS_WRITE        (1 << 27)
306 #define IOPARM_INQUIRE_HAS_READWRITE    (1 << 28)
307
308 typedef struct
309 {
310   st_parameter_common common;
311   GFC_INTEGER_4 *exist, *opened, *number, *named;
312   GFC_INTEGER_4 *nextrec, *recl_out;
313   CHARACTER1 (file);
314   CHARACTER2 (access);
315   CHARACTER1 (form);
316   CHARACTER2 (blank);
317   CHARACTER1 (position);
318   CHARACTER2 (action);
319   CHARACTER1 (delim);
320   CHARACTER2 (pad);
321   CHARACTER1 (name);
322   CHARACTER2 (sequential);
323   CHARACTER1 (direct);
324   CHARACTER2 (formatted);
325   CHARACTER1 (unformatted);
326   CHARACTER2 (read);
327   CHARACTER1 (write);
328   CHARACTER2 (readwrite);
329 }
330 st_parameter_inquire;
331
332 struct gfc_unit;
333 struct format_data;
334
335 #define IOPARM_DT_LIST_FORMAT                   (1 << 7)
336 #define IOPARM_DT_NAMELIST_READ_MODE            (1 << 8)
337 #define IOPARM_DT_HAS_REC                       (1 << 9)
338 #define IOPARM_DT_HAS_SIZE                      (1 << 10)
339 #define IOPARM_DT_HAS_IOLENGTH                  (1 << 11)
340 #define IOPARM_DT_HAS_FORMAT                    (1 << 12)
341 #define IOPARM_DT_HAS_ADVANCE                   (1 << 13)
342 #define IOPARM_DT_HAS_INTERNAL_UNIT             (1 << 14)
343 #define IOPARM_DT_HAS_NAMELIST_NAME             (1 << 15)
344 /* Internal use bit.  */
345 #define IOPARM_DT_IONML_SET                     (1 << 31)
346
347 typedef struct st_parameter_dt
348 {
349   st_parameter_common common;
350   GFC_INTEGER_4 rec;
351   GFC_INTEGER_4 *size, *iolength;
352   gfc_array_char *internal_unit_desc;
353   CHARACTER1 (format);
354   CHARACTER2 (advance);
355   CHARACTER1 (internal_unit);
356   CHARACTER2 (namelist_name);
357   /* Private part of the structure.  The compiler just needs
358      to reserve enough space.  */
359   union
360     {
361       struct
362         {
363           void (*transfer) (struct st_parameter_dt *, bt, void *, int,
364                             size_t, size_t);
365           struct gfc_unit *current_unit;
366           int item_count; /* Item number in a formatted data transfer.  */
367           unit_mode mode;
368           unit_blank blank_status;
369           enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status;
370           int scale_factor;
371           int max_pos; /* Maximum righthand column written to.  */
372           /* Number of skips + spaces to be done for T and X-editing.  */
373           int skips;
374           /* Number of spaces to be done for T and X-editing.  */
375           int pending_spaces;
376           unit_advance advance_status;
377           char reversion_flag; /* Format reversion has occurred.  */
378           char first_item;
379           char seen_dollar;
380           char sf_seen_eor;
381           char eor_condition;
382           char no_leading_blank;
383           char nml_delim;
384           char char_flag;
385           char input_complete;
386           char at_eol;
387           char comma_flag;
388           char last_char;
389           /* A namelist specific flag used in the list directed library
390              to flag that calls are being made from namelist read (eg. to
391              ignore comments or to treat '/' as a terminator)  */
392           char namelist_mode;
393           /* A namelist specific flag used in the list directed library
394              to flag read errors and return, so that an attempt can be
395              made to read a new object name.  */
396           char nml_read_error;
397           /* Storage area for values except for strings.  Must be large
398              enough to hold a complex value (two reals) of the largest
399              kind.  */
400           char value[32];
401           int repeat_count;
402           int saved_length;
403           int saved_used;
404           bt saved_type;
405           char *saved_string;
406           char *scratch;
407           char *line_buffer;
408           struct format_data *fmt;
409           jmp_buf *eof_jump;
410           namelist_info *ionml;
411         } p;
412       char pad[16 * sizeof (char *) + 32 * sizeof (int)];
413     } u;
414 }
415 st_parameter_dt;
416
417 #undef CHARACTER1
418 #undef CHARACTER2
419
420 typedef struct
421 {
422   unit_access access;
423   unit_action action;
424   unit_blank blank;
425   unit_delim delim;
426   unit_form form;
427   int is_notpadded;
428   unit_position position;
429   unit_status status;
430   unit_pad pad;
431 }
432 unit_flags;
433
434
435 /* The default value of record length for preconnected units is defined
436    here. This value can be overriden by an environment variable.
437    Default value is 1 Gb.  */
438
439 #define DEFAULT_RECL 1073741824
440
441
442 typedef struct gfc_unit
443 {
444   int unit_number;
445   stream *s;
446   
447   /* Treap links.  */
448   struct gfc_unit *left, *right;
449   int priority;
450
451   int read_bad, current_record;
452   enum
453   { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
454   endfile;
455
456   unit_mode mode;
457   unit_flags flags;
458
459   /* recl           -- Record length of the file.
460      last_record    -- Last record number read or written
461      maxrec         -- Maximum record number in a direct access file
462      bytes_left     -- Bytes left in current record.  */
463   gfc_offset recl, last_record, maxrec, bytes_left;
464
465   __gthread_mutex_t lock;
466   /* Number of threads waiting to acquire this unit's lock.
467      When non-zero, close_unit doesn't only removes the unit
468      from the UNIT_ROOT tree, but doesn't free it and the
469      last of the waiting threads will do that.
470      This must be either atomically increased/decreased, or
471      always guarded by UNIT_LOCK.  */
472   int waiting;
473   /* Flag set by close_unit if the unit as been closed.
474      Must be manipulated under unit's lock.  */
475   int closed;
476
477   /* For traversing arrays */
478   array_loop_spec *ls;
479   int rank;
480
481   int file_len;
482   char *file;
483 }
484 gfc_unit;
485
486 /* Format tokens.  Only about half of these can be stored in the
487    format nodes.  */
488
489 typedef enum
490 {
491   FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
492   FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL,
493   FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
494   FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
495   FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END
496 }
497 format_token;
498
499
500 /* Format nodes.  A format string is converted into a tree of these
501    structures, which is traversed as part of a data transfer statement.  */
502
503 typedef struct fnode
504 {
505   format_token format;
506   int repeat;
507   struct fnode *next;
508   char *source;
509
510   union
511   {
512     struct
513     {
514       int w, d, e;
515     }
516     real;
517
518     struct
519     {
520       int length;
521       char *p;
522     }
523     string;
524
525     struct
526     {
527       int w, m;
528     }
529     integer;
530
531     int w;
532     int k;
533     int r;
534     int n;
535
536     struct fnode *child;
537   }
538   u;
539
540   /* Members for traversing the tree during data transfer.  */
541
542   int count;
543   struct fnode *current;
544
545 }
546 fnode;
547
548
549 /* unix.c */
550
551 extern int move_pos_offset (stream *, int);
552 internal_proto(move_pos_offset);
553
554 extern int compare_files (stream *, stream *);
555 internal_proto(compare_files);
556
557 extern stream *open_external (st_parameter_open *, unit_flags *);
558 internal_proto(open_external);
559
560 extern stream *open_internal (char *, int);
561 internal_proto(open_internal);
562
563 extern stream *input_stream (void);
564 internal_proto(input_stream);
565
566 extern stream *output_stream (void);
567 internal_proto(output_stream);
568
569 extern stream *error_stream (void);
570 internal_proto(error_stream);
571
572 extern int compare_file_filename (gfc_unit *, const char *, int);
573 internal_proto(compare_file_filename);
574
575 extern gfc_unit *find_file (const char *file, gfc_charlen_type file_len);
576 internal_proto(find_file);
577
578 extern void flush_all_units (void);
579 internal_proto(flush_all_units);
580
581 extern int stream_at_bof (stream *);
582 internal_proto(stream_at_bof);
583
584 extern int stream_at_eof (stream *);
585 internal_proto(stream_at_eof);
586
587 extern int delete_file (gfc_unit *);
588 internal_proto(delete_file);
589
590 extern int file_exists (const char *file, gfc_charlen_type file_len);
591 internal_proto(file_exists);
592
593 extern const char *inquire_sequential (const char *, int);
594 internal_proto(inquire_sequential);
595
596 extern const char *inquire_direct (const char *, int);
597 internal_proto(inquire_direct);
598
599 extern const char *inquire_formatted (const char *, int);
600 internal_proto(inquire_formatted);
601
602 extern const char *inquire_unformatted (const char *, int);
603 internal_proto(inquire_unformatted);
604
605 extern const char *inquire_read (const char *, int);
606 internal_proto(inquire_read);
607
608 extern const char *inquire_write (const char *, int);
609 internal_proto(inquire_write);
610
611 extern const char *inquire_readwrite (const char *, int);
612 internal_proto(inquire_readwrite);
613
614 extern gfc_offset file_length (stream *);
615 internal_proto(file_length);
616
617 extern gfc_offset file_position (stream *);
618 internal_proto(file_position);
619
620 extern int is_seekable (stream *);
621 internal_proto(is_seekable);
622
623 extern int is_preconnected (stream *);
624 internal_proto(is_preconnected);
625
626 extern void flush_if_preconnected (stream *);
627 internal_proto(flush_if_preconnected);
628
629 extern void empty_internal_buffer(stream *);
630 internal_proto(empty_internal_buffer);
631
632 extern try flush (stream *);
633 internal_proto(flush);
634
635 extern int stream_isatty (stream *);
636 internal_proto(stream_isatty);
637
638 extern char * stream_ttyname (stream *);
639 internal_proto(stream_ttyname);
640
641 extern gfc_offset stream_offset (stream *s);
642 internal_proto(stream_offset);
643
644 extern int unit_to_fd (int);
645 internal_proto(unit_to_fd);
646
647 extern int unpack_filename (char *, const char *, int);
648 internal_proto(unpack_filename);
649
650 /* unit.c */
651
652 /* Maximum file offset, computed at library initialization time.  */
653 extern gfc_offset max_offset;
654 internal_proto(max_offset);
655
656 /* Unit tree root.  */
657 extern gfc_unit *unit_root;
658 internal_proto(unit_root);
659
660 extern __gthread_mutex_t unit_lock;
661 internal_proto(unit_lock);
662
663 extern int close_unit (gfc_unit *);
664 internal_proto(close_unit);
665
666 extern int is_internal_unit (st_parameter_dt *);
667 internal_proto(is_internal_unit);
668
669 extern int is_array_io (st_parameter_dt *);
670 internal_proto(is_array_io);
671
672 extern gfc_unit *find_unit (int);
673 internal_proto(find_unit);
674
675 extern gfc_unit *find_or_create_unit (int);
676 internal_proto(find_unit);
677
678 extern gfc_unit *get_unit (st_parameter_dt *, int);
679 internal_proto(get_unit);
680
681 extern void unlock_unit (gfc_unit *);
682 internal_proto(unlock_unit);
683
684 /* open.c */
685
686 extern void test_endfile (gfc_unit *);
687 internal_proto(test_endfile);
688
689 extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *);
690 internal_proto(new_unit);
691
692 /* format.c */
693
694 extern void parse_format (st_parameter_dt *);
695 internal_proto(parse_format);
696
697 extern const fnode *next_format (st_parameter_dt *);
698 internal_proto(next_format);
699
700 extern void unget_format (st_parameter_dt *, const fnode *);
701 internal_proto(unget_format);
702
703 extern void format_error (st_parameter_dt *, const fnode *, const char *);
704 internal_proto(format_error);
705
706 extern void free_format_data (st_parameter_dt *);
707 internal_proto(free_format_data);
708
709 /* transfer.c */
710
711 #define SCRATCH_SIZE 300
712
713 extern const char *type_name (bt);
714 internal_proto(type_name);
715
716 extern void *read_block (st_parameter_dt *, int *);
717 internal_proto(read_block);
718
719 extern void *write_block (st_parameter_dt *, int);
720 internal_proto(write_block);
721
722 extern gfc_offset next_array_record (st_parameter_dt *, array_loop_spec *);
723 internal_proto(next_array_record);
724
725 extern gfc_offset init_loop_spec (gfc_array_char *, array_loop_spec *);
726 internal_proto(init_loop_spec);
727
728 extern void next_record (st_parameter_dt *, int);
729 internal_proto(next_record);
730
731 /* read.c */
732
733 extern void set_integer (void *, GFC_INTEGER_LARGEST, int);
734 internal_proto(set_integer);
735
736 extern GFC_UINTEGER_LARGEST max_value (int, int);
737 internal_proto(max_value);
738
739 extern int convert_real (st_parameter_dt *, void *, const char *, int);
740 internal_proto(convert_real);
741
742 extern void read_a (st_parameter_dt *, const fnode *, char *, int);
743 internal_proto(read_a);
744
745 extern void read_f (st_parameter_dt *, const fnode *, char *, int);
746 internal_proto(read_f);
747
748 extern void read_l (st_parameter_dt *, const fnode *, char *, int);
749 internal_proto(read_l);
750
751 extern void read_x (st_parameter_dt *, int);
752 internal_proto(read_x);
753
754 extern void read_radix (st_parameter_dt *, const fnode *, char *, int, int);
755 internal_proto(read_radix);
756
757 extern void read_decimal (st_parameter_dt *, const fnode *, char *, int);
758 internal_proto(read_decimal);
759
760 /* list_read.c */
761
762 extern void list_formatted_read (st_parameter_dt *, bt, void *, int, size_t,
763                                  size_t);
764 internal_proto(list_formatted_read);
765
766 extern void finish_list_read (st_parameter_dt *);
767 internal_proto(finish_list_read);
768
769 extern void namelist_read (st_parameter_dt *);
770 internal_proto(namelist_read);
771
772 extern void namelist_write (st_parameter_dt *);
773 internal_proto(namelist_write);
774
775 /* write.c */
776
777 extern void write_a (st_parameter_dt *, const fnode *, const char *, int);
778 internal_proto(write_a);
779
780 extern void write_b (st_parameter_dt *, const fnode *, const char *, int);
781 internal_proto(write_b);
782
783 extern void write_d (st_parameter_dt *, const fnode *, const char *, int);
784 internal_proto(write_d);
785
786 extern void write_e (st_parameter_dt *, const fnode *, const char *, int);
787 internal_proto(write_e);
788
789 extern void write_en (st_parameter_dt *, const fnode *, const char *, int);
790 internal_proto(write_en);
791
792 extern void write_es (st_parameter_dt *, const fnode *, const char *, int);
793 internal_proto(write_es);
794
795 extern void write_f (st_parameter_dt *, const fnode *, const char *, int);
796 internal_proto(write_f);
797
798 extern void write_i (st_parameter_dt *, const fnode *, const char *, int);
799 internal_proto(write_i);
800
801 extern void write_l (st_parameter_dt *, const fnode *, char *, int);
802 internal_proto(write_l);
803
804 extern void write_o (st_parameter_dt *, const fnode *, const char *, int);
805 internal_proto(write_o);
806
807 extern void write_x (st_parameter_dt *, int, int);
808 internal_proto(write_x);
809
810 extern void write_z (st_parameter_dt *, const fnode *, const char *, int);
811 internal_proto(write_z);
812
813 extern void list_formatted_write (st_parameter_dt *, bt, void *, int, size_t,
814                                   size_t);
815 internal_proto(list_formatted_write);
816
817 /* error.c */
818 extern try notify_std (int, const char *);
819 internal_proto(notify_std);
820
821 /* size_from_kind.c */
822 extern size_t size_from_real_kind (int);
823 internal_proto(size_from_real_kind);
824
825 extern size_t size_from_complex_kind (int);
826 internal_proto(size_from_complex_kind);
827
828 /* lock.c */
829 extern void free_ionml (st_parameter_dt *);
830 internal_proto(free_ionml);
831
832 static inline void
833 inc_waiting_locked (gfc_unit *u)
834 {
835 #ifdef HAVE_SYNC_FETCH_AND_ADD
836   (void) __sync_fetch_and_add (&u->waiting, 1);
837 #else
838   u->waiting++;
839 #endif
840 }
841
842 static inline int
843 predec_waiting_locked (gfc_unit *u)
844 {
845 #ifdef HAVE_SYNC_FETCH_AND_ADD
846   return __sync_add_and_fetch (&u->waiting, -1);
847 #else
848   return --u->waiting;
849 #endif
850 }
851
852 static inline void
853 dec_waiting_unlocked (gfc_unit *u)
854 {
855 #ifdef HAVE_SYNC_FETCH_AND_ADD
856   (void) __sync_fetch_and_add (&u->waiting, -1);
857 #else
858   __gthread_mutex_lock (&unit_lock);
859   u->waiting--;
860   __gthread_mutex_unlock (&unit_lock);
861 #endif
862 }
863
864 #endif