Annotation of 43BSDReno/pgrm/lisp/franz/68k/adbig.c, revision 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.