Annotation of researchv9/jerq/src/sam/term/box.c, revision 1.1.1.1

1.1       root        1: #include "frame.h"
                      2: 
                      3: #define        SLOP    25
                      4: 
                      5: addbox(f, bn, n)       /* add n boxes after bn, shift the rest up,
                      6:                         * box[bn+n]==box[bn] */
                      7:        register Frame *f;
                      8: {
                      9:        register i;
                     10:        if(bn>f->nbox)
                     11:                panic("addbox");
                     12:        if(f->nbox+n>f->nalloc)
                     13:                growbox(f, n+SLOP);
                     14:        for(i=f->nbox; --i>=bn; )
                     15:                f->box[i+n]=f->box[i];
                     16:        f->nbox+=n;
                     17: }
                     18: closebox(f, n0, n1)    /* inclusive */
                     19:        register Frame *f;
                     20: {
                     21:        register i;
                     22:        if(n0>=f->nbox || n1>=f->nbox || n1<n0)
                     23:                panic("closebox");
                     24:        n1++;
                     25:        for(i=n1; i<f->nbox; i++)
                     26:                f->box[i-(n1-n0)]=f->box[i];
                     27:        f->nbox-=n1-n0;
                     28: }
                     29: delbox(f, n0, n1)      /* inclusive */
                     30:        register Frame *f;
                     31: {
                     32:        if(n0>=f->nbox || n1>=f->nbox || n1<n0)
                     33:                panic("delbox");
                     34:        freebox(f, n0, n1);
                     35:        closebox(f, n0, n1);
                     36: }
                     37: freebox(f, n0, n1)     /* inclusive */
                     38:        register Frame *f;
                     39: {
                     40:        register i;
                     41:        if(n1<n0)
                     42:                return;
                     43:        if(n0>=f->nbox || n1>=f->nbox)
                     44:                panic("freebox");
                     45:        n1++;
                     46:        for(i=n0; i<n1; i++)
                     47:                if(f->box[i].len>=0)
                     48:                        freestr(f->box[i].ptr);
                     49: }
                     50: growbox(f, delta)
                     51:        register Frame *f;
                     52:        register delta;
                     53: {
                     54:        gcrealloc((char **)&f->box,
                     55:                f->nbox*sizeof(Box), (f->nalloc+delta)*sizeof(Box));
                     56:        f->nalloc+=delta;
                     57: }
                     58: gcrealloc(sp, old, new)
                     59:        register char **sp;
                     60: {
                     61:        register i;
                     62:        register long *p, *q;
                     63:        long *hold;
                     64:        if(*sp==0){
                     65:                if(gcalloc(new, sp)==0)
                     66:                        goto Burma;
                     67:                return;
                     68:        }
                     69:        if(new<=old)
                     70:                return;
                     71:        if(*sp==0 || gcalloc(old, &hold)==0)
                     72:     Burma:
                     73:                panic("gcrealloc");
                     74:        old=(old+sizeof(long)-1)/sizeof(long);
                     75:        new=(new+sizeof(long)-1)/sizeof(long);
                     76:        for(p=(long *)*sp,q=hold,i=0; i<old; i++)
                     77:                *q++=*p++;
                     78:        gcfree(*sp);
                     79:        if(gcalloc(new*sizeof(long), sp)==0)
                     80:                goto Burma;
                     81:        for(p=(long *)*sp,q=hold,i=0; i<new; i++)
                     82:                *p++=*q++;
                     83:        gcfree(hold);
                     84: }
                     85: dupbox(f, bn)
                     86:        register Frame *f;
                     87: {
                     88:        if(f->box[bn].len<0)
                     89:                panic("dupbox");
                     90:        addbox(f, bn, 1);
                     91:        if(f->box[bn].len>=0){
                     92:                f->box[bn+1].ptr=allocstr(f->box[bn].len+1);
                     93:                copystr(f->box[bn].ptr, f->box[bn+1].ptr);
                     94:        }
                     95: }
                     96: truncatebox(f, b, n)   /* drop last n chars; no allocation done */
                     97:        register Frame *f;
                     98:        register Box *b;
                     99: {
                    100:        if(b->len<0 || b->len<n)
                    101:                panic("truncatebox");
                    102:        b->ptr[b->len-=n]=0;
                    103:        b->wid=strwidth(f->font, b->ptr);
                    104: }
                    105: chopbox(f, b, n)               /* drop first n chars; no allocation done */
                    106:        register Frame *f;
                    107:        register Box *b;
                    108: {
                    109:        if(b->len<0 || b->len<n)
                    110:                panic("chopbox");
                    111:        copystr(b->ptr+n, b->ptr);
                    112:        b->len-=n;
                    113:        b->wid=strwidth(f->font, b->ptr);
                    114: }
                    115: splitbox(f, bn, n)
                    116:        register Frame *f;
                    117:        register bn, n;
                    118: {
                    119:        dupbox(f, bn);
                    120:        truncatebox(f, &f->box[bn], f->box[bn].len-n);
                    121:        chopbox(f, &f->box[bn+1], n);
                    122: }
                    123: mergebox(f, bn)                /* merge bn and bn+1 */
                    124:        register Frame *f;
                    125: {
                    126:        register Box *b=&f->box[bn];
                    127:        insure(b, b[0].len+b[1].len+1);
                    128:        copystr(b[1].ptr, b[0].ptr+b[0].len);
                    129:        b[0].wid+=b[1].wid;
                    130:        b[0].len+=b[1].len;
                    131:        delbox(f, bn+1, bn+1);
                    132: }
                    133: findbox(f, bn, p, q)   /* find box containing q and put q on a box boundary */
                    134:        register bn;
                    135:        register Frame *f;
                    136:        register Posn p, q;
                    137: {
                    138:        register Box *b;
                    139:        for(b=&f->box[bn]; bn<f->nbox && p+LEN(b)<=q; bn++, b++)
                    140:                p+=LEN(b);
                    141:        if(p!=q)
                    142:                splitbox(f, bn++, q-p);
                    143:        return bn;
                    144: }

unix.superglobalmegacorp.com

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