Annotation of OpenXM_contrib2/asir2000/builtin/reduct.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/builtin/reduct.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4:
5: void Pred(), Predc(), Pprim();
6:
7: struct ftab reduct_tab[] = {
8: {"red",Pred,1},
9: {"redc",Predc,2},
10: {"prim",Pprim,-2},
11: {0,0,0},
12: };
13:
14: void Pred(arg,rp)
15: NODE arg;
16: Obj *rp;
17: {
18: asir_assert(ARG0(arg),O_R,"red");
19: reductr(CO,(Obj)ARG0(arg),rp);
20: }
21:
22: void Predc(arg,rp)
23: NODE arg;
24: P *rp;
25: {
26: asir_assert(ARG0(arg),O_P,"redc");
27: asir_assert(ARG1(arg),O_P,"redc");
28: remsdcp(CO,(P)ARG0(arg),(P)ARG1(arg),rp);
29: }
30:
31: void Pprim(arg,rp)
32: NODE arg;
33: P *rp;
34: {
35: P t,p,p1,r;
36: V v;
37: VL vl;
38:
39: asir_assert(ARG0(arg),O_P,"prim");
40: p = (P)ARG0(arg);
41: if ( NUM(p) )
42: *rp = (P)ONE;
43: else {
44: if ( argc(arg) == 2 ) {
45: v = VR((P)ARG1(arg));
46: change_mvar(CO,p,v,&p1);
47: if ( VR(p1) != v ) {
48: *rp = (P)ONE; return;
49: } else {
50: reordvar(CO,v,&vl); pcp(vl,p1,&r,&t);
51: restore_mvar(CO,r,v,rp);
52: }
53: } else
54: pcp(CO,p,rp,&t);
55: }
56: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>