|
|
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.