Annotation of 43BSDReno/pgrm/lisp/franz/tahoe/adbig.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *
                      3:  * Copyright (c) 1982, Regents, University of California
                      4:  *
                      5:  * stolen from 68k port by P. S. Housel 05/03/86
                      6:  */
                      7: #include "global.h"
                      8: 
                      9: struct s_dot
                     10:        {
                     11:         long I;
                     12:        struct s_dot *CDR;
                     13:        };
                     14: struct vl
                     15:        {
                     16:         long high;
                     17:         long low;
                     18:        };
                     19: 
                     20: 
                     21: struct s_dot *adbig(a,b)
                     22: struct s_dot *a, *b;
                     23: {
                     24:        int la = 1, lb = 1;
                     25:        long *sa, *sb, *sc, *base, *alloca();
                     26:        struct s_dot *export();
                     27:        register struct s_dot *p;
                     28:        register int *q, *r, *s;
                     29:        register carry = 0;
                     30:        Keepxs();
                     31: 
                     32:        /* compute lengths */
                     33:        
                     34:        for(p = a; p->CDR; p = p->CDR) la++;
                     35:        for(p = b; p->CDR; p = p->CDR) lb++;
                     36:        if(lb > la) la = lb;
                     37: 
                     38:        /* allocate storage areas on the stack */
                     39: 
                     40:        base = alloca((3*la+1)*sizeof(long));
                     41:        sc = base + la +1;
                     42:        sb = sc + la;
                     43:        sa = sb + la;
                     44:        q  = sa;
                     45: 
                     46:        /* copy s_dots onto stack */
                     47:        p = a;
                     48:        do { *--q = p->I; p = p->CDR; } while (p);
                     49:        while(q > sb) *--q = 0;
                     50:        p = b;
                     51:        do { *--q = p->I; p = p->CDR; } while (p);
                     52:        while(q > sc) *--q = 0;
                     53: 
                     54:        /* perform the addition */
                     55:        for(q = sa, r = sb, s = sc; q > sb;)
                     56:        {
                     57:                carry += *--q + *--r;
                     58:                *--s = carry & 0x3fffffff;
                     59:                carry >>= 30;
                     60:        }
                     61:        *--s = carry;
                     62: 
                     63:        p = export(sc,base);
                     64:        Freexs();
                     65:        return(p);
                     66: }

unix.superglobalmegacorp.com

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