Virgin import of less v415.

This commit is contained in:
delphij 2007-11-16 22:22:17 +00:00
parent 9680b7d49a
commit e2b0c4a1d9
30 changed files with 622 additions and 142 deletions

View File

@ -2,7 +2,7 @@
------------
Less
Copyright (C) 1984-2005 Mark Nudelman
Copyright (C) 1984-2007 Mark Nudelman
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions

View File

@ -13,6 +13,17 @@
======================================================================
Major changes between "less" versions 409 and 415
* New --follow-name option makes F command follow the name of a file
rather than the file descriptor if an open file is renamed.
* Make searching with -i/-I work correctly with non-ASCII text.
* Fix DJGPP build.
======================================================================
Major changes between "less" versions 406 and 409
* Support CSI escape sequences, like SGR escape sequences.
@ -698,3 +709,4 @@

View File

@ -1,7 +1,7 @@
Less, version 409
Less, version 415
This is the distribution of less, version 409, released 12 Oct 2007.
This is the distribution of less, version 415, released 15 Nov 2007.
This program is part of the GNU project (http://www.gnu.org).
This program is free software. You may redistribute it and/or

View File

@ -21,6 +21,12 @@
#include <windows.h>
#endif
#if HAVE_STAT_INO
#include <sys/stat.h>
extern dev_t curr_dev;
extern ino_t curr_ino;
#endif
typedef POSITION BLOCKNUM;
public int ignore_eoi;
@ -98,6 +104,8 @@ static int maxbufs = -1;
extern int autobuf;
extern int sigs;
extern int secure;
extern int screen_trashed;
extern int follow_mode;
extern constant char helpdata[];
extern constant int size_helpdata;
extern IFILE curr_ifile;
@ -195,7 +203,7 @@ fch_get()
*/
if (!(ch_flags & CH_CANSEEK))
return ('?');
if (lseek(ch_file, (off_t)pos, 0) == BAD_LSEEK)
if (lseek(ch_file, (off_t)pos, SEEK_SET) == BAD_LSEEK)
{
error("seek error", NULL_PARG);
clear_eol();
@ -276,6 +284,25 @@ fch_get()
#endif
#endif
slept = TRUE;
#if HAVE_STAT_INO
if (follow_mode == FOLLOW_NAME)
{
/* See whether the file's i-number has changed.
* If so, force the file to be closed and
* reopened. */
struct stat st;
int r = stat(get_filename(curr_ifile), &st);
if (r == 0 && (st.st_ino != curr_ino ||
st.st_dev != curr_dev))
{
/* screen_trashed=2 causes
* make_display to reopen the file. */
screen_trashed = 2;
return (EOI);
}
}
#endif
}
if (sigs)
return (EOI);
@ -648,7 +675,7 @@ ch_flush()
}
#endif
if (lseek(ch_file, (off_t)0, 0) == BAD_LSEEK)
if (lseek(ch_file, (off_t)0, SEEK_SET) == BAD_LSEEK)
{
/*
* Warning only; even if the seek fails for some reason,
@ -711,7 +738,7 @@ ch_delbufs()
while (ch_bufhead != END_OF_CHAIN)
{
bp = ch_bufhead;
bp->next->prev = bp->prev;;
bp->next->prev = bp->prev;
bp->prev->next = bp->next;
free(bp);
}
@ -737,7 +764,7 @@ seekable(f)
return (0);
}
#endif
return (lseek(f, (off_t)1, 0) != BAD_LSEEK);
return (lseek(f, (off_t)1, SEEK_SET) != BAD_LSEEK);
}
/*

View File

@ -551,6 +551,21 @@ mca_char(c)
return (MCA_MORE);
}
/*
* Discard any buffered file data.
*/
static void
clear_buffers()
{
if (!(ch_getflags() & CH_CANSEEK))
return;
ch_flush();
clr_linenum();
#if HILITE_SEARCH
clr_hilite();
#endif
}
/*
* Make sure the screen is displayed.
*/
@ -574,11 +589,20 @@ make_display()
jump_loc(initial_scrpos.pos, initial_scrpos.ln);
} else if (screen_trashed)
{
int save_top_scroll;
save_top_scroll = top_scroll;
int save_top_scroll = top_scroll;
int save_ignore_eoi = ignore_eoi;
top_scroll = 1;
ignore_eoi = 0;
if (screen_trashed == 2)
{
/* Special case used by ignore_eoi: re-open the input file
* and jump to the end of the file. */
reopen_curr_ifile();
jump_forw();
}
repaint();
top_scroll = save_top_scroll;
ignore_eoi = save_ignore_eoi;
}
}
@ -1109,7 +1133,10 @@ commands()
ignore_eoi = 1;
hit_eof = 0;
while (!sigs)
{
make_display();
forward(1, 0, 0);
}
ignore_eoi = 0;
/*
* This gets us back in "F mode" after processing
@ -1148,14 +1175,7 @@ commands()
* Flush buffers, then repaint screen.
* Don't flush the buffers on a pipe!
*/
if (ch_getflags() & CH_CANSEEK)
{
ch_flush();
clr_linenum();
#if HILITE_SEARCH
clr_hilite();
#endif
}
clear_buffers();
/* FALLTHRU */
case A_REPAINT:
/*
@ -1257,7 +1277,8 @@ commands()
/*
* Define abbreviation for a commonly used sequence below.
*/
#define DO_SEARCH() if (number <= 0) number = 1; \
#define DO_SEARCH() \
if (number <= 0) number = 1; \
mca_search(); \
cmd_exec(); \
multi_search((char *)NULL, (int) number);

230
contrib/less/configure vendored
View File

@ -3611,6 +3611,73 @@ fi
# Checks for general libraries.
{ echo "$as_me:$LINENO: checking for tgoto in -ltinfo" >&5
echo $ECHO_N "checking for tgoto in -ltinfo... $ECHO_C" >&6; }
if test "${ac_cv_lib_tinfo_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ltinfo $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char tgoto ();
int
main ()
{
return tgoto ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
ac_cv_lib_tinfo_tgoto=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_tinfo_tgoto=no
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ echo "$as_me:$LINENO: result: $ac_cv_lib_tinfo_tgoto" >&5
echo "${ECHO_T}$ac_cv_lib_tinfo_tgoto" >&6; }
if test $ac_cv_lib_tinfo_tgoto = yes; then
have_tinfo=yes
else
have_tinfo=no
fi
{ echo "$as_me:$LINENO: checking for initscr in -lxcurses" >&5
echo $ECHO_N "checking for initscr in -lxcurses... $ECHO_C" >&6; }
if test "${ac_cv_lib_xcurses_initscr+set}" = set; then
@ -4246,6 +4313,61 @@ fi
fi
if test $curses_broken = 0; then
# -- Try tinfo.
if test "x$TERMLIBS" = x; then
if test $have_tinfo = yes; then
TERMLIBS="-ltinfo"
SAVE_LIBS=$LIBS
LIBS="$LIBS $TERMLIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
tgetent(0,0); tgetflag(0); tgetnum(0); tgetstr(0,0);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
termok=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
termok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
LIBS=$SAVE_LIBS
if test $termok = no; then TERMLIBS=""; fi
fi
fi
# -- Try xcurses.
if test "x$TERMLIBS" = x; then
if test $have_xcurses = yes; then
@ -4895,7 +5017,8 @@ done
for ac_header in ctype.h errno.h fcntl.h limits.h stdio.h stdlib.h string.h termcap.h termio.h termios.h time.h unistd.h values.h sys/ioctl.h sys/stream.h
for ac_header in ctype.h errno.h fcntl.h limits.h stdio.h stdlib.h string.h termcap.h termio.h termios.h time.h unistd.h values.h sys/ioctl.h sys/stream.h wctype.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
@ -5443,6 +5566,10 @@ fi
@ -5655,6 +5782,55 @@ sed 's/^/| /' conftest.$ac_ext >&5
echo "${ECHO_T}no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ echo "$as_me:$LINENO: checking for st_ino in struct stat" >&5
echo $ECHO_N "checking for st_ino in struct stat... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <sys/types.h>
#include <sys/stat.h>
int
main ()
{
struct stat s; dev_t dev = s.st_dev; ino_t ino = s.st_ino;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
{ echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6; }; cat >>confdefs.h <<\_ACEOF
#define HAVE_STAT_INO 1
_ACEOF
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Checks for library functions.
@ -6515,6 +6691,7 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
{ echo "$as_me:$LINENO: checking for ctype functions" >&5
echo $ECHO_N "checking for ctype functions... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
@ -6566,6 +6743,57 @@ sed 's/^/| /' conftest.$ac_ext >&5
echo "${ECHO_T}no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
{ echo "$as_me:$LINENO: checking for wctype functions" >&5
echo $ECHO_N "checking for wctype functions... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <wctype.h>
int
main ()
{
iswlower(0); iswupper(0); towlower(0); towupper(0);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
{ echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6; }; cat >>confdefs.h <<\_ACEOF
#define HAVE_WCTYPE 1
_ACEOF
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext

View File

@ -23,6 +23,7 @@ AC_PROG_INSTALL
AC_SYS_LARGEFILE
# Checks for general libraries.
AC_CHECK_LIB(tinfo, tgoto, [have_tinfo=yes], [have_tinfo=no])
AC_CHECK_LIB(xcurses, initscr, [have_xcurses=yes], [have_xcurses=no])
AC_CHECK_LIB(ncursesw, initscr, [have_ncursesw=yes], [have_ncursesw=no])
AC_CHECK_LIB(ncurses, initscr, [have_ncurses=yes], [have_ncurses=no])
@ -51,6 +52,20 @@ fi
fi
if test $curses_broken = 0; then
# -- Try tinfo.
if test "x$TERMLIBS" = x; then
if test $have_tinfo = yes; then
TERMLIBS="-ltinfo"
SAVE_LIBS=$LIBS
LIBS="$LIBS $TERMLIBS"
AC_TRY_LINK(, [tgetent(0,0); tgetflag(0); tgetnum(0); tgetstr(0,0);],
[termok=yes], [termok=no])
LIBS=$SAVE_LIBS
if test $termok = no; then TERMLIBS=""; fi
fi
fi
# -- Try xcurses.
if test "x$TERMLIBS" = x; then
if test $have_xcurses = yes; then
@ -154,7 +169,7 @@ LIBS="$LIBS $TERMLIBS"
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([ctype.h errno.h fcntl.h limits.h stdio.h stdlib.h string.h termcap.h termio.h termios.h time.h unistd.h values.h sys/ioctl.h sys/stream.h])
AC_CHECK_HEADERS([ctype.h errno.h fcntl.h limits.h stdio.h stdlib.h string.h termcap.h termio.h termios.h time.h unistd.h values.h sys/ioctl.h sys/stream.h wctype.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STAT
@ -182,6 +197,8 @@ AH_TEMPLATE([HAVE_VOID],
[Define HAVE_VOID if your compiler supports the "void" type.])
AH_TEMPLATE([HAVE_CONST],
[Define HAVE_CONST if your compiler supports the "const" modifier.])
AH_TEMPLATE([HAVE_STAT_INO],
[Define HAVE_STAT_INO if your struct stat has st_ino and st_dev.])
AH_TEMPLATE([HAVE_TIME_T],
[Define HAVE_TIME_T if your system supports the "time_t" type.])
AH_TEMPLATE([HAVE_STRERROR],
@ -204,6 +221,8 @@ AH_TEMPLATE([HAVE_TERMIOS_FUNCS],
[Define HAVE_TERMIOS_FUNCS if you have tcgetattr/tcsetattr.])
AH_TEMPLATE([HAVE_UPPER_LOWER],
[Define HAVE_UPPER_LOWER if you have isupper, islower, toupper, tolower.])
AH_TEMPLATE([HAVE_WCTYPE],
[Define HAVE_WCTYPE if you have iswupper, iswlower, towupper, towlower.])
AH_TEMPLATE([HAVE_SIGSET_T],
[Define HAVE_SIGSET_T you have the sigset_t type.])
AH_TEMPLATE([HAVE_SIGEMPTYSET],
@ -224,6 +243,11 @@ AC_TRY_COMPILE(, [const int foo = 0;],
AC_MSG_CHECKING(for time_t)
AC_TRY_COMPILE([#include <time.h>], [time_t t = 0;],
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_TIME_T)], [AC_MSG_RESULT(no)])
AC_MSG_CHECKING(for st_ino in struct stat)
AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/stat.h>],
[struct stat s; dev_t dev = s.st_dev; ino_t ino = s.st_ino;],
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_STAT_INO)], [AC_MSG_RESULT(no)])
# Checks for library functions.
AC_TYPE_SIGNAL
@ -307,6 +331,7 @@ AC_TRY_LINK([#include <locale.h>
#include <ctype.h>
#include <langinfo.h>], [setlocale(LC_CTYPE,""); isprint(0); iscntrl(0);],
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_LOCALE)], [AC_MSG_RESULT(no)])
AC_MSG_CHECKING(for ctype functions)
AC_TRY_LINK([
#if HAVE_CTYPE_H
@ -314,6 +339,10 @@ AC_TRY_LINK([
#endif], [static int x; x = isupper(x); x = tolower(x); x = toupper(x);],
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_UPPER_LOWER)], [AC_MSG_RESULT(no)])
AC_MSG_CHECKING(for wctype functions)
AC_TRY_LINK([#include <wctype.h>], [iswlower(0); iswupper(0); towlower(0); towupper(0);],
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_WCTYPE)], [AC_MSG_RESULT(no)])
# Checks for external variable ospeed in the termcap library.
have_ospeed=no
AC_MSG_CHECKING(termcap for ospeed)

View File

@ -682,7 +682,7 @@ lesskey(filename, sysvar)
close(f);
return (-1);
}
if (lseek(f, (off_t)0, 0) == BAD_LSEEK)
if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK)
{
free(buf);
close(f);

View File

@ -313,6 +313,9 @@
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <wctype.h> header file. */
#define HAVE_WCTYPE_H 0
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1

View File

@ -282,6 +282,9 @@
/* Define to 1 if you have the `stat' function. */
#undef HAVE_STAT
/* Define HAVE_STAT_INO if your struct stat has st_ino and st_dev. */
#undef HAVE_STAT_INO
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@ -351,6 +354,12 @@
/* Define HAVE_VOID if your compiler supports the "void" type. */
#undef HAVE_VOID
/* Define HAVE_WCTYPE if you have iswupper, iswlower, towupper, towlower. */
#undef HAVE_WCTYPE
/* Define to 1 if you have the <wctype.h> header file. */
#undef HAVE_WCTYPE_H
/* Define to 1 if you have the `_setjmp' function. */
#undef HAVE__SETJMP

View File

@ -279,6 +279,9 @@
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <wctype.h> header file. */
#define HAVE_WCTYPE_H 0
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1

View File

@ -287,6 +287,9 @@
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <wctype.h> header file. */
#define HAVE_WCTYPE_H 0
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1

View File

@ -277,6 +277,9 @@
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <wctype.h> header file. */
#define HAVE_WCTYPE_H 1
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1

View File

@ -10,6 +10,9 @@
#include "less.h"
#if HAVE_STAT
#include <sys/stat.h>
#endif
public int fd0 = 0;
@ -36,6 +39,11 @@ extern int force_logfile;
extern char *namelogfile;
#endif
#if HAVE_STAT_INO
public dev_t curr_dev;
public ino_t curr_ino;
#endif
char *curr_altfilename = NULL;
static void *curr_altpipe;
@ -178,6 +186,9 @@ close_file()
curr_altfilename = NULL;
}
curr_ifile = NULL_IFILE;
#if HAVE_STAT_INO
curr_ino = curr_dev = 0;
#endif
}
/*
@ -360,7 +371,6 @@ edit_ifile(ifile)
}
}
}
free(qopen_filename);
/*
* Get the new ifile.
@ -384,11 +394,24 @@ edit_ifile(ifile)
#if LOGFILE
if (namelogfile != NULL && is_tty)
use_logfile(namelogfile);
#endif
#if HAVE_STAT_INO
/* Remember the i-number and device of the opened file. */
{
struct stat statbuf;
int r = stat(qopen_filename, &statbuf);
if (r == 0)
{
curr_ino = statbuf.st_ino;
curr_dev = statbuf.st_dev;
}
}
#endif
if (every_first_cmd != NULL)
ungetsc(every_first_cmd);
}
free(qopen_filename);
no_display = !any_display;
flush();
any_display = TRUE;
@ -657,6 +680,14 @@ reedit_ifile(save_ifile)
quit(QUIT_ERROR);
}
public void
reopen_curr_ifile()
{
IFILE save_ifile = save_curr_ifile();
close_file();
reedit_ifile(save_ifile);
}
/*
* Edit standard input.
*/
@ -747,7 +778,7 @@ use_logfile(filename)
* Append: open the file and seek to the end.
*/
logfile = open(filename, OPEN_APPEND);
if (lseek(logfile, (off_t)0, 2) == BAD_LSEEK)
if (lseek(logfile, (off_t)0, SEEK_END) == BAD_LSEEK)
{
close(logfile);
logfile = -1;

View File

@ -476,7 +476,7 @@ bin_file(f)
if (!seekable(f))
return (0);
if (lseek(f, (off_t)0, 0) == BAD_LSEEK)
if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK)
return (0);
n = read(f, data, sizeof(data));
for (i = 0; i < n; i++)
@ -505,7 +505,7 @@ seek_filesize(f)
{
off_t spos;
spos = lseek(f, (off_t)0, 2);
spos = lseek(f, (off_t)0, SEEK_END);
if (spos == BAD_LSEEK)
return (NULL_POSITION);
return ((POSITION) spos);

View File

@ -104,6 +104,7 @@
public IFILE save_curr_ifile ();
public void unsave_ifile ();
public void reedit_ifile ();
public void reopen_curr_ifile ();
public int edit_stdin ();
public void cat_file ();
public void use_logfile ();

View File

@ -71,6 +71,9 @@
#if HAVE_CTYPE_H
#include <ctype.h>
#endif
#if HAVE_WCTYPE_H
#include <wctype.h>
#endif
#if HAVE_LIMITS_H
#include <limits.h>
#endif
@ -125,16 +128,23 @@ void free();
#undef IS_SPACE
#undef IS_DIGIT
#if !HAVE_UPPER_LOWER
#define IS_UPPER(c) ASCII_IS_UPPER(c)
#define IS_LOWER(c) ASCII_IS_LOWER(c)
#define TO_UPPER(c) ASCII_TO_UPPER(c)
#define TO_LOWER(c) ASCII_TO_LOWER(c)
#if HAVE_WCTYPE
#define IS_UPPER(c) iswupper(c)
#define IS_LOWER(c) iswlower(c)
#define TO_UPPER(c) towupper(c)
#define TO_LOWER(c) towlower(c)
#else
#if HAVE_UPPER_LOWER
#define IS_UPPER(c) isupper((unsigned char) (c))
#define IS_LOWER(c) islower((unsigned char) (c))
#define TO_UPPER(c) toupper((unsigned char) (c))
#define TO_LOWER(c) tolower((unsigned char) (c))
#else
#define IS_UPPER(c) ASCII_IS_UPPER(c)
#define IS_LOWER(c) ASCII_IS_LOWER(c)
#define TO_UPPER(c) ASCII_TO_UPPER(c)
#define TO_LOWER(c) ASCII_TO_LOWER(c)
#endif
#endif
#ifdef isspace
@ -187,6 +197,13 @@ void free();
#define BAD_LSEEK ((off_t)-1)
#ifndef SEEK_SET
#define SEEK_SET 0
#endif
#ifndef SEEK_END
#define SEEK_END 2
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
@ -457,6 +474,9 @@ struct textlist
#define QUIT_ERROR 1
#define QUIT_SAVED_STATUS (-1)
#define FOLLOW_DESC 0
#define FOLLOW_NAME 1
/* filestate flags */
#define CH_CANSEEK 001
#define CH_KEEPOPEN 002

View File

@ -750,40 +750,35 @@ LESS(1) LESS(1)
deinitialization string does something unnecessary, like clear-
ing the screen.
--no-keypad
Disables sending the keypad initialization and deinitialization
strings to the terminal. This is sometimes useful if the keypad
strings make the numeric keypad behave in an undesirable manner.
-yn or --max-forw-scroll=n
Specifies a maximum number of lines to scroll forward. If it is
necessary to scroll forward more than n lines, the screen is
repainted instead. The -c or -C option may be used to repaint
from the top of the screen if desired. By default, any forward
necessary to scroll forward more than n lines, the screen is
repainted instead. The -c or -C option may be used to repaint
from the top of the screen if desired. By default, any forward
movement causes scrolling.
-[z]n or --window=n
Changes the default scrolling window size to n lines. The
Changes the default scrolling window size to n lines. The
default is one screenful. The z and w commands can also be used
to change the window size. The "z" may be omitted for compati-
to change the window size. The "z" may be omitted for compati-
bility with some versions of more. If the number n is negative,
it indicates n lines less than the current screen size. For
it indicates n lines less than the current screen size. For
example, if the screen is 24 lines, -z-4 sets the scrolling win-
dow to 20 lines. If the screen is resized to 40 lines, the
dow to 20 lines. If the screen is resized to 40 lines, the
scrolling window automatically changes to 36 lines.
-"cc or --quotes=cc
Changes the filename quoting character. This may be necessary
if you are trying to name a file which contains both spaces and
quote characters. Followed by a single character, this changes
the quote character to that character. Filenames containing a
Changes the filename quoting character. This may be necessary
if you are trying to name a file which contains both spaces and
quote characters. Followed by a single character, this changes
the quote character to that character. Filenames containing a
space should then be surrounded by that character rather than by
double quotes. Followed by two characters, changes the open
quote to the first character, and the close quote to the second
double quotes. Followed by two characters, changes the open
quote to the first character, and the close quote to the second
character. Filenames containing a space should then be preceded
by the open quote character and followed by the close quote
character. Note that even after the quote characters are
changed, this option remains -" (a dash followed by a double
by the open quote character and followed by the close quote
character. Note that even after the quote characters are
changed, this option remains -" (a dash followed by a double
quote).
-~ or --tilde
@ -793,10 +788,25 @@ LESS(1) LESS(1)
-# or --shift
Specifies the default number of positions to scroll horizontally
in the RIGHTARROW and LEFTARROW commands. If the number speci-
fied is zero, it sets the default number of positions to one
in the RIGHTARROW and LEFTARROW commands. If the number speci-
fied is zero, it sets the default number of positions to one
half of the screen width.
--no-keypad
Disables sending the keypad initialization and deinitialization
strings to the terminal. This is sometimes useful if the keypad
strings make the numeric keypad behave in an undesirable manner.
--follow-name
Normally, if the input file is renamed while an F command is
executing, less will continue to display the contents of the
original file despite its name change. If --follow-name is
specified, during an F command less will periodically attempt to
reopen the file by name. If the reopen succeeds and the file is
a different file from the original (which means that a new file
has been created with the same name as the original (now
renamed) file), less will display the contents of that new file.
-- A command line argument of "--" marks the end of option argu-
ments. Any arguments following this are interpreted as file-
names. This can be useful when viewing a file whose name begins
@ -1149,10 +1159,10 @@ LESS(1) LESS(1)
is followed by a single character (shown as X above) which spec-
ifies the line whose byte offset is to be used. If the charac-
ter is a "t", the byte offset of the top line in the display is
used, an "m" means use the middle line, a "b" means use the bot-
tom line, a "B" means use the line just after the bottom line,
and a "j" means use the "target" line, as specified by the -j
option.
used, an "m" means use the middle line, a "b" means use the
bottom line, a "B" means use the line just after the bottom
line, and a "j" means use the "target" line, as specified by the
-j option.
%B Replaced by the size of the current input file.
@ -1499,10 +1509,10 @@ LESS(1) LESS(1)
expressions turned off via ^R, and also does not occur when less is
compiled to use the PCRE regular expression library.
In certain cases, when search highlighting is enabled and a search pat-
tern begins with a ^, more text than the matching string may be high-
lighted. (This problem does not occur when less is compiled to use the
POSIX regular expression package.)
In certain cases, when search highlighting is enabled and a search
pattern begins with a ^, more text than the matching string may be
highlighted. (This problem does not occur when less is compiled to use
the POSIX regular expression package.)
On some systems, setlocale claims that ASCII characters 0 thru 31 are
control characters rather than binary characters. This causes less to
@ -1544,4 +1554,4 @@ LESS(1) LESS(1)
Version 409: 12 Oct 2007 LESS(1)
Version 415: 15 Nov 2007 LESS(1)

View File

@ -1,4 +1,4 @@
.TH LESS 1 "Version 409: 12 Oct 2007"
.TH LESS 1 "Version 415: 15 Nov 2007"
.SH NAME
less \- opposite of more
.SH SYNOPSIS
@ -799,11 +799,6 @@ Disables sending the termcap initialization and deinitialization strings
to the terminal.
This is sometimes desirable if the deinitialization string does
something unnecessary, like clearing the screen.
.IP "\-\-no-keypad"
Disables sending the keypad initialization and deinitialization strings
to the terminal.
This is sometimes useful if the keypad strings make the numeric
keypad behave in an undesirable manner.
.IP "\-y\fIn\fP or \-\-max-forw-scroll=\fIn\fP"
Specifies a maximum number of lines to scroll forward.
If it is necessary to scroll forward more than \fIn\fP lines,
@ -847,6 +842,24 @@ Specifies the default number of positions to scroll horizontally
in the RIGHTARROW and LEFTARROW commands.
If the number specified is zero, it sets the default number of
positions to one half of the screen width.
.IP "\-\-no-keypad"
Disables sending the keypad initialization and deinitialization strings
to the terminal.
This is sometimes useful if the keypad strings make the numeric
keypad behave in an undesirable manner.
.IP "\-\-follow-name"
Normally, if the input file is renamed while an F command is executing,
.I less
will continue to display the contents of the original file despite
its name change.
If \-\-follow-name is specified, during an F command
.I less
will periodically attempt to reopen the file by name.
If the reopen succeeds and the file is a different file from the original
(which means that a new file has been created
with the same name as the original (now renamed) file),
.I less
will display the contents of that new file.
.IP \-\-
A command line argument of "\-\-" marks the end of option arguments.
Any arguments following this are interpreted as filenames.

View File

@ -46,4 +46,4 @@ LESSECHO(1) LESSECHO(1)
Version 409: 12 Oct 2007 LESSECHO(1)
Version 415: 15 Nov 2007 LESSECHO(1)

View File

@ -1,4 +1,4 @@
.TH LESSECHO 1 "Version 409: 12 Oct 2007"
.TH LESSECHO 1 "Version 415: 15 Nov 2007"
.SH NAME
lessecho \- expand metacharacters
.SH SYNOPSIS

View File

@ -357,4 +357,4 @@ LESSKEY(1) LESSKEY(1)
Version 409: 12 Oct 2007 LESSKEY(1)
Version 415: 15 Nov 2007 LESSKEY(1)

View File

@ -1,4 +1,4 @@
.TH LESSKEY 1 "Version 409: 12 Oct 2007"
.TH LESSKEY 1 "Version 415: 15 Nov 2007"
.SH NAME
lesskey \- specify key bindings for less
.SH SYNOPSIS

View File

@ -1046,6 +1046,23 @@ pdone(endline)
linebuf[curr] = '\n';
attr[curr] = AT_NORMAL;
curr++;
}
else if (ignaw && !auto_wrap && column >= sc_width)
{
/*
* Big horrible kludge.
* No-wrap terminals are too hard to deal with when they get in
* the state where a full screen width of characters have been
* output but the cursor is sitting on the right edge instead
* of at the start of the next line.
* So after we output a full line, we output an extra
* space and backspace to force the cursor to the
* beginning of the next line, like a sane terminal.
*/
linebuf[curr] = ' ';
attr[curr++] = AT_NORMAL;
linebuf[curr] = '\b';
attr[curr++] = AT_NORMAL;
}
linebuf[curr] = '\0';
attr[curr] = AT_NORMAL;

View File

@ -442,7 +442,7 @@ opt__V(type, s)
any_display = 1;
putstr("less ");
putstr(version);
putstr("\nCopyright (C) 1984-2005 Mark Nudelman\n\n");
putstr("\nCopyright (C) 1984-2007 Mark Nudelman\n\n");
putstr("less comes with NO WARRANTY, to the extent permitted by law.\n");
putstr("For information about the terms of redistribution,\n");
putstr("see the file named README in the less distribution.\n");

View File

@ -50,7 +50,8 @@ public int shift_count; /* Number of positions to shift horizontally */
public int status_col; /* Display a status column */
public int use_lessopen; /* Use the LESSOPEN filter */
public int quit_on_intr; /* Quit on interrupt */
public int oldbot; /* Old bottom of screen behavior */
public int follow_mode; /* F cmd Follows file desc or file name? */
public int oldbot; /* Old bottom of screen behavior {{REMOVE}} */
#if HILITE_SEARCH
public int hilite_search; /* Highlight matched search patterns? */
#endif
@ -113,6 +114,7 @@ static struct optname query_optname = { "help", NULL };
static struct optname pound_optname = { "shift", NULL };
static struct optname keypad_optname = { "no-keypad", NULL };
static struct optname oldbot_optname = { "old-bot", NULL };
static struct optname follow_optname = { "follow-name", NULL };
/*
@ -440,6 +442,14 @@ static struct loption option[] =
NULL
}
},
{ '.', &follow_optname,
BOOL, FOLLOW_DESC, &follow_mode, NULL,
{
"F command Follows file descriptor",
"F command Follows file name",
NULL
}
},
{ '\0', NULL, NOVAR, 0, NULL, NULL, { NULL, NULL, NULL } }
};

View File

@ -1844,11 +1844,15 @@ line_left()
GetConsoleScreenBufferInfo(con_out, &scr);
row = scr.dwCursorPosition.Y - scr.srWindow.Top + 1;
}
#else
#if MSDOS_COMPILER==BORLANDC || MSDOS_COMPILER==DJGPPC
row = wherey();
#else
{
struct rccoord tpos = _gettextposition();
row = tpos.row;
}
#endif
#endif
_settextposition(row, 1);
#endif

View File

@ -64,6 +64,7 @@ extern int screen_trashed;
extern int size_linebuf;
extern int squished;
extern int can_goto_line;
extern int utf_mode;
static int hide_hilite;
static int oldbot;
static POSITION prep_startpos;
@ -104,14 +105,31 @@ static int is_ucase_pattern;
static int last_search_type;
static char *last_pattern = NULL;
/*
* Convert text. Perform one or more of these transformations:
*/
#define CVT_TO_LC 01 /* Convert upper-case to lower-case */
#define CVT_BS 02 /* Do backspace processing */
#define CVT_CRLF 04 /* Remove CR after LF */
#define CVT_ANSI 010 /* Remove ANSI escape sequences */
/*
* Get the length of a buffer needed to convert a string.
*/
static int
cvt_length(len, ops)
int len;
int ops;
{
if (utf_mode && (ops & CVT_TO_LC))
/*
* Converting case can cause a UTF-8 string to increase in length.
* Multiplying by 3 is the worst case.
*/
len *= 3;
return len+1;
}
/*
* Convert text. Perform one or more of these transformations:
*/
static void
cvt_text(odst, osrc, lenp, ops)
char *odst;
@ -138,7 +156,7 @@ cvt_text(odst, osrc, lenp, ops)
put_wchar(&dst, TO_LOWER(ch));
} else if ((ops & CVT_BS) && ch == '\b' && dst > odst)
{
/* Delete BS and preceding char. */
/* Delete backspace and preceding char. */
do {
dst--;
} while (dst > odst &&
@ -361,7 +379,7 @@ undo_search()
* Compile a search pattern, for future use by match_pattern.
*/
static int
compile_pattern(pattern, search_type)
compile_pattern2(pattern, search_type)
char *pattern;
int search_type;
{
@ -440,6 +458,30 @@ compile_pattern(pattern, search_type)
return (0);
}
/*
* Like compile_pattern, but convert the pattern to lowercase if necessary.
*/
static int
compile_pattern(pattern, search_type)
char *pattern;
int search_type;
{
char *cvt_pattern;
int result;
if (caseless != OPT_ONPLUS)
cvt_pattern = pattern;
else
{
cvt_pattern = (char*) ecalloc(1, cvt_length(strlen(pattern), CVT_TO_LC));
cvt_text(cvt_pattern, pattern, (int *)NULL, CVT_TO_LC);
}
result = compile_pattern2(cvt_pattern, search_type);
if (cvt_pattern != pattern)
free(cvt_pattern);
return (result);
}
/*
* Forget that we have a compiled pattern.
*/
@ -679,35 +721,8 @@ add_hilite(anchor, hl)
ihl->hl_next = hl;
}
static void
adj_hilite_ansi(cvt_ops, line, line_len, npos)
int cvt_ops;
char **line;
int line_len;
POSITION *npos;
{
char *line_end = *line + line_len;
if (cvt_ops & CVT_ANSI)
while (IS_CSI_START(**line))
{
/*
* Found an ESC. The file position moves
* forward past the entire ANSI escape sequence.
*/
(*line)++;
(*npos)++;
while (*line < line_end)
{
(*npos)++;
if (!is_ansi_middle(*(*line)++))
break;
}
}
}
/*
* Adjust hl_startpos & hl_endpos to account for backspace processing.
* Adjust hl_startpos & hl_endpos to account for processing by cvt_text.
*/
static void
adj_hilite(anchor, linepos, cvt_ops)
@ -716,18 +731,21 @@ adj_hilite(anchor, linepos, cvt_ops)
int cvt_ops;
{
char *line;
char *oline;
int line_len;
char *line_end;
struct hilite *hl;
int checkstart;
POSITION opos;
POSITION npos;
LWCHAR ch;
int ncwidth;
/*
* The line was already scanned and hilites were added (in hilite_line).
* But it was assumed that each char position in the line
* correponds to one char position in the file.
* This may not be true if there are backspaces in the line.
* This may not be true if cvt_text modified the line.
* Get the raw line again. Look at each character.
*/
(void) forw_raw_line(linepos, &line, &line_len);
@ -758,31 +776,43 @@ adj_hilite(anchor, linepos, cvt_ops)
}
if (line == line_end)
break;
adj_hilite_ansi(cvt_ops, &line, line_end - line, &npos);
opos++;
npos++;
line++;
if (cvt_ops & CVT_BS)
/* Get the next char from the line. */
oline = line;
ch = step_char(&line, +1, line_end);
ncwidth = line - oline;
npos += ncwidth;
/* Figure out how this char was processed by cvt_text. */
if ((cvt_ops & CVT_BS) && ch == '\b')
{
while (*line == '\b')
/* Skip the backspace and the following char. */
oline = line;
ch = step_char(&line, +1, line_end);
ncwidth = line - oline;
npos += ncwidth;
} else if ((cvt_ops & CVT_TO_LC) && IS_UPPER(ch))
{
/* Converted uppercase to lower.
* Note that this may have changed the number of bytes
* that the character occupies. */
char dbuf[6];
char *dst = dbuf;
put_wchar(&dst, TO_LOWER(ch));
opos += dst - dbuf;
} else if ((cvt_ops & CVT_ANSI) && IS_CSI_START(ch))
{
/* Skip to end of ANSI escape sequence. */
while (line < line_end)
{
npos++;
line++;
adj_hilite_ansi(cvt_ops, &line, line_end - line, &npos);
if (line == line_end)
{
--npos;
--line;
if (!is_ansi_middle(*++line))
break;
}
/*
* Found a backspace. The file position moves
* forward by 2 relative to the processed line
* which was searched in hilite_line.
*/
npos++;
line++;
}
} else
{
/* Ordinary unprocessed character. */
opos += ncwidth;
}
}
}
@ -1012,6 +1042,7 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
POSITION *pendpos;
{
char *line;
char *cline;
int line_len;
LINENUM linenum;
char *sp, *ep;
@ -1097,18 +1128,22 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
* If we're doing backspace processing, delete backspaces.
*/
cvt_ops = get_cvt_ops();
cvt_text(line, line, &line_len, cvt_ops);
cline = calloc(1, cvt_length(line_len, cvt_ops));
cvt_text(cline, line, &line_len, cvt_ops);
/*
* Test the next line to see if we have a match.
* We are successful if we either want a match and got one,
* or if we want a non-match and got one.
*/
line_match = match_pattern(line, line_len, &sp, &ep, 0);
line_match = match_pattern(cline, line_len, &sp, &ep, 0);
line_match = (!(search_type & SRCH_NO_MATCH) && line_match) ||
((search_type & SRCH_NO_MATCH) && !line_match);
if (!line_match)
{
free(cline);
continue;
}
/*
* Got a match.
*/
@ -1121,8 +1156,9 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
* hilite list and keep searching.
*/
if (line_match)
hilite_line(linepos, line, line_len, sp, ep, cvt_ops);
hilite_line(linepos, cline, line_len, sp, ep, cvt_ops);
#endif
free(cline);
} else if (--matches <= 0)
{
/*
@ -1138,9 +1174,10 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
*/
clr_hilite();
if (line_match)
hilite_line(linepos, line, line_len, sp, ep, cvt_ops);
hilite_line(linepos, cline, line_len, sp, ep, cvt_ops);
}
#endif
free(cline);
if (plinepos != NULL)
*plinepos = linepos;
return (0);
@ -1163,9 +1200,6 @@ hist_pattern(search_type)
if (pattern == NULL)
return (0);
if (caseless == OPT_ONPLUS)
cvt_text(pattern, pattern, (int *)NULL, CVT_TO_LC);
if (compile_pattern(pattern, search_type) < 0)
return (0);
@ -1202,7 +1236,7 @@ search(search_type, pattern, n)
int n;
{
POSITION pos;
int ucase;
int result;
if (pattern == NULL || *pattern == '\0')
{
@ -1245,16 +1279,13 @@ search(search_type, pattern, n)
/*
* Compile the pattern.
*/
ucase = is_ucase(pattern);
if (caseless == OPT_ONPLUS)
cvt_text(pattern, pattern, (int *)NULL, CVT_TO_LC);
if (compile_pattern(pattern, search_type) < 0)
return (-1);
/*
* Ignore case if -I is set OR
* -i is set AND the pattern is all lowercase.
*/
is_ucase_pattern = ucase;
is_ucase_pattern = is_ucase(pattern);
if (is_ucase_pattern && caseless != OPT_ONPLUS)
is_caseless = 0;
else

View File

@ -662,7 +662,7 @@ prevgtag()
/*
* Position the current file at at what is hopefully the tag that was chosen
* using either findtag() or one of nextgtag() and prevgtag(). Returns -1
* if it was unable to position at the tag, 0 if succesful.
* if it was unable to position at the tag, 0 if successful.
*/
static POSITION
gtagsearch()

View File

@ -696,6 +696,11 @@ v406 6/17/07 Fix secure build.
v407 8/16/07 Fix bugs; support CSI chars.
v408 10/1/07 Fix bug in -i with non-ASCII chars.
v409 10/12/07 Fix crash when viewing text with invalid UTF-8 sequences.
v411 11/6/07 Fix case-insensitive searching with non-ASCII text.
v412 11/6/07 Use symbolic SEEK constants.
v413 11/6/07 Fix search highlight bug with non-ASCII text.
v414 11/6/07 Fix display bug with no-wrap terminals.
v415 11/14/07 Add --follow-name option.
*/
char version[] = "409";
char version[] = "415";