2 * Helper functions for outputting text.
3 * Copyright © 2011, 2021 Nick Bowler
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "cdecl-internal.h"
25 size_t cdecl__advance_(char **buf, size_t *n, size_t amount)
38 size_t cdecl__advance(char **buf, size_t *n, size_t amount)
45 ret = cdecl__advance_(buf, n, amount);
46 rc = snprintf(*buf, *n, " ");
47 return ret + cdecl__advance_(buf, n, rc);
52 static size_t explain_spec(char *buf, size_t n, struct cdecl_declspec *s)
54 const char *keyword = spec_string(s->type);
56 if (keyword[0] && s->ident)
57 return snprintf(buf, n, "%s %s", keyword, s->ident);
59 return snprintf(buf, n, "%s", s->ident);
60 return snprintf(buf, n, "%s", keyword);
64 * Render a list of declaration specifiers. Only the declaration specifiers
65 * listed in mask, which is the bitwise OR of the desired specifier kinds, are
68 size_t cdecl__explain_specs(char *buf, size_t n, struct cdecl_declspec *s,
71 size_t ret = 0, rc = 0;
73 for (struct cdecl_declspec *c = s; c; c = c->next) {
74 switch (cdecl_spec_kind(c) & mask) {
79 ret += cdecl__advance(&buf, &n, rc);
80 rc = explain_spec(buf, n, c);
87 /* Renders the storage-class and function specifiers in canonical form. */
88 size_t cdecl__explain_pre_specs(char *buf, size_t n, struct cdecl_declspec *s)
90 return cdecl__explain_specs(buf, n, s, CDECL_SPEC_FUNC|CDECL_SPEC_STOR);
93 /* Renders the type qualifiers and type specifiers in canonical form. */
94 size_t cdecl__explain_post_specs(char *buf, size_t n, struct cdecl_declspec *s)
96 return cdecl__explain_specs(buf, n, s, CDECL_SPEC_QUAL|CDECL_SPEC_TYPE);