X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=7834a24fd59216b580d2a92c3ff8e78e105cb4e0;hp=aa6f99534efba3e218e3a48f39c4bff5de2b509c;hb=f1ab19ba0bf61491c9a9ae07a3c66fbe8b921bd4;hpb=4583cb8280dacaf514fcf5f1666663808180eae4 diff --git a/gmqcc.h b/gmqcc.h index aa6f995..7834a24 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 + * Copyright (C) 2012, 2013, 2014 * Dale Weiler * Wolfgang Bumiller * @@ -75,7 +75,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ #else # ifdef _MSC_VER /* conversion from 'int' to 'float', possible loss of data */ -# pragma warning(disable : 4244 ) +# pragma warning(disable : 4244) typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; @@ -88,6 +88,11 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define GMQCC_FORCEINLINE __forceinline # define GMQCC_INLINE __inline # define GMQCC_RESTRICT __restrict +# else +# define GMQCC_NORETURN +# define GMQCC_FORCEINLINE +# define GMQCC_INLINE +# define GMQCC_RESTRICT # endif # define GMQCC_LIKELY(X) (X) # define GMQCC_UNLIKELY(X) (X) @@ -175,12 +180,12 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ /* stat.c */ void stat_info (void); char *stat_mem_strdup (const char *, size_t, const char *, bool); +void stat_mem_deallocate(void *, size_t, const char *); void *stat_mem_reallocate(void *, size_t, size_t, const char *, const char *); -void stat_mem_deallocate(void *); void *stat_mem_allocate (size_t, size_t, const char *, const char *); #define mem_a(SIZE) stat_mem_allocate ((SIZE), __LINE__, __FILE__, #SIZE) -#define mem_d(PTRN) stat_mem_deallocate((void*)(PTRN)) +#define mem_d(PTRN) stat_mem_deallocate((void*)(PTRN), __LINE__, __FILE__) #define mem_r(PTRN, SIZE) stat_mem_reallocate((void*)(PTRN), (SIZE), __LINE__, __FILE__, #SIZE) #define mem_af(SIZE, FILE, LINE) stat_mem_allocate ((SIZE), (LINE), (FILE), #SIZE) @@ -208,9 +213,10 @@ void *stat_mem_allocate (size_t, size_t, const char *, const char *); #define util_isprint(a) (((unsigned)(a)-0x20) < 0x5F) #define util_isspace(a) (((a) >= 9 && (a) <= 13) || (a) == ' ') -bool util_strupper (const char *); -bool util_strdigit (const char *); -void util_endianswap (void *, size_t, unsigned int); +bool util_strupper(const char *); +bool util_strdigit(const char *); + +void util_endianswap(void *, size_t, unsigned int); size_t util_strtocmd (const char *, char *, size_t); size_t util_strtononcmd (const char *, char *, size_t); @@ -234,6 +240,7 @@ const char *util_ctime (const time_t *timer); typedef struct fs_file_s fs_file_t; bool util_isatty(fs_file_t *); +size_t hash(const char *key); /* * A flexible vector implementation: all vector pointers contain some @@ -251,6 +258,8 @@ typedef struct { /* hidden interface */ void _util_vec_grow(void **a, size_t i, size_t s); +void _util_vec_delete(void *vec, size_t line, const char *file); + #define GMQCC_VEC_WILLGROW(X,Y) ( \ ((!(X) || vec_meta(X)->used + Y >= vec_meta(X)->allocated)) ? \ (void)_util_vec_grow(((void**)&(X)), (Y), sizeof(*(X))) : \ @@ -258,8 +267,8 @@ void _util_vec_grow(void **a, size_t i, size_t s); ) /* exposed interface */ -#define vec_meta(A) (((vector_t*)((void*)A)) - 1) -#define vec_free(A) ((void)((A) ? (mem_d((void*)vec_meta(A)), (A) = NULL) : 0)) +#define vec_meta(A) ((vector_t*)(((char *)(A)) - (sizeof(vector_t) + 4))) +#define vec_free(A) ((void)((A) ? (_util_vec_delete((void *)(A), __LINE__, __FILE__), (A) = NULL) : 0)) #define vec_push(A,V) (GMQCC_VEC_WILLGROW((A),1), (A)[vec_meta(A)->used++] = (V)) #define vec_size(A) ((A) ? vec_meta(A)->used : 0) #define vec_add(A,N) (GMQCC_VEC_WILLGROW((A),(N)), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)]) @@ -620,6 +629,11 @@ enum { /* TODO: elide */ extern const char *util_instr_str[VINSTR_END]; +void util_swap_header (prog_header_t *code_header); +void util_swap_statements (prog_section_statement_t *statements); +void util_swap_defs_fields(prog_section_both_t *section); +void util_swap_functions (prog_section_function_t *functions); +void util_swap_globals (int32_t *globals); typedef float qcfloat_t; typedef int32_t qcint_t; @@ -775,17 +789,17 @@ typedef struct { } qc_exec_stack_t; typedef struct qc_program_s { - char *filename; + char *filename; prog_section_statement_t *code; prog_section_def_t *defs; prog_section_def_t *fields; prog_section_function_t *functions; - char *strings; - qcint_t *globals; - qcint_t *entitydata; - bool *entitypool; + char *strings; + qcint_t *globals; + qcint_t *entitydata; + bool *entitypool; - const char* *function_stack; + const char* *function_stack; uint16_t crc16; @@ -811,6 +825,20 @@ typedef struct qc_program_s { size_t xflags; int argc; /* current arg count for debugging */ + + /* cached fields */ + struct { + qcint_t frame; + qcint_t nextthink; + qcint_t think; + } cached_fields; + + struct { + qcint_t self; + qcint_t time; + } cached_globals; + + bool supports_state; /* is INSTR_STATE supported? */ } qc_program_t; qc_program_t* prog_load (const char *filename, bool ignoreversion); @@ -960,15 +988,17 @@ typedef struct { extern opts_cmd_t opts; #define OPTS_GENERIC(f,i) (!! (((f)[(i)/32]) & (1<< (unsigned)((i)%32)))) + #define OPTS_FLAG(i) OPTS_GENERIC(opts.flags, (i)) #define OPTS_WARN(i) OPTS_GENERIC(opts.warn, (i)) #define OPTS_WERROR(i) OPTS_GENERIC(opts.werror, (i)) #define OPTS_OPTIMIZATION(i) OPTS_GENERIC(opts.optimization, (i)) + #define OPTS_OPTION_DUPED(X) (opts.options[X].allocated) -#define OPTS_OPTION_BOOL(X) (opts.options[X].data.b) -#define OPTS_OPTION_U16(X) (opts.options[X].data.u16) -#define OPTS_OPTION_U32(X) (opts.options[X].data.u32) -#define OPTS_OPTION_DUP(X) *(OPTS_OPTION_DUPED(X)=true, &(opts.options[X].data.str.p)) -#define OPTS_OPTION_STR(X) (opts.options[X].data.str.c) +#define OPTS_OPTION_BOOL(X) (opts.options[X].data.b) +#define OPTS_OPTION_U16(X) (opts.options[X].data.u16) +#define OPTS_OPTION_U32(X) (opts.options[X].data.u32) +#define OPTS_OPTION_STR(X) (opts.options[X].data.str.c) +#define OPTS_OPTION_DUP(X) *(OPTS_OPTION_DUPED(X)=true, &(opts.options[X].data.str.p)) #endif /*! GMQCC_HDR */