Annotation of researchv9/jtools/src/cmd/life.c, revision 1.1

1.1     ! root        1: #include "jerq.h"
        !             2: #include <stdio.h>
        !             3: #include <ctype.h>
        !             4: 
        !             5: unsigned short delta[] = {
        !             6:        0x0001, 0x0100, 0x0101, 0x00ff, 0xff00, 0xffff, 0xff01, 0xfeff
        !             7: };
        !             8: 
        !             9: char   magic[] = {
        !            10:        0, 0, 0, 1, 0, 0, 0, 0,
        !            11:        0, 0, 1, 1, 0, 0, 0, 0
        !            12: };
        !            13: 
        !            14: char   *setment[] = {
        !            15:        "run",
        !            16:        "clear",
        !            17:        "read file",
        !            18:        "write file",
        !            19:        "exit",
        !            20:        0
        !            21: };
        !            22: 
        !            23: Menu   setmen = { setment };
        !            24: 
        !            25: char   *runment[] = {
        !            26:        "setup",
        !            27:        "stop",
        !            28:        "slow",
        !            29:        "exit",
        !            30:        0
        !            31: };
        !            32: 
        !            33: Menu   runmen = { runment };
        !            34: 
        !            35: unsigned long  *hash;
        !            36: unsigned short list[512];
        !            37: unsigned short *lend;
        !            38: unsigned short olist[512];
        !            39: unsigned short *olend;
        !            40: unsigned long  *hlist[768];
        !            41: unsigned long  **hlistp;
        !            42: Bitmap *discmap;
        !            43: Bitmap *circmap;
        !            44: Point  setpt();
        !            45: unsigned short getpt();
        !            46: int    stopmode;
        !            47: int    slowmode;
        !            48: int    stepcount;
        !            49: FILE   *filep;
        !            50: 
        !            51: main(argc, argv)
        !            52: char *argv[];
        !            53: {
        !            54:        register i;
        !            55:        register unsigned short *lp;
        !            56: 
        !            57: #ifdef JERQ
        !            58:        request(KBD|MOUSE|RCV);
        !            59: #else
        !            60:        request(KBD|MOUSE);
        !            61: #endif
        !            62:        initdisplay(argc, argv);
        !            63:        olend = olist;
        !            64:        if ((discmap = balloc(Rect(0, 0, 16, 16))) == (Bitmap *)NULL)
        !            65:                exit();
        !            66:        if ((circmap = balloc(Rect(0, 0, 16, 16))) == (Bitmap *)NULL)
        !            67:                exit();
        !            68:        rectf(discmap, discmap->rect, F_CLR);
        !            69:        disc(discmap, Pt(7, 7), 7, F_XOR);
        !            70:        rectf(circmap, circmap->rect, F_CLR);
        !            71:        circle(circmap, Pt(7, 7), 2, F_XOR);
        !            72:        if ((hash = (unsigned long *)gcalloc(sizeof(long)*8192L,
        !            73:           (char **)&hash)) == (unsigned long *)NULL)
        !            74:                exit();
        !            75:        setup();
        !            76:        while (kbdchar() != 'q') {
        !            77:                if (own()&MOUSE && button1())
        !            78:                        stepcount = 1;
        !            79:                if (own()&MOUSE && button2()) {
        !            80:                        switch(menuhit(&runmen, 2)) {
        !            81:                        case 0:                 /* setup */
        !            82:                                setup();
        !            83:                                continue;
        !            84:                        case 1:                 /* stop/go */
        !            85:                                runment[1] = stopmode? "stop":"go";
        !            86:                                stopmode ^= 01;
        !            87:                                break;
        !            88: 
        !            89:                        case 2:                 /* fast/slow */
        !            90:                                runment[2] = slowmode? "slow":"fast";
        !            91:                                slowmode ^= 01;
        !            92:                                break;
        !            93: 
        !            94:                        case 3:                 /* exit */
        !            95:                                exit(0);
        !            96:                        }
        !            97:                }
        !            98:                if (stopmode && stepcount == 0) {
        !            99:                        wait(MOUSE);
        !           100:                        continue;
        !           101:                }
        !           102:                if (stepcount > 0)
        !           103:                        stepcount--;
        !           104:                if (slowmode)
        !           105:                        sleep(30);
        !           106:                gendisplay();
        !           107:                genhash();
        !           108:                genlist();
        !           109:                wait(CPU);
        !           110:        }
        !           111: }
        !           112: 
        !           113: genhash()
        !           114: {
        !           115:        register unsigned short *lp;
        !           116:        register unsigned long *hp, vl;
        !           117:        register short unsigned i, v, vn;
        !           118: 
        !           119:        hlistp = hlist;
        !           120:        for (lp = list; lp < lend; ) {
        !           121:                v = *lp++;
        !           122:                hp = &hash[v>>3];
        !           123:                if (*hp == 0)
        !           124:                        *hlistp++ = hp;
        !           125:                *hp |= 0x8L << ((v&07) << 2);
        !           126:                for (i=0; i<8; i++) {
        !           127:                        vn = v + delta[i];
        !           128:                        hp = &hash[vn>>3];
        !           129:                        if (*hp == 0)
        !           130:                                *hlistp++ = hp;
        !           131:                        vl = 0x4L << ((vn&07) << 2);
        !           132:                        if ((*hp & vl) == 0) {
        !           133:                                vl >>= 2;
        !           134:                                *hp += vl;
        !           135:                        }
        !           136:                }
        !           137:        }
        !           138:        *hlistp = 0;
        !           139: }
        !           140: 
        !           141: genlist()
        !           142: {
        !           143:        register unsigned long h;
        !           144:        register i, j;
        !           145:        register unsigned short *lp;
        !           146:        register unsigned long *hp;
        !           147: 
        !           148:        lp = lend = list;
        !           149:        hlistp = hlist;
        !           150:        while (hp = *hlistp++) {
        !           151:                h = *hp;
        !           152:                i = hp - hash;
        !           153:                for (j = 0; h != 0; j++) {
        !           154:                        if (magic[h&0xf] /* && not at side edge */ )
        !           155:                                *lp++ = (i<<3) + j;
        !           156:                        h >>= 4;
        !           157:                }
        !           158:                *hp = 0;
        !           159:        }
        !           160:        lend = lp;
        !           161: }
        !           162: 
        !           163: gendisplay()
        !           164: {
        !           165:        register x, y;
        !           166:        register unsigned short *lp;
        !           167:        Point orig;
        !           168:        static short black_bits[]={
        !           169:                0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        !           170:                0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        !           171:        };
        !           172:        static Texture black;
        !           173:        static int first = 1;
        !           174: 
        !           175:        if (first) {
        !           176:                first = 0;
        !           177:                black = ToTexture(black_bits);
        !           178:        }
        !           179:        rectf(&display, display.rect, F_STORE);
        !           180:        orig = div(add(Drect.origin, Drect.corner), 2);
        !           181:        for (lp = list; lp < lend; ) {
        !           182:                x = ((*lp >> 8) - 0x80) << 2;
        !           183:                y = ((*lp++ & 0xff) - 0x80) << 2;
        !           184:                texture(&display, Rpt(add(orig, Pt(x,y)),
        !           185:                            add(orig, Pt(x+2,y+2))), &black, F_XOR);
        !           186:        }
        !           187: }
        !           188: 
        !           189: setup()
        !           190: {
        !           191:        register i, j;
        !           192:        register unsigned short *lp;
        !           193: 
        !           194:        for (i = 0; i < 8192; i++)
        !           195:                hash[i] = 0;
        !           196:        cleanset();
        !           197:     more:
        !           198:        while(button1() && wait(MOUSE))
        !           199:                ;
        !           200:        for (;; wait(MOUSE)) {
        !           201:                if (button1()) {
        !           202:                        unsigned short p;
        !           203:                        p = getpt();
        !           204:                        for (lp = olist; lp < olend; lp++) {
        !           205:                                if (*lp == p) {
        !           206:                                        while (lp < olend-1) {
        !           207:                                                *lp = *(lp+1);
        !           208:                                                lp++;
        !           209:                                        }
        !           210:                                        dispt(circmap, p);
        !           211:                                        olend--;
        !           212:                                        goto more;
        !           213:                                }
        !           214:                        }
        !           215:                        *olend++ = p;
        !           216:                        dispt(discmap, p);
        !           217:                        goto more;
        !           218:                }
        !           219:                if (button2()) {
        !           220:                        switch(menuhit(&setmen, 2)) {
        !           221: 
        !           222:                        case 0: /* run */
        !           223:                                break;
        !           224: 
        !           225:                        case 1: /* clear */
        !           226:                                olend = olist;
        !           227:                                cleanset();
        !           228:                                goto more;
        !           229: 
        !           230:                        case 2: /* read file */
        !           231:                                if (getfile('r') == 0)
        !           232:                                        goto more;
        !           233:                                olend = olist;
        !           234:                                cleanset();
        !           235:                                for (;;) {
        !           236:                                        int x, y;
        !           237:                                        if (getnum(&x)==0)
        !           238:                                                break;
        !           239:                                        if (getnum(&y)==0)
        !           240:                                                break;
        !           241:                                        x += 0x80;
        !           242:                                        y += 0x80;
        !           243:                                        *olend = (x<<8) | (y & 0xff);
        !           244:                                        dispt(discmap, *olend++);
        !           245:                                }
        !           246:                                fclose(filep);
        !           247:                                goto more;
        !           248: 
        !           249:                        case 3: /* write file */
        !           250:                                if (getfile('w') == 0)
        !           251:                                        goto more;
        !           252:                                for (lp = olist; lp < olend; lp++) {
        !           253:                                        putnum((*lp>>8)-0x80);
        !           254:                                        putc(' ', filep);
        !           255:                                        putnum((*lp&0xFF)-0x80);
        !           256:                                        putc('\n', filep);
        !           257:                                }
        !           258:                                putc('X', filep);
        !           259:                                fclose(filep);
        !           260:                                goto more;
        !           261: 
        !           262:                        case 4: /* exit */
        !           263:                                exit(0);
        !           264: 
        !           265:                        default:
        !           266:                                continue;
        !           267:                        }
        !           268:                        break;
        !           269:                }
        !           270:        }
        !           271:        for (lp = olist, lend = list; lp < olend; )
        !           272:                *lend++ = *lp++;
        !           273: }
        !           274: 
        !           275: Point
        !           276: setpt(p)
        !           277: unsigned short p;
        !           278: {
        !           279:        Point pt;
        !           280:        register x, y;
        !           281: 
        !           282:        pt = add(Drect.origin,mul(div(sub(Drect.corner,Drect.origin),32),16));
        !           283:        x = ((p>>8) - 0x80) << 4;
        !           284:        y = ((p & 0xff) - 0x80) << 4;
        !           285:        return(add(pt, Pt(x,y)));
        !           286: }
        !           287: 
        !           288: dispt(map, p)
        !           289: register struct Bitmap *map;
        !           290: unsigned short p;
        !           291: {
        !           292:        trimblt(map, map->rect, setpt(p), F_STORE);
        !           293: }
        !           294: 
        !           295: unsigned short
        !           296: getpt()
        !           297: {
        !           298:        register Point sp, o;
        !           299: 
        !           300:        sp = div(sub(mouse.xy, Drect.origin), 16);
        !           301:        o = div(sub(Drect.corner,Drect.origin),32);
        !           302:        sp = sub(sp, o);
        !           303:        return(((0x80+sp.x)<<8) + ((0x80+sp.y) & 0xff));
        !           304: }
        !           305: 
        !           306: cleanset()
        !           307: {
        !           308:        register unsigned short *lp;
        !           309:        register i, j;
        !           310: 
        !           311:        for (i=Drect.origin.x; i < Drect.corner.x; i += 16)
        !           312:                trimblt(circmap, circmap->rect,
        !           313:                     Pt(i, Drect.origin.y), F_STORE);
        !           314:        for (j=Drect.origin.y+16; j < Drect.corner.y; j += 16)
        !           315:                trimblt(&display,
        !           316:                    Rpt(Drect.origin, Pt(Drect.corner.x, Drect.origin.y+16)),
        !           317:                    Pt(Drect.origin.x, j), F_STORE);
        !           318:        for (lp = olist; lp <olend; lp++)
        !           319:                dispt(discmap, *lp);
        !           320: }
        !           321: 
        !           322: getnum(np)
        !           323: register int *np;
        !           324: {
        !           325:        register n=0, c, got=0, neg=0;
        !           326: 
        !           327:        for (;;) {
        !           328:                c = getc(filep);
        !           329:                if (c==' ' || c=='\t' || c=='\n') {
        !           330:                        if (got) {
        !           331:                                if (neg)
        !           332:                                        n = -n;
        !           333:                                *np = n;
        !           334:                                return(1);
        !           335:                        }
        !           336:                } else if (c>='0' && c<='9') {
        !           337:                        n = n*10 + c - '0';
        !           338:                        got = 1;
        !           339:                } else if (c=='-')
        !           340:                        neg = 1;
        !           341:                else {
        !           342:                        if (c != 'X') {
        !           343:                                rectf(&display, Drect, F_CLR);
        !           344:                                string(&defont, "Not a life file", &display,
        !           345:                                    add(display.rect.origin, Pt(20,20)), F_XOR);
        !           346:                                sleep(120);
        !           347:                                cleanset();
        !           348:                        }
        !           349:                        return(0);
        !           350:                }
        !           351:        }
        !           352: }
        !           353: 
        !           354: getfile(rw)
        !           355: {
        !           356:        char file[128];
        !           357:        register char *fp = file;
        !           358:        register c;
        !           359:        Point fs;
        !           360:        int strw = strwidth(&defont, "x");
        !           361: 
        !           362:        fp = file;
        !           363:     redraw:
        !           364:        while (kbdchar() >= 0)
        !           365:                ;
        !           366:        rectf(&display, Drect, F_CLR);
        !           367:        fs = string(&defont, "File: ", &display,
        !           368:                 add(display.rect.origin, Pt(20,20)), F_XOR);
        !           369:        for (;;) {
        !           370:                wait(KBD);
        !           371:                c = kbdchar();
        !           372:                switch(c) {
        !           373: 
        !           374:                case -1:
        !           375:                        return(0);
        !           376: 
        !           377:                case '\n':
        !           378:                case '\r':
        !           379:                        break;
        !           380: 
        !           381:                case '\b':
        !           382:                        if (fp > file) {
        !           383:                                *fp = '\0';
        !           384:                                fp--;
        !           385:                                string(&defont, fp, &display,
        !           386:                                  sub(fs, Pt(strw, 0)), F_XOR);
        !           387:                                fs = sub(fs, Pt(strw, 0));
        !           388:                        }
        !           389:                        continue;
        !           390: 
        !           391:                case '@':
        !           392:                        fp = file;
        !           393:                        goto redraw;
        !           394: 
        !           395:                default:
        !           396:                        *fp = c;
        !           397:                        fp[1] = '\0';
        !           398:                        fs = string(&defont, fp++, &display, fs, F_XOR);
        !           399:                        continue;
        !           400:                }
        !           401:                break;
        !           402:        }
        !           403:        *fp++ = '\0';
        !           404:        if ((filep = fopen(file, rw == 'r' ? "r" : "w")) != NULL) {
        !           405:                cleanset();
        !           406:                return(1);
        !           407:        }
        !           408:        rectf(&display, Drect, F_CLR);
        !           409:        fs = string(&defont, "Can't open it.", &display,
        !           410:                add(display.rect.origin, Pt(20,20)), F_XOR);
        !           411:        sleep(120);
        !           412:        cleanset();
        !           413:        return(0);
        !           414: }
        !           415: 
        !           416: putnum(x)
        !           417: register x;
        !           418: {
        !           419:        register t;
        !           420: 
        !           421:        if (x < 0) {
        !           422:                putc('-', filep);
        !           423:                x = -x;
        !           424:        }
        !           425:        if ((t = x/10) > 0)
        !           426:                putnum(t);
        !           427:        putc(x%10 + '0', filep);
        !           428: }
        !           429: 
        !           430: trimblt(sb, r, p, f)
        !           431: Bitmap *sb;
        !           432: Rectangle r;
        !           433: Point p;
        !           434: Code f;
        !           435: {
        !           436:        Rectangle nr;
        !           437:        int v;
        !           438:        
        !           439:        nr = raddp(r, sub(p, r.origin));
        !           440:        v = rectclip(&nr, Drect);
        !           441:        if (v) {
        !           442:                nr = rsubp(nr, sub(p, r.origin));
        !           443:                bitblt(sb, nr, &display, p, f);
        !           444:        }
        !           445: }

unix.superglobalmegacorp.com

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