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