|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.