Bell 32V development
[unix-history] / usr / src / libmp / mout.c
CommitLineData
9cedae46
TL
1#include <stdio.h>
2#include <mp.h>
3m_in(a,b,f) MINT *a; FILE *f;
4{ MINT x,y,ten;
5 int sign,c;
6 short qten,qy;
7 xfree(a);
8 sign=1;
9 ten.len=1;
10 ten.val= &qten;
11 qten=b;
12 x.len=0;
13 y.len=1;
14 y.val= &qy;
15 while((c=getc(f))!=EOF)
16 switch(c)
17 {
18 case '\\': getc(f);
19 continue;
20 case '\t':
21 case '\n': a->len *= sign;
22 xfree(&x);
23 return(0);
24 case ' ':
25 continue;
26 case '-': sign = -sign;
27 continue;
28 default: if(c>='0' && c<= '9')
29 { qy=c-'0';
30 mult(&x,&ten,a);
31 madd(a,&y,a);
32 move(a,&x);
33 continue;
34 }
35 else
36 { VOID ungetc(c,stdin);
37 a->len *= sign;
38 return(0);
39 }
40 }
41 return(EOF);
42}
43m_out(a,b,f) MINT *a; FILE *f;
44{ int sign,xlen,i;
45 short r;
46 MINT x;
47 char *obuf;
48 register char *bp;
49 sign=1;
50 xlen=a->len;
51 if(xlen<0)
52 { xlen= -xlen;
53 sign= -1;
54 }
55 if(xlen==0)
56 { fprintf(f,"0\n");
57 return;
58 }
59 x.len=xlen;
60 x.val=xalloc(xlen,"m_out");
61 for(i=0;i<xlen;i++) x.val[i]=a->val[i];
62 obuf=(char *)malloc(7*xlen);
63 bp=obuf+7*xlen-1;
64 *bp--=0;
65 while(x.len>0)
66 { for(i=0;i<10&&x.len>0;i++)
67 { sdiv(&x,b,&x,&r);
68 *bp--=r+'0';
69 }
70 if(x.len>0) *bp--=' ';
71 }
72 if(sign==-1) *bp--='-';
73 fprintf(f,"%s\n",bp+1);
74 free(obuf);
75 FREE(x)
76 return;
77}
78sdiv(a,n,q,r) MINT *a,*q; short *r;
79{ MINT x,y;
80 int sign;
81 sign=1;
82 x.len=a->len;
83 x.val=a->val;
84 if(n<0)
85 { sign= -sign;
86 n= -n;
87 }
88 if(x.len<0)
89 { sign = -sign;
90 x.len= -x.len;
91 }
92 s_div(&x,n,&y,r);
93 xfree(q);
94 q->val=y.val;
95 q->len=sign*y.len;
96 *r = *r*sign;
97 return;
98}
99s_div(a,n,q,r) MINT *a,*q; short *r;
100{ int qlen,i;
101 long int x;
102 short *qval;
103 x=0;
104 qlen=a->len;
105 qval=xalloc(qlen,"s_div");
106 for(i=qlen-1;i>=0;i--)
107 {
108 x=x*0100000L+a->val[i];
109 qval[i]=x/n;
110 x=x%n;
111 }
112 *r=x;
113 if(qval[qlen-1]==0) qlen--;
114 q->len=qlen;
115 q->val=qval;
116 if(qlen==0) shfree(qval);
117 return;
118}
119min(a) MINT *a;
120{
121 return(m_in(a,10,stdin));
122}
123omin(a) MINT *a;
124{
125 return(m_in(a,8,stdin));
126}
127mout(a) MINT *a;
128{
129 m_out(a,10,stdout);
130}
131omout(a) MINT *a;
132{
133 m_out(a,8,stdout);
134}
135fmout(a,f) MINT *a; FILE *f;
136{ m_out(a,10,f);
137}
138fmin(a,f) MINT *a; FILE *f;
139{
140 return(m_in(a,10,f));
141}