X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/42f53d5e9ac7a02c1b899b0786194611eae56a56..a41aa156f28753613f38924fc856d3dc992cfc56:/src/declare.c diff --git a/src/declare.c b/src/declare.c index 8f7d607..172c0a9 100644 --- a/src/declare.c +++ b/src/declare.c @@ -25,105 +25,90 @@ #include "cdecl.h" #include "cdecl-internal.h" -static size_t -declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d); +static void +declare_declarator(struct output_state *dst, struct cdecl_declarator *d); -static size_t declare_decl(char **dst, size_t *dstlen, struct cdecl *decl) +static void declare_decl(struct output_state *dst, struct cdecl *decl) { - size_t ret, rc; + const char *sep; - rc = cdecl__explain_specs(*dst, *dstlen, decl->specifiers, -1); + sep = cdecl__emit_specs(dst, decl->specifiers, -1); if (decl->declarators->type != CDECL_DECL_NULL) - ret = cdecl__advance(dst, dstlen, rc); - else - ret = cdecl__advance_(dst, dstlen, rc); + cdecl__emit(dst, sep); - return ret + declare_declarator(dst, dstlen, decl->declarators); + declare_declarator(dst, decl->declarators); } -static size_t -declare_postfix_child(char **dst, size_t *dstlen, struct cdecl_declarator *d) +static void +declare_postfix_child(struct output_state *dst, struct cdecl_declarator *d) { - size_t ret = 0; - if (d->type == CDECL_DECL_POINTER) - ret += cdecl__emit(dst, dstlen, "("); + cdecl__emit(dst, "("); - ret += declare_declarator(dst, dstlen, d); + declare_declarator(dst, d); if (d->type == CDECL_DECL_POINTER) - ret += cdecl__emit(dst, dstlen, ")"); - - return ret; + cdecl__emit(dst, ")"); } -static size_t -declare_pointer(char **dst, size_t *dstlen, struct cdecl_pointer *p) +static void declare_pointer(struct output_state *dst, struct cdecl_pointer *p) { struct cdecl_declspec *q = p->qualifiers; if (q) { - size_t ret, rc; - - ret = cdecl__emit(dst, dstlen, "* "); - rc = cdecl__explain_specs(*dst, *dstlen, q, -1); - return ret + cdecl__advance(dst, dstlen, rc); + cdecl__emit(dst, "* "); + cdecl__emit_specs(dst, q, -1); + cdecl__emit(dst, " "); + } else { + cdecl__emit(dst, "*"); } - - return cdecl__emit(dst, dstlen, "*"); } -static size_t declare_array(char **dst, size_t *dstlen, struct cdecl_array *a) +static void declare_array(struct output_state *dst, struct cdecl_array *a) { - size_t ret; - - ret = cdecl__emit(dst, dstlen, "["); + cdecl__emit(dst, "["); if (a->vla) { const char *s = a->vla[0] ? a->vla : "*"; - ret += cdecl__emit(dst, dstlen, s); + cdecl__emit(dst, s); } else { - size_t rc = snprintf(*dst, *dstlen, "%.0" PRIuMAX, a->length); - ret += cdecl__advance_(dst, dstlen, rc); + cdecl__emit_uint(dst, a->length); } - return ret + cdecl__emit(dst, dstlen, "]"); + cdecl__emit(dst, "]"); } -static size_t -declare_function(char **dst, size_t *dstlen, struct cdecl_function *f) +static void +declare_function(struct output_state *dst, struct cdecl_function *f) { struct cdecl *p; - size_t ret; - ret = cdecl__emit(dst, dstlen, "("); + cdecl__emit(dst, "("); for (p = f->parameters; p; p = p->next) { - ret += declare_decl(dst, dstlen, p); + declare_decl(dst, p); if (p->next) - ret += cdecl__emit(dst, dstlen, ", "); + cdecl__emit(dst, ", "); else if (f->variadic) - ret += cdecl__emit(dst, dstlen, ", ..."); + cdecl__emit(dst, ", ..."); } - return ret + cdecl__emit(dst, dstlen, ")"); + cdecl__emit(dst, ")"); } -static size_t -declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d) +static void +declare_declarator(struct output_state *dst, struct cdecl_declarator *d) { - size_t ret = 0; - for (; d; d = d->child) { switch (d->type) { case CDECL_DECL_NULL: break; case CDECL_DECL_IDENT: - ret += cdecl__emit(dst, dstlen, d->u.ident); + cdecl__emit(dst, d->u.ident); break; case CDECL_DECL_POINTER: - ret += declare_pointer(dst, dstlen, &d->u.pointer); + declare_pointer(dst, &d->u.pointer); break; /* * Arrays and functions are special: since they are postfix, @@ -131,20 +116,24 @@ declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d) * "bodies". */ case CDECL_DECL_ARRAY: - ret += declare_postfix_child(dst, dstlen, d->child); - return ret + declare_array(dst, dstlen, &d->u.array); + declare_postfix_child(dst, d->child); + declare_array(dst, &d->u.array); + return; case CDECL_DECL_FUNCTION: - ret += declare_postfix_child(dst, dstlen, d->child); - return ret + declare_function(dst, dstlen, &d->u.function); + declare_postfix_child(dst, d->child); + declare_function(dst, &d->u.function); + return; default: assert(0); } } - - return ret; } size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl) { - return declare_decl(&buf, &n, decl); + struct output_state dst = { buf, n }; + + declare_decl(&dst, decl); + + return dst.accum; }