| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792 |
- #include "globrig.h"
- #include "define.h"
- #include "defpage.h"
- #include "ley.h"
- #include "nef2.h"
- /***************** nef2.inc ***************/
- extern Void next PP((ptr_ *p));
- extern boolean eqatoms PP((long p1, long p2));
- extern Void first PP((long p, ptr_ *pp));
- extern Void lconc PP((long *a1, long a2));
- /* add an element*/
- extern Void crlst PP((long *l));
- /* s-adr. added element */
- /* s- adr. new fragment */
- extern Void crlistfr PP((long el, long *f));
- extern Void crtree PP((long *t));
- /* make empty tree */
- /* s-address of new tree fragment */
- extern Void crtreefr PP((long sel, long ob, long *frag));
- /* where to change */
- /* change to adr */
- extern Void changeel PP((ptr_ *pp, long adr));
- /* input - s-address */
- /* output:long integer value */
- extern boolean plnum PP((long sval, long *intval));
- /* input - any number */
- extern Void mknumb PP((long n, long *r));
- /* output - new descriptor (number) */
- /* s-address of main tree descr*/
- /* selector, a-address */
- /* object*/
- extern Void addel3 PP((long *tr_, long sel, long ob));
- /* 1-st tree */
- /* 2-nd tree */
- extern Void addtre PP((long *m, long t2));
- extern boolean compatom PP((long op, long adr1, long adr2));
- extern double take_fatom PP((long a1));
- Void next(p)
- ptr_ *p;
- {
- /* refers to list/tree element */
- /*=======================================*/
- /* moves reference to next element , */
- /* if no more elements then */
- /* p.nel = 0 */
- /*=======================================*/
- mpd x;
- a y, a1;
- if (p->nel != 0) {
- switch (p->ptrtype) {
- case ptrlist:
- a1 = p->UU.U1.curfragment;
- pointr(a1, &x.sa); /* access fragment */
- switch (x.smld->dtype) {
- case listmain:
- if (p->nel < x.smld->elnum) { /* may stay in this descriptor */
- p->nel++;
- p->cel = x.smld->elt[p->nel - 1];
- } else {
- /* to next deskriptor */
- y = x.smld->next;
- if (y == 0) { /* end of list */
- p->nel = 0;
- p->cel = 0;
- } else {
- pointr(y, &x.sa);
- p->nel = 1;
- p->cel = x.sfld->elt[0];
- p->UU.U1.curfragment = y;
- }
- }
- break;
- case listfragm:
- if (p->nel < x.sfld->elnum) { /* may stay here */
- p->nel++;
- p->cel = x.sfld->elt[p->nel - 1];
- } else {
- do {
- y = x.sfld->next;
- /* go next */
- if (y == 0) { /* end of list */
- p->nel = 0;
- p->cel = 0;
- } else {
- pointr(y, &x.sa);
- if (x.sfld->elnum > 0) {
- p->nel = 1;
- p->cel = x.sfld->elt[0];
- p->UU.U1.curfragment = y;
- goto _L99;
- }
- }
- } while (x.sfld->next != 0); /* next.deskr. */
- }
- break;
- default:
- printf(" Internal error (NEXT-1)\n");
- break;
- }/* case */
- break;
- /* ptrlist */
- case ptrtree: /*------ tree --------*/
- a1 = p->UU.U1.curfragment;
- pointr(a1, &x.sa); /* access to fragment */
- switch (x.smtd->dtype) {
- case treemain:
- if (p->nel < x.smtd->arcnum) { /* may stay here */
- p->nel++;
- p->cel = x.smtd->arc[p->nel - 1].elt;
- p->UU.U1.arc = x.smtd->arc[p->nel - 1].arcname;
- } else {
- /* go to next descriptor */
- y = x.smtd->next;
- if (y == 0) { /* end of tree */
- p->nel = 0;
- p->cel = 0;
- } else {
- pointr(y, &x.sa);
- while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
- y = x.sftd->next;
- pointr(y, &x.sa);
- }
- if (x.sftd->arcnum > 0) {
- p->nel = 1;
- p->cel = x.sftd->arc[0].elt;
- p->UU.U1.arc = x.sftd->arc[0].arcname;
- p->UU.U1.curfragment = y;
- } else {
- p->cel = 0;
- p->nel = 0;
- }
- }
- }
- break;
- case treefragm:
- if (p->nel < x.sftd->arcnum) { /* may stay here */
- p->nel++;
- p->cel = x.sftd->arc[p->nel - 1].elt;
- p->UU.U1.arc = x.sftd->arc[p->nel - 1].arcname;
- } else {
- do {
- y = x.sftd->next;
- /* go to next */
- if (y == 0) { /* end of tree */
- p->nel = 0;
- p->cel = 0;
- } else {
- pointr(y, &x.sa);
- while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
- y = x.sftd->next;
- pointr(y, &x.sa);
- }
- if (x.sftd->arcnum > 0) {
- p->nel = 1;
- p->cel = x.sftd->arc[0].elt;
- p->UU.U1.arc = x.sftd->arc[0].arcname;
- p->UU.U1.curfragment = y;
- goto _L99;
- }
- p->cel = 0;
- p->nel = 0;
- } /*else */
- } while (x.sftd->next != 0); /* else */
- }
- break;
- default:
- printf(" Internal error NEXT-2\n");
- break;
- }/* case */
- break;
- /* ptrtree */
- case packedlist:
- /* ---- list built-in in ptr ---------- */
- if (p->nel == p->plistsize) {
- p->nel = 0;
- p->cel = null_;
- } else {
- p->nel++;
- /* nel <= plistsize <= 4 */
- p->cel = p->UU.plistelt[p->nel - 2];
- }
- break;
- default:
- printf(" Internal error NEXT-3 \n");
- break;
- }/* big case */
- }
- _L99: ; /*exit*/
- } /* next */
- boolean eqatoms(p1, p2)
- long p1, p2;
- {
- /* atom address */
- /* atom address */
- /*===================================*/
- /* equivalence of two atoms */
- /*===================================*/
- mpd s1, s2;
- if (p1 == p2)
- return true;
- else if (p1 != 0) {
- pointr(p1, &s1.sa);
- if (p2 != 0) {
- pointr(p2, &s2.sa);
- return (!memcmp(s1.sc8, s2.sc8, sizeof(atomdescriptor)) ||
- (((1L << ((long)s1.sad->dtype)) &
- (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
- (1L << ((long)fatom)))) !=
- 0 &&
- ((1L << ((long)s2.sad->dtype)) &
- (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
- (1L << ((long)fatom)))) !=
- 0 &&
- s1.sad->name == s2.sad->name) ||
- (s1.sad->dtype == tatom &&
- s2.sad->dtype == tatom &&
- s1.sad->name == s2.sad->name) ||
- (s1.sad->dtype == number &&
- s2.sad->dtype == number &&
- s1.snd->val == s2.snd->val));
- /* p2c: nef2.z, line 710: Note:
- * Line breaker spent 0.9+0.49 seconds, 5000 tries on line 811 [251] */
- /* added 20-jul-1989 in pc/at */
- } else /* p2 = 0 */
- return (s1.smld->totalelnum == 0);
- } else if (p2 != 0) {
- pointr(p2, &s2.sa);
- return (s2.smld->totalelnum == 0);
- } else
- return true;
- /* p1 = 0 */
- } /* eqatoms */
- Void first(p, pp)
- long p;
- ptr_ *pp;
- {
- /* address of main descriptor of tree/list */
- /* result */
- /*=======================================*/
- /* sets first element of tree or list to pp */
- /* if p=null then pp.nel = 0 */
- /*=======================================*/
- mpd x;
- a y;
- pp->ptrtype = ptrlist;
- if (p == null_) {
- pp->nel = 0;
- pp->cel = 0;
- } else { /*1*/
- pointr(p, &x.sa);
- if (x.smld->dtype == listmain)
- pp->ptrtype = ptrlist;
- else
- pp->ptrtype = ptrtree;
- switch (pp->ptrtype) {
- case ptrlist:
- /*----------- for lists -----------------*/
- if (x.smld->totalelnum == 0) { /* empty list */
- pp->nel = 0;
- pp->cel = 0;
- } /*2*/
- else { /*2*/
- pp->nel = 1;
- pp->cel = x.smld->elt[0];
- pp->UU.U1.curfragment = p;
- } /*2*/
- /*2*/
- break;
- case ptrtree:
- /*----------- for trees -----------------*/
- if (x.smtd->totalarcnum == 0) { /* empty tree */
- pp->nel = 0;
- pp->cel = 0;
- } else { /*2*/
- if (x.smtd->arcnum != 0) {
- pp->nel = 1;
- pp->cel = x.smtd->arc[0].elt;
- pp->UU.U1.arc = x.smtd->arc[0].arcname;
- pp->UU.U1.curfragment = p;
- } else {
- while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
- y = x.sftd->next;
- pointr(y, &x.sa);
- }
- pp->nel = 1;
- pp->cel = x.sftd->arc[0].elt;
- pp->UU.U1.arc = x.sftd->arc[0].arcname;
- pp->UU.U1.curfragment = y;
- }
- } /*2*/
- break;
- default:
- printf("Internal FIRST error (not agregate)\n");
- break;
- }/* case */
- } /*1*/
- pp->UU.U1.mainadr = p;
- } /* first */
- Void crlst(l)
- long *l;
- {
- /* sozdatx pustoj spisok */
- mpd x;
- gets5(l, &x.sa);
- x.smld->dtype = listmain;
- x.smld->lastfragm = *l;
- } /* crlst */
- Void crlistfr(el, f)
- long el, *f;
- {
- /* s-adr. dob.|l-ta */
- /* s- adr.sozdannogo fragmenta */
- /*========================================*/
- /* sozdaet nowyj deskriptor fragmenta */
- /* spiska i dobawlqet tuda el */
- /*========================================*/
- mpd y;
- fragmlistdescriptor *WITH;
- gets5(f, &y.sa);
- WITH = y.sfld;
- WITH->dtype = listfragm;
- WITH->elnum = 1;
- WITH->elt[0] = el;
- } /* crlistfr */
- Void crtree(t)
- long *t;
- {
- /* make empty tree */
- mpd x;
- gets5(t, &x.sa);
- x.smtd->dtype = treemain;
- } /* creatree */
- Void crtreefr(sel, ob, frag)
- long sel, ob, *frag;
- {
- /* s-address of new tree fragment */
- /*===========================================*/
- /* makes new fragment of tree and adds */
- /* to him an element */
- /*===========================================*/
- mpd y;
- fragmtreedescriptor *WITH;
- gets5(frag, &y.sa);
- WITH = y.sftd; /* with */
- WITH->dtype = treefragm;
- WITH->arcnum = 1;
- WITH->arc[0].arcname = sel;
- WITH->arc[0].elt = ob;
- } /* crtreefr */
- Void lconc(a1, a2)
- long *a1, a2;
- {
- /*==========================*/
- /* a1 - mainlist, */
- /* a2 - l`boj obxekt */
- /* ( a1 !. a2 ) --> a1 */
- /*==========================*/
- /* wyhod */
- a l; /* s-nomer glawn.deskr.spiska */
- a m;
- mpd x, y, z;
- mainlistdescriptor *WITH;
- fragmlistdescriptor *WITH1;
- if (*a1 == null_) {
- /* creates empty list */
- gets5(&l, &x.sa);
- x.smld->dtype = listmain;
- x.smld->lastfragm = l;
- } else {
- l = *a1;
- points(l, &x.sa);
- }
- /* fi */
- WITH = x.smld;
- if (WITH->dtype != listmain) {
- l = null_;
- goto _L1;
- }
- WITH->totalelnum++;
- if (WITH->lastfragm == l) { /* ends on the same first descriptor */
- if (WITH->elnum == mainlistelnum) {
- gets5(&m, &y.sa);
- WITH1 = y.sfld;
- WITH1->dtype = listfragm;
- WITH1->elnum = 1;
- WITH1->elt[0] = a2;
- WITH->lastfragm = m;
- WITH->next = m;
- } else {
- WITH->elnum++;
- WITH->elt[WITH->elnum - 1] = a2;
- }
- } else {
- points(WITH->lastfragm, &z.sa);
- if (z.sfld->elnum == fragmlistelnum) {
- gets5(&m, &y.sa);
- WITH1 = y.sfld;
- WITH1->dtype = listfragm;
- WITH1->elnum = 1;
- WITH1->elt[0] = a2;
- z.sfld->next = m;
- points(l, &x.sa);
- WITH->lastfragm = m;
- } else {
- /* using with is danger here */
- z.sfld->elnum++;
- z.sfld->elt[z.sfld->elnum - 1] = a2;
- }
- }
- _L1:
- *a1 = l; /* nuvno, esli l sozdaw.zanowo */
- } /* lconc */
- Void changeel(pp, adr)
- ptr_ *pp;
- long adr;
- {
- /* where to change */
- /* change to adr */
- /* changes one element of list */
- mpd x;
- a a1;
- if (pp->ptrtype != ptrlist) {
- printf(" Internal error (Changeel) ");
- return;
- }
- a1 = pp->UU.U1.curfragment;
- points(a1, &x.sa);
- if (x.sfld->dtype == listfragm)
- x.sfld->elt[pp->nel - 1] = adr;
- else
- x.smld->elt[pp->nel - 1] = adr;
- pp->cel = adr;
- }
- boolean plnum(sval, intval)
- long sval, *intval;
- {
- /* input - s-address*/
- /* output:long integer value */
- /* returns integer if it is list parameter; */
- mpd x;
- if (sval == 0)
- return false;
- else {
- pointr(sval, &x.sa); /* access to atom in memory */
- if (x.snd->dtype != number)
- return false;
- else {
- *intval = x.snd->val; /* access to number */
- return true;
- }
- }
- } /*plnum*/
- Void mknumb(n, r)
- long n, *r;
- {
- mpd x;
- numberdescriptor *WITH;
- gets1(r, &x.sa);
- WITH = x.snd; /* with */
- WITH->dtype = number;
- WITH->val = n;
- } /* mknumb */
- Void addel3(tr_, sel, ob)
- long *tr_, sel, ob;
- {
- /* s-address of main tree descr*/
- /* selector, a-address */
- /* object*/
- /*===============================*/
- /* add element to tree */
- /* tr := tr ++ <. sel : ob .> */
- /*===============================*/
- /* wyhod s tr:=l */
- /* wyhod bez tr:=l */
- a l; /* s-adres glawnogo derewa */
- mpd x; /* dostup k glawnomu deskr.derewa */
- mpd y;
- a n, npred;
- long i;
- maintreedescriptor *WITH;
- long FORLIM;
- fragmtreedescriptor *WITH1;
- if (*tr_ == null_) /* sozdatx pustoe derewo */
- crtree(&l);
- else
- l = *tr_;
- pointr(l, &x.sa);
- /* dostup k glawn.fragmentu */
- if (x.smtd->dtype != treemain) { /* tr ne derewo */
- l = null_;
- goto _L1;
- }
- if (ob == null_) /* ni~ego ne menqem */
- goto _L2;
- if (x.smtd->totalarcnum == 0) {
- points(l, &x.sa);
- WITH = x.smtd; /* with */
- WITH->totalarcnum = 1;
- WITH->arcnum = 1;
- WITH->arc[0].arcname = sel;
- WITH->arc[0].elt = ob;
- goto _L1;
- }
- WITH = x.smtd; /* with */
- FORLIM = WITH->arcnum;
- /*======================*/
- /* poisk sel w l */
- /*======================*/
- for (i = 0; i < FORLIM; i++) {
- if (WITH->arc[i].arcname == sel) {
- points(l, &y.sa);
- y.smtd->arc[i].elt = ob;
- goto _L1;
- }
- }
- npred = l;
- n = WITH->next;
- /* prodolvaem poisk w fragmentah */
- while (n != null_) {
- pointr(n, &y.sa);
- WITH1 = y.sftd;
- /* with */
- FORLIM = WITH1->arcnum;
- for (i = 0; i < FORLIM; i++) {
- if (WITH1->arc[i].arcname == sel) {
- points(n, &y.sa);
- y.sftd->arc[i].elt = ob;
- goto _L1;
- }
- }
- npred = n;
- n = WITH1->next;
- } /* while */
- /*========================================*/
- /* |l-ta w tr net. */
- /* w npred s-adres poslednego fragmenta , */
- /* nuvno dobawitx |l-t w konce */
- /*========================================*/
- points(l, &x.sa);
- WITH = x.smtd; /* with */
- WITH->totalarcnum++;
- if (WITH->arcnum != maintreearcnum) {
- /* dobawim tut-ve */
- WITH->arcnum++;
- WITH->arc[WITH->arcnum - 1].arcname = sel;
- WITH->arc[WITH->arcnum - 1].elt = ob;
- goto _L1;
- }
- if (WITH->next == null_) {
- /*===========================================*/
- /* pricepim nowyj fragment k glawnomu fragm. */
- /* i pomestim tuda |l-t */
- /*===========================================*/
- crtreefr(sel, ob, &n);
- WITH->next = n;
- goto _L1;
- }
- /* dobawlqem |l-t w ne glawnom fragmente */
- points(npred, &x.sa);
- WITH1 = x.sftd; /* with */
- if (WITH1->arcnum != fragmtreearcnum) {
- /* dobawim tut-ve */
- WITH1->arcnum++;
- WITH1->arc[WITH1->arcnum - 1].arcname = sel;
- WITH1->arc[WITH1->arcnum - 1].elt = ob;
- } else { /* pricepim nowyj fragment */
- crtreefr(sel, ob, &n);
- WITH1->next = n;
- }
- _L1:
- *tr_ = l;
- _L2: ;
- } /* addel */
- Void addtre(m, t2)
- long *m, t2;
- {
- /* 1-st tree */
- /* 2-nd tree */
- /*==============*/
- /* m ++:= t2 */
- /*==============*/
- /* wyhod */
- mpd x;
- long i;
- a n;
- maintreedescriptor mx;
- fragmtreedescriptor fx;
- if (t2 == null_)
- goto _L1;
- pointr(t2, &x.sa);
- if (x.smtd->dtype != treemain) {
- *m = null_;
- goto _L1;
- }
- /* cikl po t2, prisoedinqem |l-ty po odnomu */
- mx = *x.smtd;
- for (i = 0; i < mx.arcnum; i++)
- addel3(m, mx.arc[i].arcname, mx.arc[i].elt);
- n = mx.next; /* with */
- /* prodolvaem w fragmentah */
- while (n != null_) {
- pointr(n, &x.sa);
- fx = *x.sftd;
- for (i = 0; i < fx.arcnum; i++)
- addel3(m, fx.arc[i].arcname, fx.arc[i].elt);
- n = fx.next; /* with */
- } /* while */
- _L1: ;
- } /* addtre */
- boolean compatom(op, adr1, adr2)
- long op, adr1, adr2;
- {
- /* op in 1..4 1 < 2 <= 3 > 4 >=
- compares valid a-adresses of two valid atoms of types
- atom idatom keyword tatom */
- bl80 a1, a2;
- long i, l1, l2;
- if (adr1 == adr2)
- return (op == 2 || op == 4);
- else {
- pointa(adr1, a1, &l1);
- pointa(adr2, a2, &l2);
- i = 1;
- _L1:
- if (i > l1)
- return (op <= 2);
- else if (i > l2)
- return (op >= 3);
- else if (a1[i - 1] > a2[i - 1])
- return (op >= 3);
- else if (a1[i - 1] < a2[i - 1])
- return (op <= 2);
- else {
- i++;
- goto _L1;
- }
- }
- }
- double take_fatom(a1)
- long a1;
- {
- bl80 a80_;
- long j;
- double *rre;
- pointa(a1, a80_, &j);
- rre = (double *)a80_;
- return (*rre);
- }
- /* End. */
|