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 {
 nname = 0;
 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()";
 builtin["memmove"] =	"void *memmove()";
 builtin["strcpy"] =	"char *strcpy()";
 builtin[""] = 	"";
}

/^[0123456789abcdef]+ [ABCDGINRSTUVW] / { 
  if ($3 != "symbols" && $3 != "symbols_nelts") {
    name[nname] = $3;
    nname++;
  }
}

END {
  sort(name, nname);

  print "#include \"loader/symbols.h\"\n";

  # Must deal with compiler builtins etc.
  for (x = 0; x < nname; x++) {
    if (builtin[name[x]] != "")
      print builtin[name[x]] ";";
    else
      print "extern int " name[x]"();";
  }
  print "\n";

  # nname++: An { 0, 0 } entry is added at the end of the vector.
  print "const int symbols_nelts = " nname+1 ";";
  print "const struct symbols symbols[" nname+1 "] = {";
  for (x = 0; x < nname; x++)
    print "{ \"" name[x] "\", (void *)&"name[x]" },";
  print "{ (const char *)0, (void *)0} };";
}
