+
+/*
+ * Join two declaration specifier lists into a single list, with "a" being the
+ * head of the new list.
+ *
+ * The list "a" is assumed to be nonempty.
+ */
+static void join_specs(struct cdecl_declspec *a, struct cdecl_declspec *b)
+{
+ while (a->next)
+ a = a->next;
+ a->next = b;
+}
+
+/*
+ * Alter an abstract declarator (type name) to declare an identifier instead,
+ * used by the English parser rules to reduce "identifier as type" sequences.
+ */
+static struct cdecl *insert_identifier(struct cdecl *decl, struct parse_item *ident)
+{
+ struct cdecl_declarator *d, **p = &decl->declarators;
+
+ while ((d = *p)->child)
+ p = &d->child;
+
+ *p = &ident->u.declarator;
+ return decl;
+}
+
+static struct cdecl_declarator *nulldecl(void)
+{
+ static const struct cdecl_declarator nulldecl = {0};
+ return (void *)&nulldecl;
+}
+#define NULLDECL (nulldecl())
+