cdirt/ascii/
cdirt/data/BULL/
cdirt/data/ZONES/PENDING/
cdirt/pending/
cdirt/src/utils/
cdirt/utils/
/*
 * **  Utility program to build the data files.
 * **  Alf, June 1990
 */

#include "kernel.h"
int mcount;

void make_data(char *, Boolean);

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 (char *file1, char *file2, char *file3, Boolean silent) {
  FILE *In, *Out, *H;
  char *p, *q;
  int vcode, num_v;
  XTABLE *first, *last, *v, *w;
  char buff[128], verb[30];

  In = Do_fopen (file1, "r");
  Out = Do_fopen (file2, "w");
  H = Do_fopen (file3, "w");

  first = last = 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 */
  fprintf (H, "\
/*\n\
**\tVerb file header generated from %s\n\
**\tDON'T MAKE CHANGES HERE -- THEY WILL GO AWAY!\n\
*/\n\n\
#ifndef _VERBS_H\n\
#define _VERBS_H\n\n", file1);
  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);
  fprintf (H, "\n#endif\n");
  fclose (H);
  exit (0);
}

int main(int argc, char *argv[]) {
  Boolean silent = False;
  int cur_arg;

  for (cur_arg = 0 ; cur_arg < argc ; cur_arg++) {
   if (EQ(argv[cur_arg], "-q"))
     silent = True;
   else if (EQ(argv[cur_arg], "data")) {
     if (*argv[++cur_arg])
       make_data(argv[cur_arg], silent);
     else
       printf("generate data expects: [datafile]\n");
   }
   else if (EQ(argv[cur_arg], "verbs")) {
     if (*argv[cur_arg+1] && *argv[cur_arg + 2] && *argv[cur_arg + 3])
       make_verbs(argv[cur_arg+1], argv[cur_arg+2], argv[cur_arg+3], silent);
     else
       printf("Generate verbs expects: [verbsource] [verbs] [verbsheader]\n");
   }
  }
  return(0);
}