X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gmqcc.h;h=02a8c891f57d5ee4638b66cbdfd8fd1ed7631cb4;hb=fe344cb5b29516f26105f0fe2aeaf66d4dbb6d34;hp=33346cef93e091c9f4f8c71736cc5f15218bdd09;hpb=5e23e8296d1d82df528481e04262a9e3afb38908;p=xonotic%2Fgmqcc.git diff --git a/gmqcc.h b/gmqcc.h index 33346ce..02a8c89 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -263,6 +263,15 @@ void _util_vec_grow(void **a, size_t i, size_t s); #define vec_shrinkto(A,N) (_vec_end(A) = (N)) #define vec_shrinkby(A,N) (_vec_end(A) -= (N)) +#define vec_upload(X,Y,S) \ + do { \ + size_t E = 0; \ + while (E < S) { \ + vec_push(X, Y[E]); \ + E ++; \ + } \ + } while(0) + typedef struct hash_table_t { size_t size; struct hash_node_t **table; @@ -332,22 +341,24 @@ enum { #define CV_NONE 0 #define CV_CONST 1 #define CV_VAR -1 +/* magic number to help parsing */ +#define CV_WRONG 0x8000 -extern const char *type_name[TYPE_COUNT]; +extern const char *type_name [TYPE_COUNT]; +extern size_t type_sizeof [TYPE_COUNT]; +extern uint16_t type_store_instr [TYPE_COUNT]; +extern uint16_t field_store_instr[TYPE_COUNT]; -extern size_t type_sizeof[TYPE_COUNT]; -extern uint16_t type_store_instr[TYPE_COUNT]; -extern uint16_t field_store_instr[TYPE_COUNT]; -/* could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F +/* + * could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F * but this breaks when TYPE_INTEGER is added, since with the enhanced * instruction set, the old ones are left untouched, thus the _I instructions * are at a seperate place. */ extern uint16_t type_storep_instr[TYPE_COUNT]; -/* other useful lists */ -extern uint16_t type_eq_instr[TYPE_COUNT]; -extern uint16_t type_ne_instr[TYPE_COUNT]; -extern uint16_t type_not_instr[TYPE_COUNT]; +extern uint16_t type_eq_instr [TYPE_COUNT]; +extern uint16_t type_ne_instr [TYPE_COUNT]; +extern uint16_t type_not_instr [TYPE_COUNT]; typedef struct { uint32_t offset; /* Offset in file of where data begins */ @@ -356,15 +367,15 @@ typedef struct { typedef struct { uint32_t version; /* Program version (6) */ - uint16_t crc16; /* What is this? */ - uint16_t skip; /* see propsal.txt */ + uint16_t crc16; + uint16_t skip; prog_section statements; /* prog_section_statement */ prog_section defs; /* prog_section_def */ prog_section fields; /* prog_section_field */ prog_section functions; /* prog_section_function */ - prog_section strings; /* What is this? */ - prog_section globals; /* What is this? */ + prog_section strings; + prog_section globals; uint32_t entfield; /* Number of entity fields */ } prog_header; @@ -414,7 +425,8 @@ typedef struct { } prog_section_statement; typedef struct { - /* The types: + /* + * The types: * 0 = ev_void * 1 = ev_string * 2 = ev_float @@ -429,6 +441,7 @@ typedef struct { uint16_t offset; uint32_t name; } prog_section_both; + typedef prog_section_both prog_section_def; typedef prog_section_both prog_section_field; @@ -443,7 +456,7 @@ typedef struct { uint32_t profile; /* Always zero (engine uses this) */ uint32_t name; /* name of function in string table */ uint32_t file; /* file of the source file */ - uint32_t nargs; /* number of arguments */ + int32_t nargs; /* number of arguments */ uint8_t argsize[8]; /* size of arguments (keep 8 always?) */ } prog_section_function; @@ -537,6 +550,7 @@ enum { }; extern prog_section_statement *code_statements; +extern int *code_linenums; extern prog_section_def *code_defs; extern prog_section_field *code_fields; extern prog_section_function *code_functions; @@ -551,12 +565,15 @@ typedef int32_t qcint; * code_write -- writes out the compiled file * code_init -- prepares the code file */ -bool code_write (const char *filename); +bool code_write (const char *filename, const char *lno); void code_init (); uint32_t code_genstring (const char *string); uint32_t code_cachedstring(const char *string); qcint code_alloc_field (size_t qcsize); +/* this function is used to keep statements and linenumbers together */ +void code_push_statement(prog_section_statement *stmt, int linenum); + /* * A shallow copy of a lex_file to remember where which ast node * came from. @@ -566,7 +583,6 @@ typedef struct { size_t line; } lex_ctx; - /*===================================================================*/ /*============================ con.c ================================*/ /*===================================================================*/ @@ -588,28 +604,29 @@ enum { LVL_ERROR }; - void con_vprintmsg (int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap); void con_printmsg (int level, const char *name, size_t line, const char *msgtype, const char *msg, ...); void con_cvprintmsg(void *ctx, int lvl, const char *msgtype, const char *msg, va_list ap); void con_cprintmsg (void *ctx, int lvl, const char *msgtype, const char *msg, ...); -void con_close(); -void con_color(int state); -void con_init (); -void con_reset(); -int con_change(const char *out, const char *err); -int con_verr (const char *fmt, va_list va); -int con_vout (const char *fmt, va_list va); -int con_err (const char *fmt, ...); -int con_out (const char *fmt, ...); +void con_close (); +void con_init (); +void con_reset (); +void con_color (int); +int con_change(const char *, const char *); +int con_verr (const char *, va_list); +int con_vout (const char *, va_list); +int con_err (const char *, ...); +int con_out (const char *, ...); /* error/warning interface */ extern size_t compile_errors; extern size_t compile_warnings; -void compile_error(lex_ctx ctx, const char *msg, ...); -bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...); +void /********/ compile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, ...); +bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...); +void /********/ vcompile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, va_list); +bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list); /*===================================================================*/ /*========================= assembler.c =============================*/ @@ -713,7 +730,8 @@ vector vec3_mulvf(vector, float); /*============================= exec.c ==============================*/ /*===================================================================*/ -/* darkplaces has (or will have) a 64 bit prog loader +/* + * 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. @@ -829,6 +847,7 @@ void ftepp_finish (); const char *ftepp_get (); void ftepp_flush (); void ftepp_add_define (const char *source, const char *name); +void ftepp_add_macro (const char *name, const char *value); /*===================================================================*/ /*======================= main.c commandline ========================*/ @@ -851,7 +870,7 @@ typedef uint32_t longbit; /* Used to store the list of flags with names */ typedef struct { const char *name; - longbit bit; + longbit bit; } opts_flag_def; /*===================================================================*/ @@ -909,25 +928,34 @@ enum { 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; -extern bool opts_dumpfin; -extern bool opts_dump; -extern bool opts_werror; -extern bool opts_forcecrc; -extern uint16_t opts_forced_crc; -extern bool opts_pp_only; -extern size_t opts_max_array_size; + +typedef struct { + uint32_t O; /* -Ox */ + const char *output; /* -o file */ + bool g; /* -g */ + int standard; /* -std= */ + bool debug; /* -debug */ + bool memchk; /* -memchk */ + bool dumpfin; /* -dumpfin */ + bool dump; /* -dump */ + bool werror; /* -Werror */ + bool forcecrc; /* --force-crc= */ + uint16_t forced_crc; /* --force-crc= */ + bool pp_only; /* -E */ + size_t max_array_size; /* --max-array= */ + + uint32_t flags [1 + (COUNT_FLAGS / 32)]; + uint32_t warn [1 + (COUNT_WARNINGS / 32)]; + uint32_t optimization[1 + (COUNT_OPTIMIZATIONS / 32)]; +} cmd_options; + +extern cmd_options opts; /*===================================================================*/ -#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)]; -#define OPTS_OPTIMIZATION(i) (!! (opts_optimization[(i)/32] & (1<< ((i)%32)))) -extern uint32_t opts_optimization[1 + (COUNT_OPTIMIZATIONS / 32)]; +#define OPTS_FLAG(i) (!! (opts.flags [(i)/32] & (1<< ((i)%32)))) +#define OPTS_WARN(i) (!! (opts.warn [(i)/32] & (1<< ((i)%32)))) +#define OPTS_OPTIMIZATION(i) (!! (opts.optimization[(i)/32] & (1<< ((i)%32)))) + +void options_set(uint32_t *flags, size_t idx, bool on); #endif