- unsigned long qualmap = 0;
- size_t ret = 0, rc = 0;
-
- for (struct cdecl_declspec *c = s; c; c = c->next) {
- if (cdecl_spec_kind(c) != CDECL_SPEC_QUAL)
- continue;
- qualmap |= 1ul << (c->type & 0xff);
- }
-
- if (qualmap & (1ul << (CDECL_QUAL_RESTRICT & 0xff))) {
- ret += cdecl__advance(&buf, &n, rc);
- rc = snprintf(buf, n, "restrict");
- }
- if (qualmap & (1ul << (CDECL_QUAL_VOLATILE & 0xff))) {
- ret += cdecl__advance(&buf, &n, rc);
- rc = snprintf(buf, n, "volatile");
- }
- if (qualmap & (1ul << (CDECL_QUAL_CONST & 0xff))) {
- ret += cdecl__advance(&buf, &n, rc);
- rc = snprintf(buf, n, "const");
- }
-
- return ret + rc;
+ return cdecl__explain_specs(buf, n, s, CDECL_SPEC_FUNC|CDECL_SPEC_STOR);