Reland "[flang][runtime] Enable I/O APIs in F18 runtime offload builds." (#87729)
This reverts commit 22089ae6c591d11143724b4bde418aa067958a8f.
This commit is contained in:
parent
25afb7768f
commit
f3c31d7040
@ -92,18 +92,18 @@ constexpr std::size_t RecommendedInternalIoScratchAreaBytes(
|
||||
|
||||
// Internal I/O to/from character arrays &/or non-default-kind character
|
||||
// requires a descriptor, which is copied.
|
||||
Cookie IONAME(BeginInternalArrayListOutput)(const Descriptor &,
|
||||
Cookie IODECL(BeginInternalArrayListOutput)(const Descriptor &,
|
||||
void **scratchArea = nullptr, std::size_t scratchBytes = 0,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalArrayListInput)(const Descriptor &,
|
||||
Cookie IODECL(BeginInternalArrayListInput)(const Descriptor &,
|
||||
void **scratchArea = nullptr, std::size_t scratchBytes = 0,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalArrayFormattedOutput)(const Descriptor &,
|
||||
Cookie IODECL(BeginInternalArrayFormattedOutput)(const Descriptor &,
|
||||
const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalArrayFormattedInput)(const Descriptor &,
|
||||
Cookie IODECL(BeginInternalArrayFormattedInput)(const Descriptor &,
|
||||
const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
@ -111,20 +111,20 @@ Cookie IONAME(BeginInternalArrayFormattedInput)(const Descriptor &,
|
||||
|
||||
// Internal I/O to/from a default-kind character scalar can avoid a
|
||||
// descriptor.
|
||||
Cookie IONAME(BeginInternalListOutput)(char *internal,
|
||||
Cookie IODECL(BeginInternalListOutput)(char *internal,
|
||||
std::size_t internalLength, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalListInput)(const char *internal,
|
||||
Cookie IODECL(BeginInternalListInput)(const char *internal,
|
||||
std::size_t internalLength, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalFormattedOutput)(char *internal,
|
||||
Cookie IODECL(BeginInternalFormattedOutput)(char *internal,
|
||||
std::size_t internalLength, const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginInternalFormattedInput)(const char *internal,
|
||||
Cookie IODECL(BeginInternalFormattedInput)(const char *internal,
|
||||
std::size_t internalLength, const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr,
|
||||
std::size_t scratchBytes = 0, const char *sourceFile = nullptr,
|
||||
@ -139,63 +139,63 @@ Cookie IONAME(BeginInternalFormattedInput)(const char *internal,
|
||||
// If handleError is false, and the unit number is out of range, the program
|
||||
// will be terminated. Otherwise, if unit is out of range, a nonzero Iostat
|
||||
// code is returned and ioMsg is set if it is not a nullptr.
|
||||
enum Iostat IONAME(CheckUnitNumberInRange64)(std::int64_t unit,
|
||||
enum Iostat IODECL(CheckUnitNumberInRange64)(std::int64_t unit,
|
||||
bool handleError, char *ioMsg = nullptr, std::size_t ioMsgLength = 0,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
enum Iostat IONAME(CheckUnitNumberInRange128)(common::int128_t unit,
|
||||
enum Iostat IODECL(CheckUnitNumberInRange128)(common::int128_t unit,
|
||||
bool handleError, char *ioMsg = nullptr, std::size_t ioMsgLength = 0,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// External synchronous I/O initiation
|
||||
Cookie IODECL(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginExternalListInput)(ExternalUnit = DefaultInputUnit,
|
||||
Cookie IODECL(BeginExternalListInput)(ExternalUnit = DefaultInputUnit,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginExternalFormattedOutput)(const char *format, std::size_t,
|
||||
Cookie IODECL(BeginExternalFormattedOutput)(const char *format, std::size_t,
|
||||
const Descriptor *formatDescriptor = nullptr,
|
||||
ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginExternalFormattedInput)(const char *format, std::size_t,
|
||||
Cookie IODECL(BeginExternalFormattedInput)(const char *format, std::size_t,
|
||||
const Descriptor *formatDescriptor = nullptr,
|
||||
ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr,
|
||||
int sourceLine = 0);
|
||||
Cookie IONAME(BeginUnformattedOutput)(ExternalUnit = DefaultOutputUnit,
|
||||
Cookie IODECL(BeginUnformattedOutput)(ExternalUnit = DefaultOutputUnit,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginUnformattedInput)(ExternalUnit = DefaultInputUnit,
|
||||
Cookie IODECL(BeginUnformattedInput)(ExternalUnit = DefaultInputUnit,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// WAIT(ID=)
|
||||
Cookie IONAME(BeginWait)(ExternalUnit, AsynchronousId,
|
||||
Cookie IODECL(BeginWait)(ExternalUnit, AsynchronousId,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
// WAIT(no ID=)
|
||||
Cookie IONAME(BeginWaitAll)(
|
||||
Cookie IODECL(BeginWaitAll)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// Other I/O statements
|
||||
Cookie IONAME(BeginClose)(
|
||||
Cookie IODECL(BeginClose)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginFlush)(
|
||||
Cookie IODECL(BeginFlush)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginBackspace)(
|
||||
Cookie IODECL(BeginBackspace)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginEndfile)(
|
||||
Cookie IODECL(BeginEndfile)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginRewind)(
|
||||
Cookie IODECL(BeginRewind)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// OPEN(UNIT=) and OPEN(NEWUNIT=) have distinct interfaces.
|
||||
Cookie IONAME(BeginOpenUnit)(
|
||||
Cookie IODECL(BeginOpenUnit)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginOpenNewUnit)(
|
||||
Cookie IODECL(BeginOpenNewUnit)(
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// The variant forms of INQUIRE() statements have distinct interfaces.
|
||||
// BeginInquireIoLength() is basically a no-op output statement.
|
||||
Cookie IONAME(BeginInquireUnit)(
|
||||
Cookie IODECL(BeginInquireUnit)(
|
||||
ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginInquireFile)(const char *, std::size_t,
|
||||
Cookie IODECL(BeginInquireFile)(const char *, std::size_t,
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
Cookie IONAME(BeginInquireIoLength)(
|
||||
Cookie IODECL(BeginInquireIoLength)(
|
||||
const char *sourceFile = nullptr, int sourceLine = 0);
|
||||
|
||||
// If an I/O statement has any IOSTAT=, ERR=, END=, or EOR= specifiers,
|
||||
@ -214,33 +214,33 @@ Cookie IONAME(BeginInquireIoLength)(
|
||||
// }
|
||||
// }
|
||||
// if (EndIoStatement(cookie) == FORTRAN_RUTIME_IOSTAT_END) goto label666;
|
||||
void IONAME(EnableHandlers)(Cookie, bool hasIoStat = false, bool hasErr = false,
|
||||
void IODECL(EnableHandlers)(Cookie, bool hasIoStat = false, bool hasErr = false,
|
||||
bool hasEnd = false, bool hasEor = false, bool hasIoMsg = false);
|
||||
|
||||
// ASYNCHRONOUS='YES' or 'NO' on READ/WRITE/OPEN
|
||||
// Use GetAsynchronousId() to handle ID=.
|
||||
bool IONAME(SetAsynchronous)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetAsynchronous)(Cookie, const char *, std::size_t);
|
||||
|
||||
// Control list options. These return false on a error that the
|
||||
// Begin...() call has specified will be handled by the caller.
|
||||
// The interfaces that pass a default-kind CHARACTER argument
|
||||
// are limited to passing specific case-insensitive keyword values.
|
||||
// ADVANCE=YES, NO
|
||||
bool IONAME(SetAdvance)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetAdvance)(Cookie, const char *, std::size_t);
|
||||
// BLANK=NULL, ZERO
|
||||
bool IONAME(SetBlank)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetBlank)(Cookie, const char *, std::size_t);
|
||||
// DECIMAL=COMMA, POINT
|
||||
bool IONAME(SetDecimal)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetDecimal)(Cookie, const char *, std::size_t);
|
||||
// DELIM=APOSTROPHE, QUOTE, NONE
|
||||
bool IONAME(SetDelim)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetDelim)(Cookie, const char *, std::size_t);
|
||||
// PAD=YES, NO
|
||||
bool IONAME(SetPad)(Cookie, const char *, std::size_t);
|
||||
bool IONAME(SetPos)(Cookie, std::int64_t);
|
||||
bool IONAME(SetRec)(Cookie, std::int64_t);
|
||||
bool IODECL(SetPad)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetPos)(Cookie, std::int64_t);
|
||||
bool IODECL(SetRec)(Cookie, std::int64_t);
|
||||
// ROUND=UP, DOWN, ZERO, NEAREST, COMPATIBLE, PROCESSOR_DEFINED
|
||||
bool IONAME(SetRound)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetRound)(Cookie, const char *, std::size_t);
|
||||
// SIGN=PLUS, SUPPRESS, PROCESSOR_DEFINED
|
||||
bool IONAME(SetSign)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetSign)(Cookie, const char *, std::size_t);
|
||||
|
||||
// Data item transfer for modes other than NAMELIST:
|
||||
// Any data object that can be passed as an actual argument without the
|
||||
@ -256,34 +256,34 @@ bool IONAME(SetSign)(Cookie, const char *, std::size_t);
|
||||
// Once the statement has encountered an error, all following items will be
|
||||
// ignored and also return false; but compiled code should check for errors
|
||||
// and avoid the following items when they might crash.
|
||||
bool IONAME(OutputDescriptor)(Cookie, const Descriptor &);
|
||||
bool IONAME(InputDescriptor)(Cookie, const Descriptor &);
|
||||
bool IODECL(OutputDescriptor)(Cookie, const Descriptor &);
|
||||
bool IODECL(InputDescriptor)(Cookie, const Descriptor &);
|
||||
// Formatted (including list directed) I/O data items
|
||||
bool IONAME(OutputInteger8)(Cookie, std::int8_t);
|
||||
bool IONAME(OutputInteger16)(Cookie, std::int16_t);
|
||||
bool IODECL(OutputInteger8)(Cookie, std::int8_t);
|
||||
bool IODECL(OutputInteger16)(Cookie, std::int16_t);
|
||||
bool IODECL(OutputInteger32)(Cookie, std::int32_t);
|
||||
bool IONAME(OutputInteger64)(Cookie, std::int64_t);
|
||||
bool IONAME(OutputInteger128)(Cookie, common::int128_t);
|
||||
bool IONAME(InputInteger)(Cookie, std::int64_t &, int kind = 8);
|
||||
bool IONAME(OutputReal32)(Cookie, float);
|
||||
bool IONAME(InputReal32)(Cookie, float &);
|
||||
bool IONAME(OutputReal64)(Cookie, double);
|
||||
bool IONAME(InputReal64)(Cookie, double &);
|
||||
bool IONAME(OutputComplex32)(Cookie, float, float);
|
||||
bool IONAME(InputComplex32)(Cookie, float[2]);
|
||||
bool IONAME(OutputComplex64)(Cookie, double, double);
|
||||
bool IONAME(InputComplex64)(Cookie, double[2]);
|
||||
bool IONAME(OutputCharacter)(Cookie, const char *, std::size_t, int kind = 1);
|
||||
bool IONAME(OutputAscii)(Cookie, const char *, std::size_t);
|
||||
bool IONAME(InputCharacter)(Cookie, char *, std::size_t, int kind = 1);
|
||||
bool IONAME(InputAscii)(Cookie, char *, std::size_t);
|
||||
bool IONAME(OutputLogical)(Cookie, bool);
|
||||
bool IONAME(InputLogical)(Cookie, bool &);
|
||||
bool IODECL(OutputInteger64)(Cookie, std::int64_t);
|
||||
bool IODECL(OutputInteger128)(Cookie, common::int128_t);
|
||||
bool IODECL(InputInteger)(Cookie, std::int64_t &, int kind = 8);
|
||||
bool IODECL(OutputReal32)(Cookie, float);
|
||||
bool IODECL(InputReal32)(Cookie, float &);
|
||||
bool IODECL(OutputReal64)(Cookie, double);
|
||||
bool IODECL(InputReal64)(Cookie, double &);
|
||||
bool IODECL(OutputComplex32)(Cookie, float, float);
|
||||
bool IODECL(InputComplex32)(Cookie, float[2]);
|
||||
bool IODECL(OutputComplex64)(Cookie, double, double);
|
||||
bool IODECL(InputComplex64)(Cookie, double[2]);
|
||||
bool IODECL(OutputCharacter)(Cookie, const char *, std::size_t, int kind = 1);
|
||||
bool IODECL(OutputAscii)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(InputCharacter)(Cookie, char *, std::size_t, int kind = 1);
|
||||
bool IODECL(InputAscii)(Cookie, char *, std::size_t);
|
||||
bool IODECL(OutputLogical)(Cookie, bool);
|
||||
bool IODECL(InputLogical)(Cookie, bool &);
|
||||
|
||||
// NAMELIST I/O must be the only data item in an (otherwise)
|
||||
// list-directed I/O statement.
|
||||
bool IONAME(OutputNamelist)(Cookie, const NamelistGroup &);
|
||||
bool IONAME(InputNamelist)(Cookie, const NamelistGroup &);
|
||||
bool IODECL(OutputNamelist)(Cookie, const NamelistGroup &);
|
||||
bool IODECL(InputNamelist)(Cookie, const NamelistGroup &);
|
||||
|
||||
// When an I/O list item has a derived type with a specific defined
|
||||
// I/O subroutine of the appropriate generic kind for the active
|
||||
@ -294,9 +294,9 @@ bool IONAME(InputNamelist)(Cookie, const NamelistGroup &);
|
||||
// made such a generic interface inaccessible), these data item transfer
|
||||
// APIs enable the I/O runtime to make the right calls to defined I/O
|
||||
// subroutines.
|
||||
bool IONAME(OutputDerivedType)(
|
||||
bool IODECL(OutputDerivedType)(
|
||||
Cookie, const Descriptor &, const NonTbpDefinedIoTable *);
|
||||
bool IONAME(InputDerivedType)(
|
||||
bool IODECL(InputDerivedType)(
|
||||
Cookie, const Descriptor &, const NonTbpDefinedIoTable *);
|
||||
|
||||
// Additional specifier interfaces for the connection-list of
|
||||
@ -304,56 +304,56 @@ bool IONAME(InputDerivedType)(
|
||||
// SetDelim(), GetIoMsg(), SetPad(), SetRound(), SetSign(),
|
||||
// & SetAsynchronous() are also acceptable for OPEN.
|
||||
// ACCESS=SEQUENTIAL, DIRECT, STREAM
|
||||
bool IONAME(SetAccess)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetAccess)(Cookie, const char *, std::size_t);
|
||||
// ACTION=READ, WRITE, or READWRITE
|
||||
bool IONAME(SetAction)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetAction)(Cookie, const char *, std::size_t);
|
||||
// CARRIAGECONTROL=LIST, FORTRAN, NONE
|
||||
bool IONAME(SetCarriagecontrol)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetCarriagecontrol)(Cookie, const char *, std::size_t);
|
||||
// CONVERT=NATIVE, LITTLE_ENDIAN, BIG_ENDIAN, or SWAP
|
||||
bool IONAME(SetConvert)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetConvert)(Cookie, const char *, std::size_t);
|
||||
// ENCODING=UTF-8, DEFAULT
|
||||
bool IONAME(SetEncoding)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetEncoding)(Cookie, const char *, std::size_t);
|
||||
// FORM=FORMATTED, UNFORMATTED
|
||||
bool IONAME(SetForm)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetForm)(Cookie, const char *, std::size_t);
|
||||
// POSITION=ASIS, REWIND, APPEND
|
||||
bool IONAME(SetPosition)(Cookie, const char *, std::size_t);
|
||||
bool IONAME(SetRecl)(Cookie, std::size_t); // RECL=
|
||||
bool IODECL(SetPosition)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetRecl)(Cookie, std::size_t); // RECL=
|
||||
|
||||
// STATUS can be set during an OPEN or CLOSE statement.
|
||||
// For OPEN: STATUS=OLD, NEW, SCRATCH, REPLACE, UNKNOWN
|
||||
// For CLOSE: STATUS=KEEP, DELETE
|
||||
bool IONAME(SetStatus)(Cookie, const char *, std::size_t);
|
||||
bool IODECL(SetStatus)(Cookie, const char *, std::size_t);
|
||||
|
||||
bool IONAME(SetFile)(Cookie, const char *, std::size_t chars);
|
||||
bool IODECL(SetFile)(Cookie, const char *, std::size_t chars);
|
||||
|
||||
// Acquires the runtime-created unit number for OPEN(NEWUNIT=)
|
||||
bool IONAME(GetNewUnit)(Cookie, int &, int kind = 4);
|
||||
bool IODECL(GetNewUnit)(Cookie, int &, int kind = 4);
|
||||
|
||||
// READ(SIZE=), after all input items
|
||||
std::size_t IONAME(GetSize)(Cookie);
|
||||
std::size_t IODECL(GetSize)(Cookie);
|
||||
|
||||
// INQUIRE(IOLENGTH=), after all output items
|
||||
std::size_t IONAME(GetIoLength)(Cookie);
|
||||
std::size_t IODECL(GetIoLength)(Cookie);
|
||||
|
||||
// GetIoMsg() does not modify its argument unless an error or
|
||||
// end-of-record/file condition is present.
|
||||
void IONAME(GetIoMsg)(Cookie, char *, std::size_t); // IOMSG=
|
||||
void IODECL(GetIoMsg)(Cookie, char *, std::size_t); // IOMSG=
|
||||
|
||||
// Defines ID= on READ/WRITE(ASYNCHRONOUS='YES')
|
||||
AsynchronousId IONAME(GetAsynchronousId)(Cookie);
|
||||
AsynchronousId IODECL(GetAsynchronousId)(Cookie);
|
||||
|
||||
// INQUIRE() specifiers are mostly identified by their NUL-terminated
|
||||
// case-insensitive names.
|
||||
// ACCESS, ACTION, ASYNCHRONOUS, BLANK, CONVERT, DECIMAL, DELIM, DIRECT,
|
||||
// ENCODING, FORM, FORMATTED, NAME, PAD, POSITION, READ, READWRITE, ROUND,
|
||||
// SEQUENTIAL, SIGN, STREAM, UNFORMATTED, WRITE:
|
||||
bool IONAME(InquireCharacter)(Cookie, InquiryKeywordHash, char *, std::size_t);
|
||||
bool IODECL(InquireCharacter)(Cookie, InquiryKeywordHash, char *, std::size_t);
|
||||
// EXIST, NAMED, OPENED, and PENDING (without ID):
|
||||
bool IONAME(InquireLogical)(Cookie, InquiryKeywordHash, bool &);
|
||||
bool IODECL(InquireLogical)(Cookie, InquiryKeywordHash, bool &);
|
||||
// PENDING with ID
|
||||
bool IONAME(InquirePendingId)(Cookie, AsynchronousId, bool &);
|
||||
bool IODECL(InquirePendingId)(Cookie, AsynchronousId, bool &);
|
||||
// NEXTREC, NUMBER, POS, RECL, SIZE
|
||||
bool IONAME(InquireInteger64)(
|
||||
bool IODECL(InquireInteger64)(
|
||||
Cookie, InquiryKeywordHash, std::int64_t &, int kind = 8);
|
||||
|
||||
// This function must be called to end an I/O statement, and its
|
||||
|
@ -49,6 +49,7 @@ static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) {
|
||||
}
|
||||
}
|
||||
|
||||
RT_OFFLOAD_API_GROUP_BEGIN
|
||||
Fortran::common::optional<Convert> GetConvertFromString(
|
||||
const char *x, std::size_t n) {
|
||||
static const char *keywords[]{
|
||||
@ -68,6 +69,7 @@ Fortran::common::optional<Convert> GetConvertFromString(
|
||||
return Fortran::common::nullopt;
|
||||
}
|
||||
}
|
||||
RT_OFFLOAD_API_GROUP_END
|
||||
|
||||
void ExecutionEnvironment::Configure(int ac, const char *av[],
|
||||
const char *env[], const EnvironmentDefaultList *envDefaults) {
|
||||
|
@ -31,7 +31,7 @@ RT_OFFLOAD_VAR_GROUP_END
|
||||
// External unformatted I/O data conversions
|
||||
enum class Convert { Unknown, Native, LittleEndian, BigEndian, Swap };
|
||||
|
||||
Fortran::common::optional<Convert> GetConvertFromString(
|
||||
RT_API_ATTRS Fortran::common::optional<Convert> GetConvertFromString(
|
||||
const char *, std::size_t);
|
||||
|
||||
struct ExecutionEnvironment {
|
||||
|
@ -52,6 +52,11 @@
|
||||
#define STD_STRCPY_UNSUPPORTED 1
|
||||
#endif
|
||||
|
||||
#if !defined(STD_STRCMP_UNSUPPORTED) && \
|
||||
(defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
|
||||
#define STD_STRCMP_UNSUPPORTED 1
|
||||
#endif
|
||||
|
||||
namespace Fortran::runtime {
|
||||
|
||||
#if STD_FILL_N_UNSUPPORTED
|
||||
@ -176,5 +181,19 @@ static inline RT_API_ATTRS char *strcpy(char *dest, const char *src) {
|
||||
using std::strcpy;
|
||||
#endif // !STD_STRCPY_UNSUPPORTED
|
||||
|
||||
#if STD_STRCMP_UNSUPPORTED
|
||||
// Provides alternative implementation for std::strcmp(), if
|
||||
// it is not supported.
|
||||
static inline RT_API_ATTRS int strcmp(const char *lhs, const char *rhs) {
|
||||
while (*lhs != '\0' && *lhs == *rhs) {
|
||||
++lhs;
|
||||
++rhs;
|
||||
}
|
||||
return static_cast<unsigned char>(*lhs) - static_cast<unsigned char>(*rhs);
|
||||
}
|
||||
#else // !STD_STRCMP_UNSUPPORTED
|
||||
using std::strcmp;
|
||||
#endif // !STD_STRCMP_UNSUPPORTED
|
||||
|
||||
} // namespace Fortran::runtime
|
||||
#endif // FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_
|
||||
|
@ -25,8 +25,9 @@
|
||||
#include <memory>
|
||||
|
||||
namespace Fortran::runtime::io {
|
||||
RT_EXT_API_GROUP_BEGIN
|
||||
|
||||
const char *InquiryKeywordHashDecode(
|
||||
RT_API_ATTRS const char *InquiryKeywordHashDecode(
|
||||
char *buffer, std::size_t n, InquiryKeywordHash hash) {
|
||||
if (n < 1) {
|
||||
return nullptr;
|
||||
@ -44,7 +45,7 @@ const char *InquiryKeywordHashDecode(
|
||||
}
|
||||
|
||||
template <Direction DIR>
|
||||
Cookie BeginInternalArrayListIO(const Descriptor &descriptor,
|
||||
RT_API_ATTRS Cookie BeginInternalArrayListIO(const Descriptor &descriptor,
|
||||
void ** /*scratchArea*/, std::size_t /*scratchBytes*/,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
Terminator oom{sourceFile, sourceLine};
|
||||
@ -54,14 +55,14 @@ Cookie BeginInternalArrayListIO(const Descriptor &descriptor,
|
||||
->ioStatementState();
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalArrayListOutput)(const Descriptor &descriptor,
|
||||
Cookie IODEF(BeginInternalArrayListOutput)(const Descriptor &descriptor,
|
||||
void **scratchArea, std::size_t scratchBytes, const char *sourceFile,
|
||||
int sourceLine) {
|
||||
return BeginInternalArrayListIO<Direction::Output>(
|
||||
descriptor, scratchArea, scratchBytes, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalArrayListInput)(const Descriptor &descriptor,
|
||||
Cookie IODEF(BeginInternalArrayListInput)(const Descriptor &descriptor,
|
||||
void **scratchArea, std::size_t scratchBytes, const char *sourceFile,
|
||||
int sourceLine) {
|
||||
return BeginInternalArrayListIO<Direction::Input>(
|
||||
@ -69,7 +70,7 @@ Cookie IONAME(BeginInternalArrayListInput)(const Descriptor &descriptor,
|
||||
}
|
||||
|
||||
template <Direction DIR>
|
||||
Cookie BeginInternalArrayFormattedIO(const Descriptor &descriptor,
|
||||
RT_API_ATTRS Cookie BeginInternalArrayFormattedIO(const Descriptor &descriptor,
|
||||
const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void ** /*scratchArea*/,
|
||||
std::size_t /*scratchBytes*/, const char *sourceFile, int sourceLine) {
|
||||
@ -80,7 +81,7 @@ Cookie BeginInternalArrayFormattedIO(const Descriptor &descriptor,
|
||||
->ioStatementState();
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalArrayFormattedOutput)(const Descriptor &descriptor,
|
||||
Cookie IODEF(BeginInternalArrayFormattedOutput)(const Descriptor &descriptor,
|
||||
const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void **scratchArea,
|
||||
std::size_t scratchBytes, const char *sourceFile, int sourceLine) {
|
||||
@ -89,7 +90,7 @@ Cookie IONAME(BeginInternalArrayFormattedOutput)(const Descriptor &descriptor,
|
||||
sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalArrayFormattedInput)(const Descriptor &descriptor,
|
||||
Cookie IODEF(BeginInternalArrayFormattedInput)(const Descriptor &descriptor,
|
||||
const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void **scratchArea,
|
||||
std::size_t scratchBytes, const char *sourceFile, int sourceLine) {
|
||||
@ -110,14 +111,14 @@ RT_API_ATTRS Cookie BeginInternalListIO(
|
||||
->ioStatementState();
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalListOutput)(char *internal,
|
||||
Cookie IODEF(BeginInternalListOutput)(char *internal,
|
||||
std::size_t internalLength, void **scratchArea, std::size_t scratchBytes,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
return BeginInternalListIO<Direction::Output>(internal, internalLength,
|
||||
scratchArea, scratchBytes, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalListInput)(const char *internal,
|
||||
Cookie IODEF(BeginInternalListInput)(const char *internal,
|
||||
std::size_t internalLength, void **scratchArea, std::size_t scratchBytes,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
return BeginInternalListIO<Direction::Input>(internal, internalLength,
|
||||
@ -125,7 +126,7 @@ Cookie IONAME(BeginInternalListInput)(const char *internal,
|
||||
}
|
||||
|
||||
template <Direction DIR>
|
||||
Cookie BeginInternalFormattedIO(
|
||||
RT_API_ATTRS Cookie BeginInternalFormattedIO(
|
||||
std::conditional_t<DIR == Direction::Input, const char, char> *internal,
|
||||
std::size_t internalLength, const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void ** /*scratchArea*/,
|
||||
@ -138,7 +139,7 @@ Cookie BeginInternalFormattedIO(
|
||||
->ioStatementState();
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalFormattedOutput)(char *internal,
|
||||
Cookie IODEF(BeginInternalFormattedOutput)(char *internal,
|
||||
std::size_t internalLength, const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void **scratchArea,
|
||||
std::size_t scratchBytes, const char *sourceFile, int sourceLine) {
|
||||
@ -147,7 +148,7 @@ Cookie IONAME(BeginInternalFormattedOutput)(char *internal,
|
||||
sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInternalFormattedInput)(const char *internal,
|
||||
Cookie IODEF(BeginInternalFormattedInput)(const char *internal,
|
||||
std::size_t internalLength, const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, void **scratchArea,
|
||||
std::size_t scratchBytes, const char *sourceFile, int sourceLine) {
|
||||
@ -227,24 +228,22 @@ RT_API_ATTRS Cookie BeginExternalListIO(
|
||||
}
|
||||
}
|
||||
|
||||
RT_EXT_API_GROUP_BEGIN
|
||||
Cookie IODEF(BeginExternalListOutput)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginExternalListIO<Direction::Output, ExternalListIoStatementState>(
|
||||
unitNumber, sourceFile, sourceLine);
|
||||
}
|
||||
RT_EXT_API_GROUP_END
|
||||
|
||||
Cookie IONAME(BeginExternalListInput)(
|
||||
Cookie IODEF(BeginExternalListInput)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginExternalListIO<Direction::Input, ExternalListIoStatementState>(
|
||||
unitNumber, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
template <Direction DIR>
|
||||
Cookie BeginExternalFormattedIO(const char *format, std::size_t formatLength,
|
||||
const Descriptor *formatDescriptor, ExternalUnit unitNumber,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
RT_API_ATTRS Cookie BeginExternalFormattedIO(const char *format,
|
||||
std::size_t formatLength, const Descriptor *formatDescriptor,
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
Cookie errorCookie{nullptr};
|
||||
ExternalFileUnit *unit{GetOrCreateUnit(
|
||||
@ -286,14 +285,14 @@ Cookie BeginExternalFormattedIO(const char *format, std::size_t formatLength,
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginExternalFormattedOutput)(const char *format,
|
||||
Cookie IODEF(BeginExternalFormattedOutput)(const char *format,
|
||||
std::size_t formatLength, const Descriptor *formatDescriptor,
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginExternalFormattedIO<Direction::Output>(format, formatLength,
|
||||
formatDescriptor, unitNumber, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginExternalFormattedInput)(const char *format,
|
||||
Cookie IODEF(BeginExternalFormattedInput)(const char *format,
|
||||
std::size_t formatLength, const Descriptor *formatDescriptor,
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginExternalFormattedIO<Direction::Input>(format, formatLength,
|
||||
@ -301,7 +300,7 @@ Cookie IONAME(BeginExternalFormattedInput)(const char *format,
|
||||
}
|
||||
|
||||
template <Direction DIR>
|
||||
Cookie BeginUnformattedIO(
|
||||
RT_API_ATTRS Cookie BeginUnformattedIO(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
Cookie errorCookie{nullptr};
|
||||
@ -352,19 +351,19 @@ Cookie BeginUnformattedIO(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginUnformattedOutput)(
|
||||
Cookie IODEF(BeginUnformattedOutput)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginUnformattedIO<Direction::Output>(
|
||||
unitNumber, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginUnformattedInput)(
|
||||
Cookie IODEF(BeginUnformattedInput)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return BeginUnformattedIO<Direction::Input>(
|
||||
unitNumber, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginOpenUnit)( // OPEN(without NEWUNIT=)
|
||||
Cookie IODEF(BeginOpenUnit)( // OPEN(without NEWUNIT=)
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
bool wasExtant{false};
|
||||
@ -384,7 +383,7 @@ Cookie IONAME(BeginOpenUnit)( // OPEN(without NEWUNIT=)
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginOpenNewUnit)( // OPEN(NEWUNIT=j)
|
||||
Cookie IODEF(BeginOpenNewUnit)( // OPEN(NEWUNIT=j)
|
||||
const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
ExternalFileUnit &unit{
|
||||
@ -394,7 +393,7 @@ Cookie IONAME(BeginOpenNewUnit)( // OPEN(NEWUNIT=j)
|
||||
sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginWait)(ExternalUnit unitNumber, AsynchronousId id,
|
||||
Cookie IODEF(BeginWait)(ExternalUnit unitNumber, AsynchronousId id,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
|
||||
@ -410,12 +409,12 @@ Cookie IONAME(BeginWait)(ExternalUnit unitNumber, AsynchronousId id,
|
||||
terminator, unitNumber, id == 0 ? IostatOk : IostatBadWaitUnit);
|
||||
}
|
||||
}
|
||||
Cookie IONAME(BeginWaitAll)(
|
||||
Cookie IODEF(BeginWaitAll)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
return IONAME(BeginWait)(unitNumber, 0 /*no ID=*/, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginClose)(
|
||||
Cookie IODEF(BeginClose)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
|
||||
@ -434,7 +433,7 @@ Cookie IONAME(BeginClose)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginFlush)(
|
||||
Cookie IODEF(BeginFlush)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
|
||||
@ -452,7 +451,7 @@ Cookie IONAME(BeginFlush)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginBackspace)(
|
||||
Cookie IODEF(BeginBackspace)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
|
||||
@ -470,7 +469,7 @@ Cookie IONAME(BeginBackspace)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginEndfile)(
|
||||
Cookie IODEF(BeginEndfile)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
Cookie errorCookie{nullptr};
|
||||
@ -490,7 +489,7 @@ Cookie IONAME(BeginEndfile)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginRewind)(
|
||||
Cookie IODEF(BeginRewind)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
Cookie errorCookie{nullptr};
|
||||
@ -510,7 +509,7 @@ Cookie IONAME(BeginRewind)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInquireUnit)(
|
||||
Cookie IODEF(BeginInquireUnit)(
|
||||
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
|
||||
@ -530,14 +529,14 @@ Cookie IONAME(BeginInquireUnit)(
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInquireFile)(const char *path, std::size_t pathLength,
|
||||
Cookie IODEF(BeginInquireFile)(const char *path, std::size_t pathLength,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
Terminator terminator{sourceFile, sourceLine};
|
||||
auto trimmed{SaveDefaultCharacter(
|
||||
path, TrimTrailingSpaces(path, pathLength), terminator)};
|
||||
if (ExternalFileUnit *
|
||||
unit{ExternalFileUnit::LookUp(
|
||||
trimmed.get(), std::strlen(trimmed.get()))}) {
|
||||
trimmed.get(), Fortran::runtime::strlen(trimmed.get()))}) {
|
||||
// INQUIRE(FILE=) to a connected unit
|
||||
if (ChildIo * child{unit->GetChildIo()}) {
|
||||
return &child->BeginIoStatement<InquireUnitState>(
|
||||
@ -554,7 +553,7 @@ Cookie IONAME(BeginInquireFile)(const char *path, std::size_t pathLength,
|
||||
}
|
||||
}
|
||||
|
||||
Cookie IONAME(BeginInquireIoLength)(const char *sourceFile, int sourceLine) {
|
||||
Cookie IODEF(BeginInquireIoLength)(const char *sourceFile, int sourceLine) {
|
||||
Terminator oom{sourceFile, sourceLine};
|
||||
return &New<InquireIOLengthState>{oom}(sourceFile, sourceLine)
|
||||
.release()
|
||||
@ -563,7 +562,7 @@ Cookie IONAME(BeginInquireIoLength)(const char *sourceFile, int sourceLine) {
|
||||
|
||||
// Control list items
|
||||
|
||||
void IONAME(EnableHandlers)(Cookie cookie, bool hasIoStat, bool hasErr,
|
||||
void IODEF(EnableHandlers)(Cookie cookie, bool hasIoStat, bool hasErr,
|
||||
bool hasEnd, bool hasEor, bool hasIoMsg) {
|
||||
IoErrorHandler &handler{cookie->GetIoErrorHandler()};
|
||||
if (hasIoStat) {
|
||||
@ -583,8 +582,8 @@ void IONAME(EnableHandlers)(Cookie cookie, bool hasIoStat, bool hasErr,
|
||||
}
|
||||
}
|
||||
|
||||
static bool YesOrNo(const char *keyword, std::size_t length, const char *what,
|
||||
IoErrorHandler &handler) {
|
||||
static RT_API_ATTRS bool YesOrNo(const char *keyword, std::size_t length,
|
||||
const char *what, IoErrorHandler &handler) {
|
||||
static const char *keywords[]{"YES", "NO", nullptr};
|
||||
switch (IdentifyValue(keyword, length, keywords)) {
|
||||
case 0:
|
||||
@ -598,8 +597,7 @@ static bool YesOrNo(const char *keyword, std::size_t length, const char *what,
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetAdvance)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetAdvance)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
bool nonAdvancing{!YesOrNo(keyword, length, "ADVANCE", handler)};
|
||||
@ -616,7 +614,7 @@ bool IONAME(SetAdvance)(
|
||||
return !handler.InError();
|
||||
}
|
||||
|
||||
bool IONAME(SetBlank)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetBlank)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
static const char *keywords[]{"NULL", "ZERO", nullptr};
|
||||
switch (IdentifyValue(keyword, length, keywords)) {
|
||||
@ -633,8 +631,7 @@ bool IONAME(SetBlank)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetDecimal)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetDecimal)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
static const char *keywords[]{"COMMA", "POINT", nullptr};
|
||||
switch (IdentifyValue(keyword, length, keywords)) {
|
||||
@ -651,7 +648,7 @@ bool IONAME(SetDecimal)(
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetDelim)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetDelim)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
static const char *keywords[]{"APOSTROPHE", "QUOTE", "NONE", nullptr};
|
||||
switch (IdentifyValue(keyword, length, keywords)) {
|
||||
@ -671,14 +668,14 @@ bool IONAME(SetDelim)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetPad)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetPad)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
io.mutableModes().pad = YesOrNo(keyword, length, "PAD", handler);
|
||||
return !handler.InError();
|
||||
}
|
||||
|
||||
bool IONAME(SetPos)(Cookie cookie, std::int64_t pos) {
|
||||
bool IODEF(SetPos)(Cookie cookie, std::int64_t pos) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (auto *unit{io.GetExternalFileUnit()}) {
|
||||
@ -689,7 +686,7 @@ bool IONAME(SetPos)(Cookie cookie, std::int64_t pos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IONAME(SetRec)(Cookie cookie, std::int64_t rec) {
|
||||
bool IODEF(SetRec)(Cookie cookie, std::int64_t rec) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (auto *unit{io.GetExternalFileUnit()}) {
|
||||
@ -705,7 +702,7 @@ bool IONAME(SetRec)(Cookie cookie, std::int64_t rec) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetRound)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetRound)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
static const char *keywords[]{"UP", "DOWN", "ZERO", "NEAREST", "COMPATIBLE",
|
||||
"PROCESSOR_DEFINED", nullptr};
|
||||
@ -735,7 +732,7 @@ bool IONAME(SetRound)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetSign)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetSign)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
static const char *keywords[]{
|
||||
"PLUS", "SUPPRESS", "PROCESSOR_DEFINED", nullptr};
|
||||
@ -754,7 +751,7 @@ bool IONAME(SetSign)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -790,7 +787,7 @@ bool IONAME(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetAction)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetAction)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -832,7 +829,7 @@ bool IONAME(SetAction)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetAsynchronous)(
|
||||
bool IODEF(SetAsynchronous)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
@ -859,7 +856,7 @@ bool IONAME(SetAsynchronous)(
|
||||
return !handler.InError();
|
||||
}
|
||||
|
||||
bool IONAME(SetCarriagecontrol)(
|
||||
bool IODEF(SetCarriagecontrol)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
@ -891,8 +888,7 @@ bool IONAME(SetCarriagecontrol)(
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetConvert)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetConvert)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -916,7 +912,7 @@ bool IONAME(SetConvert)(
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetEncoding)(
|
||||
bool IODEF(SetEncoding)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
@ -948,7 +944,7 @@ bool IONAME(SetEncoding)(
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetForm)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetForm)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -976,7 +972,7 @@ bool IONAME(SetForm)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetPosition)(
|
||||
bool IODEF(SetPosition)(
|
||||
Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
@ -1009,7 +1005,7 @@ bool IONAME(SetPosition)(
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IONAME(SetRecl)(Cookie cookie, std::size_t n) {
|
||||
bool IODEF(SetRecl)(Cookie cookie, std::size_t n) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -1036,7 +1032,7 @@ bool IONAME(SetRecl)(Cookie cookie, std::size_t n) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(SetStatus)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
bool IODEF(SetStatus)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
if (auto *open{io.get_if<OpenStatementState>()}) {
|
||||
if (open->completedOperation()) {
|
||||
@ -1090,7 +1086,7 @@ bool IONAME(SetStatus)(Cookie cookie, const char *keyword, std::size_t length) {
|
||||
"SetStatus() called when not in an OPEN or CLOSE statement");
|
||||
}
|
||||
|
||||
bool IONAME(SetFile)(Cookie cookie, const char *path, std::size_t chars) {
|
||||
bool IODEF(SetFile)(Cookie cookie, const char *path, std::size_t chars) {
|
||||
IoStatementState &io{*cookie};
|
||||
if (auto *open{io.get_if<OpenStatementState>()}) {
|
||||
if (open->completedOperation()) {
|
||||
@ -1107,7 +1103,7 @@ bool IONAME(SetFile)(Cookie cookie, const char *path, std::size_t chars) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IONAME(GetNewUnit)(Cookie cookie, int &unit, int kind) {
|
||||
bool IODEF(GetNewUnit)(Cookie cookie, int &unit, int kind) {
|
||||
IoStatementState &io{*cookie};
|
||||
auto *open{io.get_if<OpenStatementState>()};
|
||||
if (!open) {
|
||||
@ -1135,15 +1131,15 @@ bool IONAME(GetNewUnit)(Cookie cookie, int &unit, int kind) {
|
||||
|
||||
// Data transfers
|
||||
|
||||
bool IONAME(OutputDescriptor)(Cookie cookie, const Descriptor &descriptor) {
|
||||
bool IODEF(OutputDescriptor)(Cookie cookie, const Descriptor &descriptor) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputDescriptor)(Cookie cookie, const Descriptor &descriptor) {
|
||||
bool IODEF(InputDescriptor)(Cookie cookie, const Descriptor &descriptor) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputInteger8)(Cookie cookie, std::int8_t n) {
|
||||
bool IODEF(OutputInteger8)(Cookie cookie, std::int8_t n) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger8")) {
|
||||
return false;
|
||||
}
|
||||
@ -1154,7 +1150,7 @@ bool IONAME(OutputInteger8)(Cookie cookie, std::int8_t n) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputInteger16)(Cookie cookie, std::int16_t n) {
|
||||
bool IODEF(OutputInteger16)(Cookie cookie, std::int16_t n) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger16")) {
|
||||
return false;
|
||||
}
|
||||
@ -1165,7 +1161,6 @@ bool IONAME(OutputInteger16)(Cookie cookie, std::int16_t n) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
RT_EXT_API_GROUP_BEGIN
|
||||
bool IODEF(OutputInteger32)(Cookie cookie, std::int32_t n) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger32")) {
|
||||
return false;
|
||||
@ -1176,9 +1171,8 @@ bool IODEF(OutputInteger32)(Cookie cookie, std::int32_t n) {
|
||||
TypeCategory::Integer, 4, reinterpret_cast<void *>(&n), 0);
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
RT_EXT_API_GROUP_END
|
||||
|
||||
bool IONAME(OutputInteger64)(Cookie cookie, std::int64_t n) {
|
||||
bool IODEF(OutputInteger64)(Cookie cookie, std::int64_t n) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger64")) {
|
||||
return false;
|
||||
}
|
||||
@ -1190,7 +1184,7 @@ bool IONAME(OutputInteger64)(Cookie cookie, std::int64_t n) {
|
||||
}
|
||||
|
||||
#ifdef __SIZEOF_INT128__
|
||||
bool IONAME(OutputInteger128)(Cookie cookie, common::int128_t n) {
|
||||
bool IODEF(OutputInteger128)(Cookie cookie, common::int128_t n) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger128")) {
|
||||
return false;
|
||||
}
|
||||
@ -1202,7 +1196,7 @@ bool IONAME(OutputInteger128)(Cookie cookie, common::int128_t n) {
|
||||
}
|
||||
#endif
|
||||
|
||||
bool IONAME(InputInteger)(Cookie cookie, std::int64_t &n, int kind) {
|
||||
bool IODEF(InputInteger)(Cookie cookie, std::int64_t &n, int kind) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputInteger")) {
|
||||
return false;
|
||||
}
|
||||
@ -1213,7 +1207,7 @@ bool IONAME(InputInteger)(Cookie cookie, std::int64_t &n, int kind) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputReal32)(Cookie cookie, float x) {
|
||||
bool IODEF(OutputReal32)(Cookie cookie, float x) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputReal32")) {
|
||||
return false;
|
||||
}
|
||||
@ -1223,7 +1217,7 @@ bool IONAME(OutputReal32)(Cookie cookie, float x) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputReal64)(Cookie cookie, double x) {
|
||||
bool IODEF(OutputReal64)(Cookie cookie, double x) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputReal64")) {
|
||||
return false;
|
||||
}
|
||||
@ -1233,7 +1227,7 @@ bool IONAME(OutputReal64)(Cookie cookie, double x) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputReal32)(Cookie cookie, float &x) {
|
||||
bool IODEF(InputReal32)(Cookie cookie, float &x) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputReal32")) {
|
||||
return false;
|
||||
}
|
||||
@ -1243,7 +1237,7 @@ bool IONAME(InputReal32)(Cookie cookie, float &x) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputReal64)(Cookie cookie, double &x) {
|
||||
bool IODEF(InputReal64)(Cookie cookie, double &x) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputReal64")) {
|
||||
return false;
|
||||
}
|
||||
@ -1253,7 +1247,7 @@ bool IONAME(InputReal64)(Cookie cookie, double &x) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputComplex32)(Cookie cookie, float r, float i) {
|
||||
bool IODEF(OutputComplex32)(Cookie cookie, float r, float i) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputComplex32")) {
|
||||
return false;
|
||||
}
|
||||
@ -1265,7 +1259,7 @@ bool IONAME(OutputComplex32)(Cookie cookie, float r, float i) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputComplex64)(Cookie cookie, double r, double i) {
|
||||
bool IODEF(OutputComplex64)(Cookie cookie, double r, double i) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputComplex64")) {
|
||||
return false;
|
||||
}
|
||||
@ -1277,7 +1271,7 @@ bool IONAME(OutputComplex64)(Cookie cookie, double r, double i) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputComplex32)(Cookie cookie, float z[2]) {
|
||||
bool IODEF(InputComplex32)(Cookie cookie, float z[2]) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputComplex32")) {
|
||||
return false;
|
||||
}
|
||||
@ -1288,7 +1282,7 @@ bool IONAME(InputComplex32)(Cookie cookie, float z[2]) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputComplex64)(Cookie cookie, double z[2]) {
|
||||
bool IODEF(InputComplex64)(Cookie cookie, double z[2]) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputComplex64")) {
|
||||
return false;
|
||||
}
|
||||
@ -1299,7 +1293,7 @@ bool IONAME(InputComplex64)(Cookie cookie, double z[2]) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputCharacter)(
|
||||
bool IODEF(OutputCharacter)(
|
||||
Cookie cookie, const char *x, std::size_t length, int kind) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputCharacter")) {
|
||||
return false;
|
||||
@ -1311,11 +1305,11 @@ bool IONAME(OutputCharacter)(
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputAscii)(Cookie cookie, const char *x, std::size_t length) {
|
||||
bool IODEF(OutputAscii)(Cookie cookie, const char *x, std::size_t length) {
|
||||
return IONAME(OutputCharacter(cookie, x, length, 1));
|
||||
}
|
||||
|
||||
bool IONAME(InputCharacter)(
|
||||
bool IODEF(InputCharacter)(
|
||||
Cookie cookie, char *x, std::size_t length, int kind) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputCharacter")) {
|
||||
return false;
|
||||
@ -1326,11 +1320,11 @@ bool IONAME(InputCharacter)(
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputAscii)(Cookie cookie, char *x, std::size_t length) {
|
||||
bool IODEF(InputAscii)(Cookie cookie, char *x, std::size_t length) {
|
||||
return IONAME(InputCharacter)(cookie, x, length, 1);
|
||||
}
|
||||
|
||||
bool IONAME(OutputLogical)(Cookie cookie, bool truth) {
|
||||
bool IODEF(OutputLogical)(Cookie cookie, bool truth) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputLogical")) {
|
||||
return false;
|
||||
}
|
||||
@ -1341,7 +1335,7 @@ bool IONAME(OutputLogical)(Cookie cookie, bool truth) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(InputLogical)(Cookie cookie, bool &truth) {
|
||||
bool IODEF(InputLogical)(Cookie cookie, bool &truth) {
|
||||
if (!cookie->CheckFormattedStmtType<Direction::Input>("InputLogical")) {
|
||||
return false;
|
||||
}
|
||||
@ -1352,17 +1346,17 @@ bool IONAME(InputLogical)(Cookie cookie, bool &truth) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
|
||||
}
|
||||
|
||||
bool IONAME(OutputDerivedType)(Cookie cookie, const Descriptor &descriptor,
|
||||
bool IODEF(OutputDerivedType)(Cookie cookie, const Descriptor &descriptor,
|
||||
const NonTbpDefinedIoTable *table) {
|
||||
return descr::DescriptorIO<Direction::Output>(*cookie, descriptor, table);
|
||||
}
|
||||
|
||||
bool IONAME(InputDerivedType)(Cookie cookie, const Descriptor &descriptor,
|
||||
bool IODEF(InputDerivedType)(Cookie cookie, const Descriptor &descriptor,
|
||||
const NonTbpDefinedIoTable *table) {
|
||||
return descr::DescriptorIO<Direction::Input>(*cookie, descriptor, table);
|
||||
}
|
||||
|
||||
std::size_t IONAME(GetSize)(Cookie cookie) {
|
||||
std::size_t IODEF(GetSize)(Cookie cookie) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (!handler.InError()) {
|
||||
@ -1379,7 +1373,7 @@ std::size_t IONAME(GetSize)(Cookie cookie) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::size_t IONAME(GetIoLength)(Cookie cookie) {
|
||||
std::size_t IODEF(GetIoLength)(Cookie cookie) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (!handler.InError()) {
|
||||
@ -1395,7 +1389,7 @@ std::size_t IONAME(GetIoLength)(Cookie cookie) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void IONAME(GetIoMsg)(Cookie cookie, char *msg, std::size_t length) {
|
||||
void IODEF(GetIoMsg)(Cookie cookie, char *msg, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (!handler.InError()) {
|
||||
@ -1406,7 +1400,7 @@ void IONAME(GetIoMsg)(Cookie cookie, char *msg, std::size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
AsynchronousId IONAME(GetAsynchronousId)(Cookie cookie) {
|
||||
AsynchronousId IODEF(GetAsynchronousId)(Cookie cookie) {
|
||||
IoStatementState &io{*cookie};
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
if (auto *ext{io.get_if<ExternalIoStatementBase>()}) {
|
||||
@ -1419,24 +1413,24 @@ AsynchronousId IONAME(GetAsynchronousId)(Cookie cookie) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool IONAME(InquireCharacter)(Cookie cookie, InquiryKeywordHash inquiry,
|
||||
bool IODEF(InquireCharacter)(Cookie cookie, InquiryKeywordHash inquiry,
|
||||
char *result, std::size_t length) {
|
||||
IoStatementState &io{*cookie};
|
||||
return io.Inquire(inquiry, result, length);
|
||||
}
|
||||
|
||||
bool IONAME(InquireLogical)(
|
||||
bool IODEF(InquireLogical)(
|
||||
Cookie cookie, InquiryKeywordHash inquiry, bool &result) {
|
||||
IoStatementState &io{*cookie};
|
||||
return io.Inquire(inquiry, result);
|
||||
}
|
||||
|
||||
bool IONAME(InquirePendingId)(Cookie cookie, AsynchronousId id, bool &result) {
|
||||
bool IODEF(InquirePendingId)(Cookie cookie, AsynchronousId id, bool &result) {
|
||||
IoStatementState &io{*cookie};
|
||||
return io.Inquire(HashInquiryKeyword("PENDING"), id, result);
|
||||
}
|
||||
|
||||
bool IONAME(InquireInteger64)(
|
||||
bool IODEF(InquireInteger64)(
|
||||
Cookie cookie, InquiryKeywordHash inquiry, std::int64_t &result, int kind) {
|
||||
IoStatementState &io{*cookie};
|
||||
std::int64_t n{0}; // safe "undefined" value
|
||||
@ -1452,17 +1446,15 @@ bool IONAME(InquireInteger64)(
|
||||
return false;
|
||||
}
|
||||
|
||||
RT_EXT_API_GROUP_BEGIN
|
||||
enum Iostat IODEF(EndIoStatement)(Cookie cookie) {
|
||||
IoStatementState &io{*cookie};
|
||||
return static_cast<enum Iostat>(io.EndIoStatement());
|
||||
}
|
||||
RT_EXT_API_GROUP_END
|
||||
|
||||
template <typename INT>
|
||||
static enum Iostat CheckUnitNumberInRangeImpl(INT unit, bool handleError,
|
||||
char *ioMsg, std::size_t ioMsgLength, const char *sourceFile,
|
||||
int sourceLine) {
|
||||
static RT_API_ATTRS enum Iostat CheckUnitNumberInRangeImpl(INT unit,
|
||||
bool handleError, char *ioMsg, std::size_t ioMsgLength,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
static_assert(sizeof(INT) >= sizeof(ExternalUnit),
|
||||
"only intended to be used when the INT to ExternalUnit conversion is "
|
||||
"narrowing");
|
||||
@ -1494,15 +1486,15 @@ static enum Iostat CheckUnitNumberInRangeImpl(INT unit, bool handleError,
|
||||
return IostatOk;
|
||||
}
|
||||
|
||||
enum Iostat IONAME(CheckUnitNumberInRange64)(std::int64_t unit,
|
||||
bool handleError, char *ioMsg, std::size_t ioMsgLength,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
enum Iostat IODEF(CheckUnitNumberInRange64)(std::int64_t unit, bool handleError,
|
||||
char *ioMsg, std::size_t ioMsgLength, const char *sourceFile,
|
||||
int sourceLine) {
|
||||
return CheckUnitNumberInRangeImpl(
|
||||
unit, handleError, ioMsg, ioMsgLength, sourceFile, sourceLine);
|
||||
}
|
||||
|
||||
#ifdef __SIZEOF_INT128__
|
||||
enum Iostat IONAME(CheckUnitNumberInRange128)(common::int128_t unit,
|
||||
enum Iostat IODEF(CheckUnitNumberInRange128)(common::int128_t unit,
|
||||
bool handleError, char *ioMsg, std::size_t ioMsgLength,
|
||||
const char *sourceFile, int sourceLine) {
|
||||
return CheckUnitNumberInRangeImpl(
|
||||
@ -1525,3 +1517,5 @@ void std::__libcpp_verbose_abort(char const *format, ...) {
|
||||
std::abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
RT_EXT_API_GROUP_END
|
||||
|
@ -109,8 +109,6 @@ void IoErrorHandler::SignalPendingError() {
|
||||
SignalError(error);
|
||||
}
|
||||
|
||||
RT_OFFLOAD_API_GROUP_END
|
||||
|
||||
void IoErrorHandler::SignalErrno() { SignalError(errno); }
|
||||
|
||||
bool IoErrorHandler::GetIoMsg(char *buffer, std::size_t bufferLength) {
|
||||
@ -127,7 +125,10 @@ bool IoErrorHandler::GetIoMsg(char *buffer, std::size_t bufferLength) {
|
||||
// in LLVM v9.0.1 with inadequate modification for Fortran,
|
||||
// since rectified.
|
||||
bool ok{false};
|
||||
#if HAVE_STRERROR_R
|
||||
#if defined(RT_DEVICE_COMPILATION)
|
||||
// strerror_r is not available on device.
|
||||
msg = "errno description is not available on device";
|
||||
#elif HAVE_STRERROR_R
|
||||
// strerror_r is thread-safe.
|
||||
#if defined(__GLIBC__) && defined(_GNU_SOURCE)
|
||||
// glibc defines its own incompatible version of strerror_r
|
||||
@ -157,4 +158,6 @@ bool IoErrorHandler::GetIoMsg(char *buffer, std::size_t bufferLength) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
RT_OFFLOAD_API_GROUP_END
|
||||
} // namespace Fortran::runtime::io
|
||||
|
@ -61,7 +61,7 @@ public:
|
||||
RT_API_ATTRS void SignalPendingError();
|
||||
|
||||
RT_API_ATTRS int GetIoStat() const { return ioStat_; }
|
||||
bool GetIoMsg(char *, std::size_t);
|
||||
RT_API_ATTRS bool GetIoMsg(char *, std::size_t);
|
||||
|
||||
private:
|
||||
enum Flag : std::uint8_t {
|
||||
|
@ -17,16 +17,20 @@
|
||||
|
||||
namespace Fortran::runtime::io {
|
||||
|
||||
RT_VAR_GROUP_BEGIN
|
||||
// Max size of a group, symbol or component identifier that can appear in
|
||||
// NAMELIST input, plus a byte for NUL termination.
|
||||
static constexpr std::size_t nameBufferSize{201};
|
||||
static constexpr RT_CONST_VAR_ATTRS std::size_t nameBufferSize{201};
|
||||
RT_VAR_GROUP_END
|
||||
|
||||
static inline char32_t GetComma(IoStatementState &io) {
|
||||
RT_OFFLOAD_API_GROUP_BEGIN
|
||||
|
||||
static inline RT_API_ATTRS char32_t GetComma(IoStatementState &io) {
|
||||
return io.mutableModes().editingFlags & decimalComma ? char32_t{';'}
|
||||
: char32_t{','};
|
||||
}
|
||||
|
||||
bool IONAME(OutputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
bool IODEF(OutputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
IoStatementState &io{*cookie};
|
||||
io.CheckFormattedStmtType<Direction::Output>("OutputNamelist");
|
||||
io.mutableModes().inNamelist = true;
|
||||
@ -40,7 +44,8 @@ bool IONAME(OutputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
if ((connection.NeedAdvance(prefixLen) &&
|
||||
!(io.AdvanceRecord() && EmitAscii(io, " ", 1))) ||
|
||||
!EmitAscii(io, prefix, prefixLen) ||
|
||||
(connection.NeedAdvance(std::strlen(str) + (suffix != ' ')) &&
|
||||
(connection.NeedAdvance(
|
||||
Fortran::runtime::strlen(str) + (suffix != ' ')) &&
|
||||
!(io.AdvanceRecord() && EmitAscii(io, " ", 1)))) {
|
||||
return false;
|
||||
}
|
||||
@ -84,20 +89,20 @@ bool IONAME(OutputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
return EmitUpperCase("/", 1, "", ' ');
|
||||
}
|
||||
|
||||
static constexpr bool IsLegalIdStart(char32_t ch) {
|
||||
static constexpr RT_API_ATTRS bool IsLegalIdStart(char32_t ch) {
|
||||
return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_' ||
|
||||
ch == '@';
|
||||
}
|
||||
|
||||
static constexpr bool IsLegalIdChar(char32_t ch) {
|
||||
static constexpr RT_API_ATTRS bool IsLegalIdChar(char32_t ch) {
|
||||
return IsLegalIdStart(ch) || (ch >= '0' && ch <= '9');
|
||||
}
|
||||
|
||||
static constexpr char NormalizeIdChar(char32_t ch) {
|
||||
static constexpr RT_API_ATTRS char NormalizeIdChar(char32_t ch) {
|
||||
return static_cast<char>(ch >= 'A' && ch <= 'Z' ? ch - 'A' + 'a' : ch);
|
||||
}
|
||||
|
||||
static bool GetLowerCaseName(
|
||||
static RT_API_ATTRS bool GetLowerCaseName(
|
||||
IoStatementState &io, char buffer[], std::size_t maxLength) {
|
||||
std::size_t byteLength{0};
|
||||
if (auto ch{io.GetNextNonBlank(byteLength)}) {
|
||||
@ -119,7 +124,7 @@ static bool GetLowerCaseName(
|
||||
return false;
|
||||
}
|
||||
|
||||
static Fortran::common::optional<SubscriptValue> GetSubscriptValue(
|
||||
static RT_API_ATTRS Fortran::common::optional<SubscriptValue> GetSubscriptValue(
|
||||
IoStatementState &io) {
|
||||
Fortran::common::optional<SubscriptValue> value;
|
||||
std::size_t byteCount{0};
|
||||
@ -152,8 +157,8 @@ static Fortran::common::optional<SubscriptValue> GetSubscriptValue(
|
||||
return value;
|
||||
}
|
||||
|
||||
static bool HandleSubscripts(IoStatementState &io, Descriptor &desc,
|
||||
const Descriptor &source, const char *name) {
|
||||
static RT_API_ATTRS bool HandleSubscripts(IoStatementState &io,
|
||||
Descriptor &desc, const Descriptor &source, const char *name) {
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
// Allow for blanks in subscripts; they're nonstandard, but not
|
||||
// ambiguous within the parentheses.
|
||||
@ -252,7 +257,7 @@ static bool HandleSubscripts(IoStatementState &io, Descriptor &desc,
|
||||
return false;
|
||||
}
|
||||
|
||||
static void StorageSequenceExtension(
|
||||
static RT_API_ATTRS void StorageSequenceExtension(
|
||||
Descriptor &desc, const Descriptor &source) {
|
||||
// Support the near-universal extension of NAMELIST input into a
|
||||
// designatable storage sequence identified by its initial scalar array
|
||||
@ -274,7 +279,7 @@ static void StorageSequenceExtension(
|
||||
}
|
||||
}
|
||||
|
||||
static bool HandleSubstring(
|
||||
static RT_API_ATTRS bool HandleSubstring(
|
||||
IoStatementState &io, Descriptor &desc, const char *name) {
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
auto pair{desc.type().GetCategoryAndKind()};
|
||||
@ -335,7 +340,7 @@ static bool HandleSubstring(
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool HandleComponent(IoStatementState &io, Descriptor &desc,
|
||||
static RT_API_ATTRS bool HandleComponent(IoStatementState &io, Descriptor &desc,
|
||||
const Descriptor &source, const char *name) {
|
||||
IoErrorHandler &handler{io.GetIoErrorHandler()};
|
||||
char compName[nameBufferSize];
|
||||
@ -344,7 +349,8 @@ static bool HandleComponent(IoStatementState &io, Descriptor &desc,
|
||||
if (const typeInfo::DerivedType *
|
||||
type{addendum ? addendum->derivedType() : nullptr}) {
|
||||
if (const typeInfo::Component *
|
||||
comp{type->FindDataComponent(compName, std::strlen(compName))}) {
|
||||
comp{type->FindDataComponent(
|
||||
compName, Fortran::runtime::strlen(compName))}) {
|
||||
bool createdDesc{false};
|
||||
if (comp->rank() > 0 && source.rank() > 0) {
|
||||
// If base and component are both arrays, the component name
|
||||
@ -408,7 +414,7 @@ static bool HandleComponent(IoStatementState &io, Descriptor &desc,
|
||||
|
||||
// Advance to the terminal '/' of a namelist group or leading '&'/'$'
|
||||
// of the next.
|
||||
static void SkipNamelistGroup(IoStatementState &io) {
|
||||
static RT_API_ATTRS void SkipNamelistGroup(IoStatementState &io) {
|
||||
std::size_t byteCount{0};
|
||||
while (auto ch{io.GetNextNonBlank(byteCount)}) {
|
||||
io.HandleRelativePosition(byteCount);
|
||||
@ -431,7 +437,7 @@ static void SkipNamelistGroup(IoStatementState &io) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
bool IODEF(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
IoStatementState &io{*cookie};
|
||||
io.CheckFormattedStmtType<Direction::Input>("InputNamelist");
|
||||
io.mutableModes().inNamelist = true;
|
||||
@ -470,7 +476,7 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
handler.SignalError("NAMELIST input group has no name");
|
||||
return false;
|
||||
}
|
||||
if (std::strcmp(group.groupName, name) == 0) {
|
||||
if (Fortran::runtime::strcmp(group.groupName, name) == 0) {
|
||||
break; // found it
|
||||
}
|
||||
SkipNamelistGroup(io);
|
||||
@ -489,7 +495,7 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
}
|
||||
std::size_t itemIndex{0};
|
||||
for (; itemIndex < group.items; ++itemIndex) {
|
||||
if (std::strcmp(name, group.item[itemIndex].name) == 0) {
|
||||
if (Fortran::runtime::strcmp(name, group.item[itemIndex].name) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -590,8 +596,6 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
|
||||
return true;
|
||||
}
|
||||
|
||||
RT_OFFLOAD_API_GROUP_BEGIN
|
||||
|
||||
bool IsNamelistNameOrSlash(IoStatementState &io) {
|
||||
if (auto *listInput{
|
||||
io.get_if<ListDirectedStatementState<Direction::Input>>()}) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user