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