diff --git a/DtsodC/src/Autoarr/Autoarr.c b/DtsodC/src/Autoarr/Autoarr.c new file mode 100644 index 0000000..e22daaf --- /dev/null +++ b/DtsodC/src/Autoarr/Autoarr.c @@ -0,0 +1,23 @@ +#include "Autoarr.h" + +define_Autoarr(uint8) +define_Autoarr(int8) +define_Autoarr(uint16) +define_Autoarr(int16) +define_Autoarr(uint32) +define_Autoarr(int32) +define_Autoarr(uint64) +define_Autoarr(int64) +define_Autoarr(float) +define_Autoarr(double) +define_Autoarr(Unitype) + +//right func to clear array of unitype values +void Autoarr_Unitype_clear(Autoarr(Unitype)* ar){ + for(uint32 blockI=0;blockIblocks_count-1;blockI++) + for(uint32 elemI=0;elemImax_block_length;elemI++) + Unitype_free(ar->values[blockI][elemI]); + for(uint32 elemI=0;elemIblock_length;elemI++) + Unitype_free(ar->values[ar->blocks_count-1][elemI]); + Autoarr_clear(ar); +} diff --git a/DtsodC/src/Autoarr/Autoarr.h b/DtsodC/src/Autoarr/Autoarr.h new file mode 100644 index 0000000..5be5860 --- /dev/null +++ b/DtsodC/src/Autoarr/Autoarr.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Autoarr_declare.h" +#include "Autoarr_define.h" + +declare_Autoarr(uint8) +declare_Autoarr(int8) +declare_Autoarr(uint16) +declare_Autoarr(int16) +declare_Autoarr(uint32) +declare_Autoarr(int32) +declare_Autoarr(uint64) +declare_Autoarr(int64) +declare_Autoarr(float) +declare_Autoarr(double) +declare_Autoarr(Unitype) + +//right func to clear array of unitype values +void Autoarr_Unitype_clear(Autoarr(Unitype)* ar); diff --git a/DtsodC/src/Autoarr/Autoarr2.c b/DtsodC/src/Autoarr/Autoarr2.c deleted file mode 100644 index 84888c2..0000000 --- a/DtsodC/src/Autoarr/Autoarr2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "Autoarr2.h" - -define_Autoarr2(uint8) -define_Autoarr2(int8) -define_Autoarr2(uint16) -define_Autoarr2(int16) -define_Autoarr2(uint32) -define_Autoarr2(int32) -define_Autoarr2(uint64) -define_Autoarr2(int64) -define_Autoarr2(float) -define_Autoarr2(double) -define_Autoarr2(Unitype) - -//right func to clear array of unitype values -void Autoarr2_Unitype_clear(Autoarr2(Unitype)* ar){ - for(uint32 blockI=0;blockIblocks_count-1;blockI++) - for(uint32 elemI=0;elemImax_block_length;elemI++) - Unitype_free(ar->values[blockI][elemI]); - for(uint32 elemI=0;elemIblock_length;elemI++) - Unitype_free(ar->values[ar->blocks_count-1][elemI]); - Autoarr2_clear(ar); -} diff --git a/DtsodC/src/Autoarr/Autoarr2.h b/DtsodC/src/Autoarr/Autoarr2.h deleted file mode 100644 index 1eed943..0000000 --- a/DtsodC/src/Autoarr/Autoarr2.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "Autoarr2_declare.h" -#include "Autoarr2_define.h" - -declare_Autoarr2(uint8) -declare_Autoarr2(int8) -declare_Autoarr2(uint16) -declare_Autoarr2(int16) -declare_Autoarr2(uint32) -declare_Autoarr2(int32) -declare_Autoarr2(uint64) -declare_Autoarr2(int64) -declare_Autoarr2(float) -declare_Autoarr2(double) -declare_Autoarr2(Unitype) - -//right func to clear array of unitype values -void Autoarr2_Unitype_clear(Autoarr2(Unitype)* ar); diff --git a/DtsodC/src/Autoarr/Autoarr2_declare.h b/DtsodC/src/Autoarr/Autoarr2_declare.h deleted file mode 100644 index 39e975f..0000000 --- a/DtsodC/src/Autoarr/Autoarr2_declare.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include "../base/base.h" - -#define declare_Autoarr2(type)\ -\ -struct Autoarr2_##type;\ -\ -typedef struct {\ - void (*add)(struct Autoarr2_##type* ar, type element);\ - type (*get)(struct Autoarr2_##type* ar, uint32 index);\ - type* (*getptr)(struct Autoarr2_##type* ar, uint32 index);\ - void (*set)(struct Autoarr2_##type* ar, uint32 index, type element);\ - void (*clear)(struct Autoarr2_##type* ar);\ -} __functions_list_t_##type;\ -\ -typedef struct Autoarr2_##type{\ - uint16 blocks_count;\ - uint16 max_blocks_count;\ - uint16 block_length;\ - uint16 max_block_length;\ - type** values;\ - __functions_list_t_##type* functions;\ -} Autoarr2_##type;\ -\ -void __Autoarr2_add_##type(Autoarr2_##type* ar, type element);\ -type __Autoarr2_get_##type(Autoarr2_##type* ar, uint32 index);\ -type* __Autoarr2_getptr_##type(Autoarr2_##type* ar, uint32 index);\ -void __Autoarr2_set_##type(Autoarr2_##type* ar, uint32 index, type element);\ -void __Autoarr2_clear_##type(Autoarr2_##type* ar);\ -Autoarr2_##type __Autoarr2_create_##type(uint16 max_blocks_count, uint16 max_block_length); - -#define Autoarr2(type) Autoarr2_##type - -#define Autoarr2_add(autoarr, element)\ - autoarr->functions->add(autoarr, element) -#define Autoarr2_get(autoarr, index)\ - autoarr->functions->get(autoarr,index) -#define Autoarr2_getptr(autoarr, index)\ - autoarr->functions->getptr(autoarr,index) -#define Autoarr2_set(autoarr, index, element)\ - autoarr->functions->set(autoarr, index, element) -#define Autoarr2_clear(autoarr)\ - autoarr->functions->clear(autoarr) -#define Autoarr2_create(type, max_blocks_count, max_block_length)\ - __Autoarr2_create_##type(max_blocks_count, max_block_length) - -#define Autoarr2_length(autoarr) \ - (uint32)(!autoarr->blocks_count ? 0 : \ - autoarr->max_block_length*(autoarr->blocks_count-1)+autoarr->block_length) -#define Autoarr2_max_length(autoarr)\ - (uint32)(autoarr->max_block_length*autoarr->max_blocks_count) diff --git a/DtsodC/src/Autoarr/Autoarr_declare.h b/DtsodC/src/Autoarr/Autoarr_declare.h new file mode 100644 index 0000000..e9e5443 --- /dev/null +++ b/DtsodC/src/Autoarr/Autoarr_declare.h @@ -0,0 +1,52 @@ +#pragma once + +#include "../base/base.h" + +#define declare_Autoarr(type)\ +\ +struct Autoarr_##type;\ +\ +typedef struct {\ + void (*add)(struct Autoarr_##type* ar, type element);\ + type (*get)(struct Autoarr_##type* ar, uint32 index);\ + type* (*getptr)(struct Autoarr_##type* ar, uint32 index);\ + void (*set)(struct Autoarr_##type* ar, uint32 index, type element);\ + void (*clear)(struct Autoarr_##type* ar);\ +} __functions_list_t_##type;\ +\ +typedef struct Autoarr_##type{\ + uint16 blocks_count;\ + uint16 max_blocks_count;\ + uint16 block_length;\ + uint16 max_block_length;\ + type** values;\ + __functions_list_t_##type* functions;\ +} Autoarr_##type;\ +\ +void __Autoarr_add_##type(Autoarr_##type* ar, type element);\ +type __Autoarr_get_##type(Autoarr_##type* ar, uint32 index);\ +type* __Autoarr_getptr_##type(Autoarr_##type* ar, uint32 index);\ +void __Autoarr_set_##type(Autoarr_##type* ar, uint32 index, type element);\ +void __Autoarr_clear_##type(Autoarr_##type* ar);\ +Autoarr_##type __Autoarr_create_##type(uint16 max_blocks_count, uint16 max_block_length); + +#define Autoarr(type) Autoarr_##type + +#define Autoarr_add(autoarr, element)\ + autoarr->functions->add(autoarr, element) +#define Autoarr_get(autoarr, index)\ + autoarr->functions->get(autoarr,index) +#define Autoarr_getptr(autoarr, index)\ + autoarr->functions->getptr(autoarr,index) +#define Autoarr_set(autoarr, index, element)\ + autoarr->functions->set(autoarr, index, element) +#define Autoarr_clear(autoarr)\ + autoarr->functions->clear(autoarr) +#define Autoarr_create(type, max_blocks_count, max_block_length)\ + __Autoarr_create_##type(max_blocks_count, max_block_length) + +#define Autoarr_length(autoarr) \ + (uint32)(!autoarr->blocks_count ? 0 : \ + autoarr->max_block_length*(autoarr->blocks_count-1)+autoarr->block_length) +#define Autoarr_max_length(autoarr)\ + (uint32)(autoarr->max_block_length*autoarr->max_blocks_count) diff --git a/DtsodC/src/Autoarr/Autoarr2_define.h b/DtsodC/src/Autoarr/Autoarr_define.h similarity index 60% rename from DtsodC/src/Autoarr/Autoarr2_define.h rename to DtsodC/src/Autoarr/Autoarr_define.h index 4924789..a02d2ff 100644 --- a/DtsodC/src/Autoarr/Autoarr2_define.h +++ b/DtsodC/src/Autoarr/Autoarr_define.h @@ -2,9 +2,9 @@ #include "../base/base.h" -#define define_Autoarr2(type)\ +#define define_Autoarr(type)\ \ -void __Autoarr2_add_##type(Autoarr2_##type* ar, type element){\ +void __Autoarr_add_##type(Autoarr_##type* ar, type element){\ if(!ar->values){\ ar->values=malloc(ar->max_blocks_count*sizeof(type*));\ goto create_block;\ @@ -20,22 +20,22 @@ create_block:\ ar->block_length++;\ }\ \ -type __Autoarr2_get_##type(Autoarr2_##type* ar, uint32 index){\ - if(index>=Autoarr2_length(ar)) throw(ERR_WRONGINDEX);\ +type __Autoarr_get_##type(Autoarr_##type* ar, uint32 index){\ + if(index>=Autoarr_length(ar)) throw(ERR_WRONGINDEX);\ return ar->values[index/ar->max_block_length][index%ar->max_block_length];\ }\ \ -type* __Autoarr2_getptr_##type(Autoarr2_##type* ar, uint32 index){\ - if(index>=Autoarr2_length(ar)) throw(ERR_WRONGINDEX);\ +type* __Autoarr_getptr_##type(Autoarr_##type* ar, uint32 index){\ + if(index>=Autoarr_length(ar)) throw(ERR_WRONGINDEX);\ return ar->values[index/ar->max_block_length]+(index%ar->max_block_length);\ }\ \ -void __Autoarr2_set_##type(Autoarr2_##type* ar, uint32 index, type element){\ - if(index>=Autoarr2_length(ar)) throw(ERR_WRONGINDEX);\ +void __Autoarr_set_##type(Autoarr_##type* ar, uint32 index, type element){\ + if(index>=Autoarr_length(ar)) throw(ERR_WRONGINDEX);\ ar->values[index/ar->max_block_length][index%ar->max_block_length]=element;\ }\ \ -void __Autoarr2_clear_##type(Autoarr2_##type* ar){\ +void __Autoarr_clear_##type(Autoarr_##type* ar){\ for(uint16 i=0; iblocks_count;i++)\ free(ar->values[i]); \ free(ar->values);\ @@ -45,15 +45,15 @@ void __Autoarr2_clear_##type(Autoarr2_##type* ar){\ }\ \ __functions_list_t_##type __functions_list_##type={\ - &__Autoarr2_add_##type,\ - &__Autoarr2_get_##type,\ - &__Autoarr2_getptr_##type,\ - &__Autoarr2_set_##type,\ - &__Autoarr2_clear_##type\ + &__Autoarr_add_##type,\ + &__Autoarr_get_##type,\ + &__Autoarr_getptr_##type,\ + &__Autoarr_set_##type,\ + &__Autoarr_clear_##type\ };\ \ -Autoarr2_##type __Autoarr2_create_##type(uint16 max_blocks_count, uint16 max_block_length){\ - return (Autoarr2_##type){\ +Autoarr_##type __Autoarr_create_##type(uint16 max_blocks_count, uint16 max_block_length){\ + return (Autoarr_##type){\ .max_blocks_count=max_blocks_count,\ .blocks_count=0,\ .max_block_length=max_block_length,\ diff --git a/DtsodC/src/Autoarr/StringBuilder.c b/DtsodC/src/Autoarr/StringBuilder.c index 2a3c3ee..755b449 100644 --- a/DtsodC/src/Autoarr/StringBuilder.c +++ b/DtsodC/src/Autoarr/StringBuilder.c @@ -1,24 +1,24 @@ #include "StringBuilder.h" StringBuilder StringBuilder_create(uint16 max_blocks_count, uint16 max_block_length){ - return Autoarr2_create(int8,max_blocks_count,max_block_length); + return Autoarr_create(int8,max_blocks_count,max_block_length); } void StringBuilder_append(StringBuilder* b, char c){ - Autoarr2_add(b,c); + Autoarr_add(b,c); } void StringBuilder_append_str(StringBuilder* b, char* s){ char c; while((c=*s++)) - Autoarr2_add(b,c); + Autoarr_add(b,c); } char* StringBuilder_build(StringBuilder* b){ - uint32 len=Autoarr2_length(b); + uint32 len=Autoarr_length(b); char* str=malloc(len+1); str[len]=0; for(uint32 i=0;ihein=HT_HEIN_MIN; - ht->rows=malloc(HT_HEIGHTS[HT_HEIN_MIN]*sizeof(Autoarr2(KeyValuePair))); + ht->rows=malloc(HT_HEIGHTS[HT_HEIN_MIN]*sizeof(Autoarr(KeyValuePair))); for(uint16 i=0;irows[i]=Autoarr2_create(KeyValuePair,ARR_BC,ARR_BL); + ht->rows[i]=Autoarr_create(KeyValuePair,ARR_BC,ARR_BL); return ht; } void Hashtable_free(Hashtable* ht){ for(uint16 i=0;ihein];i++){ - Autoarr2_KeyValuePair_clear(ht->rows+i); + Autoarr_KeyValuePair_clear(ht->rows+i); } free(ht->rows); free(ht); @@ -30,27 +30,27 @@ uint32 Hashtable_height(Hashtable* ht){ return HT_HEIGHTS[ht->hein]; } void Hashtable_expand(Hashtable* ht){ if(ht->hein>=HT_HEIN_MAX) throw(ERR_MAXLENGTH); - Autoarr2(KeyValuePair)* newrows=malloc(HT_HEIGHTS[++ht->hein]*sizeof(Autoarr2(KeyValuePair))); + Autoarr(KeyValuePair)* newrows=malloc(HT_HEIGHTS[++ht->hein]*sizeof(Autoarr(KeyValuePair))); for(uint16 i=0;ihein];i++) - newrows[i]=Autoarr2_create(KeyValuePair,ARR_BC,ARR_BL); + newrows[i]=Autoarr_create(KeyValuePair,ARR_BC,ARR_BL); for(uint16 i=0;ihein-1];i++){ - Autoarr2(KeyValuePair)* ar=ht->rows+i; - uint32 arlen=Autoarr2_length(ar); + Autoarr(KeyValuePair)* ar=ht->rows+i; + uint32 arlen=Autoarr_length(ar); for(uint16 k=0;khein]; - Autoarr2(KeyValuePair)* newar=newrows+newrown; - Autoarr2_add(newar,p); + Autoarr(KeyValuePair)* newar=newrows+newrown; + Autoarr_add(newar,p); } - Autoarr2_clear(ar); + Autoarr_clear(ar); } free(ht->rows); ht->rows=newrows; } -Autoarr2(KeyValuePair)* getrow(Hashtable* ht, char* key, bool can_expand){ - Autoarr2(KeyValuePair)* ar=ht->rows+ihash(key)%HT_HEIGHTS[ht->hein]; - if(can_expand && Autoarr2_length(ar)==Autoarr2_max_length(ar)) +Autoarr(KeyValuePair)* getrow(Hashtable* ht, char* key, bool can_expand){ + Autoarr(KeyValuePair)* ar=ht->rows+ihash(key)%HT_HEIGHTS[ht->hein]; + if(can_expand && Autoarr_length(ar)==Autoarr_max_length(ar)) optime("expand",1,(Hashtable_expand(ht))); ar=ht->rows+ihash(key)%HT_HEIGHTS[ht->hein]; return ar; @@ -58,7 +58,7 @@ Autoarr2(KeyValuePair)* getrow(Hashtable* ht, char* key, bool can_expand){ void Hashtable_add_pair(Hashtable* ht, KeyValuePair p){ - Autoarr2_add(getrow(ht,p.key,true),p); + Autoarr_add(getrow(ht,p.key,true),p); } void Hashtable_add(Hashtable* ht, char* key, Unitype u){ Hashtable_add_pair(ht,KVPair(key,u)); @@ -66,20 +66,20 @@ void Hashtable_add(Hashtable* ht, char* key, Unitype u){ //returns null or pointer to value in hashtable Unitype* Hashtable_getptr(Hashtable* ht, char* key){ - Autoarr2(KeyValuePair)* ar=getrow(ht,key,false); - uint32 arlen=Autoarr2_length(ar); + Autoarr(KeyValuePair)* ar=getrow(ht,key,false); + uint32 arlen=Autoarr_length(ar); for(uint32 i=0;ikey)) return &p->value; } return NULL; } Unitype Hashtable_get(Hashtable* ht, char* key){ - Autoarr2(KeyValuePair)* ar=getrow(ht,key,false); - uint32 arlen=Autoarr2_length(ar); + Autoarr(KeyValuePair)* ar=getrow(ht,key,false); + uint32 arlen=Autoarr_length(ar); for(uint32 i=0;iblocks_count-1; blockI++) for(uint16 elemI=0; elemI < ar->max_block_length; elemI++) KeyValuePair_free(ar->values[blockI][elemI]); for(uint16 elemI=0; elemI < ar->block_length; elemI++) KeyValuePair_free(ar->values[ar->blocks_count-1][elemI]); - Autoarr2_clear(ar); + Autoarr_clear(ar); } diff --git a/DtsodC/src/Hashtable/KeyValuePair.h b/DtsodC/src/Hashtable/KeyValuePair.h index 130b71f..462e3dd 100644 --- a/DtsodC/src/Hashtable/KeyValuePair.h +++ b/DtsodC/src/Hashtable/KeyValuePair.h @@ -1,15 +1,15 @@ #include "../base/base.h" -#include "../Autoarr/Autoarr2.h" +#include "../Autoarr/Autoarr.h" typedef struct KeyValuePair{ char* key; Unitype value; } KeyValuePair; -declare_Autoarr2(KeyValuePair) +declare_Autoarr(KeyValuePair) //proper way to clear a KVP void KeyValuePair_free(KeyValuePair p); //func to clear KVP array -void Autoarr2_KeyValuePair_clear(Autoarr2_KeyValuePair* ar); +void Autoarr_KeyValuePair_clear(Autoarr_KeyValuePair* ar); diff --git a/DtsodC/src/base/types.c b/DtsodC/src/base/types.c index 6841722..36436f2 100644 --- a/DtsodC/src/base/types.c +++ b/DtsodC/src/base/types.c @@ -1,6 +1,6 @@ #include "types.h" #include "errors.h" -#include "../Autoarr/Autoarr2.h" +#include "../Autoarr/Autoarr.h" #include "../Hashtable/Hashtable.h" #include "../SearchTree/SearchTree.h" @@ -80,36 +80,36 @@ void Unitype_free(Unitype u){ STNode_free(u.VoidPtr); break; case AutoarrInt8Ptr: - Autoarr2_clear(((Autoarr2(int8)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(int8)*)u.VoidPtr)); break; case AutoarrUInt8Ptr: - Autoarr2_clear(((Autoarr2(uint8)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(uint8)*)u.VoidPtr)); break; case AutoarrInt16Ptr: - Autoarr2_clear(((Autoarr2(int16)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(int16)*)u.VoidPtr)); break; case AutoarrUInt16Ptr: - Autoarr2_clear(((Autoarr2(uint16)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(uint16)*)u.VoidPtr)); break; case AutoarrInt32Ptr: - Autoarr2_clear(((Autoarr2(int32)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(int32)*)u.VoidPtr)); break; case AutoarrUInt32Ptr: - Autoarr2_clear(((Autoarr2(uint32)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(uint32)*)u.VoidPtr)); break; case AutoarrInt64Ptr: - Autoarr2_clear(((Autoarr2(int64)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(int64)*)u.VoidPtr)); break; case AutoarrUInt64Ptr: - Autoarr2_clear(((Autoarr2(uint64)*)u.VoidPtr)); + Autoarr_clear(((Autoarr(uint64)*)u.VoidPtr)); break; case AutoarrUnitypePtr: - Autoarr2_Unitype_clear(u.VoidPtr); - free((Autoarr2(Unitype)*)u.VoidPtr); + Autoarr_Unitype_clear(u.VoidPtr); + free((Autoarr(Unitype)*)u.VoidPtr); break; case AutoarrKVPairPtr: - Autoarr2_KeyValuePair_clear(u.VoidPtr); - free((Autoarr2(KeyValuePair)*)u.VoidPtr); + Autoarr_KeyValuePair_clear(u.VoidPtr); + free((Autoarr(KeyValuePair)*)u.VoidPtr); break; default: throw(ERR_WRONGTYPE); } diff --git a/DtsodC/tests/main.c b/DtsodC/tests/main.c index 1746a84..b5b2fcf 100644 --- a/DtsodC/tests/main.c +++ b/DtsodC/tests/main.c @@ -16,7 +16,7 @@ void printuni(Unitype v){ void test_all(){ test_searchtree(); - test_autoarr2(); + test_autoarr(); test_hashtable(); test_string(); test_dtsod(); diff --git a/DtsodC/tests/test_autoarr.c b/DtsodC/tests/test_autoarr.c new file mode 100644 index 0000000..a0ded06 --- /dev/null +++ b/DtsodC/tests/test_autoarr.c @@ -0,0 +1,52 @@ +#include "tests.h" +#include "../src/Autoarr/Autoarr.h" + +static void printautoarr(Autoarr(uint16)* ar){ + printf("\e[94mAutoarr(uint16): %lu\n" + " max_blocks_count: %u\n" + " blocks_count: %u\n" + " max_block_length: %u\n" + " block_length: %u\n" + " max_length: %u\n" + " length: %u\n", + sizeof(Autoarr(uint16)), + ar->max_blocks_count, + ar->blocks_count, + ar->max_block_length, + ar->block_length, + Autoarr_max_length(ar), + Autoarr_length(ar)); +} + +static void fillar(Autoarr(uint16)* ar){ + for (uint16 i=0;imax_blocks_count, - ar->blocks_count, - ar->max_block_length, - ar->block_length, - Autoarr2_max_length(ar), - Autoarr2_length(ar)); -} - -static void fillar(Autoarr2(uint16)* ar){ - for (uint16 i=0;i\n\e[94m"); Unitype msg=Hashtable_get(dtsod,"message"); printuni(msg); - Autoarr2(Unitype)* ar=msg.VoidPtr; - id=Hashtable_get(Autoarr2_get(ar,0).VoidPtr,"message_id"); + Autoarr(Unitype)* ar=msg.VoidPtr; + id=Hashtable_get(Autoarr_get(ar,0).VoidPtr,"message_id"); printf("\e[92m\nmessage_id: %lu\n",id.UInt64); Hashtable_free(dtsod); })); diff --git a/DtsodC/tests/test_hashtable.c b/DtsodC/tests/test_hashtable.c index d40b56c..9bb8d62 100644 --- a/DtsodC/tests/test_hashtable.c +++ b/DtsodC/tests/test_hashtable.c @@ -25,8 +25,8 @@ void printrowgraph(Hashtable* ht){ for(uint32 i=0; irows+h; - uint32 l=Autoarr2_length(ar); + Autoarr(KeyValuePair)* ar=ht->rows+h; + uint32 l=Autoarr_length(ar); lgs[l]++; } for(uint32 i=0; i