/* Generate targ-vals.h and targ-map.c.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct tdefs {
  char *symbol;
  int value;
};

static struct tdefs sys_tdefs[] = {
#define sys_defs
#include "nltvals.def"
#undef sys_defs
  { 0, 0 }
};

static struct tdefs errno_tdefs[] =  {
#define errno_defs
#include "nltvals.def"
#undef errno_defs
  { 0, 0 }
};

static struct tdefs signal_tdefs[] = {
#define signal_defs
#include "nltvals.def"
#undef signal_defs
  { 0, 0 }
};

static struct tdefs open_tdefs[] = {
#define open_defs
#include "nltvals.def"
#undef open_defs
  { 0, 0 }
};

static void
gen_targ_vals_h (void)
{
  struct tdefs *t;

  printf ("/* Target header values needed by the simulator and gdb.  */\n");
  printf ("/* This file is machine generated by gentmap.c.  */\n\n");

  printf ("#ifndef TARG_VALS_H\n");
  printf ("#define TARG_VALS_H\n\n");

  printf ("/* syscall values */\n");
  for (t = &sys_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s %d\n", t->symbol, t->value);
  printf ("\n");

  printf ("/* signal values */\n");
  for (t = &signal_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s %d\n", t->symbol, t->value);
  printf ("\n");

  printf ("/* open flag values */\n");
  for (t = &open_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s 0x%x\n", t->symbol, t->value);
  printf ("\n");

  printf ("#endif /* TARG_VALS_H */\n");
}

static void
gen_targ_map_c (void)
{
  struct tdefs *t;

  printf ("/* Target value mapping utilities needed by the simulator and gdb.  */\n");
  printf ("/* This file is machine generated by gentmap.c.  */\n\n");

  printf ("#include \"defs.h\"\n");
  printf ("#include <errno.h>\n");
  printf ("#include <fcntl.h>\n");
  printf ("#include <signal.h>\n");
  printf ("#include \"ansidecl.h\"\n");
  printf ("#include \"sim/callback.h\"\n");
  printf ("#include \"targ-vals.h\"\n");
  printf ("\n");

  printf ("/* syscall mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_syscall_map[] = {\n");
  for (t = &sys_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef CB_%s\n", t->symbol);
      /* Skip the "SYS_" prefix for the name.  */
      printf ("  { \"%s\", CB_%s, TARGET_%s },\n", t->symbol + 4, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");

  printf ("/* errno mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_errno_map[] = {\n");
  for (t = &errno_tdefs[0]; t->symbol; ++t)
    {
      printf ("#define TARGET_%s %d\n", t->symbol, t->value);
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, 0, 0 }\n");
  printf ("};\n\n");

  printf ("/* signals mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_signal_map[] = {\n");
  for (t = &signal_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");

  printf ("/* open flags mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_open_map[] = {\n");
  for (t = &open_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");
}

int
main (int argc, char *argv[])
{
  if (argc != 2)
    abort ();

  if (strcmp (argv[1], "-h") == 0)
    gen_targ_vals_h ();
  else if (strcmp (argv[1], "-c") == 0)
    gen_targ_map_c ();
  else
    abort ();

  exit (0);
}
