Move {=>apfl_}print_indented out of expr.c
We'll soon need it elsewhere.
This commit is contained in:
parent
f685214abe
commit
92dc89d3ca
4 changed files with 68 additions and 58 deletions
|
|
@ -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
|
||||
|
|
|
|||
104
src/expr.c
104
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
17
src/internal.c
Normal file
17
src/internal.c
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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
|
||||
|
|
|
|||
Loading…
Reference in a new issue