X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/7ec517ce4d3b660e64133c2e67ef7686daec74e2..0b2a2978f09f5d9b56d8655dd60eaffbe9006b7a:/src/declare.c?ds=sidebyside diff --git a/src/declare.c b/src/declare.c index 318ccac..5bf9d37 100644 --- a/src/declare.c +++ b/src/declare.c @@ -26,90 +26,90 @@ #include "cdecl-internal.h" static size_t -declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d); +declare_declarator(struct output_state *dst, struct cdecl_declarator *d); -static size_t declare_decl(char **dst, size_t *dstlen, struct cdecl *decl) +static size_t declare_decl(struct output_state *dst, struct cdecl *decl) { size_t ret; - ret = cdecl__emit_specs(dst, dstlen, decl->specifiers, -1); + ret = cdecl__emit_specs(dst, decl->specifiers, -1); if (decl->declarators->type != CDECL_DECL_NULL) - ret += cdecl__emit(dst, dstlen, " "); + ret += cdecl__emit(dst, " "); - return ret + declare_declarator(dst, dstlen, decl->declarators); + return ret + declare_declarator(dst, decl->declarators); } static size_t -declare_postfix_child(char **dst, size_t *dstlen, struct cdecl_declarator *d) +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, "("); + ret += cdecl__emit(dst, "("); - ret += declare_declarator(dst, dstlen, d); + ret += declare_declarator(dst, d); if (d->type == CDECL_DECL_POINTER) - ret += cdecl__emit(dst, dstlen, ")"); + ret += cdecl__emit(dst, ")"); return ret; } static size_t -declare_pointer(char **dst, size_t *dstlen, struct cdecl_pointer *p) +declare_pointer(struct output_state *dst, struct cdecl_pointer *p) { struct cdecl_declspec *q = p->qualifiers; if (q) { size_t ret; - ret = cdecl__emit(dst, dstlen, "* "); - ret += cdecl__emit_specs(dst, dstlen, q, -1); - return ret + cdecl__emit(dst, dstlen, " "); + ret = cdecl__emit(dst, "* "); + ret += cdecl__emit_specs(dst, q, -1); + return ret + cdecl__emit(dst, " "); } - return cdecl__emit(dst, dstlen, "*"); + return cdecl__emit(dst, "*"); } -static size_t declare_array(char **dst, size_t *dstlen, struct cdecl_array *a) +static size_t declare_array(struct output_state *dst, struct cdecl_array *a) { size_t ret; - ret = cdecl__emit(dst, dstlen, "["); + ret = cdecl__emit(dst, "["); if (a->vla) { const char *s = a->vla[0] ? a->vla : "*"; - ret += cdecl__emit(dst, dstlen, s); + ret += cdecl__emit(dst, s); } else { - size_t rc = snprintf(*dst, *dstlen, "%.0" PRIuMAX, a->length); - ret += cdecl__advance(dst, dstlen, rc); + size_t rc = snprintf(dst->dst, dst->dstlen, "%.0" PRIuMAX, a->length); + ret += cdecl__advance(dst, rc); } - return ret + cdecl__emit(dst, dstlen, "]"); + return ret + cdecl__emit(dst, "]"); } static size_t -declare_function(char **dst, size_t *dstlen, struct cdecl_function *f) +declare_function(struct output_state *dst, struct cdecl_function *f) { struct cdecl *p; size_t ret; - ret = cdecl__emit(dst, dstlen, "("); + ret = cdecl__emit(dst, "("); for (p = f->parameters; p; p = p->next) { - ret += declare_decl(dst, dstlen, p); + ret += declare_decl(dst, p); if (p->next) - ret += cdecl__emit(dst, dstlen, ", "); + ret += cdecl__emit(dst, ", "); else if (f->variadic) - ret += cdecl__emit(dst, dstlen, ", ..."); + ret += cdecl__emit(dst, ", ..."); } - return ret + cdecl__emit(dst, dstlen, ")"); + return ret + cdecl__emit(dst, ")"); } static size_t -declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d) +declare_declarator(struct output_state *dst, struct cdecl_declarator *d) { size_t ret = 0; @@ -118,10 +118,10 @@ declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d) case CDECL_DECL_NULL: break; case CDECL_DECL_IDENT: - ret += cdecl__emit(dst, dstlen, d->u.ident); + ret += cdecl__emit(dst, d->u.ident); break; case CDECL_DECL_POINTER: - ret += declare_pointer(dst, dstlen, &d->u.pointer); + ret += declare_pointer(dst, &d->u.pointer); break; /* * Arrays and functions are special: since they are postfix, @@ -129,11 +129,11 @@ 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); + ret += declare_postfix_child(dst, d->child); + return ret + declare_array(dst, &d->u.array); case CDECL_DECL_FUNCTION: - ret += declare_postfix_child(dst, dstlen, d->child); - return ret + declare_function(dst, dstlen, &d->u.function); + ret += declare_postfix_child(dst, d->child); + return ret + declare_function(dst, &d->u.function); default: assert(0); } @@ -144,5 +144,7 @@ declare_declarator(char **dst, size_t *dstlen, struct cdecl_declarator *d) size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl) { - return declare_decl(&buf, &n, decl); + struct output_state dst = { buf, n }; + + return declare_decl(&dst, decl); }