+ if (pp->argc == 1 && pp->arg[0].reg != NULL
+ && IS(pp->arg[0].reg, "ecx"))
+ {
+ pp->is_fastcall = 1;
+ }
+ else if (pp->argc_reg == 2
+ && pp->arg[0].reg != NULL && IS(pp->arg[0].reg, "ecx")
+ && pp->arg[1].reg != NULL && IS(pp->arg[1].reg, "edx"))
+ {
+ pp->is_fastcall = 1;
+ }
+
+ if (pp->is_vararg && (pp->is_stdcall || pp->is_fastcall)) {
+ printf("%s:%d: vararg %s?\n", hdrfn, hdrfline, cconv);
+ return -1;
+ }
+
+ return p - protostr;
+}
+
+static int pp_name_cmp(const void *p1, const void *p2)
+{
+ const struct parsed_proto *pp1 = p1, *pp2 = p2;
+ return strcmp(pp1->name, pp2->name);
+}
+
+static struct parsed_proto *pp_cache;
+static int pp_cache_size;
+static int pp_cache_alloc;
+
+static int b_pp_c_handler(char *proto, const char *fname,
+ int is_include, int is_osinc, int is_cinc)
+{
+ int ret;
+
+ if (pp_cache_size >= pp_cache_alloc) {
+ pp_cache_alloc = pp_cache_alloc * 2 + 64;
+ pp_cache = realloc(pp_cache, pp_cache_alloc
+ * sizeof(pp_cache[0]));
+ my_assert_not(pp_cache, NULL);
+ memset(pp_cache + pp_cache_size, 0,
+ (pp_cache_alloc - pp_cache_size)
+ * sizeof(pp_cache[0]));
+ }
+
+ ret = parse_protostr(proto, &pp_cache[pp_cache_size]);
+ if (ret < 0)
+ return -1;
+
+ pp_cache[pp_cache_size].is_include = is_include;
+ pp_cache[pp_cache_size].is_osinc = is_osinc;
+ pp_cache[pp_cache_size].is_cinc = is_cinc;
+ pp_cache_size++;