|
|
1.1 root 1: #include "global.h"
2:
3: /* Ngcafter *************************************************************/
4: /* */
5: /* Default garbage collector routine which does nothing. */
6:
7: lispval
8: Ngcafter()
9: {
10: return(nil);
11: }
12:
13: /* Nopval *************************************************************/
14: /* */
15: /* Routine which allows system registers and options to be examined */
16: /* and modified. Calls copval, the routine which is called by c code */
17: /* to do the same thing from inside the system. */
18:
19: lispval
20: Nopval()
21: {
22: lispval quant;
23: snpand(0);
24:
25: if( TYPE(lbot->val) != DTPR )
26: return(error("BAD CALL TO OPVAL",TRUE));
27: quant = eval(lbot->val->car); /* evaluate name of sys variable */
28: while( TYPE(quant) != ATOM )
29: quant = error("FIRST ARG TO OPVAL MUST BE AN ATOM",TRUE);
30:
31: if( (vtemp=lbot->val->cdr) != nil && TYPE(lbot->val->cdr) != DTPR )
32: return(error("BAD ARG LIST FOR OPVAL",TRUE));
33: return(copval(
34: quant,
35: vtemp==nil ? (lispval)CNIL : eval(vtemp->car)
36: ));
37: }
38: /* copval *************************************************************/
39: /* This routine keeps track of system quantities, and is called from */
40: /* C code. If the second argument is CNIL, no change is made in the */
41: /* quantity. */
42: /* Since this routine may call newdot() if the second argument is not */
43: /* CNIL, the arguments should be protected somehow in that case. */
44:
45: lispval
46: copval(option,value)
47: lispval option, value;
48: {
49: struct dtpr fake;
50: lispval rval;
51: snpand(0);
52:
53:
54: if( option->plist == nil && value != (lispval) CNIL)
55: {
56: protect(option); protect(value);
57: option->plist = newdot();
58: option->plist->car = sysa;
59: option->plist->cdr = newdot();
60: option->plist->cdr->car = value;
61: unprot(); unprot();
62: return(nil);
63: }
64:
65:
66: if( option->plist == nil ) return(nil);
67:
68: fake.cdr = option->plist;
69: option = (lispval) (&fake);
70:
71: while( option->cdr != nil ) /* can't be nil first time through */
72: {
73: option = option->cdr;
74: if( option->car == sysa )
75: {
76: rval = option->cdr->car;
77: if( value != (lispval)CNIL )
78: option->cdr->car = value;
79: return(rval);
80: }
81: option = option->cdr;
82: }
83:
84: if( value != (lispval)CNIL )
85: {
86: protect(option); protect(value);
87: option->cdr = newdot();
88: option->cdr->car = sysa;
89: option->cdr->cdr = newdot();
90: option->cdr->cdr->car = value;
91: unprot(); unprot();
92: }
93:
94:
95: return(nil);
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.