X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=593ab811c6bf23104404a19ecf2707322f370a52;hp=b3ba81782320d517ad4e6976416d3530fd8e6bbb;hb=6db2e69f9a9411f4d5cb6923b1ead3706d7fe195;hpb=73070395ebdf177b456bdaf52f75a3c3a40cd416 diff --git a/gmqcc.h b/gmqcc.h index b3ba817..593ab81 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -23,12 +23,8 @@ */ #ifndef GMQCC_HDR #define GMQCC_HDR -#include -#include -#include #include -#include -#include +#include /* TODO: remove this */ /* * Disable some over protective warnings in visual studio because fixing them is a waste @@ -39,8 +35,8 @@ #endif /*! _MSC_VER */ #define GMQCC_VERSION_MAJOR 0 -#define GMQCC_VERSION_MINOR 2 -#define GMQCC_VERSION_PATCH 9 +#define GMQCC_VERSION_MINOR 3 +#define GMQCC_VERSION_PATCH 0 #define GMQCC_VERSION_BUILD(J,N,P) (((J)<<16)|((N)<<8)|(P)) #define GMQCC_VERSION \ GMQCC_VERSION_BUILD(GMQCC_VERSION_MAJOR, GMQCC_VERSION_MINOR, GMQCC_VERSION_PATCH) @@ -48,13 +44,17 @@ #define GMQCC_VERSION_TYPE_DEVEL /* Full version string in case we need it */ -#ifdef GMQCC_GITINFO -# define GMQCC_DEV_VERSION_STRING "git build: " GMQCC_GITINFO "\n" -#elif defined(GMQCC_VERSION_TYPE_DEVEL) -# define GMQCC_DEV_VERSION_STRING "development build\n" +#ifdef GMQCC_VERSION_TYPE_DEVEL +# ifdef GMQCC_GITINFO +# define GMQCC_DEV_VERSION_STRING "git build: " GMQCC_GITINFO "\n" +# elif defined(GMQCC_VERSION_TYPE_DEVEL) +# define GMQCC_DEV_VERSION_STRING "development build\n" +# else +# define GMQCC_DEV_VERSION_STRING +# endif /*! GMQCC_GITINGO */ #else # define GMQCC_DEV_VERSION_STRING -#endif /*! GMQCC_GITINGO */ +#endif #define GMQCC_STRINGIFY(x) #x #define GMQCC_IND_STRING(x) GMQCC_STRINGIFY(x) @@ -284,20 +284,52 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # include #endif /*! _WIN32 && !defined(__MINGW32__) */ +/*===================================================================*/ +/*=========================== stat.c ================================*/ +/*===================================================================*/ +void stat_info (void); +char *stat_mem_strdup (const char *, size_t, const char *, bool); +void *stat_mem_reallocate(void *, size_t, size_t, const char *); +void stat_mem_deallocate(void *); +void *stat_mem_allocate (size_t, size_t, const char *); + +#define mem_a(SIZE) stat_mem_allocate ((SIZE), __LINE__, __FILE__) +#define mem_d(PTRN) stat_mem_deallocate((void*)(PTRN)) +#define mem_r(PTRN, SIZE) stat_mem_reallocate((void*)(PTRN), (SIZE), __LINE__, __FILE__) +#define mem_af(SIZE, FILE, LINE) stat_mem_allocate ((SIZE), (LINE), (FILE)) + +/* TODO: rename to mem variations */ +#define util_strdup(SRC) stat_mem_strdup((char*)(SRC), __LINE__, __FILE__, false) +#define util_strdupe(SRC) stat_mem_strdup((char*)(SRC), __LINE__, __FILE__, true) /*===================================================================*/ /*=========================== util.c ================================*/ /*===================================================================*/ -void *util_memory_a (size_t, /*****/ unsigned int, const char *); -void *util_memory_r (void *, size_t, unsigned int, const char *); -void util_memory_d (void *); -void util_meminfo (); + +/* + * Microsoft implements against the spec versions of ctype.h. Which + * means what ever the current set locale is will render the actual + * results of say isalpha('A') wrong for what ever retarded locale + * is used. Simalerly these are also implemented inefficently on + * some toolchains and end up becoming actual library calls. Perhaps + * this is why tools like yacc provide their own? Regardless implementing + * these as functions is equally as silly, the call overhead is not + * justified when this could happen on every character from an input + * stream. We provide our own as macros for absolute inlinability. + */ +#define util_isupper(C) ((C) >= 'A' && (C) <= 'Z') +#define util_islower(C) ((C) >= 'a' && (C) <= 'z') +#define util_isdigit(C) ((C) >= '0' && (C) <= '9') +#define util_isprint(C) ((C) >= 32 && (C) <= 126) +#define util_isspace(C) ((C) == ' ' || (C) == '\f' || \ + (C) == '\n'|| (C) == '\r' || \ + (C) == '\t'|| (C) == '\v') + +#define util_isalpha(C) (util_islower(C) || util_isupper(C)) bool util_filexists (const char *); bool util_strupper (const char *); bool util_strdigit (const char *); -char *_util_Estrdup (const char *, const char *, size_t); -char *_util_Estrdup_empty(const char *, const char *, size_t); void util_debug (const char *, const char *, ...); void util_endianswap (void *, size_t, unsigned int); @@ -307,7 +339,7 @@ size_t util_strtononcmd (const char *, char *, size_t); uint16_t util_crc16(uint16_t crc, const char *data, size_t len); void util_seed(uint32_t); -uint32_t util_rand(); +uint32_t util_rand(void); /* * String functions (formatting, copying, concatenating, errors). These are wrapped @@ -322,22 +354,6 @@ char *util_strcat (char *dest, const char *src); char *util_strncpy (char *dest, const char *src, size_t num); const char *util_strerror (int num); - -#ifdef NOTRACK -# define mem_a(x) malloc (x) -# define mem_d(x) free ((void*)x) -# define mem_r(x, n) realloc((void*)x, n) -# define mem_af(x,f,l) malloc (x) -#else -# define mem_a(x) util_memory_a((x), __LINE__, __FILE__) -# define mem_d(x) util_memory_d((void*)(x)) -# define mem_r(x, n) util_memory_r((void*)(x), (n), __LINE__, __FILE__) -# define mem_af(x,f,l) util_memory_a((x), __LINE__, __FILE__) -#endif /*! NOTRACK */ - -#define util_strdup(X) _util_Estrdup((X), __FILE__, __LINE__) -#define util_strdupe(X) _util_Estrdup_empty((X), __FILE__, __LINE__) - /* * A flexible vector implementation: all vector pointers contain some * data about themselfs exactly - sizeof(vector_t) behind the pointer @@ -379,7 +395,7 @@ typedef struct trie_s { struct trie_s *entries; } correct_trie_t; -correct_trie_t* correct_trie_new(); +correct_trie_t* correct_trie_new(void); typedef struct hash_table_t { size_t size; @@ -703,32 +719,40 @@ enum { VINSTR_NRCALL }; -/* TODO: cleanup this mess */ -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; -extern int *code_globals; -extern char *code_chars; -extern uint16_t code_crc; - /* uhh? */ typedef float qcfloat; typedef int32_t qcint; +typedef struct { + prog_section_statement *statements; + int *linenums; + prog_section_def *defs; + prog_section_field *fields; + prog_section_function *functions; + int *globals; + char *chars; + uint16_t crc; + uint32_t entfields; + ht string_cache; + qcint string_cached_empty; +} code_t; + /* - * code_write -- writes out the compiled file - * code_init -- prepares the code file + * code_write -- writes out the compiled file + * code_init -- prepares the code file + * code_genstrin -- generates string for code + * code_alloc_field -- allocated a field + * code_push_statement -- keeps statements and linenumbers together + * code_pop_statement -- keeps statements and linenumbers together */ -bool code_write (const char *filename, const char *lno); -void code_init (); -uint32_t code_genstring (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); -void code_pop_statement(); +bool code_write (code_t *, const char *filename, const char *lno); +GMQCC_WARN +code_t *code_init (void); +void code_cleanup (code_t *); +uint32_t code_genstring (code_t *, const char *string); +qcint code_alloc_field (code_t *, size_t qcsize); +void code_push_statement(code_t *, prog_section_statement *stmt, int linenum); +void code_pop_statement (code_t *); /* * A shallow copy of a lex_file to remember where which ast node @@ -737,6 +761,7 @@ void code_pop_statement(); typedef struct { const char *file; size_t line; + size_t column; } lex_ctx; /*===================================================================*/ @@ -760,17 +785,17 @@ enum { LVL_ERROR }; -FILE *con_default_out(); -FILE *con_default_err(); +FILE *con_default_out(void); +FILE *con_default_err(void); -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_vprintmsg (int level, const char *name, size_t line, size_t column, const char *msgtype, const char *msg, va_list ap); +void con_printmsg (int level, const char *name, size_t line, size_t column, 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_init (); -void con_reset (); +void con_close (void); +void con_init (void); +void con_reset (void); void con_color (int); int con_change(const char *, const char *); int con_verr (const char *, va_list); @@ -787,7 +812,7 @@ void /********/ compile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, ... void /********/ vcompile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, va_list ap); bool GMQCC_WARN compile_warning (lex_ctx ctx, int warntype, const char *fmt, ...); bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap); -void compile_show_werrors(); +void compile_show_werrors(void); /*===================================================================*/ /*========================= assembler.c =============================*/ @@ -981,7 +1006,7 @@ 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); +const 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); @@ -992,8 +1017,7 @@ qcint prog_tempstring(qc_program *prog, const char *_str); /*===================== parser.c commandline ========================*/ /*===================================================================*/ struct parser_s; - -struct parser_s *parser_create (); +struct parser_s *parser_create (void); bool parser_compile_file (struct parser_s *parser, const char *); bool parser_compile_string(struct parser_s *parser, const char *, const char *, size_t); bool parser_finish (struct parser_s *parser, const char *); @@ -1002,23 +1026,8 @@ void parser_cleanup (struct parser_s *parser); /*===================================================================*/ /*====================== ftepp.c commandline ========================*/ /*===================================================================*/ -struct lex_file_s; struct ftepp_s; - -typedef struct { - const char *name; - char *(*func)(struct lex_file_s *); -} ftepp_predef_t; - -/* - * line, file, counter, counter_last, random, random_last, date, time - * time_stamp. - * - * increment when items are added - */ -#define FTEPP_PREDEF_COUNT 9 - -struct ftepp_s *ftepp_create (); +struct ftepp_s *ftepp_create (void); bool ftepp_preprocess_file (struct ftepp_s *ftepp, const char *filename); bool ftepp_preprocess_string(struct ftepp_s *ftepp, const char *name, const char *str); void ftepp_finish (struct ftepp_s *ftepp); @@ -1027,8 +1036,6 @@ void ftepp_flush (struct ftepp_s *ftepp); void ftepp_add_define (struct ftepp_s *ftepp, const char *source, const char *name); void ftepp_add_macro (struct ftepp_s *ftepp, const char *name, const char *value); -extern const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT]; - /*===================================================================*/ /*======================= main.c commandline ========================*/ /*===================================================================*/ @@ -1080,10 +1087,10 @@ void opts_setoptimlevel(unsigned int); void opts_ini_init (const char *); /* Saner flag handling */ -void opts_backup_non_Wall(); -void opts_restore_non_Wall(); -void opts_backup_non_Werror_all(); -void opts_restore_non_Werror_all(); +void opts_backup_non_Wall(void); +void opts_restore_non_Wall(void); +void opts_backup_non_Werror_all(void); +void opts_restore_non_Werror_all(void); enum { # define GMQCC_TYPE_FLAGS @@ -1168,7 +1175,7 @@ typedef struct { extern opts_cmd_t opts; -#define OPTS_GENERIC(f,i) (!! (((f)[(i)/32]) & (1<< ((i)%32)))) +#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))