diff options
Diffstat (limited to 'libhashtable')
-rw-r--r-- | libhashtable/Makefile | 15 | ||||
-rw-r--r-- | libhashtable/example.c | 25 | ||||
-rwxr-xr-x | libhashtable/genheader.sh | 3 | ||||
-rw-r--r-- | libhashtable/hashtable.h | 27 | ||||
-rw-r--r-- | libhashtable/libhashtable.c | 165 |
5 files changed, 0 insertions, 235 deletions
diff --git a/libhashtable/Makefile b/libhashtable/Makefile deleted file mode 100644 index 6649739..0000000 --- a/libhashtable/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -LDFLAGS=-lhashtable -Llibhashtable -CFLAGS=-fpic -shared -pedantic -Wall -TARGET=libhashtable.so - -all: $(TARGET) - -$(TARGET): - $(CC) $(CFLAGS) -o $(TARGET) libhashtable.c - -clean: - rm -f libhashtable.so - -install: - cp $(TARGET) /usr/local/lib/$(TARGET) - cp hashtable.h /usr/local/include/hashtable.h diff --git a/libhashtable/example.c b/libhashtable/example.c deleted file mode 100644 index 919d75c..0000000 --- a/libhashtable/example.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include "hashtable.h" - -extern char **environ; - -int main(int argc,char *argv[]) { - struct hashtable ht; - int i; - char *name; - char *value; - inittable(&ht,65535); - for(i=0;environ[i];i++) { - name=strdup(environ[i]); - if((value=strchr(name,'=') )){ - *value=0; - value++; - } - ht_setkey(&ht,name,value); - free(name); - } - printf("PATH='%s'\n",ht_getvalue(&ht,"PATH")); - //if you want to get a whole entry struct use ht_getnode(); - //getentry() just returns the first struct in the linked list in that bucket. - return 0; -} diff --git a/libhashtable/genheader.sh b/libhashtable/genheader.sh deleted file mode 100755 index 3995579..0000000 --- a/libhashtable/genheader.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cat libhashtable.c | head -n 22 | tail -n 16 > hashtable.h -cat libhashtable.c | grep '(.*) *{' | egrep -v 'if|for|while' | sed 's/ {/;/' >> hashtable.h diff --git a/libhashtable/hashtable.h b/libhashtable/hashtable.h deleted file mode 100644 index a58a392..0000000 --- a/libhashtable/hashtable.h +++ /dev/null @@ -1,27 +0,0 @@ -struct entry {//linked list node. - char *original; - void *target; - struct entry *prev;// doubly linked list. why? - struct entry *next; -}; - -struct hitem { - struct entry *ll; -}; - -struct hashtable { - int kl;//number of keys in the table - struct hitem **bucket; - int *keys; -}; -unsigned short hash(char *key);//maybe use a seeded rand()? :) Thanks FreeArtMan -void inittable(struct hashtable *ht,int tsize); -void ll_delete(struct entry *ll); -void ll_destroy(struct entry *ll); -void ht_destroy(struct hashtable *ht); -void ht_freevalues(struct hashtable *ht); -int ht_setkey(struct hashtable *ht,char *key,void *value); -struct entry *ll_getentry(struct entry *start,char *msg); -struct entry *ht_getentry(struct hashtable *ht,char *key); -struct entry *ht_getnode(struct hashtable *ht,char *msg); -void *ht_getvalue(struct hashtable *ht,char *msg); diff --git a/libhashtable/libhashtable.c b/libhashtable/libhashtable.c deleted file mode 100644 index 496a3ee..0000000 --- a/libhashtable/libhashtable.c +++ /dev/null @@ -1,165 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "hashtable.h" - -/* -struct entry {//linked list node. - char *original; - void *target; - struct entry *prev;// doubly linked list. why? - struct entry *next; -}; - -struct hitem { - struct entry *ll; -}; - -struct hashtable { - int kl;//number of keys in the table - struct hitem **bucket; - int *keys; -}; -*/ - -unsigned short hash(char *key) {//maybe use a seeded rand()? :) Thanks FreeArtMan - return (strlen(key)<<8)+(key[0]<<4)+key[1]; -} - -void inittable(struct hashtable *ht,int tsize) { - int i; - ht->bucket=malloc(sizeof(char *)*tsize); - ht->kl=0; - ht->keys=malloc(sizeof(int *)*tsize); - if(!ht) { - fprintf(stderr,"malloc error 6 in hash table.\n"); - return; - } - for(i=0;i<tsize;i++) { - ht->bucket[i]=0; - } -} - -void ll_delete(struct entry *ll) { - //do I have to free() any of this shit? - //keys are always allocated. strdup(). - //gotta free that. anything else isn't my fault. - if(ll->prev) { - ll->prev->next=ll->next; - } else { - //I am the first node. - } - if(ll->next) { - ll->next->prev=ll->prev; - } else { - //I am the last node. - } - free(ll);//all these nodes are malloc()d. -} - -void ll_destroy(struct entry *ll) { - if(ll->next) ll_destroy(ll->next); - free(ll->original); - free(ll); - //destroy_this_node. - //ll->original //malloc()d - //ll->target //I dunno where this comes from. -} - -void ht_destroy(struct hashtable *ht) { - int i=0; - for(i=0;i<ht->kl;i++) { - ll_destroy(ht->bucket[ht->keys[i]]->ll); - } - free(ht->bucket); -} - -void ll_freevalues(struct entry *ll) {//only use if you malloc your table. - if(ll->next) ll_destroy(ll->next); - free(ll->target); -} - -void ht_freevalues(struct hashtable *ht) { - int i; - for(i=0;i<ht->kl;i++) { - ll_freevalues(ht->bucket[ht->keys[i]]->ll); - } -} - -//this seems too complicated. -int ht_setkey(struct hashtable *ht,char *key,void *value) { - unsigned short h; - struct entry *tmp; - int i; - if(!key) key="(null)"; - h=hash(key); - for(i=0;i<ht->kl;i++) { - if(ht->keys[i]==h) break; - } - ht->keys[i]=h; - ht->kl=(ht->kl)>i+1?ht->kl:i+1; - if(!ht->bucket[h]) { //empty bucket! - //add this to the list of used buckets so we can easily - //use that list later for stuff. - if(!(ht->bucket[h]=malloc(sizeof(struct hitem)))) return 1; - ht->bucket[h]->ll=0; - //we now have a valid hashtable entry and a NULL ll in it. - //don't bother with the new ll entry yet... - } - if((tmp=ll_getentry(ht->bucket[h]->ll,key)) != NULL) { - tmp->target=value; - return 0; - } - if(ht->bucket[h]->ll == NULL) { - if(!(ht->bucket[h]->ll=malloc(sizeof(struct entry)))) return 3; - ht->bucket[h]->ll->next=0; - ht->bucket[h]->ll->prev=0; - if(!(ht->bucket[h]->ll->original=strdup(key))) return 4; - ht->bucket[h]->ll->target=value; - } else { - //go to the end and add another entry to the ll. - for(tmp=ht->bucket[h]->ll;tmp->next;tmp=tmp->next); - if(!(tmp->next=malloc(sizeof(struct entry)))) return 6; - tmp->next->prev=tmp; - tmp=tmp->next; - if(!(tmp->original=strdup(key))) return 7; - tmp->target=value; - tmp->next=0; - } - return 0; -} - -struct entry *ll_getentry(struct entry *start,char *key) { - struct entry *m; - if(!key) return NULL; - if(!start) return NULL; - for(m=start;m;m=m->next) { - if(!strncmp(key,m->original,strlen(m->original)) && (key[strlen(m->original)]==' ' || key[strlen(m->original)] == 0)) {//this allows !c to get called when using !c2 if !c2 is defined after !c. >_> - return m; - } - } - return NULL; -} - -//returns the table entry (a linked list) at the key. -struct entry *ht_getentry(struct hashtable *ht,char *key) { - unsigned short h=hash(key); - if(!ht->bucket[h]) return NULL; - return ht->bucket[h]->ll; -} - -//returns the node in the linked list in the table entry that matches the key. -struct entry *ht_getnode(struct hashtable *ht,char *key) { - return ll_getentry(ht_getentry(ht,key),key); -} - -//you'll probably want to use me. -void *ht_getvalue(struct hashtable *ht,char *key) { - struct entry *tmp=ll_getentry(ht_getentry(ht,key),key); - return tmp?tmp->target:0; -} - -//delete the node in the linked list in the table entry that matches the key. -void *ht_delete(struct hashtable *ht,char *key) { - ll_delete(ht_getentry(ht,key)); -} |