// B R A C K E T // Surrounds the current selection with [,(,{,',",< get "bravo1.df" get "com.df" get "st.df" get "rn1.df" get "display.df" get "select.df" get "char.df" //incoming procedures external [ DelInKbdBuf bravochar putsonts umin umax errhlt move ugt ult SetRegionW SetRegionSys insertc setupdate setsel invalidatesel updateunderline underline getvch invalidatedisplay invalidateband deletea mapcp ] //outgoing procedure external [ EncBracket Bracket ] //incoming statics external [ tsread selaux vrlwsys mpWwWwd vdoc vcp vmapstatus rgmaccp vundocom dcpendofdoc vlook1 vlook2 ] //local manifest manifest [ statusPut= 1 statusDel= 2 statusMatch= 1 statusUnmatch= 2 chMatch= $y chNoMatch= $n chComTerm= chdel ] //-=-=-=-=-=-=-=-=-==- let Bracket(cf) = valof //-=-=-=-=-=-==-=-=--= [ //store chcom in w0 for Esc and Undo //store mode (statusPut,statusDel) in w1 let chcom = cf>>CF.chcom let w1= cf>>CF.w1 if cf>>CF.frepeat then resultis selecton w1 into [ case statusPut: PutBrackets(cf) case statusDel: DelBrackets(cf) ] if vundocom then resultis selecton w1 into [ case statusPut: DelBrackets(cf) case statusDel: PutBrackets(cf) ] resultis PutBrackets(cf) ] //-=-=-=-=-=-=-=-=-=-=-= and PutBrackets(cf) = valof //-=-=-=-=-=-=-=-===-=-= [ let chcom = cf>>CF.chcom let sbch= vec 1 let sel= cf>>CF.sel let doc= sel>>SEL.doc let cpfirst= sel>>SEL.cpfirst let cplast= sel>>SEL.cplast let cpMac = umin(cplast+1, rgmaccp!doc - dcpendofdoc) let trid=0 cf>>CF.w1= statusPut if cf>>CF.frepeat % vundocom then chcom= cf>>CF.w0 cf>>CF.w0= chcom unless ult(cpfirst,cpMac) do [ SetRegionSys(risyspast,39,50) //sel empty- term resultis abmsg ] //chcom= selecton chcom into // [ // case $]: $[; // case $}: ${; // case $>: $<; // case $): $(; // default: chcom // ] sbch>>SB.cch=1 sbch>>SB.ch^0= selecton chcom into [ case $[: $]; case ${: $}; case $<: $>; case $(: $); default: chcom ] vmapstatus = statusblind mapcp(doc, cpfirst) let tlook1 = vlook1 let tlook2 = vlook2 insertc(doc, cpMac, sbch, tlook1, tlook2) sbch>>SB.ch^0= chcom insertc(doc, cpfirst, sbch, tlook1, tlook2) sel>>SEL.cplast=cplast+2 SetRegionW(vrlwsys,0,sbch) trid<>CF.sel let doc= sel>>SEL.doc let cpfirst= sel>>SEL.cpfirst let cplast= sel>>SEL.cplast let ww= sel>>SEL.ww let cpMac= umin (cplast+1, rgmaccp!doc - dcpendofdoc) let trid=0 cf>>CF.w1= statusDel unless ult(cpfirst,cpMac-1) do [ SetRegionSys(risyspast,186,50); resultis abmsg ] vmapstatus= statusblind vdoc=doc vcp=cplast let chmatch= selecton getvch() into [ case $]: $[; case $}: ${; case $): $(; case $>: $<; case $': $'; case $": $"; default: 0 ] if chmatch eq 0 then [ SetRegionSys(risyspast,186,50); resultis abmsg ] vmapstatus=statusblind vcp= cpfirst test chmatch eq getvch() ifso [ cf>>CF.w0= chmatch deletea(doc,cplast,cplast) deletea(doc,cpfirst,cpfirst) invalidateband(doc,cpfirst,cplast) sel>>SEL.cplast= cplast - 2 let sbch=vec 1 sbch>>SB.cch=1 sbch>>SB.ch^0=chmatch SetRegionW(vrlwsys,0,sbch) trid<>WWD.fUpdate = true resultis abmsg ] ifnot [ SetRegionSys(risyspast,186,50); resultis abmsg ] ] //=--=-=-=-=-=-=-=-=-=-=-== and EncBracket(cf) = valof //-=-=-==-=-=-=-=-=-=-=--=-= [ // mode (statusMatch,statusUnmatch) stored in w1 let w1= cf>>CF.w1 if cf>>CF.frepeat then resultis selecton w1 into [ case statusMatch: MatchBracket(cf) case statusUnmatch: UnmatchBracket(cf) ] if vundocom then resultis selecton w1 into [ case statusMatch: UnmatchBracket(cf) case statusUnmatch: MatchBracket(cf) ] resultis MatchBracket(cf) ] //=--=-=-=-=-=-=-=-=-=-=-== and MatchBracket(cf) = valof //-=-=-==-=-=-=-=-=-=-=--=-= [ let char= nil let chresult= nil let cloops= 0 if tsread then [ char= bravochar() if char eq chNoMatch then [ SetRegionSys(risyspast,212,50) resultis abmsg ] if char eq chComTerm then [ SetRegionSys(risyspast,210,50) resultis abmsg ] ] cf>>CF.w1= statusMatch let chr= cf>>CF.chcom test cf>>CF.frepeat % vundocom ifso chr= cf>>CF.w0 ifnot [ chr= cf>>CF.chcom; cf>>CF.w0= chr ] let chl= selecton chr into [ case $): $(; case $]: $[; case $}: ${; case $>: $<; default: errhlt("matchbracket") ] let cneedl= 0 let cneedr= 0 let sel= cf>>CF.sel let doc= sel>>SEL.doc let maccp= rgmaccp!doc - dcpendofdoc let cpfirst= sel>>SEL.cpfirst let cplast= sel>>SEL.cplast let char= nil let cpl= nil let cpr= nil move(sel,selaux,sell) //selaux used by undo //count selection - start from left vmapstatus= statusblind vdoc= doc vcp= cpfirst+1 for cp= cpfirst+1 to cplast-1 do [ if (cloops & #377) eq 0 then if DelInKbdBuf(true) ne 0 then [ SetRegionSys(risyspast, 210, 50) chresult= chComTerm goto lbpts ] cloops= cloops+1 char= getvch() if char eq chl then cneedr= cneedr + 1 if char eq chr then test cneedr eq 0 ifso cneedl= cneedl + 1 ifnot cneedr= cneedr - 1 ] cneedl= cneedl + 1 cneedr= cneedr + 1 if cpfirst eq cplast then //special case if one-char [ or ] [ vcp= cpfirst vmapstatus= statusblind char= getvch() if char eq chl then cplast= cpfirst + 1 if char eq chr then cpfirst= cplast - 1 ] if OuterMatch(sel,chl,chr) then //special case if match [ cneedl= cneedl + 1 cneedr= cneedr + 1 ] //start at cpfirst(backwards) and cplast(forwards) //going forwards vmapstatus= statusblind vcp= cplast for cp= cplast to maccp-1 do [ if (cloops & #377) eq 0 then if DelInKbdBuf(true) ne 0 then [ SetRegionSys(risyspast, 210, 50) chresult= chComTerm goto lbpts ] cloops= cloops+1 char= getvch() if char eq chr then cneedr= cneedr-1 if char eq chl then cneedr= cneedr+1 if cneedr eq 0 then [ cpr= cp break ] ] if cneedr ne 0 then [ chresult= chNoMatch SetRegionSys(risyspast,212,50) goto lbpts ] //going backwards for cp= cpfirst to 0 by -1 do [ if (cloops & #377) eq 0 then if DelInKbdBuf(true) ne 0 then [ SetRegionSys(risyspast,210,50) chresult= chComTerm goto lbpts ] cloops= cloops+1 vmapstatus= statusblind vcp= cp char= getvch() if char eq chl then cneedl= cneedl-1 if char eq chr then cneedl= cneedl+1 if cneedl eq 0 then [ cpl = cp break ] ] if cneedl ne 0 then [ SetRegionSys(risyspast,212,50) chresult= chNoMatch goto lbpts ] setsel(sel,cpl,cpr) SetRegionSys(risyspast,25,210) chresult= chMatch lbpts: unless tsread do putsonts(chresult) resultis abmsg ] //-=-=-=-=-=-==-=-=-=--= and OuterMatch(sel,chl,chr) = valof //-=-=-=-=-=-=-=-=-=-=-=- [ vmapstatus=statusblind vcp= sel>>SEL.cpfirst if chl ne getvch() then resultis false vmapstatus=statusblind vcp= sel>>SEL.cplast resultis getvch() eq chr ] //-=-=-=-=-=-==-=-=-=--= and UnmatchBracket(cf) = valof //-=-=-=-=-=-=-=-=-=-=-=- [ let sel= cf>>CF.sel SetRegionSys(risyspast,25,211) invalidatesel(sel) underline(uloff,sel) move(selaux,sel,sell) updateunderline() resultis abmsg ]