#ifndef GMQCC_HDR
#define GMQCC_HDR
+#include <vector>
+#include <string>
+#include <utility>
+#include <memory>
+using std::move;
#include <stdarg.h>
#include <stddef.h>
#include <stdlib.h>
/* exposed interface */
#define vec_meta(A) ((vector_t*)(((char *)(A)) - sizeof(vector_t)))
-#define vec_free(A) ((void)((A) ? (_util_vec_delete((void *)(A)), (A) = NULL) : 0))
+#define vec_free(A) ((void)((A) ? (_util_vec_delete((void *)(A)), (A) = nullptr) : 0))
#define vec_push(A,V) (GMQCC_VEC_WILLGROW((A),1), (A)[vec_meta(A)->used++] = (V))
#define vec_size(A) ((A) ? vec_meta(A)->used : 0)
#define vec_add(A,N) (GMQCC_VEC_WILLGROW((A),(N)), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)])
/* code.c */
/* Note: if you change the order, fix type_sizeof in ir.c */
-enum {
+enum qc_type {
TYPE_VOID ,
TYPE_STRING ,
TYPE_FLOAT ,
/* TODO: elide */
extern const char *util_instr_str[VINSTR_END];
-void util_swap_header (prog_header_t *code_header);
-void util_swap_statements (prog_section_statement_t *statements);
-void util_swap_defs_fields(prog_section_both_t *section);
-void util_swap_functions (prog_section_function_t *functions);
-void util_swap_globals (int32_t *globals);
+void util_swap_header(prog_header_t &code_header);
+void util_swap_statements(std::vector<prog_section_statement_t> &statements);
+void util_swap_defs_fields(std::vector<prog_section_both_t> §ion);
+void util_swap_functions(std::vector<prog_section_function_t> &functions);
+void util_swap_globals(std::vector<int32_t> &globals);
-typedef float qcfloat_t;
-typedef int32_t qcint_t;
+typedef float qcfloat_t;
+typedef int32_t qcint_t;
typedef uint32_t qcuint_t;
struct code_t {
- prog_section_statement_t *statements;
- int *linenums;
- int *columnnums;
- prog_section_def_t *defs;
- prog_section_field_t *fields;
- prog_section_function_t *functions;
- int *globals;
- char *chars;
- uint16_t crc;
- uint32_t entfields;
- ht string_cache;
- qcint_t string_cached_empty;
+ void* operator new(std::size_t);
+ void operator delete(void*);
+ code_t();
+ ~code_t();
+ std::vector<prog_section_statement_t> statements;
+ std::vector<int> linenums;
+ std::vector<int> columnnums;
+ std::vector<prog_section_def_t> defs;
+ std::vector<prog_section_field_t> fields;
+ std::vector<prog_section_function_t> functions;
+ std::vector<int> globals;
+ std::vector<char> chars;
+ uint16_t crc = 0;
+ uint32_t entfields = 0;
+ ht string_cache;
+ qcint_t string_cached_empty = 0;
};
/*
*/
struct lex_ctx_t {
const char *file;
- size_t line;
- size_t column;
+ size_t line;
+ size_t column;
};
/*
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 <typename T>
+inline constexpr const T formatNormalize(const T argument) { return argument; }
+
+inline const char *formatNormalize(const std::string &argument) {
+ return argument.c_str();
+}
+
+template<typename... Ts>
+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<typename... Ts>
+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 */
};
struct qc_program_t {
- char *filename;
- prog_section_statement_t *code;
- prog_section_def_t *defs;
- prog_section_def_t *fields;
- prog_section_function_t *functions;
- char *strings;
- qcint_t *globals;
- qcint_t *entitydata;
- bool *entitypool;
-
- const char* *function_stack;
+ char *filename;
+ std::vector<prog_section_statement_t> code;
+ std::vector<prog_section_def_t> defs;
+ std::vector<prog_section_def_t> fields;
+ std::vector<prog_section_function_t> functions;
+ std::vector<char> strings;
+ std::vector<qcint_t> globals;
+ qcint_t *entitydata;
+ bool *entitypool;
+
+ const char* *function_stack;
uint16_t crc16;