Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull void
4 76193d7c 2003-09-30 devnull moveto(File *f, Range r)
5 76193d7c 2003-09-30 devnull {
6 76193d7c 2003-09-30 devnull Posn p1 = r.p1, p2 = r.p2;
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull f->dot.r.p1 = p1;
9 76193d7c 2003-09-30 devnull f->dot.r.p2 = p2;
10 76193d7c 2003-09-30 devnull if(f->rasp){
11 76193d7c 2003-09-30 devnull telldot(f);
12 76193d7c 2003-09-30 devnull outTsl(Hmoveto, f->tag, f->dot.r.p1);
13 76193d7c 2003-09-30 devnull }
14 76193d7c 2003-09-30 devnull }
15 76193d7c 2003-09-30 devnull
16 76193d7c 2003-09-30 devnull void
17 76193d7c 2003-09-30 devnull telldot(File *f)
18 76193d7c 2003-09-30 devnull {
19 76193d7c 2003-09-30 devnull if(f->rasp == 0)
20 76193d7c 2003-09-30 devnull panic("telldot");
21 76193d7c 2003-09-30 devnull if(f->dot.r.p1==f->tdot.p1 && f->dot.r.p2==f->tdot.p2)
22 76193d7c 2003-09-30 devnull return;
23 76193d7c 2003-09-30 devnull outTsll(Hsetdot, f->tag, f->dot.r.p1, f->dot.r.p2);
24 76193d7c 2003-09-30 devnull f->tdot = f->dot.r;
25 76193d7c 2003-09-30 devnull }
26 76193d7c 2003-09-30 devnull
27 76193d7c 2003-09-30 devnull void
28 76193d7c 2003-09-30 devnull tellpat(void)
29 76193d7c 2003-09-30 devnull {
30 76193d7c 2003-09-30 devnull outTS(Hsetpat, &lastpat);
31 76193d7c 2003-09-30 devnull patset = FALSE;
32 76193d7c 2003-09-30 devnull }
33 76193d7c 2003-09-30 devnull
34 76193d7c 2003-09-30 devnull #define CHARSHIFT 128
35 76193d7c 2003-09-30 devnull
36 76193d7c 2003-09-30 devnull void
37 76193d7c 2003-09-30 devnull lookorigin(File *f, Posn p0, Posn ls)
38 76193d7c 2003-09-30 devnull {
39 76193d7c 2003-09-30 devnull int nl, nc, c;
40 76193d7c 2003-09-30 devnull Posn p, oldp0;
41 76193d7c 2003-09-30 devnull
42 522b0689 2003-09-30 devnull if(p0 > f->b.nc)
43 522b0689 2003-09-30 devnull p0 = f->b.nc;
44 76193d7c 2003-09-30 devnull oldp0 = p0;
45 76193d7c 2003-09-30 devnull p = p0;
46 76193d7c 2003-09-30 devnull for(nl=nc=c=0; c!=-1 && nl<ls && nc<ls*CHARSHIFT; nc++)
47 76193d7c 2003-09-30 devnull if((c=filereadc(f, --p)) == '\n'){
48 76193d7c 2003-09-30 devnull nl++;
49 76193d7c 2003-09-30 devnull oldp0 = p0-nc;
50 76193d7c 2003-09-30 devnull }
51 76193d7c 2003-09-30 devnull if(c == -1)
52 76193d7c 2003-09-30 devnull p0 = 0;
53 76193d7c 2003-09-30 devnull else if(nl==0){
54 76193d7c 2003-09-30 devnull if(p0>=CHARSHIFT/2)
55 76193d7c 2003-09-30 devnull p0-=CHARSHIFT/2;
56 76193d7c 2003-09-30 devnull else
57 76193d7c 2003-09-30 devnull p0 = 0;
58 76193d7c 2003-09-30 devnull }else
59 76193d7c 2003-09-30 devnull p0 = oldp0;
60 76193d7c 2003-09-30 devnull outTsl(Horigin, f->tag, p0);
61 76193d7c 2003-09-30 devnull }
62 76193d7c 2003-09-30 devnull
63 76193d7c 2003-09-30 devnull int
64 76193d7c 2003-09-30 devnull alnum(int c)
65 76193d7c 2003-09-30 devnull {
66 76193d7c 2003-09-30 devnull /*
67 76193d7c 2003-09-30 devnull * Hard to get absolutely right. Use what we know about ASCII
68 76193d7c 2003-09-30 devnull * and assume anything above the Latin control characters is
69 76193d7c 2003-09-30 devnull * potentially an alphanumeric.
70 76193d7c 2003-09-30 devnull */
71 76193d7c 2003-09-30 devnull if(c<=' ')
72 76193d7c 2003-09-30 devnull return 0;
73 76193d7c 2003-09-30 devnull if(0x7F<=c && c<=0xA0)
74 76193d7c 2003-09-30 devnull return 0;
75 76193d7c 2003-09-30 devnull if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
76 76193d7c 2003-09-30 devnull return 0;
77 76193d7c 2003-09-30 devnull return 1;
78 76193d7c 2003-09-30 devnull }
79 76193d7c 2003-09-30 devnull
80 76193d7c 2003-09-30 devnull int
81 76193d7c 2003-09-30 devnull clickmatch(File *f, int cl, int cr, int dir, Posn *p)
82 76193d7c 2003-09-30 devnull {
83 76193d7c 2003-09-30 devnull int c;
84 76193d7c 2003-09-30 devnull int nest = 1;
85 76193d7c 2003-09-30 devnull
86 76193d7c 2003-09-30 devnull for(;;){
87 76193d7c 2003-09-30 devnull if(dir > 0){
88 522b0689 2003-09-30 devnull if(*p >= f->b.nc)
89 76193d7c 2003-09-30 devnull break;
90 76193d7c 2003-09-30 devnull c = filereadc(f, (*p)++);
91 76193d7c 2003-09-30 devnull }else{
92 76193d7c 2003-09-30 devnull if(*p == 0)
93 76193d7c 2003-09-30 devnull break;
94 76193d7c 2003-09-30 devnull c = filereadc(f, --(*p));
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull if(c == cr){
97 76193d7c 2003-09-30 devnull if(--nest==0)
98 76193d7c 2003-09-30 devnull return 1;
99 76193d7c 2003-09-30 devnull }else if(c == cl)
100 76193d7c 2003-09-30 devnull nest++;
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull return cl=='\n' && nest==1;
103 76193d7c 2003-09-30 devnull }
104 76193d7c 2003-09-30 devnull
105 76193d7c 2003-09-30 devnull Rune*
106 76193d7c 2003-09-30 devnull strrune(Rune *s, Rune c)
107 76193d7c 2003-09-30 devnull {
108 76193d7c 2003-09-30 devnull Rune c1;
109 76193d7c 2003-09-30 devnull
110 76193d7c 2003-09-30 devnull if(c == 0) {
111 76193d7c 2003-09-30 devnull while(*s++)
112 76193d7c 2003-09-30 devnull ;
113 76193d7c 2003-09-30 devnull return s-1;
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull while(c1 = *s++)
117 76193d7c 2003-09-30 devnull if(c1 == c)
118 76193d7c 2003-09-30 devnull return s-1;
119 76193d7c 2003-09-30 devnull return 0;
120 76193d7c 2003-09-30 devnull }
121 76193d7c 2003-09-30 devnull
122 76193d7c 2003-09-30 devnull void
123 76193d7c 2003-09-30 devnull doubleclick(File *f, Posn p1)
124 76193d7c 2003-09-30 devnull {
125 76193d7c 2003-09-30 devnull int c, i;
126 76193d7c 2003-09-30 devnull Rune *r, *l;
127 76193d7c 2003-09-30 devnull Posn p;
128 76193d7c 2003-09-30 devnull
129 522b0689 2003-09-30 devnull if(p1 > f->b.nc)
130 76193d7c 2003-09-30 devnull return;
131 76193d7c 2003-09-30 devnull f->dot.r.p1 = f->dot.r.p2 = p1;
132 76193d7c 2003-09-30 devnull for(i=0; left[i]; i++){
133 76193d7c 2003-09-30 devnull l = left[i];
134 76193d7c 2003-09-30 devnull r = right[i];
135 76193d7c 2003-09-30 devnull /* try left match */
136 76193d7c 2003-09-30 devnull p = p1;
137 76193d7c 2003-09-30 devnull if(p1 == 0)
138 76193d7c 2003-09-30 devnull c = '\n';
139 76193d7c 2003-09-30 devnull else
140 76193d7c 2003-09-30 devnull c = filereadc(f, p - 1);
141 76193d7c 2003-09-30 devnull if(strrune(l, c)){
142 76193d7c 2003-09-30 devnull if(clickmatch(f, c, r[strrune(l, c)-l], 1, &p)){
143 76193d7c 2003-09-30 devnull f->dot.r.p1 = p1;
144 76193d7c 2003-09-30 devnull f->dot.r.p2 = p-(c!='\n');
145 76193d7c 2003-09-30 devnull }
146 76193d7c 2003-09-30 devnull return;
147 76193d7c 2003-09-30 devnull }
148 76193d7c 2003-09-30 devnull /* try right match */
149 76193d7c 2003-09-30 devnull p = p1;
150 522b0689 2003-09-30 devnull if(p1 == f->b.nc)
151 76193d7c 2003-09-30 devnull c = '\n';
152 76193d7c 2003-09-30 devnull else
153 76193d7c 2003-09-30 devnull c = filereadc(f, p);
154 76193d7c 2003-09-30 devnull if(strrune(r, c)){
155 76193d7c 2003-09-30 devnull if(clickmatch(f, c, l[strrune(r, c)-r], -1, &p)){
156 76193d7c 2003-09-30 devnull f->dot.r.p1 = p;
157 76193d7c 2003-09-30 devnull if(c!='\n' || p!=0 || filereadc(f, 0)=='\n')
158 76193d7c 2003-09-30 devnull f->dot.r.p1++;
159 522b0689 2003-09-30 devnull f->dot.r.p2 = p1+(p1<f->b.nc && c=='\n');
160 76193d7c 2003-09-30 devnull }
161 76193d7c 2003-09-30 devnull return;
162 76193d7c 2003-09-30 devnull }
163 76193d7c 2003-09-30 devnull }
164 76193d7c 2003-09-30 devnull /* try filling out word to right */
165 76193d7c 2003-09-30 devnull p = p1;
166 522b0689 2003-09-30 devnull while(p < f->b.nc && alnum(filereadc(f, p++)))
167 76193d7c 2003-09-30 devnull f->dot.r.p2++;
168 76193d7c 2003-09-30 devnull /* try filling out word to left */
169 76193d7c 2003-09-30 devnull p = p1;
170 76193d7c 2003-09-30 devnull while(--p >= 0 && alnum(filereadc(f, p)))
171 76193d7c 2003-09-30 devnull f->dot.r.p1--;
172 76193d7c 2003-09-30 devnull }