diff --git a/DtsodC/src/Hashtable/Hashtable.c b/DtsodC/src/Hashtable/Hashtable.c index 131b45d..3b45aba 100644 --- a/DtsodC/src/Hashtable/Hashtable.c +++ b/DtsodC/src/Hashtable/Hashtable.c @@ -18,7 +18,7 @@ void Hashtable_clear(Hashtable* ht){ ht->type=Null; } -void Hashtable_add_uni(Hashtable* ht,hash_t hash, Unitype val){ +void Hashtable_add_uni(Hashtable* ht,uint32 hash, Unitype val){ } diff --git a/DtsodC/src/Hashtable/Hashtable.h b/DtsodC/src/Hashtable/Hashtable.h index d05e3d3..a249c9d 100644 --- a/DtsodC/src/Hashtable/Hashtable.h +++ b/DtsodC/src/Hashtable/Hashtable.h @@ -13,5 +13,3 @@ typedef struct Hashtable{ Hashtable Hashtable_create(uint16 height,my_type type); void Hashtable_clear(Hashtable* ht); - -void Hashtable_add_uni(Hashtable* ht,hash_t hash, Unitype val); diff --git a/DtsodC/src/Hashtable/hash.c b/DtsodC/src/Hashtable/hash.c index a533fd4..916477a 100644 --- a/DtsodC/src/Hashtable/hash.c +++ b/DtsodC/src/Hashtable/hash.c @@ -1,3 +1,17 @@ #include "hash.h" +uint32 ihash(char *str){ + uint32 hash=5381; + char c; + while(c=*(str++)) + hash=((hash<<5)+hash)+c; //hash=hash*33^c + return hash; +} +uint64 lhash(char* str){ + uint64 hash = 0; + int c; + while (c=*(str++)) + hash=c+(hash<<6)+(hash<<16)-hash; + return hash; +} diff --git a/DtsodC/src/Hashtable/hash.h b/DtsodC/src/Hashtable/hash.h index d36b4b5..6f9ac73 100644 --- a/DtsodC/src/Hashtable/hash.h +++ b/DtsodC/src/Hashtable/hash.h @@ -2,7 +2,7 @@ #include "../base/base.h" -typedef uint32 hash_t; - //djb2 hash function from http://www.cse.yorku.ca/~oz/hash.html -hash_t dhash(char *str); +uint32 ihash(char *str); +//sdbm hash function +uint64 lhash(char* str); diff --git a/DtsodC/src/SearchTree/SearchTree.c b/DtsodC/src/SearchTree/SearchTree.c index 606a040..417ba8e 100644 --- a/DtsodC/src/SearchTree/SearchTree.c +++ b/DtsodC/src/SearchTree/SearchTree.c @@ -9,7 +9,8 @@ STNode* STNode_create(){ return node; } -void STNode_free(STNode* node){ +uint8 nodn=0; +void STNode_free(STNode* node){dbg(0);nodn++; if (!node) throw(ERR_NULLPTR); if(node->branches){ for(uint8 n32 = 0;n32<8;n32++){ @@ -30,11 +31,12 @@ void STNode_free(STNode* node){ } } free(node->branches); - } + }dbg(1); //if value is not freed ptr if(node->value.type>12 && node->value.type<21 && node->value.VoidPtr) - free(node->value.VoidPtr); - free(node); + free(node->value.VoidPtr);dbg(2);printf("nodn %u\n",nodn); + printstnode(node); + free(node);dbg(3);nodn--; } typedef struct {uint8 n32, n4, rem;} indexes3; @@ -47,51 +49,34 @@ indexes3 splitindex(uint8 i){ }; } -uint8 combinei3(indexes3 i3){ - return i3.n32*32+i3.n4*8; -} - -//int16 globytes=0; void ST_push(STNode* node_first, const char* key, Unitype value){ if (!node_first) throw(ERR_NULLPTR); - //int16 bytes=sizeof(Unitype); - char c = *key; + char c=*(key++); STNode* node_last=node_first; - for (uint16 i=0;c!='\0';){ + while(c){ indexes3 i3=splitindex((uint8)c); if(!node_last->branches){ node_last->branches=(STNode****)malloc(8*sizeof(STNode*)); - //bytes+=sizeof(void*)*8; for(uint8 i=0;i<8;i++) node_last->branches[i]=(STNode***)NULL; } - STNode*** ptrn32=(STNode***)node_last->branches[i3.n32]; - if(!ptrn32){ - ptrn32=(STNode***)malloc(8*sizeof(STNode*)); - //bytes+=sizeof(void*)*8; + if(!node_last->branches[i3.n32]){ + node_last->branches[i3.n32]=(STNode***)malloc(8*sizeof(STNode*)); for(uint8 i=0;i<8;i++) - ptrn32[i]=(STNode**)NULL; - node_last->branches[i3.n32]=ptrn32; + node_last->branches[i3.n32][i]=(STNode**)NULL; } - STNode** ptrn4=ptrn32[i3.n4]; - if(!ptrn4){ - ptrn4=(STNode**)malloc(4*sizeof(STNode*)); - //bytes+=sizeof(void*)*4; + if(!node_last->branches[i3.n32][i3.n4]){ + node_last->branches[i3.n32][i3.n4]=(STNode**)malloc(4*sizeof(STNode*)); for(uint8 i=0;i<4;i++) - ptrn4[i]=(STNode*)NULL; - ptrn32[i3.n4]=ptrn4; + node_last->branches[i3.n32][i3.n4][i]=(STNode*)NULL; + node_last->branches[i3.n32][i3.n4]=node_last->branches[i3.n32][i3.n4]; } - node_last=ptrn4[i3.rem]; - if(!node_last){ - node_last=STNode_create(); - //bytes+=sizeof(STNode); - ptrn4[i3.rem]=node_last; - } - c=*(key+(++i)); + if(!node_last->branches[i3.n32][i3.n4][i3.rem]) + node_last->branches[i3.n32][i3.n4][i3.rem]=STNode_create(); + node_last=node_last->branches[i3.n32][i3.n4][i3.rem]; + c=*(key++); } node_last->value=value; - //globytes+=bytes; - //dbg(globytes); } const Unitype UnitypeNull={Null,.VoidPtr=NULL}; diff --git a/DtsodC/src/main.c b/DtsodC/src/main.c index cd11c62..547b59d 100644 --- a/DtsodC/src/main.c +++ b/DtsodC/src/main.c @@ -1,59 +1,32 @@ #include "base/base.h" - #include "tests/tests.h" - #include "Autoarr/Autoarr.h" - #include "SearchTree/SearchTree.h" -#include "Hashtable/hash.c" - - - -#define clrscr() printf("\e[1;1H\e[2J") - - +#include "Hashtable/hash.h" int main(){ - setlocale(LC_ALL, "en-US.Unicode"); - printf("\e[92mdtsod parser in c language!\e[97m\n"); - - test_all(); - + /*test_all(); Unitype a={Double,.Double=9}; - STNode* node=STNode_create(); - ST_push(node,"type", a); - ST_push(node,"time", a); - ST_push(node,"author_id", a); - ST_push(node,"channel_id", a); - ST_push(node,"message_id", a); - ST_push(node,"text", a); - ST_push(node,"files", a); - a=ST_pull(node,""); - - //STNode_free(node); - - printf("%u\n", dhash("000")); - - printf("%u\n", dhash("0000")); - - printf("%u\n", dhash("1111")); - - - - - + STNode_free(node); + printf("%u\n", ihash("0")); + printf("%lu\n", lhash("0")); + printf("%u\n", ihash("1kakdkale210r")); + printf("%lu\n", lhash("1kakdkale210r"));*/ + int** ptr2=NULL; + int a=4; + int* ptr=&a; + ptr2=&ptr; + printf("%p %p",ptr2, *ptr2); return 0; - } -