[BACK]Return to C.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Annotation of OpenXM_contrib2/asir2000/engine/C.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/C.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "inline.h"
        !             4: #include "base.h"
        !             5:
        !             6: V up_var;
        !             7:
        !             8: /* binary has at least 32 leading 0 chars. */
        !             9: void binaryton(binary,np)
        !            10: char *binary;
        !            11: N *np;
        !            12: {
        !            13:        int i,w,len;
        !            14:        N n;
        !            15:        char buf[33];
        !            16:
        !            17:        binary += strlen(binary)%32;
        !            18:        len = strlen(binary);
        !            19:        w = len/32; /* sufficient for holding binary */
        !            20:        n = NALLOC(w);
        !            21:        for ( i = 0; i < w; i++ ) {
        !            22:                strncpy(buf,binary+len-32*(i+1),32); buf[32] = 0;
        !            23:                n->b[i] = strtoul(buf,0,2);
        !            24:        }
        !            25:        for ( i = w-1; i >= 0 && !n->b[i]; i-- );
        !            26:        if ( i < 0 )
        !            27:                *np = 0;
        !            28:        else {
        !            29:                n->p = i+1;
        !            30:                *np = n;
        !            31:        }
        !            32: }
        !            33:
        !            34: /* hex has at least 8 leading 0 chars. */
        !            35: void hexton(hex,np)
        !            36: char *hex;
        !            37: N *np;
        !            38: {
        !            39:        int i,w,len;
        !            40:        N n;
        !            41:        char buf[9];
        !            42:
        !            43:        hex += strlen(hex)%8;
        !            44:        len = strlen(hex);
        !            45:        w = len/8; /* sufficient for holding hex */
        !            46:        n = NALLOC(w);
        !            47:        for ( i = 0; i < w; i++ ) {
        !            48:                strncpy(buf,hex+len-8*(i+1),8); buf[8] = 0;
        !            49:                n->b[i] = strtoul(buf,0,16);
        !            50:        }
        !            51:        for ( i = w-1; i >= 0 && !n->b[i]; i-- );
        !            52:        if ( i < 0 )
        !            53:                *np = 0;
        !            54:        else {
        !            55:                n->p = i+1;
        !            56:                *np = n;
        !            57:        }
        !            58: }
        !            59:
        !            60: void ntobn(base,n,nrp)
        !            61: int base;
        !            62: N n,*nrp;
        !            63: {
        !            64:        int i,d,plc;
        !            65:        unsigned int *c,*x,*w;
        !            66:        unsigned int r;
        !            67:        L m;
        !            68:        N nr;
        !            69:
        !            70:        if ( !n ) {
        !            71:                *nrp = NULL;
        !            72:                return;
        !            73:        }
        !            74:
        !            75:        d = PL(n);
        !            76:        w = BD(n);
        !            77:
        !            78:        for ( i = 1, m = 1; m <= LBASE/(L)base; m *= base, i++ );
        !            79:
        !            80:        c = (unsigned int *)W_ALLOC(d*i+1);
        !            81:        x = (unsigned int *)W_ALLOC(d+1);
        !            82:        for ( i = 0; i < d; i++ )
        !            83:                x[i] = w[i];
        !            84:        for ( plc = 0; d >= 1; plc++ ) {
        !            85:                for ( i = d - 1, r = 0; i >= 0; i-- ) {
        !            86:                        DSAB((unsigned int)base,r,x[i],x[i],r)
        !            87:                }
        !            88:                c[plc] = r;
        !            89:                if ( !x[d-1] ) d--;
        !            90:        }
        !            91:
        !            92:        *nrp = nr = NALLOC(plc); INITRC(nr);
        !            93:        PL(nr) = plc;
        !            94:        for ( i = 0; i < plc; i++ )
        !            95:                BD(nr)[i] = c[i];
        !            96: }
        !            97:
        !            98: void bnton(base,n,nrp)
        !            99: int base;
        !           100: N n,*nrp;
        !           101: {
        !           102:        unsigned int carry;
        !           103:        unsigned int *x,*w;
        !           104:        int i,j,d,plc;
        !           105:        N nr;
        !           106:
        !           107:        if ( !n ) {
        !           108:                *nrp = 0;
        !           109:                return;
        !           110:        }
        !           111:
        !           112:        d = PL(n);
        !           113:        w = BD(n);
        !           114:        x = (unsigned int *)W_ALLOC(d + 1);
        !           115:
        !           116:        for ( plc = 0, i = d - 1; i >= 0; i-- ) {
        !           117:                for ( carry = w[i],j = 0; j < plc; j++ ) {
        !           118:                        DMA(x[j],(unsigned int)base,carry,carry,x[j])
        !           119:                }
        !           120:                if ( carry ) x[plc++] = carry;
        !           121:        }
        !           122:        *nrp = nr = NALLOC(plc); INITRC(nr);
        !           123:        PL(nr) = plc;
        !           124:        for ( i = 0; i < plc; i++ )
        !           125:                BD(nr)[i] = x[i];
        !           126: }
        !           127:
        !           128: void ptomp(m,p,pr)
        !           129: int m;
        !           130: P p;
        !           131: P *pr;
        !           132: {
        !           133:        DCP dc,dcr,dcr0;
        !           134:        Q q;
        !           135:        unsigned int a,b;
        !           136:        P t;
        !           137:        MQ s;
        !           138:
        !           139:        if ( !p )
        !           140:                *pr = 0;
        !           141:        else if ( NUM(p) ) {
        !           142:                q = (Q)p;
        !           143:                a = rem(NM(q),m);
        !           144:                if ( a && (SGN(q) < 0) )
        !           145:                        a = m-a;
        !           146:                b = !DN(q)?1:rem(DN(q),m);
        !           147:                if ( !b )
        !           148:                        error("ptomp : denominator = 0");
        !           149:                a = dmar(a,invm(b,m),0,m); STOMQ(a,s); *pr = (P)s;
        !           150:        } else {
        !           151:                for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
        !           152:                        ptomp(m,COEF(dc),&t);
        !           153:                        if ( t ) {
        !           154:                                NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
        !           155:                        }
        !           156:                }
        !           157:                if ( !dcr0 )
        !           158:                        *pr = 0;
        !           159:                else {
        !           160:                        NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
        !           161:                }
        !           162:        }
        !           163: }
        !           164:
        !           165: void mptop(f,gp)
        !           166: P f;
        !           167: P *gp;
        !           168: {
        !           169:        DCP dc,dcr,dcr0;
        !           170:        Q q;
        !           171:
        !           172:        if ( !f )
        !           173:                *gp = 0;
        !           174:        else if ( NUM(f) )
        !           175:                STOQ(CONT((MQ)f),q),*gp = (P)q;
        !           176:        else {
        !           177:                for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
        !           178:                        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); mptop(COEF(dc),&COEF(dcr));
        !           179:                }
        !           180:                NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
        !           181:        }
        !           182: }
        !           183:
        !           184: void ptolmp(p,pr)
        !           185: P p;
        !           186: P *pr;
        !           187: {
        !           188:        DCP dc,dcr,dcr0;
        !           189:        LM a;
        !           190:        P t;
        !           191:
        !           192:        if ( !p )
        !           193:                *pr = 0;
        !           194:        else if ( NUM(p) ) {
        !           195:                qtolm((Q)p,&a); *pr = (P)a;
        !           196:        } else {
        !           197:                for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
        !           198:                        ptolmp(COEF(dc),&t);
        !           199:                        if ( t ) {
        !           200:                                NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
        !           201:                        }
        !           202:                }
        !           203:                if ( !dcr0 )
        !           204:                        *pr = 0;
        !           205:                else {
        !           206:                        NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
        !           207:                }
        !           208:        }
        !           209: }
        !           210:
        !           211: void lmptop(f,gp)
        !           212: P f;
        !           213: P *gp;
        !           214: {
        !           215:        DCP dc,dcr,dcr0;
        !           216:        Q q;
        !           217:
        !           218:        if ( !f )
        !           219:                *gp = 0;
        !           220:        else if ( NUM(f) ) {
        !           221:                NTOQ(((LM)f)->body,1,q); *gp = (P)q;
        !           222:        } else {
        !           223:                for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
        !           224:                        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); lmptop(COEF(dc),&COEF(dcr));
        !           225:                }
        !           226:                NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
        !           227:        }
        !           228: }
        !           229:
        !           230: void ptoum(m,f,wf)
        !           231: int m;
        !           232: P f;
        !           233: UM wf;
        !           234: {
        !           235:        unsigned int r;
        !           236:        int i;
        !           237:        DCP dc;
        !           238:
        !           239:        for ( i = UDEG(f); i >= 0; i-- )
        !           240:                COEF(wf)[i] = 0;
        !           241:
        !           242:        for ( dc = DC(f); dc; dc = NEXT(dc) ) {
        !           243:                r = rem(NM((Q)COEF(dc)),m);
        !           244:                if ( r && (SGN((Q)COEF(dc)) < 0) )
        !           245:                        r = m-r;
        !           246:                COEF(wf)[QTOS(DEG(dc))] = r;
        !           247:        }
        !           248:        degum(wf,UDEG(f));
        !           249: }
        !           250:
        !           251: void umtop(v,w,f)
        !           252: V v;
        !           253: UM w;
        !           254: P *f;
        !           255: {
        !           256:        int *c;
        !           257:        DCP dc,dc0;
        !           258:        int i;
        !           259:        Q q;
        !           260:
        !           261:        if ( DEG(w) < 0 )
        !           262:                *f = 0;
        !           263:        else if ( DEG(w) == 0 )
        !           264:                STOQ(COEF(w)[0],q), *f = (P)q;
        !           265:        else {
        !           266:                for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )
        !           267:                        if ( c[i] ) {
        !           268:                                NEXTDC(dc0,dc);
        !           269:                                STOQ(i,DEG(dc));
        !           270:                                STOQ(c[i],q), COEF(dc) = (P)q;
        !           271:                        }
        !           272:                NEXT(dc) = 0;
        !           273:                MKP(v,dc0,*f);
        !           274:        }
        !           275: }
        !           276:
        !           277: void ptoup(n,nr)
        !           278: P n;
        !           279: UP *nr;
        !           280: {
        !           281:        DCP dc;
        !           282:        UP r;
        !           283:        int d;
        !           284:
        !           285:        if ( !n )
        !           286:                *nr = 0;
        !           287:        else if ( OID(n) == O_N ) {
        !           288:                *nr = r = UPALLOC(0);
        !           289:                DEG(r) = 0; COEF(r)[0] = (Num)n;
        !           290:        } else {
        !           291:                d = UDEG(n);
        !           292:                up_var = VR(n);
        !           293:                *nr = r = UPALLOC(d); DEG(r) = d;
        !           294:                for ( dc = DC(n); dc; dc = NEXT(dc) ) {
        !           295:                        COEF(r)[QTOS(DEG(dc))] = (Num)COEF(dc);
        !           296:                }
        !           297:        }
        !           298: }
        !           299:
        !           300: void uptop(n,nr)
        !           301: UP n;
        !           302: P *nr;
        !           303: {
        !           304:        int i;
        !           305:        DCP dc0,dc;
        !           306:
        !           307:        if ( !n )
        !           308:                *nr = 0;
        !           309:        else if ( !DEG(n) )
        !           310:                *nr = (P)COEF(n)[0];
        !           311:        else {
        !           312:                for ( i = DEG(n), dc0 = 0; i >= 0; i-- )
        !           313:                        if ( COEF(n)[i] ) {
        !           314:                                NEXTDC(dc0,dc); STOQ(i,DEG(dc)); COEF(dc) = (P)COEF(n)[i];
        !           315:                        }
        !           316:                if ( !up_var )
        !           317:                        up_var = CO->v;
        !           318:                MKP(up_var,dc0,*nr);
        !           319:        }
        !           320: }
        !           321:
        !           322: void ulmptoum(m,f,wf)
        !           323: int m;
        !           324: UP f;
        !           325: UM wf;
        !           326: {
        !           327:        int i,d;
        !           328:        LM *c;
        !           329:
        !           330:        if ( !f )
        !           331:                wf->d = -1;
        !           332:        else {
        !           333:                wf->d = d = f->d;
        !           334:                c = (LM *)f->c;
        !           335:                for ( i = 0, d = f->d; i <= d; i++ )
        !           336:                        COEF(wf)[i] = rem(c[i]->body,m);
        !           337:        }
        !           338: }
        !           339:
        !           340: void objtobobj(base,p,rp)
        !           341: int base;
        !           342: Obj p;
        !           343: Obj *rp;
        !           344: {
        !           345:        if ( !p )
        !           346:                *rp = 0;
        !           347:        else
        !           348:                switch ( OID(p) ) {
        !           349:                        case O_N:
        !           350:                                numtobnum(base,(Num)p,(Num *)rp); break;
        !           351:                        case O_P:
        !           352:                                ptobp(base,(P)p,(P *)rp); break;
        !           353:                        case O_LIST:
        !           354:                                listtoblist(base,(LIST)p,(LIST *)rp); break;
        !           355:                        case O_VECT:
        !           356:                                vecttobvect(base,(VECT)p,(VECT *)rp); break;
        !           357:                        case O_MAT:
        !           358:                                mattobmat(base,(MAT)p,(MAT *)rp); break;
        !           359:                        case O_STR:
        !           360:                                *rp = p; break;
        !           361:                        case O_COMP: default:
        !           362:                                error("objtobobj : not implemented"); break;
        !           363:                }
        !           364: }
        !           365:
        !           366: void bobjtoobj(base,p,rp)
        !           367: int base;
        !           368: Obj p;
        !           369: Obj *rp;
        !           370: {
        !           371:        if ( !p )
        !           372:                *rp = 0;
        !           373:        else
        !           374:                switch ( OID(p) ) {
        !           375:                        case O_N:
        !           376:                                bnumtonum(base,(Num)p,(Num *)rp); break;
        !           377:                        case O_P:
        !           378:                                bptop(base,(P)p,(P *)rp); break;
        !           379:                        case O_LIST:
        !           380:                                blisttolist(base,(LIST)p,(LIST *)rp); break;
        !           381:                        case O_VECT:
        !           382:                                bvecttovect(base,(VECT)p,(VECT *)rp); break;
        !           383:                        case O_MAT:
        !           384:                                bmattomat(base,(MAT)p,(MAT *)rp); break;
        !           385:                        case O_STR:
        !           386:                                *rp = p; break;
        !           387:                        case O_COMP: default:
        !           388:                                error("bobjtoobj : not implemented"); break;
        !           389:                }
        !           390: }
        !           391:
        !           392: void numtobnum(base,p,rp)
        !           393: int base;
        !           394: Num p;
        !           395: Num *rp;
        !           396: {
        !           397:        N nm,dn,body;
        !           398:        Q q;
        !           399:        LM l;
        !           400:
        !           401:        if ( !p )
        !           402:                *rp = 0;
        !           403:        else
        !           404:                switch ( NID(p) ) {
        !           405:                        case N_Q:
        !           406:                                ntobn(base,NM((Q)p),&nm);
        !           407:                                if ( DN((Q)p) ) {
        !           408:                                        ntobn(base,DN((Q)p),&dn);
        !           409:                                        NDTOQ(nm,dn,SGN((Q)p),q);
        !           410:                                } else
        !           411:                                        NTOQ(nm,SGN((Q)p),q);
        !           412:                                *rp = (Num)q;
        !           413:                                break;
        !           414:                        case N_R:
        !           415:                                *rp = p; break;
        !           416:                        case N_LM:
        !           417:                                ntobn(base,((LM)p)->body,&body);
        !           418:                                MKLM(body,l); *rp = (Num)l;
        !           419:                                break;
        !           420:                        default:
        !           421:                                error("numtobnum : not implemented"); break;
        !           422:                }
        !           423: }
        !           424:
        !           425: void bnumtonum(base,p,rp)
        !           426: int base;
        !           427: Num p;
        !           428: Num *rp;
        !           429: {
        !           430:        N nm,dn,body;
        !           431:        Q q;
        !           432:        LM l;
        !           433:
        !           434:        if ( !p )
        !           435:                *rp = 0;
        !           436:        else
        !           437:                switch ( NID(p) ) {
        !           438:                        case N_Q:
        !           439:                                bnton(base,NM((Q)p),&nm);
        !           440:                                if ( DN((Q)p) ) {
        !           441:                                        bnton(base,DN((Q)p),&dn);
        !           442:                                        NDTOQ(nm,dn,SGN((Q)p),q);
        !           443:                                } else
        !           444:                                        NTOQ(nm,SGN((Q)p),q);
        !           445:                                *rp = (Num)q;
        !           446:                                break;
        !           447:                        case N_R:
        !           448:                                *rp = p; break;
        !           449:                        case N_LM:
        !           450:                                bnton(base,((LM)p)->body,&body);
        !           451:                                MKLM(body,l); *rp = (Num)l;
        !           452:                                break;
        !           453:                        default:
        !           454:                                error("bnumtonum : not implemented"); break;
        !           455:                }
        !           456: }
        !           457:
        !           458: void ptobp(base,p,rp)
        !           459: int base;
        !           460: P p;
        !           461: P *rp;
        !           462: {
        !           463:        DCP dcr0,dcr,dc;
        !           464:
        !           465:        if ( !p )
        !           466:                *rp = p;
        !           467:        else {
        !           468:                for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
        !           469:                        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
        !           470:                        objtobobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
        !           471:                }
        !           472:                NEXT(dcr) = 0;
        !           473:                MKP(VR(p),dcr0,*rp);
        !           474:        }
        !           475: }
        !           476:
        !           477: void bptop(base,p,rp)
        !           478: int base;
        !           479: P p;
        !           480: P *rp;
        !           481: {
        !           482:        DCP dcr0,dcr,dc;
        !           483:
        !           484:        if ( !p )
        !           485:                *rp = p;
        !           486:        else {
        !           487:                for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
        !           488:                        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
        !           489:                        bobjtoobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
        !           490:                }
        !           491:                NEXT(dcr) = 0;
        !           492:                MKP(VR(p),dcr0,*rp);
        !           493:        }
        !           494: }
        !           495:
        !           496: void listtoblist(base,p,rp)
        !           497: int base;
        !           498: LIST p;
        !           499: LIST *rp;
        !           500: {
        !           501:        NODE nr0,nr,n;
        !           502:
        !           503:        if ( !p )
        !           504:                *rp = p;
        !           505:        else {
        !           506:                for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
        !           507:                        NEXTNODE(nr0,nr);
        !           508:                        objtobobj(base,BDY(n),(Obj *)&BDY(nr));
        !           509:                }
        !           510:                NEXT(nr) = 0;
        !           511:                MKLIST(*rp,nr0);
        !           512:        }
        !           513: }
        !           514:
        !           515: void blisttolist(base,p,rp)
        !           516: int base;
        !           517: LIST p;
        !           518: LIST *rp;
        !           519: {
        !           520:        NODE nr0,nr,n;
        !           521:
        !           522:        if ( !p )
        !           523:                *rp = p;
        !           524:        else {
        !           525:                for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
        !           526:                        NEXTNODE(nr0,nr);
        !           527:                        bobjtoobj(base,BDY(n),(Obj *)&BDY(nr));
        !           528:                }
        !           529:                NEXT(nr) = 0;
        !           530:                MKLIST(*rp,nr0);
        !           531:        }
        !           532: }
        !           533:
        !           534: void vecttobvect(base,p,rp)
        !           535: int base;
        !           536: VECT p;
        !           537: VECT *rp;
        !           538: {
        !           539:        int i,l;
        !           540:        VECT r;
        !           541:
        !           542:        if ( !p )
        !           543:                *rp = p;
        !           544:        else {
        !           545:                l = p->len;
        !           546:                MKVECT(r,l); *rp = r;
        !           547:                for ( i = 0; i < l; i++ )
        !           548:                        objtobobj(base,p->body[i],(Obj *)&r->body[i]);
        !           549:        }
        !           550: }
        !           551:
        !           552: void bvecttovect(base,p,rp)
        !           553: int base;
        !           554: VECT p;
        !           555: VECT *rp;
        !           556: {
        !           557:        int i,l;
        !           558:        VECT r;
        !           559:
        !           560:        if ( !p )
        !           561:                *rp = p;
        !           562:        else {
        !           563:                l = p->len;
        !           564:                MKVECT(r,l); *rp = r;
        !           565:                for ( i = 0; i < l; i++ )
        !           566:                        bobjtoobj(base,p->body[i],(Obj *)&r->body[i]);
        !           567:        }
        !           568: }
        !           569:
        !           570: void mattobmat(base,p,rp)
        !           571: int base;
        !           572: MAT p;
        !           573: MAT *rp;
        !           574: {
        !           575:        int row,col,i,j;
        !           576:        MAT r;
        !           577:
        !           578:        if ( !p )
        !           579:                *rp = p;
        !           580:        else {
        !           581:                row = p->row; col = p->col;
        !           582:                MKMAT(r,row,col); *rp = r;
        !           583:                for ( i = 0; i < row; i++ )
        !           584:                        for ( j = 0; i < col; j++ )
        !           585:                        objtobobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
        !           586:        }
        !           587: }
        !           588:
        !           589: void bmattomat(base,p,rp)
        !           590: int base;
        !           591: MAT p;
        !           592: MAT *rp;
        !           593: {
        !           594:        int row,col,i,j;
        !           595:        MAT r;
        !           596:
        !           597:        if ( !p )
        !           598:                *rp = p;
        !           599:        else {
        !           600:                row = p->row; col = p->col;
        !           601:                MKMAT(r,row,col); *rp = r;
        !           602:                for ( i = 0; i < row; i++ )
        !           603:                        for ( j = 0; i < col; j++ )
        !           604:                        bobjtoobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
        !           605:        }
        !           606: }
        !           607:
        !           608: void n32ton27(g,rp)
        !           609: N g;
        !           610: N *rp;
        !           611: {
        !           612:        int i,j,k,l,r,bits,words;
        !           613:        unsigned int t;
        !           614:        unsigned int *a,*b;
        !           615:        N z;
        !           616:
        !           617:        l = PL(g); a = BD(g);
        !           618:        for ( i = 31, t = a[l-1]; !(t&(1<<i)); i-- );
        !           619:        bits = (l-1)*32+i+1; words = (bits+26)/27;
        !           620:        *rp = z = NALLOC(words); PL(z) = words;
        !           621:        bzero((char *)BD(z),words*sizeof(unsigned int));
        !           622:        for ( j = 0, b = BD(z); j < words; j++ ) {
        !           623:                k = (27*j)/32; r = (27*j)%32;
        !           624:                if ( r > 5 )
        !           625:                        b[j] = (a[k]>>r)|(k==(l-1)?0:((a[k+1]&((1<<(r-5))-1))<<(32-r)));
        !           626:                else
        !           627:                        b[j] = (a[k]>>r)&((1<<27)-1);
        !           628:        }
        !           629:        if ( !(r = bits%27) )
        !           630:                r = 27;
        !           631:        b[words-1] &= ((1<<r)-1);
        !           632: }
        !           633:
        !           634: void n27ton32(a,rp)
        !           635: N a;
        !           636: N *rp;
        !           637: {
        !           638:        int i,j,k,l,r,bits,words;
        !           639:        unsigned int t;
        !           640:        unsigned int *b,*c;
        !           641:        N z;
        !           642:
        !           643:        l = PL(a); b = BD(a);
        !           644:        for ( i = 26, t = b[l-1]; !(t&(1<<i)); i-- );
        !           645:        bits = (l-1)*27+i+1; words = (bits+31)/32;
        !           646:        *rp = z = NALLOC(words); PL(z) = words;
        !           647:        bzero((char *)BD(z),words*sizeof(unsigned int));
        !           648:        for ( j = 0, c = BD(z); j < l; j++ ) {
        !           649:                k = (27*j)/32; r = (27*j)%32;
        !           650:                if ( r > 5 ) {
        !           651:                        c[k] |= (b[j]&((1<<(32-r))-1))<<r;
        !           652:                        if ( k+1 < words )
        !           653:                                c[k+1] = (b[j]>>(32-r));
        !           654:                } else
        !           655:                        c[k] |= (b[j]<<r);
        !           656:        }
        !           657: }
        !           658:
        !           659: void mptoum(p,pr)
        !           660: P p;
        !           661: UM pr;
        !           662: {
        !           663:        DCP dc;
        !           664:
        !           665:        if ( !p )
        !           666:                DEG(pr) = -1;
        !           667:        else if ( NUM(p) ) {
        !           668:                DEG(pr) = 0; COEF(pr)[0] = CONT((MQ)p);
        !           669:        } else {
        !           670:                bzero((char *)pr,(int)((UDEG(p)+2)*sizeof(int)));
        !           671:                for ( dc = DC(p); dc; dc = NEXT(dc) )
        !           672:                        COEF(pr)[QTOS(DEG(dc))] = CONT((MQ)COEF(dc));
        !           673:                degum(pr,UDEG(p));
        !           674:        }
        !           675: }
        !           676:
        !           677: void umtomp(v,p,pr)
        !           678: V v;
        !           679: UM p;
        !           680: P *pr;
        !           681: {
        !           682:        DCP dc,dc0;
        !           683:        int i;
        !           684:        MQ q;
        !           685:
        !           686:        if ( !p || (DEG(p) < 0) )
        !           687:                *pr = 0;
        !           688:        else if ( !DEG(p) )
        !           689:                STOMQ(COEF(p)[0],q), *pr = (P)q;
        !           690:        else {
        !           691:                for ( dc0 = 0, i = DEG(p); i >= 0; i-- )
        !           692:                        if ( COEF(p)[i] ) {
        !           693:                                NEXTDC(dc0,dc); STOQ(i,DEG(dc));
        !           694:                                STOMQ(COEF(p)[i],q), COEF(dc) = (P)q;
        !           695:                        }
        !           696:                NEXT(dc) = 0; MKP(v,dc0,*pr);
        !           697:        }
        !           698: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>