{{{  comments
; Jump from [,{ or ( to a matching ],} or ).
; if no match can be found, a errormessage appears.
; matching-fence-y and matching-fence-x are set to the calling position
}}}
@if-using not(GO-MATCH)
  @use (GO-MATCH)
  {{{  libs
  {{{F fun/pre-char
  :::F fun/pre-char
  }}}
  {{{F fun/next-char
  :::F fun/next-char
  }}}
  {{{F fun/error
  :::F fun/error
  }}}
  }}}
  {{{  vars
  ( defvar
     ( matching-fence-y ; calling-position
       matching-fence-x ;        "
       fence-counter    ; number of found fences
       s-f              ; start-fence-char
       e-f              ; end-fence-char
       d-f              ; directorion of search
       @if-using (SCR-OFF)
          y             ; number of search-steps till screen off
       @fi
     )
  )
  }}}
  {{{  goto-matching-fence
  ( deffun goto-matching-fence
     @if-using (SCR-OFF)
     ( local
        ( y )
     @fi
        (
          @if-using (SCR-OFF)
             set-counter y 128
          @fi
          {{{  store current position
          set-counter matching-fence-y store-line
          set-counter matching-fence-x store-pos
          }}}
          if not(test-text) ( return-from-macro ) fi
          {{{  store fence-info
          set-counter fence-counter 1
          case
           ( test-char "{ ( set-counter s-f "{ set-counter e-f "} set-counter d-f 1 ) )
           ( test-char "} ( set-counter s-f "} set-counter e-f "{ set-counter d-f 0 ) )
           ( test-char "[ ( set-counter s-f "[ set-counter e-f "] set-counter d-f 1 ) )
           ( test-char "] ( set-counter s-f "] set-counter e-f "[ set-counter d-f 0 ) )
           ( test-char "( ( set-counter s-f "( set-counter e-f ") set-counter d-f 1 ) )
           ( test-char ") ( set-counter s-f ") set-counter e-f "( set-counter d-f 0 ) )
          default
           ( return-from-macro )
          esac
          }}}
          do
           {{{  check one character
           ( if counter>0 d-f
              ( forward-text-character )
             else
              ( previous-text-character )
             fi
             case
              ( test-char-counter s-f
                 ( set-counter fence-counter +(fence-counter 1))
              )
              ( test-char-counter e-f
                 ( set-counter fence-counter +(fence-counter -1))
              )
             esac
             @if-using (SCR-OFF)
                if counter>0 y
                 ( set-counter y +(y -1)
                   if counter-0 y ( screen-off ) fi
                 )
                fi
             @fi
           )
           }}}
          while not(or(test-bottom test-top counter-0 fence-counter))
          @if-using (SCR-OFF)
             if counter-0 y ( screen-on redraw-display ) fi
          @fi
          if or(test-top,test-bottom)
           {{{  failed!
           ( goto-line-counter matching-fence-y
             goto-counter matching-fence-x
             failed
           )
           }}}
          fi
        )
     @if-using (SCR-OFF)
     )
     @fi
  )
  }}}
  {{{  undeclare
  ( undeclare ( fence-counter s-f e-f d-f @if-using (SCR-OFF) y @fi ) )
  }}}
@fi
