+static inline decl_type *init_decl_type_ex(token_t type, int argc, ...) {
+ va_list argv;
+ char *ptr, *arg;
+ unsigned i;
+ size_t len, pos = 0, all = 0;
+ decl_type *t = calloc(1, sizeof(*t));
+
+ va_start(argv, argc);
+ for (i = 0; i < argc; ++i) {
+ arg = va_arg(argv, char *);
+ len = va_arg(argv, size_t);
+
+ if (len) {
+ if (all) {
+ pos = all;
+ ptr = realloc(ptr, 1 + (all += len));
+ } else {
+ ptr = malloc(ptr, 1 + (all = len));
+ }
+ memcpy(ptr + pos, arg, len);
+ }
+ }
+ va_end(argv);
+
+ if (!all) {
+ ptr = calloc(1, 1);
+ } else {
+ ptr[all] = 0;
+ }
+ t->type = type;
+ t->name = ptr;
+ return t;
+}
+