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