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