|
|
1.1 root 1: #include <jerq.h>
2: #include "frame.h"
3:
4: Point endpoint;
5: nexttab(t, x)
6: Frame *t;
7: {
8: int eightspaces=cwidth(c)<<3;
9: register xx=x-t->rect.origin.x;
10: return(xx-(xx%eightspaces)+eightspaces+t->rect.origin.x);
11: }
12: void opshow();
13: int complete;
14: frameop(t, op, pt, cp, n)
15: register Frame *t;
16: register void (*op)();
17: Point pt;
18: register unsigned char *cp;
19: register n;
20: {
21: register i, j;
22: Point startpt;
23: register unsigned char *startcp;
24: complete=0;
25: endpoint=pt;
26: i=0; /* Not in for(;;) because of \t's */
27: Top_of_loop:
28: endpoint=pt;
29: for(j=0,startpt=pt,startcp=cp; ; i++,j++,cp++){
30: Continue:
31: if(i>=n)
32: break;
33: if(*cp=='\n'){
34: i++, j++, cp++;
35: Emit_newline:
36: pt.x=t->rect.corner.x;
37: endpoint=pt;
38: /* must do this even if j==0 */
39: (*op)(t, startpt, pt, startcp, j);
40: j=0;
41: startpt.x=t->rect.origin.x;
42: startpt.y+=newlnsz;
43: if(startpt.y >= t->rect.corner.y) /* off screen */
44: return;
45: pt=startpt;
46: startcp=cp;
47: goto Continue;
48: }else if(*cp == '\t'){
49: if(j > 0){
50: /* Emit what's saved up */
51: (*op)(t, startpt, pt, startcp, j);
52: goto Top_of_loop;
53: }
54: if((pt.x=nexttab(t, pt.x)) > t->rect.corner.x)
55: goto Emit_newline;
56: (*op)(t, startpt, pt, cp++, 1);
57: i++;
58: goto Top_of_loop;
59: }else if(*cp!='\r' && *cp<=fontnchars(&defont))
60: if((pt.x+=cwidth(*cp)) > t->rect.corner.x)
61: goto Emit_newline;
62: }
63: if(startpt.y < t->rect.corner.y){
64: endpoint=pt;
65: (*op)(t, startpt, pt, startcp, j);
66: complete=1;
67: }
68: }
69: char genbuf[100];
70: void
71: opdraw(t, p, q, cp, n)
72: Frame *t;
73: Point p, q;
74: register unsigned char *cp;
75: register n;
76: {
77: register char *gp=genbuf;
78: while(n--){
79: if(*cp!='\n' && *cp!='\t' && *cp!='\r')
80: *gp++= *cp;
81: cp++;
82: }
83: *gp=0;
84: p.x++;
85: string(&defont, genbuf, D, p, F_XOR);
86: }
87: draw(t, p, s, n)
88: Frame *t;
89: Point p;
90: char *s;
91: int n;
92: {
93: frameop(t, opdraw, p, s, n);
94: }
95:
96: int F_rectf;
97: /*ARGSUSED*/
98: void
99: oprectf(t, p, q, str, n)
100: register Frame *t;
101: Point p, q;
102: char *str;
103: short n;
104: {
105: rectf(D, Rpt(p, Pt(q.x, q.y+newlnsz)), F_rectf);
106: }
107:
108: /*ARGSUSED*/
109: void
110: opclear(t, p, q, str, n)
111: register Frame *t;
112: Point p, q;
113: char *str;
114: short n;
115: {
116: clear(Rpt(p, Pt(q.x, q.y+newlnsz)), 1);
117: }
118:
119: selectf(t, f)
120: register Frame *t;
121: {
122: F_rectf=f;
123: frameop(t, oprectf, ptofchar(t, t->s1), t->str.s+t->s1, t->s2-t->s1);
124: }
125: void
126: opnull()
127: {}
128: rXOR(r) /* a space-saving routine */
129: Rectangle r;
130: {
131: rectf(D, r, F_XOR);
132: }
133: Rectf(r, f)
134: Rectangle r;
135: Code f;
136: {
137: rectf(D, r, f);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.