diff options
Diffstat (limited to 'src/engine/eachdo.c')
-rw-r--r-- | src/engine/eachdo.c | 243 |
1 files changed, 122 insertions, 121 deletions
diff --git a/src/engine/eachdo.c b/src/engine/eachdo.c index 463ae08..d503256 100644 --- a/src/engine/eachdo.c +++ b/src/engine/eachdo.c @@ -34,7 +34,7 @@ extern msg_t *msg; static int comp(const void *a, const void *b) { - return ((atom_t *) b)->priority - ((atom_t *) a)->priority; + return ((atom_t *) b)->priority - ((atom_t *) a)->priority; } /* @@ -55,42 +55,42 @@ write_eachdo_iteration(list_t *atoms, list_t *values, int priority) { - atom_t *atom = malloc(sizeof(atom_t)); - atom->priority = priority; - atom->content = calloc(1, sizeof(char)); - - for (size_t i = 0; i < directives->size; i++) { - directive_t *_directive = list_get(directives, i); - switch (_directive->type) { - case _RAW: { - atom->content - = realloc(atom->content, - strlen(atom->content) + strlen(_directive->operands) + 1); - strcat(atom->content, _directive->operands); - break; + atom_t *atom = malloc(sizeof(atom_t)); + atom->priority = priority; + atom->content = calloc(1, sizeof(char)); + + for (size_t i = 0; i < directives->size; i++) { + directive_t *_directive = list_get(directives, i); + switch (_directive->type) { + case _RAW: { + atom->content = realloc(atom->content, + strlen(atom->content) + + strlen(_directive->operands) + 1); + strcat(atom->content, _directive->operands); + break; + } + + case PUT: { + char *key = unwrap(list_find_corresponding_value_from_ptr_wrapper( + keys, values, trim(_directive->operands))); + + if (key != NULL) { + atom->content = realloc( + atom->content, strlen(atom->content) + strlen(key) + 1); + strcat(atom->content, key); + } + + break; + } + + default: + /* TODO: Handle this */ + break; + } } - case PUT: { - char *key = unwrap(list_find_corresponding_value_from_ptr_wrapper( - keys, values, trim(_directive->operands))); - - if (key != NULL) { - atom->content - = realloc(atom->content, strlen(atom->content) + strlen(key) + 1); - strcat(atom->content, key); - } - - break; - } - - default: - /* TODO: Handle this */ - break; - } - } - - list_add(atoms, atom); - free(atom); + list_add(atoms, atom); + free(atom); } /* @@ -107,50 +107,50 @@ handle_file_source(list_t *atoms, eachdo_operands_t *operands, list_t *directives) { - char *path; - asprintf(&path, "%s/%s", msg->base_directory, trim(operands->key)); - list_t *files = enumfilesindir(path); - free(path); - - if (files == NULL) { - printf("Could not find key %s\n", trim(operands->key)); - free(operands); - return; - } - - for (size_t i = 0; i < files->size; i++) { - char *file_path = unwrap(list_get(files, i)); - asprintf(&path, - "%s/%s/%s", - msg->base_directory, - trim(operands->key), - file_path); - - int len = strlen(path); - char *comparable = &path[len - strlen("index.html")]; - if (strcmp(comparable, "index.html") == 0) { - free(path); - free(file_path); - continue; - } - - config_t *config = config_fetch_and_parse(path); - - int priority = 0; - char *priority_string - = unwrap(list_find_corresponding_value_from_ptr_wrapper( - config->keys, config->values, "priority")); - if (priority_string != NULL) - priority = atoll(priority_string); + char *path; + asprintf(&path, "%s/%s", msg->base_directory, trim(operands->key)); + list_t *files = enumfilesindir(path); + free(path); - write_eachdo_iteration( - atoms, directives, config->keys, config->values, priority); + if (files == NULL) { + printf("Could not find key %s\n", trim(operands->key)); + free(operands); + return; + } - config_delete(config); - free(file_path); - free(path); - } - list_delete(files); + for (size_t i = 0; i < files->size; i++) { + char *file_path = unwrap(list_get(files, i)); + asprintf(&path, + "%s/%s/%s", + msg->base_directory, + trim(operands->key), + file_path); + + int len = strlen(path); + char *comparable = &path[len - strlen("index.html")]; + if (strcmp(comparable, "index.html") == 0) { + free(path); + free(file_path); + continue; + } + + config_t *config = config_fetch_and_parse(path); + + int priority = 0; + char *priority_string + = unwrap(list_find_corresponding_value_from_ptr_wrapper( + config->keys, config->values, "priority")); + if (priority_string != NULL) + priority = atoll(priority_string); + + write_eachdo_iteration( + atoms, directives, config->keys, config->values, priority); + + config_delete(config); + free(file_path); + free(path); + } + list_delete(files); } /* @@ -165,56 +165,57 @@ handle_file_source(list_t *atoms, void handle_eachdo(char **buffer, key_match_t *match, directive_t *directive) { - eachdo_operands_t *operands = directive->operands; + eachdo_operands_t *operands = directive->operands; - engine_t *engine = engine_ingest(&operands->content); - engine_delete(engine); - list_t *directives = lex(operands->content); + engine_t *engine = engine_ingest(&operands->content); + engine_delete(engine); + list_t *directives = lex(operands->content); - list_t *atoms = list_create(sizeof(atom_t)); + list_t *atoms = list_create(sizeof(atom_t)); - char *content = calloc(1, sizeof(char)); + char *content = calloc(1, sizeof(char)); - if (!strcmp(operands->source, "resources")) - handle_file_source(atoms, operands, directives); - else { - printf("Unknown source: %s\n", operands->source); - /* TODO: handle this gracefully */ - return; - } + if (!strcmp(operands->source, "resources")) + handle_file_source(atoms, operands, directives); + else { + printf("Unknown source: %s\n", operands->source); + /* TODO: handle this gracefully */ + return; + } - /* Sort atoms by priority */ - qsort(atoms->elements, atoms->size, sizeof(atom_t), comp); + /* Sort atoms by priority */ + qsort(atoms->elements, atoms->size, sizeof(atom_t), comp); - for (size_t i = 0; i < atoms->size; i++) { - atom_t *atom = list_get(atoms, i); - content = realloc(content, strlen(content) + strlen(atom->content) + 1); + for (size_t i = 0; i < atoms->size; i++) { + atom_t *atom = list_get(atoms, i); + content + = realloc(content, strlen(content) + strlen(atom->content) + 1); #ifdef DEBUG - printf("PRIORITY: %lu\n", atom->priority); + printf("PRIORITY: %lu\n", atom->priority); #endif - strcat(content, atom->content); - } - - char *temp_buffer = strdup(*buffer); - free(*buffer); - asprintf(buffer, - "%.*s%s%s\n", - match->offset, - temp_buffer, - content, - temp_buffer + operands->length); - free(temp_buffer); - free(content); - - for (size_t i = 0; i < directives->size; i++) { - directive_t *_directive = list_get(directives, i); - free(_directive->operands); - } - list_delete(directives); - - for (size_t i = 0; i < atoms->size; i++) { - atom_t *atom = list_get(atoms, i); - free(atom->content); - } - list_delete(atoms); + strcat(content, atom->content); + } + + char *temp_buffer = strdup(*buffer); + free(*buffer); + asprintf(buffer, + "%.*s%s%s\n", + match->offset, + temp_buffer, + content, + temp_buffer + operands->length); + free(temp_buffer); + free(content); + + for (size_t i = 0; i < directives->size; i++) { + directive_t *_directive = list_get(directives, i); + free(_directive->operands); + } + list_delete(directives); + + for (size_t i = 0; i < atoms->size; i++) { + atom_t *atom = list_get(atoms, i); + free(atom->content); + } + list_delete(atoms); } |