more changes
This commit is contained in:
parent
6b020756af
commit
ab099339b2
@ -55,6 +55,10 @@ hashtable_iterator_t hashtable_next(struct hashtable * table, hashtable_iterator
|
||||
}
|
||||
|
||||
hashtable_iterator_t hashtable_get_hash(struct hashtable * table, entry_hash_t hash) {
|
||||
if (!table->len) {
|
||||
return hashtable_end(table);
|
||||
}
|
||||
|
||||
size_t index = hash % table->len;
|
||||
|
||||
if (table->data[index].hash == 0) {
|
||||
|
56
main.c
56
main.c
@ -126,41 +126,78 @@ char fgetc_count(FILE *file) {
|
||||
}
|
||||
|
||||
int add_char(char ** str, char c) {
|
||||
if (str == NULL || *str == NULL) {
|
||||
if (str == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int len = strlen(*str);
|
||||
if (*str != NULL) {
|
||||
int len = strlen(*str);
|
||||
|
||||
char *temp = realloc(*str, len + 1);
|
||||
if (temp == NULL) {
|
||||
char *temp = realloc(*str, len + 2);
|
||||
if (temp == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*str = temp;
|
||||
|
||||
(*str)[len] = c;
|
||||
(*str)[len+1] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*str = malloc(2);
|
||||
if (*str == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*str = temp;
|
||||
(*str)[0] = c;
|
||||
(*str)[1] = '\0';
|
||||
|
||||
(*str)[len-1] = c;
|
||||
(*str)[len] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int macro_limiter(char c) {
|
||||
switch(c) {
|
||||
case '\\':
|
||||
// next macro
|
||||
return 1;
|
||||
case '{':
|
||||
// arguments
|
||||
return 2;
|
||||
case '[':
|
||||
// optional arguments
|
||||
return 3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void eval_macro(struct filelist * last, FILE * file) {
|
||||
char * name = NULL;
|
||||
strhash_t hash = 0;
|
||||
hashtable_iterator_t macro;
|
||||
hashtable_iterator_t macro = hashtable_end(last->macros);
|
||||
|
||||
char current = 0;
|
||||
|
||||
// read macro name
|
||||
while(good(file) && current != '\\' && macro == hashtable_end(last->macros)) {
|
||||
while(good(file) && !macro_limiter(current) && macro == hashtable_end(last->macros)) {
|
||||
current = fgetc_count(file);
|
||||
|
||||
hash = strhash_add(hash, current);
|
||||
add_char(&name, current);
|
||||
|
||||
// try to find macro in table
|
||||
macro = hashtable_get_hash(last->macros, hash);
|
||||
}
|
||||
|
||||
if (macro == hashtable_end(last->macros)) {
|
||||
// no macro with that name found
|
||||
printf("%d:%d:macro not found: %s\n", line, pos, name);
|
||||
}
|
||||
|
||||
if (!good(file)) {
|
||||
return;
|
||||
}
|
||||
@ -209,7 +246,6 @@ struct option long_opts[] = {
|
||||
{}, // terminator
|
||||
};
|
||||
|
||||
|
||||
void help(int argc, char ** args) {
|
||||
printf("%s [OPTIONS] file1 file2...\n"
|
||||
"--output\n"
|
||||
|
@ -44,9 +44,6 @@ protected:
|
||||
std::set<Path::Path> includes;
|
||||
};
|
||||
|
||||
#include <functional>
|
||||
|
||||
|
||||
template <typename iterator>
|
||||
std::string readTill(iterator &start, const iterator &end, std::function<bool(const iterator&)> limiter) {
|
||||
iterator current = start;
|
||||
@ -137,7 +134,7 @@ InputExtractor::List InputExtractor::Include(Path::Path path) {
|
||||
}
|
||||
|
||||
cout << endl;
|
||||
|
||||
|
||||
// add to include list
|
||||
includes.insert(path);
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
struct hashtable table = {};
|
||||
struct entry nEntry;
|
||||
|
||||
|
||||
void testresize() {
|
||||
init("resize");
|
||||
int err = hashtable_resize(&table, 20);
|
||||
@ -52,6 +51,13 @@ void* test_copy(void * data) {
|
||||
void testget() {
|
||||
init("get");
|
||||
|
||||
hashtable_clear(&table);
|
||||
|
||||
if (hashtable_get(&table, "hi") != hashtable_end(&table)) {
|
||||
fail("found entry in empty table");
|
||||
}
|
||||
|
||||
hashtable_add(&table, nEntry);
|
||||
hashtable_iterator_t elem = hashtable_get(&table, "hi");
|
||||
|
||||
if (elem == hashtable_end(&table)) {
|
||||
|
Loading…
Reference in New Issue
Block a user