summaryrefslogtreecommitdiff
path: root/sys/netiso/xebec/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netiso/xebec/main.c')
-rw-r--r--sys/netiso/xebec/main.c410
1 files changed, 410 insertions, 0 deletions
diff --git a/sys/netiso/xebec/main.c b/sys/netiso/xebec/main.c
new file mode 100644
index 00000000000..b39f1c1ea56
--- /dev/null
+++ b/sys/netiso/xebec/main.c
@@ -0,0 +1,410 @@
+/* $NetBSD: main.c,v 1.5 1994/06/29 06:41:07 cgd Exp $ */
+
+/*
+ * TODO:
+ * rewrite the command line stuff altogether - it's kludged beyond
+ * belief (as is the rest of the code...)
+ *
+ * DISCLAIMER DISCLAIMER DISCLAIMER
+ * This code is such a kludge that I don't want to put my name on it.
+ * It was a ridiculously fast hack and needs rewriting.
+ * However it does work...
+ */
+
+#include <stdio.h>
+#include <strings.h>
+#include "malloc.h"
+#include "debug.h"
+#include "main.h"
+
+int debug[128];
+
+int lineno = 1;
+
+FILE *statefile, *actfile, *eventfile_h, *statevalfile;
+FILE *infile, *astringfile;
+char *Transfilename;
+char *astringfile_name = DEBUGFILE;
+char *actfile_name = ACTFILE;
+char *statefile_name = STATEFILE;
+char *statevalfile_name = STATEVALFILE;
+char *eventfile_h_name = EVENTFILE_H;
+int print_trans = 0;
+int print_protoerrs = 0;
+int pgoption = 0;
+char kerneldirname[50] = "\0";
+
+char protocol[50];
+
+char *synonyms[] = {
+ "EVENT",
+ "PCB",
+ 0
+};
+
+usage(a)
+char *a;
+{
+ fprintf(stderr,
+ "usage: %s <transition file> {-D<debug options>} <other options>\n",
+ a);
+ fprintf(stderr, "\t<other options> is any combination of:\n");
+ fprintf(stderr, "\t\t-A<action file name>\n");
+ fprintf(stderr, "\t\t-E<event file name>\n");
+ fprintf(stderr, "\t\t-S<state file name>\n");
+ fprintf(stderr, "\t\t-I<initial values file name>\n");
+ fprintf(stderr, "\t\t-X<debugging file name>\n");
+ fprintf(stderr, "\t\t-K<directory name>\n");
+ fprintf(stderr,
+ "\tThese names do NOT include the suffices (.c, .h)\n");
+ fprintf(stderr,
+ "\t\t-D<options> to turn on debug options for xebec itself\n");
+ fprintf(stderr, "\t-<nn> for levels of debugging output\n");
+ fprintf(stderr, "\t\t<nn> ranges from 1 to 3, 1 is default(everything)\n");
+ fprintf(stderr, "\t\t-T to print transitions\n");
+ fprintf(stderr, "\t\t-e to print list of combinations of\n");
+ fprintf(stderr, "\t\t\t [event,old_state] that produce protocol errors\n");
+ fprintf(stderr, "\t\t-g include profiling code in driver\n");
+ Exit(-1);
+}
+
+openfiles(proto)
+register char *proto;
+{
+ register char *junk;
+ register int lenp = strlen(proto);
+
+ IFDEBUG(b)
+ fprintf(OUT, "openfiles %s\n",proto);
+ ENDDEBUG
+
+#define HEADER Header
+#define SOURCE Source
+#define DOIT(X)\
+ /* GAG */\
+ junk = Malloc( 2 + lenp + strlen(X/**/_name) );\
+ (void) sprintf(junk, "%s_", proto);\
+ X/**/_name = strcat(junk, X/**/_name);\
+ X = fopen(X/**/_name, "w");\
+ if((X)==(FILE *)0)\
+ { fprintf(stderr,"Open failed: %s\n", "X"); Exit(-1); }\
+ fprintf(X, "/* %cHeader%c */\n",'$', '$' );\
+ fprintf(X, "/* %cSource%c */\n",'$', '$' );
+
+ DOIT(eventfile_h);
+
+ IFDEBUG(X)
+#ifdef DEBUG
+ DOIT(astringfile);
+#endif DEBUG
+ fprintf(astringfile,
+ "#ifndef _NFILE\n#include <stdio.h>\n#endif _NFILE\n" );
+ ENDDEBUG
+
+ DOIT(statevalfile);
+ DOIT(statefile);
+ DOIT(actfile);
+ fprintf(actfile,
+ "#ifndef lint\nstatic char *rcsid = \"$Header/**/$\";\n#endif lint\n");
+
+ if(pgoption)
+ putdriver(actfile, 15);
+ else
+ putdriver(actfile, 14);
+
+ FakeFilename(actfile, Transfilename, lineno);
+ putdriver(actfile, 1);
+ FakeFilename(actfile, Transfilename, lineno);
+ putdriver(actfile, 12);
+ fprintf(actfile, "#include \"%s%s\"\n", kerneldirname, statevalfile_name);
+ FakeFilename(actfile, Transfilename, lineno);
+ putdriver(actfile, 2);
+
+ initsets(eventfile_h, statefile);
+}
+
+includecode(file, f)
+FILE *file;
+register char *f;
+{
+ register int count=1;
+ static char o='{';
+ static char c='}';
+ register char *g;
+
+ IFDEBUG(a)
+ fprintf(stdout, "including: %s, f=0x%x", f,f);
+ ENDDEBUG
+ g = ++f;
+ while(count>0) {
+ if(*g == o) count++;
+ if(*g == c) count--;
+ g++;
+ }
+ *(--g) = '\0';
+ IFDEBUG(a)
+ fprintf(stdout, "derived: %s", f);
+ ENDDEBUG
+ fprintf(file, "%s", f);
+ FakeFilename(file, Transfilename, lineno);
+}
+
+putincludes()
+{
+ FakeFilename(actfile, Transfilename, lineno);
+ fprintf(actfile, "\n#include \"%s%s\"\n", kerneldirname, eventfile_h_name);
+ IFDEBUG(X)
+ if( !debug['K'] )
+ fprintf(actfile, "\n#include \"%s\"\n", astringfile_name);
+ /* not in kernel mode */
+ ENDDEBUG
+ FakeFilename(actfile, Transfilename, lineno);
+}
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ register int i = 2;
+ extern char *strcpy();
+ int start, finish;
+ extern int FirstEventAttribute;
+ extern int Nevents, Nstates;
+
+ start = time(0);
+ if(argc < 2) {
+ usage(argv[0]);
+ }
+ IFDEBUG(a)
+ fprintf(stdout, "infile = %s\n",argv[1]);
+ ENDDEBUG
+ Transfilename = argv[1];
+ infile = fopen(argv[1], "r");
+
+ if(argc > 2) while(i < argc) {
+ register int j=0;
+ char c;
+ char *name;
+
+ if(argv[i][j] == '-') j++;
+ switch(c = argv[i][j]) {
+
+ /* GROT */
+ case 'A':
+ name = &argv[i][++j];
+ actfile_name = Malloc( strlen(name)+4);
+ actfile_name = (char *)strcpy(actfile_name,name);
+#ifdef LINT
+ name =
+#endif LINT
+ strcat(actfile_name, ".c");
+ fprintf(stdout, "debugging file is %s\n",actfile_name);
+ break;
+ case 'K':
+ debug[c]=1;
+ fprintf(OUT, "option %c file %s\n",c, &argv[i][j+1]);
+ (void) strcpy(kerneldirname,&argv[i][++j]);
+ break;
+ case 'X':
+ debug[c]=1;
+ name = &argv[i][++j];
+ astringfile_name = Malloc( strlen(name)+4);
+ astringfile_name = (char *)strcpy(astringfile_name,name);
+#ifdef LINT
+ name =
+#endif LINT
+ strcat(astringfile_name, ".c");
+ fprintf(OUT, "option %c, astringfile name %s\n",c, name);
+ break;
+ case 'E':
+ name = &argv[i][++j];
+ eventfile_h_name = Malloc( strlen(name)+4);
+ eventfile_h_name = (char *)strcpy(eventfile_h_name,name);
+#ifdef LINT
+ name =
+#endif LINT
+ strcat(eventfile_h_name, ".h");
+ fprintf(stdout, "event files is %s\n",eventfile_h_name);
+ break;
+ case 'I':
+ name = &argv[i][++j];
+ statevalfile_name = Malloc( strlen(name)+4 );
+ statevalfile_name = (char *)strcpy(statevalfile_name,name);
+#ifdef LINT
+ name =
+#endif LINT
+ strcat(statevalfile_name, ".init");
+ fprintf(stdout, "state table initial values file is %s\n",statevalfile_name);
+ break;
+ case 'S':
+ name = &argv[i][++j];
+ statefile_name = Malloc( strlen(name)+4);
+ statefile_name = (char *)strcpy(statefile_name,name);
+#ifdef LINT
+ name =
+#endif LINT
+ strcat(statefile_name, ".h");
+ fprintf(stdout, "state file is %s\n",statefile_name);
+ break;
+ /* END GROT */
+ case '1':
+ case '2':
+ case '3':
+ debug['X']= (int)argv[i][j] - (int) '0';
+ fprintf(OUT, "value of debug['X'] is 0x%x,%d\n", debug['X'],
+ debug['X']);
+ break;
+ case 'D':
+ while( c = argv[i][++j] ) {
+ if(c == 'X') {
+ fprintf(OUT, "debugging on");
+ if(debug['X']) fprintf(OUT,
+ " - overrides any -%d flags used\n", debug['X']);
+ }
+ debug[c]=1;
+ fprintf(OUT, "debug %c\n",c);
+ }
+ break;
+ case 'g':
+ pgoption = 1;
+ fprintf(stdout, "Profiling\n");
+ break;
+ case 'e':
+ print_protoerrs = 1;
+ fprintf(stdout, "Protocol error table:\n");
+ break;
+
+ case 'T':
+ print_trans = 1;
+ fprintf(stdout, "Transitions:\n");
+ break;
+ default:
+ usage(argv[0]);
+ break;
+ }
+ i++;
+ }
+ if(kerneldirname[0]) {
+ char *c;
+#ifdef notdef
+ if(debug['X']) {
+ fprintf(OUT, "Option K overrides option X\n");
+ debug['X'] = 0;
+ }
+#endif notdef
+ if(strlen(kerneldirname)<1) {
+ fprintf(OUT, "K option: dir name too short!\n");
+ exit(-1);
+ }
+ /* add ../name/ */
+ c = (char *) Malloc(strlen(kerneldirname)+6) ;
+ if(c <= (char *)0) {
+ fprintf(OUT, "Cannot allocate %d bytes for kerneldirname\n",
+ strlen(kerneldirname + 6) );
+ fprintf(OUT, "kerneldirname is %s\n", kerneldirname );
+ exit(-1);
+ }
+ *c = '.';
+ *(c+1) = '.';
+ *(c+2) = '/';
+ (void) strcat(c, kerneldirname);
+ (void) strcat(c, "/\0");
+ strcpy(kerneldirname, c);
+ }
+
+ init_alloc();
+
+ (void) llparse();
+
+ /* {{ */
+ if( !FirstEventAttribute )
+ fprintf(eventfile_h, "\t}ev_union;\n");
+ fprintf(eventfile_h, "};/* end struct event */\n");
+ fprintf(eventfile_h, "\n#define %s_NEVENTS 0x%x\n", protocol, Nevents);
+ fprintf(eventfile_h,
+ "\n#define ATTR(X)ev_union.%s/**/X/**/\n",EV_PREFIX);
+ (void) fclose(eventfile_h);
+
+ /* {{ */ fprintf(actfile, "\t}\nreturn 0;\n}\n"); /* end switch; end action() */
+ dump_predtable(actfile);
+
+ putdriver(actfile, 3);
+ IFDEBUG(X)
+ if(!debug['K'])
+ putdriver(actfile, 4);
+ ENDDEBUG
+ putdriver(actfile, 6);
+ IFDEBUG(X)
+ /*
+ putdriver(actfile, 10);
+ */
+ if(debug['K']) {
+ putdriver(actfile, 11);
+ } else {
+ switch(debug['X']) {
+ case 1:
+ default:
+ putdriver(actfile, 7);
+ break;
+ case 2:
+ putdriver(actfile, 13);
+ break;
+ case 3:
+ break;
+ }
+ }
+ ENDDEBUG
+ putdriver(actfile, 8);
+ (void) fclose(actfile);
+ IFDEBUG(X)
+ /* { */
+ fprintf(astringfile, "};\n");
+ (void) fclose(astringfile);
+ ENDDEBUG
+
+ (void) fclose(statevalfile);
+
+ fprintf(statefile, "\n#define %s_NSTATES 0x%x\n", protocol, Nstates);
+ (void) fclose(statefile);
+
+ finish = time(0);
+ fprintf(stdout, "%d seconds\n", finish - start);
+ if( print_protoerrs )
+ printprotoerrs();
+}
+
+int transno = 0;
+
+Exit(n)
+{
+ fprintf(stderr, "Error at line %d\n",lineno);
+ if(transno) fprintf(stderr, "Transition number %d\n",transno);
+ (void) fflush(stdout);
+ (void) fflush(statefile);
+ (void) fflush(eventfile_h);
+ (void) fflush(actfile);
+ exit(n);
+}
+
+syntax()
+{
+ static char *synt[] = {
+ "*PROTOCOL <string>\n",
+ "*PCB <string> <optional: SYNONYM synonymstring>\n",
+ "<optional: *INCLUDE {\n<C source>\n} >\n",
+ "*STATES <string>\n",
+ "*EVENTS <string>\n",
+ "*TRANSITIONS <string>\n",
+ };
+}
+
+FakeFilename(outfile, name, l)
+FILE *outfile;
+char *name;
+int l;
+{
+ /*
+ doesn't work
+ fprintf(outfile, "\n\n\n\n# line %d \"%s\"\n", l, name);
+ */
+}