|
|
1.1 ! root 1: #include <jerq.h> ! 2: #include "frame.h" ! 3: Point ! 4: ptofchar(t, cn) ! 5: register Frame *t; ! 6: register cn; ! 7: { ! 8: register Nchar *np; ! 9: register l, c; /* line number, char number */ ! 10: /* nlines-1 because we must do the frameop */ ! 11: for(l=0,c=0,np=t->cpl; l<t->nlines-1 && c+*np<cn; l++) ! 12: c+= *np++; ! 13: frameop(t, opnull, startline(t, l), t->str.s+c, cn-c); ! 14: return endpoint; ! 15: } ! 16: /* ! 17: * Index of character at position pt in frame t. ! 18: * Returns (efficiently!) number of chars in frame if pt is off end. ! 19: */ ! 20: int ! 21: charofpt(t, pt) ! 22: register Frame *t; ! 23: Point pt; ! 24: { ! 25: register l, c, starty; /* line, char posn */ ! 26: register i, y=pt.y; ! 27: register Nchar *np; ! 28: register char *s; ! 29: pt.y-=(y-t->rect.origin.y)%newlnsz; /* on a line bdry */ ! 30: y=pt.y-t->rect.origin.y; ! 31: if((y/=newlnsz) > t->nlines) /* y is line containing pt */ ! 32: y=t->nlines; /* not nlines-1 because of upcoming if */ ! 33: for(c=0,l=0,np=t->cpl; l<y; l++) ! 34: c+= *np++; ! 35: if(y < t->nlines){ ! 36: endpoint=startline(t, y); ! 37: starty=endpoint.y; ! 38: s=t->str.s+c; ! 39: for(i=0; i<*np; i++,c++){ ! 40: frameop(t, opnull, endpoint, s++, 1/* sigh */); ! 41: if(endpoint.x>pt.x || endpoint.y!=starty) ! 42: break; ! 43: } ! 44: } ! 45: return c; ! 46: } ! 47: /* ! 48: * Point at start of line n in frame t ! 49: */ ! 50: Point ! 51: startline(t, n) ! 52: register Frame *t; ! 53: register n; ! 54: { ! 55: Point pt; ! 56: pt=t->rect.origin; ! 57: pt.y+=n*newlnsz; ! 58: return pt; ! 59: } ! 60: /* ! 61: * Calculate and set the number of characters per line in lines ! 62: * first through last, inclusive, in frame t. ! 63: */ ! 64: setcpl(t, first, last) ! 65: register Frame *t; ! 66: { ! 67: register Nchar *np; ! 68: register l, c; /* lines, characters */ ! 69: ! 70: if(last>=t->nlines) ! 71: last=t->nlines-1; ! 72: for(c=0,l=0,np=t->cpl; l<first; l++) ! 73: c+= *np++; ! 74: /* c now tracks number of chars before line of interest */ ! 75: while(l<=last && c<t->str.n) ! 76: c+= *np++=cpl(t, c, startline(t, l++)); ! 77: while(l++ <= last) ! 78: *np++=0; ! 79: } ! 80: /* Frameop operator to calculate number of chars in a line */ ! 81: static nc, lasty, wrapped; ! 82: /*ARGSUSED*/ ! 83: void ! 84: opcpl(t, p, q, cp, n) ! 85: Frame *t; ! 86: Point p, q; ! 87: char *cp; ! 88: int n; ! 89: { ! 90: if(p.y==lasty) ! 91: nc+=n; ! 92: else ! 93: wrapped=TRUE; ! 94: } ! 95: cpl(t, posn, pt) ! 96: register Frame *t; ! 97: int posn; ! 98: Point pt; ! 99: { ! 100: register ntotry=(t->rect.corner.x-t->rect.origin.x)/cwidth('1'); ! 101: /* ! 102: * If there are no control chars, you can't get more than ! 103: * (linewidth/charwidth) chars on a line, so to be safe we ! 104: * keep trying if the frameop didn't reach the end of the line. ! 105: */ ! 106: lasty=pt.y; ! 107: do{ ! 108: if((ntotry+=7) > t->str.n-posn) /* 7 is arbitrary */ ! 109: ntotry=t->str.n-posn; ! 110: nc=0; ! 111: wrapped=FALSE; ! 112: frameop(t, opcpl, pt, t->str.s+posn, ntotry); ! 113: }while(!wrapped && complete && posn+ntotry<t->str.n); ! 114: return nc; ! 115: } ! 116: /* ! 117: * Scroll first through last entries in the cpl array by n. ! 118: * n<0 ==> up screen, n>0 ==> down screen. First and last must ! 119: * be in the correct order in the call, i.e. first>last for n>0, ! 120: * first<last for n<0. ! 121: */ ! 122: scrollcpl(t, first, last, n) ! 123: Frame *t; ! 124: register first, last, n; ! 125: { ! 126: register i; ! 127: register Nchar *np= &t->cpl[first]; ! 128: register delta=(n>0)? -1 : 1; ! 129: if(first>last){ ! 130: i=first; ! 131: first=last; ! 132: last=i; ! 133: } ! 134: for(i=first; i<=last; i++,np+=delta) ! 135: np[n]=np[0]; ! 136: } ! 137: lineno(t, y) ! 138: register Frame *t; ! 139: register y; ! 140: { ! 141: return (y-t->rect.origin.y)/newlnsz; ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.