X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fcvt_data.c;h=2f321813d153d0f5e030f20aeaecfa86cb62b1c4;hb=5c024ef78bfc9bac8b67870c169ab8732d8f7d89;hp=77792870b14e69a98bb406f9fd04b82f67857934;hpb=ddaf8bd7aa44ee867e43988ba0bb7658dae6e6eb;p=ia32rtools.git diff --git a/tools/cvt_data.c b/tools/cvt_data.c index 7779287..2f32181 100644 --- a/tools/cvt_data.c +++ b/tools/cvt_data.c @@ -205,28 +205,6 @@ static char *escape_string(char *s) return strcpy(s, buf); } -static void sprint_pp(const struct parsed_proto *pp, char *buf, - size_t buf_size) -{ - size_t l; - int i; - - snprintf(buf, buf_size, "%s %s(", pp->ret_type.name, pp->name); - l = strlen(buf); - - for (i = 0; i < pp->argc_reg; i++) { - snprintf(buf + l, buf_size - l, "%s%s", - i == 0 ? "" : ", ", pp->arg[i].reg); - l = strlen(buf); - } - if (pp->argc_stack > 0) { - snprintf(buf + l, buf_size - l, "%s{%d stack}", - i == 0 ? "" : ", ", pp->argc_stack); - l = strlen(buf); - } - snprintf(buf + l, buf_size - l, ")"); -} - static void sprint_pp_short(const struct parsed_proto *pp, char *buf, size_t buf_size) { @@ -255,7 +233,8 @@ static void sprint_pp_short(const struct parsed_proto *pp, char *buf, snprintf(buf + l, buf_size - l, ")"); } -static void check_var(FILE *fhdr, const char *sym, const char *varname) +static const struct parsed_proto *check_var(FILE *fhdr, + const char *sym, const char *varname) { const struct parsed_proto *pp, *pp_sym; char fp_sym[256], fp_var[256]; @@ -265,13 +244,13 @@ static void check_var(FILE *fhdr, const char *sym, const char *varname) if (pp == NULL) { if (IS_START(varname, "sub_")) awarn("sub_ sym missing proto: '%s'\n", varname); - return; + return NULL; } if (!pp->is_func && !pp->is_fptr) - return; + return NULL; - sprint_pp(pp, fp_var, sizeof(fp_var)); + pp_print(fp_var, sizeof(fp_var), pp); if (pp->argc_reg == 0) goto check_sym; @@ -294,7 +273,7 @@ check_sym: g_func_sym_pp = NULL; pp_sym = proto_parse(fhdr, sym, 1); if (pp_sym == NULL) - return; + return pp; if (!pp_sym->is_fptr) aerr("func ptr data, but label '%s' !is_fptr\n", pp_sym->name); g_func_sym_pp = pp_sym; @@ -302,7 +281,7 @@ check_sym: else { pp_sym = g_func_sym_pp; if (pp_sym == NULL) - return; + return pp; } if (pp->argc != pp_sym->argc || pp->argc_reg != pp_sym->argc_reg) @@ -323,11 +302,23 @@ check_sym: } if (bad) { - sprint_pp(pp_sym, fp_sym, sizeof(fp_sym)); + pp_print(fp_sym, sizeof(fp_sym), pp_sym); anote("var: %s\n", fp_var); anote("sym: %s\n", fp_sym); awarn("^ mismatch\n"); } + + return pp; +} + +static void output_decorated_pp(FILE *fout, + const struct parsed_proto *pp) +{ + if (pp->name[0] != '_') + fprintf(fout, pp->is_fastcall ? "@" : "_"); + fprintf(fout, "%s", pp->name); + if (pp->is_stdcall && pp->argc > 0) + fprintf(fout, "@%d", pp->argc * 4); } static int cmpstringp(const void *p1, const void *p2) @@ -339,6 +330,7 @@ int main(int argc, char *argv[]) { FILE *fout, *fasm, *fhdr, *frlist; const struct parsed_proto *pp; + int no_decorations = 0; char words[20][256]; char word[256]; char line[256]; @@ -364,11 +356,19 @@ int main(int argc, char *argv[]) char *p2; if (argc < 4) { - printf("usage:\n%s <.s> <.asm> [rlist]*\n", + // -nd: no symbol decorations + printf("usage:\n%s [-nd] <.s> <.asm> [rlist]*\n", argv[0]); return 1; } + for (arg = 1; arg < argc; arg++) { + if (IS(argv[arg], "-nd")) + no_decorations = 1; + else + break; + } + arg_out = arg++; asmfn = argv[arg++]; @@ -501,7 +501,7 @@ int main(int argc, char *argv[]) g_func_sym_pp = NULL; len = strlen(sym); - fprintf(fout, "_%s:", sym); + fprintf(fout, "%s%s:", no_decorations ? "" : "_", sym); len += 2; if (len < 8) @@ -625,10 +625,17 @@ int main(int argc, char *argv[]) snprintf(g_comment, sizeof(g_comment), "%s", p); } else { - check_var(fhdr, sym, p); - if (p[0] != '_') - fprintf(fout, "_"); - fprintf(fout, "%s", p); + pp = check_var(fhdr, sym, p); + if (pp == NULL) { + fprintf(fout, "%s%s", + (no_decorations || p[0] == '_') ? "" : "_", p); + } + else { + if (no_decorations) + fprintf(fout, "%s", pp->name); + else + output_decorated_pp(fout, pp); + } } } else { @@ -655,7 +662,8 @@ fin: // dump public syms for (i = 0; i < pub_sym_cnt; i++) - fprintf(fout, ".global _%s\n", pub_syms[i]); + fprintf(fout, ".global %s%s\n", + no_decorations ? "" : "_", pub_syms[i]); fclose(fout); fclose(fasm);