/
dirt31/
dirt31/bin/
/*
**  Utility program to build the data files.
**  Alf, June 1990
*/

#include "kernel.h"


void make_data(int argc, char **argv);

void crapup(char *p)
{
  perror(p);
  exit(1);
}

/*
**  Open file for read/write or die trying
*/
static FILE *Do_fopen(char *name, char *mode)
{
  FILE *file;

  if (*name == '-' && !name[1])
    return *mode == 'w' ? stdout : stdin;
  if (!(file = fopen(name,mode))) {
    perror(name);
    (void)fprintf(stderr, "Unable to open %s for %s\n",
		  name, *mode == 'w' ? "write" : "read");
    exit(1);
  }
  return file;
}

typedef struct _XTABLE {    /* move this inside make verbs ? */
  struct _XTABLE *next;
  int            code;
  char           name[30];
} XTABLE;

/*
**  Make header file verbs.h
*/
static void make_verbs(int argc, char *argv[])
{
  FILE	*In, *Out, *H;
  char	*p, *q, *s;
  int	j;
  int   vcode, num_v;
  XTABLE *first, *last, *v, *w;
  char	buff[128], verb[30];

  if (argc < 3) {
    (void)fprintf(stderr, "Usage error: See Makefile\n");
    exit(1);
  }
  In = Do_fopen(argv[1], "r");
  Out = Do_fopen(argv[2], "w");
  H = Do_fopen(argv[3], "w");

  first = NULL;
  vcode = num_v = 0;
  while (fgets(buff,sizeof buff,In)) {
    for (p = buff, q = verb; isalpha(*p);)
      *q++ = *p++;
    if (q == verb)
      continue;
    *q = 0;
    lowercase(verb);

    v = (XTABLE *)xmalloc(1, sizeof(XTABLE));
    strcpy(v->name,verb);
    ++num_v;

    if (*p != '=') {
      v->code = ++vcode;
    } else {
      for (q = verb, ++p; isalpha(*p);)
	*q++ = *p++;
      *q = 0;
      lowercase(verb);

      for (w = first; w != NULL && strcmp(w->name,verb) != 0; w = w->next);
      if (w == NULL) {
	v->code = ++vcode;
      } else {
	v->code = w->code;
      }
    }

    v->next = NULL;
    if (first == NULL) {
      first = last = v;
    } else {
      last = (last->next = v);
    }
  }
  fclose(In);

  /* Print out header */
  (void)fprintf(H,"\
/*\n\
**\tVerb file header generated from %s\n\
**\tDON'T MAKE CHANGES HERE -- THEY WILL GO AWAY!\n\
*/\n\n", argv[1]);
  fprintf(Out,"%d\n", num_v);

  /* Read thru verb file, creating #define's for each verb */

  for (w = first; w != NULL; w = w->next) {
    strcpy(verb,w->name);
    (void)fprintf(Out, "%s %d\n", verb, w->code);

    uppercase(verb);
    (void)fprintf(H, "#define\tVERB_%s\t%d\n", verb, w->code);
  }
  fclose(Out);
  fclose(H);
  exit(0);
}

int main(int argc, char *argv[])
{
  argc--;
  argv++;

  if (argc)
    if (EQ(*argv, "verbs"))
      make_verbs(argc, argv);
    else if (EQ(*argv, "data"))
      make_data(argc, argv);
    else {
      (void)fprintf(stderr, "Usage error: See Makefile\n");
      return 1;
    }
   return 0;
}