BSD 4 release
[unix-history] / usr / src / cmd / lisp / pbignum.c
static char *sccsid = "@(#)pbignum.c 34.1 10/3/80";
#include "global.h"
pbignum(current, useport)
register lispval current;
register FILE *useport;
{
int *top, *bot, *work, negflag = 0, *sp(), *alloca();
register int *digitp, *binp;
register lispval last;
/* copy bignum onto stack */
top = sp() - 1;
do {
stack(current->s.I);
} while(current = current->s.CDR);
bot = sp();
if (top==bot) {
fprintf(useport,"%d",*bot);
return;
}
/* save space for printed digits*/
work = alloca((top-bot)*2*sizeof(int));
if( *bot < 0) {
negflag = 1;
dsneg(top,bot);
}
/* figure out nine digits at a time by destructive division*/
for(digitp = work; bot <= top; digitp++) {
*digitp = dodiv(top,bot);
if(*bot==0) bot += 1;
}
/* print them out */
if(negflag) putc('-',useport);
fprintf(useport,"%d",*--digitp);
while ( digitp > work) fprintf(useport,"%09d",*--digitp);
}