252 lines
7.3 KiB
C
252 lines
7.3 KiB
C
// vim:fileencoding=utf-8:foldmethod=marker
|
|
|
|
#ifndef DATATYPES_H
|
|
#define DATATYPES_H
|
|
|
|
#include "wapp_core.h"
|
|
#include "dbl_list.h"
|
|
#include "type_enums.h"
|
|
|
|
#define CENUM(NAME, VALUES, TYPEDEF) ((CEnum){ .name = (NAME), .values = (VALUES), .add_typedef = (TYPEDEF) })
|
|
#define CSTRUCT(NAME, ARGS, TYPEDEF_NAME_PTR) ((CStruct){ .name = (NAME), .args = (ARGS), .typedef_name = (TYPEDEF_NAME_PTR) })
|
|
|
|
#define CUSERTYPE_ENUM(ENUM) ((CUserType){ .kind = CUSERTYPE_CENUM, .type.c_enum = ENUM })
|
|
#define CUSERTYPE_STRUCT(STRUCT) ((CUserType){ .kind = CUSERTYPE_CSTRUCT, .type.c_struct = STRUCT })
|
|
|
|
#define CDATATYPE_CTYPE(VALUE) ((CDataType){ .kind = CDATATYPE_CTYPE, .type.c_type = (VALUE) })
|
|
#define CDATATYPE_USERTYPE(USERTYPE) ((CDataType){ .kind = CDATATYPE_CUSERTYPE, .type.c_usertype = (USERTYPE) })
|
|
#define CDATATYPE_STR(STR) ((CDataType){ .kind = CDATATYPE_STR, .type.str = (STR) })
|
|
|
|
#define CHEADERINCLUDE_STR(NAME) ((CHeaderInclude){ .kind = C_HEADER_INCLUDE_STR, .header.name = (NAME) })
|
|
#define CHEADERINCLUDE_CHEADER(CHEADER) ((CHeaderInclude){ .kind = C_HEADER_INCLUDE_HEADER, .header.header = (CHEADER) })
|
|
|
|
#define COBJECT_TYPE(VALUE) \
|
|
((CObject){ .kind = COBJECT_CTYPE, .object.c_type = (VALUE) })
|
|
#define COBJECT_QUALIFIER(VALUE) \
|
|
((CObject){ .kind = COBJECT_CQUALIFIER, .object.c_qualifier = (VALUE) })
|
|
#define COBJECT_POINTERTYPE(VALUE) \
|
|
((CObject){ .kind = COBJECT_CPOINTERTYPE, .object.c_pointertype = (VALUE) })
|
|
#define COBJECT_POINTER(CPOINTER) \
|
|
((CObject){ .kind = COBJECT_CPOINTER, .object.c_pointer = (CPOINTER) })
|
|
#define COBJECT_ENUMVAL(CENUMVAL) \
|
|
((CObject){ .kind = COBJECT_CENUMVAL, .object.c_enumval = (CENUMVAL) })
|
|
#define COBJECT_ENUM(ENUM) \
|
|
((CObject){ .kind = COBJECT_CENUM, .object.c_enum = (ENUM) })
|
|
#define COBJECT_MACRO(CMACRO) \
|
|
((CObject){ .kind = COBJECT_CMACRO, .object.c_macro = (CMACRO) })
|
|
#define COBJECT_STRUCT(STRUCT) \
|
|
((CObject){ .kind = COBJECT_CSTRUCT, .object.c_struct = STRUCT })
|
|
#define COBJECT_USERTYPE(USERTYPE) \
|
|
((CObject){ .kind = COBJECT_CUSERTYPE, .object.c_usertype = (USERTYPE) })
|
|
#define COBJECT_DATATYPE(DATATYPE) \
|
|
((CObject){ .kind = COBJECT_CDATATYPE, .object.c_datatype = (DATATYPE) })
|
|
#define COBJECT_ARG(CARG) \
|
|
((CObject){ .kind = COBJECT_CARG, .object.c_arg = (CARG) })
|
|
#define COBJECT_FUNC(CFUNC) \
|
|
((CObject){ .kind = COBJECT_CFUNC, .object.c_func = (CFUNC) })
|
|
#define COBJECT_INCULDE(CINCLUDE) \
|
|
((CObject){ .kind = COBJECT_CINCULDE, .object.c_include = (CINCLUDE) })
|
|
#define COBJECT_HEADER(CHEADER) \
|
|
((CObject){ .kind = COBJECT_CHEADER, .object.c_header = (CHEADER) })
|
|
#define COBJECT_SOURCE(CSOURCE) \
|
|
((CObject){ .kind = COBJECT_CSOURCE, .object.c_source = (CSOURCE) })
|
|
|
|
typedef enum {
|
|
CUSERTYPE_CENUM,
|
|
CUSERTYPE_CSTRUCT,
|
|
|
|
COUNT_CUSERTYPEKIND,
|
|
} CUserTypeKind;
|
|
|
|
typedef enum {
|
|
CDATATYPE_CTYPE,
|
|
CDATATYPE_CUSERTYPE,
|
|
CDATATYPE_STR,
|
|
|
|
COUNT_CDATATYPEKIND,
|
|
} CDataTypeKind;
|
|
|
|
typedef enum {
|
|
CFILE_EXT_H,
|
|
CFILE_EXT_C,
|
|
|
|
COUNT_CFILE_EXT,
|
|
} CFileExtension;
|
|
|
|
typedef enum {
|
|
C_HEADER_INCLUDE_STR,
|
|
C_HEADER_INCLUDE_HEADER,
|
|
|
|
COUNT_CHEADERINCLUDEKIND,
|
|
} CHeaderIncludeKind;
|
|
|
|
typedef enum {
|
|
COBJECT_CTYPE,
|
|
COBJECT_CQUALIFIER,
|
|
COBJECT_CPOINTERTYPE,
|
|
COBJECT_CPOINTER,
|
|
COBJECT_CENUMVAL,
|
|
COBJECT_CENUM,
|
|
COBJECT_CMACRO,
|
|
COBJECT_CSTRUCT,
|
|
COBJECT_CUSERTYPE,
|
|
COBJECT_CDATATYPE,
|
|
COBJECT_CARG,
|
|
COBJECT_CFUNC,
|
|
COBJECT_CINCULDE,
|
|
COBJECT_CHEADER,
|
|
COBJECT_CSOURCE,
|
|
|
|
COUNT_COBJECTKIND,
|
|
} CObjectKind;
|
|
|
|
typedef struct cpointer CPointer;
|
|
typedef struct cenumval CEnumVal;
|
|
typedef struct cenum CEnum;
|
|
typedef struct cmacro CMacro;
|
|
typedef struct cstruct CStruct;
|
|
typedef struct cusertype CUserType;
|
|
typedef struct cdatatype CDataType;
|
|
typedef struct carg CArg;
|
|
typedef struct cfunc CFunc;
|
|
typedef struct cheader_include CHeaderInclude;
|
|
typedef struct cinclude CInclude;
|
|
typedef struct cheader CHeader;
|
|
typedef struct csource CSource;
|
|
typedef struct cobject CObject;
|
|
|
|
struct cpointer {
|
|
CPointerType type;
|
|
CQualifier qualifier;
|
|
};
|
|
|
|
struct cenumval {
|
|
Str8 name;
|
|
i32 *value;
|
|
};
|
|
|
|
struct cenum {
|
|
Str8 name;
|
|
CEnumValList values;
|
|
b32 add_typedef;
|
|
};
|
|
|
|
struct cmacro {
|
|
Str8 name;
|
|
Str8 value;
|
|
};
|
|
|
|
struct cstruct {
|
|
Str8 name;
|
|
CArgList args;
|
|
Str8 typedef_name;
|
|
};
|
|
|
|
struct cusertype {
|
|
CUserTypeKind kind;
|
|
union {
|
|
CEnum c_enum;
|
|
CStruct c_struct;
|
|
} type;
|
|
};
|
|
|
|
struct cdatatype {
|
|
CDataTypeKind kind;
|
|
union {
|
|
CType c_type;
|
|
CUserType c_usertype;
|
|
Str8 str;
|
|
} type;
|
|
};
|
|
|
|
struct carg {
|
|
Str8 name;
|
|
CDataType type;
|
|
CPointer pointer;
|
|
CQualifier qualifier;
|
|
b32 is_array;
|
|
};
|
|
|
|
struct cfunc {
|
|
Str8 name;
|
|
CDataType ret_type;
|
|
CArgList args;
|
|
Str8 body;
|
|
CPointer pointer;
|
|
CQualifierList qualifiers;
|
|
};
|
|
|
|
#define CFILE_ARGS \
|
|
Str8 name; \
|
|
CFileExtension extension; \
|
|
CIncludeList includes; \
|
|
CUserTypeList types; \
|
|
CFuncList funcs; \
|
|
CStructList decl_types; \
|
|
CMacroList macros; \
|
|
CMacroList c_macros; \
|
|
CMacroList cpp_macros \
|
|
|
|
struct cheader {
|
|
CFILE_ARGS;
|
|
};
|
|
|
|
struct csource {
|
|
CFILE_ARGS;
|
|
CFuncList internal_funcs;
|
|
};
|
|
|
|
struct cheader_include {
|
|
CHeaderIncludeKind kind;
|
|
union {
|
|
Str8 name;
|
|
CHeader header;
|
|
} header;
|
|
};
|
|
|
|
struct cinclude {
|
|
CHeaderInclude header;
|
|
b32 is_local;
|
|
b32 same_dir;
|
|
};
|
|
|
|
struct cobject {
|
|
CObjectKind kind;
|
|
union {
|
|
CType c_type;
|
|
CQualifier c_qualifier;
|
|
CPointerType c_pointertype;
|
|
CPointer c_pointer;
|
|
CEnumVal c_enumval;
|
|
CEnum c_enum;
|
|
CMacro c_macro;
|
|
CStruct c_struct;
|
|
CUserType c_usertype;
|
|
CDataType c_datatype;
|
|
CArg c_arg;
|
|
CFunc c_func;
|
|
CInclude c_include;
|
|
CHeader c_header;
|
|
CSource c_source;
|
|
} object;
|
|
};
|
|
|
|
void cobject_to_string(Str8 *dst, const CObject *object);
|
|
void ctype_to_string(Str8 *dst, CType ctype);
|
|
void cqualifier_to_string(Str8 *dst, CQualifier cqualifier);
|
|
void cpointertype_to_string(Str8 *dst, CPointerType cpointertype);
|
|
void cpointer_to_string(Str8 *dst, const CPointer *cpointer);
|
|
void cenumval_to_string(Str8 *dst, const CEnumVal *cenumval);
|
|
void cenum_to_string(Str8 *dst, const CEnum *cenum);
|
|
void cmacro_to_string(Str8 *dst, const CMacro *cmacro);
|
|
void cstruct_to_string(Str8 *dst, const CStruct *cstruct);
|
|
void declare_cstruct(Str8 *dst, const CStruct *cstruct);
|
|
void define_cstruct(Str8 *dst, const CStruct *cstruct);
|
|
void cusertype_to_string(Str8 *dst, const CUserType *cusertype);
|
|
void cdatatype_to_string(Str8 *dst, const CDataType *cdatatype);
|
|
void carg_to_string(Str8 *dst, const CArg *carg);
|
|
void cinclude_to_string(Str8 *dst, const CInclude *cinclude);
|
|
b32 cheaderinclude_to_string(Str8 *dst, const CHeaderInclude *cheaderinclude);
|
|
|
|
#endif // !DATATYPES_H
|