Merge pull request #28 from PaytonTurnage/master
Modify htab to have generic function names, and find to be nonredundant.
This commit is contained in:
commit
3b5cbac25b
4 changed files with 53 additions and 43 deletions
|
|
@ -23,8 +23,8 @@ tvm_htab_t* htab_create();
|
|||
void htab_destroy(tvm_htab_t *htab);
|
||||
|
||||
int htab_add(tvm_htab_t *htab, const char *key, int value);
|
||||
int htab_add_str(tvm_htab_t *htab, const char *key, const void *valptr, int len);
|
||||
int htab_add_ref(tvm_htab_t *htab, const char *key, const void *valptr, int len);
|
||||
int htab_find(tvm_htab_t *htab, const char *key);
|
||||
char *htab_find_str(tvm_htab_t *htab, const char *key);
|
||||
char *htab_find_ref(tvm_htab_t *htab, const char *key);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ static void htab_rehash(tvm_htab_t *orig, unsigned int size)
|
|||
next = node->next;
|
||||
if (node->valptr)
|
||||
{
|
||||
htab_add_str(new, node->key, node->valptr, strlen(node->valptr) + 1);
|
||||
htab_add_ref(new, node->key, node->valptr, strlen(node->valptr) + 1);
|
||||
free(node->valptr);
|
||||
}
|
||||
else
|
||||
|
|
@ -87,8 +87,13 @@ static void htab_rehash(tvm_htab_t *orig, unsigned int size)
|
|||
free(new);
|
||||
}
|
||||
|
||||
int htab_add(tvm_htab_t *htab, const char *k, int v)
|
||||
static tvm_htab_node_t *htab_add_core(tvm_htab_t *htab, const char *k)
|
||||
{
|
||||
/* Increase bucket count and rehash if the
|
||||
load factor is too high */
|
||||
if((float)++htab->num_nodes / htab->size > HTAB_LOAD_FACTOR)
|
||||
htab_rehash(htab, htab->num_nodes * 2);
|
||||
|
||||
int hash = htab_hash(k, htab->size);
|
||||
tvm_htab_node_t *node = htab->nodes[hash];
|
||||
tvm_htab_node_t *prev = NULL;
|
||||
|
|
@ -109,66 +114,71 @@ int htab_add(tvm_htab_t *htab, const char *k, int v)
|
|||
node->key = (char *)calloc((strlen(k) + 1), sizeof(char));
|
||||
strcpy(node->key, k);
|
||||
|
||||
node->value = v;
|
||||
|
||||
if(prev) prev->next = node;
|
||||
else htab->nodes[hash] = node; /* root node */
|
||||
|
||||
node->next = NULL;
|
||||
|
||||
/* Increase bucket count and rehash if the
|
||||
load factor is too high */
|
||||
if((float)++htab->num_nodes / htab->size > HTAB_LOAD_FACTOR)
|
||||
htab_rehash(htab, htab->num_nodes * 2);
|
||||
|
||||
return hash;
|
||||
return node;
|
||||
}
|
||||
|
||||
int htab_add_str(tvm_htab_t *htab, const char *key, const void *valptr, int len)
|
||||
int htab_add(tvm_htab_t *htab, const char *key, int value)
|
||||
{
|
||||
int hash = htab_add(htab, key, 0);
|
||||
int found = 0;
|
||||
tvm_htab_node_t *node = htab_add_core(htab, key);
|
||||
|
||||
if (!node)
|
||||
return -1;
|
||||
|
||||
node->value = value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int htab_add_ref(tvm_htab_t *htab, const char *key, const void *valptr, int len)
|
||||
{
|
||||
tvm_htab_node_t *node = htab_add_core(htab, key);
|
||||
|
||||
if (!node)
|
||||
return -1;
|
||||
|
||||
node->valptr = calloc(len, sizeof(char));
|
||||
memcpy(node->valptr, valptr, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static tvm_htab_node_t *htab_find_core(tvm_htab_t *htab, const char *key)
|
||||
{
|
||||
int hash = htab_hash(key, htab->size);
|
||||
tvm_htab_node_t *node = htab->nodes[hash];
|
||||
|
||||
while (node && !found)
|
||||
while (node)
|
||||
{
|
||||
if (!strcmp(node->key, key))
|
||||
found = 1;
|
||||
if(!strcmp(node->key, key))
|
||||
return node;
|
||||
else
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
node->valptr = calloc(len, sizeof(char));
|
||||
memcpy(node->valptr, valptr, len);
|
||||
return hash;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int htab_find(tvm_htab_t *htab, const char *key)
|
||||
{
|
||||
int hash = htab_hash(key, htab->size);
|
||||
tvm_htab_node_t *node = htab->nodes[hash];
|
||||
tvm_htab_node_t *node = htab_find_core(htab, key);
|
||||
|
||||
if(!node)
|
||||
return -1;
|
||||
|
||||
while(node)
|
||||
{
|
||||
if(!strcmp(node->key, key))
|
||||
return node->value;
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
return node->value;
|
||||
}
|
||||
|
||||
char *htab_find_str(tvm_htab_t *htab, const char *key)
|
||||
char *htab_find_ref(tvm_htab_t *htab, const char *key)
|
||||
{
|
||||
int hash = htab_hash(key, htab->size);
|
||||
tvm_htab_node_t *node = htab->nodes[hash];
|
||||
tvm_htab_node_t *node = htab_find_core(htab, key);
|
||||
|
||||
while(node)
|
||||
{
|
||||
if(!strcmp(node->key, key))
|
||||
return node->valptr;
|
||||
node = node->next;
|
||||
}
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
return NULL;
|
||||
return node->valptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ void lex(tvm_lexer_t *lexer, char *source, tvm_htab_t *defines)
|
|||
|
||||
for(j = 0; (pToken && j < MAX_TOKENS); j++)
|
||||
{
|
||||
char *token = htab_find_str(defines, pToken);
|
||||
char *token = htab_find_ref(defines, pToken);
|
||||
token = token ? token : pToken;
|
||||
|
||||
lexer->tokens[i][j] = (char *)calloc(1, (strlen(token) + 1));
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ int tvm_preprocess(char *src, int *src_len, tvm_htab_t *defines)
|
|||
}
|
||||
|
||||
if(htab_find(defines, keystr) < 0)
|
||||
htab_add_str(defines, keystr, valstr, strlen(valstr) + 1);
|
||||
htab_add_ref(defines, keystr, valstr, strlen(valstr) + 1);
|
||||
else
|
||||
{
|
||||
printf("Multiple definitions for %s.\n", keystr);
|
||||
|
|
|
|||
Loading…
Reference in a new issue