diff options
author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2016-06-22 00:49:24 +0200 |
---|---|---|
committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2016-06-22 00:49:24 +0200 |
commit | b3c7c4633cdd0dedf3e329251fc7a6728bc041b5 (patch) | |
tree | 7a9e5ec0eb9209c5832685410356fbb774d2d39f /src | |
parent | 469731a89ab1e1b98b0498914bbe5016e8282b23 (diff) | |
download | blogc-b3c7c4633cdd0dedf3e329251fc7a6728bc041b5.tar.gz blogc-b3c7c4633cdd0dedf3e329251fc7a6728bc041b5.tar.bz2 blogc-b3c7c4633cdd0dedf3e329251fc7a6728bc041b5.zip |
template-parser: added some ast debug
Diffstat (limited to 'src')
-rw-r--r-- | src/blogc.c | 12 | ||||
-rw-r--r-- | src/template-parser.c | 65 | ||||
-rw-r--r-- | src/template-parser.h | 1 |
3 files changed, 76 insertions, 2 deletions
diff --git a/src/blogc.c b/src/blogc.c index cdc6aeb..10f341f 100644 --- a/src/blogc.c +++ b/src/blogc.c @@ -41,7 +41,7 @@ blogc_print_help(void) { printf( "usage:\n" - " blogc [-h] [-v] [-l] [-D KEY=VALUE ...] [-p KEY] [-t TEMPLATE]\n" + " blogc [-h] [-v] [-d] [-l] [-D KEY=VALUE ...] [-p KEY] [-t TEMPLATE]\n" " [-o OUTPUT] [SOURCE ...] - A blog compiler.\n" "\n" "positional arguments:\n" @@ -50,6 +50,7 @@ blogc_print_help(void) "optional arguments:\n" " -h show this help message and exit\n" " -v show version and exit\n" + " -d enable debug\n" " -l build listing page, from multiple source files\n" " -D KEY=VALUE set global configuration parameter\n" " -p KEY show the value of a global configuration parameter\n" @@ -63,7 +64,7 @@ static void blogc_print_usage(void) { printf( - "usage: blogc [-h] [-v] [-l] [-D KEY=VALUE ...] [-p KEY] [-t TEMPLATE]\n" + "usage: blogc [-h] [-v] [-d] [-l] [-D KEY=VALUE ...] [-p KEY] [-t TEMPLATE]\n" " [-o OUTPUT] [SOURCE ...]\n"); } @@ -110,6 +111,7 @@ main(int argc, char **argv) int rv = 0; + bool debug = false; bool listing = false; char *template = NULL; char *output = NULL; @@ -131,6 +133,9 @@ main(int argc, char **argv) case 'v': printf("%s\n", PACKAGE_STRING); goto cleanup; + case 'd': + debug = true; + break; case 'l': listing = true; break; @@ -246,6 +251,9 @@ main(int argc, char **argv) goto cleanup3; } + if (debug) + blogc_template_debug(l); + char *out = blogc_render(l, s, config, listing); bool write_to_stdout = (output == NULL || (0 == strcmp(output, "-"))); diff --git a/src/template-parser.c b/src/template-parser.c index 525f5f5..1582c17 100644 --- a/src/template-parser.c +++ b/src/template-parser.c @@ -11,6 +11,7 @@ #endif /* HAVE_CONFIG_H */ #include <stdbool.h> +#include <stdio.h> #include <string.h> #include "template-parser.h" @@ -634,3 +635,67 @@ blogc_template_free_stmts(sb_slist_t *stmts) } sb_slist_free(stmts); } + + +static const char* +get_operator(blogc_template_stmt_operator_t op) +{ + if (op & BLOGC_TEMPLATE_OP_NEQ) + return "!="; + if (op & BLOGC_TEMPLATE_OP_EQ) { + if (op & BLOGC_TEMPLATE_OP_LT) + return "<="; + else if (op & BLOGC_TEMPLATE_OP_GT) + return ">="; + return "=="; + } + if (op & BLOGC_TEMPLATE_OP_LT) + return "<"; + else if (op & BLOGC_TEMPLATE_OP_GT) + return ">"; + return ""; +} + + +void +blogc_template_debug(sb_slist_t *stmts) +{ + for (sb_slist_t *tmp = stmts; tmp != NULL; tmp = tmp->next) { + blogc_template_stmt_t *data = tmp->data; + fprintf(stderr, "DEBUG: <TEMPLATE "); + switch (data->type) { + case BLOGC_TEMPLATE_IFDEF_STMT: + fprintf(stderr, "IFDEF: %s", data->value); + break; + case BLOGC_TEMPLATE_IFNDEF_STMT: + fprintf(stderr, "IFNDEF: %s", data->value); + break; + case BLOGC_TEMPLATE_IF_STMT: + fprintf(stderr, "IF: %s %s %s", data->value, + get_operator(data->op), data->value2); + break; + case BLOGC_TEMPLATE_ENDIF_STMT: + fprintf(stderr, "ENDIF"); + break; + case BLOGC_TEMPLATE_FOREACH_STMT: + fprintf(stderr, "FOREACH: %s", data->value); + break; + case BLOGC_TEMPLATE_ENDFOREACH_STMT: + fprintf(stderr, "ENDFOREACH"); + break; + case BLOGC_TEMPLATE_BLOCK_STMT: + fprintf(stderr, "BLOCK: %s", data->value); + break; + case BLOGC_TEMPLATE_ENDBLOCK_STMT: + fprintf(stderr, "ENDBLOCK"); + break; + case BLOGC_TEMPLATE_VARIABLE_STMT: + fprintf(stderr, "VARIABLE: %s", data->value); + break; + case BLOGC_TEMPLATE_CONTENT_STMT: + fprintf(stderr, "CONTENT: `%s`", data->value); + break; + } + fprintf(stderr, ">\n"); + } +} diff --git a/src/template-parser.h b/src/template-parser.h index a8b4e8b..bd39678 100644 --- a/src/template-parser.h +++ b/src/template-parser.h @@ -47,5 +47,6 @@ typedef struct { sb_slist_t* blogc_template_parse(const char *src, size_t src_len, blogc_error_t **err); void blogc_template_free_stmts(sb_slist_t *stmts); +void blogc_template_debug(sb_slist_t *stmts); #endif /* _TEMPLATE_GRAMMAR_H */ |