From 080e6e5dfb4e81a006e29c82a648816158dfb798 Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Wed, 27 Jun 2012 22:31:56 +0200 Subject: [PATCH] exec.h -> gmqcc.h --- exec.c | 18 +++++++- exec.h | 132 -------------------------------------------------------- gmqcc.h | 93 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 133 deletions(-) delete mode 100644 exec.h diff --git a/exec.c b/exec.c index be2e8c2..e76eb4b 100644 --- a/exec.c +++ b/exec.c @@ -4,7 +4,23 @@ #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, ...) { diff --git a/exec.h b/exec.h deleted file mode 100644 index f8ff6bc..0000000 --- a/exec.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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 */ diff --git a/gmqcc.h b/gmqcc.h index 91ad7a3..e9e153e 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -858,4 +858,97 @@ typedef struct { 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