xref: /original-bsd/lib/libmp/mout.c (revision c3e32dec)
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>
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 }
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 }
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 }
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 }
127 min(a) MINT *a;
128 {
129 	return(m_in(a,10,stdin));
130 }
131 omin(a) MINT *a;
132 {
133 	return(m_in(a,8,stdin));
134 }
135 mout(a) MINT *a;
136 {
137 	m_out(a,10,stdout);
138 }
139 omout(a) MINT *a;
140 {
141 	m_out(a,8,stdout);
142 }
143 fmout(a,f) MINT *a; FILE *f;
144 {	m_out(a,10,f);
145 }
146 fmin(a,f) MINT *a; FILE *f;
147 {
148 	return(m_in(a,10,f));
149 }
150