diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hashmap.c | 10 | ||||
-rw-r--r-- | src/hashmap.h | 3 | ||||
-rw-r--r-- | src/hyde.c | 5 | ||||
-rw-r--r-- | src/template.c | 27 | ||||
-rw-r--r-- | src/template.h | 2 |
5 files changed, 27 insertions, 20 deletions
diff --git a/src/hashmap.c b/src/hashmap.c index 3d9edd0..b56b364 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -3,6 +3,8 @@ #include <err.h> #include "hashmap.h" +#define HASH(v) (v[0] - 'a') % HASHMAP_CAP + struct node { char *key; void *value; @@ -12,7 +14,7 @@ struct node { struct hashmap *hashmap_new() { struct hashmap *hm = malloc(sizeof *hm); if (!hm) err(EXIT_FAILURE, "out of memory"); - for (int i=0; i < 26; i++) { + for (int i=0; i < HASHMAP_CAP; i++) { hm->buckets[i] = NULL; } @@ -20,7 +22,7 @@ struct hashmap *hashmap_new() { } void hashmap_insert(struct hashmap *hm, char *key, void *value) { - int pos = (key[0] - 'a') % 26; + int pos = HASH(key); struct node *head = hm->buckets[pos]; struct node *node = head; @@ -40,7 +42,7 @@ void hashmap_insert(struct hashmap *hm, char *key, void *value) { } void *hashmap_get(struct hashmap *hm, char *key) { - int pos = (key[0] - 'a') % 26; + int pos = HASH(key); struct node *node = hm->buckets[pos]; while (node) { if (strcmp(node->key, key) == 0) { @@ -61,7 +63,7 @@ void hashmap_free(struct hashmap *hm) { struct node *node; struct node *next; - for (int i=0; i < 26; i++) { + for (int i=0; i < HASHMAP_CAP; i++) { node = hm->buckets[i]; while (node) { next = node->next; diff --git a/src/hashmap.h b/src/hashmap.h index a37d3d6..93297af 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -1,6 +1,7 @@ +#define HASHMAP_CAP 26 struct hashmap { - struct node *buckets[26]; + struct node *buckets[HASHMAP_CAP]; }; void hashmap_insert(struct hashmap *hm, char *key, void *value); @@ -1,4 +1,5 @@ #include "template.h" +#include <stdio.h> #include <stdlib.h> int main() { @@ -21,7 +22,9 @@ int main() { }; hashmap_insert(ctx, "posts", &posts); - template(input, ctx); + char *output = template(input, ctx); + printf("Output: %s\n", output); hashmap_free(ctx); free(input); + free(output); }
\ No newline at end of file diff --git a/src/template.c b/src/template.c index 5d400b9..1a3c049 100644 --- a/src/template.c +++ b/src/template.c @@ -89,24 +89,25 @@ mpc_parser_t *parser_init() { return Template; } -void template(char *tmpl, struct hashmap *ctx) { +char * template(char *tmpl, struct hashmap *ctx) { mpc_parser_t *parser = parser_init(); mpc_result_t r; - if (mpc_parse("input", tmpl, parser, &r)) { - mpc_ast_print(r.output); - - // FIXME: Allocate precisely - char *output = malloc(strlen(tmpl) * 2); - output[0] = '\0'; - eval(output, r.output, ctx); - printf("Template: \n%s", output); - - mpc_ast_delete(r.output); - free(output); - } else { + if (!mpc_parse("input", tmpl, parser, &r)) { mpc_err_print(r.error); mpc_err_delete(r.error); + return NULL; } + + mpc_ast_print(r.output); + + // FIXME: Allocate precisely + char *output = malloc(strlen(tmpl) * 2); + output[0] = '\0'; + + eval(output, r.output, ctx); + mpc_ast_delete(r.output); + + return output; } diff --git a/src/template.h b/src/template.h index 896ef71..9174ad8 100644 --- a/src/template.h +++ b/src/template.h @@ -1,7 +1,7 @@ #include "hashmap.h" char *read_file(char *filename); -void template(char *tmpl, struct hashmap *ctx); +char *template(char *tmpl, struct hashmap *ctx); struct post { char title[64]; |