1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)mout.c 5.4 (Berkeley) 04/19/91"; 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