Annotation of researchv9/jtools/src/sam/x11/main.c, revision 1.1.1.1

1.1       root        1: #include "samterm.h"
                      2: 
                      3: Text   cmd;
                      4: uchar  *scratch;
                      5: long   nscralloc;
                      6: long   typeaddr= -1;
                      7: Cursor *cursor;
                      8: Flayer *which=0;
                      9: Flayer *work=0;
                     10: long   snarflen;
                     11: char   lock=1;         /* goes to 2 soon */
                     12: main(argc, argv)
                     13:        int argc;
                     14:        char **argv;
                     15: {
                     16:        register got, scr;
                     17:        register Text *t;
                     18:        Rectangle r;
                     19:        register Flayer *nwhich;
                     20: 
                     21:        request(MOUSE|KBD|RCV);
                     22:        initdisplay(argc, argv);
                     23:        initcursors();
                     24:        GCALLOC(100, &scratch);
                     25:        nscralloc=100;
                     26:        cursswitch(&sweep);
                     27:        do {
                     28:                while(!button3())
                     29:                        wait(MOUSE);
                     30:        } while(!getr(&r, 0));
                     31:        cursswitch((Cursor *)0);
                     32:        setlock();
                     33:        flstart(Drect);
                     34:        rinit(&cmd.rasp);
                     35:        flnew(&cmd.l[0], gettext, 1, (char *)&cmd);
                     36:        flinit(&cmd.l[0], r, &defont);
                     37:        cmd.nwin=1;
                     38:        which= &cmd.l[0];
                     39:        cmd.tag=Untagged;
                     40:        startnewfile(Tstartcmdfile, &cmd);
                     41:        for(;;){
                     42:                if ((P->state&KBD) && which && (lock || ((Text *)which->user1)->lock))
                     43:                        wait(MOUSE|RCV);
                     44:                else
                     45:                        wait(MOUSE|KBD|RCV);
                     46:                if (P->state&RCV) {
                     47:                        rcv();
                     48:                        continue;
                     49:                }
                     50:                if(lock<2 && (P->state&RESHAPED)) {
                     51:                        P->state &= ~RESHAPED;
                     52:                        reshape();
                     53:                }
                     54:                if(which && (P->state&KBD))
                     55:                        type(which);
                     56:                if(lock<2){
                     57:                        if(!button123() || !ptinrect(mouse.xy, Drect))
                     58:                                continue;
                     59:                        nwhich=flwhich(mouse.xy);
                     60:                        scr=which && ptinrect(mouse.xy, which->scroll);
                     61:                        if(button1()){
                     62:                                typeaddr= -1;
                     63:                                if(nwhich){
                     64:                                        if(nwhich!=which)
                     65:                                                current(nwhich);
                     66:                                        else if(scr)
                     67:                                                scroll(which, 1);
                     68:                                        else{
                     69:                                                t=(Text *)which->user1;
                     70:                                                if(flselect(which)){
                     71:                                                        outTsl(Tdclick, t->tag, which->p0);
                     72:                                                        t->lock++;
                     73:                                                }else if(t!=&cmd)
                     74:                                                        outcmd();
                     75:                                        }
                     76:                                }
                     77:                        }else if(button2() && which){
                     78:                                typeaddr= -1;
                     79:                                if(scr)
                     80:                                        scroll(which, 2);
                     81:                                else
                     82:                                        menu2hit();
                     83:                        }else if(button3()){
                     84:                                typeaddr= -1;
                     85:                                if(scr)
                     86:                                        scroll(which, 3);
                     87:                                else
                     88:                                        menu3hit();
                     89:                        }
                     90:                }
                     91:        }
                     92: }
                     93: reshape(){
                     94:        register i;
                     95:        flreshape(Drect);
                     96:        for(i=0; i<nname; i++)
                     97:                if(text[i]){
                     98:                        hcheck(text[i]->tag);
                     99:                }
                    100: }
                    101: current(nw)
                    102:        register Flayer *nw;
                    103: {
                    104:        register Text *t;
                    105:        if(which)
                    106:                flborder(which, 0);
                    107:        if(nw){
                    108:                typeaddr= -1;
                    109:                cursswitch(&deadmouse);
                    110:                flupfront(nw);
                    111:                flborder(nw, 1);
                    112:                (Up);
                    113:                cursswitch(cursor);
                    114:                t=(Text *)nw->user1;
                    115:                t->front=nw-&t->l[0];
                    116:                if(t!=&cmd)
                    117:                        work=nw;
                    118:        }
                    119:        which=nw;
                    120: }
                    121: Sclose(l)
                    122:        register Flayer *l;
                    123: {
                    124:        register Text *t=(Text *)l->user1;
                    125:        register m;
                    126:        m=whichmenu(t->tag);
                    127:        if(m<0)
                    128:                return;
                    129:        cursswitch(&deadmouse);
                    130:        flclose(l);
                    131:        cursswitch(cursor);
                    132:        if(l==which){
                    133:                which=0;
                    134:                current(flwhich(Pt(0, 0)));
                    135:        }
                    136:        if(l==work)
                    137:                work=0;
                    138:        if(--t->nwin==0){
                    139:                rclear(&t->rasp);
                    140:                free((char *)t);
                    141:                text[m]=0;
                    142:        }else if(l==&t->l[t->front]){
                    143:                for(m=0; m<NL; m++)     /* find one; any one will do */
                    144:                        if(t->l[m].textfn){
                    145:                                t->front=m;
                    146:                                return;
                    147:                        }
                    148:                panic("Sclose");
                    149:        }
                    150: }
                    151: Flayer *
                    152: findl(t)
                    153:        register Text *t;
                    154: {
                    155:        register i;
                    156:        for(i=0; i<NL; i++)
                    157:                if(t->l[i].textfn==0)
                    158:                        return &t->l[i];
                    159:        return 0;
                    160: }
                    161: duplicate(l, r, f, close)
                    162:        register Flayer *l;
                    163:        Rectangle r;
                    164:        Font *f;
                    165: {
                    166:        register Text *t=(Text *)l->user1;
                    167:        register Flayer *nl=findl(t);
                    168:        if(nl){
                    169:                cursswitch(&deadmouse);
                    170:                flnew(nl, gettext, l->user0, (char *)t);
                    171:                flinit(nl, r, f);
                    172:                nl->origin=l->origin;
                    173:                flinsert(nl, (*l->textfn)(l, l->f.nchars), l->origin);
                    174:                flsetselect(nl, l->p0, l->p1);
                    175:                if(close){
                    176:                        flclose(l);
                    177:                        if(l==which)
                    178:                                which=0;
                    179:                }else
                    180:                        t->nwin++;
                    181:                current(nl);
                    182:                hcheck(t->tag);
                    183:        }
                    184:        cursswitch(cursor);
                    185: }
                    186: getr(rp, block)
                    187:        Rectangle *rp;
                    188: {
                    189:        Point p;
                    190:        Rectangle r;
                    191:        *rp=getrectb(1,block);
                    192:        if(rp->corner.x && rp->corner.x-rp->origin.x<=5 && rp->corner.y-rp->origin.y<=5){
                    193:                p=rp->origin;
                    194:                r=cmd.l[cmd.front].entire;
                    195:                *rp=Drect;
                    196:                if(cmd.nwin==1){
                    197:                        if (p.y <= r.origin.y)
                    198:                                rp->corner.y = r.origin.y;
                    199:                        else if (p.y >= r.corner.y)
                    200:                                rp->origin.y = r.corner.y;
                    201:                        else if (p.x <= r.origin.x)
                    202:                                rp->corner.x = r.origin.x;
                    203:                        else if (p.x >= r.corner.x)
                    204:                                rp->origin.x = r.corner.x;
                    205:                }
                    206:        }
                    207:        return rectclip(rp, Drect) &&
                    208:           rp->corner.x-rp->origin.x>100 && rp->corner.y-rp->origin.y>40;
                    209: }
                    210: snarf(t, w)
                    211:        register Text *t;
                    212: {
                    213:        register Flayer *l= &t->l[w];
                    214:        if(l->p1>l->p0){
                    215:                snarflen=l->p1-l->p0;
                    216:                outTsll(Tsnarf, t->tag, l->p0, l->p1);
                    217:        }
                    218: }
                    219: cut(t, w, save)
                    220:        Text *t;
                    221: {
                    222:        register long p0, p1;
                    223:        if((p0=t->l[w].p0)==(p1=t->l[w].p1))
                    224:                return;
                    225:        if(save)
                    226:                snarf(t, w);
                    227:        outTsll(Tcut, t->tag, p0, p1);
                    228:        t->lock++;
                    229:        flsetselect(&t->l[w], p0, p0);
                    230:        hcut(t->tag, p0, p1-p0);
                    231:        hcheck(t->tag);
                    232: }
                    233: paste(t, w)
                    234:        Text *t;
                    235: {
                    236:        long p0=t->l[w].p0;
                    237:        if(snarflen){
                    238:                cut(t, w, 0);
                    239:                t->lock++;
                    240:                outTsl(Tpaste, t->tag, p0);
                    241:        }
                    242: }
                    243: strlen(s)
                    244:        register uchar *s;
                    245: {
                    246:        register n=0;
                    247:        while(*s++)
                    248:                n++;
                    249:        return n;
                    250: }
                    251: alnum(c)
                    252:        register c;
                    253: {
                    254:        return ('0'<=c && c<='9') || (c=='_') ||
                    255:               ('a'<=c && c<='z') || ('A'<=c && c<='Z');
                    256: }
                    257: raspc(r, p)
                    258:        register Rasp *r;
                    259:        register long p;
                    260: {
                    261:        rload(r, p, p+1);
                    262:        return scratch[0];      /* will be 0 if p is in a hole */
                    263: }
                    264: long
                    265: ctlw(r, o, p)
                    266:        register Rasp *r;
                    267:        register long o, p;
                    268: {
                    269:        register c;
                    270:        if(--p<o)
                    271:                return o;
                    272:        if(raspc(r, p)=='\n')
                    273:                return p;
                    274:        for(; p>=o && !alnum(c=raspc(r, p)); --p)
                    275:                if(c=='\n')
                    276:                        return p+1;
                    277:        for(; p>o && alnum(raspc(r, p-1)); --p)
                    278:                ;
                    279:        return p>=o? p : o;
                    280: }
                    281: #define        ESC             0x1B
                    282: type(l)        /* what a bloody mess this is */
                    283:        register Flayer *l;
                    284: {
                    285:        Text *t=(Text *)l->user1;
                    286:        uchar buf[100];
                    287:        register uchar *p=buf;
                    288:        register c, backspacing=0;
                    289:        register long a;
                    290:        if(lock || t->lock)
                    291:                return;
                    292:        if((a=l->p0)!=l->p1){
                    293:                cut(t, t->front, 1);
                    294:                return; /* it may now be locked */
                    295:        }
                    296:        while(!backspacing && (c=kbdchar())>0 && c!=ESC)
                    297:                switch(c&=0x7F){
                    298:                case '\027':
                    299:                case '\b':
                    300:                        backspacing=1;
                    301:                        break;
                    302:                case '\r':
                    303:                        c='\n';
                    304:                default:
                    305:                        *p++=c;
                    306:                        break;
                    307:                }
                    308:        if(p>buf){
                    309:                if(typeaddr<0)
                    310:                        typeaddr=a;
                    311:                *p=0;
                    312:                hgrow(t->tag, a, (long)(p-buf), 0);
                    313:                t->lock++;      /* pretend we Trequest'ed */
                    314:                hdata(t->tag, a, buf, (int)(p-buf));
                    315:                if(t==&cmd && a+(p-buf)==t->rasp.nbytes && p[-1]=='\n'){
                    316:                        setlock();
                    317:                        outcmd();
                    318:                        outTslS(Ttype, t->tag, a, buf);
                    319:                                typeaddr= -1;
                    320:                }else
                    321:                        outTslS(Ttype, t->tag, a, buf);
                    322:                l->p0=l->p1=(a+=p-buf);
                    323:                center(l, a);
                    324:        }
                    325:        if(!lock && backspacing && l->f.p0>0){
                    326:                l->p1=a;
                    327:                l->p0=c=='\b'? a-1 : ctlw(&t->rasp, l->origin, a);
                    328:                cut(t, t->front, 0);
                    329:                if(typeaddr>=l->p0)
                    330:                        typeaddr=l->p0;
                    331:        }else{
                    332:                if(c==ESC && typeaddr>=0){
                    333:                        l->p0=typeaddr, l->p1=a;
                    334:                        typeaddr= -1;
                    335:                }
                    336:                for(l=t->l; l<&t->l[NL]; l++)
                    337:                        if(l->textfn)
                    338:                                flsetselect(l, l->p0, l->p1);
                    339:        }
                    340: }
                    341: center(l, a)
                    342:        register Flayer *l;
                    343:        register long a;
                    344: {
                    345:        register Text *t=(Text *)l->user1;
                    346:        if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
                    347:                if(a>t->rasp.nbytes)
                    348:                        a=t->rasp.nbytes;
                    349:                outTsll(Torigin, t->tag, a, 2L);
                    350:                outTs(Tunlockfile, t->tag);
                    351:                t->lock++;
                    352:                return 1;
                    353:        }
                    354:        return 0;
                    355: }
                    356: outcmd(){
                    357:        if(work)
                    358:                outTsll(Tworkfile, ((Text *)work->user1)->tag, work->p0, work->p1);
                    359: }
                    360: panic(s)
                    361:        char *s;
                    362: {
                    363:        rectf(D, Drect, F_XOR);
                    364:        string(&defont, s, D, add(Drect.origin, Pt(4, 4)), F_STORE);
                    365:        sleep(30);
                    366:        exit(1);
                    367: }
                    368: 
                    369: strgrow(s, n, want)    /* can always toss the old data when called */
                    370:        uchar **s;
                    371:        long *n;
                    372: {
                    373:        if(*n>=want)
                    374:                return;
                    375:        gcfree(*s);
                    376:        GCALLOC(want, s);
                    377:        *n=want;
                    378: }
                    379: uchar **
                    380: gettext(l, n)
                    381:        register Flayer *l;
                    382:        long n;
                    383: {
                    384:        register Text *t=(Text *)l->user1;
                    385:        rload(&t->rasp, l->origin, l->origin+n);
                    386:        return &scratch;
                    387: }
                    388: long
                    389: scrtotal(l)
                    390:        Flayer *l;
                    391: {
                    392:        return ((Text *)l->user1)->rasp.nbytes;
                    393: }
                    394: uchar *
                    395: ALLOC(n)
                    396: {
                    397:        register uchar *p=(uchar *)alloc(n);
                    398:        if(p==0)
                    399:                panic("ALLOC");
                    400:        return p;
                    401: }
                    402: GCALLOC(n, w)
                    403:        uchar **w;
                    404: {
                    405:        register i, j;
                    406:        register Text *t;
                    407:        register Flayer *l;
                    408:        if(gcalloc((unsigned long)n, (char **)w)==0){
                    409:                for(i=0; i<nname; i++)
                    410:                        if(t=text[i]){
                    411:                                /*raspcleanup(t); - uncache worthless stuff*/
                    412:                                /*rclean(&t->rasp); (Can we do this if !t->lock?) */
                    413:                                for(j=0,l= &t->l[0]; j<NL; j++,l++)
                    414:                                        if(l->textfn && l->visible==Some && l->f.b){
                    415:                                                bfree(l->f.b);
                    416:                                                l->f.b=0;
                    417:                                        }
                    418:                        }
                    419:                if(gcalloc((unsigned long)n, w)==0)
                    420:                        panic("GCALLOC");
                    421:        }
                    422: }

unix.superglobalmegacorp.com

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