29d7b190c2
compiler-time type checking, and also causes problems for targets where multiple incompatible calling conventions may be selected based on argument types. This change switches less(1) to ANSI prototypes. While there, we also remove use of "register", and attempt to use "const" a bit better now that the compiler can check argument types. Reviewed by: cem, emaste MFC after: 3 weeks Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D10152
97 lines
2.2 KiB
C
97 lines
2.2 KiB
C
/*
|
|
* Copyright (C) 1984-2015 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, 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(int obrac, int cbrac, int forwdir, int n)
|
|
{
|
|
int c;
|
|
int nest;
|
|
POSITION pos;
|
|
int (*chget)(void);
|
|
|
|
extern int ch_forw_get(void), ch_back_get(void);
|
|
|
|
/*
|
|
* 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);
|
|
}
|