MiniUnix/usr/source/sno/sno3.c
#include "sno.h"
/*
* sno3
*/
bextend(str, last)
struct node *str, *last;
{
register struct node *a, *s;
register int b;
int c, d;
s = str;
if ((c = s->p1) == 0)
goto bad;
b = d = 0;
a = s->p2;
if(a == 0) {
a = c;
goto eb2;
}
eb1:
if (a == last)
goto bad;
a = a->p1;
eb2:
d++;
c = class(a->ch);
if (c == 1) { /* rp */
if (b == 0)
goto bad;
b--;
goto eb3;
}
if (c == 2) { /* lp */
b++;
goto eb1;
}
eb3:
if (b == 0) {
s->p2= a;
return(d);
}
goto eb1;
bad:
return(0);
}
ubextend(str, last)
struct node *str, *last;
{
register struct node *a, *b, *s;
s = str;
a = s->p1;
if(a == 0)
goto bad;
b = s->p2;
if(b == 0)
goto good;
if (b == last)
goto bad;
a = b->p1;
good:
s->p2 = a;
return(1);
bad:
return(0);
}
search(arg, r)
struct node *arg, *r;
{
struct node *list, *back, *str,
*etc, *next, *last, *base, *e;
register struct node *a, *b, *var;
int c, d;
a = arg->p2;
list = base = alloc();
last = next = 0;
goto badv1;
badvanc:
a = a->p1;
if (a->typ == 0) {
list->p1 = 0;
if (rfail == 1) {
a = 0;
goto fail;
}
list = base;
if (r == 0)
next = last = 0; else {
next = r->p1;
last = r->p2;
}
goto adv1;
}
b = alloc();
list->p1 = b;
list = b;
badv1:
list->p2 = back = alloc();
back->p1 = last;
b = a->p2;
c = a->typ;
list->typ = c;
if (c < 2) {
back->p2 = eval(b, 1);
goto badvanc;
}
last = list;
str = alloc();
etc = alloc();
back->p2 = var = alloc();
var->typ = b->typ;
var->p1 = str;
var->p2 = etc;
e = b->p1;
if (e == 0)
etc->p1 = 0; else
etc->p1 = eval(e, 0);
e = b->p2;
if (e == 0)
etc->p2 = 0; else {
e = eval(e, 1);
etc->p2 = strbin(e);
delete(e);
}
goto badvanc;
retard:
a = back->p1;
if (a == 0) {
rfail = 1;
goto fail;
}
list = a;
back = list->p2;
var = back->p2;
str = var->p1;
etc = var->p2;
if (etc->p2)
goto retard;
if (var->typ == 1) {
if (bextend(str, last) == 0)
goto retard;
goto adv0;
}
if (ubextend(str, last) == 0)
goto retard;
adv0:
a = str->p2;
adv01:
if (a == last)
next = 0; else
next = a->p1;
advanc:
a = list->p1;
if (a == 0) {
a = alloc();
if (r == 0) {
a->p1 = a->p2 = 0;
goto fail;
}
b = r->p1;
a->p1 = b;
if (next == 0) {
a->p2 = r->p2;
goto fail;
}
while(1) {
e = b->p1;
if (e == next) {
a->p2 = b;
goto fail;
}
b = e;
}
}
list = a;
adv1:
back = list->p2;
var = back->p2;
d = list->typ;
if(d < 2) {
if (var == 0)
goto advanc;
if (next == 0)
goto retard;
a = next;
b = var->p1;
e = var->p2;
while(1) {
if (a->ch != b->ch)
goto retard;
if (b == e)
goto adv01;
if (a == last)
goto retard;
a = a->p1;
b = b->p1;
}
}
str = var->p1;
etc = var->p2;
str->p1 = next;
str->p2 = 0;
c = etc->p2;
if (var->typ == 1) {
d = bextend(str, last);
if (d == 0)
goto retard;
if (c == 0)
goto adv0;
while(1) {
c =- d;
if (c == 0)
goto adv0;
if (c < 0)
goto retard;
d = bextend(str, last);
if (d == 0)
goto retard;
}
}
if (c == 0) {
if(d==3 & next!=0) {
str->p2 = last;
goto adv0;
}
goto advanc;
}
while(c--)
if (ubextend(str, last) == 0)
goto retard;
goto adv0;
fail:
list = base;
goto f1;
fadv:
free(back);
b = list->p1;
free(list);
if (b == 0)
return(a);
list = b;
f1:
back = list->p2;
var = back->p2;
if (list->typ < 2) {
delete(var);
goto fadv;
}
str = var->p1;
etc = var->p2;
if (a != 0 & etc->p1 != 0) {
if (str->p2 == 0) {
free(str);
str = 0;
}
assign(etc->p1, copy(str));
}
if (str)
free(str);
free(etc);
free(var);
goto fadv;
}