-/* Copyright (C) 2002-2016 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2018 Free Software Foundation, Inc.
Contributed by Andy Vaught
F2003 I/O support contributed by Jerry DeLisle
#define is_array_io(dtp) ((dtp)->internal_unit_desc)
-#define is_internal_unit(dtp) ((dtp)->u.p.current_unit->internal_unit_kind)
+#define is_internal_unit(dtp) ((dtp)->u.p.unit_is_internal)
#define is_stream_io(dtp) ((dtp)->u.p.current_unit->flags.access == ACCESS_STREAM)
{ ASYNC_YES, ASYNC_NO, ASYNC_UNSPECIFIED }
unit_async;
+typedef enum
+{ SHARE_DENYRW, SHARE_DENYNONE,
+ SHARE_UNSPECIFIED
+}
+unit_share;
+
+typedef enum
+{ CC_LIST, CC_FORTRAN, CC_NONE,
+ CC_UNSPECIFIED
+}
+unit_cc;
+
+/* End-of-record types for CC_FORTRAN. */
+typedef enum
+{ CCF_DEFAULT=0x0,
+ CCF_OVERPRINT=0x1,
+ CCF_ONE_LF=0x2,
+ CCF_TWO_LF=0x4,
+ CCF_PAGE_FEED=0x8,
+ CCF_PROMPT=0x10,
+ CCF_OVERPRINT_NOA=0x20,
+} /* 6 bits */
+cc_fortran;
+
typedef enum
{ SIGN_S, SIGN_SS, SIGN_SP }
unit_sign_s;
+/* Make sure to keep st_parameter_* in sync with gcc/fortran/ioparm.def. */
+
#define CHARACTER1(name) \
char * name; \
gfc_charlen_type name ## _len
typedef struct
{
st_parameter_common common;
- GFC_INTEGER_4 recl_in;
+ GFC_IO_INT recl_in;
CHARACTER2 (file);
CHARACTER1 (status);
CHARACTER2 (access);
CHARACTER1 (sign);
CHARACTER2 (asynchronous);
GFC_INTEGER_4 *newunit;
+ GFC_INTEGER_4 readonly;
+ CHARACTER2 (cc);
+ CHARACTER1 (share);
}
st_parameter_open;
#define IOPARM_INQUIRE_HAS_SIZE (1 << 6)
#define IOPARM_INQUIRE_HAS_ID (1 << 7)
#define IOPARM_INQUIRE_HAS_IQSTREAM (1 << 8)
+#define IOPARM_INQUIRE_HAS_SHARE (1 << 9)
+#define IOPARM_INQUIRE_HAS_CC (1 << 10)
typedef struct
{
st_parameter_common common;
GFC_INTEGER_4 *exist, *opened, *number, *named;
- GFC_INTEGER_4 *nextrec, *recl_out;
- GFC_IO_INT *strm_pos_out;
+ GFC_IO_INT *nextrec, *recl_out, *strm_pos_out;
CHARACTER1 (file);
CHARACTER2 (access);
CHARACTER1 (form);
GFC_IO_INT *size;
GFC_INTEGER_4 *id;
CHARACTER1 (iqstream);
+ CHARACTER2 (share);
+ CHARACTER1 (cc);
}
st_parameter_inquire;
#define IOPARM_DT_HAS_SIGN (1 << 24)
#define IOPARM_DT_HAS_F2003 (1 << 25)
#define IOPARM_DT_HAS_UDTIO (1 << 26)
+#define IOPARM_DT_DEFAULT_EXP (1 << 27)
/* Internal use bit. */
#define IOPARM_DT_IONML_SET (1u << 31)
unsigned expanded_read : 1;
/* 13 unused bits. */
- /* Used for ungetc() style functionality. Possible values
- are an unsigned char, EOF, or EOF - 1 used to mark the
- field as not valid. */
- int last_char; /* No longer used, moved to gfc_unit. */
+ int child_saved_iostat;
int nml_delim;
int repeat_count;
int saved_length;
GFC_IO_INT not_used; /* Needed for alignment. */
formatted_dtio fdtio_ptr;
unformatted_dtio ufdtio_ptr;
+ /* With CC_FORTRAN, the first character of a record determines the
+ style of record end (and start) to use. We must mark down the type
+ when we write first in write_a so we remember the end type later in
+ next_record_w. */
+ struct
+ {
+ unsigned type : 6; /* See enum cc_fortran. */
+ unsigned len : 2; /* Always 0, 1, or 2. */
+ /* The union is updated after start-of-record is written. */
+ union
+ {
+ char start; /* Output character for start of record. */
+ char end; /* Output character for end of record. */
+ } u;
+ } cc;
} p;
/* This pad size must be equal to the pad_size declared in
trans-io.c (gfc_build_io_library_fndecls). The above structure
unit_round round;
unit_sign sign;
unit_async async;
+ unit_share share;
+ unit_cc cc;
+ int readonly;
}
unit_flags;
/* DTIO Parent/Child procedure, 0 = parent, >0 = child level. */
int child_dtio;
+
+ /* Used for ungetc() style functionality. Possible values
+ are an unsigned char, EOF, or EOF - 1 used to mark the
+ field as not valid. */
int last_char;
bool has_size;
GFC_IO_INT size_used;
extern gfc_offset max_offset;
internal_proto(max_offset);
+/* Default RECL for sequential access if not given in OPEN statement,
+ computed at library initialization time. */
+extern gfc_offset default_recl;
+internal_proto(default_recl);
+
/* Unit tree root. */
extern gfc_unit *unit_root;
internal_proto(unit_root);
extern gfc_unit *get_unit (st_parameter_dt *, int);
internal_proto(get_unit);
-extern void unlock_unit (gfc_unit *);
+extern void unlock_unit(gfc_unit *);
internal_proto(unlock_unit);
extern void finish_last_advance_record (gfc_unit *u);
-internal_proto (finish_last_advance_record);
+internal_proto(finish_last_advance_record);
-extern int unit_truncate (gfc_unit *, gfc_offset, st_parameter_common *);
-internal_proto (unit_truncate);
+extern int unit_truncate(gfc_unit *, gfc_offset, st_parameter_common *);
+internal_proto(unit_truncate);
extern int newunit_alloc (void);
internal_proto(newunit_alloc);
+extern void newunit_free (int);
+internal_proto(newunit_free);
+
/* open.c */
extern const char *type_name (bt);
internal_proto(type_name);
-extern void * read_block_form (st_parameter_dt *, int *);
+extern void * read_block_form (st_parameter_dt *, size_t *);
internal_proto(read_block_form);
-extern void * read_block_form4 (st_parameter_dt *, int *);
+extern void * read_block_form4 (st_parameter_dt *, size_t *);
internal_proto(read_block_form4);
-extern void *write_block (st_parameter_dt *, int);
+extern void *write_block (st_parameter_dt *, size_t);
internal_proto(write_block);
extern gfc_offset next_array_record (st_parameter_dt *, array_loop_spec *,
extern int convert_infnan (st_parameter_dt *, void *, const char *, int);
internal_proto(convert_infnan);
-extern void read_a (st_parameter_dt *, const fnode *, char *, int);
+extern void read_a (st_parameter_dt *, const fnode *, char *, size_t);
internal_proto(read_a);
-extern void read_a_char4 (st_parameter_dt *, const fnode *, char *, int);
+extern void read_a_char4 (st_parameter_dt *, const fnode *, char *, size_t);
internal_proto(read_a);
extern void read_f (st_parameter_dt *, const fnode *, char *, int);
extern void read_l (st_parameter_dt *, const fnode *, char *, int);
internal_proto(read_l);
-extern void read_x (st_parameter_dt *, int);
+extern void read_x (st_parameter_dt *, size_t);
internal_proto(read_x);
extern void read_radix (st_parameter_dt *, const fnode *, char *, int, int);
/* write.c */
-extern void write_a (st_parameter_dt *, const fnode *, const char *, int);
+extern void write_a (st_parameter_dt *, const fnode *, const char *, size_t);
internal_proto(write_a);
-extern void write_a_char4 (st_parameter_dt *, const fnode *, const char *, int);
+extern void write_a_char4 (st_parameter_dt *, const fnode *, const char *, size_t);
internal_proto(write_a_char4);
extern void write_b (st_parameter_dt *, const fnode *, const char *, int);