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