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