]>
Commit | Line | Data |
---|---|---|
7fcb1804 | 1 | /* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. |
6de9cd9a DN |
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 | { | |
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 | } | |
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; | |
3bc268e6 | 93 | int string_length; |
6de9cd9a DN |
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 | ||
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 | } | |
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 | ||
909087e0 | 260 | typedef 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 | 285 | gfc_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 | ||
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. */ | |
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 | } | |
309 | global_t; | |
310 | ||
311 | ||
312 | #define g prefix(g) | |
313 | extern global_t g; | |
314 | ||
315 | ||
316 | #define current_unit prefix(current_unit) | |
909087e0 | 317 | extern gfc_unit *current_unit; |
6de9cd9a DN |
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) | |
909087e0 | 415 | gfc_unit *find_file (void); |
6de9cd9a DN |
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) | |
909087e0 | 424 | int delete_file (gfc_unit *); |
6de9cd9a DN |
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) | |
81f4be3c | 451 | gfc_offset file_length (stream *); |
6de9cd9a DN |
452 | |
453 | #define file_position prefix(file_position) | |
81f4be3c | 454 | gfc_offset file_position (stream *); |
6de9cd9a DN |
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 | ||
000aa32a JB |
462 | #define flush prefix(flush) |
463 | try flush (stream *); | |
464 | ||
6de9cd9a DN |
465 | |
466 | /* unit.c */ | |
467 | ||
468 | #define insert_unit prefix(insert_unix) | |
909087e0 | 469 | void insert_unit (gfc_unit *); |
6de9cd9a DN |
470 | |
471 | #define close_unit prefix(close_unit) | |
909087e0 | 472 | int close_unit (gfc_unit *); |
6de9cd9a DN |
473 | |
474 | #define is_internal_unit prefix(is_internal_unit) | |
475 | int is_internal_unit (void); | |
476 | ||
477 | #define find_unit prefix(find_unit) | |
909087e0 | 478 | gfc_unit *find_unit (int); |
6de9cd9a DN |
479 | |
480 | #define get_unit prefix(get_unit) | |
909087e0 | 481 | gfc_unit *get_unit (int); |
6de9cd9a DN |
482 | |
483 | /* open.c */ | |
484 | ||
485 | #define test_endfile prefix(test_endfile) | |
909087e0 | 486 | void test_endfile (gfc_unit *); |
6de9cd9a DN |
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) | |
3bc268e6 | 549 | void 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) | |
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) | |
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 | ||
659 | void __MAIN (void); | |
660 | ||
661 | #endif |