Add original unix v6
This commit is contained in:
@@ -0,0 +1,272 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user