Annotation of OpenXM_contrib2/asir2000/parse/eval.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/parse/eval.c,v 1.2 1999/11/18 05:42:03 noro Exp $ */
2: #include <ctype.h>
3: #include "ca.h"
4: #include "al.h"
5: #include "base.h"
6: #include "parse.h"
7: #if !defined(THINK_C)
8: #include <sys/types.h>
9: #include <sys/stat.h>
10: #endif
11: #include "genpari.h"
12:
13: extern jmp_buf timer_env;
14:
15: int f_break,f_return,f_continue;
16: int evalstatline;
17: int recv_intr;
18:
19: pointer bevalf(), evalmapf(), evall();
20: Obj getopt_from_cpvs();
21:
22: pointer eval(f)
23: FNODE f;
24: {
25: LIST t;
26: STRING str;
27: pointer val = 0;
28: pointer a,a1,a2;
29: NODE tn,ind;
30: R u;
31: DP dp;
32: int pv,c;
33: FNODE f1;
34: UP2 up2;
35: UP up;
36: GF2N gf2n;
37: GFPN gfpn;
38:
39: #if defined(VISUAL)
40: if ( recv_intr ) {
41: #include <signal.h>
42: if ( recv_intr == 1 ) {
43: recv_intr = 0;
44: int_handler(SIGINT);
45: } else {
46: recv_intr = 0;
47: ox_usr1_handler(0);
48: }
49: }
50: #endif
51: if ( !f )
52: return ( 0 );
53: switch ( f->id ) {
54: case I_BOP:
55: a1 = eval((FNODE)FA1(f)); a2 = eval((FNODE)FA2(f));
56: (*((ARF)FA0(f))->fp)(CO,a1,a2,&val);
57: break;
58: case I_COP:
59: a1 = eval((FNODE)FA1(f)); a2 = eval((FNODE)FA2(f));
60: c = arf_comp(CO,a1,a2);
61: switch ( (cid)FA0(f) ) {
62: case C_EQ:
63: c = (c == 0); break;
64: case C_NE:
65: c = (c != 0); break;
66: case C_GT:
67: c = (c > 0); break;
68: case C_LT:
69: c = (c < 0); break;
70: case C_GE:
71: c = (c >= 0); break;
72: case C_LE:
73: c = (c <= 0); break;
74: default:
75: c = 0; break;
76: }
77: if ( c )
78: val = (pointer)ONE;
79: break;
80: case I_AND:
81: if ( eval((FNODE)FA0(f)) && eval((FNODE)FA1(f)) )
82: val = (pointer)ONE;
83: break;
84: case I_OR:
85: if ( eval((FNODE)FA0(f)) || eval((FNODE)FA1(f)) )
86: val = (pointer)ONE;
87: break;
88: case I_NOT:
89: if ( eval((FNODE)FA0(f)) )
90: val = 0;
91: else
92: val = (pointer)ONE;
93: break;
94: case I_LOP:
95: a1 = eval((FNODE)FA1(f)); a2 = eval((FNODE)FA2(f));
96: val = evall((lid)FA0(f),a1,a2);
97: break;
98: case I_CE:
99: if ( eval((FNODE)FA0(f)) )
100: val = eval((FNODE)FA1(f));
101: else
102: val = eval((FNODE)FA2(f));
103: break;
104: case I_EV:
105: evalnodebody((NODE)FA0(f),&tn); nodetod(tn,&dp); val = (pointer)dp;
106: break;
107: case I_FUNC:
108: val = evalf((FUNC)FA0(f),(FNODE)FA1(f),0); break;
109: case I_FUNC_OPT:
110: val = evalf((FUNC)FA0(f),(FNODE)FA1(f),(FNODE)FA2(f)); break;
111: case I_PFDERIV:
112: error("eval : not implemented yet");
113: break;
114: case I_MAP:
115: val = evalmapf((FUNC)FA0(f),(FNODE)FA1(f)); break;
116: case I_IFUNC:
117: val = evalif((FNODE)FA0(f),(FNODE)FA1(f)); break;
118: #if !defined(VISUAL)
119: case I_TIMER:
120: {
121: int interval;
122: Obj expired;
123:
124: interval = QTOS((Q)eval((FNODE)FA0(f)));
125: expired = (Obj)eval((FNODE)FA2(f));
126: set_timer(interval);
127: savepvs();
128: if ( !setjmp(timer_env) )
129: val = eval((FNODE)FA1(f));
130: else {
131: val = (pointer)expired;
132: restorepvs();
133: }
134: reset_timer();
135: }
136: break;
137: #endif
138: #if 0
139: case I_PRESELF: case I_POSTSELF:
140: val = evalpv(f->id,FA1(f),FA0(f)); break;
141: case I_PVAR:
142: val = evalpv(f->id,FA0(f),0); break;
143: case I_ASSPVAR:
144: val = evalpv(f->id,FA0(f),FA1(f)); break;
145: #endif
146: #if 1
147: case I_PRESELF:
148: f1 = (FNODE)FA1(f);
149: if ( ID(f1) == I_PVAR ) {
150: pv = (int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,a);
151: if ( !ind ) {
152: (*((ARF)FA0(f))->fp)(CO,a,ONE,&val); ASSPV(pv,val);
153: } else if ( a ) {
154: evalnodebody(ind,&tn); getarray(a,tn,(pointer *)&u);
155: (*((ARF)FA0(f))->fp)(CO,u,ONE,&val); putarray(a,tn,val);
156: }
157: } else
158: val = evalpv(f->id,(FNODE)FA1(f),FA0(f));
159: break;
160: case I_POSTSELF:
161: f1 = (FNODE)FA1(f);
162: if ( ID(f1) == I_PVAR ) {
163: pv = (int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,val);
164: if ( !ind ) {
165: (*((ARF)FA0(f))->fp)(CO,val,ONE,&u); ASSPV(pv,u);
166: } else if ( val ) {
167: evalnodebody(ind,&tn); getarray(val,tn,&a);
168: (*((ARF)FA0(f))->fp)(CO,a,ONE,&u); putarray(val,tn,(pointer)u);
169: val = a;
170: }
171: } else
172: val = evalpv(f->id,(FNODE)FA1(f),FA0(f));
173: break;
174: case I_CAST:
175: getmember((FNODE)f,(Obj *)&val); break;
176: case I_PVAR:
177: pv = (int)FA0(f); ind = (NODE)FA1(f); GETPV(pv,a);
178: if ( !ind )
179: val = a;
180: else {
181: evalnodebody(ind,&tn); getarray(a,tn,&val);
182: }
183: break;
184: case I_ASSPVAR:
185: f1 = (FNODE)FA0(f);
186: if ( ID(f1) == I_PVAR ) {
187: pv = (int)FA0(f1); ind = (NODE)FA1(f1);
188: if ( !ind ) {
189: val = eval((FNODE)FA1(f)); ASSPV(pv,val);
190: } else {
191: GETPV(pv,a);
192: evalnodebody(ind,&tn);
193: putarray(a,tn,val = eval((FNODE)FA1(f)));
194: }
195: } else
196: val = evalpv(ID(f),(FNODE)FA0(f),FA1(f));
197: break;
198: #endif
199: case I_ANS:
200: if ( (pv =(int)FA0(f)) < (int)APVS->n )
201: val = APVS->va[pv].priv;
202: break;
203: case I_GF2NGEN:
204: NEWUP2(up2,1);
205: up2->w=1;
206: up2->b[0] = 2; /* @ */
207: MKGF2N(up2,gf2n);
208: val = (pointer)gf2n;
209: break;
210: case I_GFPNGEN:
211: up = UPALLOC(1);
212: up->d=1;
213: up->c[0] = 0;
214: up->c[1] = (Num)ONELM;
215: MKGFPN(up,gfpn);
216: val = (pointer)gfpn;
217: break;
218: case I_STR:
219: MKSTR(str,FA0(f)); val = (pointer)str; break;
220: case I_FORMULA:
221: val = FA0(f); break;
222: case I_LIST:
223: evalnodebody((NODE)FA0(f),&tn); MKLIST(t,tn); val = (pointer)t; break;
224: case I_NEWCOMP:
225: newstruct((int)FA0(f),(struct oCOMP **)&val); break;
226: case I_CAR:
227: if ( !(a = eval((FNODE)FA0(f))) || (OID(a) != O_LIST) )
228: val = 0;
229: else if ( !BDY((LIST)a) )
230: val = a;
231: else
232: val = (pointer)BDY(BDY((LIST)a));
233: break;
234: case I_CDR:
235: if ( !(a = eval((FNODE)FA0(f))) || (OID(a) != O_LIST) )
236: val = 0;
237: else if ( !BDY((LIST)a) )
238: val = a;
239: else {
240: MKLIST(t,NEXT(BDY((LIST)a))); val = (pointer)t;
241: }
242: break;
243: case I_PROC:
244: val = (pointer)FA0(f); break;
245: case I_INDEX:
246: a = eval((FNODE)FA0(f)); ind = (NODE)FA1(f);
247: evalnodebody(ind,&tn); getarray(a,tn,&val);
248: break;
249: case I_OPT:
250: MKSTR(str,(char *)FA0(f));
251: a = (pointer)eval(FA1(f));
252: tn = mknode(2,str,a);
253: MKLIST(t,tn); val = (pointer)t;
254: break;
255: case I_GETOPT:
256: val = (pointer)getopt_from_cpvs((char *)FA0(f));
257: break;
258: default:
259: error("eval : unknown id");
260: break;
261: }
262: return ( val );
263: }
264:
265: pointer evalstat(f)
266: SNODE f;
267: {
268: pointer val = 0,t,s,s1;
269: P u;
270: NODE tn;
271: int i,ac;
272: V *a;
273: char *buf;
274:
275: if ( !f )
276: return ( 0 );
277: if ( nextbp && nextbplevel <= 0 && f->id != S_CPLX ) {
278: nextbp = 0;
279: bp(f);
280: }
281: evalstatline = f->ln;
282:
283: switch ( f->id ) {
284: case S_BP:
285: if ( !nextbp && (!FA1(f) || eval((FNODE)FA1(f))) ) {
286: if ( (FNODE)FA2(f) ) {
287: #if PARI
288: pari_outfile = stderr;
289: #endif
290: asir_out = stderr;
291: printexpr(CO,eval((FNODE)FA2(f)));
292: putc('\n',asir_out); fflush(asir_out);
293: #if PARI
294: pari_outfile = stdout;
295: #endif
296: asir_out = stdout;
297: } else {
298: nextbp = 1; nextbplevel = 0;
299: }
300: }
301: val = evalstat((SNODE)FA0(f));
302: break;
303: case S_PFDEF:
304: ac = argc(FA1(f)); a = (V *)MALLOC(ac*sizeof(V));
305: s = eval((FNODE)FA2(f));
306: buf = (char *)ALLOCA(BUFSIZ);
307: for ( i = 0, tn = (NODE)FA1(f); tn; tn = NEXT(tn), i++ ) {
308: t = eval((FNODE)tn->body); sprintf(buf,"_%s",NAME(VR((P)t)));
309: makevar(buf,&u); a[i] = VR(u);
310: substr(CO,0,(Obj)s,VR((P)t),(Obj)u,(Obj *)&s1); s = s1;
311: }
312: mkpf((char *)FA0(f),(Obj)s,ac,a,0,0,0,(PF *)&val); val = 0; break;
313: case S_SINGLE:
314: val = eval((FNODE)FA0(f)); break;
315: case S_CPLX:
316: for ( tn = (NODE)FA0(f); tn; tn = NEXT(tn) ) {
317: if ( BDY(tn) )
318: val = evalstat((SNODE)BDY(tn));
319: if ( f_break || f_return || f_continue )
320: break;
321: }
322: break;
323: case S_BREAK:
324: if ( GPVS != CPVS )
325: f_break = 1;
326: break;
327: case S_CONTINUE:
328: if ( GPVS != CPVS )
329: f_continue = 1;
330: break;
331: case S_RETURN:
332: if ( GPVS != CPVS ) {
333: val = eval((FNODE)FA0(f)); f_return = 1;
334: }
335: break;
336: case S_IFELSE:
337: if ( evalnode((NODE)FA1(f)) )
338: val = evalstat((SNODE)FA2(f));
339: else if ( FA3(f) )
340: val = evalstat((SNODE)FA3(f));
341: break;
342: case S_FOR:
343: evalnode((NODE)FA1(f));
344: while ( 1 ) {
345: if ( !evalnode((NODE)FA2(f)) )
346: break;
347: val = evalstat((SNODE)FA4(f));
348: if ( f_break || f_return )
349: break;
350: f_continue = 0;
351: evalnode((NODE)FA3(f));
352: }
353: f_break = 0; break;
354: case S_DO:
355: while ( 1 ) {
356: val = evalstat((SNODE)FA1(f));
357: if ( f_break || f_return )
358: break;
359: f_continue = 0;
360: if ( !evalnode((NODE)FA2(f)) )
361: break;
362: }
363: f_break = 0; break;
364: default:
365: error("evalstat : unknown id");
366: break;
367: }
368: return ( val );
369: }
370:
371: pointer evalnode(node)
372: NODE node;
373: {
374: NODE tn;
375: pointer val;
376:
377: for ( tn = node, val = 0; tn; tn = NEXT(tn) )
378: if ( BDY(tn) )
379: val = eval((FNODE)BDY(tn));
380: return ( val );
381: }
382:
383: extern FUNC cur_binf;
384: extern NODE PVSS;
385:
386: pointer evalf(f,a,opt)
387: FUNC f;
388: FNODE a;
389: FNODE opt;
390: {
391: LIST args;
392: pointer val;
393: int i,n,level;
394: NODE tn,sn,opts;
395: VS pvs;
396: char errbuf[BUFSIZ];
397:
398: if ( f->id == A_UNDEF ) {
399: sprintf(errbuf,"evalf : %s undefined",NAME(f));
400: error(errbuf);
401: }
402: if ( f->id != A_PARI ) {
403: for ( i = 0, tn = a?(NODE)FA0(a):0; tn; i++, tn = NEXT(tn) );
404: if ( ((n = f->argc)>= 0 && i != n) || (n < 0 && i > -n) ) {
405: sprintf(errbuf,"evalf : argument mismatch in %s()",NAME(f));
406: error(errbuf);
407: }
408: }
409: switch ( f->id ) {
410: case A_BIN:
411: if ( !n ) {
412: cur_binf = f;
413: (*f->f.binf)(&val);
414: } else {
415: args = (LIST)eval(a);
416: cur_binf = f;
417: (*f->f.binf)(args?BDY(args):0,&val);
418: }
419: cur_binf = 0;
420: break;
421: case A_PARI:
422: args = (LIST)eval(a);
423: cur_binf = f;
424: val = evalparif(f,args?BDY(args):0);
425: cur_binf = 0;
426: break;
427: case A_USR:
428: args = (LIST)eval(a);
429: if ( opt )
430: opts = BDY((LIST)eval(opt));
431: else
432: opts = 0;
433: pvs = f->f.usrf->pvs;
434: if ( PVSS ) {
435: ((VS)BDY(PVSS))->at = evalstatline;
436: level = ((VS)BDY(PVSS))->level+1;
437: } else
438: level = 1;
439: MKNODE(tn,pvs,PVSS); PVSS = tn;
440: CPVS = (VS)ALLOCA(sizeof(struct oVS)); BDY(PVSS) = (pointer)CPVS;
441: CPVS->usrf = f; CPVS->n = CPVS->asize = pvs->n;
442: CPVS->level = level;
443: CPVS->opt = opts;
444: if ( CPVS->n ) {
445: CPVS->va = (struct oPV *)ALLOCA(CPVS->n*sizeof(struct oPV));
446: bcopy((char *)pvs->va,(char *)CPVS->va,
447: (int)(pvs->n*sizeof(struct oPV)));
448: }
449: if ( nextbp )
450: nextbplevel++;
451: for ( tn = f->f.usrf->args, sn = BDY(args);
452: sn; tn = NEXT(tn), sn = NEXT(sn) )
453: ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn));
454: val = evalstat((SNODE)BDY(f->f.usrf));
455: f_return = f_break = f_continue = 0; poppvs();
456: break;
457: case A_PURE:
458: args = (LIST)eval(a);
459: val = evalpf(f->f.puref,args?BDY(args):0);
460: break;
461: default:
462: sprintf(errbuf,"evalf : %s undefined",NAME(f));
463: error(errbuf);
464: break;
465: }
466: return val;
467: }
468:
469: pointer evalmapf(f,a)
470: FUNC f;
471: FNODE a;
472: {
473: LIST args;
474: NODE node,rest,t,n,r,r0;
475: Obj head;
476: VECT v,rv;
477: MAT m,rm;
478: LIST rl;
479: int len,row,col,i,j;
480: pointer val;
481:
482: args = (LIST)eval(a);
483: node = BDY(args); head = (Obj)BDY(node); rest = NEXT(node);
484: switch ( OID(head) ) {
485: case O_VECT:
486: v = (VECT)head; len = v->len; MKVECT(rv,len);
487: for ( i = 0; i < len; i++ ) {
488: MKNODE(t,BDY(v)[i],rest); BDY(rv)[i] = bevalf(f,t);
489: }
490: val = (pointer)rv;
491: break;
492: case O_MAT:
493: m = (MAT)head; row = m->row; col = m->col; MKMAT(rm,row,col);
494: for ( i = 0; i < row; i++ )
495: for ( j = 0; j < col; j++ ) {
496: MKNODE(t,BDY(m)[i][j],rest); BDY(rm)[i][j] = bevalf(f,t);
497: }
498: val = (pointer)rm;
499: break;
500: case O_LIST:
501: n = BDY((LIST)head);
502: for ( r0 = r = 0; n; n = NEXT(n) ) {
503: NEXTNODE(r0,r); MKNODE(t,BDY(n),rest); BDY(r) = bevalf(f,t);
504: }
505: if ( r0 )
506: NEXT(r) = 0;
507: MKLIST(rl,r0);
508: val = (pointer)rl;
509: break;
510: default:
511: val = bevalf(f,node);
512: break;
513: }
514: return val;
515: }
516:
517: pointer bevalf(f,a)
518: FUNC f;
519: NODE a;
520: {
521: pointer val;
522: int i,n;
523: NODE tn,sn;
524: VS pvs;
525: struct oLIST list;
526: struct oFNODE fnode;
527: char errbuf[BUFSIZ];
528:
529: if ( f->id == A_UNDEF ) {
530: sprintf(errbuf,"bevalf : %s undefined",NAME(f));
531: error(errbuf);
532: }
533: if ( f->id != A_PARI ) {
534: for ( i = 0, tn = a; tn; i++, tn = NEXT(tn) );
535: if ( ((n = f->argc)>= 0 && i != n) || (n < 0 && i > -n) ) {
536: sprintf(errbuf,"bevalf : argument mismatch in %s()",NAME(f));
537: error(errbuf);
538: }
539: }
540: switch ( f->id ) {
541: case A_BIN:
542: if ( !n ) {
543: cur_binf = f;
544: (*f->f.binf)(&val);
545: } else {
546: cur_binf = f;
547: (*f->f.binf)(a,&val);
548: }
549: cur_binf = 0;
550: break;
551: case A_PARI:
552: cur_binf = f;
553: val = evalparif(f,a);
554: cur_binf = 0;
555: break;
556: case A_USR:
557: pvs = f->f.usrf->pvs;
558: if ( PVSS )
559: ((VS)BDY(PVSS))->at = evalstatline;
560: MKNODE(tn,pvs,PVSS); PVSS = tn;
561: CPVS = (VS)ALLOCA(sizeof(struct oVS)); BDY(PVSS) = (pointer)CPVS;
562: CPVS->usrf = f; CPVS->n = CPVS->asize = pvs->n;
563: CPVS->opt = 0;
564: if ( CPVS->n ) {
565: CPVS->va = (struct oPV *)ALLOCA(CPVS->n*sizeof(struct oPV));
566: bcopy((char *)pvs->va,(char *)CPVS->va,
567: (int)(pvs->n*sizeof(struct oPV)));
568: }
569: if ( nextbp )
570: nextbplevel++;
571: for ( tn = f->f.usrf->args, sn = a;
572: sn; tn = NEXT(tn), sn = NEXT(sn) )
573: ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn));
574: val = evalstat((SNODE)BDY(f->f.usrf));
575: f_return = f_break = f_continue = 0; poppvs();
576: break;
577: case A_PURE:
578: val = evalpf(f->f.puref,a);
579: break;
580: default:
581: sprintf(errbuf,"bevalf : %s undefined",NAME(f));
582: error(errbuf);
583: break;
584: }
585: return val;
586: }
587:
588: pointer evalif(f,a)
589: FNODE f,a;
590: {
591: Obj g;
592:
593: g = (Obj)eval(f);
594: if ( g && (OID(g) == O_P) && (VR((P)g)->attr == (pointer)V_SR) )
595: return evalf((FUNC)VR((P)g)->priv,a,0);
596: else {
597: error("invalid function pointer");
598: }
599: }
600:
601: pointer evalpf(pf,args)
602: PF pf;
603: NODE args;
604: {
605: Obj s,s1;
606: int i;
607: NODE node;
608: PFINS ins;
609: PFAD ad;
610: char errbuf[BUFSIZ];
611:
612: if ( !pf->body ) {
613: ins = (PFINS)CALLOC(1,sizeof(PF)+pf->argc*sizeof(struct oPFAD));
614: ins->pf = pf;
615: for ( i = 0, node = args, ad = ins->ad;
616: node; node = NEXT(node), i++ ) {
617: ad[i].d = 0; ad[i].arg = (Obj)node->body;
618: }
619: simplify_ins(ins,&s);
620: } else {
621: for ( i = 0, s = pf->body, node = args;
622: node; node = NEXT(node), i++ ) {
623: substr(CO,0,s,pf->args[i],(Obj)node->body,&s1); s = s1;
624: }
625: }
626: return (pointer)s;
627: }
628:
629: void evalnodebody(sn,dnp)
630: NODE sn;
631: NODE *dnp;
632: {
633: NODE n,n0,tn;
634: int line;
635:
636: if ( !sn ) {
637: *dnp = 0;
638: return;
639: }
640: line = evalstatline;
641: for ( tn = sn, n0 = 0; tn; tn = NEXT(tn) ) {
642: NEXTNODE(n0,n);
643: BDY(n) = eval((FNODE)BDY(tn));
644: evalstatline = line;
645: }
646: NEXT(n) = 0; *dnp = n0;
647: }
648:
649: void searchf(fn,name,r)
650: NODE fn;
651: char *name;
652: FUNC *r;
653: {
654: NODE tn;
655:
656: for ( tn = fn;
657: tn && strcmp(NAME((FUNC)BDY(tn)),name); tn = NEXT(tn) );
658: if ( tn ) {
659: *r = (FUNC)BDY(tn);
660: return;
661: }
662: *r = 0;
663: }
664:
665: void appenduf(name,r)
666: char *name;
667: FUNC *r;
668: {
669: NODE tn;
670: FUNC f;
671:
672: f=(FUNC)MALLOC(sizeof(struct oFUNC));
673: f->name = name; f->id = A_UNDEF; f->argc = 0; f->f.binf = 0;
674: MKNODE(tn,f,usrf); usrf = tn;
675: *r = f;
676: }
677:
678: void mkparif(name,r)
679: char *name;
680: FUNC *r;
681: {
682: FUNC f;
683:
684: *r = f =(FUNC)MALLOC(sizeof(struct oFUNC));
685: f->name = name; f->id = A_PARI; f->argc = 0; f->f.binf = 0;
686: }
687:
688: void mkuf(name,fname,args,body,startl,endl,desc)
689: char *name,*fname;
690: NODE args;
691: SNODE body;
692: int startl,endl;
693: char *desc;
694: {
695: FUNC f;
696: USRF t;
697: NODE sn,tn;
698: FNODE fn;
699: int argc;
700:
701: searchf(sysf,name,&f);
702: if ( f ) {
703: fprintf(stderr,"def : builtin function %s() cannot be redefined.\n",name);
704: CPVS = GPVS; return;
705: }
706: for ( argc = 0, sn = args; sn; argc++, sn = NEXT(sn) ) {
707: fn = (FNODE)BDY(sn);
708: if ( !fn || ID(fn) != I_PVAR ) {
709: fprintf(stderr,"illegal argument in %s()\n",name);
710: CPVS = GPVS; return;
711: }
712: }
713: for ( sn = usrf; sn && strcmp(NAME((FUNC)BDY(sn)),name); sn = NEXT(sn) );
714: if ( sn )
715: f = (FUNC)BDY(sn);
716: else {
717: f=(FUNC)MALLOC(sizeof(struct oFUNC));
718: f->name = name;
719: MKNODE(tn,f,usrf); usrf = tn;
720: }
721: if ( Verbose && f->id != A_UNDEF )
722: fprintf(stderr,"Warning : %s() redefined.\n",name);
723: /* else
724: fprintf(stderr,"%s() defined.\n",name); */
725: t=(USRF)MALLOC(sizeof(struct oUSRF));
726: t->args=args; BDY(t)=body; t->pvs = CPVS; t->fname = fname;
727: t->startl = startl; t->endl = endl; t->vol = asir_infile->vol;
728: t->desc = desc;
729: f->id = A_USR; f->argc = argc; f->f.usrf = t;
730: CPVS = GPVS;
731: clearbp(f);
732: }
733:
734: /*
735: retrieve value of an option whose key matches 'key'
736: CVS->opt is a list(node) of key-value pair (list)
737: CVS->opt = BDY([[key,value],[key,value],...])
738: */
739:
740: Obj getopt_from_cpvs(key)
741: char *key;
742: {
743: NODE opts,opt;
744: Obj value;
745: extern Obj VOIDobj;
746:
747: opts = CPVS->opt;
748: for ( ; opts; opts = NEXT(opts) ) {
749: opt = BDY((LIST)BDY(opts));
750: if ( !strcmp(key,BDY((STRING)BDY(opt))) )
751: return (Obj)BDY(NEXT(opt));
752: }
753: return VOIDobj;
754:
755: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>