X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=6e0d3ac05ecfca2f7bc858212dc56b8751f539d2;hp=43e2aa00048add22edbc0bbc5e4389d2ace72039;hb=1d745fd1f9b0448a00140cef0b68d9a3aa73f1f1;hpb=5138a25420ce56408486f14778dba17f252411c7 diff --git a/gmqcc.h b/gmqcc.h index 43e2aa0..6e0d3ac 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -24,7 +24,8 @@ #ifndef GMQCC_HDR #define GMQCC_HDR #include -#include /* TODO: remove this */ +#include +#include /* TODO: remove?*/ /* * Disable some over protective warnings in visual studio because fixing them is a waste @@ -252,54 +253,17 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \ # 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; - /* - * Visual studio also lacks S_ISDIR for sys/stat.h, so we emulate this as well - * which is not hard at all. - */ -# ifdef S_ISDIR -# undef S_ISDIR -# endif /*! S_ISDIR */ -# define S_ISDIR(X) ((X)&_S_IFDIR) -#else -# 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_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 *); +void *stat_mem_allocate (size_t, size_t, const char *, const char *); -#define mem_a(SIZE) stat_mem_allocate ((SIZE), __LINE__, __FILE__) +#define mem_a(SIZE) stat_mem_allocate ((SIZE), __LINE__, __FILE__, #SIZE) #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)) +#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) /* TODO: rename to mem variations */ #define util_strdup(SRC) stat_mem_strdup((char*)(SRC), __LINE__, __FILE__, false) @@ -338,8 +302,19 @@ uint16_t util_crc16(uint16_t crc, const char *data, size_t len); void util_seed(uint32_t); uint32_t util_rand(void); -int util_vasprintf(char **ret, const char *fmt, va_list); int util_asprintf (char **ret, const char *fmt, ...); +int util_sscanf (const char *str, const char *format, ...); +char *util_strncpy (char *dest, const char *src, size_t n); +char *util_strncat (char *dest, const char *src, size_t n); +char *util_strcat (char *dest, const char *src); +const char *util_strerror(int err); + +const struct tm *util_localtime(const time_t *timer); +const char *util_ctime (const time_t *timer); + +typedef struct fs_file_s fs_file_t; + +bool util_isatty(fs_file_t *); /* * A flexible vector implementation: all vector pointers contain some @@ -423,26 +398,39 @@ void util_htrm (hash_table_t *ht, const char *key, void (*cb)(void*)); void *util_htget (hash_table_t *ht, const char *key); void *util_htgeth(hash_table_t *ht, const char *key, size_t hash); +int util_snprintf(char *str, size_t, const char *fmt, ...); -/* fs.c */ -void fs_file_close (FILE *); -int fs_file_error (FILE *); -int fs_file_getc (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 *); - -size_t fs_file_read (void *, size_t, size_t, FILE *); -size_t fs_file_write (const void *, size_t, size_t, FILE *); -FILE *fs_file_open (const char *, const char *); -int fs_file_getline(char **, size_t *, FILE *); +/* fs.c */ +#define FS_FILE_SEEK_SET 0 +#define FS_FILE_SEEK_CUR 1 +#define FS_FILE_SEEK_END 2 +#define FS_FILE_EOF -1 + +typedef struct fs_dir_s fs_dir_t; +/*typedef struct fs_file_s fs_file_t;*/ +typedef struct dirent fs_dirent_t; + +void fs_file_close (fs_file_t *); +int fs_file_error (fs_file_t *); +int fs_file_getc (fs_file_t *); +int fs_file_printf (fs_file_t *, const char *, ...); +int fs_file_puts (fs_file_t *, const char *); +int fs_file_seek (fs_file_t *, long int, int); +long fs_file_tell (fs_file_t *); +int fs_file_flush (fs_file_t *); + +size_t fs_file_read (void *, size_t, size_t, fs_file_t *); +size_t fs_file_write (const void *, size_t, size_t, fs_file_t *); + +fs_file_t *fs_file_open (const char *, const char *); +int fs_file_getline(char **, size_t *, fs_file_t *); int fs_dir_make (const char *); -DIR *fs_dir_open (const char *); -int fs_dir_close (DIR *); -struct dirent *fs_dir_read (DIR *); +fs_dir_t *fs_dir_open (const char *); +int fs_dir_close (fs_dir_t *); +fs_dirent_t *fs_dir_read (fs_dir_t *); + /* correct.c */ typedef struct correct_trie_s { @@ -780,8 +768,8 @@ enum { LVL_ERROR }; -FILE *con_default_out(void); -FILE *con_default_err(void); +fs_file_t *con_default_out(void); +fs_file_t *con_default_err(void); 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, ...); @@ -1023,11 +1011,19 @@ typedef enum { COMPILER_GMQCC /* this QuakeC */ } opts_std_t; -typedef union { - bool B; - uint16_t U16; - uint32_t U32; - char *STR; +typedef struct { + union { + bool b; + uint16_t u16; + uint32_t u32; + + union { + char *p; + const char *c; + } str; + } data; + + bool allocated; } opt_value_t; @@ -1049,9 +1045,11 @@ extern opts_cmd_t opts; #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_BOOL(X) (opts.options[X].B) -#define OPTS_OPTION_U16(X) (opts.options[X].U16) -#define OPTS_OPTION_U32(X) (opts.options[X].U32) -#define OPTS_OPTION_STR(X) (opts.options[X].STR) +#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) #endif /*! GMQCC_HDR */