7 static size_t declare_specs(char *buf, size_t n, struct cdecl_declspec *s)
14 rc = cdecl__explain_pre_specs(buf, n, s);
15 ret += cdecl__advance(&buf, &n, rc);
17 rc = cdecl__explain_post_specs(buf, n, s);
22 declare_declarator(char *buf, size_t n, struct cdecl_declarator *d);
24 static size_t declare_decl(char *buf, size_t n, struct cdecl *decl)
28 rc = declare_specs(buf, n, decl->specifiers);
29 if (decl->declarators->type != CDECL_DECL_NULL)
30 ret += cdecl__advance(&buf, &n, rc);
32 ret += cdecl__advance_(&buf, &n, rc);
34 return ret + declare_declarator(buf, n, decl->declarators);
38 declare_postfix_child(char *buf, size_t n, struct cdecl_declarator *d)
42 if (d->type == CDECL_DECL_POINTER) {
43 rc = snprintf(buf, n, "(");
44 ret += cdecl__advance_(&buf, &n, rc);
47 rc = declare_declarator(buf, n, d);
48 ret += cdecl__advance_(&buf, &n, rc);
50 if (d->type == CDECL_DECL_POINTER) {
51 rc = snprintf(buf, n, ")");
52 ret += cdecl__advance_(&buf, &n, rc);
58 static size_t declare_pointer(char *buf, size_t n, struct cdecl_pointer *p)
62 rc = snprintf(buf, n, "*");
64 ret += cdecl__advance(&buf, &n, rc);
66 ret += cdecl__advance_(&buf, &n, rc);
68 rc = cdecl__explain_qualifiers(buf, n, p->qualifiers);
69 return ret + cdecl__advance(&buf, &n, rc);
72 static size_t declare_array(char *buf, size_t n, struct cdecl_array *a)
76 rc = snprintf(buf, n, "[");
77 ret += cdecl__advance_(&buf, &n, rc);
80 rc = snprintf(buf, n, "%s", a->vla[0] ? a->vla : "*");
82 rc = snprintf(buf, n, "%.0ju", a->length);
83 ret += cdecl__advance_(&buf, &n, rc);
85 return ret + snprintf(buf, n, "]");
88 static size_t declare_function(char *buf, size_t n, struct cdecl_function *f)
92 rc = snprintf(buf, n, "(");
93 ret += cdecl__advance_(&buf, &n, rc);
95 for (struct cdecl *p = f->parameters; p; p = p->next) {
96 rc = declare_decl(buf, n, p);
97 ret += cdecl__advance_(&buf, &n, rc);
101 rc = snprintf(buf, n, ", ");
102 else if (f->variadic)
103 rc = snprintf(buf, n, ", ...");
104 ret += cdecl__advance_(&buf, &n, rc);
107 return ret + snprintf(buf, n, ")");
111 declare_declarator(char *buf, size_t n, struct cdecl_declarator *d)
115 for (; d; d = d->child) {
117 case CDECL_DECL_NULL:
119 case CDECL_DECL_IDENT:
120 rc = snprintf(buf, n, "%s", d->u.ident);
121 ret += cdecl__advance_(&buf, &n, rc);
123 case CDECL_DECL_POINTER:
124 rc = declare_pointer(buf, n, &d->u.pointer);
125 ret += cdecl__advance_(&buf, &n, rc);
128 * Arrays and functions are special: since they are postfix,
129 * we need to render the children before rendering their
132 case CDECL_DECL_ARRAY:
133 rc = declare_postfix_child(buf, n, d->child);
134 ret += cdecl__advance_(&buf, &n, rc);
135 return ret + declare_array(buf, n, &d->u.array);
136 case CDECL_DECL_FUNCTION:
137 rc = declare_postfix_child(buf, n, d->child);
138 ret += cdecl__advance_(&buf, &n, rc);
139 return ret + declare_function(buf, n, &d->u.function);
148 size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl)
150 return declare_decl(buf, n, decl);