X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gmqcc.h;h=158463332e78a31ca40ab91d91f67336c2d574c0;hb=b2cb612c703a8135b50fbcbfcab4f9ce7df0c4ce;hp=c0b5fb3ce4c3cfb46046bc5429f3fdc47070bae8;hpb=5b4c7a67a7be71e070f73a88e9ee83743b7472ca;p=xonotic%2Fgmqcc.git diff --git a/gmqcc.h b/gmqcc.h index c0b5fb3..1584633 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -34,10 +34,10 @@ * of my time. */ #ifdef _MSC_VER -# pragma warning(disable : 4244 ) // conversion from 'int' to 'float', possible loss of data -# pragma warning(disable : 4018 ) // signed/unsigned mismatch -# pragma warning(disable : 4996 ) // This function or variable may be unsafe -# pragma warning(disable : 4700 ) // uninitialized local variable used +# pragma warning(disable : 4244 ) /* conversion from 'int' to 'float', possible loss of data */ +# pragma warning(disable : 4018 ) /* signed/unsigned mismatch */ +# pragma warning(disable : 4996 ) /* This function or variable may be unsafe */ +# pragma warning(disable : 4700 ) /* uninitialized local variable used */ #endif #define GMQCC_VERSION_MAJOR 0 @@ -189,6 +189,8 @@ typedef char intptr_size_is_correct [sizeof(uintptr_t)== sizeof(int*)?1:-1]; /*===================================================================*/ /*=========================== util.c ================================*/ /*===================================================================*/ +FILE *util_fopen(const char *filename, const char *mode); + void *util_memory_a (unsigned int, unsigned int, const char *); void util_memory_d (void *, unsigned int, const char *); void util_meminfo (); @@ -388,6 +390,10 @@ typedef struct { typedef prog_section_both prog_section_def; typedef prog_section_both prog_section_field; +/* this is ORed to the type */ +#define DEF_SAVEGLOBAL (1<<15) +#define DEF_TYPEMASK ((1<<15)-1) + typedef struct { int32_t entry; /* in statement table for instructions */ uint32_t firstlocal; /* First local in local table */ @@ -408,8 +414,8 @@ enum { INSTR_DONE, INSTR_MUL_F, INSTR_MUL_V, - INSTR_MUL_FV, - INSTR_MUL_VF, + INSTR_MUL_FV, /* NOTE: the float operands must NOT be at the same locations: A != C */ + INSTR_MUL_VF, /* and here: B != C */ INSTR_DIV_F, INSTR_ADD_F, INSTR_ADD_V, @@ -537,7 +543,7 @@ static const struct { { "ADD_F" , 3, 5 }, { "ADD_V" , 3, 5 }, { "SUB_F" , 3, 5 }, - { "DUB_V" , 3, 5 }, + { "SUB_V" , 3, 5 }, { "EQ_F" , 0, 4 }, { "EQ_V" , 0, 4 }, { "EQ_S" , 0, 4 }, @@ -684,22 +690,23 @@ bool GMQCC_WARN Tself##_##mem##_find(Tself *self, Twhat obj, size_t *idx) \ 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##_count+c > s->mem##_alloc) { \ if (!s->mem##_alloc) { \ s->mem##_alloc = c < 16 ? 16 : c; \ + s->mem = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc); \ } 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; \ } \ - 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; \ @@ -715,6 +722,7 @@ bool GMQCC_WARN Tself##_##mem##_resize(Tself *s, size_t c) \ if (!reall) { return false; } \ memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count); \ s->mem##_alloc = c; \ + s->mem##_count = c; \ mem_d(s->mem); \ s->mem = reall; \ return true; \ @@ -783,7 +791,7 @@ enum store_types { }; typedef struct { - float x, y, z; + qcfloat x, y, z; } vector; vector vec3_add (vector, vector); @@ -858,6 +866,8 @@ typedef struct qc_program_s { MEM_VECTOR_MAKE(qcint, entitydata); MEM_VECTOR_MAKE(bool, entitypool); + uint16_t crc16; + size_t tempstring_start; size_t tempstring_at; @@ -876,6 +886,8 @@ typedef struct qc_program_s { MEM_VECTOR_MAKE(qc_exec_stack, stack); size_t statement; + size_t xflags; + int argc; /* current arg count for debugging */ } qc_program; @@ -991,6 +1003,9 @@ extern int opts_standard; extern bool opts_debug; extern bool opts_memchk; extern bool opts_dump; +extern bool opts_werror; +extern bool opts_forcecrc; +extern uint16_t opts_forced_crc; /*===================================================================*/ #define OPTS_FLAG(i) (!! (opts_flags[(i)/32] & (1<< ((i)%32))))