Annotation of researchv10no/libmp/mout.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.