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.
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
* 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];
}