home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libmp / mout.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.0 KB  |  142 lines

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