Logo Search packages:      
Sourcecode: less version File versions

brac.c

/*
 * Copyright (C) 1984-2002  Mark Nudelman
 *
 * You may distribute under the terms of either the GNU General Public
 * License or the Less License, as specified in the README file.
 *
 * For more information about less, or for information on how to 
 * contact the author, see the README file.
 */


/*
 * Routines to perform bracket matching functions.
 */

#include "less.h"
#include "position.h"

/*
 * Try to match the n-th open bracket 
 *  which appears in the top displayed line (forwdir),
 * or the n-th close bracket 
 *  which appears in the bottom displayed line (!forwdir).
 * The characters which serve as "open bracket" and 
 * "close bracket" are given.
 */
      public void
match_brac(obrac, cbrac, forwdir, n)
      register int obrac;
      register int cbrac;
      int forwdir;
      int n;
{
      register int c;
      register int nest;
      POSITION pos;
      int (*chget)();

      extern int ch_forw_get(), ch_back_get();

      /*
       * Seek to the line containing the open bracket.
       * This is either the top or bottom line on the screen,
       * depending on the type of bracket.
       */
      pos = position((forwdir) ? TOP : BOTTOM);
      if (pos == NULL_POSITION || ch_seek(pos))
      {
            if (forwdir)
                  error("Nothing in top line", NULL_PARG);
            else
                  error("Nothing in bottom line", NULL_PARG);
            return;
      }

      /*
       * Look thru the line to find the open bracket to match.
       */
      do
      {
            if ((c = ch_forw_get()) == '\n' || c == EOI)
            {
                  if (forwdir)
                        error("No bracket in top line", NULL_PARG);
                  else
                        error("No bracket in bottom line", NULL_PARG);
                  return;
            }
      } while (c != obrac || --n > 0);

      /*
       * Position the file just "after" the open bracket
       * (in the direction in which we will be searching).
       * If searching forward, we are already after the bracket.
       * If searching backward, skip back over the open bracket.
       */
      if (!forwdir)
            (void) ch_back_get();

      /*
       * Search the file for the matching bracket.
       */
      chget = (forwdir) ? ch_forw_get : ch_back_get;
      nest = 0;
      while ((c = (*chget)()) != EOI)
      {
            if (c == obrac)
                  nest++;
            else if (c == cbrac && --nest < 0)
            {
                  /*
                   * Found the matching bracket.
                   * If searching backward, put it on the top line.
                   * If searching forward, put it on the bottom line.
                   */
                  jump_line_loc(ch_tell(), forwdir ? -1 : 1);
                  return;
            }
      }
      error("No matching bracket", NULL_PARG);
}

Generated by  Doxygen 1.6.0   Back to index