|
|
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: extern doubleclickOK;
8:
9: frselect(f, pt)
10: register Frame *f;
11: Point pt;
12: {
13: register fix, var, oldvar;
14: if(f->s1 != f->s2){
15: selectf(f, F_XOR);
16: f->nullsel=0; /* no double clicks this time */
17: }
18: fix=charofpt(f, pt); /* fixed point */
19: oldvar=fix; /* moving point tracks mouse */
20: var=fix;
21: while(button1()){
22: if(var!=oldvar){
23: f->s1=oldvar;
24: f->s2=var;
25: order(f);
26: selectf(f, F_XOR);
27: oldvar=var;
28: }
29: var=charofpt(f, mouse.xy);
30: }
31: f->s1=fix;
32: f->s2=oldvar;
33: order(f);
34: if(doubleclickOK && f->nullsel && f->s2==f->s1 && f->lastch==f->s1){
35: f->nullsel=0;
36: matchit(f);
37: selectf(f, F_XOR);
38: doubleclickOK=0;
39: }else{
40: doubleclickOK=f->nullsel=f->s2==f->s1;
41: f->lastch=f->s1;
42: }
43: }
44: order(f)
45: register Frame *f;
46: {
47: register a;
48: if(f->s1 > f->s2){
49: a=f->s1;
50: f->s1=f->s2;
51: f->s2=a;
52: }
53: }
54: static char ltbrack[]="([{<"; /* sorry, only one match per char */
55: static char rtbrack[]=")]}>";
56: static char same[]="\n'`\""; /* match in either direction */
57: extern char *index();
58: matchit(f)
59: register Frame *f;
60: {
61: register i,n=0;
62: register c;
63: register char *s = f->str.s;
64: int ch,me,N = f->str.n;
65: if (f->s1>0 && (i=index(ltbrack, me=s[f->s1-1])-ltbrack)>=0) {
66: ch = rtbrack[i];
67: for (i = f->s1; i<N && !((c=s[i])==ch && n==0); i++)
68: if (c==me)
69: n++;
70: else if (c==ch)
71: n--;
72: if (c==ch && n==0)
73: f->s2=i;
74: }
75: else if (f->s2<N && (i=index(rtbrack, me=s[f->s2])-rtbrack)>=0) {
76: ch = ltbrack[i];
77: for (i = f->s2-1; i>=0 && !((c=s[i])==ch && n==0); i--)
78: if (c==me)
79: n++;
80: else if (c==ch)
81: n--;
82: if (c==ch && n==0)
83: f->s1=i+1;
84: }
85: else if ((f->s1==0 && (me='\n')) || (i=index(same, me=s[f->s1-1])-same)>=0) {
86: for (i = f->s1; i<N && (c=s[i])!=me; i++)
87: ;
88: if (c==me || (me=='\n' && i==N))
89: f->s2=i;
90: }
91: else if ((f->s2==N && (me='\n')) || (i=index(same, me=s[f->s2])-same)>=0) {
92: for (i = f->s2-1; i>0 && (c=s[i])!=me; i--)
93: ;
94: if (c==me)
95: f->s1=i+1;
96: else if (me=='\n' && i==0)
97: f->s1=0;
98: }
99: else {
100: for (i=f->s1; i>0 && isalnum(s[i-1]); i--)
101: ;
102: f->s1=i;
103: for (i=f->s2; i<N && isalnum(s[i]); i++)
104: ;
105: f->s2=i;
106: }
107: }
108:
109: isalnum(c)
110: register char c;
111: {
112: return (c>='0' && c<='9') ||
113: (c>='a' && c<='z') ||
114: (c>='A' && c<='Z') ||
115: c=='_';
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.