static char *sccsid
= "@(#)lamr.c 34.3 10/31/80";
/************************************************************************/
/* This lambda allows allocation of pages from lisp. The first */
/* argument is the name of a space, n pages of which are allocated, */
/* if possible. Returns the number of pages allocated. */
register struct argent
*mylbot
= lbot
;
if(TYPE((mylbot
+1)->val
) != INT
&& (mylbot
+1)->val
!= nil
)
error("2nd ARGUMENT TO ALLOCATE MUST BE AN INTEGER",FALSE
);
if((mylbot
+1)->val
!= nil
) n
= (mylbot
+1)->val
->i
;
return(alloc((mylbot
)->val
,n
)); /* call alloc to do the work */
return(inewint(csizeof(lbot
->val
)));
chek
: while(TYPE(np
[-1].val
) != INT
)
np
[-1].val
=error("LENGTH ARG TO SEGMENT MUST BE INTEGER",TRUE
);
np
[-1].val
= error("LENGTH ARG TO SEGMENT MUST BE POSITIVE",TRUE
);
return(csegment((lbot
)->val
,np
[-1].val
->i
,FALSE
));
/* Lforget *************************************************************/
/* This function removes an atom from the hash table. */
if(TYPE(lbot
->val
) != ATOM
)
error("remob: non-atom argument",FALSE
);
name
= lbot
->val
->a
.pname
;
/* We have found the hash bucket for the atom, now we remove it */
if( hasht
[hash
] == (struct atom
*)lbot
->val
)
hasht
[hash
] = lbot
->val
->a
.hshlnk
;
lbot
->val
->a
.hshlnk
= (struct atom
*)CNIL
;
while(buckpt
!= (struct atom
*)CNIL
)
if(buckpt
->hshlnk
== (struct atom
*)lbot
->val
)
buckpt
->hshlnk
= lbot
->val
->a
.hshlnk
;
lbot
->val
->a
.hshlnk
= (struct atom
*)CNIL
;
/* Whoops! Guess it wasn't in the hash table after all. */
if(TYPE(lbot
->val
) != ARRAY
)
error("ARG TO GETLENGTH MUST BE AN ARRAY",TRUE
);
return(lbot
->val
->ar
.length
);
if(TYPE((lbot
)->val
) != ARRAY
)
error("ARG TO PUTLENGTH MUST BE AN ARRAY",FALSE
);
chek
: while(TYPE(np
[-1].val
) != INT
)
np
[-1].val
= error("ARRAY LENGTH MUST BE AN INTEGER",FALSE
);
np
[-1].val
= error("ARRAY LENGTH MUST BE POSITIVE",TRUE
);
return((lbot
)->val
->ar
.length
= np
[-1].val
);
if(TYPE(lbot
->val
) != ARRAY
)
error("ARG TO GETDELTA MUST BE AN ARRAY",FALSE
);
return(lbot
->val
->ar
.delta
);
if(TYPE((np
-2)->val
) != ARRAY
)
error("ARG TO PUTDELTA MUST BE AN ARRAY",FALSE
);
chek
: while(TYPE(np
[-1].val
) != INT
)
np
[-1].val
= error("ARRAY LENGTH MUST BE AN INTEGER",TRUE
);
np
[-1].val
= error("Array delta must be positive",TRUE
);
return((lbot
)->val
->ar
.delta
= np
[-1].val
);
if(TYPE(lbot
->val
)!=ARRAY
)
error("Arg to getaux must be an array", FALSE
);
return(lbot
->val
->ar
.aux
);
if(TYPE((lbot
)->val
)!=ARRAY
)
error("1st Arg to putaux must be array", FALSE
);
return((lbot
)->val
->ar
.aux
= np
[-1].val
);
if(TYPE(lbot
->val
)!=ARRAY
)
error("Arg to getdata must be an array", FALSE
);
return((lispval
)lbot
->val
->ar
.data
);
if(TYPE((lbot
)->val
)!=ARRAY
)
error("1st Arg to putaux must be array", FALSE
);
return((lbot
)->val
->ar
.data
= (char *)np
[-1].val
);
if(TYPE(lbot
->val
) != ARRAY
)
error("ARG TO GETACCESS MUST BE AN ARRAY",FALSE
);
return(lbot
->val
->ar
.accfun
);
if(TYPE((lbot
)->val
) != ARRAY
)
error("ARG TO PUTACCESS MUST BE ARRAY",FALSE
);
return((lbot
)->val
->ar
.accfun
= np
[-1].val
);
register struct argent
*mylbot
= lbot
;
(handy
= newarray()); /* get a new array cell */
handy
->ar
.data
=(char *)mylbot
->val
;/* insert data address */
handy
->ar
.accfun
= mylbot
[1].val
; /* insert access function */
handy
->ar
.aux
= mylbot
[2].val
; /* insert aux data */
handy
->ar
.length
= mylbot
[3].val
; /* insert length */
handy
->ar
.delta
= mylbot
[4].val
; /* push delta arg */
if( TYPE(lbot
->val
) != BCD
)
error("ARG TO GETENTRY MUST BE FUNCTION",FALSE
);
return((lispval
)(lbot
->val
->bcd
.entry
));
while(TYPE(lbot
->val
)!=BCD
)
lbot
->val
= error("ARG TO GETLANG MUST BE FUNCTION DESCRIPTOR",TRUE
);
return(lbot
->val
->bcd
.language
);
while(TYPE((lbot
)->val
)!=BCD
)
lbot
->val
= error("FIRST ARG TO PUTLANG MUST BE FUNCTION DESCRIPTOR",TRUE
);
(lbot
)->val
->bcd
.language
= np
[-1].val
;
if(TYPE(np
[-1].val
)!=BCD
)
error("ARG TO GETPARAMS MUST BE A FUNCTION DESCRIPTOR",FALSE
);
return(np
[-1].val
->bcd
.params
);
if(TYPE((lbot
)->val
)!=BCD
)
error("1st ARG TO PUTPARAMS MUST BE FUNCTION DESCRIPTOR",FALSE
);
return((lbot
)->val
->bcd
.params
= np
[-1].val
);
if(TYPE(np
[-1].val
) != BCD
)
error("ARGUMENT OF GETDISC MUST BE FUNCTION",FALSE
);
return(np
[-1].val
->bcd
.discipline
);
if(TYPE(np
[-2].val
) != BCD
)
error("ARGUMENT OF PUTDISC MUST BE FUNCTION",FALSE
);
return((np
-2)->val
->bcd
.discipline
= np
[-1].val
);
error("ARGUMENT TO GETLOC MUST BE FUNCTION",FALSE
);
return(lbot
->val
->bcd
.loctab
);
if(TYPE((lbot
+1)->val
)!=BCD
);
error("FIRST ARGUMENT TO PUTLOC MUST BE FUNCTION",FALSE
);
(lbot
)->val
->bcd
.loctab
= (lbot
+1)->val
;
handy
= (newfunct()); /* get a new function cell */
handy
->bcd
.entry
= (lispval (*)())((np
-5)->val
); /* insert entry point */
handy
->bcd
.discipline
= ((np
-4)->val
); /* insert discipline */
handy
->language
= (np
-3)->val
; /* insert language */
handy
->params
= ((np
-2)->val
); /* insert parameters */
handy
->loctab
= ((np
-1)->val
); /* insert local table */
/** Lreplace ************************************************************/
/* Destructively modifies almost any kind of data. */
if((t
= TYPE(a1
= (lbot
)->val
)) != TYPE(a2
= np
[-1].val
))
error("REPLACE ARGS MUST BE SAME TYPE",FALSE
);
case VALUE
: a1
->l
= a2
->l
;
case ARRAY
: a1
->ar
.data
= a2
->ar
.data
;
a1
->ar
.accfun
= a2
->ar
.accfun
;
a1
->ar
.length
= a2
->ar
.length
;
a1
->ar
.delta
= a2
->ar
.delta
;
case DOUB
: a1
->r
= a2
->r
;
case DTPR
: a1
->d
.car
= a2
->d
.car
;
case BCD
: a1
->bcd
.entry
= a2
->bcd
.entry
;
a1
->bcd
.discipline
= a2
->bcd
.discipline
;
errorh(Vermisc
,"Replace: cannot handle the type of this arg",
if( TYPE(lbot
->val
) == VALUE
) return(tatom
); else return(nil
);
CNTTYP() { return; /* HI! COUNT ONE TYPE CALL! */ }
while( TYPE(np
[-1].val
) != INT
)
np
[-1].val
= error("2nd ARG TO OD MUST BE INTEGER",TRUE
);
for( i
= 0; i
< np
->val
->i
; ++i
)
printf(copval(odform
,CNIL
)->a
.pname
,((int *)(np
[-2].val
))[i
]);
if( TYPE(lbot
->val
) != INT
)
error("ARG TO FAKE MUST BE INTEGER",TRUE
);
return((lispval
)(lbot
->val
->i
));
/* this used to be Lwhat, but was changed to Lmaknum for maclisp
return(inewint((int)(lbot
->val
)));
if(TYPE(lbot
->val
) != ATOM
)
error("ARG TO PNAME MUST BE AN ATOM",FALSE
);
return((lispval
)(lbot
->val
->a
.pname
));
if(TYPE((lbot
)->val
) != ARRAY
)
error("FIRST ARG TO ARRAYREF MUST BE ARRAY",FALSE
);
chek
: while(TYPE(vtemp
) != INT
)
vtemp
= error("SECOND ARG TO ARRAYREF MUST BE INTEGER",TRUE
);
vtemp
= error("NEGATIVE ARRAY OFFSET",TRUE
);
if( vtemp
->i
>= (np
-2)->val
->ar
.length
->i
)
vtemp
= error("ARRAY OFFSET TOO LARGE",TRUE
);
vtemp
= (lispval
)((np
-2)->val
->ar
.data
+ ((np
-2)->val
->ar
.delta
->i
)*(vtemp
->i
));
/* compute address of desired item */
return(inewval(lbot
->val
));
lctrace
= (int)(lbot
->val
->a
.clb
);
return((lispval
)lctrace
);
return(inewint(np
-orgnp
-2));
register char *cpt
= strbuf
;
for(atmlen
=1, pt
=np
->val
; NOTNIL(pt
); ++atmlen
, pt
= pt
->d
.cdr
);
error("LCODE WAS TOO LONG",TRUE
);
return((lispval
)inewstr(""));
for(pt
=np
->val
; NOTNIL(pt
); pt
= pt
->d
.cdr
) *(cpt
++) = pt
->d
.car
->i
;
return((lispval
)newstr());
/* Lopval *************************************************************/
/* Routine which allows system registers and options to be examined */
/* and modified. Calls copval, the routine which is called by c code */
/* to do the same thing from inside the system. */
return(error("BAD CALL TO OPVAL",TRUE
));
quant
= lbot
->val
; /* get name of sys variable */
while( TYPE(quant
) != ATOM
)
quant
= error("FIRST ARG TO OPVAL MUST BE AN ATOM",TRUE
);
if(np
> lbot
+1) vtemp
= (lbot
+1)->val
;
return(copval(quant
,vtemp
));