diff --git a/contrib/less/LICENSE b/contrib/less/LICENSE index 7e4887bcd768..8112859e8ae8 100644 --- a/contrib/less/LICENSE +++ b/contrib/less/LICENSE @@ -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 diff --git a/contrib/less/Makefile.dsm b/contrib/less/Makefile.dsm deleted file mode 100644 index 5bc52820681d..000000000000 --- a/contrib/less/Makefile.dsm +++ /dev/null @@ -1,58 +0,0 @@ -# Makefile for less. -# MS-DOS version - -#### Start of system configuration section. #### - -CC = cl -# Change the following directories to match your installation. -LIBDIR = c:\msvc\lib -INCDIR = c:\msvc\include - -# CFLAGS are compile-time options and LDFLAGS are link-time options. They are -# customized for MSVC 1.0 (MSC 8.0). If you have a different version of the -# compiler, you may need to change some of the options to their equivalents. -# -Ot optimize for speed -# -AL large memory model -# -Za ANSI C conformance -# -nologo suppress MSVC banners -# -onerror:noexe no .EXE file if link errors occur -CFLAGS = -Ot -AL -Za -nologo -LDFLAGS = -onerror:noexe -nologo -LIBS = $(LIBDIR)\llibce.lib $(LIBDIR)\graphics.lib - -#### End of system configuration section. #### - -# This rule allows us to supply the necessary -D options -# in addition to whatever the user asks for. -.c.obj: - $(CC) -c -I. -I$(INCDIR) $(CPPFLAGS) $(CFLAGS) $< - -OBJ = main.obj screen.obj brac.obj ch.obj charset.obj cmdbuf.obj command.obj \ - decode.obj edit.obj filename.obj forwback.obj help.obj ifile.obj \ - input.obj jump.obj line.obj linenum.obj lsystem.obj \ - mark.obj optfunc.obj option.obj opttbl.obj os.obj output.obj \ - position.obj prompt.obj search.obj signal.obj tags.obj \ - ttyin.obj version.obj - -all: less lesskey - -# This is really horrible, but the command line is too long for -# MS-DOS if we try to link $(OBJ). -less: $(OBJ) - -if exist lesskey.obj del lesskey.obj - $(CC) $(LDFLAGS) -o $@ *.obj $(LIBS) - -lesskey: lesskey.obj version.obj - $(CC) $(LDFLAGS) -o $@ lesskey.obj version.obj $(LIBS) - -defines.h: defines.ds - -del defines.h - -copy defines.ds defines.h - -$(OBJ): less.h defines.h - -clean: - -del *.obj - -del less.exe - -del lesskey.exe - diff --git a/contrib/less/NEWS b/contrib/less/NEWS index 0154225de76c..e6cec6969bb7 100644 --- a/contrib/less/NEWS +++ b/contrib/less/NEWS @@ -13,6 +13,17 @@ ====================================================================== + Major changes between "less" versions 409 and 416 + +* 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 @@ + diff --git a/contrib/less/README b/contrib/less/README index 73329d63b87c..2cab3474667b 100644 --- a/contrib/less/README +++ b/contrib/less/README @@ -1,7 +1,7 @@ - Less, version 409 + Less, version 416 - This is the distribution of less, version 409, released 12 Oct 2007. + This is the distribution of less, version 416, released 22 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 diff --git a/contrib/less/ch.c b/contrib/less/ch.c index 2ac14d7a1a8e..eb607d593b01 100644 --- a/contrib/less/ch.c +++ b/contrib/less/ch.c @@ -21,6 +21,12 @@ #include #endif +#if HAVE_STAT_INO +#include +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); } /* diff --git a/contrib/less/command.c b/contrib/less/command.c index 032606b818e8..e42d9ce764c8 100644 --- a/contrib/less/command.c +++ b/contrib/less/command.c @@ -557,6 +557,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. */ @@ -580,11 +595,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; } } @@ -1115,7 +1139,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 @@ -1154,14 +1181,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: /* @@ -1263,7 +1283,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); diff --git a/contrib/less/configure b/contrib/less/configure index 3dbc604ebfef..1d3f57aa4ff3 100755 --- a/contrib/less/configure +++ b/contrib/less/configure @@ -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 +#include +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 +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 diff --git a/contrib/less/configure.ac b/contrib/less/configure.ac index d738607ee30c..72d340729174 100644 --- a/contrib/less/configure.ac +++ b/contrib/less/configure.ac @@ -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_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 +#include ], + [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 #include #include ], [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 ], [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) diff --git a/contrib/less/decode.c b/contrib/less/decode.c index 3007473ec91c..ac1668fa5a86 100644 --- a/contrib/less/decode.c +++ b/contrib/less/decode.c @@ -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); diff --git a/contrib/less/defines.ds b/contrib/less/defines.ds index 9138b4215468..c98dcffc35b1 100644 --- a/contrib/less/defines.ds +++ b/contrib/less/defines.ds @@ -313,6 +313,9 @@ /* Define if you have the header file. */ #define HAVE_CTYPE_H 1 +/* Define if you have the header file. */ +#define HAVE_WCTYPE_H 0 + /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 diff --git a/contrib/less/defines.h.in b/contrib/less/defines.h.in index c476a51e10b8..8da1baeceda5 100644 --- a/contrib/less/defines.h.in +++ b/contrib/less/defines.h.in @@ -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 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 header file. */ +#undef HAVE_WCTYPE_H + /* Define to 1 if you have the `_setjmp' function. */ #undef HAVE__SETJMP diff --git a/contrib/less/defines.o2 b/contrib/less/defines.o2 index 78da093f3fbd..544003809a69 100644 --- a/contrib/less/defines.o2 +++ b/contrib/less/defines.o2 @@ -279,6 +279,9 @@ /* Define if you have the header file. */ #define HAVE_CTYPE_H 1 +/* Define if you have the header file. */ +#define HAVE_WCTYPE_H 0 + /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 diff --git a/contrib/less/defines.o9 b/contrib/less/defines.o9 index 179e3777b360..50955ba1046a 100644 --- a/contrib/less/defines.o9 +++ b/contrib/less/defines.o9 @@ -287,6 +287,9 @@ /* Define if you have the header file. */ #define HAVE_CTYPE_H 1 +/* Define if you have the header file. */ +#define HAVE_WCTYPE_H 0 + /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 diff --git a/contrib/less/defines.wn b/contrib/less/defines.wn index ef04f3b8b53f..7c3194c832b9 100644 --- a/contrib/less/defines.wn +++ b/contrib/less/defines.wn @@ -277,6 +277,9 @@ /* Define if you have the header file. */ #define HAVE_CTYPE_H 1 +/* Define if you have the header file. */ +#define HAVE_WCTYPE_H 1 + /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 diff --git a/contrib/less/edit.c b/contrib/less/edit.c index 908f29e18d28..e2e30f2d7af3 100644 --- a/contrib/less/edit.c +++ b/contrib/less/edit.c @@ -10,6 +10,9 @@ #include "less.h" +#if HAVE_STAT +#include +#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 @@ loop: * 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; diff --git a/contrib/less/filename.c b/contrib/less/filename.c index ea3120fbbd89..aa45b764dab5 100644 --- a/contrib/less/filename.c +++ b/contrib/less/filename.c @@ -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); diff --git a/contrib/less/funcs.h b/contrib/less/funcs.h index a4a0c7c2d9f0..649598ee48c0 100644 --- a/contrib/less/funcs.h +++ b/contrib/less/funcs.h @@ -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 (); diff --git a/contrib/less/less.h b/contrib/less/less.h index eb40a0f4b47c..f2ea445102f6 100644 --- a/contrib/less/less.h +++ b/contrib/less/less.h @@ -72,6 +72,9 @@ #if HAVE_CTYPE_H #include #endif +#if HAVE_WCTYPE_H +#include +#endif #if HAVE_LIMITS_H #include #endif @@ -126,16 +129,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 @@ -188,6 +198,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 @@ -458,6 +475,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 diff --git a/contrib/less/less.man b/contrib/less/less.man index 773c7b9ccb51..af19a477fac2 100644 --- a/contrib/less/less.man +++ b/contrib/less/less.man @@ -445,8 +445,8 @@ LESS(1) LESS(1) buffer space is used for each file (unless the file is a pipe; see the -B option). The -b option specifies instead that n kilobytes of buffer space should be used for each file. If n is - -1, buffer space is unlimited; that is, the entire file is read - into memory. + -1, buffer space is unlimited; that is, the entire file can be + read into memory. -B or --auto-buffers By default, when data is read from a pipe, buffers are allocated @@ -456,8 +456,8 @@ LESS(1) LESS(1) buffers for pipes, so that only 64K (or the amount of space specified by the -b option) is used for the pipe. Warning: use of -B can result in erroneous display, since only the most - recently viewed part of the file is kept in memory; any earlier - data is lost. + recently viewed part of the piped data is kept in memory; any + earlier data is lost. -c or --clear-screen Causes full screen repaints to be painted from the top line @@ -533,42 +533,44 @@ LESS(1) LESS(1) -jn or --jump-target=n Specifies a line on the screen where the "target" line is to be - positioned. A target line is the object of a text search, tag - search, jump to a line number, jump to a file percentage, or - jump to a marked position. The screen line may be specified by - a number: the top line on the screen is 1, the next is 2, and so - on. The number may be negative to specify a line relative to - the bottom of the screen: the bottom line on the screen is -1, - the second to the bottom is -2, and so on. Alternately, the - screen line may be specified as a fraction of the height of the - screen, starting with a decimal point: .5 is in the middle of - the screen, .3 is three tenths down from the first line, and so - on. If the line is specified as a fraction, the actual line + positioned. The target line is the line specified by any com- + mand to search for a pattern, jump to a line number, jump to a + file percentage or jump to a tag. The screen line may be speci- + fied by a number: the top line on the screen is 1, the next is + 2, and so on. The number may be negative to specify a line rel- + ative to the bottom of the screen: the bottom line on the screen + is -1, the second to the bottom is -2, and so on. Alternately, + the screen line may be specified as a fraction of the height of + the screen, starting with a decimal point: .5 is in the middle + of the screen, .3 is three tenths down from the first line, and + so on. If the line is specified as a fraction, the actual line number is recalculated if the terminal window is resized, so that the target line remains at the specified fraction of the - screen height. If the -j option is used, searches begin at the - line immediately after the target line. For example, if "-j4" - is used, the target line is the fourth line on the screen, so - searches begin at the fifth line on the screen. + screen height. If any form of the -j option is used, forward + searches begin at the line immediately after the target line, + and backward searches begin at the target line. For example, if + "-j4" is used, the target line is the fourth line on the screen, + so forward searches begin at the fifth line on the screen. -J or --status-column - Displays a status column at the left edge of the screen. The - status column shows the lines that matched the current search. - The status column is also used if the -w or -W option is in + Displays a status column at the left edge of the screen. The + status column shows the lines that matched the current search. + The status column is also used if the -w or -W option is in effect. -kfilename or --lesskey-file=filename - Causes less to open and interpret the named file as a lesskey + Causes less to open and interpret the named file as a lesskey (1) file. Multiple -k options may be specified. If the LESSKEY - or LESSKEY_SYSTEM environment variable is set, or if a lesskey + or LESSKEY_SYSTEM environment variable is set, or if a lesskey file is found in a standard place (see KEY BINDINGS), it is also used as a lesskey file. -K or --quit-on-intr - Causes less to exit immediately when an interrupt character - (usually ^C) is typed. Normally, an interrupt character causes - less to stop whatever it is doing and return to its command - prompt. + Causes less to exit immediately when an interrupt character + (usually ^C) is typed. Normally, an interrupt character causes + less to stop whatever it is doing and return to its command + prompt. Note that use of this option makes it impossible to + return to the command prompt from the "F" command. -L or --no-lessopen Ignore the LESSOPEN environment variable (see the INPUT PREPRO- @@ -739,8 +741,8 @@ LESS(1) LESS(1) -xn,... or --tabs=n,... Sets tab stops. If only one n is specified, tab stops are set at multiples of n. If multiple values separated by commas are - specified, tab stops are set at those positions, and then - continue with the same spacing as the last two. For example, + specified, tab stops are set at those positions, and then con- + tinue with the same spacing as the last two. For example, -x9,17 will set tabs at positions 9, 17, 25, 33, etc. The default for n is 8. @@ -750,40 +752,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 +790,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 @@ -1544,4 +1556,4 @@ LESS(1) LESS(1) - Version 409: 12 Oct 2007 LESS(1) + Version 416: 22 Nov 2007 LESS(1) diff --git a/contrib/less/less.nro b/contrib/less/less.nro index 483e194449c6..d5dfb053498e 100644 --- a/contrib/less/less.nro +++ b/contrib/less/less.nro @@ -1,4 +1,4 @@ -.TH LESS 1 "Version 409: 12 Oct 2007" +.TH LESS 1 "Version 416: 22 Nov 2007" .SH NAME less \- opposite of more .SH SYNOPSIS @@ -462,7 +462,7 @@ By default 64K of buffer space is used for each file The \-b option specifies instead that \fIn\fP kilobytes of buffer space should be used for each file. If \fIn\fP is \-1, buffer space is unlimited; that is, -the entire file is read into memory. +the entire file can be read into memory. .IP "\-B or \-\-auto-buffers" By default, when data is read from a pipe, buffers are allocated automatically as needed. @@ -473,7 +473,7 @@ so that only 64K (or the amount of space specified by the \-b option) is used for the pipe. Warning: use of \-B can result in erroneous display, since only the -most recently viewed part of the file is kept in memory; +most recently viewed part of the piped data is kept in memory; any earlier data is lost. .IP "\-c or \-\-clear-screen" Causes full screen repaints to be painted from the top line down. @@ -555,9 +555,9 @@ the pattern contains uppercase letters. .IP "\-j\fIn\fP or \-\-jump-target=\fIn\fP" Specifies a line on the screen where the "target" line is to be positioned. -A target line is the object of a text search, -tag search, jump to a line number, -jump to a file percentage, or jump to a marked position. +The target line is the line specified by any command to +search for a pattern, jump to a line number, +jump to a file percentage or jump to a tag. The screen line may be specified by a number: the top line on the screen is 1, the next is 2, and so on. The number may be negative to specify a line relative to the bottom @@ -569,10 +569,11 @@ screen, .3 is three tenths down from the first line, and so on. If the line is specified as a fraction, the actual line number is recalculated if the terminal window is resized, so that the target line remains at the specified fraction of the screen height. -If the \-j option is used, searches begin at the line immediately -after the target line. +If any form of the \-j option is used, +forward searches begin at the line immediately after the target line, +and backward searches begin at the target line. For example, if "\-j4" is used, the target line is the -fourth line on the screen, so searches begin at the fifth line +fourth line on the screen, so forward searches begin at the fifth line on the screen. .IP "\-J or \-\-status-column" Displays a status column at the left edge of the screen. @@ -597,6 +598,8 @@ to exit immediately when an interrupt character (usually ^C) is typed. Normally, an interrupt character causes .I less to stop whatever it is doing and return to its command prompt. +Note that use of this option makes it impossible to return to the +command prompt from the "F" command. .IP "\-L or \-\-no-lessopen" Ignore the LESSOPEN environment variable (see the INPUT PREPROCESSOR section below). @@ -799,11 +802,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 +845,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. diff --git a/contrib/less/lessecho.man b/contrib/less/lessecho.man index 588f70aaaa0d..98f059144b2e 100644 --- a/contrib/less/lessecho.man +++ b/contrib/less/lessecho.man @@ -46,4 +46,4 @@ LESSECHO(1) LESSECHO(1) - Version 409: 12 Oct 2007 LESSECHO(1) + Version 416: 22 Nov 2007 LESSECHO(1) diff --git a/contrib/less/lessecho.nro b/contrib/less/lessecho.nro index d9dd628cb041..05542f79f4ee 100644 --- a/contrib/less/lessecho.nro +++ b/contrib/less/lessecho.nro @@ -1,4 +1,4 @@ -.TH LESSECHO 1 "Version 409: 12 Oct 2007" +.TH LESSECHO 1 "Version 416: 22 Nov 2007" .SH NAME lessecho \- expand metacharacters .SH SYNOPSIS diff --git a/contrib/less/lesskey.man b/contrib/less/lesskey.man index f951ea4e5c5c..bdc2ebae2bb6 100644 --- a/contrib/less/lesskey.man +++ b/contrib/less/lesskey.man @@ -357,4 +357,4 @@ LESSKEY(1) LESSKEY(1) - Version 409: 12 Oct 2007 LESSKEY(1) + Version 416: 22 Nov 2007 LESSKEY(1) diff --git a/contrib/less/lesskey.nro b/contrib/less/lesskey.nro index afc358694300..47033212b7cf 100644 --- a/contrib/less/lesskey.nro +++ b/contrib/less/lesskey.nro @@ -1,4 +1,4 @@ -.TH LESSKEY 1 "Version 409: 12 Oct 2007" +.TH LESSKEY 1 "Version 416: 22 Nov 2007" .SH NAME lesskey \- specify key bindings for less .SH SYNOPSIS diff --git a/contrib/less/line.c b/contrib/less/line.c index 217c24c5c267..944e02d86963 100644 --- a/contrib/less/line.c +++ b/contrib/less/line.c @@ -1047,6 +1047,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; diff --git a/contrib/less/optfunc.c b/contrib/less/optfunc.c index 4ca514297c95..f296b79368ab 100644 --- a/contrib/less/optfunc.c +++ b/contrib/less/optfunc.c @@ -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"); diff --git a/contrib/less/opttbl.c b/contrib/less/opttbl.c index 2514463ea6e9..755a93d72ae6 100644 --- a/contrib/less/opttbl.c +++ b/contrib/less/opttbl.c @@ -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 } } }; diff --git a/contrib/less/screen.c b/contrib/less/screen.c index a08191866d8b..3c123b9bf102 100644 --- a/contrib/less/screen.c +++ b/contrib/less/screen.c @@ -1845,11 +1845,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 diff --git a/contrib/less/search.c b/contrib/less/search.c index c3a3e768d5b4..4fb169c39d7e 100644 --- a/contrib/less/search.c +++ b/contrib/less/search.c @@ -66,6 +66,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; @@ -106,14 +107,34 @@ 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) + /* + * Just copying a string in UTF-8 mode can cause it to grow + * in length. + * Six output bytes for one input byte is the worst case + * (and unfortunately is far more than is needed in any + * non-pathological situation, so this is very wasteful). + */ + len *= 6; + return len + 1; +} + +/* + * Convert text. Perform one or more of these transformations: + */ static void cvt_text(odst, osrc, lenp, ops) char *odst; @@ -140,7 +161,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 && @@ -363,7 +384,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; { @@ -442,6 +463,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. */ @@ -681,35 +726,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) @@ -718,18 +736,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); @@ -760,31 +781,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; } } } @@ -1014,6 +1047,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; @@ -1099,18 +1133,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. */ @@ -1123,8 +1161,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) { /* @@ -1140,9 +1179,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); @@ -1165,9 +1205,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); @@ -1204,7 +1241,7 @@ search(search_type, pattern, n) int n; { POSITION pos; - int ucase; + int result; if (pattern == NULL || *pattern == '\0') { @@ -1247,16 +1284,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 diff --git a/contrib/less/tags.c b/contrib/less/tags.c index b22fda8a28ed..ab00faf004d1 100644 --- a/contrib/less/tags.c +++ b/contrib/less/tags.c @@ -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() diff --git a/contrib/less/version.c b/contrib/less/version.c index 1fce12e560b1..bce2f82c07cf 100644 --- a/contrib/less/version.c +++ b/contrib/less/version.c @@ -696,6 +696,12 @@ 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. +v416 11/22/07 Fix crash when searching text with invalid UTF-8 sequences. */ -char version[] = "409"; +char version[] = "416"; diff --git a/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml b/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml index 34cbc9088594..026bbd1d20e5 100644 --- a/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml +++ b/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml @@ -367,7 +367,7 @@ replaced with a modified version of gzip ported from NetBSD. less has been updated from v381 - to v409. + to v416. ncurses has been updated from 5.2-20020615 to 5.6-20061217. ncurses now also has wide diff --git a/usr.bin/less/defines.h b/usr.bin/less/defines.h index 43b28b505360..bc1b7173f0c1 100644 --- a/usr.bin/less/defines.h +++ b/usr.bin/less/defines.h @@ -284,6 +284,9 @@ /* Define to 1 if you have the `stat' function. */ #define HAVE_STAT 1 +/* Define HAVE_STAT_INO if your struct stat has st_ino and st_dev. */ +#define HAVE_STAT_INO 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 @@ -353,6 +356,12 @@ /* Define HAVE_VOID if your compiler supports the "void" type. */ #define HAVE_VOID 1 +/* Define HAVE_WCTYPE if you have iswupper, iswlower, towupper, towlower. */ +#define HAVE_WCTYPE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WCTYPE_H 1 + /* Define to 1 if you have the `_setjmp' function. */ #define HAVE__SETJMP 1