From 54ca2ed1ca173c7818792b6b06d12b8536acb6f3 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Thu, 7 Jul 2011 19:35:56 -0400 Subject: [PATCH] Move advance/advance_ into common code. These will be useful for other output routines. --- Makefile.am | 4 ++-- src/explain.c | 64 ++++++++++++++++----------------------------------- src/output.c | 27 ++++++++++++++++++++++ src/output.h | 9 ++++++++ 4 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 src/output.c create mode 100644 src/output.h diff --git a/Makefile.am b/Makefile.am index 9ac2189..07d3f8f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,12 +19,12 @@ EXTRA_DIST = m4/gnulib-cache.m4 src/types.lst src/typenames.sed \ src/validtypes.sed src/parse.stamp src/scan.stamp include_HEADERS = src/cdecl.h -noinst_HEADERS = src/typemap.h src/scan.h src/parse.h +noinst_HEADERS = src/typemap.h src/output.h src/scan.h src/parse.h lib_LTLIBRARIES = libcdecl.la libcdecl_la_LDFLAGS = -export-symbols-regex '^cdecl_[[:lower:]]' libcdecl_la_SOURCES = src/scan.c src/parse.c src/parse-decl.c src/typemap.c \ - src/explain.c + src/output.c src/explain.c bin_PROGRAMS = cdecl99 cdecl99_SOURCES = src/cdecl99.c diff --git a/src/explain.c b/src/explain.c index a0b1449..dadc65f 100644 --- a/src/explain.c +++ b/src/explain.c @@ -23,31 +23,7 @@ #include "cdecl.h" #include "typemap.h" - -static size_t advance_(char **buf, size_t *n, size_t amount) -{ - if (amount >= *n) { - *n = 0; - *buf = 0; - } else { - *buf += amount; - *n -= amount; - } - - return amount; -} - -static size_t advance(char **buf, size_t *n, size_t amount) -{ - size_t ret, rc; - - if (!amount) - return 0; - - ret = advance_(buf, n, amount); - rc = snprintf(*buf, *n, " "); - return ret + advance_(buf, n, rc); -} +#include "output.h" static size_t explain_qualifiers(char *buf, size_t n, struct cdecl_declspec *s) @@ -62,15 +38,15 @@ explain_qualifiers(char *buf, size_t n, struct cdecl_declspec *s) } if (qualmap & (1ul << (CDECL_QUAL_RESTRICT & 0xff))) { - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "restrict"); } if (qualmap & (1ul << (CDECL_QUAL_VOLATILE & 0xff))) { - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "volatile"); } if (qualmap & (1ul << (CDECL_QUAL_CONST & 0xff))) { - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "const"); } @@ -99,11 +75,11 @@ explain_post_specs(char *buf, size_t n, struct cdecl_declspec *s) } rc = explain_qualifiers(buf, n, s); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "%s", cdecl__explain_typemap(typemap)); if (tag) { - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "%s", tag); } @@ -148,7 +124,7 @@ static size_t explain_pre_specs(char *buf, size_t n, struct cdecl_declspec *s) } if (funcmap & (1ul << (CDECL_FUNC_INLINE & 0xff))) { - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = snprintf(buf, n, "inline"); } @@ -173,7 +149,7 @@ explain_prologue(char *buf, size_t n, struct cdecl_declarator *d, bool top) case CDECL_DECL_IDENT: if (top) rc = snprintf(buf, n, "declare"); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); return ret + snprintf(buf, n, "%s as", d->u.ident); } @@ -187,7 +163,7 @@ explain_pointer(char *buf, size_t n, struct cdecl_pointer *p) size_t ret = 0, rc; rc = explain_qualifiers(buf, n, p->qualifiers); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); return ret + snprintf(buf, n, "pointer to"); } @@ -201,14 +177,14 @@ explain_array(char *buf, size_t n, struct cdecl_array *a) rc = snprintf(buf, n, "variable-length array"); else rc = snprintf(buf, n, "array"); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); if (a->vla) { rc = snprintf(buf, n, "%s", a->vla); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); } else if (a->length) { rc = snprintf(buf, n, "%ju", a->length); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); } return ret + snprintf(buf, n, "of"); @@ -222,13 +198,13 @@ static size_t explain_decl(char *buf, size_t n, struct cdecl *decl, bool top) size_t ret = 0, rc; rc = explain_prologue(buf, n, decl->declarators, top); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = explain_pre_specs(buf, n, decl->specifiers); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); rc = explain_declarators(buf, n, decl->declarators); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); return ret + explain_post_specs(buf, n, decl->specifiers); } @@ -238,15 +214,15 @@ static size_t explain_function(char *buf, size_t n, struct cdecl_function *f) size_t ret = 0, rc = 0; rc = snprintf(buf, n, "function"); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); if (f->parameters) { rc = snprintf(buf, n, "("); - ret += advance_(&buf, &n, rc); + ret += cdecl__advance_(&buf, &n, rc); for (struct cdecl *p = f->parameters; p; p = p->next) { rc = explain_decl(buf, n, p, false); - ret += advance_(&buf, &n, rc); + ret += cdecl__advance_(&buf, &n, rc); if (p->next) rc = snprintf(buf, n, ","); @@ -254,7 +230,7 @@ static size_t explain_function(char *buf, size_t n, struct cdecl_function *f) rc = snprintf(buf, n, ", ...)"); else rc = snprintf(buf, n, ")"); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); } } @@ -270,7 +246,7 @@ explain_declarators(char *buf, size_t n, struct cdecl_declarator *d) return 0; rc = explain_declarators(buf, n, d->child); - ret += advance(&buf, &n, rc); + ret += cdecl__advance(&buf, &n, rc); switch (d->type) { case CDECL_DECL_POINTER: diff --git a/src/output.c b/src/output.c new file mode 100644 index 0000000..8c2cd0b --- /dev/null +++ b/src/output.c @@ -0,0 +1,27 @@ +#include +#include "output.h" + +size_t cdecl__advance_(char **buf, size_t *n, size_t amount) +{ + if (amount >= *n) { + *n = 0; + *buf = 0; + } else { + *buf += amount; + *n -= amount; + } + + return amount; +} + +size_t cdecl__advance(char **buf, size_t *n, size_t amount) +{ + size_t ret, rc; + + if (!amount) + return 0; + + ret = cdecl__advance_(buf, n, amount); + rc = snprintf(*buf, *n, " "); + return ret + cdecl__advance_(buf, n, rc); +} diff --git a/src/output.h b/src/output.h new file mode 100644 index 0000000..03f7acb --- /dev/null +++ b/src/output.h @@ -0,0 +1,9 @@ +#ifndef CDECL_OUTPUT_H_ +#define CDECL_OUTPUT_H_ + +#include + +size_t cdecl__advance_(char **buf, size_t *n, size_t amount); +size_t cdecl__advance(char **buf, size_t *n, size_t amount); + +#endif -- 2.43.2