X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=beca3504a3bb4a5448b2ade23797d6c1dcb9267d;hp=650709dc938f6e056c454a1f6cc8b3453d155a1e;hb=7e3edea6211832e76918e385f299b7198d4e209b;hpb=a3919a6074d3182416a03d3cb0fcd9461d3cb37e diff --git a/gmqcc.h b/gmqcc.h index 650709d..beca350 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -198,6 +198,9 @@ void util_debug (const char *, const char *, ...); int util_getline (char **, size_t *, FILE *); void util_endianswap (void *, int, int); +size_t util_strtocmd (const char *, char *, size_t); +size_t util_strtononcmd (const char *, char *, size_t); + uint32_t util_crc32(const char *, int, register const short); #ifdef NOTRACK @@ -250,7 +253,7 @@ uint32_t util_crc32(const char *, int, register const short); while (N##_add(*++elements) != -1 && len--); \ return N##_elements; \ } \ - typedef char VECTOR_FILL(extra_semicolon_,__COUNTER__) + typedef char VECTOR_FILL(extra_semicolon_##N,__COUNTER__) #define VECTOR_PROT(T,N) \ extern T* N##_data ; \ extern long N##_elements ; \ @@ -276,8 +279,6 @@ enum { TYPE_FUNCTION , TYPE_POINTER , TYPE_INTEGER , - TYPE_QUATERNION , - TYPE_MATRIX , TYPE_VARIANT , TYPE_COUNT @@ -397,8 +398,8 @@ enum { INSTR_DONE, INSTR_MUL_F, INSTR_MUL_V, - INSTR_MUL_VF, INSTR_MUL_FV, + INSTR_MUL_VF, INSTR_DIV_F, INSTR_ADD_F, INSTR_ADD_V, @@ -461,23 +462,6 @@ enum { INSTR_BITAND, INSTR_BITOR, -/* warning: will be reordered */ - INSTR_MUL_Q, - INSTR_MUL_QF, - INSTR_MUL_M, - INSTR_MUL_MF, - INSTR_EQ_Q, - INSTR_EQ_M, - INSTR_NE_Q, - INSTR_NE_M, - INSTR_LOAD_Q, - INSTR_LOAD_M, - INSTR_STORE_Q, - INSTR_STORE_M, - INSTR_STOREP_Q, - INSTR_STOREP_M, - INSTR_INV_Q, - INSTR_INV_M, /* * Virtual instructions used by the assembler * keep at the end but before virtual instructions @@ -513,6 +497,9 @@ VECTOR_PROT(prog_section_function, code_functions ); VECTOR_PROT(int, code_globals ); VECTOR_PROT(char, code_chars ); +typedef float qcfloat; +typedef int32_t qcint; + /* * code_write -- writes out the compiled file * code_init -- prepares the code file @@ -521,6 +508,7 @@ bool code_write (const char *filename); void code_init (); uint32_t code_genstring (const char *string); uint32_t code_cachedstring(const char *string); +qcint code_alloc_field (size_t qcsize); /*===================================================================*/ /*========================= assembler.c =============================*/ @@ -533,8 +521,8 @@ static const struct { { "DONE" , 1, 4 }, { "MUL_F" , 3, 5 }, { "MUL_V" , 3, 5 }, - { "MUL_VF" , 3, 6 }, { "MUL_FV" , 3, 6 }, + { "MUL_VF" , 3, 6 }, { "DIV" , 0, 3 }, { "ADD_F" , 3, 5 }, { "ADD_V" , 3, 5 }, @@ -597,23 +585,6 @@ static const struct { { "BITAND" , 0, 6 }, { "BITOR" , 0, 5 }, - { "MUL_Q" , 3, 5 }, - { "MUL_QF" , 3, 6 }, - { "MUL_M" , 3, 5 }, - { "MUL_MF" , 3, 6 }, - { "EQ_Q" , 0, 4 }, - { "EQ_M" , 0, 4 }, - { "NE_Q" , 0, 4 }, - { "NE_M" , 0, 4 }, - { "FIELD_Q" , 0, 7 }, - { "FIELD_M" , 0, 7 }, - { "STORE_Q" , 0, 7 }, - { "STORE_M" , 0, 7 }, - { "STOREP_Q" , 0, 8 }, - { "STOREP_M" , 0, 8 }, - { "INV_Q" , 0, 5 }, - { "INV_M" , 0, 5 }, - { "END" , 0, 3 } /* virtual assembler instruction */ }; @@ -621,20 +592,6 @@ void asm_init (const char *, FILE **); void asm_close(FILE *); void asm_parse(FILE *); /*===================================================================*/ -/*============================= main.c ==============================*/ -/*===================================================================*/ -enum { - COMPILER_QCC, /* circa QuakeC */ - COMPILER_FTEQCC, /* fteqcc QuakeC */ - COMPILER_QCCX, /* qccx QuakeC */ - COMPILER_GMQCC /* this QuakeC */ -}; -extern bool opts_debug; -extern bool opts_memchk; -extern bool opts_darkplaces_stringtablebug; -extern bool opts_omit_nullcode; -extern int opts_compiler; -/*===================================================================*/ /*============================= ast.c ===============================*/ /*===================================================================*/ #define MEM_VECTOR_PROTO(Towner, Tmem, mem) \ @@ -819,14 +776,6 @@ typedef struct { float x, y, z; } vector; -typedef float matrix[4][4]; /* OpenGL layout */ -typedef float quaternion[4]; /* order: x, y, z, w */ -#define MATRIX(axis, elem) ((4*(axis)) + (elem)) -#define QUAT_X 0 -#define QUAT_Y 1 -#define QUAT_Z 2 -#define QUAT_W 3 - /* * A shallow copy of a lex_file to remember where which ast node * came from. @@ -845,9 +794,6 @@ typedef struct { * 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; @@ -895,6 +841,7 @@ typedef struct qc_program_s { MEM_VECTOR_MAKE(char, strings); MEM_VECTOR_MAKE(qcint, globals); MEM_VECTOR_MAKE(qcint, entitydata); + MEM_VECTOR_MAKE(bool, entitypool); size_t tempstring_start; size_t tempstring_at; @@ -928,4 +875,75 @@ 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); +/*===================================================================*/ +/*======================= main.c commandline ========================*/ +/*===================================================================*/ + +#if 0 +/* Helpers to allow for a whole lot of flags. Otherwise we'd limit + * to 32 or 64 -f options... + */ +typedef struct { + size_t idx; /* index into an array of 32 bit words */ + uint8_t bit; /* index _into_ the 32 bit word, thus just uint8 */ +} longbit; +#define LONGBIT(bit) { ((bit)/32), ((bit)%32) } +#else +typedef uint32_t longbit; +#define LONGBIT(bit) (bit) +#endif + +/* Used to store the list of flags with names */ +typedef struct { + const char *name; + longbit bit; +} opts_flag_def; + +/*===================================================================*/ +/* list of -f flags, like -fdarkplaces-string-table-bug */ +enum { +# define GMQCC_DEFINE_FLAG(X) X, +# include "flags.def" +# undef GMQCC_DEFINE_FLAG + COUNT_FLAGS +}; +static const opts_flag_def opts_flag_list[] = { +# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(X) }, +# include "flags.def" +# undef GMQCC_DEFINE_FLAG + { NULL, LONGBIT(0) } +}; + +enum { +# define GMQCC_DEFINE_FLAG(X) WARN_##X, +# include "warns.def" +# undef GMQCC_DEFINE_FLAG + COUNT_WARNINGS +}; +static const opts_flag_def opts_warn_list[] = { +# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(WARN_##X) }, +# include "warns.def" +# undef GMQCC_DEFINE_FLAG + { NULL, LONGBIT(0) } +}; + +/* other options: */ +enum { + COMPILER_QCC, /* circa QuakeC */ + COMPILER_FTEQCC, /* fteqcc QuakeC */ + COMPILER_QCCX, /* qccx QuakeC */ + COMPILER_GMQCC /* this QuakeC */ +}; +extern uint32_t opts_O; /* -Ox */ +extern const char *opts_output; /* -o file */ +extern int opts_standard; +extern bool opts_debug; +extern bool opts_memchk; + +/*===================================================================*/ +#define OPTS_FLAG(i) (!! (opts_flags[(i)/32] & (1<< ((i)%32)))) +extern uint32_t opts_flags[1 + (COUNT_FLAGS / 32)]; +#define OPTS_WARN(i) (!! (opts_warn[(i)/32] & (1<< ((i)%32)))) +extern uint32_t opts_warn[1 + (COUNT_WARNINGS / 32)]; + #endif