X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gmqcc.h;h=bdda81b8b14ffd24dfbcbe60d0c2ac533bffa3d4;hb=467a4740dae1c0fa9d50c64e07b03ee82904e8e5;hp=8527f2e12cc0e489480c9d6fce1cde0b4bc81028;hpb=566dda6ad7dc59008f880b70f09be489addf6034;p=xonotic%2Fgmqcc.git diff --git a/gmqcc.h b/gmqcc.h index 8527f2e..bdda81b 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Dale Weiler * Wolfgang Bumiller * @@ -46,8 +46,12 @@ #define GMQCC_VERSION \ GMQCC_VERSION_BUILD(GMQCC_VERSION_MAJOR, GMQCC_VERSION_MINOR, GMQCC_VERSION_PATCH) +#ifndef GMQCC_GITINFO +# define GMQCC_GITINFO "(no git info)" +#endif + /* - * We cannoy rely on C99 at all, since compilers like MSVC + * We cannot rely on C99 at all, since compilers like MSVC * simply don't support it. We define our own boolean type * as a result (since we cannot include ). For * compilers that are in 1999 mode (C99 compliant) we can use @@ -168,7 +172,7 @@ # if defined (__FreeBSD__) || defined (__OpenBSD__) # include # elif defined (BSD) && (BSD >= 199103) || defined (__DJGPP__) || defined (__CYGWIN32__) -# include +# include # elif defined (__APPLE__) # if defined (__BIG_ENDIAN__) && !defined(BIG_ENDIAN) # define BIG_ENDIAN @@ -261,6 +265,10 @@ uint16_t util_crc16(uint16_t crc, const char *data, size_t len); void util_seed(uint32_t); uint32_t util_rand(); +int util_vasprintf(char **ret, const char *fmt, va_list); +int util_asprintf (char **ret, const char *fmt, ...); + + #ifdef NOTRACK # define mem_a(x) malloc (x) # define mem_d(x) free ((void*)x) @@ -312,6 +320,14 @@ typedef struct hash_table_t { struct hash_node_t **table; } hash_table_t, *ht; +typedef struct hash_set_t { + size_t bits; + size_t mask; + size_t capacity; + size_t *items; + size_t total; +} hash_set_t, *hs; + /* * hashtable implementation: * @@ -350,6 +366,45 @@ void util_htseth(hash_table_t *ht, const char *key, size_t hash, void * void *util_htget (hash_table_t *ht, const char *key); void *util_htgeth(hash_table_t *ht, const char *key, size_t hash); + +/* + * hashset implementation: + * This was designed for pointers: you manage the life of the object yourself + * if you do use this for non-pointers please be warned that the object may not + * be valid if the duration of it exceeds (i.e on stack). So you need to allocate + * yourself, or put those in global scope to ensure duration is for the whole + * runtime. + * + * util_hsnew() -- to make a new hashset + * util_hsadd(set, key) -- to add something in the set + * util_hshas(set, key) -- to check if something is in the set + * util_hsrem(set, key) -- to remove something in the set + * util_hsdel(set) -- to delete the set + * + * example of use: + * + * hs foo = util_hsnew(); + * char *bar = "hello blub\n"; + * char *baz = "hello dale\n"; + * + * util_hsadd(foo, bar); + * util_hsadd(foo, baz); + * util_hsrem(foo, baz); + * + * printf("bar %d | baz %d\n", + * util_hshas(foo, bar), + * util_hshad(foo, baz) + * ); + * + * util_hsdel(foo); + */ + +hash_set_t *util_hsnew(void); +int util_hsadd(hash_set_t *, void *); +int util_hshas(hash_set_t *, void *); +int util_hsrem(hash_set_t *, void *); +void util_hsdel(hash_set_t *); + /*===================================================================*/ /*============================ file.c ===============================*/ /*===================================================================*/ @@ -358,6 +413,7 @@ 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); GMQCC_INLINE size_t file_read (void *, size_t, size_t, FILE *); @@ -388,6 +444,8 @@ enum { TYPE_UNION , TYPE_ARRAY , + TYPE_NIL , /* it's its own type / untyped */ + TYPE_COUNT };