/* * ** 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); }