Annotation of 43BSDTahoe/lib/old_compiler/as/as.tahoe/bignum.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     Copyright (c) 1982 Regents of the University of California
                      3:  */
                      4: #ifndef lint
                      5: static char sccsid[] = "@(#)bignum1.c 4.4 6/30/83";
                      6: #endif not lint
                      7: 
                      8: #include <errno.h>
                      9: #include <stdio.h>
                     10: #include "as.h"
                     11: 
                     12: Bignum Znumber;
                     13: 
                     14: /*
                     15:  *     Construct an integer.
                     16:  */
                     17: 
                     18: Bignum as_atoi(ccp, radix, ovfp)
                     19:        reg     char    *ccp;           /* character cp */
                     20:                int     radix;
                     21:                Ovf     *ovfp;
                     22: {
                     23:        reg     chptr   bcp;
                     24:                chptr   tcp;
                     25:        reg     int     i;
                     26:                int     val;
                     27:                Bignum  n_n;
                     28:                Bignum  t_n;
                     29:                int     sign;
                     30:                Ovf     ovf;
                     31: 
                     32:        ovf = 0;
                     33:        sign = 0;
                     34:        for (; *ccp; ccp++){
                     35:                switch(*ccp){
                     36:                case '0':
                     37:                case '+':       continue;
                     38:                case '-':       sign ^= 1;
                     39:                                continue;
                     40:                }
                     41:                break;
                     42:        }
                     43: 
                     44:        n_n = Znumber;
                     45:        t_n = Znumber;
                     46:        bcp = CH_FIELD(n_n); (void)numclear(bcp);
                     47:        tcp = CH_FIELD(t_n); (void)numclear(tcp);
                     48:        for (; *ccp; ccp++){
                     49:                switch(*ccp){
                     50:                case '8': case '9':
                     51:                        if (radix < 10)
                     52:                                goto done;
                     53:                        /*FALLTHROUGH*/
                     54:                case '0': case '1': case '2': case '3': case '4':
                     55:                case '5': case '6': case '7':
                     56:                        val = *ccp - '0';
                     57:                        break;
                     58:                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
                     59:                        if (radix < 16)
                     60:                                goto done;
                     61:                        val = *ccp - 'A' + 10;
                     62:                        break;
                     63:                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                     64:                        if (radix < 16)
                     65:                                goto done;
                     66:                        val = *ccp - 'a' + 10;
                     67:                        break;
                     68:                default:
                     69:                        goto done;
                     70:                }
                     71:                switch(radix){
                     72:                case 8:
                     73:                        ovf |= numshift(3, bcp, bcp);
                     74:                        break;
                     75:                case 16:
                     76:                        ovf |= numshift(4, bcp, bcp);
                     77:                        break;
                     78:                case 10:
                     79:                        ovf |= numshift(1, tcp, bcp);
                     80:                        ovf |= numshift(3, bcp, bcp);
                     81:                        ovf |= numaddv(bcp, tcp, bcp);
                     82:                        break;
                     83:                }
                     84:                ovf |= numaddd(bcp, bcp, val);
                     85:        }
                     86:   done: ;
                     87:        ovf |= posovf(bcp);
                     88:        if (sign){
                     89:                if (ovf & OVF_MAXINT) {
                     90:                        ovf &= ~(OVF_MAXINT | OVF_POSOVF);
                     91:                } else {
                     92:                        ovf |= numnegate(bcp, bcp);
                     93:                }
                     94:        }
                     95:        /*
                     96:         *      find the highest set unit of the number
                     97:         */
                     98:        val = sign ? -1 : 0;
                     99:        for (i = 0; i < CH_N; i++){
                    100:                if (bcp[i] == val)
                    101:                        break;
                    102:        }
                    103:        {
                    104:                static u_char tagtab[4][8] = {
                    105:                {       TYPB,
                    106:                        TYPW,
                    107:                        TYPL, TYPL,
                    108:                        TYPQ, TYPQ, TYPQ, TYPQ },
                    109:                {       TYPW,
                    110:                        TYPL,
                    111:                        TYPQ, TYPQ },
                    112:                {   0   },
                    113:                {       TYPL,
                    114:                        TYPQ }
                    115:                };
                    116:                /*
                    117:                 *      i indexes to the null chunk; make it point to the
                    118:                 *      last non null chunk
                    119:                 */
                    120:                i -= 1;
                    121:                if (i < 0)
                    122:                        i = 0;
                    123:                n_n.num_tag = tagtab[HOC][i];
                    124:                assert(n_n.num_tag != 0, " Botch width computation");
                    125:        }
                    126:        *ovfp = ovf;
                    127:        return(n_n);
                    128: }
                    129: 
                    130: Bignum as_atof (numbuf, radix)
                    131:        char *numbuf;
                    132: {
                    133:        double atof ();
                    134:        Bignum number;
                    135: 
                    136:        number = Znumber;
                    137:        number.num_tag = radix;
                    138:        switch (radix)
                    139:        {
                    140:           case TYPD:
                    141:                number.num_num.numFd_float.Fd_value = atof (numbuf);
                    142:                break;
                    143:           case TYPF:
                    144:                number.num_num.numFf_float.Ff_value = atof (numbuf);
                    145:                break;
                    146:        }
                    147: 
                    148:        return (number);
                    149: }
                    150: 
                    151: Ovf posovf(src)
                    152:        reg     chptr   src;
                    153: {
                    154:        reg     int     i;
                    155:        Ovf     overflow = 0;
                    156: 
                    157:        if (src[HOC] & SIGNBIT)
                    158:                overflow = OVF_POSOVF;
                    159:        if (src[HOC] == SIGNBIT){
                    160:                for (i = HOC - 1; i >= 0; --i){
                    161:                        if (src[i] != 0)
                    162:                                return(overflow);
                    163:                }
                    164:                overflow |= OVF_MAXINT;
                    165:        }
                    166:        return(overflow);
                    167: }
                    168: 
                    169: /*
                    170:  *     check if the number is clear
                    171:  */
                    172: int isclear(dst)
                    173:        reg     chptr   dst;
                    174: {
                    175:        return(!isunequal(dst, CH_FIELD(Znumber)));
                    176: }
                    177: 
                    178: int isunequal(src1, src2)
                    179:        reg     chptr   src1, src2;
                    180: {
                    181:        reg     int     i;
                    182: 
                    183:        i = CH_N;
                    184:        do{
                    185:                if (*src1++ != *src2++)
                    186:                        return(i);
                    187:        }while(--i);
                    188:        return(0);
                    189: }
                    190: 
                    191: Ovf numclear(dst)
                    192:        reg     chptr   dst;
                    193: {
                    194:        reg     int     i;
                    195:        i = CH_N;
                    196:        do{
                    197:                *dst++ = 0;
                    198:        }while(--i);
                    199:        return(0);
                    200: }
                    201: 
                    202: Ovf numshift(n, dst, src)
                    203:                int     n;
                    204:        reg     chptr   dst, src;
                    205: {
                    206:        reg     int     i;
                    207:        reg     u_int   carryi, carryo;
                    208:        reg     u_int   mask;
                    209:        reg     u_int   value;
                    210: 
                    211:        i = CH_N;
                    212:        if (n == 0){
                    213:                do{
                    214:                        *dst++ = *src++;
                    215:                } while(--i);
                    216:                return(0);
                    217:        }
                    218: 
                    219:        carryi = 0;
                    220:        mask = ONES(n);
                    221: 
                    222:        if (n > 0){
                    223:                do{
                    224:                        value = *src++;
                    225:                        carryo = (value >> (CH_BITS - n)) & mask; 
                    226:                        value <<= n;
                    227:                        value &= ~mask;
                    228:                        *dst++ = value | carryi;
                    229:                        carryi = carryo;
                    230:                } while (--i);
                    231:                return(carryi ? OVF_LSHIFT : 0);
                    232:        } else {
                    233:                n = -n;
                    234:                src += CH_N;
                    235:                dst += CH_N;
                    236:                do{
                    237:                        value = *--src;
                    238:                        carryo = value & mask; 
                    239:                        value >>= n;
                    240:                        value &= ONES(CH_BITS - n);
                    241:                        *--dst = value | carryi;
                    242:                        carryi = carryo << (CH_BITS - n);
                    243:                } while (--i);
                    244:                return(carryi ? OVF_LSHIFT : 0);
                    245:        }
                    246: }
                    247: 
                    248: Ovf numaddd(dst, src1, val)
                    249:        chptr   dst, src1;
                    250:        int     val;
                    251: {
                    252:        static  Bignum  work;
                    253: 
                    254:        work.num_uchar[3] = val;
                    255:        return (numaddv(dst, src1, CH_FIELD(work)));
                    256: }
                    257: 
                    258: Ovf numaddv(dst, src1, src2)
                    259:        reg     chptr   dst, src1, src2;
                    260: {
                    261:        reg     int     i;
                    262:        reg     int     carry;
                    263:        reg     u_int   A,B,value;
                    264: 
                    265:        carry = 0;
                    266:        i = CH_N;
                    267:        do{
                    268:                A = *src1++;
                    269:                B = *src2++;
                    270:                value = A + B + carry;
                    271:                *dst++ = value;
                    272:                carry = 0;
                    273:                if (value < A || value < B)
                    274:                        carry = 1;
                    275:        } while (--i);
                    276:        return(carry ? OVF_ADDV : 0);
                    277: }
                    278: 
                    279: Ovf numnegate(dst, src)
                    280:        chptr   dst, src;
                    281: {
                    282:        Ovf     ovf;
                    283: 
                    284:        ovf = num1comp(dst, src) ;
                    285:        ovf |= numaddd(dst, dst, 1);
                    286:        return(ovf);
                    287: }
                    288: 
                    289: Ovf num1comp(dst, src)
                    290:        reg     chptr   dst, src;
                    291: {
                    292:        reg     int     i;
                    293:        i = CH_N;
                    294:        do{
                    295:                *dst++ = ~ *src++;
                    296:        }while (--i);
                    297:        return(0);
                    298: }
                    299: 
                    300: bignumprint(number)
                    301:        Bignum  number;         /* number presented */
                    302: {
                    303:        switch (num_type)
                    304:        {
                    305:                case TYPQ:
                    306:                        printf ("val[msd] = 0x%x, val[lsd] = 0x%x.",
                    307:                        number.num_num.numIq_int.Iq_ulong[1],
                    308:                        number.num_num.numIq_int.Iq_ulong[0]);
                    309:                        break;
                    310:                case TYPF:
                    311:                        printf ("value %20.17f",
                    312:                        number.num_num.numFf_float.Ff_value);
                    313:                        break;
                    314:                case TYPD:
                    315:                        printf ("value %20.17f",
                    316:                        number.num_num.numFd_float.Fd_value);
                    317:                        break;
                    318:                default:
                    319:                        break;
                    320:        }
                    321: }
                    322: 

unix.superglobalmegacorp.com

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