Annotation of researchv9/jerq/src/sam/term/main.c, revision 1.1

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

unix.superglobalmegacorp.com

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