#define GMQCC_HDR
#include <stdarg.h>
#include <stddef.h>
-#include <time.h> /* TODO remove?*/
+#include <time.h> /* TODO: remove?*/
/*
* Disable some over protective warnings in visual studio because fixing them is a waste
#endif /*! _MSC_VER */
#define GMQCC_VERSION_MAJOR 0
-#define GMQCC_VERSION_MINOR 4
-#define GMQCC_VERSION_PATCH 0
+#define GMQCC_VERSION_MINOR 3
+#define GMQCC_VERSION_PATCH 6
#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)
# define GMQCC_NORETURN
#endif /*! (defined(__GNUC__) && __GNUC__ >= 2) || defined (__CLANG__) */
-#if (defined(__GNUC__)) || defined(__CLANG__)
+#if defined(__GNUC__) || defined(__CLANG__)
# define GMQCC_LIKELY(X) __builtin_expect((X), 1)
# define GMQCC_UNLIKELY(X) __builtin_expect((X), 0)
#else
# define GMQCC_UNLIKELY(X) (X)
#endif
+#if defined(__GNUC__) || defined(__CLANG__)
+# define GMQCC_RESTRICT __restrict__
+#elif defined(__MSC_VER)
+# define GMQCC_RESTRICT __restrict
+#else
+# define GMQCC_RESTRICT
+#endif
+
#define GMQCC_ARRAY_COUNT(X) (sizeof(X) / sizeof((X)[0]))
#ifndef _MSC_VER
/* 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)
const char *util_ctime (const time_t *timer);
typedef struct fs_file_s fs_file_t;
-int util_isatty (fs_file_t *);
+
+bool util_isatty(fs_file_t *);
/*
* A flexible vector implementation: all vector pointers contain some
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;
#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 */