From 92dc89d3cacbed614aa64eb36da27b4c457578b0 Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Sun, 2 Jan 2022 16:53:26 +0100 Subject: [PATCH] Move {=>apfl_}print_indented out of expr.c We'll soon need it elsewhere. --- src/Makefile.am | 1 + src/expr.c | 104 +++++++++++++++++++++--------------------------- src/internal.c | 17 ++++++++ src/internal.h | 4 ++ 4 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 src/internal.c diff --git a/src/Makefile.am b/src/Makefile.am index d97387a..c6bc49b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,6 +5,7 @@ lib_LIBRARIES = libapfl.a libapfl_a_SOURCES = libapfl_a_SOURCES += error.c libapfl_a_SOURCES += expr.c +libapfl_a_SOURCES += internal.c libapfl_a_SOURCES += position.c libapfl_a_SOURCES += resizable.c libapfl_a_SOURCES += strings.c diff --git a/src/expr.c b/src/expr.c index 8b72253..240bf47 100644 --- a/src/expr.c +++ b/src/expr.c @@ -515,18 +515,6 @@ apfl_expr_at_move(struct apfl_expr_at *in) return out; } -static void -print_indented(unsigned indent, FILE *f, const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - while (indent--) { - fputs(" ", f); - } - vfprintf(f, fmt, ap); - va_end(ap); -} - #define POSFMT "%d:%d" #define POSARGS(p) (p).line, (p).col @@ -538,7 +526,7 @@ print_expr_list(struct apfl_expr_list *list, unsigned indent, FILE *f) for (size_t i = 0; i < list->len; i++) { unsigned item_indent = indent; if (list->items[i].expand) { - print_indented(indent, f, "Expand\n"); + apfl_print_indented(indent, f, "Expand\n"); item_indent++; } print_expr(list->items[i].expr, item_indent, f); @@ -558,16 +546,16 @@ print_constant_with_pos(struct apfl_expr_const constant, struct apfl_position po { switch (constant.type) { case APFL_EXPR_CONST_NIL: - print_indented(indent, f, "Const (nil) @ " POSFMT "\n", POSARGS(pos)); + apfl_print_indented(indent, f, "Const (nil) @ " POSFMT "\n", POSARGS(pos)); break; case APFL_EXPR_CONST_BOOLEAN: - print_indented(indent, f, "Const (%s) @ " POSFMT "\n", constant.boolean ? "true" : "false", POSARGS(pos)); + apfl_print_indented(indent, f, "Const (%s) @ " POSFMT "\n", constant.boolean ? "true" : "false", POSARGS(pos)); break; case APFL_EXPR_CONST_STRING: - print_indented(indent, f, "Const (" APFL_STR_FMT ") @ " POSFMT "\n", APFL_STR_FMT_ARGS(constant.string), POSARGS(pos)); + apfl_print_indented(indent, f, "Const (" APFL_STR_FMT ") @ " POSFMT "\n", APFL_STR_FMT_ARGS(constant.string), POSARGS(pos)); break; case APFL_EXPR_CONST_NUMBER: - print_indented(indent, f, "Const (%f) @ " POSFMT "\n", constant.number, POSARGS(pos)); + apfl_print_indented(indent, f, "Const (%f) @ " POSFMT "\n", constant.number, POSARGS(pos)); break; } } @@ -577,16 +565,16 @@ print_constant(struct apfl_expr_const constant, unsigned indent, FILE *f) { switch (constant.type) { case APFL_EXPR_CONST_NIL: - print_indented(indent, f, "Const (nil)\n"); + apfl_print_indented(indent, f, "Const (nil)\n"); break; case APFL_EXPR_CONST_BOOLEAN: - print_indented(indent, f, "Const (%s)\n", constant.boolean ? "true" : "false"); + apfl_print_indented(indent, f, "Const (%s)\n", constant.boolean ? "true" : "false"); break; case APFL_EXPR_CONST_STRING: - print_indented(indent, f, "Const (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(constant.string)); + apfl_print_indented(indent, f, "Const (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(constant.string)); break; case APFL_EXPR_CONST_NUMBER: - print_indented(indent, f, "Const (%f)\n", constant.number); + apfl_print_indented(indent, f, "Const (%f)\n", constant.number); break; } } @@ -596,24 +584,24 @@ print_param(struct apfl_expr_param *param, unsigned indent, FILE *f) { switch (param->type) { case APFL_EXPR_PARAM_VAR: - print_indented(indent, f, "Var (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(param->var)); + apfl_print_indented(indent, f, "Var (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(param->var)); break; case APFL_EXPR_PARAM_CONSTANT: print_constant(param->constant, indent, f); break; case APFL_EXPR_PARAM_PREDICATE: - print_indented(indent, f, "Predicate\n"); - print_indented(indent+1, f, "LHS\n"); + apfl_print_indented(indent, f, "Predicate\n"); + apfl_print_indented(indent+1, f, "LHS\n"); print_param(param->predicate.lhs, indent+2, f); - print_indented(indent+1, f, "RHS\n"); + apfl_print_indented(indent+1, f, "RHS\n"); print_expr(param->predicate.rhs, indent+2, f); break; case APFL_EXPR_PARAM_EXPAND: - print_indented(indent, f, "Expand\n"); + apfl_print_indented(indent, f, "Expand\n"); print_param(param->expand, indent+1, f); break; case APFL_EXPR_PARAM_LIST: - print_indented(indent, f, "List\n"); + apfl_print_indented(indent, f, "List\n"); for (size_t i = 0; i < param->list.len; i++) { print_param(¶m->list.params[i], indent+1, f); } @@ -626,35 +614,35 @@ print_assignable(struct apfl_expr_assignable assignable, unsigned indent, FILE * { switch(assignable.type) { case APFL_EXPR_ASSIGNABLE_VAR: - print_indented(indent, f, "Var (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(assignable.var)); + apfl_print_indented(indent, f, "Var (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(assignable.var)); break; case APFL_EXPR_ASSIGNABLE_CONSTANT: print_constant(assignable.constant, indent, f); break; case APFL_EXPR_ASSIGNABLE_PREDICATE: - print_indented(indent, f, "Predicate\n"); - print_indented(indent+1, f, "LHS\n"); + apfl_print_indented(indent, f, "Predicate\n"); + apfl_print_indented(indent+1, f, "LHS\n"); print_assignable(*assignable.predicate.lhs, indent+2, f); - print_indented(indent+1, f, "RHS\n"); + apfl_print_indented(indent+1, f, "RHS\n"); print_expr(assignable.predicate.rhs, indent+2, f); break; case APFL_EXPR_ASSIGNABLE_EXPAND: - print_indented(indent, f, "Expand\n"); + apfl_print_indented(indent, f, "Expand\n"); print_assignable(*assignable.expand, indent+1, f); break; case APFL_EXPR_ASSIGNABLE_DOT: - print_indented(indent, f, "Dot (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(assignable.dot.rhs)); + apfl_print_indented(indent, f, "Dot (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(assignable.dot.rhs)); print_assignable(*assignable.dot.lhs, indent+1, f); break; case APFL_EXPR_ASSIGNABLE_AT: - print_indented(indent, f, "At\n"); - print_indented(indent+1, f, "LHS\n"); + apfl_print_indented(indent, f, "At\n"); + apfl_print_indented(indent+1, f, "LHS\n"); print_assignable(*assignable.at.lhs, indent+2, f); - print_indented(indent+1, f, "RHS\n"); + apfl_print_indented(indent+1, f, "RHS\n"); print_expr(assignable.at.rhs, indent+2, f); break; case APFL_EXPR_ASSIGNABLE_LIST: - print_indented(indent, f, "List\n"); + apfl_print_indented(indent, f, "List\n"); for (size_t i = 0; i < assignable.list.len; i++) { print_assignable(assignable.list.children[i], indent+1, f); } @@ -667,66 +655,66 @@ print_expr(struct apfl_expr *expr, unsigned indent, FILE *f) { switch (expr->type) { case APFL_EXPR_LIST: - print_indented(indent, f, "List @ " POSFMT "\n", POSARGS(expr->position)); + apfl_print_indented(indent, f, "List @ " POSFMT "\n", POSARGS(expr->position)); print_expr_list(&expr->list, indent+1, f); break; case APFL_EXPR_DICT: - print_indented(indent, f, "Dict @ " POSFMT "\n", POSARGS(expr->position)); + apfl_print_indented(indent, f, "Dict @ " POSFMT "\n", POSARGS(expr->position)); for (size_t i = 0; i < expr->dict.len; i++) { - print_indented(indent+1, f, "Dict item\n"); - print_indented(indent+2, f, "Key\n"); + apfl_print_indented(indent+1, f, "Dict item\n"); + apfl_print_indented(indent+2, f, "Key\n"); print_expr(expr->dict.items[i].k, indent+3, f); - print_indented(indent+2, f, "Value\n"); + apfl_print_indented(indent+2, f, "Value\n"); print_expr(expr->dict.items[i].v, indent+3, f); } break; case APFL_EXPR_CALL: - print_indented(indent, f, "Call @ " POSFMT "\n", POSARGS(expr->position)); - print_indented(indent+1, f, "Callee\n"); + apfl_print_indented(indent, f, "Call @ " POSFMT "\n", POSARGS(expr->position)); + apfl_print_indented(indent+1, f, "Callee\n"); print_expr(expr->call.callee, indent+2, f); - print_indented(indent+1, f, "Args\n"); + apfl_print_indented(indent+1, f, "Args\n"); print_expr_list(&expr->call.arguments, indent+2, f); break; case APFL_EXPR_SIMPLE_FUNC: - print_indented(indent, f, "Simple function @ " POSFMT "\n", POSARGS(expr->position)); + apfl_print_indented(indent, f, "Simple function @ " POSFMT "\n", POSARGS(expr->position)); print_body(&expr->simple_func, indent+1, f); break; case APFL_EXPR_COMPLEX_FUNC: - print_indented(indent, f, "Complex function @ " POSFMT "\n", POSARGS(expr->position)); + apfl_print_indented(indent, f, "Complex function @ " POSFMT "\n", POSARGS(expr->position)); for (size_t i = 0; i < expr->complex_func.len; i++) { - print_indented(indent+1, f, "Subfunction\n"); + apfl_print_indented(indent+1, f, "Subfunction\n"); struct apfl_expr_subfunc *sub = &expr->complex_func.subfuncs[i]; - print_indented(indent+2, f, "Parameters\n"); + apfl_print_indented(indent+2, f, "Parameters\n"); for (size_t j = 0; j < sub->params.len; j++) { print_param(&sub->params.params[j], indent+3, f); } - print_indented(indent+2, f, "Body\n"); + apfl_print_indented(indent+2, f, "Body\n"); print_body(&sub->body, indent+3, f); } break; case APFL_EXPR_ASSIGNMENT: - print_indented(indent, f, "Assignment\n"); - print_indented(indent+1, f, "LHS\n"); + apfl_print_indented(indent, f, "Assignment\n"); + apfl_print_indented(indent+1, f, "LHS\n"); print_assignable(expr->assignment.lhs, indent+2, f); - print_indented(indent+1, f, "RHS\n"); + apfl_print_indented(indent+1, f, "RHS\n"); print_expr(expr->assignment.rhs, indent+2, f); break; case APFL_EXPR_DOT: - print_indented(indent, f, "Dot (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(expr->dot.rhs)); + apfl_print_indented(indent, f, "Dot (" APFL_STR_FMT ")\n", APFL_STR_FMT_ARGS(expr->dot.rhs)); print_expr(expr->dot.lhs, indent+1, f); break; case APFL_EXPR_AT: - print_indented(indent, f, "At\n"); - print_indented(indent+1, f, "LHS\n"); + apfl_print_indented(indent, f, "At\n"); + apfl_print_indented(indent+1, f, "LHS\n"); print_expr(expr->at.lhs, indent+2, f); - print_indented(indent+1, f, "RHS\n"); + apfl_print_indented(indent+1, f, "RHS\n"); print_expr(expr->at.rhs, indent+2, f); break; case APFL_EXPR_CONSTANT: print_constant_with_pos(expr->constant, expr->position, indent, f); break; case APFL_EXPR_VAR: - print_indented(indent, f, "Var (" APFL_STR_FMT ") @ " POSFMT "\n", APFL_STR_FMT_ARGS(expr->var), POSARGS(expr->position)); + apfl_print_indented(indent, f, "Var (" APFL_STR_FMT ") @ " POSFMT "\n", APFL_STR_FMT_ARGS(expr->var), POSARGS(expr->position)); break; } } diff --git a/src/internal.c b/src/internal.c new file mode 100644 index 0000000..043c9ef --- /dev/null +++ b/src/internal.c @@ -0,0 +1,17 @@ +#include +#include + +#include "apfl.h" +#include "internal.h" + +void +apfl_print_indented(unsigned indent, FILE *f, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + while (indent--) { + fputs(" ", f); + } + vfprintf(f, fmt, ap); + va_end(ap); +} diff --git a/src/internal.h b/src/internal.h index 1b00f20..da40a92 100644 --- a/src/internal.h +++ b/src/internal.h @@ -5,6 +5,7 @@ extern "C" { #endif +#include #include #include "common.h" @@ -41,6 +42,9 @@ extern "C" { #define DESTROY APFL_DESTROY +// Internal use only functions + +void apfl_print_indented(unsigned indent, FILE *, const char* fmt, ...); #ifdef __cplusplus } #endif