Annotation of 43BSD/ucb/lisp/franz/68k/adbig.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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