summaryrefslogtreecommitdiff
path: root/sys/netiso/xebec
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /sys/netiso/xebec
initial import of NetBSD tree
Diffstat (limited to 'sys/netiso/xebec')
-rw-r--r--sys/netiso/xebec/Makefile9
-rw-r--r--sys/netiso/xebec/debug.h21
-rw-r--r--sys/netiso/xebec/llparse.c366
-rw-r--r--sys/netiso/xebec/llparse.h144
-rw-r--r--sys/netiso/xebec/llscan.c430
-rw-r--r--sys/netiso/xebec/main.c410
-rw-r--r--sys/netiso/xebec/main.h31
-rw-r--r--sys/netiso/xebec/malloc.c136
-rw-r--r--sys/netiso/xebec/malloc.h3
-rw-r--r--sys/netiso/xebec/procs.c437
-rw-r--r--sys/netiso/xebec/procs.h4
-rw-r--r--sys/netiso/xebec/putdriver.c243
-rw-r--r--sys/netiso/xebec/sets.c472
-rw-r--r--sys/netiso/xebec/sets.h35
-rw-r--r--sys/netiso/xebec/test.trans64
-rw-r--r--sys/netiso/xebec/test_def.h14
-rw-r--r--sys/netiso/xebec/xebec.bnf316
-rw-r--r--sys/netiso/xebec/xebec.c450
-rw-r--r--sys/netiso/xebec/xebec.h87
19 files changed, 3672 insertions, 0 deletions
diff --git a/sys/netiso/xebec/Makefile b/sys/netiso/xebec/Makefile
new file mode 100644
index 00000000000..ece942987c5
--- /dev/null
+++ b/sys/netiso/xebec/Makefile
@@ -0,0 +1,9 @@
+# $NetBSD: Makefile,v 1.5 1994/06/29 06:40:59 cgd Exp $
+# @(#)Makefile 5.16 (Berkeley) 4/26/91
+
+PROG= xebec
+SRCS= llparse.c llscan.c main.c malloc.c procs.c putdriver.c sets.c xebec.c
+CFLAGS+= -DDEBUG -traditional
+NOMAN = noman
+
+.include <bsd.prog.mk>
diff --git a/sys/netiso/xebec/debug.h b/sys/netiso/xebec/debug.h
new file mode 100644
index 00000000000..2e69ba2bebe
--- /dev/null
+++ b/sys/netiso/xebec/debug.h
@@ -0,0 +1,21 @@
+/* $NetBSD: debug.h,v 1.4 1994/06/29 06:41:00 cgd Exp $ */
+
+#define OUT stdout
+
+extern int debug[128];
+
+#ifdef DEBUG
+extern int column;
+
+#define IFDEBUG(letter) \
+ if(debug['letter']) {
+#define ENDDEBUG ; (void) fflush(stdout);}
+
+#else
+
+#define STAR *
+#define IFDEBUG(letter) //*beginning of comment*/STAR
+#define ENDDEBUG STAR/*end of comment*//
+
+#endif DEBUG
+
diff --git a/sys/netiso/xebec/llparse.c b/sys/netiso/xebec/llparse.c
new file mode 100644
index 00000000000..0f7cb1d1cbb
--- /dev/null
+++ b/sys/netiso/xebec/llparse.c
@@ -0,0 +1,366 @@
+/* $NetBSD: llparse.c,v 1.4 1994/06/29 06:41:02 cgd Exp $ */
+
+/*
+ * ************************* NOTICE *******************************
+ * This code is in the public domain. It cannot be copyrighted.
+ * This ll parser was originally written by Keith Thompson for the
+ * University of Wisconsin Crystal project.
+ * It was based on an FMQ lr parser written by Jon Mauney at the
+ * University of Wisconsin.
+ * It was subsequently modified very slightly by Nancy Hall at the
+ * University of Wisconsin for the Crystal project.
+ * ****************************************************************
+ */
+#include "xebec.h"
+#include "llparse.h"
+#include "main.h"
+#include <stdio.h>
+
+#include "debug.h"
+
+#define LLMINACTION -LLINF
+
+short llparsestack[STACKSIZE];
+short llstackptr = 0;
+LLtoken lltoken;
+
+llparse()
+{
+ register havetoken = FALSE;
+ register sym;
+ register LLtoken *t = &lltoken;
+ register parseaction;
+ register accepted = FALSE;
+
+ llpushprod(llnprods-1); /* $$$ ::= <start symbol> */
+
+ do {
+ sym = llparsestack[llstackptr];
+ IFDEBUG(L)
+ printf("llparse() top of loop, llstackptr=%d, sym=%d\n",
+ llstackptr, sym);
+ ENDDEBUG
+
+ if(sym < 0) {
+ /* action symbol */
+ if(sym <= LLMINACTION) {
+ for(;sym<=LLMINACTION;sym++) {
+ llaction(1, t); /* calls llfinprod */
+ }
+ llstackptr--;
+ continue;
+ } else { llaction(-sym, t);
+ llstackptr--;
+ continue;
+ }
+ }
+
+ if(sym < llnterms) {
+
+ /* it's a terminal symbol */
+
+ if(!havetoken) {
+ llgettoken(t);
+ havetoken = TRUE;
+ }
+
+ if(sym == t->llterm) {
+ llpushattr(t->llattrib);
+ llaccept(t);
+ llstackptr--; /* pop terminal */
+ if(t->llterm == llnterms-1) { /* end symbol $$$ */
+ accepted = TRUE;
+ } else {
+ havetoken = FALSE;
+ }
+ } else {
+ llparsererror(t); /* wrong terminal on input */
+ havetoken = FALSE;
+ }
+ continue;
+ }
+
+ /* non terminal */
+
+ if(!havetoken) {
+ llgettoken(t);
+ havetoken = TRUE;
+ }
+
+ /* consult parse table for new production */
+ parseaction = llfindaction(sym, t->llterm);
+
+ if(parseaction == 0) {
+ /* error entry */
+ llparsererror(t);
+ havetoken = FALSE;
+ continue;
+ }
+
+ if(llepsilon[parseaction]) {
+ /* epsilon production */
+ if(llepsilonok(t->llterm)) {
+ llstackptr--; /* pop nonterminal */
+ llpushprod(parseaction); /* push rhs of production */
+ } else {
+ llparsererror(t);
+ havetoken = FALSE;
+ }
+ } else {
+ llstackptr--; /* pop nonterminal */
+ llpushprod(parseaction); /* push rhs of production */
+ }
+ } while(!accepted);
+
+ return(0);
+}
+
+llpushprod(prod) /* recognize production prod - push rhs on stack */
+short prod;
+{
+ register start;
+ register length;
+ register count;
+
+ start = llprodindex[prod].llprodstart;
+ length = llprodindex[prod].llprodlength;
+
+ IFDEBUG(L)
+ printf("llpushprod(%d) llstackptr=0x%x(%d), length = 0x%x(%d)\n",
+ prod, llstackptr, llstackptr, length , length);
+ /*
+ dump_parse_stack();
+ */
+ ENDDEBUG
+ if(llstackptr+length >= STACKSIZE) {
+ fprintf(stderr,"Parse stack overflow. llstackptr=0x%x, length=0x%x\n",
+ llstackptr, length);
+ Exit(-1);
+ }
+
+
+ llsetattr(llprodindex[prod].llprodtlen);
+
+ /* put a marker on the stack to mark beginning of production */
+ if(llparsestack[llstackptr] <= LLMINACTION) {
+ (llparsestack[llstackptr]) --; /* if there's already one there, don't
+ put another on; just let it represent all of
+ the adjacent markers */
+ }
+ else {
+ llstackptr++;
+ llparsestack[llstackptr] = LLMINACTION;
+ }
+
+ for(count=0; count<length; count++) {
+ llstackptr++;
+ llparsestack[llstackptr] = llproductions[start++];
+ }
+ if(llstackptr > STACKSIZE) {
+ fprintf(stderr, "PARSE STACK OVERFLOW! \n"); Exit(-1);
+ Exit(-1);
+ }
+}
+
+
+llepsilonok(term)
+{
+ register ptr;
+ register sym;
+ register pact;
+ register nomore;
+ register rval;
+
+ IFDEBUG(L)
+ printf("llepsilonok() enter\n");
+ ENDDEBUG
+ rval = TRUE;
+
+ ptr = llstackptr;
+
+ do {
+ sym = llparsestack[ptr];
+
+ if(sym < 0) {
+ ptr--;
+ nomore = ptr == 0;
+ continue;
+ }
+
+ if(sym < llnterms) {
+ nomore = TRUE;
+ rval = sym == term;
+ continue;
+ }
+
+ pact = llfindaction(sym, term);
+
+ if(pact == 0) {
+ nomore = TRUE;
+ rval = FALSE;
+ continue;
+ }
+
+ if(llepsilon[pact] == TRUE) {
+ ptr--;
+ nomore = ptr == 0;
+ }
+ else {
+ nomore = TRUE;
+ }
+
+ } while(!nomore);
+
+ return(rval);
+}
+
+
+short llfindaction(sym, term)
+{
+ register index;
+
+ IFDEBUG(L)
+ printf("llfindaction(sym=%d, term=%d) enter \n", sym, term);
+ ENDDEBUG
+ index = llparseindex[sym];
+
+ while(llparsetable[index].llterm != 0) {
+ if(llparsetable[index].llterm == term) {
+ return(llparsetable[index].llprod);
+ }
+ index++;
+ }
+ return(0);
+}
+
+
+llparsererror(token)
+LLtoken *token;
+{
+ IFDEBUG(L)
+ fprintf(stderr,"llparsererror() enter\n");
+ prt_token(token);
+ ENDDEBUG
+
+ fprintf(stderr, "Syntax error: ");
+ prt_token(token);
+ dump_buffer();
+ Exit(-1);
+}
+
+
+llgettoken(token)
+LLtoken *token;
+{
+ llscan(token);
+ token->llstate = NORMAL;
+ IFDEBUG(L)
+ printf("llgettoken(): ");
+ prt_token(token);
+ ENDDEBUG
+}
+
+
+/******************************************************************************
+
+ Attribute support routines
+
+******************************************************************************/
+/*
+** attribute stack
+**
+** AttrStack = stack of record
+** values : array of values;
+** ptr : index;
+** end;
+**
+*/
+
+LLattrib llattributes[LLMAXATTR];
+int llattrtop = 0;
+
+struct llattr llattrdesc[LLMAXDESC];
+
+int lldescindex = 1;
+
+
+llsetattr(n)
+{
+ register struct llattr *ptr;
+
+ IFDEBUG(L)
+ printf("llsetattr(%d) enter\n",n);
+ ENDDEBUG
+ if(lldescindex >= LLMAXDESC) {
+ fprintf(stdout, "llattribute stack overflow: desc\n");
+ fprintf(stdout,
+ "lldescindex=0x%x, llattrtop=0x%x\n",lldescindex, llattrtop);
+ Exit(-1);
+ }
+ ptr = &llattrdesc[lldescindex];
+ ptr->llabase = &llattributes[llattrtop];
+ ptr->lloldtop = ++llattrtop;
+ ptr->llaindex = 1;
+ ptr->llacnt = n+1; /* the lhs ALWAYS uses an attr; it remains on the
+ stack when the production is recognized */
+ lldescindex++;
+}
+
+llpushattr(attr)
+LLattrib attr;
+{
+ struct llattr *a;
+
+ IFDEBUG(L)
+ printf("llpushattr() enter\n");
+ ENDDEBUG
+ if(llattrtop + 1 > LLMAXATTR) {
+ fprintf(stderr, "ATTRIBUTE STACK OVERFLOW!\n");
+ Exit(-1);
+ }
+ a = &llattrdesc[lldescindex-1];
+ llattributes[llattrtop++] = attr;
+ a->llaindex++; /* inc count of attrs on the stack for this prod */
+}
+
+llfinprod()
+{
+ IFDEBUG(L)
+ printf("llfinprod() enter\n");
+ ENDDEBUG
+ lldescindex--;
+ llattrtop = llattrdesc[lldescindex].lloldtop;
+ llattrdesc[lldescindex-1].llaindex++; /* lhs-of-prod.attr stays on
+ the stack; it is now one of the rhs attrs of the now-top production
+ on the stack */
+}
+
+#ifndef LINT
+#ifdef DEBUG
+dump_parse_stack()
+{
+ int ind;
+
+ printf("PARSE STACK:\n");
+ for(ind=llstackptr; ind>=0; ind--) {
+ printf("%d\t%d\t%s\n",
+ ind, llparsestack[ind],
+ llparsestack[ind]<0? "Action symbol" : llstrings[llparsestack[ind]]);
+ }
+}
+
+#endif DEBUG
+#endif LINT
+
+prt_token(t)
+LLtoken *t;
+{
+ fprintf(stdout, "t at 0x%x\n", t);
+ fprintf(stdout, "t->llterm=0x%x\n", t->llterm); (void) fflush(stdout);
+ fprintf(stdout, "TOK: %s\n", llstrings[t->llterm]);
+ (void) fflush(stdout);
+#ifdef LINT
+ /* to make lint shut up */
+ fprintf(stdout, "", llnterms, llnsyms, llnprods, llinfinite);
+#endif LINT
+}
diff --git a/sys/netiso/xebec/llparse.h b/sys/netiso/xebec/llparse.h
new file mode 100644
index 00000000000..f996d88ab0e
--- /dev/null
+++ b/sys/netiso/xebec/llparse.h
@@ -0,0 +1,144 @@
+/* $NetBSD: llparse.h,v 1.4 1994/06/29 06:41:04 cgd Exp $ */
+
+ /************************************************************
+ attributes stack garbage
+ ************************************************************/
+
+#define LLMAXATTR 512
+#define LLMAXDESC 256
+#define LLATTR /* build an attribute stack */
+
+ /*
+ ** attribute stack
+ **
+ ** AttrStack = stack of record
+ ** values : array of values;
+ ** ptr : index;
+ ** end;
+ **
+ */
+
+ typedef union llattrib LLattrib;
+
+ extern LLattrib llattributes[LLMAXATTR];
+ extern int llattrtop;
+
+ extern struct llattr {
+ LLattrib *llabase; /* ptr into the attr stack (llattributes) */
+ int llaindex;/* # attrs on the stack so far for this prod */
+ int llacnt;/* total # ever to go on for this prod */
+
+ int lloldtop;/* when popping this prod, restore stack to here ;
+ one attr will remain on the stack (for the lhs) */
+ } llattrdesc[LLMAXDESC];
+
+ extern int lldescindex;
+
+ /************************************************************
+ attributes stack garbage
+ ************************************************************/
+
+ extern struct lltoken {
+ short llterm; /* token number */
+ short llstate; /* inserted deleted normal */
+ LLattrib llattrib;
+ } lltoken;
+ typedef struct lltoken LLtoken;
+
+/************************************************************
+ constants used in llparse.c
+************************************************************/
+
+#define STACKSIZE 500
+#define MAXCORR 16
+
+#define NORMAL 0
+#define DELETE 1
+#define INSERT 2
+
+/************************************************************
+ datatypes used to communicate with the parser
+************************************************************/
+
+struct llinsert {
+ short llinscost;
+ short llinslength;
+ short llinsert[MAXCORR];
+};
+typedef struct llinsert LLinsert;
+
+extern short llparsestack[];
+extern short llstackptr;
+extern short llinfinite;
+
+/************************************************************
+ variables used to pass information
+ specific to each grammer
+************************************************************/
+
+extern short llnterms;
+extern short llnsyms;
+extern short llnprods;
+
+extern char *llefile;
+
+extern struct llparsetable {
+ short llterm;
+ short llprod;
+} llparsetable[];
+
+extern short llparseindex[];
+
+extern short llepsilon[];
+
+extern short llproductions[];
+
+extern struct llprodindex {
+ short llprodstart;
+ short llprodlength;
+ short llprodtlen;
+} llprodindex[];
+
+extern struct llcosts {
+ short llinsert;
+ short lldelete;
+} llcosts[];
+
+extern struct llstable {
+ short llsstart;
+ short llslength;
+} llstable[];
+
+extern short llsspace[];
+
+extern struct lletable {
+ short llecost;
+ short llelength;
+ short llestart;
+} lletable[];
+
+extern long lleindex[];
+
+extern short llespace[];
+
+extern char *llstrings[];
+
+/************************************************************
+ routines defined in llparse.c
+************************************************************/
+
+extern llparse();
+extern llcopye();
+extern llcopys();
+extern llcorrector();
+extern llepsilonok();
+extern llexpand();
+extern short llfindaction();
+extern llgetprefix();
+extern llgettoken();
+extern llinsert();
+extern llinsertsym();
+extern llinserttokens();
+extern llparsererror();
+extern llpushprod();
+extern llreadetab();
diff --git a/sys/netiso/xebec/llscan.c b/sys/netiso/xebec/llscan.c
new file mode 100644
index 00000000000..b41f9bd4c11
--- /dev/null
+++ b/sys/netiso/xebec/llscan.c
@@ -0,0 +1,430 @@
+/* $NetBSD: llscan.c,v 1.5 1994/06/29 06:41:05 cgd Exp $ */
+
+/*
+ * ************************* NOTICE *******************************
+ * This code is in the public domain. It cannot be copyrighted.
+ * This scanner was originally written by Keith Thompson for the
+ * University of Wisconsin Crystal project.
+ * It was subsequently modified significantly by Nancy Hall at the
+ * University of Wisconsin for the ARGO project.
+ * ****************************************************************
+ */
+#include "xebec.h"
+#include "llparse.h"
+
+#include "main.h"
+#include <stdio.h>
+#include "procs.h"
+#include "debug.h"
+
+#define EOFILE 0x01
+#define UNUSED 0x02
+#define IGNORE 0x04
+#define OPCHAR 0x8
+#define DIGITS 0x10
+#define LETTER 0x20
+
+int chtype[128] = {
+/* null, soh ^a, stx ^b etx ^c eot ^d enq ^e ack ^f bel ^g */
+ EOFILE, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
+/* bs ^h ht ^i lf ^j vt ^k ff ^l cr ^m so ^n si ^o */
+ UNUSED, IGNORE, IGNORE, UNUSED, IGNORE, IGNORE, UNUSED, UNUSED,
+/* dle ^p dc1 ^q dc2 ^r dc3 ^s dc4 ^t nak ^u syn ^v etb ^w */
+ UNUSED, UNUSED, UNUSED, UNUSED, EOFILE, UNUSED, UNUSED, UNUSED,
+/* can ^x em ^y sub ^z esc ^] fs ^\ gs ^} rs ^` us ^/ */
+ UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
+
+/* ! " # $ % & ' */
+ IGNORE, UNUSED, OPCHAR, UNUSED, OPCHAR, UNUSED, OPCHAR, OPCHAR,
+/* ( ) * + , - . / */
+ OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR,
+/* 0 1 2 3 4 5 6 7 */
+ DIGITS, DIGITS, DIGITS, DIGITS, DIGITS, DIGITS, DIGITS, DIGITS,
+/* 8 9 : ; < = > ? */
+ DIGITS, DIGITS, OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR, OPCHAR,
+
+/* @ A B C D E F G */
+ UNUSED, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* H I J K L M N O */
+ LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* P Q R S T U V W */
+ LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* X Y Z [ \ ] ^ _ */
+ LETTER, LETTER, LETTER, OPCHAR, UNUSED, OPCHAR, OPCHAR, LETTER,
+
+/* ` a b c d e f g */
+ UNUSED, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* h i j k l m n o */
+ LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* p q r s t u v w */
+ LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
+/* x y z { | } ~ del */
+ LETTER, LETTER, LETTER, OPCHAR, UNUSED, OPCHAR, UNUSED, UNUSED
+};
+
+
+extern FILE *astringfile;
+static char *buffptr;
+static char buffer[2][LINELEN];
+static int currentbuf = 1;
+
+#define addbuf(x) *buffptr++ = x
+
+static int ch = ' ';
+
+skip()
+{
+ while((chtype[ch] == IGNORE) ) {
+ ch = getch();
+ }
+}
+
+llaccept(t)
+LLtoken *t;
+{
+ switch(t->llstate) {
+ case NORMAL:
+ break;
+ case INSERT:
+ fprintf(stderr,"Insert %s\n", llstrings[t->llterm]);
+ break;
+ case DELETE:
+ fprintf(stderr,"Delete %s\n", llstrings[t->llterm]);
+ break;
+ }
+}
+
+#define TVAL (t->llattrib)
+
+
+dump_buffer()
+{
+ register int i;
+ for(i=0; i<20; i++)
+ (void) fputc(buffer[currentbuf][i], stderr);
+ (void) fputc('\n', stderr);
+ (void) fflush(stderr);
+}
+
+int iskey(c, buf)
+char *c;
+char **buf;
+{
+ register int i;
+ static struct { char *key_word; int term_type; } keys[] = {
+ { "SAME", T_SAME },
+ { "DEFAULT", T_DEFAULT },
+ { "NULLACTION", T_NULLACTION },
+ { "STRUCT", T_STRUCT },
+ { "SYNONYM", T_SYNONYM },
+ { "TRANSITIONS", T_TRANSITIONS },
+ { "STATES", T_STATES },
+ { "EVENTS", T_EVENTS },
+ { "PCB", T_PCB },
+ { "INCLUDE", T_INCLUDE },
+ { "PROTOCOL", T_PROTOCOL },
+ { 0, 0},
+ };
+
+ for (i = 0; keys[i].key_word ; i++) {
+ if( !strcmp(c, (*buf = keys[i].key_word) ) ) {
+ return ( keys[i].term_type );
+ }
+ }
+ *buf = (char *)0;
+ return(0);
+}
+
+getstr(o,c)
+ /* c is the string delimiter
+ * allow the delimiter to be escaped
+ * the messy part: translate $ID to
+ * e->ev_union.ID
+ * where ID is an event with a non-zero obj_struc
+ * need we check for the field???
+ */
+char o,c;
+{
+ register int nested = 1;
+ register int allow_nesting = (o==c)?-1:1;
+
+ IFDEBUG(S)
+ fprintf(stdout,"getstr: ch=%c, delimiters %c %c\n",
+ ch,o, c);
+ fprintf(stdout,"getstr: buffptr 0x%x, currentbuf 0x%x\n",
+ buffptr, currentbuf);
+ ENDDEBUG
+
+ if( ch == c ) nested--;
+ while(nested) {
+ if(ch == '\0') {
+ fprintf(stderr,
+ "Eof inside of a string, delims= %c,%c, nesting %d",c,o, nested);
+ Exit(-1);
+ /* notreached */
+ } else if(ch == '$') {
+ /* might be an attribute */
+ IFDEBUG(S)
+ fprintf(stdout,"getstr: atttribute?\n");
+ ENDDEBUG
+
+ /* assume it's an event */
+ /* addbuf is a macro so this isn't as bad as
+ * it looks
+ * add "e->ev_union."
+ */
+ if( (ch = getch()) == '$' ) {
+ addbuf('e'); addbuf('-'); addbuf('>');
+ addbuf('e'); addbuf('v'); addbuf('_');
+ addbuf('u'); addbuf('n'); addbuf('i');
+ addbuf('o'); addbuf('n');
+ addbuf('.');
+ AddCurrentEventName(& buffptr);
+ } else {
+ char *obufp = buffptr;
+
+ do {
+ addbuf(ch);
+ ch = getch();
+ } while(chtype[ch] & LETTER);
+ addbuf('\0');
+ if( !strncmp(obufp, synonyms[PCB_SYN],
+ strlen(synonyms[PCB_SYN]) )) {
+ buffptr = obufp;
+ addbuf('p');
+ } else if( !strncmp(obufp, synonyms[EVENT_SYN],
+ strlen(synonyms[EVENT_SYN]))) {
+ buffptr = obufp;
+ addbuf('e');
+ } else {
+ fprintf(stderr, "Unknown synonym %s\n", obufp);
+ Exit(-1);
+ }
+ if(ch == '.') {
+ addbuf('-'); addbuf('>');
+ } else {
+ /* needs to be checked for nesting */
+ goto check;
+ }
+ }
+ /* end of attribute handling */
+ goto skip;
+ } else if(ch == '\\') {
+ /* possible escape - this is kludgy beyond belief:
+ * \ is used to escape open and closing delimiters
+ * and '$'
+ * otherwise it's passed through to be compiled by C
+ */
+ ch = getch();
+ if( (ch != o ) && (ch != c) && (ch != '$') ) {
+ /* may need to handle case where \ is last char in file... */
+ /* don't treat is as escape; not open or close so
+ * don't have to worry about nesting either
+ */
+ addbuf('\\');
+ }
+ }
+ addbuf(ch);
+ skip:
+ ch = getch();
+ check:
+ if( ch == o ) nested += allow_nesting;
+ else if( ch == c ) nested--;
+ if ( (buffptr - buffer[currentbuf]) > LINELEN) {
+ fprintf(stderr,
+ "%s too long.\n", (o=='{')?"Action":"Predicate"); /*}*/
+ fprintf(stderr,
+ "buffptr, currentbuf 0x%x, 0x%x\n",buffptr,currentbuf );
+ Exit(-1);
+ }
+ IFDEBUG(S)
+ fprintf(stdout,"loop in getstr: ch 0x%x,%c o=%c,c=%c nested=%d\n",
+ ch,ch,o,c,nested);
+ ENDDEBUG
+ }
+ addbuf(ch);
+ addbuf('\0');
+
+ IFDEBUG(S)
+ fprintf(stdout,"exit getstr: got %s\n", buffer[currentbuf]);
+ fprintf(stdout,"exit getstr: buffptr 0x%x, currentbuf 0x%x\n",
+ buffptr, currentbuf);
+ ENDDEBUG
+}
+
+getch()
+{
+ char c;
+ extern FILE *infile;
+ extern int lineno;
+
+ c = fgetc(infile) ;
+ if (c == '\n') lineno++;
+ if ((int)c == EOF) c = (char)0;
+ if (feof(infile)) c = (char) 0;
+ IFDEBUG(e)
+ fprintf(stdout, "getch: 0x%x\n", c);
+ (void) fputc( c, stdout);
+ fflush(stdout);
+ ENDDEBUG
+
+ return c;
+}
+
+llscan(t)
+LLtoken *t;
+{
+ char c;
+
+ t->llstate = NORMAL;
+
+ ++currentbuf;
+ currentbuf&=1;
+again:
+ buffptr = &buffer[currentbuf][0];
+
+ skip();
+
+ switch(chtype[ch]) {
+
+ case EOFILE:
+ t->llterm = T_ENDMARKER;
+ break;
+
+ case UNUSED:
+ fprintf(stderr, "Illegal character in input - 0x%x ignored.", ch);
+ ch = getch();
+ goto again;
+
+ case OPCHAR:
+
+ switch(ch) {
+
+ case '/':
+ /* possible comment : elide ; kludge */
+ IFDEBUG(S)
+ fprintf(stdout, "Comment ch=%c\n", ch);
+ ENDDEBUG
+ c = getch();
+ if (c != '*') {
+ fprintf(stderr,"Syntax error : character(0x%x) ignored", ch);
+ ch = c;
+ goto again;
+ } else {
+ register int state = 2, whatchar=0;
+ static int dfa[3][3] = {
+ /* done seen-star middle */
+ /* star */ { 0, 1, 1 },
+ /* / */ { 0, 0, 2 },
+ /* other */ { 0, 2, 2 }
+ };
+
+ while( state ) {
+ if( (c = getch()) == (char)0)
+ break;
+ whatchar = (c=='*')?0:(c=='/'?1:2);
+ IFDEBUG(S)
+ fprintf(stdout,
+ "comment: whatchar = %d, c = 0x%x,%c, oldstate=%d",
+ whatchar, c,c, state);
+ ENDDEBUG
+ state = dfa[whatchar][state];
+ IFDEBUG(S)
+ fprintf(stdout, ", newstate=%d\n", state);
+ ENDDEBUG
+ }
+ if(state) {
+ fprintf(stderr,
+ "Syntax error: end of file inside a comment");
+ Exit(-1);
+ } else ch = getch();
+ }
+ IFDEBUG(S)
+ fprintf(stdout, "end of comment at 0x%x,%c\n",ch,ch);
+ ENDDEBUG
+ goto again;
+
+
+ case '*':
+ t->llterm = T_STAR;
+ break;
+
+ case ',':
+ t->llterm = T_COMMA;
+ break;
+
+ case ';':
+ t->llterm = T_SEMI;
+ break;
+
+ case '<':
+ t->llterm = T_LANGLE;
+ break;
+
+ case '=':
+ t->llterm = T_EQUAL;
+ break;
+
+ case '[':
+ t->llterm = T_LBRACK;
+ break;
+
+ case ']':
+ t->llterm = T_RBRACK;
+ break;
+
+#ifdef T_FSTRING
+ case '"':
+ t->llterm = T_FSTRING;
+ addbuf(ch);
+ ch = getch();
+ getstr('"', '"');
+ TVAL.FSTRING.address = stash(buffer[currentbuf]);
+ break;
+#endif T_FSTRING
+
+ case '(':
+ t->llterm = T_PREDICATE;
+ getstr(ch, ')' );
+ TVAL.PREDICATE.address = buffer[currentbuf];
+ break;
+
+ case '{':
+ t->llterm = T_ACTION;
+ getstr(ch, '}');
+ TVAL.ACTION.address = buffer[currentbuf];
+ break;
+
+ default:
+ fprintf(stderr,"Syntax error : character(0x%x) ignored", ch);
+ ch = getch();
+ goto again;
+
+ }
+ ch = getch();
+ break;
+
+ case LETTER:
+ do {
+ addbuf(ch);
+ ch = getch();
+ } while(chtype[ch] & (LETTER | DIGITS));
+
+ addbuf('\0');
+
+ t->llterm = iskey(buffer[currentbuf], &TVAL.ID.address);
+ if(!t->llterm) {
+ t->llterm = T_ID;
+ TVAL.ID.address = buffer[currentbuf];
+ }
+ IFDEBUG(S)
+ fprintf(stdout, "llscan: id or keyword 0x%x, %s\n",
+ TVAL.ID.address, TVAL.ID.address);
+ ENDDEBUG
+ break;
+
+ default:
+ fprintf(stderr, "Snark in llscan: chtype=0x%x, ch=0x%x\n",
+ chtype[ch], ch);
+ }
+}
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);
+ */
+}
diff --git a/sys/netiso/xebec/main.h b/sys/netiso/xebec/main.h
new file mode 100644
index 00000000000..920c4d3823c
--- /dev/null
+++ b/sys/netiso/xebec/main.h
@@ -0,0 +1,31 @@
+/* $NetBSD: main.h,v 1.4 1994/06/29 06:41:08 cgd Exp $ */
+
+#define TRUE 1
+#define FALSE 0
+#define LINELEN 2350
+ /* approx limit on token size for C compiler
+ * which matters for the purpose of debugging (astring.c...)
+ */
+
+#define MSIZE 4000
+#define DEBUGFILE "astring.c"
+#define ACTFILE "driver.c"
+#define EVENTFILE_H "events.h"
+#define STATEFILE "states.h"
+#define STATEVALFILE "states.init"
+
+#define EV_PREFIX "EV_"
+#define ST_PREFIX "ST_"
+
+#define PCBNAME "_PCB_"
+
+extern char kerneldirname[];
+extern char protocol[];
+extern char *synonyms[];
+#define EVENT_SYN 0
+#define PCB_SYN 1
+
+extern int transno;
+extern int print_trans;
+extern char *stash();
+
diff --git a/sys/netiso/xebec/malloc.c b/sys/netiso/xebec/malloc.c
new file mode 100644
index 00000000000..e4e7e85a16d
--- /dev/null
+++ b/sys/netiso/xebec/malloc.c
@@ -0,0 +1,136 @@
+/* $NetBSD: malloc.c,v 1.4 1994/06/29 06:41:10 cgd Exp $ */
+
+/*
+ * 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...
+ */
+
+/*
+ * a simple malloc
+ * it might be brain-damaged but for the purposes of xebec
+ * it's a whole lot faster than the c library malloc
+ */
+
+#include <stdio.h>
+#include "malloc.h"
+#include "debug.h"
+#define CHUNKSIZE 4096*2
+
+static char *hiwat, *highend;
+int bytesmalloced=0;
+int byteswasted = 0;
+
+
+init_alloc()
+{
+#ifdef LINT
+ hiwat = 0;
+ highend = 0;
+#else LINT
+ extern char *sbrk();
+
+ hiwat = (char *) sbrk(0);
+ hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);
+ highend = hiwat;
+#endif LINT
+}
+
+HIWAT(s)
+char *s;
+{
+ IFDEBUG(M)
+ fprintf(stdout, "HIWAT 0x%x %s\n", hiwat,s);
+ fflush(stdout);
+ ENDDEBUG
+}
+
+#define MIN(x,y) ((x<y)?x:y)
+
+char *Malloc(x)
+int x;
+{
+ char *c;
+ extern char *sbrk();
+ static int firsttime=1;
+ int total = x;
+ int first_iter = 1;
+ char *returnvalue;
+
+ IFDEBUG(N)
+ fprintf(stdout, "Malloc 0x%x, %d, bytesmalloced %d\n",
+ total,total, bytesmalloced);
+ fflush(stdout);
+ ENDDEBUG
+ IFDEBUG(M)
+ fprintf(stdout, "Malloc 0x%x, %d, hiwat 0x%x\n",
+ total,total, hiwat);
+ fflush(stdout);
+ ENDDEBUG
+ if(firsttime) {
+ hiwat = sbrk(0);
+ if(((unsigned)(hiwat) & 0x3)) {
+ bytesmalloced = 4 - (int) ((unsigned)(hiwat) & 0x3);
+ hiwat = sbrk( bytesmalloced );
+ } else
+ bytesmalloced = 0;
+ firsttime = 0;
+ highend = hiwat;
+ }
+ while( total ) {
+ x = MIN(CHUNKSIZE, total);
+ if(total != x) {
+ IFDEBUG(N)
+ fprintf(stdout, "BIG Malloc tot %d, x %d, left %d net %d\n",
+ total,x, total-x, bytesmalloced);
+ fflush(stdout);
+ ENDDEBUG
+ }
+ if ( (hiwat + x) > highend) {
+ c = sbrk(CHUNKSIZE);
+ IFDEBUG(M)
+ fprintf(stdout, "hiwat 0x%x, x 0x%x, highend 0x%x, c 0x%x\n",
+ hiwat, x, highend, c);
+ fflush(stdout);
+ ENDDEBUG
+ if( c == (char *) -1 ) {
+ fprintf(stderr, "Ran out of memory!\n");
+ Exit(-1);
+ }
+ if(first_iter) {
+ returnvalue = c;
+ first_iter = 0;
+ }
+ bytesmalloced += CHUNKSIZE;
+ IFDEBUG(m)
+ if (highend != c) {
+ fprintf(OUT, "warning: %d wasted bytes!\n", highend - hiwat);
+ fprintf(OUT, " chunksize 0x%x, x 0x%x \n", CHUNKSIZE, x);
+ }
+ ENDDEBUG
+ highend = c + CHUNKSIZE;
+ hiwat = c;
+ }
+ c = hiwat;
+ if(first_iter) {
+ returnvalue = c;
+ first_iter = 0;
+ }
+ hiwat += x;
+ total -= x;
+ }
+ if((unsigned)hiwat & 0x3) {
+ byteswasted += (int)((unsigned)(hiwat) & 0x3);
+ hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);
+ }
+ IFDEBUG(M)
+ fprintf(stdout, "Malloc = 0x%x, bytesm 0x%x, wasted 0x%x, hiwat 0x%x\n",
+ returnvalue, bytesmalloced, byteswasted, hiwat);
+ ENDDEBUG
+ IFDEBUG(N)
+ fprintf(stdout, "Malloc returns 0x%x, sbrk(0) 0x%x\n", returnvalue, sbrk(0));
+ fflush(stdout);
+ ENDDEBUG
+ return(returnvalue);
+}
+
diff --git a/sys/netiso/xebec/malloc.h b/sys/netiso/xebec/malloc.h
new file mode 100644
index 00000000000..24fa30a3398
--- /dev/null
+++ b/sys/netiso/xebec/malloc.h
@@ -0,0 +1,3 @@
+/* $NetBSD: malloc.h,v 1.4 1994/06/29 06:41:11 cgd Exp $ */
+
+char *Malloc();
diff --git a/sys/netiso/xebec/procs.c b/sys/netiso/xebec/procs.c
new file mode 100644
index 00000000000..3eef7afea6c
--- /dev/null
+++ b/sys/netiso/xebec/procs.c
@@ -0,0 +1,437 @@
+/* $NetBSD: procs.c,v 1.4 1994/06/29 06:41:12 cgd Exp $ */
+
+/*
+ * 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 "main.h"
+#include "debug.h"
+#include "sets.h"
+#include "procs.h"
+
+struct Predicate {
+ int p_index;
+ int p_transno;
+ char *p_str;
+ struct Predicate *p_next;
+};
+
+struct Stateent {
+ int s_index;
+ int s_newstate;
+ int s_action;
+ struct Stateent *s_next;
+};
+
+struct Object *SameState = (struct Object *)-1;
+int Index = 0;
+int Nstates = 0;
+int Nevents = 0;
+struct Predicate **Predlist;
+struct Stateent **Statelist;
+extern FILE *astringfile;
+
+end_events() {
+ int size, part;
+ char *addr;
+
+ IFDEBUG(X)
+ /* finish estring[], start astring[] */
+ if(debug['X'] < 2 )
+ fprintf(astringfile, "};\n\nchar *%s_astring[] = {\n\"NULLACTION\",\n",
+ protocol);
+ ENDDEBUG
+ /* NOSTRICT */
+ Statelist =
+ (struct Stateent **) Malloc((Nstates+1) * sizeof(struct Statent *));
+ /* NOSTRICT */
+ Predlist =
+ (struct Predicate **)
+ Malloc ( (((Nevents)<<Eventshift)+Nstates)*sizeof(struct Predicate *) );
+
+ size = (((Nevents)<<Eventshift)+Nstates)*sizeof(struct Predicate *) ;
+ addr = (char *)Predlist;
+ IFDEBUG(N)
+ fprintf(OUT, "Predlist at 0x%x, sbrk 0x%x bzero size %d at addr 0x%x\n",
+ Predlist, sbrk(0), size, addr);
+ ENDDEBUG
+#define BZSIZE 8192
+ while(size) {
+ part = size>BZSIZE?BZSIZE:size;
+ IFDEBUG(N)
+ fprintf(OUT, "bzero addr 0x%x part %d size %d\n",addr, part, size);
+ ENDDEBUG
+ bzero(addr, part);
+ IFDEBUG(N)
+ fprintf(OUT, "after bzero addr 0x%x part %d size %d\n",addr, part, size);
+ ENDDEBUG
+ addr += part;
+ size -= part;
+
+ }
+ IFDEBUG(N)
+ fprintf(OUT, "endevents..done \n");
+ ENDDEBUG
+}
+
+int acttable(f,actstring)
+char *actstring;
+FILE *f;
+{
+ static Actindex = 0;
+ extern FILE *astringfile;
+ extern int pgoption;
+
+ IFDEBUG(a)
+ fprintf(OUT,"acttable()\n");
+ ENDDEBUG
+ fprintf(f, "case 0x%x: \n", ++Actindex);
+
+ if(pgoption) {
+ fprintf(f, "asm(\" # dummy statement\");\n");
+ fprintf(f, "asm(\"_Xebec_action_%x: \");\n", Actindex );
+ fprintf(f, "asm(\".data\");\n");
+ fprintf(f, "asm(\".globl _Xebec_action_%x# X profiling\");\n",
+ Actindex );
+ fprintf(f, "asm(\".long 0 # X profiling\");\n");
+ fprintf(f, "asm(\".text # X profiling\");\n");
+ fprintf(f, "asm(\"cas r0,r15,r0 # X profiling\");\n");
+ fprintf(f, "asm(\"bali r15,mcount # X profiling\");\n");
+ }
+
+ fprintf(f, "\t\t%s\n\t\t break;\n", actstring);
+ IFDEBUG(X)
+ if(debug['X']<2) {
+ register int len = 0;
+ fputc('"',astringfile);
+ while(*actstring) {
+ if( *actstring == '\n' ) {
+ fputc('\\', astringfile);
+ len++;
+ fputc('n', astringfile);
+ } else if (*actstring == '\\') {
+ fputc('\\', astringfile);
+ len ++;
+ fputc('\\', astringfile);
+ } else if (*actstring == '\"') {
+ fputc('\\', astringfile);
+ len ++;
+ fputc('\"', astringfile);
+ } else fputc(*actstring, astringfile);
+ actstring++;
+ len++;
+ }
+ fprintf(astringfile,"\",\n");
+ if (len > LINELEN) {
+ fprintf(stderr, "Action too long: %d\n",len); Exit(-1);
+ }
+ }
+ ENDDEBUG
+
+ return(Actindex);
+}
+
+static int Npred=0, Ndefpred=0, Ntrans=0, Ndefevent=0, Nnulla=0;
+
+statetable(string, oldstate, newstate, action, event)
+char *string;
+int action;
+struct Object *oldstate, *newstate, *event;
+{
+ register int different;
+
+ IFDEBUG(a)
+ fprintf(OUT,"statetable(0x%x, 0x%x,0x%x, 0x%x)\n",
+ string, oldstate, newstate, action);
+ fprintf(OUT,"statetable(%s, %s,%s, 0x%x)\n",
+ string, oldstate->obj_name, newstate->obj_name, action);
+ ENDDEBUG
+
+ if( !action) Nnulla++;
+ if( newstate->obj_kind == OBJ_SET) {
+ fprintf(stderr, "Newstate cannot be a set\n");
+ Exit(-1);
+ }
+ different = (newstate != SameState);
+
+ (void) predtable( oldstate, event, string,
+ action, (newstate->obj_number) * different );
+ IFDEBUG(a)
+ fprintf(OUT,"EXIT statetable\n");
+ ENDDEBUG
+}
+
+stateentry(index, oldstate, newstate, action)
+int index, action;
+int oldstate, newstate;
+{
+ extern FILE *statevalfile;
+
+ IFDEBUG(a)
+ fprintf(OUT,"stateentry(0x%x,0x%x,0x%x,0x%x) Statelist@0x%x, val 0x%x\n",
+ index, oldstate, newstate,action, &Statelist, Statelist);
+ ENDDEBUG
+
+
+ fprintf(statevalfile, "{0x%x,0x%x},\n", newstate, action);
+}
+
+int predtable(os, oe, str, action, newstate)
+struct Object *os, *oe;
+char *str;
+int action, newstate;
+{
+ register struct Predicate *p, **q;
+ register int event, state;
+ register struct Object *e, *s;
+ struct Object *firste;
+
+ if (oe == (struct Object *)0 ) {
+ Ndefevent ++;
+ fprintf(stderr, "DEFAULT EVENTS aren't implemented; trans ignored\n");
+ return;
+ }
+ Ntrans++;
+ IFDEBUG(g)
+ fprintf(stdout,
+ "PREDTAB: s %5s; e %5s\n", os->obj_kind==OBJ_SET?"SET":"item",
+ oe->obj_kind==OBJ_SET?"SET":"item");
+ ENDDEBUG
+ if (os->obj_kind == OBJ_SET) s = os->obj_members;
+ else s = os;
+ if (oe->obj_kind == OBJ_SET) firste = oe->obj_members;
+ else firste = oe;
+ if(newstate) {
+ fprintf(statevalfile, "{0x%x,0x%x},\n",newstate, action);
+ Index++;
+ }
+ while (s) {
+ if( !newstate ) { /* !newstate --> SAME */
+ /* i.e., use old obj_number */
+ fprintf(statevalfile, "{0x%x,0x%x},\n",s->obj_number, action);
+ Index++;
+ }
+ e = firste;
+ while (e) {
+ event = e->obj_number; state = s->obj_number;
+ IFDEBUG(g)
+ fprintf(stdout,"pred table event=0x%x, state 0x%x\n",
+ event, state);
+ fflush(stdout);
+ ENDDEBUG
+ if( !str /* DEFAULT PREDICATE */) {
+ Ndefpred++;
+ IFDEBUG(g)
+ fprintf(stdout,
+ "DEFAULT pred state 0x%x, event 0x%x, Index 0x%x\n",
+ state, event, Index);
+ fflush(stdout);
+ ENDDEBUG
+ } else
+ Npred++;
+ /* put at END of list */
+#ifndef LINT
+ IFDEBUG(g)
+ fprintf(stdout,
+ "predicate for event 0x%x, state 0x%x is 0x%x, %s\n",
+ event, state, Index, str);
+ fflush(stdout);
+ ENDDEBUG
+#endif LINT
+ for( ((q = &Predlist[(event<<Eventshift)+state]),
+ (p = Predlist[(event<<Eventshift)+state]));
+ p ; p = p->p_next ) {
+ q = &p->p_next;
+ }
+
+ p = (struct Predicate *)Malloc(sizeof(struct Predicate));
+ p->p_next = (struct Predicate *)0;
+ p->p_str = str;
+ p->p_index = Index;
+ p->p_transno = transno;
+ *q = p;
+
+ IFDEBUG(g)
+ fprintf(stdout,
+ "predtable index 0x%x, transno %d, E 0x%x, S 0x%x\n",
+ Index, transno, e, s);
+ ENDDEBUG
+
+ e = e->obj_members;
+ }
+ s = s->obj_members;
+ }
+ return Index ;
+}
+
+printprotoerrs()
+{
+ register int e,s;
+
+ fprintf(stderr, "[ Event, State ] without any transitions :\n");
+ for(e = 0; e < Nevents; e++) {
+ fprintf(stderr, "Event 0x%x: states ", e);
+ for(s = 0; s < Nstates; s++) {
+ if( Predlist[(e<<Eventshift)+s] == 0 )
+ fprintf(stderr, "0x%x ", s);
+ }
+ fprintf(stderr, "\n");
+ }
+}
+
+#ifndef LINT
+dump_predtable(f)
+FILE *f;
+{
+ struct Predicate *p;
+ register int e,s, hadapred;
+ int defaultindex;
+ int defaultItrans;
+ extern int bytesmalloced;
+ extern int byteswasted;
+
+#ifdef notdef
+ fprintf(stdout,
+ " Xebec used %8d bytes of storage, wasted %8d bytes\n",
+ bytesmalloced, byteswasted);
+#endif notdef
+ fprintf(stdout,
+ " %8d states\n %8d events\n %8d transitions\n",
+ Nstates, Nevents, Ntrans);
+ fprintf(stdout,
+ " %8d predicates\n %8d default predicates used\n",
+ Npred, Ndefpred);
+ fprintf(stdout,
+ " %8d null actions\n",
+ Nnulla);
+
+ putdriver(f, 5);
+ for(e = 0; e < Nevents; e++) { for(s = 0; s < Nstates; s++) {
+ p = Predlist[(e<<Eventshift)+s];
+ hadapred=0;
+ defaultindex=0;
+ defaultItrans=0;
+ if(p) {
+ IFDEBUG(d)
+ fflush(f);
+ ENDDEBUG
+ while(p) {
+ if(p->p_str) {
+ if(!hadapred)
+ fprintf(f, "case 0x%x:\n\t", (e<<Eventshift) + s);
+ hadapred = 1;
+ fprintf(f, "if %s return 0x%x;\n\t else ",
+ p->p_str, p->p_index);
+ } else {
+ if(defaultindex) {
+ fprintf(stderr,
+"\nConflict between transitions %d and %d: duplicate default \n",
+ p->p_transno, defaultItrans);
+ Exit(-1);
+ }
+ defaultindex = p->p_index;
+ defaultItrans = p->p_transno;
+ }
+ p = p->p_next;
+ }
+ if( hadapred) {
+ fprintf(f, "return 0x%x;\n", defaultindex);
+ }
+ IFDEBUG(d)
+ fflush(f);
+ ENDDEBUG
+ }
+ IFDEBUG(g)
+ fprintf(stdout,
+ "loop: e 0x%x s 0x%x hadapred 0x%x dindex 0x%x for trans 0x%x\n",
+ e, s, hadapred, defaultindex, defaultItrans);
+ ENDDEBUG
+ if ( hadapred ) {
+ /* put a -1 in the array - Predlist is temporary storage */
+ Predlist[(e<<Eventshift)+s] = (struct Predicate *)(-1);
+ } else {
+ /* put defaultindex in the array */
+ /* if defaultindex is zero, then the driver will
+ * cause an erroraction (same as if no default
+ * were given and none of the predicates were true;
+ * also same as if no preds or defaults were given
+ * for this combo)
+ */
+ Predlist[(e<<Eventshift)+s] = (struct Predicate *)(defaultindex);
+ }
+ } }
+ fprintf(f, "default: return 0;\n} /* end switch */\n");
+#ifdef notdef
+ fprintf(f, "/*NOTREACHED*/return 0;\n} /* _Xebec_index() */\n");
+#else notdef
+ fprintf(f, "} /* _Xebec_index() */\n");
+#endif notdef
+ fprintf(f, "static int inx[%d][%d] = { {", Nevents+1,Nstates);
+ for(s = 0; s< Nstates; s++) fprintf(f, "0,"); /* event 0 */
+ fprintf(f, "},\n");
+
+ for(e = 0; e < Nevents; e++) {
+ fprintf(f, " {");
+ for(s = 0; s < Nstates; s++) {
+ register struct Predicate *xyz = Predlist[(e<<Eventshift)+s];
+ /* this kludge is to avoid a lint msg. concerning
+ * loss of bits
+ */
+ if (xyz == (struct Predicate *)(-1))
+ fprintf(f, "-1,");
+ else
+ fprintf(f, "0x%x,", Predlist[(e<<Eventshift)+s]);
+ }
+ fprintf(f, " },\n");
+ }
+ fprintf(f, "};");
+}
+#endif LINT
+
+char *
+stash(buf)
+char *buf;
+{
+ register int len;
+ register char *c;
+
+ /* grot */
+ len = strlen(buf);
+ c = Malloc(len+1);
+#ifdef LINT
+ c =
+#endif LINT
+ strcpy(c, buf);
+
+ IFDEBUG(z)
+ fprintf(stdout,"stash %s at 0x%x\n", c,c);
+ ENDDEBUG
+ return(c);
+}
+
+#ifdef notdef
+dump_pentry(event,state)
+int event,state;
+{
+ register struct Predicate *p, **q;
+
+ for(
+ ((q = &Predlist[(event<<Eventshift) +state]),
+ (p = Predlist[(event<<Eventshift) + state]));
+ p!= (struct Predicate *)0 ; p = p->p_next ) {
+#ifndef LINT
+ IFDEBUG(a)
+ fprintf(OUT,
+ "dump_pentry for event 0x%x, state 0x%x is 0x%x\n",
+ event, state, p);
+ ENDDEBUG
+#endif LINT
+ q = &p->p_next;
+ }
+}
+#endif notdef
diff --git a/sys/netiso/xebec/procs.h b/sys/netiso/xebec/procs.h
new file mode 100644
index 00000000000..624c85562e3
--- /dev/null
+++ b/sys/netiso/xebec/procs.h
@@ -0,0 +1,4 @@
+/* $NetBSD: procs.h,v 1.4 1994/06/29 06:41:13 cgd Exp $ */
+
+extern char *stash();
+extern struct Object *SameState;
diff --git a/sys/netiso/xebec/putdriver.c b/sys/netiso/xebec/putdriver.c
new file mode 100644
index 00000000000..bf6a03771af
--- /dev/null
+++ b/sys/netiso/xebec/putdriver.c
@@ -0,0 +1,243 @@
+/* $NetBSD: putdriver.c,v 1.4 1994/06/29 06:41:15 cgd Exp $ */
+
+/*
+ * 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...
+ */
+
+/* The original idea was to put all the driver code
+ * in one place so it would be easy to modify
+ * but as hacks got thrown in it got worse and worse...
+ * It's to the point where a user would be better off
+ * writing his own driver and xebec should JUST produce
+ * the tables.
+ */
+
+#include <stdio.h>
+#include "main.h"
+#include "debug.h"
+
+extern char protocol[];
+char Eventshiftstring[10];
+static char statename[] = {'_', 's', 't', 'a', 't', 'e', 0 };
+
+static char *strings[] = {
+
+#define PART1 { 0,3 }
+
+ "\n#include \"",
+ kerneldirname,
+ protocol,
+ "_states.h\"",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART12 { 10,12 }
+ "\n\nstatic struct act_ent {\n",
+ "\tint a_newstate;\n\tint a_action;\n",
+ "} statetable[] = { {0,0},\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART2 { 20,20 }
+ "};\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART3 { 30,41 }
+ "\n",
+ protocol,
+ "_driver(p, e)\nregister ",
+ protocol,
+ PCBNAME,
+ " *p;\nregister struct ",
+ protocol,
+ "_event *e;\n",
+ "{\n",
+ "\tregister int index, error=0;\n",
+ "\tstruct act_ent *a;\n",
+ "\tstatic struct act_ent erroraction = {0,-1};\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART4 { 50,54 }
+
+ "\textern int ",
+ protocol,
+ "_debug;\n\textern FILE *",
+ protocol,
+ "_astringfile;\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART6 { 60, 65 }
+ "\n\tindex = inx[1 + e->ev_number][p->",
+ protocol,
+ statename,
+ "];\n\tif(index<0) index=_Xebec_index(e, p);\n",
+ "\tif (index==0) {\n\t\ta = &erroraction;\n",
+ "\t} else\n\t\ta = &statetable[index];\n\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART7 {70, 77 }
+ "\tif(",
+ protocol,
+ "_debug) fprintf(",
+ protocol,
+ "_astringfile, \"%15s <-- %15s [%15s] \\n\\t%s\\n\",\n",
+ "\t\tsstring[a->a_newstate], sstring[p->",
+ protocol,
+ "_state], estring[e->ev_number], astring[a->a_action]);\n\n",
+ (char *)0,
+ (char *)0,
+
+#define PART8 { 80, 84 }
+ "\tif(a->a_action)\n",
+ "\t\terror = _Xebec_action( a->a_action, e, p );\n",
+ "\tif(error==0)\n\tp->",
+ protocol,
+ "_state = a->a_newstate;\n\treturn error;\n}\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART9 { 90, 99 }
+ "\n_XEBEC_PG int _Xebec_action(a,e,p)\nint a;\nstruct ",
+ protocol,
+ "_event *e;\n",
+ protocol,
+ PCBNAME,
+ " *p;\n{\n",
+ "switch(a) {\n",
+ "case -1: return ",
+ protocol,
+ "_protocol_error(e,p);\n",
+ (char *)0,
+
+#define PART10 { 101, 105 }
+ "\tif(",
+ protocol,
+ "_debug) fprintf(",
+ protocol,
+ "_astringfile, \"index 0x%5x\\n\", index);\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART5 { 110, 121 }
+ "\n_XEBEC_PG int\n_Xebec_index( e,p )\n",
+ "\tstruct ",
+ protocol,
+ "_event *e;\n\t",
+ protocol,
+ PCBNAME,
+ " *p;\n{\nswitch( (e->ev_number<<",
+ Eventshiftstring,
+ ")+(p->",
+ protocol,
+ statename,
+ ") ) {\n",
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+ (char *)0,
+
+#define PART11 {130, 137 }
+ "\tIFTRACE(D_DRIVER)\n",
+ "\t",
+ protocol,
+ "trace(DRIVERTRACE,",
+ "\t\ta->a_newstate, p->",
+ protocol,
+ "_state, e->ev_number, a->a_action, 0);\n\n",
+ "\tENDTRACE\n",
+ (char *)0,
+ (char *)0,
+
+#define PART13 {140, 147 }
+ "\tif(",
+ protocol,
+ "_debug) fprintf(",
+ protocol,
+ "_astringfile, \"%15s <-- %15s [%15s] \\n\",\n",
+ "\t\tsstring[a->a_newstate], sstring[p->",
+ protocol,
+ "_state], estring[e->ev_number]);\n\n",
+ (char *)0,
+ (char *)0,
+
+#define PART14 { 150,150 }
+ "#define _XEBEC_PG static\n",
+
+#define PART15 { 151,151 }
+ "#define _XEBEC_PG \n",
+
+};
+
+static struct { int start; int finish; } parts[] = {
+ { 0,0 },
+ PART1,
+ PART2,
+ PART3,
+ PART4,
+ PART5,
+ PART6,
+ PART7,
+ PART8,
+ PART9,
+ PART10,
+ PART11,
+ PART12,
+ PART13,
+ PART14,
+ PART15,
+};
+
+putdriver(f, x)
+FILE *f;
+int x;
+{
+ register int i;
+
+ for( i = parts[x].start; i<= parts[x].finish; i++)
+ fprintf(f, "%s", strings[i]);
+ IFDEBUG(d)
+ fflush(f);
+ ENDDEBUG
+}
diff --git a/sys/netiso/xebec/sets.c b/sys/netiso/xebec/sets.c
new file mode 100644
index 00000000000..d2b3e83bf43
--- /dev/null
+++ b/sys/netiso/xebec/sets.c
@@ -0,0 +1,472 @@
+/* $NetBSD: sets.c,v 1.4 1994/06/29 06:41:16 cgd Exp $ */
+
+/*
+ * 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 "main.h"
+#include "malloc.h"
+#include "sets.h"
+#include "debug.h"
+#include <stdio.h>
+
+struct Object *CurrentEvent = (struct Object *)0;
+struct Object *Objtree;
+struct Object dummy;
+/*
+ * define a set w/ type and name
+ * return a set number
+ */
+#undef NULL
+#define NULL (struct Object *)0
+
+static FILE *Sfile, *Efile;
+extern FILE *astringfile;
+char *Noname = "Unnamed set\0";
+
+initsets(f,s)
+FILE *f, *s;
+{
+ static char errorstring[20];
+ extern struct Object *SameState;
+ Efile = f;
+ Sfile = s;
+
+ IFDEBUG(X)
+ fprintf(astringfile, "char *%s_sstring[] = {\n", protocol);
+ ENDDEBUG
+ sprintf(errorstring, "%sERROR\0", ST_PREFIX);
+ defineitem(STATESET, errorstring, (char *)0); /* state 0 */
+ SameState = (struct Object *) Malloc( sizeof (struct Object) );
+ SameState->obj_kind = OBJ_ITEM;
+ SameState->obj_type = STATESET;
+ SameState->obj_name = "SAME";
+ SameState->obj_struc = (char *)0;
+ SameState->obj_number = 0;
+ SameState->obj_members = (struct Object *)0;
+ SameState->obj_left = (struct Object *)0;
+ SameState->obj_right = (struct Object *)0;
+ SameState->obj_parent = (struct Object *)0;
+}
+
+/*
+ * get a set based on its type and name
+ * returns address of an Object, may be set or item
+ */
+
+struct Object *lookup(type, name)
+unsigned char type;
+char *name;
+{
+ register struct Object *p = Objtree;
+ int val = 1 ;
+
+ IFDEBUG(o)
+ fprintf(stdout,"lookup 0x%x,%s \n",
+ type, name);
+ ENDDEBUG
+
+ while( p && val ) {
+ IFDEBUG(o)
+ fprintf(OUT, "lookup strcmp 0x%x,%s, 0x%x,%s\n",
+ name, name, OBJ_NAME(p), OBJ_NAME(p));
+ ENDDEBUG
+ if( p->obj_name == (char *)0 ) {
+ fprintf(stderr, "Unnamed set in table!\n");
+ Exit(-1);
+ }
+ val = (int) strcmp(name, OBJ_NAME(p));
+ if(val < 0) {
+ /* left */
+ p = p->obj_left;
+ } else if (val > 0) {
+ /* right */
+ p = p->obj_right;
+ }
+ }
+ if( p && ( p->obj_type != type)) {
+ fprintf(stdout, "lookup(0x%x,%s) found wrong obj type 0x%x\n",
+ type,name, p->obj_type);
+ p = NULL;
+ }
+ IFDEBUG(o)
+ fprintf(stdout,"lookup 0x%x,%s returning 0x%x\n",type, name, p);
+ ENDDEBUG
+ return(p);
+}
+
+static int states_done = 0;
+
+end_states(f)
+FILE *f;
+{
+ register unsigned n = Nstates;
+ register int i;
+ extern char Eventshiftstring[];
+
+ states_done = 1;
+
+ for( i = 0; ;i++) {
+ if( (n >>= 1) <= 0 ) break;
+ }
+ Eventshift = i+1;
+ IFDEBUG(d)
+ fprintf(OUT, "Eventshift=%d\n", Eventshift);
+ ENDDEBUG
+ sprintf(Eventshiftstring, "%d\0",Eventshift);
+ fprintf(f, "struct %s_event {\n\tint ev_number;\n", &protocol[0]);
+ IFDEBUG(X)
+ /* finish sstring[] & start estring[] */
+ fprintf(astringfile,
+ "};\n\nchar *%s_estring[] = {\n", protocol);
+ ENDDEBUG
+}
+
+int FirstEventAttribute = 1;
+
+static
+insert(o)
+struct Object *o;
+{
+ struct Object *p = Objtree;
+ struct Object **q = &Objtree;
+ int val=1;
+
+
+ if (o->obj_name == (char *)0) {
+ fprintf(stderr, "Internal Error: inserting unnamed object\n");
+ Exit(-1);
+ }
+ if( o->obj_type == STATESET) {
+ if( states_done ) {
+ fprintf(stderr, "No states may be defined after *TRANSITIONS\n");
+ Exit(-1);
+ }
+ o->obj_number = Nstates++ ;
+ if(Nstates > MAXSTATES) {
+ fprintf(stderr, "Too many states\n");
+ Exit(-1);
+ }
+ fprintf(Sfile, "#define %s 0x%x\n", o->obj_name, o->obj_number);
+ IFDEBUG(X)
+ fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number);
+ ENDDEBUG
+ } else {
+ /* EVENTSET */
+ if( ! states_done ) {
+ fprintf(stderr, "states must precede events\n");
+ Exit(-1);
+ }
+ o->obj_number = Nevents++ ;
+ if(Nevents > MAXEVENTS) {
+ fprintf(stderr, "Too many events\n");
+ Exit(-1);
+ }
+ if(o->obj_struc) {
+ if( FirstEventAttribute ) {
+ fprintf(Efile, "\n\tunion{\n"); /*} */
+ FirstEventAttribute = 0;
+ }
+ fprintf(Efile,
+ "struct %s %s%s;\n\n", o->obj_struc, EV_PREFIX, o->obj_name);
+ }
+ fprintf(Efile, "#define %s 0x%x\n", o->obj_name, o->obj_number);
+ IFDEBUG(X)
+ fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number);
+ ENDDEBUG
+ }
+ IFDEBUG(o)
+ fprintf(OUT, "insert(%s)\n", OBJ_NAME(o) );
+ if(o->obj_right != NULL) {
+ fprintf(OUT, "insert: unclean Object right\n");
+ exit(-1);
+ }
+ if(o->obj_left != NULL) {
+ fprintf(OUT, "insert: unclean Object left\n");
+ exit(-1);
+ }
+ fflush(OUT);
+ ENDDEBUG
+
+ while( val ) {
+ if(p == NULL) {
+ *q = o;
+ o->obj_parent = (struct Object *)q;
+ break;
+ }
+ if(!(val = strcmp(o->obj_name, p->obj_name)) ) {
+ /* equal */
+ fprintf(stderr, "re-inserting %s\n",o->obj_name);
+ exit(-1);
+ }
+ if(val < 0) {
+ /* left */
+ q = &p->obj_left;
+ p = p->obj_left;
+ } else {
+ /* right */
+ q = &p->obj_right;
+ p = p->obj_right;
+ }
+ }
+ IFDEBUG(a)
+ dumptree(Objtree,0);
+ ENDDEBUG
+}
+
+delete(o)
+struct Object *o;
+{
+ register struct Object *p = o->obj_right;
+ register struct Object *q;
+ register struct Object *newparent;
+ register struct Object **np_childlink;
+
+ IFDEBUG(T)
+ fprintf(stdout, "delete(0x%x)\n", o);
+ dumptree(Objtree,0);
+ ENDDEBUG
+
+ /* q <== lowest valued node of the right subtree */
+ while( p ) {
+ q = p;
+ p = p->obj_left;
+ }
+
+ if (o->obj_parent == (struct Object *)&Objtree) {
+ newparent = (struct Object *)&Objtree;
+ np_childlink = (struct Object **)&Objtree;
+ } else if(o->obj_parent->obj_left == o) {
+ newparent = o->obj_parent;
+ np_childlink = &(o->obj_parent->obj_left);
+ } else {
+ newparent = o->obj_parent;
+ np_childlink = &(o->obj_parent->obj_right);
+ }
+ IFDEBUG(T)
+ fprintf(OUT, "newparent=0x%x\n");
+ ENDDEBUG
+
+ if (q) { /* q gets the left, parent gets the right */
+ IFDEBUG(T)
+ fprintf(OUT, "delete: q null\n");
+ ENDDEBUG
+ q->obj_left = p;
+ if(p) p->obj_parent = q;
+ p = o->obj_right;
+ } else { /* parent(instead of q) gets the left ; there is no right */
+ IFDEBUG(T)
+ fprintf(OUT, "delete: q not null\n");
+ ENDDEBUG
+ p = o->obj_left;
+ }
+ *np_childlink = p;
+ if(p)
+ p->obj_parent = newparent;
+
+ IFDEBUG(T)
+ fprintf(OUT, "After deleting 0x%x\n",o);
+ dumptree(Objtree,0);
+ ENDDEBUG
+}
+
+struct Object *
+defineset(type, adr, keep)
+unsigned char type;
+char *adr;
+int keep;
+{
+ struct Object *onew;
+ IFDEBUG(o)
+ printf("defineset(0x%x,%s, %s)\n", type , adr, keep?"KEEP":"NO_KEEP");
+ ENDDEBUG
+
+ onew = (struct Object *)Malloc(sizeof (struct Object));
+ bzero(onew, sizeof(struct Object));
+ onew->obj_name = adr;
+ onew->obj_kind = OBJ_SET;
+ onew->obj_type = type;
+ if(keep)
+ insert( onew );
+ /* address already stashed before calling defineset */
+ IFDEBUG(o)
+ printf("defineset(0x%x,%s) returning 0x%x\n", type , adr, onew);
+ dumptree(Objtree,0);
+ ENDDEBUG
+ return(onew);
+}
+
+dumpit(o, s)
+char *o;
+char *s;
+{
+ register int i;
+
+IFDEBUG(o)
+ fprintf(OUT, "object 0x%x, %s\n",o, s);
+ for(i=0; i< sizeof(struct Object); i+=4) {
+ fprintf(OUT, "0x%x: 0x%x 0x%x 0x%x 0x%x\n",
+ *((int *)o), *o, *(o+1), *(o+2), *(o+3) );
+ }
+ENDDEBUG
+}
+
+defineitem(type, adr, struc)
+unsigned char type;
+char *adr;
+char *struc;
+{
+ struct Object *onew;
+ IFDEBUG(o)
+ printf("defineitem(0x%x, %s at 0x%x, %s)\n", type, adr, adr, struc);
+ ENDDEBUG
+
+ if( onew = lookup( type, adr ) ) {
+ fprintf(stderr,
+ "Internal error at defineitem: trying to redefine obj type 0x%x, adr %s\n",
+ type, adr);
+ exit(-1);
+ } else {
+ onew = (struct Object *)Malloc(sizeof (struct Object));
+ bzero(onew, sizeof(struct Object));
+ onew->obj_name = stash(adr);
+ onew->obj_kind = OBJ_ITEM;
+ onew->obj_type = type;
+ onew->obj_struc = struc?stash(struc):struc;
+ insert( onew );
+ }
+ IFDEBUG(o)
+ fprintf(OUT, "defineitem(0x%x, %s) returning 0x%x\n", type, adr, onew);
+ ENDDEBUG
+}
+
+member(o, adr)
+struct Object *o;
+char *adr;
+{
+ struct Object *onew, *oold;
+ IFDEBUG(o)
+ printf("member(0x%x, %s)\n", o, adr);
+ ENDDEBUG
+
+ oold = lookup( o->obj_type, adr );
+
+ onew = (struct Object *)Malloc(sizeof (struct Object));
+ if( oold == NULL ) {
+ extern int lineno;
+
+ fprintf(stderr,
+ "Warning at line %d: set definition of %s causes definition of\n",
+ lineno, OBJ_NAME(o));
+ fprintf(stderr, "\t (previously undefined) member %s\n", adr);
+ bzero(onew, sizeof(struct Object));
+ onew->obj_name = stash(adr);
+ onew->obj_kind = OBJ_ITEM;
+ onew->obj_type = o->obj_type;
+ onew->obj_members = NULL;
+ insert( onew );
+ } else {
+ if(oold->obj_kind != OBJ_ITEM) {
+ fprintf(stderr, "Sets cannot be members of sets; %s\n", adr);
+ exit(-1);
+ }
+ bcopy(oold, onew, sizeof(struct Object));
+ onew->obj_members = onew->obj_left = onew->obj_right = NULL;
+ }
+ onew->obj_members = o->obj_members;
+ o->obj_members = onew;
+}
+
+struct Object *Lookup(type, name)
+unsigned char type;
+char *name;
+{
+ register struct Object *o = lookup(type,name);
+
+ if(o == NULL) {
+ fprintf(stderr, "Trying to use undefined %s: %s\n",
+ type==STATESET?"state":"event", name);
+ Exit(-1);
+ }
+ return(o);
+}
+
+AddCurrentEventName(x)
+register char **x;
+{
+ register char *n = EV_PREFIX; ;
+
+ if( CurrentEvent == (struct Object *)0 ) {
+ fprintf(stderr, "No event named! BARF!\n"); Exit(-1);
+ }
+
+ if( ! CurrentEvent->obj_struc ) {
+ fprintf(stderr, "No attributes for current event!\n"); Exit(-1);
+ }
+
+ /* add prefix first */
+ while(*n) {
+ *(*x)++ = *n++;
+ }
+
+ n = CurrentEvent->obj_name;
+
+ while(*n) {
+ *(*x)++ = *n++;
+ }
+}
+
+dumptree(o,i)
+ register struct Object *o;
+ int i;
+{
+ register int j;
+
+ if(o == NULL) {
+ for(j=0; j<i; j++)
+ fputc(' ', stdout);
+ fprintf(stdout, "%3d NULL\n", i);
+ } else {
+ dumptree(o->obj_left, i+1);
+ for(j=0; j<i; j++)
+ fputc(' ', stdout);
+ fprintf(stdout, "%3d 0x%x: %s\n", i,o, OBJ_NAME(o));
+ dumptree(o->obj_right, i+1);
+ }
+}
+
+dump(c,a)
+{
+ register int x = 8;
+ int zero = 0;
+#include <sys/signal.h>
+
+ fprintf(stderr, "dump: c 0x%x, a 0x%x\n",c,a);
+
+ x = x/zero;
+ kill(0, SIGQUIT);
+}
+
+dump_trans( pred, oldstate, newstate, action, event )
+struct Object *oldstate, *newstate, *event;
+char *pred, *action;
+{
+ extern int transno;
+ struct Object *o;
+
+ fprintf(stdout, "\n%d: ", transno);
+#define dumpit(x)\
+ if((x)->obj_kind == OBJ_SET) {\
+ o = (x)->obj_members; fprintf( stdout, "[ " );\
+ while(o) { fprintf(stdout, "%s ", o->obj_name); o = o->obj_members; }\
+ fprintf( stdout, " ] ");\
+ } else { fprintf(stdout, "%s ", (x)->obj_name); }
+
+ dumpit(newstate);
+ fprintf(stdout, " <== ");
+ dumpit(oldstate);
+ dumpit(event);
+ fprintf(stdout, "\n\t\t%s\n\t\t%s\n", pred?pred:"DEFAULT",
+ action);
+}
diff --git a/sys/netiso/xebec/sets.h b/sys/netiso/xebec/sets.h
new file mode 100644
index 00000000000..a3b6bf44fa6
--- /dev/null
+++ b/sys/netiso/xebec/sets.h
@@ -0,0 +1,35 @@
+/* $NetBSD: sets.h,v 1.4 1994/06/29 06:41:17 cgd Exp $ */
+
+#define MAXEVENTS 200
+#define MAXSTATES 200
+
+#define STATESET 10
+#define EVENTSET 5
+
+#define OBJ_ITEM 2
+#define OBJ_SET 3
+
+struct Object {
+ unsigned char obj_kind;
+ unsigned char obj_type; /* state or event */
+ char *obj_name;
+ char *obj_struc;
+ int obj_number;
+ struct Object *obj_members; /* must be null for kind==item */
+ /* for the tree */
+ struct Object *obj_left;
+ struct Object *obj_right;
+ struct Object *obj_parent;
+} ;
+
+extern char *Noname;
+
+#define OBJ_NAME(o) (((o)->obj_name)?(o)->obj_name:Noname)
+
+extern int Nevents, Nstates;
+int Eventshift;
+extern struct Object *CurrentEvent;
+
+extern struct Object *Lookup();
+extern struct Object *defineset();
+
diff --git a/sys/netiso/xebec/test.trans b/sys/netiso/xebec/test.trans
new file mode 100644
index 00000000000..bc0dcc2613a
--- /dev/null
+++ b/sys/netiso/xebec/test.trans
@@ -0,0 +1,64 @@
+/* $NetBSD: test.trans,v 1.4 1994/06/29 06:41:18 cgd Exp $ */
+
+*PROTOCOL test
+
+*INCLUDE
+
+{
+#include "test_def.h"
+}
+
+*PCB test_pcbstruct SYNONYM P
+
+*STATES
+
+STATE_A
+STATE_B
+STATE_C
+ALL_STATES = [STATE_A, STATE_B, STATE_C]
+
+*EVENTS { int ev_all; } SYNONYM E
+
+EV_1 { char *ev1_char; }
+EV_2 { int ev2_int; char ev2_char; }
+EV_3
+EV_4 { struct blah *ev4_blahptr;
+ unsigned int ev4_uint;
+ int ev4_int;
+ }
+
+*TRANSITIONS
+
+SAME <== [ STATE_A, STATE_B ] [ EV_1, EV_2, EV_3 ]
+ ( $E.ev_all > 0 )
+ {
+ if( $P.test_state == STATE_A )
+ printf("state is STATE_A\n");
+ else
+ printf("state is STATE_B\n");
+ printf("action first transition\n");
+ }
+
+;
+STATE_C <== [ STATE_A, STATE_B ] [ EV_1, EV_2, EV_3 ]
+ DEFAULT
+ {
+ printf("default - transition 2\n");
+ MACRO1( $P.test_pcbfield );
+ }
+;
+
+STATE_C <== [ STATE_A, STATE_B ] EV_4
+ ( $$.ev4_blahptr->blahfield & 0x1 )
+ NULLACTION
+;
+
+STATE_C <== ALL_STATES EV_4
+ DEFAULT
+ {
+ printf("default - transition 4\n");
+ printf("pcb is 0x%x, event is 0x%x \n", $P, $E);
+ printf("ev4 values are : blahptr 0x%x uint 0x%x int 0x%x\n",
+ $$.ev4_blahptr, $$.ev4_uint, $$.ev4_int);
+ }
+;
diff --git a/sys/netiso/xebec/test_def.h b/sys/netiso/xebec/test_def.h
new file mode 100644
index 00000000000..8bee12f8c34
--- /dev/null
+++ b/sys/netiso/xebec/test_def.h
@@ -0,0 +1,14 @@
+/* $NetBSD: test_def.h,v 1.4 1994/06/29 06:41:20 cgd Exp $ */
+
+struct blah {
+ unsigned int blahfield;
+ int dummyi;
+ char dummyc;
+};
+
+struct test_pcbstruct {
+ int test_pcbfield;
+ int test_state;
+};
+
+#define MACRO1(arg) if(arg != 0) { printf("macro1\n"); }
diff --git a/sys/netiso/xebec/xebec.bnf b/sys/netiso/xebec/xebec.bnf
new file mode 100644
index 00000000000..210802c3211
--- /dev/null
+++ b/sys/netiso/xebec/xebec.bnf
@@ -0,0 +1,316 @@
+/* $NetBSD: xebec.bnf,v 1.4 1994/06/29 06:41:22 cgd Exp $ */
+
+#include "main.h"
+#include "sets.h"
+#include <stdio.h>
+
+extern FILE *eventfile_h, *actfile;
+}
+
+*fmq
+
+ novocab
+ nobnf
+ nofirst
+ nofollow
+ noparsetable
+ noerrortables
+ nos
+ noe
+
+*terminals
+
+ID 0 0 { char *address; }
+STRUCT 0 0
+SYNONYM 0 0
+PREDICATE 0 0 { char *address; }
+ACTION 0 0 { char *address; }
+/*
+FSTRING 0 0 { char *address; }
+*/
+PROTOCOL 0 0
+LBRACK 0 0
+RBRACK 0 0
+LANGLE 0 0
+EQUAL 0 0
+COMMA 0 0
+STAR 0 0
+EVENTS 0 0
+TRANSITIONS 0 0
+INCLUDE 0 0
+STATES 0 0
+SEMI 0 0
+PCB 0 0 { char *address; }
+DEFAULT 0 0
+NULLACTION 0 0
+SAME 0 0
+
+*nonterminals
+
+pcb { char *address; int isevent; }
+syn { int type; }
+setlist { struct Object *setnum; }
+setlisttail { struct Object *setnum; }
+part { unsigned char type; }
+parttail { unsigned char type; }
+partrest { unsigned char type; char *address; }
+setstruct { struct Object *object; }
+setdef { unsigned char type,keep; char *address; struct Object *object; }
+translist
+transition
+event { struct Object *object; }
+oldstate { struct Object *object; }
+newstate { struct Object *object; }
+predicatepart { char *string; }
+actionpart { char *string; struct Object *oldstate; struct Object *newstate; }
+
+*productions
+
+program ::=
+ STAR PROTOCOL ID
+ {
+ if(strlen($ID.address) > 50 ) {
+ fprintf(stderr,
+ "Protocol name may not exceed 50 chars in length.\n");
+ Exit(-1);
+ }
+ strcpy(protocol, $ID.address);
+ openfiles(protocol);
+ }
+ STAR includelist
+ PCB
+ {
+ $$pcb.isevent = 0;
+ }
+ pcb
+ {
+ fprintf(actfile, "\ntypedef %s %s%s;\n",
+ $pcb[7].address,protocol, PCBNAME);
+ $$syn.type = PCB_SYN;
+ }
+ syn
+ STAR STATES { $$part.type = (unsigned char) STATESET; } part
+ STAR { end_states(eventfile_h); } EVENTS
+ { $$pcb.isevent = 1; }
+ pcb
+ {
+ fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
+ includecode(eventfile_h, $pcb[14].address);
+ fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
+ $$syn.type = EVENT_SYN;
+ }
+ syn
+ {
+ $$part.type = (unsigned char)EVENTSET;
+ }
+ part
+ STAR { end_events(); }
+ TRANSITIONS
+ {
+ putincludes();
+ putdriver(actfile, 9);
+ }
+ translist
+;
+pcb ::= STRUCT
+ { if($pcb.isevent) {
+ fprintf(stderr,
+ "Event is a list of objects enclosed by \"{}\"\n");
+ Exit(-1);
+ }
+ fprintf(eventfile_h, "struct ");
+ }
+ ACTION { $pcb.address = $ACTION.address; }
+ optsemi
+ ::= ACTION
+ { if( ! $pcb.isevent) {
+ fprintf(stderr,
+ "Pcb requires a type or structure definition.\"{}\"\n");
+ Exit(-1);
+ }
+ $pcb.address = $ACTION.address;
+ }
+ optsemi
+ ::= ID { $pcb.address = $ID.address; } optsemi
+;
+
+syn ::= SYNONYM ID { synonyms[$syn.type] = stash( $ID.address ); }
+ ::=
+;
+
+optsemi ::= SEMI
+ ::=
+;
+includelist ::= INCLUDE ACTION { includecode(actfile, $ACTION.address);} STAR
+ ::=
+;
+part ::= ID
+ {
+ $$partrest.address = $ID.address;
+ $$partrest.type = $part.type;
+ }
+ partrest
+ { $$parttail.type = $part.type; }
+ parttail
+;
+parttail ::= { $$part.type = $parttail.type; } part
+ ::=
+;
+partrest ::= EQUAL
+ {
+ if( lookup( $partrest.type, $partrest.address ) ) {
+ fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
+ $partrest.type, $partrest.address);
+ Exit(-1);
+ }
+ $$setdef.type = $partrest.type;
+ $$setdef.address = stash( $partrest.address );
+ $$setdef.keep = 1;
+ } setdef { $$setstruct.object = $setdef.object; } setstruct
+
+ ::= ACTION
+ {
+ defineitem($partrest.type,
+ $partrest.address, $ACTION.address);
+ }
+
+ ::= {
+ defineitem($partrest.type, $partrest.address, (char *)0);
+ }
+;
+
+setstruct ::= ACTION
+ {
+ if($setstruct.object) {
+ /* WHEN COULD THIS BE FALSE??
+ * isn't it supposed to be setstruct.object???
+ * (it used to be $ACTION.address)
+ */
+
+ $setstruct.object->obj_struc = $ACTION.address;
+ fprintf(eventfile_h,
+ "struct %s %s%s;\n\n", $ACTION.address,
+ EV_PREFIX, $setstruct.object->obj_name);
+ }
+ }
+ ::=
+;
+
+setdef ::= LBRACK
+ {
+ $$setlist.setnum =
+ defineset($setdef.type, $setdef.address, $setdef.keep);
+ } setlist RBRACK { $setdef.object = $setlist.setnum; }
+;
+
+setlist ::= ID
+ {
+ member($setlist.setnum, $ID.address);
+ $$setlisttail.setnum = $setlist.setnum;
+ } setlisttail
+;
+
+setlisttail ::= COMMA { $$setlist.setnum = $setlisttail.setnum; } setlist
+ ::=
+;
+translist ::= transition translisttail
+;
+translisttail ::= translist
+ ::=
+;
+transition ::= newstate { transno ++; } LANGLE EQUAL EQUAL oldstate
+ event
+ {
+ CurrentEvent /* GAG! */ = $event.object;
+ }
+ predicatepart
+ {
+ $$actionpart.string = $predicatepart.string;
+ $$actionpart.newstate = $newstate.object;
+ $$actionpart.oldstate = $oldstate.object;
+ }
+ actionpart
+ SEMI
+;
+
+predicatepart ::= PREDICATE
+ {
+ $predicatepart.string = stash ( $PREDICATE.address );
+ }
+ ::= DEFAULT
+ {
+ $predicatepart.string = (char *)0;
+ }
+;
+
+actionpart ::=
+ ACTION
+ {
+ statetable( $actionpart.string, $actionpart.oldstate,
+ $actionpart.newstate,
+ acttable(actfile, $ACTION.address ),
+ CurrentEvent );
+ if( print_trans ) {
+ dump_trans( $actionpart.string, $actionpart.oldstate,
+ $actionpart.newstate,
+ $ACTION.address, CurrentEvent );
+ }
+ }
+ ::= NULLACTION
+ {
+ statetable($actionpart.string, $actionpart.oldstate, $actionpart.newstate,
+ 0, CurrentEvent ); /* KLUDGE - remove this */
+ if( print_trans ) {
+ dump_trans( $actionpart.string, $actionpart.oldstate,
+ $actionpart.newstate,
+ "NULLACTION", CurrentEvent );
+ }
+ }
+;
+
+oldstate ::= ID
+ {
+ $oldstate.object = Lookup(STATESET, $ID.address);
+ }
+ ::= {
+ $$setdef.address = (char *)0;
+ $$setdef.type = (unsigned char)STATESET;
+ $$setdef.keep = 0;
+ }
+ setdef
+ {
+ $oldstate.object = $setdef.object;
+ }
+;
+
+newstate ::= ID
+ {
+ $newstate.object = Lookup(STATESET, $ID.address);
+ }
+;
+
+newstate ::= SAME
+ {
+ extern struct Object *SameState;
+
+ $newstate.object = SameState;
+ }
+;
+
+event ::= ID
+ {
+ $event.object = Lookup(EVENTSET, $ID.address);
+ }
+ ::=
+ {
+ $$setdef.address = (char *)0;
+ $$setdef.type = (unsigned char)EVENTSET;
+ $$setdef.keep = 0;
+ }
+ setdef
+ {
+ $event.object = $setdef.object;
+ }
+;
+
+*end
diff --git a/sys/netiso/xebec/xebec.c b/sys/netiso/xebec/xebec.c
new file mode 100644
index 00000000000..c92fbb467c4
--- /dev/null
+++ b/sys/netiso/xebec/xebec.c
@@ -0,0 +1,450 @@
+/* $NetBSD: xebec.c,v 1.4 1994/06/29 06:41:23 cgd Exp $ */
+
+#include "xebec.h"
+#include "llparse.h"
+#ifndef E_TABLE
+#define E_TABLE "xebec.e"
+#endif E_TABLE
+
+#include "main.h"
+#include "sets.h"
+#include <stdio.h>
+
+extern FILE *eventfile_h, *actfile;
+
+llaction(lln,token)
+LLtoken *token;
+{
+ struct llattr *llattr;
+ llattr = &llattrdesc[lldescindex-1];
+switch(lln) {
+case 1:
+ llfinprod();
+ break;
+
+case 10: {
+
+ if(strlen(llattr->llabase[3].ID.address) > 50 ) {
+ fprintf(stderr,
+ "Protocol name may not exceed 50 chars in length.\n");
+ Exit(-1);
+ }
+ strcpy(protocol, llattr->llabase[3].ID.address);
+ openfiles(protocol);
+
+} break;
+
+case 11: {
+
+ llattr->llabase[7].pcb.isevent = 0;
+
+} break;
+
+case 12: {
+
+ fprintf(actfile, "\ntypedef %s %s%s;\n",
+ llattr->llabase[7].pcb.address,protocol, PCBNAME);
+ llattr->llabase[8].syn.type = PCB_SYN;
+
+} break;
+
+case 13: {
+ llattr->llabase[11].part.type = (unsigned char) STATESET;
+} break;
+
+case 14: {
+ end_states(eventfile_h);
+} break;
+
+case 15: {
+ llattr->llabase[14].pcb.isevent = 1;
+} break;
+
+case 16: {
+
+ fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
+ includecode(eventfile_h, llattr->llabase[14].pcb.address);
+ fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
+ llattr->llabase[15].syn.type = EVENT_SYN;
+
+} break;
+
+case 17: {
+
+ llattr->llabase[16].part.type = (unsigned char)EVENTSET;
+
+} break;
+
+case 18: {
+ end_events();
+} break;
+
+case 19: {
+
+ putincludes();
+ putdriver(actfile, 9);
+
+} break;
+
+case 20: {
+ if(llattr->llabase[0].pcb.isevent) {
+ fprintf(stderr,
+ "Event is a list of objects enclosed by \"{}\"\n");
+ Exit(-1);
+ }
+ fprintf(eventfile_h, "struct ");
+
+} break;
+
+case 21: {
+ llattr->llabase[0].pcb.address = llattr->llabase[2].ACTION.address;
+} break;
+
+case 22: {
+ if( ! llattr->llabase[0].pcb.isevent) {
+ fprintf(stderr,
+ "Pcb requires a type or structure definition.\"{}\"\n");
+ Exit(-1);
+ }
+ llattr->llabase[0].pcb.address = llattr->llabase[1].ACTION.address;
+
+} break;
+
+case 23: {
+ llattr->llabase[0].pcb.address = llattr->llabase[1].ID.address;
+} break;
+
+case 24: {
+ synonyms[llattr->llabase[0].syn.type] = stash( llattr->llabase[2].ID.address );
+} break;
+
+case 25: {
+ includecode(actfile, llattr->llabase[2].ACTION.address);
+} break;
+
+case 26: {
+
+ llattr->llabase[2].partrest.address = llattr->llabase[1].ID.address;
+ llattr->llabase[2].partrest.type = llattr->llabase[0].part.type;
+
+} break;
+
+case 27: {
+ llattr->llabase[3].parttail.type = llattr->llabase[0].part.type;
+} break;
+
+case 28: {
+ llattr->llabase[1].part.type = llattr->llabase[0].parttail.type;
+} break;
+
+case 29: {
+
+ if( lookup( llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address ) ) {
+ fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
+ llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address);
+ Exit(-1);
+ }
+ llattr->llabase[2].setdef.type = llattr->llabase[0].partrest.type;
+ llattr->llabase[2].setdef.address = stash( llattr->llabase[0].partrest.address );
+ llattr->llabase[2].setdef.keep = 1;
+
+} break;
+
+case 30: {
+ llattr->llabase[3].setstruct.object = llattr->llabase[2].setdef.object;
+} break;
+
+case 31: {
+
+ defineitem(llattr->llabase[0].partrest.type,
+ llattr->llabase[0].partrest.address, llattr->llabase[1].ACTION.address);
+
+} break;
+
+case 32: {
+
+ defineitem(llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address, (char *)0);
+
+} break;
+
+case 33: {
+
+ if(llattr->llabase[0].setstruct.object) {
+ /* WHEN COULD THIS BE FALSE??
+ * isn't it supposed to be setstruct.object???
+ * (it used to be $ACTION.address)
+ */
+
+ llattr->llabase[0].setstruct.object->obj_struc = llattr->llabase[1].ACTION.address;
+ fprintf(eventfile_h,
+ "struct %s %s%s;\n\n", llattr->llabase[1].ACTION.address,
+ EV_PREFIX, llattr->llabase[0].setstruct.object->obj_name);
+ }
+
+} break;
+
+case 34: {
+
+ llattr->llabase[2].setlist.setnum =
+ defineset(llattr->llabase[0].setdef.type, llattr->llabase[0].setdef.address, llattr->llabase[0].setdef.keep);
+
+} break;
+
+case 35: {
+ llattr->llabase[0].setdef.object = llattr->llabase[2].setlist.setnum;
+} break;
+
+case 36: {
+
+ member(llattr->llabase[0].setlist.setnum, llattr->llabase[1].ID.address);
+ llattr->llabase[2].setlisttail.setnum = llattr->llabase[0].setlist.setnum;
+
+} break;
+
+case 37: {
+ llattr->llabase[2].setlist.setnum = llattr->llabase[0].setlisttail.setnum;
+} break;
+
+case 38: {
+ transno ++;
+} break;
+
+case 39: {
+
+ CurrentEvent /* GAG! */ = llattr->llabase[6].event.object;
+
+} break;
+
+case 40: {
+
+ llattr->llabase[8].actionpart.string = llattr->llabase[7].predicatepart.string;
+ llattr->llabase[8].actionpart.newstate = llattr->llabase[1].newstate.object;
+ llattr->llabase[8].actionpart.oldstate = llattr->llabase[5].oldstate.object;
+
+} break;
+
+case 41: {
+
+ llattr->llabase[0].predicatepart.string = stash ( llattr->llabase[1].PREDICATE.address );
+
+} break;
+
+case 42: {
+
+ llattr->llabase[0].predicatepart.string = (char *)0;
+
+} break;
+
+case 43: {
+
+ statetable( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
+ llattr->llabase[0].actionpart.newstate,
+ acttable(actfile, llattr->llabase[1].ACTION.address ),
+ CurrentEvent );
+ if( print_trans ) {
+ dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
+ llattr->llabase[0].actionpart.newstate,
+ llattr->llabase[1].ACTION.address, CurrentEvent );
+ }
+
+} break;
+
+case 44: {
+
+ statetable(llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate, llattr->llabase[0].actionpart.newstate,
+ 0, CurrentEvent ); /* KLUDGE - remove this */
+ if( print_trans ) {
+ dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
+ llattr->llabase[0].actionpart.newstate,
+ "NULLACTION", CurrentEvent );
+ }
+
+} break;
+
+case 45: {
+
+ llattr->llabase[0].oldstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);
+
+} break;
+
+case 46: {
+
+ llattr->llabase[1].setdef.address = (char *)0;
+ llattr->llabase[1].setdef.type = (unsigned char)STATESET;
+ llattr->llabase[1].setdef.keep = 0;
+
+} break;
+
+case 47: {
+
+ llattr->llabase[0].oldstate.object = llattr->llabase[1].setdef.object;
+
+} break;
+
+case 48: {
+
+ llattr->llabase[0].newstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);
+
+} break;
+
+case 49: {
+
+ extern struct Object *SameState;
+
+ llattr->llabase[0].newstate.object = SameState;
+
+} break;
+
+case 50: {
+
+ llattr->llabase[0].event.object = Lookup(EVENTSET, llattr->llabase[1].ID.address);
+
+} break;
+
+case 51: {
+
+ llattr->llabase[1].setdef.address = (char *)0;
+ llattr->llabase[1].setdef.type = (unsigned char)EVENTSET;
+ llattr->llabase[1].setdef.keep = 0;
+
+} break;
+
+case 52: {
+
+ llattr->llabase[0].event.object = llattr->llabase[1].setdef.object;
+
+} break;
+}
+}
+char *llstrings[] = {
+ "<null>",
+ "ID",
+ "STRUCT",
+ "SYNONYM",
+ "PREDICATE",
+ "ACTION",
+ "PROTOCOL",
+ "LBRACK",
+ "RBRACK",
+ "LANGLE",
+ "EQUAL",
+ "COMMA",
+ "STAR",
+ "EVENTS",
+ "TRANSITIONS",
+ "INCLUDE",
+ "STATES",
+ "SEMI",
+ "PCB",
+ "DEFAULT",
+ "NULLACTION",
+ "SAME",
+ "ENDMARKER",
+ "pcb",
+ "syn",
+ "setlist",
+ "setlisttail",
+ "part",
+ "parttail",
+ "partrest",
+ "setstruct",
+ "setdef",
+ "translist",
+ "transition",
+ "event",
+ "oldstate",
+ "newstate",
+ "predicatepart",
+ "actionpart",
+ "program",
+ "includelist",
+ "optsemi",
+ "translisttail",
+ "$goal$",
+ (char *) 0
+};
+short llnterms = 23;
+short llnsyms = 44;
+short llnprods = 38;
+short llinfinite = 10000;
+short llproductions[] = {
+41, -21, 5, -20, 2,
+41, -22, 5,
+41, -23, 1,
+-24, 1, 3,
+
+26, -36, 1,
+25, -37, 11,
+
+28, -27, 29, -26, 1,
+27, -28,
+
+30, -30, 31, -29, 10,
+-31, 5,
+-32,
+-33, 5,
+
+-35, 8, 25, -34, 7,
+42, 33,
+17, 38, -40, 37, -39, 34, 35, 10, 10, 9, -38, 36,
+-50, 1,
+-52, 31, -51,
+-45, 1,
+-47, 31, -46,
+-48, 1,
+-49, 21,
+-41, 4,
+-42, 19,
+-43, 5,
+-44, 20,
+32, -19, 14, -18, 12, 27, -17, 24, -16, 23, -15, 13, -14, 12, 27, -13, 16, 12, 24, -12, 23, -11, 18, 40, 12, -10, 1, 6, 12,
+12, -25, 5, 15,
+
+17,
+
+32,
+
+22, 39,
+0
+};
+struct llprodindex llprodindex[] = {
+{ 0, 0, 0 }, { 0, 5, 19 }, { 5, 3, 3 }, { 8, 3, 2 },
+{ 11, 3, 2 }, { 14, 0, 2 }, { 14, 3, 0 }, { 17, 3, 1 },
+{ 20, 0, 0 }, { 20, 5, 3 }, { 25, 2, 0 }, { 27, 0, 3 },
+{ 27, 5, 1 }, { 32, 2, 0 }, { 34, 1, 3 }, { 35, 2, 1 },
+{ 37, 0, 0 }, { 37, 5, 1 }, { 42, 2, 0 }, { 44, 12, 3 },
+{ 56, 2, 2 }, { 58, 3, 2 }, { 61, 2, 0 }, { 63, 3, 2 },
+{ 66, 2, 1 }, { 68, 2, 0 }, { 70, 2, 9 }, { 72, 2, 1 },
+{ 74, 2, 1 }, { 76, 2, 1 }, { 78, 29, 1 }, { 107, 4, 1 },
+{ 111, 0, 1 }, { 111, 1, 1 }, { 112, 0, 1 }, { 112, 1, 1 },
+{ 113, 0, 1 }, { 113, 2, 2 }, { 0, 0, 0 }
+};
+short llepsilon[] = {
+ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
+ 0, 1, 0, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0, 0
+};
+struct llparsetable llparsetable[] = {
+{ 1, 3 }, { 2, 1 }, { 5, 2 }, { 0, 23 }, { 1, 5 },
+{ 3, 4 }, { 12, 5 }, { 0, 24 }, { 1, 6 }, { 0, 25 },
+{ 8, 8 }, { 11, 7 }, { 0, 26 }, { 1, 9 }, { 0, 27 },
+{ 1, 10 }, { 12, 11 }, { 0, 28 }, { 1, 14 }, { 5, 13 },
+{ 10, 12 }, { 12, 14 }, { 0, 29 }, { 1, 16 }, { 5, 15 },
+{ 12, 16 }, { 0, 30 }, { 7, 17 }, { 0, 31 }, { 1, 18 },
+{ 21, 18 }, { 0, 32 }, { 1, 19 }, { 21, 19 }, { 0, 33 },
+{ 1, 20 }, { 7, 21 }, { 0, 34 }, { 1, 22 }, { 7, 23 },
+{ 0, 35 }, { 1, 24 }, { 21, 25 }, { 0, 36 }, { 4, 26 },
+{ 19, 27 }, { 0, 37 }, { 5, 28 }, { 20, 29 }, { 0, 38 },
+{ 12, 30 }, { 0, 39 }, { 15, 31 }, { 18, 32 }, { 0, 40 },
+{ 1, 34 }, { 3, 34 }, { 12, 34 }, { 17, 33 }, { 0, 41 },
+{ 1, 35 }, { 21, 35 }, { 22, 36 }, { 0, 42 }, { 12, 37 },
+{ 0, 43 }, { 0, 0 }
+};
+short llparseindex[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 8, 10, 13, 15, 18,
+ 23, 27, 29, 32, 35, 38, 41, 44, 47, 50,
+ 52, 55, 60, 64, 0
+};
diff --git a/sys/netiso/xebec/xebec.h b/sys/netiso/xebec/xebec.h
new file mode 100644
index 00000000000..a3c70d7191f
--- /dev/null
+++ b/sys/netiso/xebec/xebec.h
@@ -0,0 +1,87 @@
+/* $NetBSD: xebec.h,v 1.4 1994/06/29 06:41:25 cgd Exp $ */
+
+union llattrib {
+ struct {
+ char *address; } ID;
+ int STRUCT;
+ int SYNONYM;
+ struct {
+ char *address; } PREDICATE;
+ struct {
+ char *address; } ACTION;
+ int PROTOCOL;
+ int LBRACK;
+ int RBRACK;
+ int LANGLE;
+ int EQUAL;
+ int COMMA;
+ int STAR;
+ int EVENTS;
+ int TRANSITIONS;
+ int INCLUDE;
+ int STATES;
+ int SEMI;
+ struct {
+ char *address; } PCB;
+ int DEFAULT;
+ int NULLACTION;
+ int SAME;
+ struct {
+ char *address; int isevent; } pcb;
+ struct {
+ int type; } syn;
+ struct {
+ struct Object *setnum; } setlist;
+ struct {
+ struct Object *setnum; } setlisttail;
+ struct {
+ unsigned char type; } part;
+ struct {
+ unsigned char type; } parttail;
+ struct {
+ unsigned char type; char *address; } partrest;
+ struct {
+ struct Object *object; } setstruct;
+ struct {
+ unsigned char type,keep; char *address; struct Object *object; } setdef;
+ int translist;
+ int transition;
+ struct {
+ struct Object *object; } event;
+ struct {
+ struct Object *object; } oldstate;
+ struct {
+ struct Object *object; } newstate;
+ struct {
+ char *string; } predicatepart;
+ struct {
+ char *string; struct Object *oldstate; struct Object *newstate; } actionpart;
+};
+#define LLTERM 23
+#define LLSYM 44
+#define LLPROD 38
+
+#define LLINF 10000
+
+#define T_ID 1
+#define T_STRUCT 2
+#define T_SYNONYM 3
+#define T_PREDICATE 4
+#define T_ACTION 5
+#define T_PROTOCOL 6
+#define T_LBRACK 7
+#define T_RBRACK 8
+#define T_LANGLE 9
+#define T_EQUAL 10
+#define T_COMMA 11
+#define T_STAR 12
+#define T_EVENTS 13
+#define T_TRANSITIONS 14
+#define T_INCLUDE 15
+#define T_STATES 16
+#define T_SEMI 17
+#define T_PCB 18
+#define T_DEFAULT 19
+#define T_NULLACTION 20
+#define T_SAME 21
+#define T_ENDMARKER 22