#include "gmqcc.h"
-#include "exec.h"
+MEM_VEC_FUNCTIONS(qc_program, prog_section_statement, code)
+MEM_VEC_FUNCTIONS(qc_program, prog_section_def, defs)
+MEM_VEC_FUNCTIONS(qc_program, prog_section_def, fields)
+MEM_VEC_FUNCTIONS(qc_program, prog_section_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)
static void loaderror(const char *fmt, ...)
{
+++ /dev/null
-/*
- * Copyright (C) 2012
- * Wolfgang Bumiller
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#ifndef GMQCC_EXEC_HDR
-#define GMQCC_EXEC_HDR
-
-/* 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(qcint) == 4 ?1:-1];
-
-enum {
- VMERR_OK,
- VMERR_TEMPSTRING_ALLOC,
-
- VMERR_END
-};
-
-#define VM_JUMPS_DEFAULT 1000000
-
-/* execute-flags */
-#define VMXF_DEFAULT 0x0000 /* default flags - nothing */
-#define VMXF_TRACE 0x0001 /* trace: print statements before executing */
-#define VMXF_PROFILE 0x0002 /* profile: increment the profile counters */
-
-struct qc_program_s;
-
-typedef int (*prog_builtin)(struct qc_program_s *prog);
-
-typedef struct {
- qcint stmt;
- size_t localsp;
- prog_section_function *function;
-} qc_exec_stack;
-
-typedef struct qc_program_s {
- char *filename;
-
- MEM_VECTOR_MAKE(prog_section_statement, code);
- MEM_VECTOR_MAKE(prog_section_def, defs);
- MEM_VECTOR_MAKE(prog_section_def, fields);
- MEM_VECTOR_MAKE(prog_section_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_section_statement, code)
-MEM_VEC_FUNCTIONS(qc_program, prog_section_def, defs)
-MEM_VEC_FUNCTIONS(qc_program, prog_section_def, fields)
-MEM_VEC_FUNCTIONS(qc_program, prog_section_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)
-
-qc_program* prog_load(const char *filename);
-void prog_delete(qc_program *prog);
-
-bool prog_exec(qc_program *prog, prog_section_function *func, size_t flags, long maxjumps);
-
-char* prog_getstring (qc_program *prog, qcint str);
-prog_section_def* prog_entfield (qc_program *prog, qcint off);
-prog_section_def* prog_getdef (qc_program *prog, qcint off);
-qcany* prog_getedict (qc_program *prog, qcint e);
-qcint prog_tempstring(qc_program *prog, const char *_str);
-
-#endif /* GMQCC_EXEC_HDR */
const char *file;
size_t line;
} lex_ctx;
+
+/*===================================================================*/
+/*============================= exec.c ==============================*/
+/*===================================================================*/
+
+/* 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(qcint) == 4 ?1:-1];
+
+enum {
+ VMERR_OK,
+ VMERR_TEMPSTRING_ALLOC,
+
+ VMERR_END
+};
+
+#define VM_JUMPS_DEFAULT 1000000
+
+/* execute-flags */
+#define VMXF_DEFAULT 0x0000 /* default flags - nothing */
+#define VMXF_TRACE 0x0001 /* trace: print statements before executing */
+#define VMXF_PROFILE 0x0002 /* profile: increment the profile counters */
+
+struct qc_program_s;
+
+typedef int (*prog_builtin)(struct qc_program_s *prog);
+
+typedef struct {
+ qcint stmt;
+ size_t localsp;
+ prog_section_function *function;
+} qc_exec_stack;
+
+typedef struct qc_program_s {
+ char *filename;
+
+ MEM_VECTOR_MAKE(prog_section_statement, code);
+ MEM_VECTOR_MAKE(prog_section_def, defs);
+ MEM_VECTOR_MAKE(prog_section_def, fields);
+ MEM_VECTOR_MAKE(prog_section_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;
+
+qc_program* prog_load(const char *filename);
+void prog_delete(qc_program *prog);
+
+bool prog_exec(qc_program *prog, prog_section_function *func, size_t flags, long maxjumps);
+
+char* prog_getstring (qc_program *prog, qcint str);
+prog_section_def* prog_entfield (qc_program *prog, qcint off);
+prog_section_def* prog_getdef (qc_program *prog, qcint off);
+qcany* prog_getedict (qc_program *prog, qcint e);
+qcint prog_tempstring(qc_program *prog, const char *_str);
+
#endif