nes-proj/tools/mknmlist-ansi

114 lines
2.9 KiB
Plaintext
Raw Normal View History

#
#
# Create tables so that we can lookup ANSI C objects and functions in
# an object file (by reading nm output from stdin).
#
# This tool makes assumptions compatible with ANSI C. Unfortunately
# this implies that we need to rely on ANSI C features.
function sort(V, N, tmp, i, j) {
V[-1] = ""; # Used as a sentinel before V[0].
for (i = 1; i < N; i++)
for (j = i; V[j - 1] > V[j]; j--) {
tmp = V[j];
V[j] = V[j - 1];
V[j - 1] = tmp;
}
return;
}
BEGIN {
ndata = ntext = 0;
builtin["sym_function"] = "sym_func_t sym_function(const char *)";
builtin["sym_object"] = "void *sym_object(const char *)";
#
builtin["printf"] = "int printf(const char *, ...)";
builtin["sprintf"] = "int sprintf(char *, const char *, ...)";
builtin["malloc"] = "void *malloc()";
builtin["memcpy"] = "void *memcpy()";
builtin["memset"] = "void *memset()";
2007-08-22 10:57:31 +00:00
builtin["memmove"] = "void *memmove()";
builtin["strcpy"] = "char *strcpy()";
#
builtin["sin"] = "double sin()";
builtin["cos"] = "double cos()";
builtin["sinf"] = "float sinf(float)";
builtin["cosf"] = "float cosf(float)";
builtin[""] = "";
}
# DATA or TEXT (ignored)
/^[0123456789abcdef]+ [AVWw] / {
print "/* " $1 " " $2 " " $3 " */";
}
# DATA
/^[0123456789abcdef]+ [BCDGRS] / {
if ($3 != "sym_obj" && $3 != "sym_obj_nelts" &&
$3 != "sym_func" && $3 != "sym_func_nelts") {
data[ndata++] = $3;
}
}
# TEXT
/^[0123456789abcdef]+ [T] / {
if ($3 != "sym_obj" && $3 != "sym_obj_nelts" &&
$3 != "sym_func" && $3 != "sym_func_nelts") {
text[ntext++] = $3;
}
}
END {
sort(data, ndata);
sort(text, ntext);
print "#ifdef __AVR__"
print "#define PROGMEM __attribute__((__progmem__))"
print "#else"
print "#define PROGMEM"
print "#endif"
print "#include \"loader/sym.h\"";
2007-04-27 08:36:49 +00:00
print "";
for (x = 0; x < ndata; x++) {
print "static const PROGMEM char __D"x"[] = \""data[x]"\";";
}
# Extern decls. Must deal with compiler builtins etc.
2007-04-27 08:36:49 +00:00
print "";
for (x = 0; x < ndata; x++) {
if (builtin[data[x]] != "")
print builtin[data[x]] ";";
else
print "extern int " data[x]";";
}
2007-04-27 08:36:49 +00:00
print "";
print "const int sym_obj_nelts = " ndata ";";
print "PROGMEM const struct sym_bol sym_obj[" ndata "] = {";
for (x = 0; x < ndata; x++)
print " { (const char *)__D"x", { .obj = (void *)&" data[x] " } },";
print "};";
2007-04-27 08:36:49 +00:00
print "";
for (x = 0; x < ntext; x++) {
print "static const PROGMEM char __T"x"[] = \""text[x]"\";";
}
# Extern decls. Must deal with compiler builtins etc.
2007-04-27 08:36:49 +00:00
print "";
for (x = 0; x < ntext; x++) {
if (builtin[text[x]] != "")
print builtin[text[x]] ";";
else
print "extern int " text[x]"();";
}
2007-04-27 08:36:49 +00:00
print "";
print "const int sym_func_nelts = " ntext ";";
print "PROGMEM const struct sym_bol sym_func[" ntext "] = {";
for (x = 0; x < ntext; x++)
print " { (const char *)__T"x", { .func = (sym_func_t)&" text[x] " } },";
print "};";
}