Commit | Line | Data |
---|---|---|
8cd657f4 JF |
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 | } |