#include "gmqcc.h"
-#define QCVM_EXECUTOR
-
-#define _MEM_VEC_FUN_APPEND(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_append(Tself *s, Twhat *p, size_t c) \
-{ \
- Twhat *reall; \
- if (s->mem##_count+c >= s->mem##_alloc) { \
- if (!s->mem##_alloc) { \
- s->mem##_alloc = c < 16 ? 16 : c; \
- } else { \
- s->mem##_alloc *= 2; \
- if (s->mem##_count+c >= s->mem##_alloc) { \
- s->mem##_alloc = s->mem##_count+c; \
- } \
- } \
- reall = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc); \
- if (!reall) { \
- return false; \
- } \
- memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count); \
- mem_d(s->mem); \
- s->mem = reall; \
- } \
- memcpy(&s->mem[s->mem##_count], p, c*sizeof(*p)); \
- s->mem##_count += c; \
- return true; \
-}
+#include "exec.h"
-#define _MEM_VEC_FUN_RESIZE(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_resize(Tself *s, size_t c) \
-{ \
- Twhat *reall; \
- if (c > s->mem##_alloc) { \
- reall = (Twhat*)mem_a(sizeof(Twhat) * c); \
- if (!reall) { return false; } \
- memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count); \
- s->mem##_alloc = c; \
- mem_d(s->mem); \
- s->mem = reall; \
- return true; \
- } \
- s->mem##_count = c; \
- if (c < (s->mem##_alloc / 2)) { \
- reall = (Twhat*)mem_a(sizeof(Twhat) * c); \
- if (!reall) { return false; } \
- memcpy(reall, s->mem, sizeof(Twhat) * c); \
- mem_d(s->mem); \
- s->mem = reall; \
- } \
- return true; \
-}
-
-/* darkplaces has (or will have) a 64 bit prog loader
- * where the 32 bit qc program is autoconverted on load.
- * Since we may want to support that as well, let's redefine
- * float and int here.
- */
-typedef float qcfloat;
-typedef int32_t qcint;
-
-typedef union {
- qcint _int;
- qcint string;
- qcint function;
- qcint edict;
- qcfloat _float;
- qcfloat vector[3];
- qcint ivector[3];
-} qcany;
-
-typedef char qcfloat_size_is_correct [sizeof(qcfloat) == 4 ?1:-1];
-typedef char qcint_size_is_correct [sizeof(int) == 4 ?1:-1];
-
-typedef struct {
- uint32_t offset;
- uint32_t length;
-} prog_section;
-
-typedef struct {
- uint32_t version;
- uint16_t crc16;
- uint16_t skip;
-
- prog_section statements;
- prog_section defs;
- prog_section fields;
- prog_section functions;
- prog_section strings;
- prog_section globals;
- uint32_t entfield;
-} prog_header;
-
-typedef prog_section_both prog_def;
-typedef prog_section_function prog_function;
-typedef prog_section_statement prog_statement;
-
-enum {
- VMERR_OK,
- VMERR_TEMPSTRING_ALLOC,
-
- VMERR_END
-};
-
-#define JUMPS_DEFAULT 1000000
-
-#define VMXF_DEFAULT 0x0000
-#define VMXF_TRACE 0x0001
-#define VMXF_PROFILE 0x0002
-
-struct qc_program_s;
-
-typedef int (*prog_builtin)(struct qc_program_s *prog);
-
-typedef struct {
- qcint stmt;
- size_t localsp;
- prog_function *function;
-} qc_exec_stack;
-
-typedef struct qc_program_s {
- char *filename;
-
- MEM_VECTOR_MAKE(prog_statement, code);
- MEM_VECTOR_MAKE(prog_def, defs);
- MEM_VECTOR_MAKE(prog_def, fields);
- MEM_VECTOR_MAKE(prog_function, functions);
- MEM_VECTOR_MAKE(char, strings);
- MEM_VECTOR_MAKE(qcint, globals);
- MEM_VECTOR_MAKE(qcint, entitydata);
-
- size_t tempstring_start;
- size_t tempstring_at;
-
- qcint vmerror;
-
- MEM_VECTOR_MAKE(size_t, profile);
-
- MEM_VECTOR_MAKE(prog_builtin, builtins);
-
- /* size_t ip; */
- qcint entities;
- size_t entityfields;
- bool allowworldwrites;
-
- MEM_VECTOR_MAKE(qcint, localstack);
- MEM_VECTOR_MAKE(qc_exec_stack, stack);
- size_t statement;
-
- int argc; /* current arg count for debugging */
-} qc_program;
-MEM_VEC_FUNCTIONS(qc_program, prog_statement, code)
-MEM_VEC_FUNCTIONS(qc_program, prog_def, defs)
-MEM_VEC_FUNCTIONS(qc_program, prog_def, fields)
-MEM_VEC_FUNCTIONS(qc_program, prog_function, functions)
-MEM_VEC_FUNCTIONS(qc_program, char, strings)
-_MEM_VEC_FUN_APPEND(qc_program, char, strings)
-_MEM_VEC_FUN_RESIZE(qc_program, char, strings)
-MEM_VEC_FUNCTIONS(qc_program, qcint, globals)
-MEM_VEC_FUNCTIONS(qc_program, qcint, entitydata)
-
-MEM_VEC_FUNCTIONS(qc_program, qcint, localstack)
-_MEM_VEC_FUN_APPEND(qc_program, qcint, localstack)
-_MEM_VEC_FUN_RESIZE(qc_program, qcint, localstack)
-MEM_VEC_FUNCTIONS(qc_program, qc_exec_stack, stack)
-
-MEM_VEC_FUNCTIONS(qc_program, size_t, profile)
-_MEM_VEC_FUN_RESIZE(qc_program, size_t, profile)
+#define QCVM_EXECUTOR
qc_program* prog_load(const char *filename)
{