X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/225fb0d496bd8f9fcbc2f800819a83c71d763a61..9cb5aae31e1c126970843ef9b6e54036b185fd51:/src/explain.c diff --git a/src/explain.c b/src/explain.c index 26d39e7..10a7064 100644 --- a/src/explain.c +++ b/src/explain.c @@ -1,6 +1,6 @@ /* * Render C declarations as English. - * Copyright © 2011, 2021, 2023 Nick Bowler + * Copyright © 2011, 2021, 2023-2024 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,9 +17,7 @@ */ #include -#include #include -#include #include "cdecl.h" #include "cdecl-internal.h" @@ -29,10 +27,7 @@ static void explain_specs(struct output_state *dst, struct cdecl_declspec *s, unsigned mask) { - size_t rc; - - rc = cdecl__emit_specs(dst, s, mask); - cdecl__emit(dst, " " + !rc); + cdecl__emit(dst, cdecl__emit_specs(dst, s, mask)); } /* @@ -72,17 +67,12 @@ explain_array(struct output_state *dst, struct cdecl_array *a) { size_t rc = 0; - if (a->vla) - cdecl__emit(dst, "variable-length "); - cdecl__emit(dst, "array "); - + cdecl__emit(dst, "variable-length array " + (a->vla ? 0 : 16)); if (a->vla) { rc = cdecl__emit(dst, a->vla); } else { - rc = snprintf(dst->dst, dst->dstlen, "%.0" PRIuMAX, a->length); - cdecl__advance(dst, rc); + rc = cdecl__emit_uint(dst, a->length); } - cdecl__emit(dst, " of " + !rc); } @@ -105,8 +95,9 @@ static void explain_decl(struct output_state *dst, struct cdecl *decl) static void explain_function(struct output_state *dst, struct cdecl_function *f) { - cdecl__emit(dst, "function "); + int tail_offset = 7; + cdecl__emit(dst, "function "); if (f->parameters) { struct cdecl *p; @@ -118,22 +109,16 @@ explain_function(struct output_state *dst, struct cdecl_function *f) cdecl__emit(dst, ", "); } - if (f->variadic) - cdecl__emit(dst, ", ...) "); - else - cdecl__emit(dst, ") "); + tail_offset = f->variadic ? 0 : 5; } - - cdecl__emit(dst, "returning "); + cdecl__emit(dst, ", ...) returning " + tail_offset); } static void explain_declarators(struct output_state *dst, struct cdecl_declarator *d) { - if (d->type == CDECL_DECL_IDENT || d->type == CDECL_DECL_NULL) - return; - - explain_declarators(dst, d->child); + if (d->child) + explain_declarators(dst, d->child); switch (d->type) { case CDECL_DECL_POINTER: @@ -145,8 +130,6 @@ explain_declarators(struct output_state *dst, struct cdecl_declarator *d) case CDECL_DECL_FUNCTION: explain_function(dst, &d->u.function); return; - default: - assert(0); } }