diff options
author | Michael Roitzsch <mroi@users.sourceforge.net> | 2004-11-21 15:10:39 +0000 |
---|---|---|
committer | Michael Roitzsch <mroi@users.sourceforge.net> | 2004-11-21 15:10:39 +0000 |
commit | 880e06de387646fa3f0efde940d731e71afbbb93 (patch) | |
tree | 890e4333544c124848eb3e7564b200f5c94974e5 /src/post/goom/goomsl_hash.c | |
parent | 312b775d0a22284a60d36420cf8798c0fd1bfa3a (diff) | |
download | xine-lib-880e06de387646fa3f0efde940d731e71afbbb93.tar.gz xine-lib-880e06de387646fa3f0efde940d731e71afbbb93.tar.bz2 |
updated goom to 2k4-dev21
* tweaked somewhat to avoid the bright circle for the first seconds of playback
* no idea whether this fixes the AMD64 problems, I have not found anything
suspicious
CVS patchset: 7143
CVS date: 2004/11/21 15:10:39
Diffstat (limited to 'src/post/goom/goomsl_hash.c')
-rw-r--r-- | src/post/goom/goomsl_hash.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/post/goom/goomsl_hash.c b/src/post/goom/goomsl_hash.c new file mode 100644 index 000000000..b723726ca --- /dev/null +++ b/src/post/goom/goomsl_hash.c @@ -0,0 +1,101 @@ +#include "goomsl_hash.h" +#include <string.h> +#include <stdlib.h> + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(strlen(key)+1); + strcpy(entry->key,key); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new(void) { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + if (_this == NULL) return NULL; + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + + |