X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=6d4d9718fc78f5f8ad4550961211052b4d5e9791;hp=dd5dbc7f9d75369afbf04e7b6db0b8172530aa38;hb=eb2a74f7e7968f99f6a9e01de838a900ebd6efe0;hpb=98fd5cd429efba365da12578cd861012fb1749b5 diff --git a/gmqcc.h b/gmqcc.h index dd5dbc7..6d4d971 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -37,7 +37,7 @@ #ifdef _MSC_VER # pragma warning(disable : 4244 ) /* conversion from 'int' to 'float', possible loss of data */ # pragma warning(disable : 4018 ) /* signed/unsigned mismatch */ -#endif +#endif /*! _MSC_VER */ #define GMQCC_VERSION_MAJOR 0 #define GMQCC_VERSION_MINOR 3 @@ -55,7 +55,7 @@ # define GMQCC_DEV_VERSION_STRING "development build\n" #else # define GMQCC_DEV_VERSION_STRING -#endif +#endif /*! GMQCC_GITINGO */ #define GMQCC_STRINGIFY(x) #x #define GMQCC_IND_STRING(x) GMQCC_STRINGIFY(x) @@ -78,10 +78,10 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ #ifndef __cplusplus # ifdef false # undef false -# endif /* !false */ +# endif /*! false */ # ifdef true # undef true -# endif /* !true */ +# endif /*! true */ # define false (0) # define true (1) # ifdef __STDC_VERSION__ @@ -89,11 +89,11 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ typedef int bool; # else typedef _Bool bool; -# endif +# endif /*! __STDC_VERSION__ < 199901L && __GNUC__ < 3 */ # else typedef int bool; -# endif /* !__STDC_VERSION__ */ -#endif /* !__cplusplus */ +# endif /*! __STDC_VERSION__ */ +#endif /*! __cplusplus */ /* * Of some functions which are generated we want to make sure @@ -102,9 +102,11 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ */ #if defined(__GNUC__) || defined(__CLANG__) # define GMQCC_WARN __attribute__((warn_unused_result)) +# define GMQCC_USED __attribute__((used)) #else # define GMQCC_WARN -#endif +# define GMQCC_USED +#endif /*! defined(__GNUC__) || defined (__CLANG__) */ /* * This is a hack to silent clang regarding empty * body if statements. @@ -123,13 +125,13 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define GMQCC_INLINE # else # define GMQCC_INLINE __attribute__ ((always_inline)) -# endif +# endif /*! __GNUC__ < 2 */ # else # define GMQCC_INLINE -# endif +# endif /*! defined(__GNUC__) || defined (__CLANG__) */ # else # define GMQCC_INLINE inline -# endif +# endif /*! __STDC_VERSION < 199901L */ /* * Visual studio has __forcinline we can use. So lets use that * I suspect it also has just __inline of some sort, but our use @@ -139,7 +141,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define GMQCC_INLINE __forceinline #else # define GMQCC_INLINE -#endif /* !__STDC_VERSION__ */ +#endif /*! __STDC_VERSION__ */ /* * noreturn is present in GCC and clang @@ -151,7 +153,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define GMQCC_NORETURN __attribute__ ((noreturn)) #else # define GMQCC_NORETURN -#endif +#endif /*! (defined(__GNUC__) && __GNUC__ >= 2) || defined (__CLANG__) */ #ifndef _MSC_VER # include @@ -164,7 +166,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; -#endif +#endif /*! _MSC_VER */ /* *windows makes these prefixed because they're C99 @@ -175,7 +177,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define snprintf(X, Y, Z, ...) _snprintf(X, Y, Z, __VA_ARGS__) /* strtof doesn't exist -> strtod does though :) */ # define strtof(X, Y) (float)(strtod(X, Y)) -#endif +#endif /*! _MSC_VER */ /* * Very roboust way at determining endianess at compile time: this handles @@ -195,14 +197,14 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define BIG_ENDIAN # elif defined (__LITTLE_ENDIAN__) && !defined (LITTLE_ENDIAN) # define LITTLE_ENDIAN -# endif +# endif /*! defined (__BIG_ENDIAN__) && !defined(BIG_ENDIAN) */ # elif !defined (__MINGW32__) # include # if !defined (__BEOS__) # include -# endif -# endif -#endif +# endif /*! !definde (__BEOS__) */ +# endif /*! defined (__FreeBSD__) || defined (__OpenBSD__) */ +#endif /*! defined (__GNUC__) || defined (__GNU_LIBRARY__) */ #if !defined(PLATFORM_BYTE_ORDER) # if defined (LITTLE_ENDIAN) || defined (BIG_ENDIAN) # if defined (LITTLE_ENDIAN) && !defined(BIG_ENDIAN) @@ -213,7 +215,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_LITTLE # elif defined (BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN) # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_BIG -# endif +# endif /*! defined (LITTLE_ENDIAN) && !defined(BIG_ENDIAN) */ # elif defined (_LITTLE_ENDIAN) || defined (_BIG_ENDIAN) # if defined (_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_LITTLE @@ -223,7 +225,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_LITTLE # elif defined (_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN) # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_BIG -# endif +# endif /*! defined (_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) */ # elif defined (__LITTLE_ENDIAN__) || defined (__BIG_ENDIAN__) # if defined (__LITTLE_ENDIAN__) && !defined (__BIG_ENDIAN__) # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_LITTLE @@ -233,9 +235,9 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_LITTLE # elif defined (__BYTE_ORDER__) && (__BYTE_ORDER__ == __BIG_ENDIAN__) # define PLATFORM_BYTE_ORDER GMQCC_BYTE_ORDER_BIG -# endif -# endif -#endif +# endif /*! defined (__LITTLE_ENDIAN__) && !defined (__BIG_ENDIAN__) */ +# endif /*! defined(LITTLE_ENDIAN) || defined (BIG_ENDIAN) */ +#endif /*! !defined(PLATFORM_BYTE_ORDER) */ #if !defined (PLATFORM_BYTE_ORDER) # if defined (__alpha__) || defined (__alpha) || defined (i386) || \ defined (__i386__) || defined (_M_I86) || defined (_M_IX86) || \ @@ -255,8 +257,36 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # else # define PLATFORM_BYTE_ORDER -1 # endif -#endif +#endif /*! !defined (PLATFORM_BYTE_ORDER) */ +/* + * On windows systems where we're not compiling with MING32 we need a + * little extra help on dependinces for implementing our own dirent.h + * in fs.c. + */ +#if defined(_WIN32) && !defined(__MINGW32__) +# define _WIN32_LEAN_AND_MEAN +# include +# include +# include + + struct dirent { + long d_ino; + unsigned short d_reclen; + unsigned short d_namlen; + char d_name[FILENAME_MAX]; + } + + typedef struct { + struct _finddata_t dd_dta; + struct dirent dd_dir; + long dd_handle; + int dd_stat; + char dd_name[1]; + } DIR; +#else +# include +#endif /*! _WIN32 && !defined(__MINGW32__) */ /*===================================================================*/ @@ -294,7 +324,7 @@ int util_asprintf (char **ret, const char *fmt, ...); # 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__) -#endif +#endif /*! NOTRACK */ /* * A flexible vector implementation: all vector pointers contain some @@ -432,26 +462,35 @@ void util_hsdel(hash_set_t *); /*===================================================================*/ /*============================ file.c ===============================*/ /*===================================================================*/ -GMQCC_INLINE void file_close (FILE *); -GMQCC_INLINE int file_error (FILE *); -GMQCC_INLINE int file_getc (FILE *); -GMQCC_INLINE int file_printf (FILE *, const char *, ...); -GMQCC_INLINE int file_puts (FILE *, const char *); -GMQCC_INLINE int file_putc (FILE *, int); -GMQCC_INLINE int file_seek (FILE *, long int, int); +/* file handling */ +void fs_file_close (FILE *); +int fs_file_error (FILE *); +int fs_file_getc (FILE *); +int fs_file_flush (FILE *); +int fs_file_printf (FILE *, const char *, ...); +int fs_file_puts (FILE *, const char *); +int fs_file_seek (FILE *, long int, int); +long int fs_file_tell (FILE *); -GMQCC_INLINE size_t file_read (void *, size_t, size_t, FILE *); -GMQCC_INLINE size_t file_write (const void *, size_t, size_t, FILE *); +size_t fs_file_read (void *, size_t, size_t, FILE *); +size_t fs_file_write (const void *, size_t, size_t, FILE *); -GMQCC_INLINE FILE *file_open (const char *, const char *); -/*NOINLINE*/ int file_getline(char **, size_t *, FILE *); +FILE *fs_file_open (const char *, const char *); +int fs_file_getline(char **, size_t *, FILE *); + +/* directory handling */ +int fs_dir_make (const char *); +DIR *fs_dir_open (const char *); +int fs_dir_close (DIR *); +struct dirent *fs_dir_read (DIR *); /*===================================================================*/ /*=========================== correct.c =============================*/ /*===================================================================*/ typedef struct { - char ***edits; + char ***edits; + size_t **lens; } correction_t; void correct_del (correct_trie_t*, size_t **); @@ -681,17 +720,11 @@ enum { INSTR_BITAND, INSTR_BITOR, - /* - * Virtual instructions used by the assembler - * keep at the end but before virtual instructions - * for the IR below. - */ - AINSTR_END, - /* * Virtual instructions used by the IR * Keep at the end! */ + VINSTR_END, VINSTR_PHI, VINSTR_JUMP, VINSTR_COND, @@ -1061,7 +1094,6 @@ int u8_fromchar(uchar_t w, char *to, size_t maxlen); typedef struct { const char *name; longbit bit; - const char *description; } opts_flag_def; bool opts_setflag (const char *, bool); @@ -1082,65 +1114,56 @@ void opts_restore_non_Werror_all(); enum { # define GMQCC_TYPE_FLAGS -# define GMQCC_DEFINE_FLAG(X, Y) X, +# define GMQCC_DEFINE_FLAG(X) X, # include "opts.def" COUNT_FLAGS }; static const opts_flag_def opts_flag_list[] = { # define GMQCC_TYPE_FLAGS -# define GMQCC_DEFINE_FLAG(X, Y) { #X, LONGBIT(X), Y}, +# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(X) }, # include "opts.def" - { NULL, LONGBIT(0), "" } + { NULL, LONGBIT(0) } }; enum { # define GMQCC_TYPE_WARNS -# define GMQCC_DEFINE_FLAG(X, Y) WARN_##X, +# define GMQCC_DEFINE_FLAG(X) WARN_##X, # include "opts.def" COUNT_WARNINGS }; static const opts_flag_def opts_warn_list[] = { # define GMQCC_TYPE_WARNS -# define GMQCC_DEFINE_FLAG(X, Y) { #X, LONGBIT(WARN_##X), Y }, +# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(WARN_##X) }, # include "opts.def" - { NULL, LONGBIT(0), "" } + { NULL, LONGBIT(0) } }; enum { # define GMQCC_TYPE_OPTIMIZATIONS -# define GMQCC_DEFINE_FLAG(NAME, MIN_O, Y) OPTIM_##NAME, +# define GMQCC_DEFINE_FLAG(NAME, MIN_O) OPTIM_##NAME, # include "opts.def" COUNT_OPTIMIZATIONS }; static const opts_flag_def opts_opt_list[] = { # define GMQCC_TYPE_OPTIMIZATIONS -# define GMQCC_DEFINE_FLAG(NAME, MIN_O, Y) { #NAME, LONGBIT(OPTIM_##NAME), Y}, +# define GMQCC_DEFINE_FLAG(NAME, MIN_O) { #NAME, LONGBIT(OPTIM_##NAME) }, # include "opts.def" - { NULL, LONGBIT(0), "" } + { NULL, LONGBIT(0) } }; static const unsigned int opts_opt_oflag[] = { # define GMQCC_TYPE_OPTIMIZATIONS -# define GMQCC_DEFINE_FLAG(NAME, MIN_O, Y) MIN_O, +# define GMQCC_DEFINE_FLAG(NAME, MIN_O) MIN_O, # include "opts.def" 0 }; enum { # define GMQCC_TYPE_OPTIONS -# define GMQCC_DEFINE_FLAG(X, Y) OPTION_##X, +# define GMQCC_DEFINE_FLAG(X) OPTION_##X, # include "opts.def" OPTION_COUNT }; - -static const char *opts_options_descriptions[] = { -# define GMQCC_TYPE_OPTIONS -# define GMQCC_DEFINE_FLAG(X, Y) Y, -# include "opts.def" - "" -}; - - extern unsigned int opts_optimizationcount[COUNT_OPTIMIZATIONS]; /* other options: */ @@ -1151,13 +1174,6 @@ typedef enum { COMPILER_GMQCC /* this QuakeC */ } opts_std_t; -typedef enum { - OPT_TYPE_BOOL, - OPT_TYPE_U16, - OPT_TYPE_U32, - OPT_TYPE_STR -} opt_type_t; - typedef union { bool B; uint16_t U16; @@ -1174,6 +1190,7 @@ typedef struct { uint32_t warn_backup [1 + (COUNT_WARNINGS / 32)]; uint32_t werror_backup[1 + (COUNT_WARNINGS / 32)]; uint32_t optimization [1 + (COUNT_OPTIMIZATIONS / 32)]; + bool optimizeoff; /* True when -O0 */ } opts_cmd_t; extern opts_cmd_t opts; @@ -1188,4 +1205,4 @@ extern opts_cmd_t opts; #define OPTS_OPTION_U32(X) (opts.options[X].U32) #define OPTS_OPTION_STR(X) (opts.options[X].STR) -#endif +#endif /*! GMQCC_HDR */