Annotation of coherent/d/usr/lib/libmp/madd.c, revision 1.1.1.1

1.1       root        1: #include "mprec.h"
                      2: #include <assert.h>
                      3: 
                      4: 
                      5: /*
                      6:  *     Madd adds the mints pointed to by "a" and "b" and puts the result
                      7:  *     into the mint pointed to by "c".  Note that it assumes that the
                      8:  *     contents of the mint pointed to by "c" are valid.  Also note that
                      9:  *     there is no assumption made on the distinctness of "a", "b" and "c".
                     10:  */
                     11: void
                     12: madd(a, b, c)
                     13: mint *a, *b, *c;
                     14: {
                     15:        register char *rp, *ap, *bp;
                     16:        char *limit;
                     17:        char asign, bsign;
                     18:        mint *temp;
                     19:        mint res;
                     20: 
                     21:        /* make a the bigger of the two */
                     22:        if (a->len < b->len) {
                     23:                temp = a;
                     24:                a = b;
                     25:                b = temp;
                     26:        }
                     27: 
                     28:        /* allocate new value */
                     29:        rp = (char *)mpalc(a->len + 1);
                     30:        res.val = rp;
                     31:        res.len = a->len + 1;
                     32: 
                     33:        ap = a->val;
                     34:        bp = b->val;
                     35: 
                     36:        /* add a and b over range of both */
                     37:        limit = bp + b->len;
                     38:        while (bp < limit)
                     39:                *rp++ = *ap++ + *bp++;
                     40: 
                     41:        /* add sign extended b to rest of a */
                     42:        bsign = (ispos(b) ? 00 : NEFL);
                     43:        limit = a->val + a->len;
                     44:        while (ap < limit)
                     45:                *rp++ = *ap++ + bsign;
                     46: 
                     47:        /* add sign of a and sign of b and put sum in lead digit of res */
                     48:        asign = (ispos(a) ? 00 : NEFL);
                     49:        *rp = asign + bsign;
                     50:        assert(rp == res.val + res.len - 1);
                     51: 
                     52:        norm(&res);
                     53:        mpfree(c->val);
                     54:        *c = res;
                     55: }
                     56: 
                     57: 
                     58: /*
                     59:  *     Msub subtracts the mint pointed to by "b" from that pointed at
                     60:  *     by "a" and stores the result in that pointed to by "c".  Note
                     61:  *     that there is no assumption made on the distinctness of "a", "b"
                     62:  *     and "c".
                     63:  */
                     64: 
                     65: void
                     66: msub(a, b, c)
                     67: mint *a, *b, *c;
                     68: {
                     69:        mint temp;
                     70: 
                     71:        minit(&temp);
                     72:        mneg(b, &temp);
                     73:        madd(a, &temp, c);
                     74:        mpfree(temp.val);
                     75: }

unix.superglobalmegacorp.com

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