Annotation of researchv10no/cmd/pico/nodes.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "pico.h"
        !             3: #include "pico2.h"
        !             4: #include "y.tab.h"
        !             5: 
        !             6: extern struct  SRC src[MANY];
        !             7: extern short   CURSCRATCH, CUROLD;
        !             8: extern char    faster, frameb, metheus;
        !             9: extern int     DEF_LL, DEF_NL;
        !            10: 
        !            11: #define        NNODE   8000
        !            12: 
        !            13: Node   nodearray[NNODE];
        !            14: int    nalloc=0;
        !            15: 
        !            16: Node *
        !            17: Index(k)
        !            18:        Node *k;
        !            19: {
        !            20:        switch(k->type) {
        !            21:        case ACOMMA:    if (commacount(k) == 2)
        !            22:                        return
        !            23:                        new(OADD, new(OMUL, k->right, VR(&DEF_LL), Z), k->left, Z);
        !            24:                        break;
        !            25:        case COMP:      return new(ODIV, sumchans(k->left), NR(3), Z);
        !            26:        }
        !            27:        return k;
        !            28: }
        !            29: 
        !            30: Node *
        !            31: ncopy(n)
        !            32:        Node *n;
        !            33: {
        !            34:        if (n == Z)
        !            35:                return n;
        !            36: 
        !            37:        n = new(n->type, ncopy(n->left), ncopy(n->right), n->other);
        !            38: 
        !            39:        if (n->type == CONDI)
        !            40:                n->other = ncopy(n->other);
        !            41: 
        !            42:        return n;
        !            43: }
        !            44: 
        !            45: int spare;
        !            46: 
        !            47: Node *
        !            48: modulo(p, q)
        !            49:        Node *p, *q;
        !            50: { Node *tmp1, *tmp2;
        !            51: 
        !            52:        if (p->type == OCOMMA || p->type == ACOMMA)
        !            53:                yyerror("lefthand-side of modulo is a composite");
        !            54: 
        !            55:        tmp1 = new(OASS, VR(&spare), ncopy(p), Z);
        !            56:        tmp2 = new(OSUB, VR(&spare),
        !            57:                new(OMUL, new(ODIV, VR(&spare), ncopy(q), Z), ncopy(q), Z), Z);
        !            58: 
        !            59:        return  new(OCOMMA, tmp1, new(CONDI, tmp2, VR(&spare), q), Z);
        !            60: }
        !            61: 
        !            62: Node *
        !            63: divide(p, q)
        !            64:        Node *p, *q;
        !            65: { Node *tmp  = ncopy(q);
        !            66:        extern Node zero;
        !            67:        return new(CONDI, new(ODIV, p, q, Z), &zero, tmp);
        !            68: }
        !            69: 
        !            70: int fixspot;
        !            71:                /* encodes the assignment of a composite to a composite */
        !            72: Node *
        !            73: fixit(n, m)
        !            74:        Node *n, *m;
        !            75: {      Node *tmp1 = new(OASS, VR(&fixspot), ncopy(m), Z);
        !            76: 
        !            77:        Node *tmp2 = ncopy(n->left->left);              /* r */
        !            78:        Node *tmp3 = ncopy(n->left->right->left);       /* g */
        !            79:        Node *tmp4 = ncopy(n->left->right->right);      /* b */
        !            80: 
        !            81:        Node *low = new(OAND, VR(&fixspot), NR(255), Z);
        !            82:        Node *med = new(OLSH, notnew(OAND, VR(&fixspot), NR(255<<8)),
        !            83:                                new(OMINUS, NR(8), Z, Z), Z);
        !            84:        Node *hig = new(OLSH, VR(&fixspot),
        !            85:                                new(OMINUS, NR(16), Z, Z), Z);
        !            86: 
        !            87:        Node *tmp5 = new(OASS, tmp2, low, Z);
        !            88:        Node *tmp6 = new(OASS, tmp3, med, Z);
        !            89:        Node *tmp7 = new(OASS, tmp4, hig, Z);
        !            90: 
        !            91:        Node *tmp8 = new(OCOMMA, tmp5, tmp6, Z);
        !            92:        Node *tmp9 = new(OCOMMA, tmp7, tmp8, Z);
        !            93: 
        !            94:        return new(OCOMMA, tmp1, tmp9, Z);
        !            95: }
        !            96: 
        !            97: Node *
        !            98: catch(what, n, m)
        !            99:        int what;
        !           100:        Node *n, *m;
        !           101: {
        !           102:        switch (what)
        !           103:        {
        !           104:        case DIVV:      return divide(n, m);
        !           105:        case MODU:      return modulo(n, m);
        !           106:        case OASS:      if (n->type == COMP)
        !           107:                        {       if (m->type == CONDI)
        !           108:                                        return fixit(n, m);
        !           109:                                else
        !           110:                        return new(OCOMMA, par(what, n->left, m->left), Z, Z);
        !           111:                        }
        !           112:        default:        return new(what, n, m, Z);
        !           113:        }
        !           114: }
        !           115: 
        !           116: Node *
        !           117: new(type, left, right, oth)
        !           118:        Node *left, *right, *oth;
        !           119: {
        !           120:        register Node *n;
        !           121: 
        !           122:        if (nalloc >= NNODE)
        !           123:                yyerror("NNODE too small; recompile pico");
        !           124:        n = nodearray+nalloc++;
        !           125:        n->type  = type;
        !           126:        n->left  = left;
        !           127:        n->right = right;
        !           128:        n->other = oth;
        !           129: 
        !           130:        return n;
        !           131: }
        !           132: 
        !           133: Node *
        !           134: sumchans(n)
        !           135:        Node *n;
        !           136: {
        !           137:        if (n == Z || n->type != ACOMMA)
        !           138:                return n;
        !           139:        return new(OADD, sumchans(n->left), sumchans(n->right), Z);
        !           140: }
        !           141: 
        !           142: Node *
        !           143: cast(n)
        !           144:        Node *n;
        !           145: {
        !           146:        if (n == Z || n->type != ACOMMA)
        !           147:                return n;
        !           148: 
        !           149:        return new(ODIV, sumchans(n->left), NR(3), Z);
        !           150: }
        !           151: 
        !           152: #define Par(side)      par(what, n1->side, n2->side)
        !           153: 
        !           154: Node *
        !           155: par(what, n1, n2)
        !           156:        int what;
        !           157:        Node *n1, *n2;
        !           158: {
        !           159:        if (n1 == Z || n2 == Z)
        !           160:                return Z;
        !           161: 
        !           162:        if (n1->type != ACOMMA || n2->type != ACOMMA)
        !           163:                return catch(what, ncopy(n1), ncopy(n2));
        !           164: 
        !           165:        if (what == OASS)
        !           166:                return new(OCOMMA, Par(left), Par(right), Z);
        !           167:        else
        !           168:                return new(ACOMMA, Par(left), Par(right), Z);
        !           169: }
        !           170: 
        !           171: Node *
        !           172: promote(m)
        !           173:        Node *m;
        !           174: {
        !           175:        Node *n;
        !           176: 
        !           177:        if (m->type == CONDI)
        !           178:                return new(CONDI, promote(m->left), promote(m->right), m->other);
        !           179:        if (m->type == COMP)
        !           180:                return m;
        !           181:        n = new(ACOMMA, ncopy(m), ncopy(m), Z);
        !           182:        n = new(ACOMMA, ncopy(m), n, Z);
        !           183: 
        !           184:        return new(COMP, n, Z, Z);      
        !           185: }
        !           186: 
        !           187: Node *
        !           188: disp(what, n, e)
        !           189:        int what;
        !           190:        Node *n, *e;
        !           191: {
        !           192:        if (n == Z)
        !           193:                return Z;
        !           194: 
        !           195:        if (n->type != ACOMMA)
        !           196:                return catch(what, ncopy(n), ncopy(e));
        !           197: 
        !           198:        return new(OCOMMA, disp(what, n->left, e), disp(what, n->right, e), Z);
        !           199: }
        !           200: 
        !           201: Node *
        !           202: notnew(what, n1, n2)
        !           203:        int what;
        !           204:        Node *n1, *n2;
        !           205: {
        !           206:        int how = 0;
        !           207: 
        !           208:        if (n1->type == COMP) how += 1;
        !           209:        if (n2->type == COMP) how += 2;
        !           210: 
        !           211:        switch (how) {
        !           212:        case 1: n2 = promote(n2);       /* fall through */
        !           213:        case 0: return catch(what, n1, n2);
        !           214:        case 2: if (what == OASS)
        !           215:                return catch(what, n1, new(ODIV, sumchans(n2->left), NR(3), Z));
        !           216:                n1 = promote(n1);       /* fall through */
        !           217:        case 3: if (what == OASS)
        !           218:                return catch(what, n1, n2);     /* else: */
        !           219:                return new(COMP, par(what, n1->left, n2->left), Z, Z);
        !           220:        }
        !           221: }
        !           222: 
        !           223: Node *
        !           224: threechans(q, r)
        !           225:        struct SRC *q;
        !           226:        Node *r;
        !           227: {
        !           228:        Node *n;
        !           229: 
        !           230:        if (q->nchan >= 3)
        !           231:        {       n = new(ACOMMA, DOLGRN(q, r), DOLBLU(q, r), Z);
        !           232:                n = new(ACOMMA, DOLRED(q, r), n, Z);
        !           233:                return new(COMP, n, Z, Z);
        !           234:        } else
        !           235:                return DOLRED(q, r);
        !           236: }
        !           237: 
        !           238: SNode *
        !           239: nsup(n, x, y, i)
        !           240:        Node *n, *x, *y;
        !           241:        char i;
        !           242: {
        !           243:        SNode *tmp;
        !           244: 
        !           245:        tmp = (SNode *) Emalloc(sizeof(SNode));
        !           246:        tmp->n = n;
        !           247:        tmp->x = x;
        !           248:        tmp->y = y;
        !           249:        tmp->i = i;
        !           250: 
        !           251:        return tmp;
        !           252: }
        !           253: 
        !           254: Node *
        !           255: splatter(n)
        !           256:        SNode *n;
        !           257: {
        !           258:        extern int ramlyank(), fblyank(), metlyank();
        !           259: 
        !           260:        if (metheus)
        !           261:                return new(CCALL, new(ACOMMA, n->x, n->y, Z), Z, metlyank);
        !           262:        else if (frameb)
        !           263:                return new(CCALL, new(ACOMMA, n->x, n->y, Z), Z, fblyank);
        !           264: }
        !           265: 
        !           266: Node *
        !           267: weird(n, m)
        !           268:        SNode *n;
        !           269:         Node *m;
        !           270: {
        !           271:        Node *tmp;
        !           272: 
        !           273:        if (m == Z)
        !           274:                return n->n;
        !           275: 
        !           276:        tmp = notnew(OASS, n->n, m);
        !           277:        if (n->i != CURSCRATCH
        !           278:        || (!frameb && !metheus)
        !           279:        || (faster && notafunc() && metheus)
        !           280:        || (faster && Old->nchan==1 && notafunc() && frameb))
        !           281:                return tmp;
        !           282:        else
        !           283:                return new(OCOMMA, tmp, splatter(n), Z);
        !           284: }
        !           285: 
        !           286: Node *
        !           287: getx(n)
        !           288:        Node *n;
        !           289: {
        !           290:        if (n == Z)
        !           291:                return AREG(XREG);
        !           292:        if (n->type == ACOMMA)
        !           293:        {       if (commacount(n) == 2)
        !           294:                        return n->left;
        !           295:                else
        !           296:                        yyerror("bad index");
        !           297:        }
        !           298:        return modulo(n, VR(&DEF_LL));
        !           299: }
        !           300: 
        !           301: Node *
        !           302: gety(n)
        !           303:        Node *n;
        !           304: {
        !           305:        if (n == Z)
        !           306:                return AREG(YREG);
        !           307:        if (n->type == ACOMMA)
        !           308:        {       if (commacount(n) == 2)
        !           309:                        return n->right;
        !           310:                else
        !           311:                        yyerror("bad index");
        !           312:        }
        !           313:        return divide(n, VR(&DEF_LL));
        !           314: }
        !           315: 
        !           316: SNode *
        !           317: super(a, b, t)
        !           318:        Node *b;
        !           319: {
        !           320:        Node *tmp;
        !           321:        Node *n = (b == Z)? DII: Index(b);
        !           322: 
        !           323:        switch (t) {
        !           324:        case   RGB:     tmp = threechans(&src[a], n); break;
        !           325:        case    BW:     if (src[a].nchan == 1)
        !           326:                                tmp = DOLRED((&src[a]), n);
        !           327:                        else
        !           328:                                tmp = cast(threechans(&src[a], n));
        !           329:                        break;
        !           330:        case RCHAN:     tmp = DOLRED((&src[a]), n); break;
        !           331:        case GCHAN:     tmp = DOLGRN((&src[a]), n); break;
        !           332:        case BCHAN:     tmp = DOLBLU((&src[a]), n); break;
        !           333:        }
        !           334: 
        !           335:        if (b == Z)
        !           336:                return nsup(tmp, AREG(XREG), AREG(YREG), a);
        !           337:        else
        !           338:                return nsup(tmp, getx(b), gety(b), a);
        !           339: }

unix.superglobalmegacorp.com

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