]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - util.c
Adding '&~=' to the -std=gmqcc operator list
[xonotic/gmqcc.git] / util.c
diff --git a/util.c b/util.c
index 26803c898276897ed2d1b1abedf075be3d09c98e..8671faa651a18fd9cb488893583afc380c1286fe 100644 (file)
--- a/util.c
+++ b/util.c
@@ -514,6 +514,40 @@ void *util_htget(hash_table_t *ht, const char *key) {
     return util_htgeth(ht, key, util_hthash(ht, key));
 }
 
+void *code_util_str_htgeth(hash_table_t *ht, const char *key, size_t bin) {
+    hash_node_t *pair;
+    size_t len, keylen;
+    int cmp;
+
+    keylen = strlen(key);
+
+    pair = ht->table[bin];
+    while (pair && pair->key) {
+        len = strlen(pair->key);
+        if (len < keylen) {
+            pair = pair->next;
+            continue;
+        }
+        if (keylen == len) {
+            cmp = strcmp(key, pair->key);
+            if (cmp == 0)
+                return pair->value;
+            if (cmp < 0)
+                return NULL;
+            pair = pair->next;
+            continue;
+        }
+        cmp = strcmp(key, pair->key + len - keylen);
+        if (cmp == 0) {
+            uintptr_t up = (uintptr_t)pair->value;
+            up += len - keylen;
+            return (void*)up;
+        }
+        pair = pair->next;
+    }
+    return NULL;
+}
+
 /*
  * Free all allocated data in a hashtable, this is quite the amount
  * of work.
@@ -539,6 +573,38 @@ void util_htdel(hash_table_t *ht) {
     mem_d(ht);
 }
 
+/*
+ * Portable implementation of vasprintf/asprintf. Assumes vsnprintf
+ * exists, otherwise compiler error.
+ */
+int util_vasprintf(char **ret, const char *fmt, va_list args) {
+    int     read;
+    va_list copy;
+    va_copy(copy, args);
+
+    *ret = 0;
+    if ((read = vsnprintf(NULL, 0, fmt, args)) >= 0) {
+        char *buffer;
+        if  ((buffer = (char*)mem_a(read + 1))) {
+            if ((read = vsnprintf(buffer, read + 1, fmt, copy)) < 0)
+                mem_d(buffer);
+            else
+                *ret = buffer;
+        }
+    }
+    va_end(copy);
+    return read;
+}
+int util_asprintf(char **ret, const char *fmt, ...) {
+    va_list  args;
+    int      read;
+    va_start(args, fmt);
+    read = util_vasprintf(ret, fmt, args);
+    va_end  (args);
+
+    return read;
+}
+
 /*
  * Implementation of the Mersenne twister PRNG (pseudo random numer
  * generator).  Implementation of MT19937.  Has a period of 2^19937-1
@@ -595,12 +661,12 @@ static GMQCC_INLINE void mt_generate() {
      * to [0, MT_SIZE)  (634 iterations).
      */
     for (i = 0; i < MT_SPACE; ++i) {
-        y           = (0x800000000 & mt_state[i]) | (0x7FFFFFF & mt_state[i + 1]);
+        y           = (0x80000000 & mt_state[i]) | (0x7FFFFFF & mt_state[i + 1]);
         mt_state[i] = mt_state[i + MT_PERIOD] ^ (y >> 1) ^ matrix[y & 1];
 
         i ++; /* loop unroll */
 
-        y           = (0x800000000 & mt_state[i]) | (0x7FFFFFF & mt_state[i + 1]);
+        y           = (0x80000000 & mt_state[i]) | (0x7FFFFFF & mt_state[i + 1]);
         mt_state[i] = mt_state[i + MT_PERIOD] ^ (y >> 1) ^ matrix[y & 1];
     }