diff options
Diffstat (limited to 'src/libmowgli/base')
-rw-r--r-- | src/libmowgli/base/argstack.c | 63 | ||||
-rw-r--r-- | src/libmowgli/base/argstack.h | 14 | ||||
-rw-r--r-- | src/libmowgli/base/bitvector.c | 46 | ||||
-rw-r--r-- | src/libmowgli/base/bitvector.h | 4 | ||||
-rw-r--r-- | src/libmowgli/base/formatter.c | 20 | ||||
-rw-r--r-- | src/libmowgli/base/hash.c | 46 | ||||
-rw-r--r-- | src/libmowgli/base/hook.c | 5 | ||||
-rw-r--r-- | src/libmowgli/base/hook.h | 23 | ||||
-rw-r--r-- | src/libmowgli/base/memslice.c | 11 | ||||
-rw-r--r-- | src/libmowgli/base/memslice.h | 1 | ||||
-rw-r--r-- | src/libmowgli/base/mowgli_signal.c | 8 | ||||
-rw-r--r-- | src/libmowgli/base/mowgli_signal.h | 2 | ||||
-rw-r--r-- | src/libmowgli/base/random.c | 37 | ||||
-rw-r--r-- | src/libmowgli/base/random.h | 4 |
14 files changed, 162 insertions, 122 deletions
diff --git a/src/libmowgli/base/argstack.c b/src/libmowgli/base/argstack.c index ea67da2..560c83e 100644 --- a/src/libmowgli/base/argstack.c +++ b/src/libmowgli/base/argstack.c @@ -30,7 +30,8 @@ static mowgli_object_class_t klass; * * \param vptr pointer to mowgli_argstack_t to destroy. */ -static void mowgli_argstack_destroy(void *vptr) +static void +mowgli_argstack_destroy(void *vptr) { mowgli_argstack_t *self = (mowgli_argstack_t *) vptr; mowgli_node_t *n, *tn; @@ -48,17 +49,18 @@ static void mowgli_argstack_destroy(void *vptr) /* * \brief Initialization code for the mowgli.argstack library. - * + * * Side Effects: * - the mowgli_argstack_t object class is registered. */ -void mowgli_argstack_bootstrap(void) +void +mowgli_argstack_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_argstack_t", mowgli_argstack_destroy, FALSE); } /* - * \brief Creates an argument stack from a va_list and an appropriate + * \brief Creates an argument stack from a va_list and an appropriate * description schema. * * \param descstr a description string which describes the argument stack, where: @@ -70,20 +72,20 @@ void mowgli_argstack_bootstrap(void) * * \return a mowgli_argstack_t (mowgli.argstack) object. */ -mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_list va) +mowgli_argstack_t * +mowgli_argstack_create_from_va_list(const char *descstr, va_list va) { + return_null_if_fail(descstr != NULL); + const char *cp = descstr; mowgli_argstack_t *out = mowgli_alloc(sizeof(mowgli_argstack_t)); mowgli_object_init(mowgli_object(out), descstr, &klass, NULL); - if (descstr == NULL) - mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); - while (*cp) { mowgli_argstack_element_t *e = mowgli_alloc(sizeof(mowgli_argstack_element_t)); - switch(*cp) + switch (*cp) { case 's': e->data.string = va_arg(va, char *); @@ -104,7 +106,8 @@ mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_l default: va_end(va); mowgli_object_unref(out); - mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); + mowgli_log_warning("invalid description"); + return NULL; break; } @@ -127,14 +130,14 @@ mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_l * * \return a mowgli_argstack_t (mowgli.argstack) object. */ -mowgli_argstack_t *mowgli_argstack_create(const char *descstr, ...) +mowgli_argstack_t * +mowgli_argstack_create(const char *descstr, ...) { + return_null_if_fail(descstr != NULL); + va_list va; mowgli_argstack_t *out; - if (descstr == NULL) - mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); - va_start(va, descstr); out = mowgli_argstack_create_from_va_list(descstr, va); va_end(va); @@ -152,14 +155,14 @@ mowgli_argstack_t *mowgli_argstack_create(const char *descstr, ...) * Side Effects: * - the argument is removed from the argstack. */ -const char *mowgli_argstack_pop_string(mowgli_argstack_t *self) +const char * +mowgli_argstack_pop_string(mowgli_argstack_t *self) { + return_null_if_fail(self != NULL); + mowgli_node_t *n; mowgli_argstack_element_t *e; - if (self == NULL) - mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); - n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; @@ -178,14 +181,14 @@ const char *mowgli_argstack_pop_string(mowgli_argstack_t *self) * Side Effects: * - the argument is removed from the argstack. */ -int mowgli_argstack_pop_numeric(mowgli_argstack_t *self) +int +mowgli_argstack_pop_numeric(mowgli_argstack_t *self) { + return_val_if_fail(self != NULL, 0); + mowgli_node_t *n; mowgli_argstack_element_t *e; - if (self == NULL) - mowgli_throw_exception_val(mowgli.null_pointer_exception, 0); - n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; @@ -204,14 +207,14 @@ int mowgli_argstack_pop_numeric(mowgli_argstack_t *self) * Side Effects: * - the argument is removed from the argstack. */ -mowgli_boolean_t mowgli_argstack_pop_boolean(mowgli_argstack_t *self) +mowgli_boolean_t +mowgli_argstack_pop_boolean(mowgli_argstack_t *self) { + return_val_if_fail(self != NULL, false); + mowgli_node_t *n; mowgli_argstack_element_t *e; - if (self == NULL) - mowgli_throw_exception_val(mowgli.null_pointer_exception, FALSE); - n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; @@ -230,14 +233,14 @@ mowgli_boolean_t mowgli_argstack_pop_boolean(mowgli_argstack_t *self) * Side Effects: * - the argument is removed from the argstack. */ -void *mowgli_argstack_pop_pointer(mowgli_argstack_t *self) +void * +mowgli_argstack_pop_pointer(mowgli_argstack_t *self) { + return_null_if_fail(self != NULL); + mowgli_node_t *n; mowgli_argstack_element_t *e; - if (self == NULL) - mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); - n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; diff --git a/src/libmowgli/base/argstack.h b/src/libmowgli/base/argstack.h index adf68c2..b3b86f9 100644 --- a/src/libmowgli/base/argstack.h +++ b/src/libmowgli/base/argstack.h @@ -24,29 +24,33 @@ #ifndef __MOWGLI_ARGSTACK_H__ #define __MOWGLI_ARGSTACK_H__ -typedef enum { +typedef enum +{ MOWGLI_ARG_NUMERIC, MOWGLI_ARG_POINTER, MOWGLI_ARG_STRING, MOWGLI_ARG_BOOLEAN } mowgli_argstack_element_type_t; -typedef struct { - union { +typedef struct +{ + union + { int numeric; void *pointer; char *string; mowgli_boolean_t boolean; } data; + mowgli_argstack_element_type_t type; } mowgli_argstack_element_t; -typedef struct { +typedef struct +{ mowgli_object_t parent; mowgli_list_t stack; } mowgli_argstack_t; -extern void mowgli_argstack_bootstrap(void); extern mowgli_argstack_t *mowgli_argstack_create(const char *descstr, ...); extern mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_list va); extern const char *mowgli_argstack_pop_string(mowgli_argstack_t *); diff --git a/src/libmowgli/base/bitvector.c b/src/libmowgli/base/bitvector.c index b70df55..45fca31 100644 --- a/src/libmowgli/base/bitvector.c +++ b/src/libmowgli/base/bitvector.c @@ -39,7 +39,8 @@ static mowgli_object_class_t klass; * Side Effects: * - the mowgli_bitvector_t object class is registered. */ -void mowgli_bitvector_bootstrap(void) +void +mowgli_bitvector_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_bitvector_t", mowgli_free, FALSE); } @@ -58,14 +59,16 @@ void mowgli_bitvector_bootstrap(void) * Side Effects: * - none */ -mowgli_bitvector_t *mowgli_bitvector_create(int bits) +mowgli_bitvector_t * +mowgli_bitvector_create(int bits) { mowgli_bitvector_t *bv = (mowgli_bitvector_t *) mowgli_alloc(sizeof(mowgli_bitvector_t)); + mowgli_object_init(mowgli_object(bv), "mowgli_bitvector_t", &klass, NULL); - bv->bits = bits; + bv->bits = bits; bv->divisor = sizeof(int); - bv->vector = (unsigned int *) mowgli_alloc_array(bv->divisor, bv->bits / bv->divisor); + bv->vector = (unsigned int *) mowgli_alloc_array(bv->divisor, bv->bits / bv->divisor); return bv; } @@ -86,19 +89,20 @@ mowgli_bitvector_t *mowgli_bitvector_create(int bits) * Side Effects: * - a bit is either set ON or OFF in the bitvector. */ -void mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val) +void +mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val) { int value = 1 << slot; - switch(val) + switch (val) { - case FALSE: - bv->vector[bv->bits / bv->divisor] &= ~value; - break; - default: - case TRUE: - bv->vector[bv->bits / bv->divisor] |= value; - break; + case FALSE: + bv->vector[bv->bits / bv->divisor] &= ~value; + break; + default: + case TRUE: + bv->vector[bv->bits / bv->divisor] |= value; + break; } } @@ -118,7 +122,8 @@ void mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val * Side Effects: * - none */ -mowgli_boolean_t mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot) +mowgli_boolean_t +mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot) { int mask = 1 << slot; @@ -139,7 +144,8 @@ mowgli_boolean_t mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot) * Side Effects: * - none */ -mowgli_bitvector_t *mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) +mowgli_bitvector_t * +mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { int bits, iter, bs; mowgli_bitvector_t *out; @@ -179,7 +185,8 @@ mowgli_bitvector_t *mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bit * Side Effects: * - none */ -mowgli_bitvector_t *mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) +mowgli_bitvector_t * +mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { int bits, iter, bs; mowgli_bitvector_t *out; @@ -220,19 +227,18 @@ mowgli_bitvector_t *mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvect * Side Effects: * - none */ -mowgli_boolean_t mowgli_bitvector_compare(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) +mowgli_boolean_t +mowgli_bitvector_compare(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { - int iter, bs; + int iter, bs; mowgli_boolean_t ret = TRUE; /* cache the size of the bitvector in memory. */ bs = bv1->bits / bv1->divisor; for (iter = 0; iter < bs; iter++) - { if (!(bv1->vector[iter] & bv2->vector[iter])) ret = FALSE; - } return ret; } diff --git a/src/libmowgli/base/bitvector.h b/src/libmowgli/base/bitvector.h index 592ba59..f96709d 100644 --- a/src/libmowgli/base/bitvector.h +++ b/src/libmowgli/base/bitvector.h @@ -24,13 +24,13 @@ #ifndef __MOWGLI_BITVECTOR_H__ #define __MOWGLI_BITVECTOR_H__ -typedef struct { +typedef struct +{ unsigned int bits; unsigned int divisor; unsigned int *vector; } mowgli_bitvector_t; -extern void mowgli_bitvector_bootstrap(void); extern mowgli_bitvector_t *mowgli_bitvector_create(int bits); extern void mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val); extern mowgli_boolean_t mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot); diff --git a/src/libmowgli/base/formatter.c b/src/libmowgli/base/formatter.c index 21d9e46..db908e7 100644 --- a/src/libmowgli/base/formatter.c +++ b/src/libmowgli/base/formatter.c @@ -23,7 +23,8 @@ #include "mowgli.h" -void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, mowgli_argstack_t *stack) +void +mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, mowgli_argstack_t *stack) { size_t pos = 0; char *i = buf; @@ -42,14 +43,17 @@ void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char pos = strlen(buf); - switch(*fiter) + switch (*fiter) { case '%': fiter++; arg = atoi(fiter); e = mowgli_node_nth_data(&stack->stack, arg - 1); - while (isdigit(*fiter)) fiter++; + while (isdigit(*fiter)) + { + fiter++; + } if (e == NULL) { @@ -58,7 +62,7 @@ void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char continue; } - switch(e->type) + switch (e->type) { case MOWGLI_ARG_STRING: arg = snprintf(i, bufstr - (i - buf), "%s", e->data.string); @@ -77,7 +81,7 @@ void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char i += arg; break; default: - mowgli_throw_exception(mowgli.formatter.unhandled_type_exception); + mowgli_log("unhandled type"); break; } @@ -92,7 +96,8 @@ void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char } } -void mowgli_formatter_format(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, ...) +void +mowgli_formatter_format(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, ...) { va_list va; mowgli_argstack_t *stack; @@ -104,7 +109,8 @@ void mowgli_formatter_format(char *buf, size_t bufstr, const char *fmtstr, const mowgli_formatter_format_from_argstack(buf, bufstr, fmtstr, descstr, stack); } -void mowgli_formatter_print(const char *fmtstr, const char *descstr, ...) +void +mowgli_formatter_print(const char *fmtstr, const char *descstr, ...) { va_list va; char buf[65535]; diff --git a/src/libmowgli/base/hash.c b/src/libmowgli/base/hash.c index 7d70d8c..a2734d0 100644 --- a/src/libmowgli/base/hash.c +++ b/src/libmowgli/base/hash.c @@ -25,12 +25,13 @@ #define HASHINIT 0x811c9dc5 #define HASHBITS 16 -#define HASHSIZE (1 << HASHBITS) /* 2^16 = 65536 */ +#define HASHSIZE (1 << HASHBITS)/* 2^16 = 65536 */ -int mowgli_fnv_hash_string(const char *p) +int +mowgli_fnv_hash_string(const char *p) { static int htoast = 0; - unsigned int hval = HASHINIT; + unsigned int hval = HASHINIT; if (htoast == 0) { @@ -39,21 +40,23 @@ int mowgli_fnv_hash_string(const char *p) mowgli_object_unref(r); } - if (!p) - return (0); - for (; *p != '\0'; ++p) - { - hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); - hval ^= (tolower(*p) ^ htoast); - } + if (!p) + return 0; - return ((hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE); + for (; *p != '\0'; ++p) + { + hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); + hval ^= (tolower(*p) ^ htoast); + } + + return (hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE; } -int mowgli_fnv_hash(unsigned int *p) +int +mowgli_fnv_hash(unsigned int *p) { static int htoast = 0; - unsigned int hval = HASHINIT; + unsigned int hval = HASHINIT; if (htoast == 0) { @@ -62,13 +65,14 @@ int mowgli_fnv_hash(unsigned int *p) mowgli_object_unref(r); } - if (!p) - return (0); - for (; *p != '\0'; ++p) - { - hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); - hval ^= (tolower(*p) ^ htoast); - } + if (!p) + return 0; + + for (; *p != '\0'; ++p) + { + hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); + hval ^= (tolower(*p) ^ htoast); + } - return ((hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE); + return (hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE; } diff --git a/src/libmowgli/base/hook.c b/src/libmowgli/base/hook.c index 0af9660..315266a 100644 --- a/src/libmowgli/base/hook.c +++ b/src/libmowgli/base/hook.c @@ -27,7 +27,8 @@ static mowgli_patricia_t *mowgli_hooks = NULL; static mowgli_heap_t *mowgli_hook_item_heap; -static void _hook_key_canon(char *str) +static void +_hook_key_canon(char *str) { while (*str) { @@ -116,7 +117,7 @@ mowgli_hook_dissociate(const char *name, mowgli_hook_function_t func) mowgli_heap_free(mowgli_hook_item_heap, hookitem); return 0; - } + } } return -1; diff --git a/src/libmowgli/base/hook.h b/src/libmowgli/base/hook.h index 366e123..5d8d317 100644 --- a/src/libmowgli/base/hook.h +++ b/src/libmowgli/base/hook.h @@ -27,21 +27,22 @@ typedef void (*mowgli_hook_function_t)(void *hook_data, void *user_data); -typedef struct { - mowgli_hook_function_t func; - void *user_data; - mowgli_node_t node; +typedef struct +{ + mowgli_hook_function_t func; + void *user_data; + mowgli_node_t node; } mowgli_hook_item_t; -typedef struct { - const char *name; - mowgli_list_t items; +typedef struct +{ + const char *name; + mowgli_list_t items; } mowgli_hook_t; -extern void mowgli_hook_bootstrap(void); extern void mowgli_hook_register(const char *name); -extern int mowgli_hook_associate(const char *name, mowgli_hook_function_t func, void * user_data); -extern int mowgli_hook_dissociate(const char *name, mowgli_hook_function_t func); -extern void mowgli_hook_call(const char *name, void * hook_data); +extern int mowgli_hook_associate(const char *name, mowgli_hook_function_t func, void *user_data); +extern int mowgli_hook_dissociate(const char *name, mowgli_hook_function_t func); +extern void mowgli_hook_call(const char *name, void *hook_data); #endif diff --git a/src/libmowgli/base/memslice.c b/src/libmowgli/base/memslice.c index a271821..8d8f3a2 100644 --- a/src/libmowgli/base/memslice.c +++ b/src/libmowgli/base/memslice.c @@ -26,7 +26,8 @@ static mowgli_heap_t *allocator_heap; /* * Our slice allocation engine. */ -typedef struct { +typedef struct +{ size_t size; mowgli_heap_t *heap; @@ -36,7 +37,8 @@ typedef struct { /* * Allocation tag. */ -typedef struct { +typedef struct +{ slice_alloc_t *owner; } slice_tag_t; @@ -49,6 +51,7 @@ nexthigher(size_t k) size_t i; k--; + for (i = 1; i < sizeof(k) * 8; i <<= 1) k |= k >> i; @@ -109,7 +112,7 @@ memslice_alloc(size_t i) ptr = mowgli_heap_alloc(alloc->heap); ((slice_tag_t *) ptr)->owner = alloc; - return ptr + sizeof(slice_tag_t); + return (char *) ptr + sizeof(slice_tag_t); } /* @@ -122,7 +125,7 @@ memslice_free(void *ptr) return_if_fail(ptr != NULL); - tag = ptr - sizeof(slice_tag_t); + tag = (void *) ((char *) ptr - sizeof(slice_tag_t)); mowgli_heap_free(tag->owner->heap, tag); } diff --git a/src/libmowgli/base/memslice.h b/src/libmowgli/base/memslice.h index 9d6e842..12ce8f7 100644 --- a/src/libmowgli/base/memslice.h +++ b/src/libmowgli/base/memslice.h @@ -21,7 +21,6 @@ #ifndef __MOWGLI_MEMSLICE_H__ #define __MOWGLI_MEMSLICE_H__ -void mowgli_memslice_bootstrap(void); mowgli_allocation_policy_t *mowgli_memslice_get_policy(void); #endif diff --git a/src/libmowgli/base/mowgli_signal.c b/src/libmowgli/base/mowgli_signal.c index 208ce37..60602b4 100644 --- a/src/libmowgli/base/mowgli_signal.c +++ b/src/libmowgli/base/mowgli_signal.c @@ -26,11 +26,15 @@ #include <signal.h> #include "mowgli.h" +#if defined(__linux__) && defined(__GNUC__) && defined(__STRICT_ANSI__) +# error GCC/Linux in -std=c99 mode will not compile mowgli_signal; use -std=gnu99 instead +#endif + static mowgli_signal_handler_t -mowgli_signal_install_handler_full(int signum, mowgli_signal_handler_t handler, - int *sigtoblock, size_t sigtoblocksize) +mowgli_signal_install_handler_full(int signum, mowgli_signal_handler_t handler, int *sigtoblock, size_t sigtoblocksize) { struct sigaction action, old_action; + size_t i; action.sa_handler = handler; diff --git a/src/libmowgli/base/mowgli_signal.h b/src/libmowgli/base/mowgli_signal.h index b194d8d..1c7f33e 100644 --- a/src/libmowgli/base/mowgli_signal.h +++ b/src/libmowgli/base/mowgli_signal.h @@ -24,7 +24,7 @@ #ifndef __MOWGLI_SIGNAL_H__ #define __MOWGLI_SIGNAL_H__ -typedef void (*mowgli_signal_handler_t) (int); +typedef void (*mowgli_signal_handler_t)(int); extern mowgli_signal_handler_t mowgli_signal_install_handler(int signum, mowgli_signal_handler_t handler); diff --git a/src/libmowgli/base/random.c b/src/libmowgli/base/random.c index b316033..a183057 100644 --- a/src/libmowgli/base/random.c +++ b/src/libmowgli/base/random.c @@ -27,9 +27,9 @@ /* period parameters */ #define N 624 #define M 397 -#define MATRIX_A 0x9908b0dfUL /* constant vector a */ -#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ -#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ /* mowgli_random_t contains state data which is private */ struct mowgli_random_ @@ -42,20 +42,24 @@ struct mowgli_random_ static mowgli_object_class_t klass; /* initialization */ -void mowgli_random_bootstrap(void) +void +mowgli_random_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_random_t", NULL, FALSE); } /* construction and destruction. */ -mowgli_random_t *mowgli_random_create(void) +mowgli_random_t * +mowgli_random_create(void) { return mowgli_random_create_with_seed(time(NULL)); } -mowgli_random_t *mowgli_random_create_with_seed(unsigned int seed) +mowgli_random_t * +mowgli_random_create_with_seed(unsigned int seed) { mowgli_random_t *out = mowgli_alloc(sizeof(mowgli_random_t)); + mowgli_object_init(mowgli_object(out), NULL, &klass, NULL); mowgli_random_reseed(out, seed); @@ -64,11 +68,13 @@ mowgli_random_t *mowgli_random_create_with_seed(unsigned int seed) } /* reset seed */ -void mowgli_random_reseed(mowgli_random_t *self, unsigned int seed) +void +mowgli_random_reseed(mowgli_random_t *self, unsigned int seed) { return_if_fail(self != NULL); self->mt[0] = seed & 0xffffffffUL; + for (self->mti = 1; self->mti < N; self->mti++) { self->mt[self->mti] = (1812433253UL * (self->mt[self->mti - 1] ^ (self->mt[self->mti - 1] >> 30)) + self->mti); @@ -77,7 +83,8 @@ void mowgli_random_reseed(mowgli_random_t *self, unsigned int seed) } /* number retrieval */ -unsigned int mowgli_random_int(mowgli_random_t *self) +unsigned int +mowgli_random_int(mowgli_random_t *self) { unsigned int y; static unsigned int mag01[2] = { 0x0UL, MATRIX_A }; @@ -97,7 +104,7 @@ unsigned int mowgli_random_int(mowgli_random_t *self) for (; t < N - 1; t++) { y = (self->mt[t] & UPPER_MASK) | (self->mt[t + 1] & LOWER_MASK); - self->mt[t] = self->mt[t + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1U]; + self->mt[t] = self->mt[t + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1U]; } y = (self->mt[N - 1] & UPPER_MASK) | (self->mt[0] & LOWER_MASK); @@ -116,7 +123,8 @@ unsigned int mowgli_random_int(mowgli_random_t *self) return y; } -int mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end) +int +mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end) { unsigned int dist = end - begin; unsigned int max, ret; @@ -129,13 +137,16 @@ int mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end) remain -= dist; max = 0xFFFFFFFFU - remain; - } else + } + else + { max = dist - 1; + } do - { ret = mowgli_random_int(self); - } while (ret > max); + + while (ret > max); ret %= dist; diff --git a/src/libmowgli/base/random.h b/src/libmowgli/base/random.h index ea53dd7..9153478 100644 --- a/src/libmowgli/base/random.h +++ b/src/libmowgli/base/random.h @@ -26,10 +26,8 @@ /* mowgli_random_t contains state data which is private */ struct mowgli_random_; -typedef struct mowgli_random_ mowgli_random_t; -/* object class initialization. */ -extern void mowgli_random_bootstrap(void); +typedef struct mowgli_random_ mowgli_random_t; /* construction and destruction. */ extern mowgli_random_t *mowgli_random_create(void); |