📄 io.h
字号:
unit_position position; unit_status status; unit_pad pad; unit_convert convert;}unit_flags;/* The default value of record length for preconnected units is defined here. This value can be overriden by an environment variable. Default value is 1 Gb. */#define DEFAULT_RECL 1073741824typedef struct gfc_unit{ int unit_number; stream *s; /* Treap links. */ struct gfc_unit *left, *right; int priority; int read_bad, current_record; enum { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE } endfile; unit_mode mode; unit_flags flags; /* recl -- Record length of the file. last_record -- Last record number read or written maxrec -- Maximum record number in a direct access file bytes_left -- Bytes left in current record. */ gfc_offset recl, last_record, maxrec, bytes_left; __gthread_mutex_t lock; /* Number of threads waiting to acquire this unit's lock. When non-zero, close_unit doesn't only removes the unit from the UNIT_ROOT tree, but doesn't free it and the last of the waiting threads will do that. This must be either atomically increased/decreased, or always guarded by UNIT_LOCK. */ int waiting; /* Flag set by close_unit if the unit as been closed. Must be manipulated under unit's lock. */ int closed; /* For traversing arrays */ array_loop_spec *ls; int rank; int file_len; char *file;}gfc_unit;/* Format tokens. Only about half of these can be stored in the format nodes. */typedef enum{ FMT_NONE = 0, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD, FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_T, FMT_TR, FMT_TL, FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING, FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F, FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END}format_token;/* Format nodes. A format string is converted into a tree of these structures, which is traversed as part of a data transfer statement. */typedef struct fnode{ format_token format; int repeat; struct fnode *next; char *source; union { struct { int w, d, e; } real; struct { int length; char *p; } string; struct { int w, m; } integer; int w; int k; int r; int n; struct fnode *child; } u; /* Members for traversing the tree during data transfer. */ int count; struct fnode *current;}fnode;/* unix.c */extern int move_pos_offset (stream *, int);internal_proto(move_pos_offset);extern int compare_files (stream *, stream *);internal_proto(compare_files);extern stream *open_external (st_parameter_open *, unit_flags *);internal_proto(open_external);extern stream *open_internal (char *, int);internal_proto(open_internal);extern stream *input_stream (void);internal_proto(input_stream);extern stream *output_stream (void);internal_proto(output_stream);extern stream *error_stream (void);internal_proto(error_stream);extern int compare_file_filename (gfc_unit *, const char *, int);internal_proto(compare_file_filename);extern gfc_unit *find_file (const char *file, gfc_charlen_type file_len);internal_proto(find_file);extern void flush_all_units (void);internal_proto(flush_all_units);extern int stream_at_bof (stream *);internal_proto(stream_at_bof);extern int stream_at_eof (stream *);internal_proto(stream_at_eof);extern int delete_file (gfc_unit *);internal_proto(delete_file);extern int file_exists (const char *file, gfc_charlen_type file_len);internal_proto(file_exists);extern const char *inquire_sequential (const char *, int);internal_proto(inquire_sequential);extern const char *inquire_direct (const char *, int);internal_proto(inquire_direct);extern const char *inquire_formatted (const char *, int);internal_proto(inquire_formatted);extern const char *inquire_unformatted (const char *, int);internal_proto(inquire_unformatted);extern const char *inquire_read (const char *, int);internal_proto(inquire_read);extern const char *inquire_write (const char *, int);internal_proto(inquire_write);extern const char *inquire_readwrite (const char *, int);internal_proto(inquire_readwrite);extern gfc_offset file_length (stream *);internal_proto(file_length);extern gfc_offset file_position (stream *);internal_proto(file_position);extern int is_seekable (stream *);internal_proto(is_seekable);extern int is_preconnected (stream *);internal_proto(is_preconnected);extern void flush_if_preconnected (stream *);internal_proto(flush_if_preconnected);extern void empty_internal_buffer(stream *);internal_proto(empty_internal_buffer);extern try flush (stream *);internal_proto(flush);extern int stream_isatty (stream *);internal_proto(stream_isatty);extern char * stream_ttyname (stream *);internal_proto(stream_ttyname);extern gfc_offset stream_offset (stream *s);internal_proto(stream_offset);extern int unit_to_fd (int);internal_proto(unit_to_fd);extern int unpack_filename (char *, const char *, int);internal_proto(unpack_filename);/* unit.c *//* Maximum file offset, computed at library initialization time. */extern gfc_offset max_offset;internal_proto(max_offset);/* Unit tree root. */extern gfc_unit *unit_root;internal_proto(unit_root);extern __gthread_mutex_t unit_lock;internal_proto(unit_lock);extern int close_unit (gfc_unit *);internal_proto(close_unit);extern int is_internal_unit (st_parameter_dt *);internal_proto(is_internal_unit);extern int is_array_io (st_parameter_dt *);internal_proto(is_array_io);extern gfc_unit *find_unit (int);internal_proto(find_unit);extern gfc_unit *find_or_create_unit (int);internal_proto(find_unit);extern gfc_unit *get_unit (st_parameter_dt *, int);internal_proto(get_unit);extern void unlock_unit (gfc_unit *);internal_proto(unlock_unit);/* open.c */extern void test_endfile (gfc_unit *);internal_proto(test_endfile);extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *);internal_proto(new_unit);/* format.c */extern void parse_format (st_parameter_dt *);internal_proto(parse_format);extern const fnode *next_format (st_parameter_dt *);internal_proto(next_format);extern void unget_format (st_parameter_dt *, const fnode *);internal_proto(unget_format);extern void format_error (st_parameter_dt *, const fnode *, const char *);internal_proto(format_error);extern void free_format_data (st_parameter_dt *);internal_proto(free_format_data);/* transfer.c */#define SCRATCH_SIZE 300extern const char *type_name (bt);internal_proto(type_name);extern void *read_block (st_parameter_dt *, int *);internal_proto(read_block);extern void *write_block (st_parameter_dt *, int);internal_proto(write_block);extern gfc_offset next_array_record (st_parameter_dt *, array_loop_spec *);internal_proto(next_array_record);extern gfc_offset init_loop_spec (gfc_array_char *, array_loop_spec *);internal_proto(init_loop_spec);extern void next_record (st_parameter_dt *, int);internal_proto(next_record);extern void reverse_memcpy (void *, const void *, size_t);internal_proto (reverse_memcpy);/* read.c */extern void set_integer (void *, GFC_INTEGER_LARGEST, int);internal_proto(set_integer);extern GFC_UINTEGER_LARGEST max_value (int, int);internal_proto(max_value);extern int convert_real (st_parameter_dt *, void *, const char *, int);internal_proto(convert_real);extern void read_a (st_parameter_dt *, const fnode *, char *, int);internal_proto(read_a);extern void read_f (st_parameter_dt *, const fnode *, char *, int);internal_proto(read_f);extern void read_l (st_parameter_dt *, const fnode *, char *, int);internal_proto(read_l);extern void read_x (st_parameter_dt *, int);internal_proto(read_x);extern void read_radix (st_parameter_dt *, const fnode *, char *, int, int);internal_proto(read_radix);extern void read_decimal (st_parameter_dt *, const fnode *, char *, int);internal_proto(read_decimal);/* list_read.c */extern void list_formatted_read (st_parameter_dt *, bt, void *, int, size_t, size_t);internal_proto(list_formatted_read);extern void finish_list_read (st_parameter_dt *);internal_proto(finish_list_read);extern void namelist_read (st_parameter_dt *);internal_proto(namelist_read);extern void namelist_write (st_parameter_dt *);internal_proto(namelist_write);/* write.c */extern void write_a (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_a);extern void write_b (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_b);extern void write_d (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_d);extern void write_e (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_e);extern void write_en (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_en);extern void write_es (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_es);extern void write_f (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_f);extern void write_i (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_i);extern void write_l (st_parameter_dt *, const fnode *, char *, int);internal_proto(write_l);extern void write_o (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_o);extern void write_x (st_parameter_dt *, int, int);internal_proto(write_x);extern void write_z (st_parameter_dt *, const fnode *, const char *, int);internal_proto(write_z);extern void list_formatted_write (st_parameter_dt *, bt, void *, int, size_t, size_t);internal_proto(list_formatted_write);/* error.c */extern try notify_std (int, const char *);internal_proto(notify_std);/* size_from_kind.c */extern size_t size_from_real_kind (int);internal_proto(size_from_real_kind);extern size_t size_from_complex_kind (int);internal_proto(size_from_complex_kind);/* lock.c */extern void free_ionml (st_parameter_dt *);internal_proto(free_ionml);static inline voidinc_waiting_locked (gfc_unit *u){#ifdef HAVE_SYNC_FETCH_AND_ADD (void) __sync_fetch_and_add (&u->waiting, 1);#else u->waiting++;#endif}static inline intpredec_waiting_locked (gfc_unit *u){#ifdef HAVE_SYNC_FETCH_AND_ADD return __sync_add_and_fetch (&u->waiting, -1);#else return --u->waiting;#endif}static inline voiddec_waiting_unlocked (gfc_unit *u){#ifdef HAVE_SYNC_FETCH_AND_ADD (void) __sync_fetch_and_add (&u->waiting, -1);#else __gthread_mutex_lock (&unit_lock); u->waiting--; __gthread_mutex_unlock (&unit_lock);#endif}#endif/* ../runtime/environ.c This is here because we return unit_convert. */unit_convert get_unformatted_convert (int);internal_proto(get_unformatted_convert);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -