#define protect(z) (np++->val = (z))
typedef struct argent
*ap
;
static int prunep
; lispval
adbig(),subbig(),mulbig();
register ap result
, mynp
, oldnp
, lbot
, np
;
rdrsdot
->CDR
= (lispval
) 0;
for(mynp
= lbot
; mynp
< oldnp
; mynp
++)
result
->val
->r
+= work
->i
;
dmlad(result
->val
,1,work
->i
);
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
= adbig(work
,result
->val
);
restype
= TYPE(result
->val
);
rdrsdot
->I
=result
->val
->I
;
rdrsdot
->CDR
= (lispval
) 0;
if(result
->val
->CDR
==(lispval
) 0) {
np
[-1].val
->r
= result
->val
->i
+work
->r
;
result
->val
= np
[-1].val
;
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
->r
+= work
->r
;
error("Non-number to add",FALSE
);
if(restype
==DOUB
|| prunep
==FALSE
)
else if (result
->val
->CDR
==(lispval
) 0)
return(inewint(result
->val
->I
));
dummybig
.CDR
= (lispval
) 0;
return(adbig(&dummybig
,result
->val
));
error("Internal error in (add,sub,quo,times)",FALSE
);
register ap result
, mynp
, oldnp
, lbot
, np
;
rdrsdot
->CDR
= (lispval
) 0;
result
->val
= adbig(result
->val
,work
);
if(TYPE(result
->val
)==INT
) {
rdrsdot
->I
= result
->val
->i
;
(result
->val
= newdoub())->r
= work
->r
;
for(; mynp
< oldnp
; mynp
++)
result
->val
->r
-= work
->i
;
dmlad(result
->val
,1, -work
->i
);
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
= subbig(result
->val
,work
);
restype
= TYPE(result
->val
);
rdrsdot
->I
=result
->val
->I
;
rdrsdot
->CDR
= (lispval
) 0;
if(result
->val
->CDR
==(lispval
) 0) {
np
[-1].val
->r
= result
->val
->i
-work
->r
;
result
->val
= np
[-1].val
;
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
->r
-= work
->r
;
error("Non-number to minus",FALSE
);
if(restype
==DOUB
|| prunep
==FALSE
)
else if (result
->val
->CDR
==(lispval
) 0)
return(inewint(result
->val
->I
));
dummybig
.CDR
= (lispval
) 0;
return(adbig(&dummybig
,result
->val
));
error("Internal error in (add,sub,quo,times)",FALSE
);
register ap result
, mynp
, oldnp
, lbot
, np
;
rdrsdot
->CDR
= (lispval
) 0;
for(mynp
= lbot
; mynp
< oldnp
; mynp
++)
result
->val
->r
*= work
->i
;
dmlad(result
->val
,work
->i
,0);
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
= mulbig(work
,result
->val
);
restype
= TYPE(result
->val
);
rdrsdot
->I
=result
->val
->I
;
rdrsdot
->CDR
= (lispval
) 0;
if(result
->val
->CDR
==(lispval
) 0) {
np
[-1].val
->r
= result
->val
->i
*work
->r
;
result
->val
= np
[-1].val
;
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->val
->r
*= work
->r
;
error("Non-number to times",FALSE
);
if(restype
==DOUB
|| prunep
==FALSE
)
else if (result
->val
->CDR
==(lispval
) 0)
return(inewint(result
->val
->I
));
dummybig
.CDR
= (lispval
) 0;
return(adbig(&dummybig
,result
->val
));
error("Internal error in (add,sub,quo,times)",FALSE
);
register struct argent
*mynp
;
register struct argent
*oldnp
, *lbot
, *np
;
int bigflag
= 0, realflag
= 0, itemp
;
lispval
divbig(), *resaddr
;
dummybig
.CDR
= (lispval
) 0;
if(mynp
> oldnp
) goto out
;
protect(result
= newdoub());
error("Don't know how to divide this type.",FALSE
);
for(;mynp
<= oldnp
; mynp
++) {
divbig(*resaddr
, &dummybig
, resaddr
, 0);
error("Don't know how to make bignums into reals, yet",FALSE
);
result
->r
= (double) dummybig
.I
/ work
->r
;
error("Don't know how to divide reals by bignums ",FALSE
);
divbig(*resaddr
, work
, resaddr
, 0);
np
[-1].val
->i
= dummybig
.I
;
divbig(*resaddr
, work
, resaddr
, 0);
error("Don't know how to divide this type",FALSE
);
result
= inewint( dummybig
.I
);