Skip to content
TypeSpecificIO

TypeSpecificIO

TypeSpecificIO

Description

Create TypeSpecificIO for type T

Parameters

Name Direction Description
T in Type specifier
d in Data pointer

Success

Returns initialized TypeSpecificIO structure

Failure

Function cannot fail - compile-time operation

Usage example (Cross-references)

Usage examples (Cross-references)
    }
    
    bool StrWriteFmtInternal(Str *o, const char *fmt, TypeSpecificIO *args, u64 argc) {
        if (!o || !fmt) {
            LOG_FATAL("Invalid arguments");
    
                // Get current argument
                TypeSpecificIO *arg = &args[arg_idx++];
                if (!arg->writer || !arg->data) {
    #if defined(_MSC_VER) || defined(__MSC_VER)
    }
    
    const char *StrReadFmtInternal(const char *input, const char *fmtstr, TypeSpecificIO *argv, u64 argc) {
        if (!input || !fmtstr) {
            LOG_FATAL("Invalid arguments");
    
                // Use the type-specific reader
                TypeSpecificIO *io = &argv[arg_index++];
                if (!io->reader) {
                    LOG_ERROR("Missing reader function");
    }
    
    void FReadFmtInternal(FILE *file, const char *fmtstr, TypeSpecificIO *argv, u64 argc) {
        if (!file || !fmtstr) {
            LOG_FATAL("Invalid arguments");
        TypeSpecificReader reader;
        void              *data;
    } TypeSpecificIO;
    
    #ifdef __cplusplus
    
    #ifdef __cplusplus
    #    define EMPTY_TYPE_SPECIFIC_IO() (TypeSpecificIO {NULL, NULL, NULL})
    #else
    #    define EMPTY_TYPE_SPECIFIC_IO() ((TypeSpecificIO) {NULL, NULL, NULL})
    #    define EMPTY_TYPE_SPECIFIC_IO() (TypeSpecificIO {NULL, NULL, NULL})
    #else
    #    define EMPTY_TYPE_SPECIFIC_IO() ((TypeSpecificIO) {NULL, NULL, NULL})
    #endif
    #endif
    
    static inline TypeSpecificIO TO_TYPE_SPECIFIC_IO_IMPL(TypeSpecificWriter w, TypeSpecificReader r, void *d) {
        return (TypeSpecificIO) {.writer = w, .reader = r, .data = d};
    }
    
    static inline TypeSpecificIO TO_TYPE_SPECIFIC_IO_IMPL(TypeSpecificWriter w, TypeSpecificReader r, void *d) {
        return (TypeSpecificIO) {.writer = w, .reader = r, .data = d};
    }
            _Generic(                                                                                                      \
                (x),                                                                                                       \
                TypeSpecificIO: (x),                                                                                       \
                Str: TO_TYPE_SPECIFIC_IO(Str, &(x)),                                                                       \
                Float: TO_TYPE_SPECIFIC_IO(Float, &(x)),                                                                   \
            _Generic(                                                                                                      \
                (x),                                                                                                       \
                TypeSpecificIO: (x),                                                                                       \
                Str: TO_TYPE_SPECIFIC_IO(Str, (void *)&(x)),                                                               \
                Float: TO_TYPE_SPECIFIC_IO(Float, (void *)&(x)),                                                           \
    /// TAGS: Formatting, I/O, String
    ///
    bool StrWriteFmtInternal(Str *o, const char *fmt, TypeSpecificIO *args, u64 argc);
    
    ///
    /// TAGS: Formatting, I/O, Parsing
    ///
    const char *StrReadFmtInternal(const char *input, const char *fmtstr, TypeSpecificIO *argv, u64 argc);
    
    ///
    /// TAGS: Formatting, I/O, File
    ///
    void FReadFmtInternal(FILE *stream, const char *fmtstr, TypeSpecificIO *argv, u64 argc);
    
    ///
            input,                                                                                                         \
            fmtstr,                                                                                                        \
            ((TypeSpecificIO[]) {                                                                                          \
                APPLY_MACRO_FOREACH(IOFMT_LVAL_APPEND_COMMA, __VA_ARGS__) {NULL, NULL, NULL}                               \
        })                                                                                                             \
    #define StrWriteFmt_IMPL2(input, fmtstr, varr)                                                                         \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO);                                                 \
            StrWriteFmtInternal((input), (fmtstr), argv_, argc_ - 1);                                                      \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO);                                                 \
            StrWriteFmtInternal((input), (fmtstr), argv_, argc_ - 1);                                                      \
        } while (0)
            input,                                                                                                         \
            fmtstr,                                                                                                        \
            ((TypeSpecificIO[]) {                                                                                          \
                APPLY_MACRO_FOREACH(IOFMT_APPEND_COMMA, __VA_ARGS__) {NULL, NULL, NULL}                                    \
        })                                                                                                             \
    #define StrReadFmt_IMPL2(input, fmtstr, varr)                                                                          \
        do {                                                                                                               \
            TypeSpecificIO *argv_     = &(varr)[0];                                                                        \
            char          **_p_input_ = (char **)(&(input));                                                               \
            u64             argc_     = sizeof(varr) / sizeof(TypeSpecificIO);                                             \
            TypeSpecificIO *argv_     = &(varr)[0];                                                                        \
            char          **_p_input_ = (char **)(&(input));                                                               \
            u64             argc_     = sizeof(varr) / sizeof(TypeSpecificIO);                                             \
            const char     *_input_   = StrReadFmtInternal((const char *)*(_p_input_), (fmtstr), argv_, argc_ - 1);        \
            (*_p_input_)              = (char *)(_input_) ? (char *)(_input_) : (*_p_input_);                              \
            file,                                                                                                          \
            fmtstr,                                                                                                        \
            ((TypeSpecificIO[]) {                                                                                          \
                APPLY_MACRO_FOREACH(IOFMT_APPEND_COMMA, __VA_ARGS__) {NULL, NULL, NULL}                                    \
        })                                                                                                             \
    #define FReadFmt_IMPL2(file, fmtstr, varr)                                                                             \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            FReadFmtInternal((file), (fmtstr), argv_, argc_);                                                              \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            FReadFmtInternal((file), (fmtstr), argv_, argc_);                                                              \
        } while (0)
            stream,                                                                                                        \
            fmtstr,                                                                                                        \
            ((TypeSpecificIO[]) {                                                                                          \
                APPLY_MACRO_FOREACH(IOFMT_LVAL_APPEND_COMMA, __VA_ARGS__) {NULL, NULL, NULL}                               \
        })                                                                                                             \
    #define FWriteFmt_IMPL2(stream, fmtstr, varr)                                                                          \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            Str             out_  = StrInit();                                                                             \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            Str             out_  = StrInit();                                                                             \
            StrWriteFmtInternal(&out_, (fmtstr), argv_, argc_);                                                            \
            stream,                                                                                                        \
            fmtstr,                                                                                                        \
            ((TypeSpecificIO[]) {                                                                                          \
                APPLY_MACRO_FOREACH(IOFMT_LVAL_APPEND_COMMA, __VA_ARGS__) {NULL, NULL, NULL}                               \
        })                                                                                                             \
    #define FWriteFmtLn_IMPL2(stream, fmtstr, varr)                                                                        \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            Str             out_  = StrInit();                                                                             \
        do {                                                                                                               \
            TypeSpecificIO *argv_ = &(varr)[0];                                                                            \
            u64             argc_ = sizeof(varr) / sizeof(TypeSpecificIO) - 1;                                             \
            Str             out_  = StrInit();                                                                             \
            StrWriteFmtInternal(&out_, (fmtstr), argv_, argc_);                                                            \
Last updated on