|
|
1.1 root 1: static char *sccsid = "@(#)pbignum.c 34.1 10/3/80";
2:
3: #include "global.h"
4:
5: pbignum(current, useport)
6: register lispval current;
7: register FILE *useport;
8: {
9: int *top, *bot, *work, negflag = 0, *sp(), *alloca();
10: register int *digitp, *binp;
11: register lispval last;
12:
13: /* copy bignum onto stack */
14: top = sp() - 1;
15: do {
16: stack(current->s.I);
17: } while(current = current->s.CDR);
18:
19: bot = sp();
20: if (top==bot) {
21: fprintf(useport,"%d",*bot);
22: return;
23: }
24:
25: /* save space for printed digits*/
26: work = alloca((top-bot)*2*sizeof(int));
27: if( *bot < 0) {
28: negflag = 1;
29: dsneg(top,bot);
30: }
31:
32: /* figure out nine digits at a time by destructive division*/
33: for(digitp = work; bot <= top; digitp++) {
34: *digitp = dodiv(top,bot);
35: if(*bot==0) bot += 1;
36: }
37:
38: /* print them out */
39:
40: if(negflag) putc('-',useport);
41: fprintf(useport,"%d",*--digitp);
42: while ( digitp > work) fprintf(useport,"%09d",*--digitp);
43: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.