Annotation of 43BSDTahoe/new/B/src/bsmall/B1val.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
        !             2: /* $Header: B1val.c,v 1.1 84/06/28 00:49:01 timo Exp $ */
        !             3: 
        !             4: /* General operations for objects */
        !             5: 
        !             6: #include "b.h"
        !             7: #include "b0con.h"
        !             8: #include "b1obj.h"
        !             9: #include "b1mem.h"
        !            10: #include "b2scr.h" /* TEMPORARY for at_nwl */
        !            11: #include "b2sem.h" /* TEMPORARY for grab */
        !            12: #ifndef SMALLNUMBERS
        !            13: #include "b1num.h" /* for ccopy, rrelease, grab, grab_num, grab_rat, grab_approx */
        !            14: #else
        !            15: #include "B1num.h" /* For grab */
        !            16: #endif
        !            17: 
        !            18: 
        !            19: #define LL (len < 200 ? 1 : 8)
        !            20: #define Len (len == 0 ? 0 : ((len-1)/LL+1)*LL)
        !            21: #define Adj(s) (unsigned) (sizeof(*Vnil)-sizeof(Vnil->cts)+(s))
        !            22: 
        !            23: #define Grabber() {if(len>Maxintlet)syserr("big grabber");}
        !            24: #define Regrabber() {if(len>Maxintlet)syserr("big regrabber");}
        !            25: 
        !            26: value etxt, elis, etab, elt;
        !            27: 
        !            28: long gr= 0;
        !            29: 
        !            30: Visible Procedure prgr() {at_nwl=No;printf(" gr:%ld",gr);gr=0;}
        !            31: 
        !            32: Hidden value grab(type, len) literal type; intlet len; {
        !            33:        unsigned syze; value v;
        !            34:        Grabber();
        !            35:        switch (type) {
        !            36:        case Num:
        !            37: #ifdef SMALLNUMBERS
        !            38:                syze= sizeof(number);
        !            39: #else
        !            40:                if (len >= 0) syze= Len*sizeof(digit);          /* Integral */
        !            41:                else if (len == -1) syze= sizeof(double);       /* Approximate */
        !            42:                else syze= 2*sizeof(value);                     /* Rational */
        !            43: #endif
        !            44:                break;
        !            45:        case Tex: syze= (len+1)*sizeof(char); break; /* one extra for the '\0' */
        !            46:        case Com: syze= len*sizeof(value); break;
        !            47:        case ELT: syze= (len= 0); break;
        !            48:        case Lis:
        !            49:        case Tab: syze= Len*sizeof(value); break;
        !            50:        case Sim: syze= sizeof(simploc); break;
        !            51:        case Tri: syze= sizeof(trimloc); break;
        !            52:        case Tse: syze= sizeof(tbseloc); break;
        !            53:        case How: syze= sizeof(how); break;
        !            54:        case For: syze= sizeof(formal); break;
        !            55:        case Glo: syze= 0; break;
        !            56:        case Per: syze= sizeof(value); break;
        !            57:        case Fun:
        !            58:        case Prd: syze= sizeof(funprd); break;
        !            59:        case Ref: syze= sizeof(ref); break;
        !            60:        default:
        !            61:                printf("\ngrabtype{%c}\n", type);
        !            62:                syserr("grab called with unknown type");
        !            63:        }
        !            64:        v= (value) getmem(Adj(syze));
        !            65:        v->type= type; v->len= len; v->refcnt= 1;
        !            66: gr+=1;
        !            67:        return v;
        !            68: }
        !            69: 
        !            70: #ifdef SMALLNUMBERS
        !            71: Visible value grab_num(len) intlet len; { return grab(Num, len); }
        !            72: #else
        !            73: Visible value grab_num(len) register int len; {
        !            74:        integer v;
        !            75:        register int i;
        !            76: 
        !            77:        v = (integer) grab(Num, len);
        !            78:        for (i = Length(v)-1; i >= 0; --i) Digit(v, i) = 0;
        !            79:        return (value) v;
        !            80: }
        !            81: 
        !            82: Visible value grab_rat() {
        !            83:        return (value) grab(Num, -2);
        !            84: }
        !            85: 
        !            86: Visible value grab_approx() {
        !            87:        return (value) grab(Num, -1);
        !            88: }
        !            89: 
        !            90: Visible value regrab_num(v, len) value v; register int len; {
        !            91:        register unsigned syze;
        !            92: 
        !            93:        syze = Len * sizeof(digit);
        !            94:        regetmem(&v, Adj(syze));
        !            95:        Length(v) = len;
        !            96:        return v;
        !            97: }
        !            98: #endif
        !            99: 
        !           100: Visible value grab_tex(len) intlet len; {
        !           101:        if (len == 0) return copy(etxt);
        !           102:        return grab(Tex, len);
        !           103: }
        !           104: 
        !           105: Visible value grab_com(len) intlet len; { return grab(Com, len); }
        !           106: 
        !           107: Visible value grab_elt() { return copy(elt); }
        !           108: 
        !           109: Visible value grab_lis(len) intlet len; {
        !           110:        if (len == 0) return copy(elis);
        !           111:        return grab(Lis, len);
        !           112: }
        !           113: 
        !           114: Visible value grab_tab(len) intlet len; {
        !           115:        if (len == 0) return copy(etab);
        !           116:        return grab(Tab, len);
        !           117: }
        !           118: 
        !           119: Visible value grab_sim() { return grab(Sim, 0); }
        !           120: 
        !           121: Visible value grab_tri() { return grab(Tri, 0); }
        !           122: 
        !           123: Visible value grab_tse() { return grab(Tse, 0); }
        !           124: 
        !           125: Visible value grab_how() { return grab(How, 0); }
        !           126: 
        !           127: Visible value grab_for() { return grab(For, 0); }
        !           128: 
        !           129: Visible value grab_glo() { return grab(Glo, 0); }
        !           130: 
        !           131: Visible value grab_per() { return grab(Per, 0); }
        !           132: 
        !           133: Visible value grab_fun() { return grab(Fun, 0); }
        !           134: 
        !           135: Visible value grab_prd() { return grab(Prd, 0); }
        !           136: 
        !           137: Visible value grab_ref() { return grab(Ref, 0); }
        !           138: 
        !           139: Visible value copy(v) value v; {
        !           140:        if (v != Vnil && v->refcnt < Maxintlet) (v->refcnt)++;
        !           141:  gr+=1;
        !           142:        return v;
        !           143: }
        !           144: 
        !           145: Visible Procedure release(v) value v; {
        !           146:        intlet *r= &(v->refcnt);
        !           147:        if (v == Vnil) return;
        !           148:        if (*r == 0) syserr("releasing unreferenced value");
        !           149:  if(bugs){printf("releasing: "); if (Type(v) == Num) bugs= No; wri(v,No,No,No); bugs= Yes; line();}
        !           150:        if (*r < Maxintlet && --(*r) == 0) rrelease(v);
        !           151:  gr-=1;
        !           152: }
        !           153: 
        !           154: Hidden value ccopy(v) value v; {
        !           155:        literal type= v->type; intlet len= Length(v), k; value w;
        !           156:        w= grab(type, len);
        !           157:        switch (type) {
        !           158:        case Num:
        !           159: #ifdef SMALLNUMBERS
        !           160:                Numerator(w)= Numerator(v);
        !           161:                Denominator(w)= Denominator(v);
        !           162: #else
        !           163:                if (Integral(v)) {
        !           164:                        register int i;
        !           165:                        for (i = len-1; i >= 0; --i)
        !           166:                                Digit((integer)w, i) = Digit((integer)v, i);
        !           167:                } else if (Approximate(v))
        !           168:                        Realval((real)w) = Realval((real)v);
        !           169:                else if (Rational(v)) {
        !           170:                        Numerator((rational)w) =
        !           171:                                (integer) copy(Numerator((rational)v));
        !           172:                        Denominator((rational)w) =
        !           173:                                (integer) copy(Denominator((rational)v));
        !           174:                }
        !           175: #endif
        !           176:                break;
        !           177:        case Tex:
        !           178:                strcpy(Str(w), Str(v));
        !           179:                break;
        !           180:        case Com:
        !           181:        case Lis:
        !           182:        case Tab:
        !           183:        case ELT:
        !           184:                {value *vp= Ats(v), *wp= Ats(w);
        !           185:                        Overall *wp++= copy(*vp++);
        !           186:                } break;
        !           187:        case Sim:
        !           188:                {simploc *vv= (simploc *)Ats(v), *ww= (simploc *)Ats(w);
        !           189:                        ww->i= copy(vv->i); ww->e= vv->e; /* No copy */
        !           190:                } break;
        !           191:        case Tri:
        !           192:                {trimloc *vv= (trimloc *)Ats(v), *ww= (trimloc *)Ats(w);
        !           193:                        ww->R= copy(vv->R); ww->B= vv->B; ww->C= vv->C;
        !           194:                } break;
        !           195:        case Tse:
        !           196:                {tbseloc *vv= (tbseloc *)Ats(v), *ww= (tbseloc *)Ats(w);
        !           197:                        ww->R= copy(vv->R); ww->K= copy(vv->K);
        !           198:                } break;
        !           199:        case How:
        !           200:                *((how *)Ats(w)) = *((how *)Ats(v));
        !           201:                break;
        !           202:        case For:
        !           203:                *((formal *)Ats(w)) = *((formal *)Ats(v));
        !           204:                break;
        !           205:        case Glo:
        !           206:                break;
        !           207:        case Per:
        !           208:                *Ats(w)= copy(*Ats(v));
        !           209:                break;
        !           210:        case Fun:
        !           211:        case Prd:
        !           212:                *((funprd *)Ats(w)) = *((funprd *)Ats(v));
        !           213:                break;
        !           214:        case Ref:
        !           215:                *((ref *)Ats(w)) = *((ref *)Ats(v));
        !           216:                break;
        !           217:        default:
        !           218:                syserr("ccopy called with unknown type");
        !           219:        }
        !           220:        return w;
        !           221: }
        !           222: 
        !           223: Hidden Procedure rrelease(v) value v; {
        !           224:        literal type= v->type; intlet len= Length(v), k;
        !           225:        switch (type) {
        !           226:        case Num:
        !           227: #ifndef SMALLNUMBERS
        !           228:                if (Rational(v)) {
        !           229:                        release(Numerator((rational)v));
        !           230:                        release(Denominator((rational)v));
        !           231:                }
        !           232:                break;
        !           233: #endif
        !           234:        case Tex:
        !           235:                break;
        !           236:        case Com:
        !           237:        case Lis:
        !           238:        case Tab:
        !           239:        case ELT:
        !           240:                {value *vp= Ats(v);
        !           241:                        Overall release(*vp++);
        !           242:                } break;
        !           243:        case Sim:
        !           244:                {simploc *vv= (simploc *)Ats(v);
        !           245:                        release(vv->i); /* No release of vv->e */
        !           246:                } break;
        !           247:        case Tri:
        !           248:                {trimloc *vv= (trimloc *)Ats(v);
        !           249:                        release(vv->R);
        !           250:                } break;
        !           251:        case Tse:
        !           252:                {tbseloc *vv= (tbseloc *)Ats(v);
        !           253:                        release(vv->R); release(vv->K);
        !           254:                } break;
        !           255:        case How:
        !           256:                {how *vv= (how *)Ats(v);
        !           257:                        freemem((ptr) vv->fux);
        !           258:                        release(vv->reftab);
        !           259:                } break;
        !           260:        case For:
        !           261:        case Glo:
        !           262:                break;
        !           263:        case Per:
        !           264:                release(*Ats(v));
        !           265:                break;
        !           266:        case Fun:
        !           267:        case Prd:
        !           268:                {funprd *vv= (funprd *)Ats(v);
        !           269:                        if (vv->def == Use) {
        !           270:                                freemem((ptr) vv->fux);
        !           271:                                release(vv->reftab);
        !           272:                        }
        !           273:                } break;
        !           274:        case Ref:
        !           275:                break;
        !           276:        default:
        !           277:                syserr("release called with unknown type");
        !           278:        }
        !           279:        v->type= '\0'; freemem((ptr) v);
        !           280: }
        !           281: 
        !           282: Visible Procedure uniql(ll) value *ll; {
        !           283:        if (*ll != Vnil && (*ll)->refcnt > 1) {
        !           284:                value c= ccopy(*ll);
        !           285:                release(*ll);
        !           286:                *ll= c;
        !           287:        }
        !           288: }
        !           289: 
        !           290: Visible Procedure xtndtex(a, d) value *a; intlet d; {
        !           291:        intlet len= Length(*a)+d;
        !           292:        Regrabber();
        !           293:        regetmem(a, Adj((len+1)*sizeof(char)));
        !           294:        (*a)->len= len;
        !           295: }
        !           296: 
        !           297: Visible Procedure xtndlt(a, d) value *a; intlet d; {
        !           298:        intlet len= Length(*a); intlet l1= Len, l2;
        !           299:        len+= d; l2= Len;
        !           300:        if (l1 != l2) {
        !           301:                Regrabber();
        !           302:                regetmem(a, Adj(l2*sizeof(value)));
        !           303:        }
        !           304:        (*a)->len= len;
        !           305: }
        !           306: 
        !           307: Visible Procedure initmem() {
        !           308:        etxt= grab(Tex, 0);
        !           309:        elis= grab(Lis, 0);
        !           310:        etab= grab(Tab, 0);
        !           311:        elt=  grab(ELT, 0);
        !           312:  notel= grab_lis(0); noting= No;
        !           313: }

unix.superglobalmegacorp.com

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