X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gmqcc.h;h=4e3fb399eba42b7604ac7b76b413d6cd74ec8e92;hb=4c48bae203c332ad51367ddc3d89681ef5eb0169;hp=48570ff7a6d0aa712385fd84fa98e437a79c877c;hpb=76278e8b97578f210b34784a55925b043098def9;p=xonotic%2Fgmqcc.git diff --git a/gmqcc.h b/gmqcc.h index 48570ff..4e3fb39 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -1,6 +1,10 @@ #ifndef GMQCC_HDR #define GMQCC_HDR #include +#include +#include +#include +using std::move; #include #include #include @@ -259,7 +263,7 @@ int util_getline(char **, size_t *, FILE *); /* code.c */ /* Note: if you change the order, fix type_sizeof in ir.c */ -enum { +enum qc_type { TYPE_VOID , TYPE_STRING , TYPE_FLOAT , @@ -498,6 +502,10 @@ typedef int32_t qcint_t; typedef uint32_t qcuint_t; struct code_t { + void* operator new(std::size_t); + void operator delete(void*); + code_t(); + ~code_t(); std::vector statements; std::vector linenums; std::vector columnnums; @@ -506,10 +514,10 @@ struct code_t { std::vector functions; std::vector globals; std::vector chars; - uint16_t crc; - uint32_t entfields; + uint16_t crc = 0; + uint32_t entfields = 0; ht string_cache; - qcint_t string_cached_empty; + qcint_t string_cached_empty = 0; }; /* @@ -581,15 +589,31 @@ extern size_t compile_errors; extern size_t compile_Werrors; extern size_t compile_warnings; -void /********/ compile_error (lex_ctx_t ctx, /*LVL_ERROR*/ const char *msg, ...); +void /********/ compile_error_ (lex_ctx_t ctx, /*LVL_ERROR*/ const char *msg, ...); void /********/ vcompile_error (lex_ctx_t ctx, /*LVL_ERROR*/ const char *msg, va_list ap); -bool GMQCC_WARN compile_warning (lex_ctx_t ctx, int warntype, const char *fmt, ...); +bool GMQCC_WARN compile_warning_(lex_ctx_t ctx, int warntype, const char *fmt, ...); bool GMQCC_WARN vcompile_warning(lex_ctx_t ctx, int warntype, const char *fmt, va_list ap); void compile_show_werrors(void); +template +inline constexpr const T formatNormalize(const T argument) { return argument; } + +inline const char *formatNormalize(const std::string &argument) { + return argument.c_str(); +} + +template +inline bool GMQCC_WARN compile_warning(lex_ctx_t ctx, int warntype, const char *fmt, const Ts&... ts) { + return compile_warning_(ctx, warntype, fmt, formatNormalize(ts)...); +} +template +inline void /********/ compile_error (lex_ctx_t ctx, /*LVL_ERROR*/ const char *msg, const Ts&... ts) { + return compile_error_(ctx, msg, formatNormalize(ts)...); +} + /* ir.c */ /* TODO: cleanup */ -enum store_types { +enum store_type { store_global, store_local, /* local, assignable for now, should get promoted later */ store_param, /* parameters, they are locals with a fixed position */