BSD 4_4 development
[unix-history] / usr / src / old / lisp / franz / pbignum.c
CommitLineData
cc439dd6
C
1#ifndef lint
2static char *rcsid =
3 "$Header: pbignum.c,v 1.3 83/09/12 14:17:59 sklower Exp $";
4#endif
5
6/* -[Sat Jan 29 13:30:47 1983 by jkf]-
7 * pbignum.c $Locker: $
8 * print a bignum
9 *
10 * (c) copyright 1982, Regents of the University of California
11 */
12
13#include "global.h"
14
15pbignum(current, useport)
16register lispval current;
17register FILE *useport;
18{
19 long *top, *bot, *work, negflag = 0;
20 char *alloca();
21 register int *digitp;
22 Keepxs();
23
24 /* copy bignum onto stack */
25 top = (sp()) - 1;
26 do {
27 stack(current->s.I);
28 } while(current = current->s.CDR);
29
30 bot = sp();
31 if (top==bot) {
32 fprintf(useport,"%d",*bot);
33 Freexs();
34 return;
35 }
36
37 /* save space for printed digits*/
38 work = (int *)alloca((top-bot)*2*sizeof(int));
39 if( *bot < 0) {
40 negflag = 1;
41 dsneg(top,bot);
42 }
43
44 /* figure out nine digits at a time by destructive division*/
45 for(digitp = work; bot <= top; digitp++) {
46 *digitp = dodiv(top,bot);
47 if(*bot==0) bot += 1;
48 }
49
50 /* print them out */
51
52 if(negflag) putc('-',useport);
53 fprintf(useport,"%d",*--digitp);
54 while ( digitp > work) fprintf(useport,"%.09d",*--digitp);
55 Freexs();
56}