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