4.4BSD/usr/src/old/lisp/franz/pbignum.c

Compare this file to the similar file:
Show the results in this format:

#ifndef lint
static char *rcsid =
   "$Header: pbignum.c,v 1.3 83/09/12 14:17:59 sklower Exp $";
#endif

/*					-[Sat Jan 29 13:30:47 1983 by jkf]-
 * 	pbignum.c			$Locker:  $
 * print a bignum
 *
 * (c) copyright 1982, Regents of the University of California
 */

#include "global.h"

pbignum(current, useport)
register lispval current;
register FILE *useport;
{
	long  *top, *bot, *work, negflag = 0;
	char *alloca();
	register int *digitp;
	Keepxs();

	/* 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);
		Freexs();
		return;
	}

	/* save space for printed digits*/
	work = (int *)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);
	Freexs();
}