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)
{
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];
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;
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;
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)
}
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)
{
FILE *fout, *fasm, *fhdr, *frlist;
const struct parsed_proto *pp;
+ int no_decorations = 0;
char words[20][256];
char word[256];
char line[256];
char *p2;
if (argc < 4) {
- printf("usage:\n%s <.s> <.asm> <hdrf> [rlist]*\n",
+ // -nd: no symbol decorations
+ printf("usage:\n%s [-nd] <.s> <.asm> <hdrf> [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++];
g_func_sym_pp = NULL;
len = strlen(sym);
- fprintf(fout, "_%s:", sym);
+ fprintf(fout, "%s%s:", no_decorations ? "" : "_", sym);
len += 2;
if (len < 8)
fprintf(fout, "\t\t ");
}
- if (type == DXT_BYTE && words[w][0] == '\'') {
+ if (type == DXT_BYTE
+ && (words[w][0] == '\''
+ || (w + 1 < wordc && words[w + 1][0] == '\'')))
+ {
// string; use asciz for most common case
if (w == wordc - 2 && IS(words[w + 1], "0")) {
fprintf(fout, ".asciz \"");
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 {
// 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);