8 static size_t declare_specs(char *buf, size_t n, struct cdecl_declspec *s)
15 rc = cdecl__explain_pre_specs(buf, n, s);
16 ret += cdecl__advance(&buf, &n, rc);
18 rc = cdecl__explain_post_specs(buf, n, s);
23 declare_declarator(char *buf, size_t n, struct cdecl_declarator *d);
25 static size_t declare_decl(char *buf, size_t n, struct cdecl *decl)
29 rc = declare_specs(buf, n, decl->specifiers);
30 if (decl->declarators->type != CDECL_DECL_NULL)
31 ret += cdecl__advance(&buf, &n, rc);
33 ret += cdecl__advance_(&buf, &n, rc);
35 return ret + declare_declarator(buf, n, decl->declarators);
39 declare_postfix_child(char *buf, size_t n, struct cdecl_declarator *d)
43 if (d->type == CDECL_DECL_POINTER) {
44 rc = snprintf(buf, n, "(");
45 ret += cdecl__advance_(&buf, &n, rc);
48 rc = declare_declarator(buf, n, d);
49 ret += cdecl__advance_(&buf, &n, rc);
51 if (d->type == CDECL_DECL_POINTER) {
52 rc = snprintf(buf, n, ")");
53 ret += cdecl__advance_(&buf, &n, rc);
59 static size_t declare_pointer(char *buf, size_t n, struct cdecl_pointer *p)
63 rc = snprintf(buf, n, "*");
65 ret += cdecl__advance(&buf, &n, rc);
67 ret += cdecl__advance_(&buf, &n, rc);
69 rc = cdecl__explain_qualifiers(buf, n, p->qualifiers);
70 return ret + cdecl__advance(&buf, &n, rc);
73 static size_t declare_array(char *buf, size_t n, struct cdecl_array *a)
77 rc = snprintf(buf, n, "[");
78 ret += cdecl__advance_(&buf, &n, rc);
81 rc = snprintf(buf, n, "%s", a->vla[0] ? a->vla : "*");
83 rc = snprintf(buf, n, "%.0ju", a->length);
84 ret += cdecl__advance_(&buf, &n, rc);
86 return ret + snprintf(buf, n, "]");
89 static size_t declare_function(char *buf, size_t n, struct cdecl_function *f)
93 rc = snprintf(buf, n, "(");
94 ret += cdecl__advance_(&buf, &n, rc);
96 for (struct cdecl *p = f->parameters; p; p = p->next) {
97 rc = declare_decl(buf, n, p);
98 ret += cdecl__advance_(&buf, &n, rc);
102 rc = snprintf(buf, n, ", ");
103 else if (f->variadic)
104 rc = snprintf(buf, n, ", ...");
105 ret += cdecl__advance_(&buf, &n, rc);
108 return ret + snprintf(buf, n, ")");
112 declare_declarator(char *buf, size_t n, struct cdecl_declarator *d)
116 for (; d; d = d->child) {
118 case CDECL_DECL_NULL:
120 case CDECL_DECL_IDENT:
121 rc = snprintf(buf, n, "%s", d->u.ident);
122 ret += cdecl__advance_(&buf, &n, rc);
124 case CDECL_DECL_POINTER:
125 rc = declare_pointer(buf, n, &d->u.pointer);
126 ret += cdecl__advance_(&buf, &n, rc);
129 * Arrays and functions are special: since they are postfix,
130 * we need to render the children before rendering their
133 case CDECL_DECL_ARRAY:
134 rc = declare_postfix_child(buf, n, d->child);
135 ret += cdecl__advance_(&buf, &n, rc);
136 return ret + declare_array(buf, n, &d->u.array);
137 case CDECL_DECL_FUNCTION:
138 rc = declare_postfix_child(buf, n, d->child);
139 ret += cdecl__advance_(&buf, &n, rc);
140 return ret + declare_function(buf, n, &d->u.function);
149 size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl)
151 return declare_decl(buf, n, decl);