Import less v394
This commit is contained in:
parent
ba8e3be904
commit
6dcb072b30
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/less/dist/; revision=161475
@ -2,7 +2,7 @@
|
||||
------------
|
||||
|
||||
Less
|
||||
Copyright (C) 1984-2002 Mark Nudelman
|
||||
Copyright (C) 1984-2005 Mark Nudelman
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
|
@ -24,9 +24,10 @@ DISTFILES = \
|
||||
${SRC} regexp.c regexp.h \
|
||||
COPYING INSTALL LICENSE Makefile.in Makefile.aut NEWS README \
|
||||
configure configure.ac lesskey.c lessecho.c scrsize.c \
|
||||
cmd.h funcs.h lglob.h less.h lesskey.h option.h pckeys.h position.h \
|
||||
charset.h cmd.h funcs.h lglob.h less.h lesskey.h option.h pckeys.h position.h \
|
||||
install.sh defines.h.in mkinstalldirs \
|
||||
less.nro lesskey.nro less.man lesskey.man less.hlp \
|
||||
less.nro less.man lesskey.nro lesskey.man lessecho.nro lessecho.man \
|
||||
less.hlp \
|
||||
mkfuncs.awk mkhelp.c \
|
||||
${DISTFILES_W}
|
||||
|
||||
@ -55,7 +56,8 @@ lint:
|
||||
|
||||
clean:
|
||||
rm -f Makefile config.status config.log config.cache defines.h stamp-h \
|
||||
README NEWS less.nro lesskey.nro less.man lesskey.man
|
||||
README NEWS \
|
||||
less.nro less.man lesskey.nro lesskey.man lessecho.nro lessecho.man
|
||||
|
||||
distclean: clean
|
||||
realclean: clean
|
||||
@ -78,6 +80,8 @@ ${srcdir}/less.nro: ${srcdir}/less.nro.VER ${srcdir}/version.c
|
||||
${REPLACE_VERSION} ${srcdir}/less.nro.VER
|
||||
${srcdir}/lesskey.nro: ${srcdir}/lesskey.nro.VER ${srcdir}/version.c
|
||||
${REPLACE_VERSION} ${srcdir}/lesskey.nro.VER
|
||||
${srcdir}/lessecho.nro: ${srcdir}/lessecho.nro.VER ${srcdir}/version.c
|
||||
${REPLACE_VERSION} ${srcdir}/lessecho.nro.VER
|
||||
${srcdir}/less.hlp: ${srcdir}/less.hlp.VER ${srcdir}/version.c
|
||||
${REPLACE_VERSION} ${srcdir}/less.hlp.VER
|
||||
|
||||
@ -85,6 +89,8 @@ ${srcdir}/less.man: ${srcdir}/less.nro
|
||||
${NROFF} ${srcdir}/less.nro >${srcdir}/less.man
|
||||
${srcdir}/lesskey.man: ${srcdir}/lesskey.nro
|
||||
${NROFF} ${srcdir}/lesskey.nro >${srcdir}/lesskey.man
|
||||
${srcdir}/lessecho.man: ${srcdir}/lessecho.nro
|
||||
${NROFF} ${srcdir}/lessecho.nro >${srcdir}/lessecho.man
|
||||
|
||||
|
||||
distfiles: ${DISTFILES}
|
||||
|
@ -59,12 +59,13 @@ lessecho: lessecho.${O} version.${O}
|
||||
|
||||
${OBJ}: ${srcdir}/less.h ${srcdir}/funcs.h defines.h
|
||||
|
||||
install: all ${srcdir}/less.nro ${srcdir}/lesskey.nro installdirs
|
||||
install: all ${srcdir}/less.nro ${srcdir}/lesskey.nro ${srcdir}/lessecho.nro installdirs
|
||||
${INSTALL_PROGRAM} less ${bindir}/${binprefix}less
|
||||
${INSTALL_PROGRAM} lesskey ${bindir}/${binprefix}lesskey
|
||||
${INSTALL_PROGRAM} lessecho ${bindir}/${binprefix}lessecho
|
||||
${INSTALL_DATA} ${srcdir}/less.nro ${mandir}/man${manext}/${manprefix}less.${manext}
|
||||
${INSTALL_DATA} ${srcdir}/lesskey.nro ${mandir}/man${manext}/${manprefix}lesskey.${manext}
|
||||
${INSTALL_DATA} ${srcdir}/lessecho.nro ${mandir}/man${manext}/${manprefix}lessecho.${manext}
|
||||
|
||||
install-strip:
|
||||
${MAKE} INSTALL_PROGRAM='${INSTALL_PROGRAM} -s' install
|
||||
|
@ -1,20 +1,27 @@
|
||||
# Makefile for less.
|
||||
# Windows version
|
||||
# Bolarnd C++ 5.5.1 free command line tools
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
#
|
||||
# Borland's make knows its own location in the
|
||||
# filesystem.
|
||||
#
|
||||
|
||||
CC = bcc32
|
||||
LIBDIR = d:\bc45\lib
|
||||
LIBDIR = $(MAKEDIR)\..\lib
|
||||
|
||||
CFLAGS = -O2 -w-pro -TWC -P-c -v- -d -f- -ff- -vi
|
||||
LDFLAGS = /Tpe /v- /ap /c /x
|
||||
LD = tlink32
|
||||
LDFLAGS = -Tpe -v- -ap -c -x -V4.0 -GF:AGGRESSIVE
|
||||
LD = ilink32
|
||||
LIBS = ${LIBDIR}\import32.lib ${LIBDIR}\cw32.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. ${CPPFLAGS} ${CFLAGS} $<
|
||||
|
||||
@ -25,16 +32,20 @@ OBJ = main.obj screen.obj brac.obj ch.obj charset.obj cmdbuf.obj command.obj \
|
||||
position.obj prompt.obj search.obj signal.obj tags.obj \
|
||||
ttyin.obj version.obj regexp.obj
|
||||
|
||||
all: less lesskey
|
||||
all: less lesskey lessecho
|
||||
|
||||
#
|
||||
# This is really horrible, but the command line is too long for
|
||||
# MS-DOS if we try to link ${OBJ}.
|
||||
#
|
||||
less: ${OBJ}
|
||||
-del lesskey.obj
|
||||
${LD} ${LDFLAGS} ${LIBDIR}\c0x32.obj *.obj, $@,,${LIBS}
|
||||
${LD} ${LDFLAGS} ${LIBDIR}\c0x32.obj $**, $@,,${LIBS}
|
||||
|
||||
lesskey: lesskey.obj version.obj
|
||||
${LD} ${LDFLAGS} ${LIBDIR}\c0x32.obj lesskey.obj version.obj, $@,,${LIBS}
|
||||
${LD} ${LDFLAGS} ${LIBDIR}\c0x32.obj $**, $@,,${LIBS}
|
||||
|
||||
lessecho: lessecho.obj version.obj
|
||||
${LD} ${LDFLAGS} ${LIBDIR}\c0x32.obj $**, $@,,${LIBS}
|
||||
|
||||
defines.h: defines.wn
|
||||
-del defines.h
|
||||
@ -44,6 +55,16 @@ ${OBJ}: less.h defines.h funcs.h cmd.h
|
||||
|
||||
clean:
|
||||
-del *.obj
|
||||
-del *.il?
|
||||
-del *.tds
|
||||
-del defines.h
|
||||
|
||||
spotless: clean
|
||||
-del less.exe
|
||||
-del lesskey.exe
|
||||
-del lessecho.exe
|
||||
|
||||
realclean: spotless
|
||||
|
||||
distclean: spotless
|
||||
|
||||
|
@ -7,12 +7,67 @@
|
||||
http://www.greenwoodsoftware.com/less
|
||||
You can also download the latest version of less from there.
|
||||
|
||||
To report bugs, suggestions or comments, send email to
|
||||
bug-less@gnu.org or markn@greenwoodsoftware.com.
|
||||
To report bugs, suggestions or comments, send email to bug-less@gnu.org.
|
||||
|
||||
======================================================================
|
||||
|
||||
|
||||
Major changes between "less" versions 382 and 394
|
||||
|
||||
* Add history file to save search and shell command history between
|
||||
invocations of less.
|
||||
|
||||
* Improve behavior of history list for search and shell commands.
|
||||
|
||||
* Add -K (or --quit-on-intr) option to make less exit immediately on ctrl-C.
|
||||
|
||||
* Improve handling of UTF-8 files and commands, including better
|
||||
line wrapping and handling double-width chars.
|
||||
|
||||
* Added LESSUTFBINFMT environment variable to control display of
|
||||
non-printable characters in a UTF-8 file.
|
||||
|
||||
* Add --with-secure option to configure, to make it easier to
|
||||
build a secure version of less.
|
||||
|
||||
* Show search matches in the status column even if search highlights
|
||||
are disabled via the -G option or the ESC-u command.
|
||||
|
||||
* Improve performance when the file contains very long lines.
|
||||
|
||||
* Add "windows" charset.
|
||||
|
||||
* Add man page for lessecho.
|
||||
|
||||
* Add support for erase2 character, treated same as erase.
|
||||
|
||||
* Use ASCII lowercase/uppercase logic when operating on the command line.
|
||||
|
||||
* Update makefile for Borland C++ 5.5.1.
|
||||
|
||||
* Fix bug in calculating number of pages for %D prompt.
|
||||
|
||||
* Fix bug in handling tag file error.
|
||||
|
||||
* Fix obscure bug if input file is deleted while viewing help.
|
||||
|
||||
* Fix bug handling filenames which include square brackets.
|
||||
|
||||
* Fix possible buffer overflow in "global" tag search.
|
||||
|
||||
* Fix possible buffer overflow in usage of LESSOPEN and LESSCLOSE.
|
||||
|
||||
* Fix buffer overflow in reverse search.
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 381 and 382
|
||||
|
||||
* Removed some old copyrighted code.
|
||||
This probably breaks OS/9 support.
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 378 and 381
|
||||
|
||||
* New -L option to disable LESSOPEN processing.
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
Less, version 381
|
||||
Less, version 394
|
||||
|
||||
This is the distribution of less, version 381, released 17 Jan 2003.
|
||||
This is the distribution of less, version 394, released 03 Dec 2005.
|
||||
This program is part of the GNU project (http://www.gnu.org).
|
||||
|
||||
This program is free software. You may redistribute it and/or
|
||||
@ -57,6 +57,10 @@ INSTALLATION (Unix systems only):
|
||||
regcomp Use the V8-compatible regcomp.
|
||||
regcomp-local Use Henry Spencer's V8-compatible regcomp
|
||||
(source is supplied with less).
|
||||
--with-secure
|
||||
Builds a "secure" version of less, with some features disabled
|
||||
to prevent users from viewing other files, accessing shell
|
||||
commands, etc.
|
||||
|
||||
3. It is a good idea to look over the generated Makefile and defines.h
|
||||
and make sure they look ok. If you know of any peculiarities of
|
||||
@ -67,9 +71,6 @@ INSTALLATION (Unix systems only):
|
||||
-lncurses -lcurses -ltermcap -ltermlib
|
||||
|
||||
If you wish, you may edit defines.h to remove some optional features.
|
||||
If you wish to build a "secure" version of less (which disables all
|
||||
features which might allow a user to do unintended things to the system
|
||||
on which less is running), edit defines.h and define SECURE to 1.
|
||||
If you choose not to include some features in your version, you may
|
||||
wish to edit the manual page "less.nro" and the help page "less.hlp"
|
||||
to remove the descriptions of the features which you are removing.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -18,8 +18,11 @@
|
||||
#if HAVE_LOCALE
|
||||
#include <locale.h>
|
||||
#include <ctype.h>
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
|
||||
#include "charset.h"
|
||||
|
||||
public int utf_mode = 0;
|
||||
|
||||
/*
|
||||
@ -32,22 +35,75 @@ struct charset {
|
||||
char *desc;
|
||||
} charsets[] = {
|
||||
{ "ascii", NULL, "8bcccbcc18b95.b" },
|
||||
{ "dos", NULL, "8bcccbcc12bc5b223.b" },
|
||||
{ "utf-8", &utf_mode, "8bcccbcc18b95.b126.bb" },
|
||||
{ "iso8859", NULL, "8bcccbcc18b95.33b." },
|
||||
{ "latin3", NULL, "8bcccbcc18b95.33b5.b8.b15.b4.b12.b18.b12.b." },
|
||||
{ "arabic", NULL, "8bcccbcc18b95.33b.3b.7b2.13b.3b.b26.5b19.b" },
|
||||
{ "greek", NULL, "8bcccbcc18b95.33b4.2b4.b3.b35.b44.b" },
|
||||
{ "greek2005", NULL, "8bcccbcc18b95.33b14.b35.b44.b" },
|
||||
{ "hebrew", NULL, "8bcccbcc18b95.33b.b29.32b28.2b2.b" },
|
||||
{ "koi8-r", NULL, "8bcccbcc18b95.b." },
|
||||
{ "KOI8-T", NULL, "8bcccbcc18b95.b8.b6.b8.b.b.5b7.3b4.b4.b3.b.b.3b." },
|
||||
{ "georgianps", NULL, "8bcccbcc18b95.3b11.4b12.2b." },
|
||||
{ "tcvn", NULL, "b..b...bcccbccbbb7.8b95.b48.5b." },
|
||||
{ "TIS-620", NULL, "8bcccbcc18b95.b.4b.11b7.8b." },
|
||||
{ "next", NULL, "8bcccbcc18b95.bb125.bb" },
|
||||
{ "dos", NULL, "8bcccbcc12bc5b95.b." },
|
||||
{ "windows-1251", NULL, "8bcccbcc12bc5b95.b24.b." },
|
||||
{ "windows-1252", NULL, "8bcccbcc12bc5b95.b.b11.b.2b12.b." },
|
||||
{ "windows-1255", NULL, "8bcccbcc12bc5b95.b.b8.b.5b9.b.4b." },
|
||||
{ "ebcdic", NULL, "5bc6bcc7bcc41b.9b7.9b5.b..8b6.10b6.b9.7b9.8b8.17b3.3b9.7b9.8b8.6b10.b.b.b." },
|
||||
{ "IBM-1047", NULL, "4cbcbc3b9cbccbccbb4c6bcc5b3cbbc4bc4bccbc191.b" },
|
||||
{ "iso8859", NULL, "8bcccbcc18b95.33b." },
|
||||
{ "koi8-r", NULL, "8bcccbcc18b95.b128." },
|
||||
{ "next", NULL, "8bcccbcc18b95.bb125.bb" },
|
||||
{ "utf-8", &utf_mode, "8bcccbcc18b." },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
/*
|
||||
* Support "locale charmap"/nl_langinfo(CODESET) values, as well as others.
|
||||
*/
|
||||
struct cs_alias {
|
||||
char *name;
|
||||
char *oname;
|
||||
} cs_aliases[] = {
|
||||
{ "UTF-8", "utf-8" },
|
||||
{ "ANSI_X3.4-1968", "ascii" },
|
||||
{ "US-ASCII", "ascii" },
|
||||
{ "latin1", "iso8859" },
|
||||
{ "ISO-8859-1", "iso8859" },
|
||||
{ "latin9", "iso8859" },
|
||||
{ "ISO-8859-15", "iso8859" },
|
||||
{ "latin2", "iso8859" },
|
||||
{ "ISO-8859-2", "iso8859" },
|
||||
{ "ISO-8859-3", "latin3" },
|
||||
{ "latin4", "iso8859" },
|
||||
{ "ISO-8859-4", "iso8859" },
|
||||
{ "cyrillic", "iso8859" },
|
||||
{ "ISO-8859-5", "iso8859" },
|
||||
{ "ISO-8859-6", "arabic" },
|
||||
{ "ISO-8859-7", "greek" },
|
||||
{ "IBM9005", "greek2005" },
|
||||
{ "ISO-8859-8", "hebrew" },
|
||||
{ "latin5", "iso8859" },
|
||||
{ "ISO-8859-9", "iso8859" },
|
||||
{ "latin6", "iso8859" },
|
||||
{ "ISO-8859-10", "iso8859" },
|
||||
{ "latin7", "iso8859" },
|
||||
{ "ISO-8859-13", "iso8859" },
|
||||
{ "latin8", "iso8859" },
|
||||
{ "ISO-8859-14", "iso8859" },
|
||||
{ "latin10", "iso8859" },
|
||||
{ "ISO-8859-16", "iso8859" },
|
||||
{ "IBM437", "dos" },
|
||||
{ "EBCDIC-US", "ebcdic" },
|
||||
{ "IBM1047", "IBM-1047" },
|
||||
{ "KOI8-R", "koi8-r" },
|
||||
{ "KOI8-U", "koi8-r" },
|
||||
{ "GEORGIAN-PS", "georgianps" },
|
||||
{ "TCVN5712-1", "tcvn" },
|
||||
{ "NEXTSTEP", "next" },
|
||||
{ "windows", "windows-1252" }, /* backward compatibility */
|
||||
{ "CP1251", "windows-1251" },
|
||||
{ "CP1252", "windows-1252" },
|
||||
{ "CP1255", "windows-1255" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
@ -56,6 +112,7 @@ struct cs_alias {
|
||||
|
||||
static char chardef[256];
|
||||
static char *binfmt = NULL;
|
||||
static char *utfbinfmt = NULL;
|
||||
public int binattr = AT_STANDOUT;
|
||||
|
||||
|
||||
@ -131,8 +188,9 @@ ichardef(s)
|
||||
* The valid charset names are listed in the "charsets" array.
|
||||
*/
|
||||
static int
|
||||
icharset(name)
|
||||
icharset(name, no_error)
|
||||
register char *name;
|
||||
int no_error;
|
||||
{
|
||||
register struct charset *p;
|
||||
register struct cs_alias *a;
|
||||
@ -161,9 +219,10 @@ icharset(name)
|
||||
}
|
||||
}
|
||||
|
||||
if (!no_error) {
|
||||
error("invalid charset name", NULL_PARG);
|
||||
quit(QUIT_ERROR);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -176,7 +235,6 @@ ilocale()
|
||||
{
|
||||
register int c;
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
for (c = 0; c < (int) sizeof(chardef); c++)
|
||||
{
|
||||
if (isprint(c))
|
||||
@ -190,17 +248,39 @@ ilocale()
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define the printing format for control chars.
|
||||
* Define the printing format for control (or binary utf) chars.
|
||||
*/
|
||||
public void
|
||||
setbinfmt(s)
|
||||
static void
|
||||
setbinfmt(s, fmtvarptr, default_fmt)
|
||||
char *s;
|
||||
char **fmtvarptr;
|
||||
char *default_fmt;
|
||||
{
|
||||
if (s == NULL || *s == '\0')
|
||||
s = "*s<%X>";
|
||||
if (s && utf_mode)
|
||||
{
|
||||
/* It would be too hard to account for width otherwise. */
|
||||
char *t = s;
|
||||
while (*t)
|
||||
{
|
||||
if (*t < ' ' || *t > '~')
|
||||
{
|
||||
s = default_fmt;
|
||||
goto attr;
|
||||
}
|
||||
t++;
|
||||
}
|
||||
}
|
||||
|
||||
/* %n is evil */
|
||||
if (s == NULL || *s == '\0' ||
|
||||
(*s == '*' && (s[1] == '\0' || s[2] == '\0' || strchr(s + 2, 'n'))) ||
|
||||
(*s != '*' && strchr(s, 'n')))
|
||||
s = default_fmt;
|
||||
|
||||
/*
|
||||
* Select the attributes if it starts with "*".
|
||||
*/
|
||||
attr:
|
||||
if (*s == '*')
|
||||
{
|
||||
switch (s[1])
|
||||
@ -213,26 +293,24 @@ setbinfmt(s)
|
||||
}
|
||||
s += 2;
|
||||
}
|
||||
binfmt = s;
|
||||
*fmtvarptr = s;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize charset data structures.
|
||||
*
|
||||
*/
|
||||
public void
|
||||
init_charset()
|
||||
static void
|
||||
set_charset()
|
||||
{
|
||||
register char *s;
|
||||
|
||||
s = lgetenv("LESSBINFMT");
|
||||
setbinfmt(s);
|
||||
char *s;
|
||||
|
||||
/*
|
||||
* See if environment variable LESSCHARSET is defined.
|
||||
*/
|
||||
s = lgetenv("LESSCHARSET");
|
||||
if (icharset(s))
|
||||
if (icharset(s, 0))
|
||||
return;
|
||||
|
||||
/*
|
||||
* LESSCHARSET is not defined: try LESSCHARDEF.
|
||||
*/
|
||||
@ -243,6 +321,15 @@ init_charset()
|
||||
return;
|
||||
}
|
||||
|
||||
#if HAVE_LOCALE
|
||||
/*
|
||||
* Try using the codeset name as the charset name.
|
||||
*/
|
||||
s = nl_langinfo(CODESET);
|
||||
if (icharset(s, 1))
|
||||
return;
|
||||
#endif
|
||||
|
||||
#if HAVE_STRSTR
|
||||
/*
|
||||
* Check whether LC_ALL, LC_CTYPE or LANG look like UTF-8 is used.
|
||||
@ -251,32 +338,54 @@ init_charset()
|
||||
(s = lgetenv("LC_CTYPE")) != NULL ||
|
||||
(s = lgetenv("LANG")) != NULL)
|
||||
{
|
||||
if (strstr(s, "UTF-8") != NULL || strstr(s, "utf-8") != NULL)
|
||||
if (icharset("utf-8"))
|
||||
if ( strstr(s, "UTF-8") != NULL || strstr(s, "utf-8") != NULL
|
||||
|| strstr(s, "UTF8") != NULL || strstr(s, "utf8") != NULL)
|
||||
if (icharset("utf-8", 1))
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_LOCALE
|
||||
/*
|
||||
* Use setlocale.
|
||||
* Get character definitions from locale functions,
|
||||
* rather than from predefined charset entry.
|
||||
*/
|
||||
ilocale();
|
||||
#else
|
||||
#if MSDOS_COMPILER
|
||||
/*
|
||||
* Default to "dos".
|
||||
*/
|
||||
(void) icharset("dos");
|
||||
(void) icharset("dos", 1);
|
||||
#else
|
||||
/*
|
||||
* Default to "latin1".
|
||||
*/
|
||||
(void) icharset("latin1");
|
||||
(void) icharset("latin1", 1);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize charset data structures.
|
||||
*/
|
||||
public void
|
||||
init_charset()
|
||||
{
|
||||
char *s;
|
||||
|
||||
#if HAVE_LOCALE
|
||||
setlocale(LC_ALL, "");
|
||||
#endif
|
||||
|
||||
set_charset();
|
||||
|
||||
s = lgetenv("LESSBINFMT");
|
||||
setbinfmt(s, &binfmt, "*s<%02X>");
|
||||
|
||||
s = lgetenv("LESSUTFBINFMT");
|
||||
setbinfmt(s, &utfbinfmt, "<U+%04lX>");
|
||||
}
|
||||
|
||||
/*
|
||||
* Is a given character a "binary" character?
|
||||
*/
|
||||
@ -307,16 +416,17 @@ control_char(c)
|
||||
prchar(c)
|
||||
int c;
|
||||
{
|
||||
static char buf[8];
|
||||
/* {{ This buffer can be overrun if LESSBINFMT is a long string. }} */
|
||||
static char buf[32];
|
||||
|
||||
c &= 0377;
|
||||
if (!control_char(c))
|
||||
sprintf(buf, "%c", c);
|
||||
if ((c < 128 || !utf_mode) && !control_char(c))
|
||||
SNPRINTF1(buf, sizeof(buf), "%c", c);
|
||||
else if (c == ESC)
|
||||
sprintf(buf, "ESC");
|
||||
strcpy(buf, "ESC");
|
||||
#if IS_EBCDIC_HOST
|
||||
else if (!binary_char(c) && c < 64)
|
||||
sprintf(buf, "^%c",
|
||||
SNPRINTF1(buf, sizeof(buf), "^%c",
|
||||
/*
|
||||
* This array roughly inverts CONTROL() #defined in less.h,
|
||||
* and should be kept in sync with CONTROL() and IBM-1047.
|
||||
@ -328,9 +438,598 @@ prchar(c)
|
||||
"..V....D....TU.Z"[c]);
|
||||
#else
|
||||
else if (c < 128 && !control_char(c ^ 0100))
|
||||
sprintf(buf, "^%c", c ^ 0100);
|
||||
SNPRINTF1(buf, sizeof(buf), "^%c", c ^ 0100);
|
||||
#endif
|
||||
else
|
||||
sprintf(buf, binfmt, c);
|
||||
SNPRINTF1(buf, sizeof(buf), binfmt, c);
|
||||
return (buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the printable form of a UTF-8 character.
|
||||
*/
|
||||
public char *
|
||||
prutfchar(ch)
|
||||
LWCHAR ch;
|
||||
{
|
||||
static char buf[32];
|
||||
|
||||
if (ch == ESC)
|
||||
strcpy(buf, "ESC");
|
||||
else if (ch < 128 && control_char(ch))
|
||||
{
|
||||
if (!control_char(ch ^ 0100))
|
||||
SNPRINTF1(buf, sizeof(buf), "^%c", ((char) ch) ^ 0100);
|
||||
else
|
||||
SNPRINTF1(buf, sizeof(buf), binfmt, (char) ch);
|
||||
} else if (is_ubin_char(ch))
|
||||
SNPRINTF1(buf, sizeof(buf), utfbinfmt, ch);
|
||||
else
|
||||
{
|
||||
int len;
|
||||
if (ch >= 0x80000000)
|
||||
{
|
||||
len = 3;
|
||||
ch = 0xFFFD;
|
||||
} else
|
||||
{
|
||||
len = (ch < 0x80) ? 1
|
||||
: (ch < 0x800) ? 2
|
||||
: (ch < 0x10000) ? 3
|
||||
: (ch < 0x200000) ? 4
|
||||
: (ch < 0x4000000) ? 5
|
||||
: 6;
|
||||
}
|
||||
buf[len] = '\0';
|
||||
if (len == 1)
|
||||
*buf = (char) ch;
|
||||
else
|
||||
{
|
||||
*buf = ((1 << len) - 1) << (8 - len);
|
||||
while (--len > 0)
|
||||
{
|
||||
buf[len] = (char) (0x80 | (ch & 0x3F));
|
||||
ch >>= 6;
|
||||
}
|
||||
*buf |= ch;
|
||||
}
|
||||
}
|
||||
return (buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the length of a UTF-8 character in bytes.
|
||||
*/
|
||||
public int
|
||||
utf_len(ch)
|
||||
char ch;
|
||||
{
|
||||
if ((ch & 0x80) == 0)
|
||||
return 1;
|
||||
if ((ch & 0xE0) == 0xC0)
|
||||
return 2;
|
||||
if ((ch & 0xF0) == 0xE0)
|
||||
return 3;
|
||||
if ((ch & 0xF8) == 0xF0)
|
||||
return 4;
|
||||
if ((ch & 0xFC) == 0xF8)
|
||||
return 5;
|
||||
if ((ch & 0xFE) == 0xFC)
|
||||
return 6;
|
||||
/* Invalid UTF-8 encoding. */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Is a UTF-8 character well-formed?
|
||||
*/
|
||||
public int
|
||||
is_utf8_well_formed(s)
|
||||
unsigned char *s;
|
||||
{
|
||||
int i;
|
||||
int len;
|
||||
|
||||
if (IS_UTF8_INVALID(s[0]))
|
||||
return (0);
|
||||
|
||||
len = utf_len((char) s[0]);
|
||||
if (len == 1)
|
||||
return (1);
|
||||
if (len == 2)
|
||||
{
|
||||
if (s[0] < 0xC2)
|
||||
return (0);
|
||||
} else
|
||||
{
|
||||
unsigned char mask;
|
||||
mask = (~((1 << (8-len)) - 1)) & 0xFF;
|
||||
if (s[0] == mask && (s[1] & mask) == 0x80)
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (i = 1; i < len; i++)
|
||||
if (!IS_UTF8_TRAIL(s[i]))
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the value of a UTF-8 character.
|
||||
*/
|
||||
public LWCHAR
|
||||
get_wchar(p)
|
||||
char *p;
|
||||
{
|
||||
switch (utf_len(p[0]))
|
||||
{
|
||||
case 1:
|
||||
default:
|
||||
return (LWCHAR)
|
||||
(p[0] & 0xFF);
|
||||
case 2:
|
||||
return (LWCHAR) (
|
||||
((p[0] & 0x1F) << 6) |
|
||||
(p[1] & 0x3F));
|
||||
case 3:
|
||||
return (LWCHAR) (
|
||||
((p[0] & 0x0F) << 12) |
|
||||
((p[1] & 0x3F) << 6) |
|
||||
(p[2] & 0x3F));
|
||||
case 4:
|
||||
return (LWCHAR) (
|
||||
((p[0] & 0x07) << 18) |
|
||||
((p[1] & 0x3F) << 12) |
|
||||
((p[2] & 0x3F) << 6) |
|
||||
(p[3] & 0x3F));
|
||||
case 5:
|
||||
return (LWCHAR) (
|
||||
((p[0] & 0x03) << 24) |
|
||||
((p[1] & 0x3F) << 18) |
|
||||
((p[2] & 0x3F) << 12) |
|
||||
((p[3] & 0x3F) << 6) |
|
||||
(p[4] & 0x3F));
|
||||
case 6:
|
||||
return (LWCHAR) (
|
||||
((p[0] & 0x01) << 30) |
|
||||
((p[1] & 0x3F) << 24) |
|
||||
((p[2] & 0x3F) << 18) |
|
||||
((p[3] & 0x3F) << 12) |
|
||||
((p[4] & 0x3F) << 6) |
|
||||
(p[5] & 0x3F));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Step forward or backward one character in a string.
|
||||
*/
|
||||
public LWCHAR
|
||||
step_char(pp, dir, limit)
|
||||
char **pp;
|
||||
signed int dir;
|
||||
char *limit;
|
||||
{
|
||||
LWCHAR ch;
|
||||
char *p = *pp;
|
||||
|
||||
if (!utf_mode)
|
||||
{
|
||||
/* It's easy if chars are one byte. */
|
||||
if (dir > 0)
|
||||
ch = (LWCHAR) ((p < limit) ? *p++ : 0);
|
||||
else
|
||||
ch = (LWCHAR) ((p > limit) ? *--p : 0);
|
||||
} else if (dir > 0)
|
||||
{
|
||||
if (p + utf_len(*p) > limit)
|
||||
ch = 0;
|
||||
else
|
||||
{
|
||||
ch = get_wchar(p);
|
||||
p++;
|
||||
while (IS_UTF8_TRAIL(*p))
|
||||
p++;
|
||||
}
|
||||
} else
|
||||
{
|
||||
while (p > limit && IS_UTF8_TRAIL(p[-1]))
|
||||
p--;
|
||||
if (p > limit)
|
||||
ch = get_wchar(--p);
|
||||
else
|
||||
ch = 0;
|
||||
}
|
||||
*pp = p;
|
||||
return ch;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unicode characters data
|
||||
*/
|
||||
struct wchar_range { LWCHAR first, last; };
|
||||
|
||||
static struct wchar_range comp_table[] = {
|
||||
{0x300,0x357}, {0x35d,0x36f}, {0x483,0x486}, {0x488,0x489},
|
||||
{0x591,0x5a1}, {0x5a3,0x5b9}, {0x5bb,0x5bd}, {0x5bf,0x5bf},
|
||||
{0x5c1,0x5c2}, {0x5c4,0x5c4}, {0x610,0x615}, {0x64b,0x658},
|
||||
{0x670,0x670}, {0x6d6,0x6dc}, {0x6de,0x6e4}, {0x6e7,0x6e8},
|
||||
{0x6ea,0x6ed}, {0x711,0x711}, {0x730,0x74a}, {0x7a6,0x7b0},
|
||||
{0x901,0x902}, {0x93c,0x93c}, {0x941,0x948}, {0x94d,0x94d},
|
||||
{0x951,0x954}, {0x962,0x963}, {0x981,0x981}, {0x9bc,0x9bc},
|
||||
{0x9c1,0x9c4}, {0x9cd,0x9cd}, {0x9e2,0x9e3}, {0xa01,0xa02},
|
||||
{0xa3c,0xa3c}, {0xa41,0xa42}, {0xa47,0xa48}, {0xa4b,0xa4d},
|
||||
{0xa70,0xa71}, {0xa81,0xa82}, {0xabc,0xabc}, {0xac1,0xac5},
|
||||
{0xac7,0xac8}, {0xacd,0xacd}, {0xae2,0xae3}, {0xb01,0xb01},
|
||||
{0xb3c,0xb3c}, {0xb3f,0xb3f}, {0xb41,0xb43}, {0xb4d,0xb4d},
|
||||
{0xb56,0xb56}, {0xb82,0xb82}, {0xbc0,0xbc0}, {0xbcd,0xbcd},
|
||||
{0xc3e,0xc40}, {0xc46,0xc48}, {0xc4a,0xc4d}, {0xc55,0xc56},
|
||||
{0xcbc,0xcbc}, {0xcbf,0xcbf}, {0xcc6,0xcc6}, {0xccc,0xccd},
|
||||
{0xd41,0xd43}, {0xd4d,0xd4d}, {0xdca,0xdca}, {0xdd2,0xdd4},
|
||||
{0xdd6,0xdd6}, {0xe31,0xe31}, {0xe34,0xe3a}, {0xe47,0xe4e},
|
||||
{0xeb1,0xeb1}, {0xeb4,0xeb9}, {0xebb,0xebc}, {0xec8,0xecd},
|
||||
{0xf18,0xf19}, {0xf35,0xf35}, {0xf37,0xf37}, {0xf39,0xf39},
|
||||
{0xf71,0xf7e}, {0xf80,0xf84}, {0xf86,0xf87}, {0xf90,0xf97},
|
||||
{0xf99,0xfbc}, {0xfc6,0xfc6}, {0x102d,0x1030}, {0x1032,0x1032},
|
||||
{0x1036,0x1037}, {0x1039,0x1039}, {0x1058,0x1059},
|
||||
{0x1712,0x1714}, {0x1732,0x1734}, {0x1752,0x1753},
|
||||
{0x1772,0x1773}, {0x17b7,0x17bd}, {0x17c6,0x17c6},
|
||||
{0x17c9,0x17d3}, {0x17dd,0x17dd}, {0x180b,0x180d},
|
||||
{0x18a9,0x18a9}, {0x1920,0x1922}, {0x1927,0x1928},
|
||||
{0x1932,0x1932}, {0x1939,0x193b}, {0x20d0,0x20ea},
|
||||
{0x302a,0x302f}, {0x3099,0x309a}, {0xfb1e,0xfb1e},
|
||||
{0xfe00,0xfe0f}, {0xfe20,0xfe23}, {0x1d167,0x1d169},
|
||||
{0x1d17b,0x1d182}, {0x1d185,0x1d18b}, {0x1d1aa,0x1d1ad},
|
||||
{0xe0100,0xe01ef},
|
||||
};
|
||||
|
||||
static struct wchar_range comb_table[] = {
|
||||
{0x0644,0x0622}, {0x0644,0x0623}, {0x0644,0x0625}, {0x0644,0x0627},
|
||||
};
|
||||
|
||||
/*
|
||||
* Characters with general category values
|
||||
* Cc: Other, Control
|
||||
* Cf: Other, Format
|
||||
* Cs: Other, Surrogate
|
||||
* Co: Other, Private Use
|
||||
* Cn: Other, Not Assigned
|
||||
* Zl: Separator, Line
|
||||
* Zp: Separator, Paragraph
|
||||
*/
|
||||
static struct wchar_range ubin_table[] = {
|
||||
{ 0x0000, 0x001f} /* Cc */, { 0x007f, 0x009f} /* Cc */,
|
||||
#if 0
|
||||
{ 0x00ad, 0x00ad} /* Cf */,
|
||||
#endif
|
||||
{ 0x0237, 0x024f} /* Cn */, { 0x0358, 0x035c} /* Cn */,
|
||||
{ 0x0370, 0x0373} /* Cn */, { 0x0376, 0x0379} /* Cn */,
|
||||
{ 0x037b, 0x037d} /* Cn */, { 0x037f, 0x0383} /* Cn */,
|
||||
{ 0x038b, 0x038b} /* Cn */, { 0x038d, 0x038d} /* Cn */,
|
||||
{ 0x03a2, 0x03a2} /* Cn */, { 0x03cf, 0x03cf} /* Cn */,
|
||||
{ 0x03fc, 0x03ff} /* Cn */, { 0x0487, 0x0487} /* Cn */,
|
||||
{ 0x04cf, 0x04cf} /* Cn */, { 0x04f6, 0x04f7} /* Cn */,
|
||||
{ 0x04fa, 0x04ff} /* Cn */, { 0x0510, 0x0530} /* Cn */,
|
||||
{ 0x0557, 0x0558} /* Cn */, { 0x0560, 0x0560} /* Cn */,
|
||||
{ 0x0588, 0x0588} /* Cn */, { 0x058b, 0x0590} /* Cn */,
|
||||
{ 0x05a2, 0x05a2} /* Cn */, { 0x05ba, 0x05ba} /* Cn */,
|
||||
{ 0x05c5, 0x05cf} /* Cn */, { 0x05eb, 0x05ef} /* Cn */,
|
||||
{ 0x05f5, 0x05ff} /* Cn */,
|
||||
#if 0
|
||||
{ 0x0600, 0x0603} /* Cf */,
|
||||
#endif
|
||||
{ 0x0604, 0x060b} /* Cn */, { 0x0616, 0x061a} /* Cn */,
|
||||
{ 0x061c, 0x061e} /* Cn */, { 0x0620, 0x0620} /* Cn */,
|
||||
{ 0x063b, 0x063f} /* Cn */, { 0x0659, 0x065f} /* Cn */,
|
||||
#if 0
|
||||
{ 0x06dd, 0x06dd} /* Cf */,
|
||||
#endif
|
||||
{ 0x070e, 0x070e} /* Cn */,
|
||||
#if 0
|
||||
{ 0x070f, 0x070f} /* Cf */,
|
||||
#endif
|
||||
{ 0x074b, 0x074c} /* Cn */, { 0x0750, 0x077f} /* Cn */,
|
||||
{ 0x07b2, 0x0900} /* Cn */, { 0x093a, 0x093b} /* Cn */,
|
||||
{ 0x094e, 0x094f} /* Cn */, { 0x0955, 0x0957} /* Cn */,
|
||||
{ 0x0971, 0x0980} /* Cn */, { 0x0984, 0x0984} /* Cn */,
|
||||
{ 0x098d, 0x098e} /* Cn */, { 0x0991, 0x0992} /* Cn */,
|
||||
{ 0x09a9, 0x09a9} /* Cn */, { 0x09b1, 0x09b1} /* Cn */,
|
||||
{ 0x09b3, 0x09b5} /* Cn */, { 0x09ba, 0x09bb} /* Cn */,
|
||||
{ 0x09c5, 0x09c6} /* Cn */, { 0x09c9, 0x09ca} /* Cn */,
|
||||
{ 0x09ce, 0x09d6} /* Cn */, { 0x09d8, 0x09db} /* Cn */,
|
||||
{ 0x09de, 0x09de} /* Cn */, { 0x09e4, 0x09e5} /* Cn */,
|
||||
{ 0x09fb, 0x0a00} /* Cn */, { 0x0a04, 0x0a04} /* Cn */,
|
||||
{ 0x0a0b, 0x0a0e} /* Cn */, { 0x0a11, 0x0a12} /* Cn */,
|
||||
{ 0x0a29, 0x0a29} /* Cn */, { 0x0a31, 0x0a31} /* Cn */,
|
||||
{ 0x0a34, 0x0a34} /* Cn */, { 0x0a37, 0x0a37} /* Cn */,
|
||||
{ 0x0a3a, 0x0a3b} /* Cn */, { 0x0a3d, 0x0a3d} /* Cn */,
|
||||
{ 0x0a43, 0x0a46} /* Cn */, { 0x0a49, 0x0a4a} /* Cn */,
|
||||
{ 0x0a4e, 0x0a58} /* Cn */, { 0x0a5d, 0x0a5d} /* Cn */,
|
||||
{ 0x0a5f, 0x0a65} /* Cn */, { 0x0a75, 0x0a80} /* Cn */,
|
||||
{ 0x0a84, 0x0a84} /* Cn */, { 0x0a8e, 0x0a8e} /* Cn */,
|
||||
{ 0x0a92, 0x0a92} /* Cn */, { 0x0aa9, 0x0aa9} /* Cn */,
|
||||
{ 0x0ab1, 0x0ab1} /* Cn */, { 0x0ab4, 0x0ab4} /* Cn */,
|
||||
{ 0x0aba, 0x0abb} /* Cn */, { 0x0ac6, 0x0ac6} /* Cn */,
|
||||
{ 0x0aca, 0x0aca} /* Cn */, { 0x0ace, 0x0acf} /* Cn */,
|
||||
{ 0x0ad1, 0x0adf} /* Cn */, { 0x0ae4, 0x0ae5} /* Cn */,
|
||||
{ 0x0af0, 0x0af0} /* Cn */, { 0x0af2, 0x0b00} /* Cn */,
|
||||
{ 0x0b04, 0x0b04} /* Cn */, { 0x0b0d, 0x0b0e} /* Cn */,
|
||||
{ 0x0b11, 0x0b12} /* Cn */, { 0x0b29, 0x0b29} /* Cn */,
|
||||
{ 0x0b31, 0x0b31} /* Cn */, { 0x0b34, 0x0b34} /* Cn */,
|
||||
{ 0x0b3a, 0x0b3b} /* Cn */, { 0x0b44, 0x0b46} /* Cn */,
|
||||
{ 0x0b49, 0x0b4a} /* Cn */, { 0x0b4e, 0x0b55} /* Cn */,
|
||||
{ 0x0b58, 0x0b5b} /* Cn */, { 0x0b5e, 0x0b5e} /* Cn */,
|
||||
{ 0x0b62, 0x0b65} /* Cn */, { 0x0b72, 0x0b81} /* Cn */,
|
||||
{ 0x0b84, 0x0b84} /* Cn */, { 0x0b8b, 0x0b8d} /* Cn */,
|
||||
{ 0x0b91, 0x0b91} /* Cn */, { 0x0b96, 0x0b98} /* Cn */,
|
||||
{ 0x0b9b, 0x0b9b} /* Cn */, { 0x0b9d, 0x0b9d} /* Cn */,
|
||||
{ 0x0ba0, 0x0ba2} /* Cn */, { 0x0ba5, 0x0ba7} /* Cn */,
|
||||
{ 0x0bab, 0x0bad} /* Cn */, { 0x0bb6, 0x0bb6} /* Cn */,
|
||||
{ 0x0bba, 0x0bbd} /* Cn */, { 0x0bc3, 0x0bc5} /* Cn */,
|
||||
{ 0x0bc9, 0x0bc9} /* Cn */, { 0x0bce, 0x0bd6} /* Cn */,
|
||||
{ 0x0bd8, 0x0be6} /* Cn */, { 0x0bfb, 0x0c00} /* Cn */,
|
||||
{ 0x0c04, 0x0c04} /* Cn */, { 0x0c0d, 0x0c0d} /* Cn */,
|
||||
{ 0x0c11, 0x0c11} /* Cn */, { 0x0c29, 0x0c29} /* Cn */,
|
||||
{ 0x0c34, 0x0c34} /* Cn */, { 0x0c3a, 0x0c3d} /* Cn */,
|
||||
{ 0x0c45, 0x0c45} /* Cn */, { 0x0c49, 0x0c49} /* Cn */,
|
||||
{ 0x0c4e, 0x0c54} /* Cn */, { 0x0c57, 0x0c5f} /* Cn */,
|
||||
{ 0x0c62, 0x0c65} /* Cn */, { 0x0c70, 0x0c81} /* Cn */,
|
||||
{ 0x0c84, 0x0c84} /* Cn */, { 0x0c8d, 0x0c8d} /* Cn */,
|
||||
{ 0x0c91, 0x0c91} /* Cn */, { 0x0ca9, 0x0ca9} /* Cn */,
|
||||
{ 0x0cb4, 0x0cb4} /* Cn */, { 0x0cba, 0x0cbb} /* Cn */,
|
||||
{ 0x0cc5, 0x0cc5} /* Cn */, { 0x0cc9, 0x0cc9} /* Cn */,
|
||||
{ 0x0cce, 0x0cd4} /* Cn */, { 0x0cd7, 0x0cdd} /* Cn */,
|
||||
{ 0x0cdf, 0x0cdf} /* Cn */, { 0x0ce2, 0x0ce5} /* Cn */,
|
||||
{ 0x0cf0, 0x0d01} /* Cn */, { 0x0d04, 0x0d04} /* Cn */,
|
||||
{ 0x0d0d, 0x0d0d} /* Cn */, { 0x0d11, 0x0d11} /* Cn */,
|
||||
{ 0x0d29, 0x0d29} /* Cn */, { 0x0d3a, 0x0d3d} /* Cn */,
|
||||
{ 0x0d44, 0x0d45} /* Cn */, { 0x0d49, 0x0d49} /* Cn */,
|
||||
{ 0x0d4e, 0x0d56} /* Cn */, { 0x0d58, 0x0d5f} /* Cn */,
|
||||
{ 0x0d62, 0x0d65} /* Cn */, { 0x0d70, 0x0d81} /* Cn */,
|
||||
{ 0x0d84, 0x0d84} /* Cn */, { 0x0d97, 0x0d99} /* Cn */,
|
||||
{ 0x0db2, 0x0db2} /* Cn */, { 0x0dbc, 0x0dbc} /* Cn */,
|
||||
{ 0x0dbe, 0x0dbf} /* Cn */, { 0x0dc7, 0x0dc9} /* Cn */,
|
||||
{ 0x0dcb, 0x0dce} /* Cn */, { 0x0dd5, 0x0dd5} /* Cn */,
|
||||
{ 0x0dd7, 0x0dd7} /* Cn */, { 0x0de0, 0x0df1} /* Cn */,
|
||||
{ 0x0df5, 0x0e00} /* Cn */, { 0x0e3b, 0x0e3e} /* Cn */,
|
||||
{ 0x0e5c, 0x0e80} /* Cn */, { 0x0e83, 0x0e83} /* Cn */,
|
||||
{ 0x0e85, 0x0e86} /* Cn */, { 0x0e89, 0x0e89} /* Cn */,
|
||||
{ 0x0e8b, 0x0e8c} /* Cn */, { 0x0e8e, 0x0e93} /* Cn */,
|
||||
{ 0x0e98, 0x0e98} /* Cn */, { 0x0ea0, 0x0ea0} /* Cn */,
|
||||
{ 0x0ea4, 0x0ea4} /* Cn */, { 0x0ea6, 0x0ea6} /* Cn */,
|
||||
{ 0x0ea8, 0x0ea9} /* Cn */, { 0x0eac, 0x0eac} /* Cn */,
|
||||
{ 0x0eba, 0x0eba} /* Cn */, { 0x0ebe, 0x0ebf} /* Cn */,
|
||||
{ 0x0ec5, 0x0ec5} /* Cn */, { 0x0ec7, 0x0ec7} /* Cn */,
|
||||
{ 0x0ece, 0x0ecf} /* Cn */, { 0x0eda, 0x0edb} /* Cn */,
|
||||
{ 0x0ede, 0x0eff} /* Cn */, { 0x0f48, 0x0f48} /* Cn */,
|
||||
{ 0x0f6b, 0x0f70} /* Cn */, { 0x0f8c, 0x0f8f} /* Cn */,
|
||||
{ 0x0f98, 0x0f98} /* Cn */, { 0x0fbd, 0x0fbd} /* Cn */,
|
||||
{ 0x0fcd, 0x0fce} /* Cn */, { 0x0fd0, 0x0fff} /* Cn */,
|
||||
{ 0x1022, 0x1022} /* Cn */, { 0x1028, 0x1028} /* Cn */,
|
||||
{ 0x102b, 0x102b} /* Cn */, { 0x1033, 0x1035} /* Cn */,
|
||||
{ 0x103a, 0x103f} /* Cn */, { 0x105a, 0x109f} /* Cn */,
|
||||
{ 0x10c6, 0x10cf} /* Cn */, { 0x10f9, 0x10fa} /* Cn */,
|
||||
{ 0x10fc, 0x10ff} /* Cn */, { 0x115a, 0x115e} /* Cn */,
|
||||
{ 0x11a3, 0x11a7} /* Cn */, { 0x11fa, 0x11ff} /* Cn */,
|
||||
{ 0x1207, 0x1207} /* Cn */, { 0x1247, 0x1247} /* Cn */,
|
||||
{ 0x1249, 0x1249} /* Cn */, { 0x124e, 0x124f} /* Cn */,
|
||||
{ 0x1257, 0x1257} /* Cn */, { 0x1259, 0x1259} /* Cn */,
|
||||
{ 0x125e, 0x125f} /* Cn */, { 0x1287, 0x1287} /* Cn */,
|
||||
{ 0x1289, 0x1289} /* Cn */, { 0x128e, 0x128f} /* Cn */,
|
||||
{ 0x12af, 0x12af} /* Cn */, { 0x12b1, 0x12b1} /* Cn */,
|
||||
{ 0x12b6, 0x12b7} /* Cn */, { 0x12bf, 0x12bf} /* Cn */,
|
||||
{ 0x12c1, 0x12c1} /* Cn */, { 0x12c6, 0x12c7} /* Cn */,
|
||||
{ 0x12cf, 0x12cf} /* Cn */, { 0x12d7, 0x12d7} /* Cn */,
|
||||
{ 0x12ef, 0x12ef} /* Cn */, { 0x130f, 0x130f} /* Cn */,
|
||||
{ 0x1311, 0x1311} /* Cn */, { 0x1316, 0x1317} /* Cn */,
|
||||
{ 0x131f, 0x131f} /* Cn */, { 0x1347, 0x1347} /* Cn */,
|
||||
{ 0x135b, 0x1360} /* Cn */, { 0x137d, 0x139f} /* Cn */,
|
||||
{ 0x13f5, 0x1400} /* Cn */, { 0x1677, 0x167f} /* Cn */,
|
||||
{ 0x169d, 0x169f} /* Cn */, { 0x16f1, 0x16ff} /* Cn */,
|
||||
{ 0x170d, 0x170d} /* Cn */, { 0x1715, 0x171f} /* Cn */,
|
||||
{ 0x1737, 0x173f} /* Cn */, { 0x1754, 0x175f} /* Cn */,
|
||||
{ 0x176d, 0x176d} /* Cn */, { 0x1771, 0x1771} /* Cn */,
|
||||
{ 0x1774, 0x177f} /* Cn */,
|
||||
#if 0
|
||||
{ 0x17b4, 0x17b5} /* Cf */,
|
||||
#endif
|
||||
{ 0x17de, 0x17df} /* Cn */, { 0x17ea, 0x17ef} /* Cn */,
|
||||
{ 0x17fa, 0x17ff} /* Cn */, { 0x180f, 0x180f} /* Cn */,
|
||||
{ 0x181a, 0x181f} /* Cn */, { 0x1878, 0x187f} /* Cn */,
|
||||
{ 0x18aa, 0x18ff} /* Cn */, { 0x191d, 0x191f} /* Cn */,
|
||||
{ 0x192c, 0x192f} /* Cn */, { 0x193c, 0x193f} /* Cn */,
|
||||
{ 0x1941, 0x1943} /* Cn */, { 0x196e, 0x196f} /* Cn */,
|
||||
{ 0x1975, 0x19df} /* Cn */, { 0x1a00, 0x1cff} /* Cn */,
|
||||
{ 0x1d6c, 0x1dff} /* Cn */, { 0x1e9c, 0x1e9f} /* Cn */,
|
||||
{ 0x1efa, 0x1eff} /* Cn */, { 0x1f16, 0x1f17} /* Cn */,
|
||||
{ 0x1f1e, 0x1f1f} /* Cn */, { 0x1f46, 0x1f47} /* Cn */,
|
||||
{ 0x1f4e, 0x1f4f} /* Cn */, { 0x1f58, 0x1f58} /* Cn */,
|
||||
{ 0x1f5a, 0x1f5a} /* Cn */, { 0x1f5c, 0x1f5c} /* Cn */,
|
||||
{ 0x1f5e, 0x1f5e} /* Cn */, { 0x1f7e, 0x1f7f} /* Cn */,
|
||||
{ 0x1fb5, 0x1fb5} /* Cn */, { 0x1fc5, 0x1fc5} /* Cn */,
|
||||
{ 0x1fd4, 0x1fd5} /* Cn */, { 0x1fdc, 0x1fdc} /* Cn */,
|
||||
{ 0x1ff0, 0x1ff1} /* Cn */, { 0x1ff5, 0x1ff5} /* Cn */,
|
||||
{ 0x1fff, 0x1fff} /* Cn */, { 0x200b, 0x200f} /* Cf */,
|
||||
{ 0x2028, 0x2028} /* Zl */,
|
||||
{ 0x2029, 0x2029} /* Zp */,
|
||||
{ 0x202a, 0x202e} /* Cf */,
|
||||
{ 0x2055, 0x2056} /* Cn */, { 0x2058, 0x205e} /* Cn */,
|
||||
{ 0x2060, 0x2063} /* Cf */,
|
||||
{ 0x2064, 0x2069} /* Cn */,
|
||||
{ 0x206a, 0x206f} /* Cf */,
|
||||
{ 0x2072, 0x2073} /* Cn */, { 0x208f, 0x209f} /* Cn */,
|
||||
{ 0x20b2, 0x20cf} /* Cn */, { 0x20eb, 0x20ff} /* Cn */,
|
||||
{ 0x213c, 0x213c} /* Cn */, { 0x214c, 0x2152} /* Cn */,
|
||||
{ 0x2184, 0x218f} /* Cn */, { 0x23d1, 0x23ff} /* Cn */,
|
||||
{ 0x2427, 0x243f} /* Cn */, { 0x244b, 0x245f} /* Cn */,
|
||||
{ 0x2618, 0x2618} /* Cn */, { 0x267e, 0x267f} /* Cn */,
|
||||
{ 0x2692, 0x269f} /* Cn */, { 0x26a2, 0x2700} /* Cn */,
|
||||
{ 0x2705, 0x2705} /* Cn */, { 0x270a, 0x270b} /* Cn */,
|
||||
{ 0x2728, 0x2728} /* Cn */, { 0x274c, 0x274c} /* Cn */,
|
||||
{ 0x274e, 0x274e} /* Cn */, { 0x2753, 0x2755} /* Cn */,
|
||||
{ 0x2757, 0x2757} /* Cn */, { 0x275f, 0x2760} /* Cn */,
|
||||
{ 0x2795, 0x2797} /* Cn */, { 0x27b0, 0x27b0} /* Cn */,
|
||||
{ 0x27bf, 0x27cf} /* Cn */, { 0x27ec, 0x27ef} /* Cn */,
|
||||
{ 0x2b0e, 0x2e7f} /* Cn */, { 0x2e9a, 0x2e9a} /* Cn */,
|
||||
{ 0x2ef4, 0x2eff} /* Cn */, { 0x2fd6, 0x2fef} /* Cn */,
|
||||
{ 0x2ffc, 0x2fff} /* Cn */, { 0x3040, 0x3040} /* Cn */,
|
||||
{ 0x3097, 0x3098} /* Cn */, { 0x3100, 0x3104} /* Cn */,
|
||||
{ 0x312d, 0x3130} /* Cn */, { 0x318f, 0x318f} /* Cn */,
|
||||
{ 0x31b8, 0x31ef} /* Cn */, { 0x321f, 0x321f} /* Cn */,
|
||||
{ 0x3244, 0x324f} /* Cn */, { 0x327e, 0x327e} /* Cn */,
|
||||
{ 0x32ff, 0x32ff} /* Cn */, { 0x4db6, 0x4dbf} /* Cn */,
|
||||
{ 0x9fa6, 0x9fff} /* Cn */, { 0xa48d, 0xa48f} /* Cn */,
|
||||
{ 0xa4c7, 0xabff} /* Cn */, { 0xd7a4, 0xd7ff} /* Cn */,
|
||||
{ 0xd800, 0xdfff} /* Cs */,
|
||||
{ 0xe000, 0xf8ff} /* Co */,
|
||||
{ 0xfa2e, 0xfa2f} /* Cn */, { 0xfa6b, 0xfaff} /* Cn */,
|
||||
{ 0xfb07, 0xfb12} /* Cn */, { 0xfb18, 0xfb1c} /* Cn */,
|
||||
{ 0xfb37, 0xfb37} /* Cn */, { 0xfb3d, 0xfb3d} /* Cn */,
|
||||
{ 0xfb3f, 0xfb3f} /* Cn */, { 0xfb42, 0xfb42} /* Cn */,
|
||||
{ 0xfb45, 0xfb45} /* Cn */, { 0xfbb2, 0xfbd2} /* Cn */,
|
||||
{ 0xfd40, 0xfd4f} /* Cn */, { 0xfd90, 0xfd91} /* Cn */,
|
||||
{ 0xfdc8, 0xfdef} /* Cn */, { 0xfdfe, 0xfdff} /* Cn */,
|
||||
{ 0xfe10, 0xfe1f} /* Cn */, { 0xfe24, 0xfe2f} /* Cn */,
|
||||
{ 0xfe53, 0xfe53} /* Cn */, { 0xfe67, 0xfe67} /* Cn */,
|
||||
{ 0xfe6c, 0xfe6f} /* Cn */, { 0xfe75, 0xfe75} /* Cn */,
|
||||
{ 0xfefd, 0xfefe} /* Cn */,
|
||||
{ 0xfeff, 0xfeff} /* Cf */,
|
||||
{ 0xff00, 0xff00} /* Cn */, { 0xffbf, 0xffc1} /* Cn */,
|
||||
{ 0xffc8, 0xffc9} /* Cn */, { 0xffd0, 0xffd1} /* Cn */,
|
||||
{ 0xffd8, 0xffd9} /* Cn */, { 0xffdd, 0xffdf} /* Cn */,
|
||||
{ 0xffe7, 0xffe7} /* Cn */, { 0xffef, 0xfff8} /* Cn */,
|
||||
{ 0xfff9, 0xfffb} /* Cf */,
|
||||
{ 0xfffe, 0xffff} /* Cn */, { 0x1000c, 0x1000c} /* Cn */,
|
||||
{ 0x10027, 0x10027} /* Cn */, { 0x1003b, 0x1003b} /* Cn */,
|
||||
{ 0x1003e, 0x1003e} /* Cn */, { 0x1004e, 0x1004f} /* Cn */,
|
||||
{ 0x1005e, 0x1007f} /* Cn */, { 0x100fb, 0x100ff} /* Cn */,
|
||||
{ 0x10103, 0x10106} /* Cn */, { 0x10134, 0x10136} /* Cn */,
|
||||
{ 0x10140, 0x102ff} /* Cn */, { 0x1031f, 0x1031f} /* Cn */,
|
||||
{ 0x10324, 0x1032f} /* Cn */, { 0x1034b, 0x1037f} /* Cn */,
|
||||
{ 0x1039e, 0x1039e} /* Cn */, { 0x103a0, 0x103ff} /* Cn */,
|
||||
{ 0x1049e, 0x1049f} /* Cn */, { 0x104aa, 0x107ff} /* Cn */,
|
||||
{ 0x10806, 0x10807} /* Cn */, { 0x10809, 0x10809} /* Cn */,
|
||||
{ 0x10836, 0x10836} /* Cn */, { 0x10839, 0x1083b} /* Cn */,
|
||||
{ 0x1083d, 0x1083e} /* Cn */, { 0x10840, 0x1cfff} /* Cn */,
|
||||
{ 0x1d0f6, 0x1d0ff} /* Cn */, { 0x1d127, 0x1d129} /* Cn */,
|
||||
{ 0x1d173, 0x1d17a} /* Cf */,
|
||||
{ 0x1d1de, 0x1d2ff} /* Cn */, { 0x1d357, 0x1d3ff} /* Cn */,
|
||||
{ 0x1d455, 0x1d455} /* Cn */, { 0x1d49d, 0x1d49d} /* Cn */,
|
||||
{ 0x1d4a0, 0x1d4a1} /* Cn */, { 0x1d4a3, 0x1d4a4} /* Cn */,
|
||||
{ 0x1d4a7, 0x1d4a8} /* Cn */, { 0x1d4ad, 0x1d4ad} /* Cn */,
|
||||
{ 0x1d4ba, 0x1d4ba} /* Cn */, { 0x1d4bc, 0x1d4bc} /* Cn */,
|
||||
{ 0x1d4c4, 0x1d4c4} /* Cn */, { 0x1d506, 0x1d506} /* Cn */,
|
||||
{ 0x1d50b, 0x1d50c} /* Cn */, { 0x1d515, 0x1d515} /* Cn */,
|
||||
{ 0x1d51d, 0x1d51d} /* Cn */, { 0x1d53a, 0x1d53a} /* Cn */,
|
||||
{ 0x1d53f, 0x1d53f} /* Cn */, { 0x1d545, 0x1d545} /* Cn */,
|
||||
{ 0x1d547, 0x1d549} /* Cn */, { 0x1d551, 0x1d551} /* Cn */,
|
||||
{ 0x1d6a4, 0x1d6a7} /* Cn */, { 0x1d7ca, 0x1d7cd} /* Cn */,
|
||||
{ 0x1d800, 0x1ffff} /* Cn */, { 0x2a6d7, 0x2f7ff} /* Cn */,
|
||||
{ 0x2fa1e, 0xe0000} /* Cn */,
|
||||
{ 0xe0001, 0xe0001} /* Cf */,
|
||||
{ 0xe0002, 0xe001f} /* Cn */,
|
||||
{ 0xe0020, 0xe007f} /* Cf */,
|
||||
{ 0xe0080, 0xe00ff} /* Cn */, { 0xe01f0, 0xeffff} /* Cn */,
|
||||
{ 0xf0000, 0xffffd} /* Co */,
|
||||
{ 0xffffe, 0xfffff} /* Cn */,
|
||||
{0x100000,0x10fffd} /* Co */,
|
||||
{0x10fffe,0x10ffff} /* Cn */,
|
||||
{0x110000,0x7fffffff} /* ISO 10646?? */
|
||||
};
|
||||
|
||||
/*
|
||||
* Double width characters
|
||||
* W: East Asian Wide
|
||||
* F: East Asian Full-width
|
||||
*/
|
||||
static struct wchar_range wide_table[] = {
|
||||
{ 0x1100, 0x115f} /* W */, { 0x2329, 0x232a} /* W */,
|
||||
{ 0x2E80, 0x2FFB} /* W */,
|
||||
{ 0x3000, 0x3000} /* F */,
|
||||
{ 0x3001, 0x303E} /* W */, { 0x3041, 0x4DB5} /* W */,
|
||||
{ 0x4E00, 0x9FA5} /* W */, { 0xA000, 0xA4C6} /* W */,
|
||||
{ 0xAC00, 0xD7A3} /* W */, { 0xF900, 0xFA6A} /* W */,
|
||||
{ 0xFE30, 0xFE6B} /* W */,
|
||||
{ 0xFF01, 0xFF60} /* F */, { 0xFFE0, 0xFFE6} /* F */,
|
||||
{ 0x20000, 0x2FFFD} /* W */, { 0x30000, 0x3FFFD} /* W */,
|
||||
|
||||
};
|
||||
|
||||
static int
|
||||
is_in_table(ch, table, tsize)
|
||||
LWCHAR ch;
|
||||
struct wchar_range table[];
|
||||
int tsize;
|
||||
{
|
||||
int hi;
|
||||
int lo;
|
||||
|
||||
/* Binary search in the table. */
|
||||
if (ch < table[0].first)
|
||||
return 0;
|
||||
lo = 0;
|
||||
hi = tsize - 1;
|
||||
while (lo <= hi)
|
||||
{
|
||||
int mid = (lo + hi) / 2;
|
||||
if (ch > table[mid].last)
|
||||
lo = mid + 1;
|
||||
else if (ch < table[mid].first)
|
||||
hi = mid - 1;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Is a character a UTF-8 composing character?
|
||||
* If a composing character follows any char, the two combine into one glyph.
|
||||
*/
|
||||
public int
|
||||
is_composing_char(ch)
|
||||
LWCHAR ch;
|
||||
{
|
||||
return is_in_table(ch, comp_table, (sizeof(comp_table) / sizeof(*comp_table)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Should this UTF-8 character be treated as binary?
|
||||
*/
|
||||
public int
|
||||
is_ubin_char(ch)
|
||||
LWCHAR ch;
|
||||
{
|
||||
return is_in_table(ch, ubin_table, (sizeof(ubin_table) / sizeof(*ubin_table)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Is this a double width UTF-8 character?
|
||||
*/
|
||||
public int
|
||||
is_wide_char(ch)
|
||||
LWCHAR ch;
|
||||
{
|
||||
return is_in_table(ch, wide_table, (sizeof(wide_table) / sizeof(*wide_table)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Is a character a UTF-8 combining character?
|
||||
* A combining char acts like an ordinary char, but if it follows
|
||||
* a specific char (not any char), the two combine into one glyph.
|
||||
*/
|
||||
public int
|
||||
is_combining_char(ch1, ch2)
|
||||
LWCHAR ch1;
|
||||
LWCHAR ch2;
|
||||
{
|
||||
/* The table is small; use linear search. */
|
||||
int i;
|
||||
for (i = 0; i < sizeof(comb_table)/sizeof(*comb_table); i++)
|
||||
{
|
||||
if (ch1 == comb_table[i].first &&
|
||||
ch2 == comb_table[i].last)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
19
contrib/less/charset.h
Normal file
19
contrib/less/charset.h
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (C) 2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
*
|
||||
* For more information about less, or for information on how to
|
||||
* contact the author, see the README file.
|
||||
*/
|
||||
|
||||
#define IS_ASCII_OCTET(c) (((c) & 0x80) == 0)
|
||||
#define IS_UTF8_TRAIL(c) (((c) & 0xC0) == 0x80)
|
||||
#define IS_UTF8_LEAD2(c) (((c) & 0xE0) == 0xC0)
|
||||
#define IS_UTF8_LEAD3(c) (((c) & 0xF0) == 0xE0)
|
||||
#define IS_UTF8_LEAD4(c) (((c) & 0xF8) == 0xF0)
|
||||
#define IS_UTF8_LEAD5(c) (((c) & 0xFC) == 0xF8)
|
||||
#define IS_UTF8_LEAD6(c) (((c) & 0xFE) == 0xFC)
|
||||
#define IS_UTF8_INVALID(c) (((c) & 0xFE) == 0xFE)
|
||||
#define IS_UTF8_LEAD(c) (((c) & 0xC0) == 0xC0 && !IS_UTF8_INVALID(c))
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -16,8 +16,13 @@
|
||||
|
||||
#include "less.h"
|
||||
#include "cmd.h"
|
||||
#include "charset.h"
|
||||
#if HAVE_STAT
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
extern int sc_width;
|
||||
extern int utf_mode;
|
||||
|
||||
static char cmdbuf[CMDBUF_SIZE]; /* Buffer for holding a multi-char command */
|
||||
static int cmd_col; /* Current column of the cursor */
|
||||
@ -48,6 +53,12 @@ public char closequote = '"';
|
||||
#endif
|
||||
|
||||
#if CMD_HISTORY
|
||||
|
||||
/* History file */
|
||||
#define HISTFILE_FIRST_LINE ".less-history-file:"
|
||||
#define HISTFILE_SEARCH_SECTION ".search"
|
||||
#define HISTFILE_SHELL_SECTION ".shell"
|
||||
|
||||
/*
|
||||
* A mlist structure represents a command history.
|
||||
*/
|
||||
@ -93,6 +104,10 @@ public void * constant ml_shell = (void *)3;
|
||||
static struct mlist *curr_mlist = NULL;
|
||||
static int curr_cmdflags;
|
||||
|
||||
static char cmd_mbc_buf[MAX_UTF_CHAR_LEN];
|
||||
static int cmd_mbc_buf_len;
|
||||
static int cmd_mbc_buf_index;
|
||||
|
||||
|
||||
/*
|
||||
* Reset command buffer (to empty).
|
||||
@ -105,6 +120,7 @@ cmd_reset()
|
||||
cmd_col = 0;
|
||||
cmd_offset = 0;
|
||||
literal = 0;
|
||||
cmd_mbc_buf_len = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -115,6 +131,7 @@ clear_cmd()
|
||||
{
|
||||
clear_bot();
|
||||
cmd_col = prompt_col = 0;
|
||||
cmd_mbc_buf_len = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -124,9 +141,28 @@ clear_cmd()
|
||||
cmd_putstr(s)
|
||||
char *s;
|
||||
{
|
||||
putstr(s);
|
||||
cmd_col += strlen(s);
|
||||
prompt_col += strlen(s);
|
||||
LWCHAR prev_ch = 0;
|
||||
LWCHAR ch;
|
||||
char *endline = s + strlen(s);
|
||||
while (*s != '\0')
|
||||
{
|
||||
char *ns = s;
|
||||
ch = step_char(&ns, +1, endline);
|
||||
while (s < ns)
|
||||
putchr(*s++);
|
||||
if (!utf_mode)
|
||||
{
|
||||
cmd_col++;
|
||||
prompt_col++;
|
||||
} else if (!is_composing_char(ch) &&
|
||||
!is_combining_char(prev_ch, ch))
|
||||
{
|
||||
int width = is_wide_char(ch) ? 2 : 1;
|
||||
cmd_col += width;
|
||||
prompt_col += width;
|
||||
}
|
||||
prev_ch = ch;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -135,7 +171,113 @@ cmd_putstr(s)
|
||||
public int
|
||||
len_cmdbuf()
|
||||
{
|
||||
return (strlen(cmdbuf));
|
||||
char *s = cmdbuf;
|
||||
char *endline = s + strlen(s);
|
||||
int len = 0;
|
||||
|
||||
while (*s != '\0')
|
||||
{
|
||||
step_char(&s, +1, endline);
|
||||
len++;
|
||||
}
|
||||
return (len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Common part of cmd_step_right() and cmd_step_left().
|
||||
*/
|
||||
static char *
|
||||
cmd_step_common(p, ch, len, pwidth, bswidth)
|
||||
char *p;
|
||||
LWCHAR ch;
|
||||
int len;
|
||||
int *pwidth;
|
||||
int *bswidth;
|
||||
{
|
||||
char *pr;
|
||||
|
||||
if (len == 1)
|
||||
{
|
||||
pr = prchar((int) ch);
|
||||
if (pwidth != NULL || bswidth != NULL)
|
||||
{
|
||||
int len = strlen(pr);
|
||||
if (pwidth != NULL)
|
||||
*pwidth = len;
|
||||
if (bswidth != NULL)
|
||||
*bswidth = len;
|
||||
}
|
||||
} else
|
||||
{
|
||||
pr = prutfchar(ch);
|
||||
if (pwidth != NULL || bswidth != NULL)
|
||||
{
|
||||
if (is_composing_char(ch))
|
||||
{
|
||||
if (pwidth != NULL)
|
||||
*pwidth = 0;
|
||||
if (bswidth != NULL)
|
||||
*bswidth = 0;
|
||||
} else if (is_ubin_char(ch))
|
||||
{
|
||||
int len = strlen(pr);
|
||||
if (pwidth != NULL)
|
||||
*pwidth = len;
|
||||
if (bswidth != NULL)
|
||||
*bswidth = len;
|
||||
} else
|
||||
{
|
||||
LWCHAR prev_ch = step_char(&p, -1, cmdbuf);
|
||||
if (is_combining_char(prev_ch, ch))
|
||||
{
|
||||
if (pwidth != NULL)
|
||||
*pwidth = 0;
|
||||
if (bswidth != NULL)
|
||||
*bswidth = 0;
|
||||
} else
|
||||
{
|
||||
if (pwidth != NULL)
|
||||
*pwidth = is_wide_char(ch)
|
||||
? 2
|
||||
: 1;
|
||||
if (bswidth != NULL)
|
||||
*bswidth = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (pr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Step a pointer one character right in the command buffer.
|
||||
*/
|
||||
static char *
|
||||
cmd_step_right(pp, pwidth, bswidth)
|
||||
char **pp;
|
||||
int *pwidth;
|
||||
int *bswidth;
|
||||
{
|
||||
char *p = *pp;
|
||||
LWCHAR ch = step_char(pp, +1, p + strlen(p));
|
||||
|
||||
return cmd_step_common(p, ch, *pp - p, pwidth, bswidth);
|
||||
}
|
||||
|
||||
/*
|
||||
* Step a pointer one character left in the command buffer.
|
||||
*/
|
||||
static char *
|
||||
cmd_step_left(pp, pwidth, bswidth)
|
||||
char **pp;
|
||||
int *pwidth;
|
||||
int *bswidth;
|
||||
{
|
||||
char *p = *pp;
|
||||
LWCHAR ch = step_char(pp, -1, cmdbuf);
|
||||
|
||||
return cmd_step_common(*pp, ch, p - *pp, pwidth, bswidth);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -146,19 +288,30 @@ len_cmdbuf()
|
||||
cmd_repaint(old_cp)
|
||||
char *old_cp;
|
||||
{
|
||||
char *p;
|
||||
|
||||
/*
|
||||
* Repaint the line from the current position.
|
||||
*/
|
||||
clear_eol();
|
||||
for ( ; *cp != '\0'; cp++)
|
||||
while (*cp != '\0')
|
||||
{
|
||||
p = prchar(*cp);
|
||||
if (cmd_col + (int)strlen(p) >= sc_width)
|
||||
char *np = cp;
|
||||
int width;
|
||||
char *pr = cmd_step_right(&np, &width, NULL);
|
||||
if (cmd_col + width >= sc_width)
|
||||
break;
|
||||
putstr(p);
|
||||
cmd_col += strlen(p);
|
||||
cp = np;
|
||||
putstr(pr);
|
||||
cmd_col += width;
|
||||
}
|
||||
while (*cp != '\0')
|
||||
{
|
||||
char *np = cp;
|
||||
int width;
|
||||
char *pr = cmd_step_right(&np, &width, NULL);
|
||||
if (width > 0)
|
||||
break;
|
||||
cp = np;
|
||||
putstr(pr);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -177,8 +330,12 @@ cmd_home()
|
||||
{
|
||||
while (cmd_col > prompt_col)
|
||||
{
|
||||
int width, bswidth;
|
||||
|
||||
cmd_step_left(&cp, &width, &bswidth);
|
||||
while (bswidth-- > 0)
|
||||
putbs();
|
||||
cmd_col--;
|
||||
cmd_col -= width;
|
||||
}
|
||||
|
||||
cp = &cmdbuf[cmd_offset];
|
||||
@ -201,7 +358,20 @@ cmd_lshift()
|
||||
s = cmdbuf + cmd_offset;
|
||||
cols = 0;
|
||||
while (cols < (sc_width - prompt_col) / 2 && *s != '\0')
|
||||
cols += strlen(prchar(*s++));
|
||||
{
|
||||
int width;
|
||||
cmd_step_right(&s, &width, NULL);
|
||||
cols += width;
|
||||
}
|
||||
while (*s != '\0')
|
||||
{
|
||||
int width;
|
||||
char *ns = s;
|
||||
cmd_step_right(&ns, &width, NULL);
|
||||
if (width > 0)
|
||||
break;
|
||||
s = ns;
|
||||
}
|
||||
|
||||
cmd_offset = s - cmdbuf;
|
||||
save_cp = cp;
|
||||
@ -216,7 +386,6 @@ cmd_lshift()
|
||||
cmd_rshift()
|
||||
{
|
||||
char *s;
|
||||
char *p;
|
||||
char *save_cp;
|
||||
int cols;
|
||||
|
||||
@ -229,8 +398,9 @@ cmd_rshift()
|
||||
cols = 0;
|
||||
while (cols < (sc_width - prompt_col) / 2 && s > cmdbuf)
|
||||
{
|
||||
p = prchar(*--s);
|
||||
cols += strlen(p);
|
||||
int width;
|
||||
cmd_step_left(&s, &width, NULL);
|
||||
cols += width;
|
||||
}
|
||||
|
||||
cmd_offset = s - cmdbuf;
|
||||
@ -245,23 +415,32 @@ cmd_rshift()
|
||||
static int
|
||||
cmd_right()
|
||||
{
|
||||
char *p;
|
||||
char *pr;
|
||||
char *ncp;
|
||||
int width;
|
||||
|
||||
if (*cp == '\0')
|
||||
{
|
||||
/*
|
||||
* Already at the end of the line.
|
||||
*/
|
||||
/* Already at the end of the line. */
|
||||
return (CC_OK);
|
||||
}
|
||||
p = prchar(*cp);
|
||||
if (cmd_col + (int)strlen(p) >= sc_width)
|
||||
ncp = cp;
|
||||
pr = cmd_step_right(&ncp, &width, NULL);
|
||||
if (cmd_col + width >= sc_width)
|
||||
cmd_lshift();
|
||||
else if (cmd_col + (int)strlen(p) == sc_width - 1 && cp[1] != '\0')
|
||||
else if (cmd_col + width == sc_width - 1 && cp[1] != '\0')
|
||||
cmd_lshift();
|
||||
cp++;
|
||||
putstr(p);
|
||||
cmd_col += strlen(p);
|
||||
cp = ncp;
|
||||
cmd_col += width;
|
||||
putstr(pr);
|
||||
while (*cp != '\0')
|
||||
{
|
||||
pr = cmd_step_right(&ncp, &width, NULL);
|
||||
if (width > 0)
|
||||
break;
|
||||
putstr(pr);
|
||||
cp = ncp;
|
||||
}
|
||||
return (CC_OK);
|
||||
}
|
||||
|
||||
@ -271,19 +450,26 @@ cmd_right()
|
||||
static int
|
||||
cmd_left()
|
||||
{
|
||||
char *p;
|
||||
char *ncp;
|
||||
int width, bswidth;
|
||||
|
||||
if (cp <= cmdbuf)
|
||||
{
|
||||
/* Already at the beginning of the line */
|
||||
return (CC_OK);
|
||||
}
|
||||
p = prchar(cp[-1]);
|
||||
if (cmd_col < prompt_col + (int)strlen(p))
|
||||
ncp = cp;
|
||||
while (ncp > cmdbuf)
|
||||
{
|
||||
cmd_step_left(&ncp, &width, &bswidth);
|
||||
if (width > 0)
|
||||
break;
|
||||
}
|
||||
if (cmd_col < prompt_col + width)
|
||||
cmd_rshift();
|
||||
cp--;
|
||||
cmd_col -= strlen(p);
|
||||
while (*p++ != '\0')
|
||||
cp = ncp;
|
||||
cmd_col -= width;
|
||||
while (bswidth-- > 0)
|
||||
putbs();
|
||||
return (CC_OK);
|
||||
}
|
||||
@ -292,26 +478,29 @@ cmd_left()
|
||||
* Insert a char into the command buffer, at the current position.
|
||||
*/
|
||||
static int
|
||||
cmd_ichar(c)
|
||||
int c;
|
||||
cmd_ichar(cs, clen)
|
||||
char *cs;
|
||||
int clen;
|
||||
{
|
||||
char *s;
|
||||
|
||||
if (strlen(cmdbuf) >= sizeof(cmdbuf)-2)
|
||||
if (strlen(cmdbuf) + clen >= sizeof(cmdbuf)-1)
|
||||
{
|
||||
/*
|
||||
* No room in the command buffer for another char.
|
||||
*/
|
||||
/* No room in the command buffer for another char. */
|
||||
bell();
|
||||
return (CC_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert the character into the buffer.
|
||||
* Make room for the new character (shift the tail of the buffer right).
|
||||
*/
|
||||
for (s = &cmdbuf[strlen(cmdbuf)]; s >= cp; s--)
|
||||
s[1] = s[0];
|
||||
*cp = c;
|
||||
s[clen] = s[0];
|
||||
/*
|
||||
* Insert the character into the buffer.
|
||||
*/
|
||||
for (s = cp; s < cp + clen; s++)
|
||||
*s = *cs++;
|
||||
/*
|
||||
* Reprint the tail of the line from the inserted char.
|
||||
*/
|
||||
@ -328,6 +517,7 @@ cmd_ichar(c)
|
||||
cmd_erase()
|
||||
{
|
||||
register char *s;
|
||||
int clen;
|
||||
|
||||
if (cp == cmdbuf)
|
||||
{
|
||||
@ -340,12 +530,20 @@ cmd_erase()
|
||||
/*
|
||||
* Move cursor left (to the char being erased).
|
||||
*/
|
||||
s = cp;
|
||||
cmd_left();
|
||||
clen = s - cp;
|
||||
|
||||
/*
|
||||
* Remove the char from the buffer (shift the buffer left).
|
||||
*/
|
||||
for (s = cp; *s != '\0'; s++)
|
||||
s[0] = s[1];
|
||||
for (s = cp; ; s++)
|
||||
{
|
||||
s[0] = s[clen];
|
||||
if (s[0] == '\0')
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Repaint the buffer after the erased char.
|
||||
*/
|
||||
@ -368,9 +566,7 @@ cmd_delete()
|
||||
{
|
||||
if (*cp == '\0')
|
||||
{
|
||||
/*
|
||||
* At end of string; there is no char under the cursor.
|
||||
*/
|
||||
/* At end of string; there is no char under the cursor. */
|
||||
return (CC_OK);
|
||||
}
|
||||
/*
|
||||
@ -441,9 +637,7 @@ cmd_kill()
|
||||
{
|
||||
if (cmdbuf[0] == '\0')
|
||||
{
|
||||
/*
|
||||
* Buffer is already empty; abort the current command.
|
||||
*/
|
||||
/* Buffer is already empty; abort the current command. */
|
||||
return (CC_QUIT);
|
||||
}
|
||||
cmd_offset = 0;
|
||||
@ -470,6 +664,10 @@ set_mlist(mlist, cmdflags)
|
||||
{
|
||||
curr_mlist = (struct mlist *) mlist;
|
||||
curr_cmdflags = cmdflags;
|
||||
|
||||
/* Make sure the next up-arrow moves to the last string in the mlist. */
|
||||
if (curr_mlist != NULL)
|
||||
curr_mlist->curr_mp = curr_mlist;
|
||||
}
|
||||
|
||||
#if CMD_HISTORY
|
||||
@ -505,12 +703,9 @@ cmd_updown(action)
|
||||
s = curr_mlist->curr_mp->string;
|
||||
if (s == NULL)
|
||||
s = "";
|
||||
for (cp = cmdbuf; *s != '\0'; s++)
|
||||
{
|
||||
*cp = *s;
|
||||
strcpy(cmdbuf, s);
|
||||
for (cp = cmdbuf; *cp != '\0'; )
|
||||
cmd_right();
|
||||
}
|
||||
*cp = '\0';
|
||||
return (CC_OK);
|
||||
}
|
||||
#endif
|
||||
@ -531,17 +726,13 @@ cmd_addhist(mlist, cmd)
|
||||
*/
|
||||
if (strlen(cmd) == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Don't save if a duplicate of a command which is already
|
||||
* in the history.
|
||||
* But select the one already in the history to be current.
|
||||
* Save the command unless it's a duplicate of the
|
||||
* last command in the history.
|
||||
*/
|
||||
for (ml = mlist->next; ml != mlist; ml = ml->next)
|
||||
{
|
||||
if (strcmp(ml->string, cmd) == 0)
|
||||
break;
|
||||
}
|
||||
if (ml == mlist)
|
||||
ml = mlist->prev;
|
||||
if (ml == mlist || strcmp(ml->string, cmd) != 0)
|
||||
{
|
||||
/*
|
||||
* Did not find command in history.
|
||||
@ -705,10 +896,13 @@ cmd_istr(str)
|
||||
{
|
||||
char *s;
|
||||
int action;
|
||||
char *endline = str + strlen(str);
|
||||
|
||||
for (s = str; *s != '\0'; s++)
|
||||
for (s = str; *s != '\0'; )
|
||||
{
|
||||
action = cmd_ichar(*s);
|
||||
char *os = s;
|
||||
step_char(&s, +1, endline);
|
||||
action = cmd_ichar(os, s - os);
|
||||
if (action != CC_OK)
|
||||
{
|
||||
bell();
|
||||
@ -995,6 +1189,56 @@ cmd_char(c)
|
||||
int c;
|
||||
{
|
||||
int action;
|
||||
int len;
|
||||
|
||||
if (!utf_mode)
|
||||
{
|
||||
cmd_mbc_buf[0] = c;
|
||||
len = 1;
|
||||
} else
|
||||
{
|
||||
/* Perform strict validation in all possible cases. */
|
||||
if (cmd_mbc_buf_len == 0)
|
||||
{
|
||||
retry:
|
||||
cmd_mbc_buf_index = 1;
|
||||
*cmd_mbc_buf = c;
|
||||
if (IS_ASCII_OCTET(c))
|
||||
cmd_mbc_buf_len = 1;
|
||||
else if (IS_UTF8_LEAD(c))
|
||||
{
|
||||
cmd_mbc_buf_len = utf_len(c);
|
||||
return (CC_OK);
|
||||
} else
|
||||
{
|
||||
/* UTF8_INVALID or stray UTF8_TRAIL */
|
||||
bell();
|
||||
return (CC_ERROR);
|
||||
}
|
||||
} else if (IS_UTF8_TRAIL(c))
|
||||
{
|
||||
cmd_mbc_buf[cmd_mbc_buf_index++] = c;
|
||||
if (cmd_mbc_buf_index < cmd_mbc_buf_len)
|
||||
return (CC_OK);
|
||||
if (!is_utf8_well_formed(cmd_mbc_buf))
|
||||
{
|
||||
/* complete, but not well formed (non-shortest form), sequence */
|
||||
cmd_mbc_buf_len = 0;
|
||||
bell();
|
||||
return (CC_ERROR);
|
||||
}
|
||||
} else
|
||||
{
|
||||
/* Flush incomplete (truncated) sequence. */
|
||||
cmd_mbc_buf_len = 0;
|
||||
bell();
|
||||
/* Handle new char. */
|
||||
goto retry;
|
||||
}
|
||||
|
||||
len = cmd_mbc_buf_len;
|
||||
cmd_mbc_buf_len = 0;
|
||||
}
|
||||
|
||||
if (literal)
|
||||
{
|
||||
@ -1002,13 +1246,13 @@ cmd_char(c)
|
||||
* Insert the char, even if it is a line-editing char.
|
||||
*/
|
||||
literal = 0;
|
||||
return (cmd_ichar(c));
|
||||
return (cmd_ichar(cmd_mbc_buf, len));
|
||||
}
|
||||
|
||||
/*
|
||||
* See if it is a special line-editing character.
|
||||
* See if it is a line-editing character.
|
||||
*/
|
||||
if (in_mca())
|
||||
if (in_mca() && len == 1)
|
||||
{
|
||||
action = cmd_edit(c);
|
||||
switch (action)
|
||||
@ -1024,7 +1268,7 @@ cmd_char(c)
|
||||
/*
|
||||
* Insert the char into the command buffer.
|
||||
*/
|
||||
return (cmd_ichar(c));
|
||||
return (cmd_ichar(cmd_mbc_buf, len));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1049,3 +1293,160 @@ get_cmdbuf()
|
||||
{
|
||||
return (cmdbuf);
|
||||
}
|
||||
|
||||
#if CMD_HISTORY
|
||||
/*
|
||||
* Get the name of the history file.
|
||||
*/
|
||||
static char *
|
||||
histfile_name()
|
||||
{
|
||||
char *home;
|
||||
char *name;
|
||||
int len;
|
||||
|
||||
/* See if filename is explicitly specified by $LESSHISTFILE. */
|
||||
name = lgetenv("LESSHISTFILE");
|
||||
if (name != NULL && *name != '\0')
|
||||
{
|
||||
if (strcmp(name, "-") == 0)
|
||||
/* $LESSHISTFILE == "-" means don't use a history file. */
|
||||
return (NULL);
|
||||
return (save(name));
|
||||
}
|
||||
|
||||
/* Otherwise, file is in $HOME. */
|
||||
home = lgetenv("HOME");
|
||||
if (home == NULL || *home == '\0')
|
||||
{
|
||||
#if OS2
|
||||
home = lgetenv("INIT");
|
||||
if (home == NULL || *home == '\0')
|
||||
#endif
|
||||
return (NULL);
|
||||
}
|
||||
len = strlen(home) + strlen(LESSHISTFILE) + 2;
|
||||
name = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF2(name, len, "%s/%s", home, LESSHISTFILE);
|
||||
return (name);
|
||||
}
|
||||
#endif /* CMD_HISTORY */
|
||||
|
||||
/*
|
||||
* Initialize history from a .lesshist file.
|
||||
*/
|
||||
public void
|
||||
init_cmdhist()
|
||||
{
|
||||
#if CMD_HISTORY
|
||||
struct mlist *ml = NULL;
|
||||
char line[CMDBUF_SIZE];
|
||||
char *filename;
|
||||
FILE *f;
|
||||
char *p;
|
||||
|
||||
filename = histfile_name();
|
||||
if (filename == NULL)
|
||||
return;
|
||||
f = fopen(filename, "r");
|
||||
free(filename);
|
||||
if (f == NULL)
|
||||
return;
|
||||
if (fgets(line, sizeof(line), f) == NULL ||
|
||||
strncmp(line, HISTFILE_FIRST_LINE, strlen(HISTFILE_FIRST_LINE)) != 0)
|
||||
{
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
while (fgets(line, sizeof(line), f) != NULL)
|
||||
{
|
||||
for (p = line; *p != '\0'; p++)
|
||||
{
|
||||
if (*p == '\n' || *p == '\r')
|
||||
{
|
||||
*p = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (strcmp(line, HISTFILE_SEARCH_SECTION) == 0)
|
||||
ml = &mlist_search;
|
||||
#if SHELL_ESCAPE || PIPEC
|
||||
else if (strcmp(line, HISTFILE_SHELL_SECTION) == 0)
|
||||
ml = &mlist_shell;
|
||||
#endif
|
||||
else if (*line == '"')
|
||||
{
|
||||
if (ml != NULL)
|
||||
cmd_addhist(ml, line+1);
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
#endif /* CMD_HISTORY */
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
#if CMD_HISTORY
|
||||
static void
|
||||
save_mlist(ml, f)
|
||||
struct mlist *ml;
|
||||
FILE *f;
|
||||
{
|
||||
int histsize = 0;
|
||||
int n;
|
||||
char *s;
|
||||
|
||||
s = lgetenv("LESSHISTSIZE");
|
||||
if (s != NULL)
|
||||
histsize = atoi(s);
|
||||
if (histsize == 0)
|
||||
histsize = 100;
|
||||
|
||||
ml = ml->prev;
|
||||
for (n = 0; n < histsize; n++)
|
||||
{
|
||||
if (ml->string == NULL)
|
||||
break;
|
||||
ml = ml->prev;
|
||||
}
|
||||
for (ml = ml->next; ml->string != NULL; ml = ml->next)
|
||||
fprintf(f, "\"%s\n", ml->string);
|
||||
}
|
||||
#endif /* CMD_HISTORY */
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
public void
|
||||
save_cmdhist()
|
||||
{
|
||||
#if CMD_HISTORY
|
||||
char *filename;
|
||||
FILE *f;
|
||||
|
||||
filename = histfile_name();
|
||||
if (filename == NULL)
|
||||
return;
|
||||
f = fopen(filename, "w");
|
||||
free(filename);
|
||||
if (f == NULL)
|
||||
return;
|
||||
#if HAVE_FCHMOD
|
||||
/* Make history file readable only by owner. */
|
||||
fchmod(fileno(f), 0600);
|
||||
#endif
|
||||
|
||||
fprintf(f, "%s\n", HISTFILE_FIRST_LINE);
|
||||
|
||||
fprintf(f, "%s\n", HISTFILE_SEARCH_SECTION);
|
||||
save_mlist(&mlist_search, f);
|
||||
|
||||
#if SHELL_ESCAPE || PIPEC
|
||||
fprintf(f, "%s\n", HISTFILE_SHELL_SECTION);
|
||||
save_mlist(&mlist_shell, f);
|
||||
#endif
|
||||
|
||||
fclose(f);
|
||||
#endif /* CMD_HISTORY */
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -21,7 +21,7 @@
|
||||
#include "option.h"
|
||||
#include "cmd.h"
|
||||
|
||||
extern int erase_char, kill_char;
|
||||
extern int erase_char, erase2_char, kill_char;
|
||||
extern int sigs;
|
||||
extern int quit_at_eof;
|
||||
extern int quit_if_one_screen;
|
||||
@ -67,6 +67,7 @@ static char optchar;
|
||||
static int optflag;
|
||||
static int optgetname;
|
||||
static POSITION bottompos;
|
||||
static int save_hshift;
|
||||
#if PIPEC
|
||||
static char pipec;
|
||||
#endif
|
||||
@ -392,7 +393,9 @@ mca_char(c)
|
||||
* Already have a match for the name.
|
||||
* Don't accept anything but erase/kill.
|
||||
*/
|
||||
if (c == erase_char || c == kill_char)
|
||||
if (c == erase_char ||
|
||||
c == erase2_char ||
|
||||
c == kill_char)
|
||||
return (MCA_DONE);
|
||||
return (MCA_MORE);
|
||||
}
|
||||
@ -403,7 +406,7 @@ mca_char(c)
|
||||
if (cmd_char(c) == CC_QUIT)
|
||||
return (MCA_DONE);
|
||||
p = get_cmdbuf();
|
||||
lc = islower(p[0]);
|
||||
lc = ASCII_IS_LOWER(p[0]);
|
||||
o = findopt_name(&p, &oname, NULL);
|
||||
if (o != NULL)
|
||||
{
|
||||
@ -413,15 +416,15 @@ mca_char(c)
|
||||
* display the full option name.
|
||||
*/
|
||||
optchar = o->oletter;
|
||||
if (!lc && islower(optchar))
|
||||
optchar = toupper(optchar);
|
||||
if (!lc && ASCII_IS_LOWER(optchar))
|
||||
optchar = ASCII_TO_UPPER(optchar);
|
||||
cmd_reset();
|
||||
mca_opt_toggle();
|
||||
for (p = oname; *p != '\0'; p++)
|
||||
{
|
||||
c = *p;
|
||||
if (!lc && islower(c))
|
||||
c = toupper(c);
|
||||
if (!lc && ASCII_IS_LOWER(c))
|
||||
c = ASCII_TO_UPPER(c);
|
||||
if (cmd_char(c) != CC_OK)
|
||||
return (MCA_DONE);
|
||||
}
|
||||
@ -430,7 +433,7 @@ mca_char(c)
|
||||
}
|
||||
} else
|
||||
{
|
||||
if (c == erase_char || c == kill_char)
|
||||
if (c == erase_char || c == erase2_char || c == kill_char)
|
||||
break;
|
||||
if (optchar != '\0')
|
||||
/* We already have the option letter. */
|
||||
@ -598,7 +601,10 @@ prompt()
|
||||
bottompos = position(BOTTOM_PLUS_ONE);
|
||||
|
||||
/*
|
||||
* If the -E flag is set and we've hit EOF on the last file, quit.
|
||||
* If we've hit EOF on the last file, and the -E flag is set
|
||||
* (or -F is set and this is the first prompt), then quit.
|
||||
* {{ Relying on "first prompt" to detect a single-screen file
|
||||
* fails if +G is used, for example. }}
|
||||
*/
|
||||
if ((quit_at_eof == OPT_ONPLUS || quit_if_one_screen) &&
|
||||
hit_eof && !(ch_getflags() & CH_HELPFILE) &&
|
||||
@ -627,13 +633,13 @@ prompt()
|
||||
*/
|
||||
clear_cmd();
|
||||
p = pr_string();
|
||||
if (p == NULL)
|
||||
if (p == NULL || *p == '\0')
|
||||
putchr(':');
|
||||
else
|
||||
{
|
||||
so_enter();
|
||||
at_enter(AT_STANDOUT);
|
||||
putstr(p);
|
||||
so_exit();
|
||||
at_exit();
|
||||
}
|
||||
}
|
||||
|
||||
@ -826,6 +832,9 @@ multi_search(pattern, n)
|
||||
* Restore the file we were originally viewing.
|
||||
*/
|
||||
reedit_ifile(save_ifile);
|
||||
} else
|
||||
{
|
||||
unsave_ifile(save_ifile);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1211,6 +1220,7 @@ commands()
|
||||
* just means return to viewing the
|
||||
* previous file.
|
||||
*/
|
||||
hshift = save_hshift;
|
||||
if (edit_prev(1) == 0)
|
||||
break;
|
||||
}
|
||||
@ -1300,6 +1310,8 @@ commands()
|
||||
if (ch_getflags() & CH_HELPFILE)
|
||||
break;
|
||||
cmd_exec();
|
||||
save_hshift = hshift;
|
||||
hshift = 0;
|
||||
(void) edit(FAKE_HELPFILE);
|
||||
break;
|
||||
|
||||
@ -1340,9 +1352,8 @@ commands()
|
||||
}
|
||||
if (curr_altfilename != NULL)
|
||||
{
|
||||
error("Cannot edit file processed with LESSOPEN",
|
||||
error("WARNING: This file was viewed via LESSOPEN",
|
||||
NULL_PARG);
|
||||
break;
|
||||
}
|
||||
start_mca(A_SHELL, "!", ml_shell, 0);
|
||||
/*
|
||||
@ -1524,8 +1535,8 @@ commands()
|
||||
break;
|
||||
start_mca(A_SETMARK, "mark: ", (void*)NULL, 0);
|
||||
c = getcc();
|
||||
if (c == erase_char || c == kill_char ||
|
||||
c == '\n' || c == '\r')
|
||||
if (c == erase_char || c == erase2_char ||
|
||||
c == kill_char || c == '\n' || c == '\r')
|
||||
break;
|
||||
setmark(c);
|
||||
break;
|
||||
@ -1536,8 +1547,8 @@ commands()
|
||||
*/
|
||||
start_mca(A_GOMARK, "goto mark: ", (void*)NULL, 0);
|
||||
c = getcc();
|
||||
if (c == erase_char || c == kill_char ||
|
||||
c == '\n' || c == '\r')
|
||||
if (c == erase_char || c == erase2_char ||
|
||||
c == kill_char || c == '\n' || c == '\r')
|
||||
break;
|
||||
gomark(c);
|
||||
break;
|
||||
@ -1551,7 +1562,7 @@ commands()
|
||||
}
|
||||
start_mca(A_PIPE, "|mark: ", (void*)NULL, 0);
|
||||
c = getcc();
|
||||
if (c == erase_char || c == kill_char)
|
||||
if (c == erase_char || c == erase2_char || c == kill_char)
|
||||
break;
|
||||
if (c == '\n' || c == '\r')
|
||||
c = '.';
|
||||
|
120
contrib/less/configure
vendored
120
contrib/less/configure
vendored
@ -843,6 +843,7 @@ Optional Features:
|
||||
Optional Packages:
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||
--with-secure Compile in secure mode
|
||||
--with-regex={auto,pcre,posix,regcmp,re_comp,regcomp,regcomp-local} Select a regular expression library auto
|
||||
--with-editor=PROGRAM use PROGRAM as the default editor vi
|
||||
|
||||
@ -2860,6 +2861,61 @@ else
|
||||
have_xcurses=no
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking for initscr in -lncursesw" >&5
|
||||
echo $ECHO_N "checking for initscr in -lncursesw... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_ncursesw_initscr+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lncursesw $LIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
#line $LINENO "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char initscr ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
initscr ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_lib_ncursesw_initscr=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
ac_cv_lib_ncursesw_initscr=no
|
||||
fi
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_lib_ncursesw_initscr" >&5
|
||||
echo "${ECHO_T}$ac_cv_lib_ncursesw_initscr" >&6
|
||||
if test $ac_cv_lib_ncursesw_initscr = yes; then
|
||||
have_ncursesw=yes
|
||||
else
|
||||
have_ncursesw=no
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking for initscr in -lncurses" >&5
|
||||
echo $ECHO_N "checking for initscr in -lncurses... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_ncurses_initscr+set}" = set; then
|
||||
@ -3319,6 +3375,47 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$TERMLIBS" = x; then
|
||||
if test $have_ncursesw = yes; then
|
||||
TERMLIBS="-lncursesw"
|
||||
SAVE_LIBS=$LIBS
|
||||
LIBS="$LIBS $TERMLIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
#line $LINENO "configure"
|
||||
#include "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 { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
termok=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
termok=no
|
||||
fi
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$SAVE_LIBS
|
||||
if test $termok = no; then TERMLIBS=""; fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# -- Try ncurses.
|
||||
if test "x$TERMLIBS" = x; then
|
||||
if test $have_ncurses = yes; then
|
||||
@ -4219,6 +4316,8 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -4456,7 +4555,9 @@ _ACEOF
|
||||
|
||||
|
||||
|
||||
for ac_func in fsync memcpy popen _setjmp sigprocmask sigsetmask stat strchr strstr system
|
||||
|
||||
|
||||
for ac_func in fsync memcpy popen _setjmp sigprocmask sigsetmask snprintf stat strchr strstr system fchmod
|
||||
do
|
||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||
@ -5057,12 +5158,29 @@ fi
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
fi
|
||||
|
||||
# Compile in secure mode?
|
||||
|
||||
# Check whether --with-secure or --without-secure was given.
|
||||
if test "${with_secure+set}" = set; then
|
||||
withval="$with_secure"
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define SECURE_COMPILE 1
|
||||
_ACEOF
|
||||
|
||||
else
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define SECURE_COMPILE 0
|
||||
_ACEOF
|
||||
|
||||
fi;
|
||||
|
||||
# Checks for regular expression functions.
|
||||
have_regex=no
|
||||
have_posix_regex=unknown
|
||||
echo "$as_me:$LINENO: checking for regcomp" >&5
|
||||
echo $ECHO_N "checking for regcomp... $ECHO_C" >&6
|
||||
|
||||
# Select a regular expression library.
|
||||
WANT_REGEX=auto
|
||||
|
||||
# Check whether --with-regex or --without-regex was given.
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Copyright (C) 1984-2002 Mark Nudelman
|
||||
# Copyright (C) 1984-2004 Mark Nudelman
|
||||
#
|
||||
# You may distribute under the terms of either the GNU General Public
|
||||
# License or the Less License, as specified in the README file.
|
||||
@ -24,6 +24,7 @@ AC_SYS_LARGEFILE
|
||||
|
||||
# Checks for general libraries.
|
||||
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])
|
||||
AC_CHECK_LIB(curses, initscr, [have_curses=yes], [have_curses=no])
|
||||
AC_CHECK_LIB(termcap, tgetent, [have_termcap=yes], [have_termcap=no])
|
||||
@ -63,6 +64,19 @@ if test "x$TERMLIBS" = x; then
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl -- Try ncursesw.
|
||||
if test "x$TERMLIBS" = x; then
|
||||
if test $have_ncursesw = yes; then
|
||||
TERMLIBS="-lncursesw"
|
||||
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 ncurses.
|
||||
if test "x$TERMLIBS" = x; then
|
||||
if test $have_ncurses = yes; then
|
||||
@ -196,6 +210,8 @@ AH_TEMPLATE([HAVE_SIGEMPTYSET],
|
||||
[Define HAVE_SIGEMPTYSET if you have the sigemptyset macro.])
|
||||
AH_TEMPLATE([EDIT_PGM],
|
||||
[Define EDIT_PGM to your editor.])
|
||||
AH_TEMPLATE([SECURE_COMPILE],
|
||||
[Define SECURE_COMPILE=1 to build a secure version of less.])
|
||||
|
||||
# Checks for identifiers.
|
||||
AC_TYPE_OFF_T
|
||||
@ -211,7 +227,7 @@ AC_TRY_COMPILE([#include <time.h>], [time_t t = 0;],
|
||||
|
||||
# Checks for library functions.
|
||||
AC_TYPE_SIGNAL
|
||||
AC_CHECK_FUNCS([fsync memcpy popen _setjmp sigprocmask sigsetmask stat strchr strstr system])
|
||||
AC_CHECK_FUNCS([fsync memcpy popen _setjmp sigprocmask sigsetmask snprintf stat strchr strstr system fchmod])
|
||||
|
||||
# Some systems have termios.h but not the corresponding functions.
|
||||
AC_CHECK_FUNC(tcgetattr, AC_DEFINE(HAVE_TERMIOS_FUNCS))
|
||||
@ -297,11 +313,17 @@ AC_TRY_LINK(, [extern short ospeed; ospeed = 0;],
|
||||
[AC_MSG_RESULT(no)])
|
||||
fi
|
||||
|
||||
# Compile in secure mode?
|
||||
AC_ARG_WITH(secure,
|
||||
[ --with-secure Compile in secure mode],
|
||||
AC_DEFINE(SECURE_COMPILE, 1), AC_DEFINE(SECURE_COMPILE, 0))
|
||||
|
||||
# Checks for regular expression functions.
|
||||
have_regex=no
|
||||
have_posix_regex=unknown
|
||||
AC_MSG_CHECKING(for regcomp)
|
||||
|
||||
# Select a regular expression library.
|
||||
WANT_REGEX=auto
|
||||
AC_ARG_WITH(regex,
|
||||
[ --with-regex={auto,pcre,posix,regcmp,re_comp,regcomp,regcomp-local} Select a regular expression library [auto]],
|
||||
@ -401,8 +423,9 @@ AH_TOP([
|
||||
/*
|
||||
* SECURE is 1 if you wish to disable a bunch of features in order to
|
||||
* be safe to run by unprivileged users.
|
||||
* SECURE_COMPILE is set by the --with-secure configure option.
|
||||
*/
|
||||
#define SECURE 0
|
||||
#define SECURE SECURE_COMPILE
|
||||
|
||||
/*
|
||||
* SHELL_ESCAPE is 1 if you wish to allow shell escapes.
|
||||
@ -488,10 +511,13 @@ AH_TOP([
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE ".less"
|
||||
#define LESSKEYFILE_SYS SYSDIR "/sysless"
|
||||
#define DEF_LESSKEYINFILE ".lesskey"
|
||||
#define LESSHISTFILE ".lesshst"
|
||||
|
||||
|
||||
/* Settings always true on Unix. */
|
||||
@ -535,7 +561,7 @@ AH_TOP([
|
||||
/*
|
||||
* Default shell metacharacters and meta-escape character.
|
||||
*/
|
||||
#define DEF_METACHARS "; *?\t\n'\"()<>|&^`#\\"
|
||||
#define DEF_METACHARS "; *?\t\n'\"()<>[]|&^`#\\"
|
||||
#define DEF_METAESCAPE "\\"
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -34,7 +34,7 @@
|
||||
#include "cmd.h"
|
||||
#include "lesskey.h"
|
||||
|
||||
extern int erase_char, kill_char;
|
||||
extern int erase_char, erase2_char, kill_char;
|
||||
extern int secure;
|
||||
|
||||
#define SK(k) \
|
||||
@ -754,7 +754,7 @@ editchar(c, flags)
|
||||
* but give it the edit-commands command table
|
||||
* This table is constructed to match the user's keyboard.
|
||||
*/
|
||||
if (c == erase_char)
|
||||
if (c == erase_char || c == erase2_char)
|
||||
return (EC_BACKSPACE);
|
||||
if (c == kill_char)
|
||||
return (EC_LINEKILL);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2000 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -117,10 +117,13 @@
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE "_less"
|
||||
#define LESSKEYFILE_SYS "c:\\_sysless"
|
||||
#define DEF_LESSKEYINFILE "_lesskey"
|
||||
#define LESSHISTFILE "_lesshst"
|
||||
|
||||
|
||||
/* Settings always true for MS-DOS systems. */
|
||||
@ -304,6 +307,9 @@
|
||||
/* Define if you have the system function. */
|
||||
#define HAVE_SYSTEM 1
|
||||
|
||||
/* Define if you have the snprintf function. */
|
||||
#define HAVE_SNPRINTF 0
|
||||
|
||||
/* Define if you have the <ctype.h> header file. */
|
||||
#define HAVE_CTYPE_H 1
|
||||
|
||||
|
@ -18,8 +18,9 @@
|
||||
/*
|
||||
* SECURE is 1 if you wish to disable a bunch of features in order to
|
||||
* be safe to run by unprivileged users.
|
||||
* SECURE_COMPILE is set by the --with-secure configure option.
|
||||
*/
|
||||
#define SECURE 0
|
||||
#define SECURE SECURE_COMPILE
|
||||
|
||||
/*
|
||||
* SHELL_ESCAPE is 1 if you wish to allow shell escapes.
|
||||
@ -105,10 +106,13 @@
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE ".less"
|
||||
#define LESSKEYFILE_SYS SYSDIR "/sysless"
|
||||
#define DEF_LESSKEYINFILE ".lesskey"
|
||||
#define LESSHISTFILE ".lesshst"
|
||||
|
||||
|
||||
/* Settings always true on Unix. */
|
||||
@ -152,7 +156,7 @@
|
||||
/*
|
||||
* Default shell metacharacters and meta-escape character.
|
||||
*/
|
||||
#define DEF_METACHARS "; *?\t\n'\"()<>|&^`#\\"
|
||||
#define DEF_METACHARS "; *?\t\n'\"()<>[]|&^`#\\"
|
||||
#define DEF_METAESCAPE "\\"
|
||||
|
||||
/*
|
||||
@ -191,6 +195,9 @@
|
||||
/* Define to 1 if you have the <errno.h> header file. */
|
||||
#undef HAVE_ERRNO_H
|
||||
|
||||
/* Define to 1 if you have the `fchmod' function. */
|
||||
#undef HAVE_FCHMOD
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
@ -257,6 +264,9 @@
|
||||
/* Define HAVE_SIGSET_T you have the sigset_t type. */
|
||||
#undef HAVE_SIGSET_T
|
||||
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#undef HAVE_SNPRINTF
|
||||
|
||||
/* Define to 1 if you have the `stat' function. */
|
||||
#undef HAVE_STAT
|
||||
|
||||
@ -370,6 +380,9 @@
|
||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
||||
#undef RETSIGTYPE
|
||||
|
||||
/* Define SECURE_COMPILE=1 to build a secure version of less. */
|
||||
#undef SECURE_COMPILE
|
||||
|
||||
/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
|
||||
#undef STAT_MACROS_BROKEN
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2000 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -110,10 +110,13 @@
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE "less.ini"
|
||||
#define LESSKEYFILE_SYS "C:\\sysless.ini"
|
||||
#define DEF_LESSKEYINFILE "lesskey.ini"
|
||||
#define LESSHISTFILE "lesshst.ini"
|
||||
|
||||
|
||||
/* Settings always true for the emx compiler for OS/2 systems. */
|
||||
@ -270,6 +273,9 @@
|
||||
/* Define if you have the system function. */
|
||||
#define HAVE_SYSTEM 1
|
||||
|
||||
/* Define if you have the snprintf function. */
|
||||
#define HAVE_SNPRINTF 0
|
||||
|
||||
/* Define if you have the <ctype.h> header file. */
|
||||
#define HAVE_CTYPE_H 1
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2000 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -109,10 +109,13 @@
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE ".less"
|
||||
#define LESSKEYFILE_SYS "/.sysless"
|
||||
#define DEF_LESSKEYINFILE ".lesskey"
|
||||
#define LESSHISTFILE ".lesshst"
|
||||
|
||||
|
||||
/* Settings always true for OS-9. */
|
||||
@ -278,6 +281,9 @@
|
||||
/* Define if you have the system function. */
|
||||
#define HAVE_SYSTEM 1
|
||||
|
||||
/* Define if you have the snprintf function. */
|
||||
#define HAVE_SNPRINTF 0
|
||||
|
||||
/* Define if you have the <ctype.h> header file. */
|
||||
#define HAVE_CTYPE_H 1
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2000 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -110,10 +110,13 @@
|
||||
* LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
|
||||
* DEF_LESSKEYINFILE is the filename of the default lesskey input
|
||||
* (in the HOME directory).
|
||||
* LESSHISTFILE is the filename of the history file
|
||||
* (in the HOME directory).
|
||||
*/
|
||||
#define LESSKEYFILE "_less"
|
||||
#define LESSKEYFILE_SYS "c:\\_sysless"
|
||||
#define DEF_LESSKEYINFILE "_lesskey"
|
||||
#define LESSHISTFILE "_lesshst"
|
||||
|
||||
|
||||
/* Settings always true for Windows systems. */
|
||||
@ -268,6 +271,9 @@
|
||||
/* Define if you have the system function. */
|
||||
#define HAVE_SYSTEM 1
|
||||
|
||||
/* Define if you have the snprintf function. */
|
||||
#define HAVE_SNPRINTF 0
|
||||
|
||||
/* Define if you have the <ctype.h> header file. */
|
||||
#define HAVE_CTYPE_H 1
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -322,6 +322,14 @@ edit_ifile(ifile)
|
||||
/*
|
||||
* Re-open the current file.
|
||||
*/
|
||||
if (was_curr_ifile == ifile)
|
||||
{
|
||||
/*
|
||||
* Whoops. The "current" ifile is the one we just deleted.
|
||||
* Just give up.
|
||||
*/
|
||||
quit(QUIT_ERROR);
|
||||
}
|
||||
reedit_ifile(was_curr_ifile);
|
||||
return (1);
|
||||
} else if ((f = open(qopen_filename, OPEN_READ)) < 0)
|
||||
@ -498,7 +506,7 @@ edit_last()
|
||||
|
||||
|
||||
/*
|
||||
* Edit the next or previous file in the command line (ifile) list.
|
||||
* Edit the n-th next or previous file in the command line (ifile) list.
|
||||
*/
|
||||
static int
|
||||
edit_istep(h, n, dir)
|
||||
@ -547,14 +555,14 @@ edit_inext(h, n)
|
||||
IFILE h;
|
||||
int n;
|
||||
{
|
||||
return (edit_istep(h, n, 1));
|
||||
return (edit_istep(h, n, +1));
|
||||
}
|
||||
|
||||
public int
|
||||
edit_next(n)
|
||||
int n;
|
||||
{
|
||||
return edit_istep(curr_ifile, n, 1);
|
||||
return edit_istep(curr_ifile, n, +1);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -195,7 +195,7 @@ shell_quote(s)
|
||||
newstr = p = (char *) ecalloc(len, sizeof(char));
|
||||
if (use_quotes)
|
||||
{
|
||||
sprintf(newstr, "%c%s%c", openquote, s, closequote);
|
||||
SNPRINTF3(newstr, len, "%c%s%c", openquote, s, closequote);
|
||||
} else
|
||||
{
|
||||
while (*s != '\0')
|
||||
@ -226,6 +226,7 @@ dirfile(dirname, filename)
|
||||
{
|
||||
char *pathname;
|
||||
char *qpathname;
|
||||
int len;
|
||||
int f;
|
||||
|
||||
if (dirname == NULL || *dirname == '\0')
|
||||
@ -233,11 +234,11 @@ dirfile(dirname, filename)
|
||||
/*
|
||||
* Construct the full pathname.
|
||||
*/
|
||||
pathname = (char *) calloc(strlen(dirname) + strlen(filename) + 2,
|
||||
sizeof(char));
|
||||
len= strlen(dirname) + strlen(filename) + 2;
|
||||
pathname = (char *) calloc(len, sizeof(char));
|
||||
if (pathname == NULL)
|
||||
return (NULL);
|
||||
sprintf(pathname, "%s%s%s", dirname, PATHNAME_SEP, filename);
|
||||
SNPRINTF3(pathname, len, "%s%s%s", dirname, PATHNAME_SEP, filename);
|
||||
/*
|
||||
* Make sure the file exists.
|
||||
*/
|
||||
@ -425,18 +426,23 @@ fcomplete(s)
|
||||
*/
|
||||
{
|
||||
char *slash;
|
||||
int len;
|
||||
for (slash = s+strlen(s)-1; slash > s; slash--)
|
||||
if (*slash == *PATHNAME_SEP || *slash == '/')
|
||||
break;
|
||||
fpat = (char *) ecalloc(strlen(s)+4, sizeof(char));
|
||||
len = strlen(s) + 4;
|
||||
fpat = (char *) ecalloc(len, sizeof(char));
|
||||
if (strchr(slash, '.') == NULL)
|
||||
sprintf(fpat, "%s*.*", s);
|
||||
SNPRINTF1(fpat, len, "%s*.*", s);
|
||||
else
|
||||
sprintf(fpat, "%s*", s);
|
||||
SNPRINTF1(fpat, len, "%s*", s);
|
||||
}
|
||||
#else
|
||||
fpat = (char *) ecalloc(strlen(s)+2, sizeof(char));
|
||||
sprintf(fpat, "%s*", s);
|
||||
{
|
||||
int len = strlen(s) + 2;
|
||||
fpat = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF1(fpat, len, "%s*", s);
|
||||
}
|
||||
#endif
|
||||
qs = lglob(fpat);
|
||||
s = shell_unquote(qs);
|
||||
@ -570,9 +576,9 @@ shellcmd(cmd)
|
||||
fd = popen(cmd, "r");
|
||||
} else
|
||||
{
|
||||
scmd = (char *) ecalloc(strlen(shell) + strlen(esccmd) + 5,
|
||||
sizeof(char));
|
||||
sprintf(scmd, "%s %s %s", shell, shell_coption(), esccmd);
|
||||
int len = strlen(shell) + strlen(esccmd) + 5;
|
||||
scmd = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF3(scmd, len, "%s %s %s", shell, shell_coption(), esccmd);
|
||||
free(esccmd);
|
||||
fd = popen(scmd, "r");
|
||||
free(scmd);
|
||||
@ -680,7 +686,7 @@ lglob(filename)
|
||||
do {
|
||||
n = strlen(drive) + strlen(dir) + strlen(fnd.GLOB_NAME) + 1;
|
||||
pathname = (char *) ecalloc(n, sizeof(char));
|
||||
sprintf(pathname, "%s%s%s", drive, dir, fnd.GLOB_NAME);
|
||||
SNPRINTF3(pathname, n, "%s%s%s", drive, dir, fnd.GLOB_NAME);
|
||||
qpathname = shell_quote(pathname);
|
||||
free(pathname);
|
||||
if (qpathname != NULL)
|
||||
@ -725,6 +731,7 @@ lglob(filename)
|
||||
char *lessecho;
|
||||
char *cmd;
|
||||
char *esc;
|
||||
int len;
|
||||
|
||||
esc = get_meta_escape();
|
||||
if (strlen(esc) == 0)
|
||||
@ -741,8 +748,9 @@ lglob(filename)
|
||||
/*
|
||||
* Invoke lessecho, and read its output (a globbed list of filenames).
|
||||
*/
|
||||
cmd = (char *) ecalloc(strlen(lessecho) + strlen(ofilename) + (7*strlen(metachars())) + 24, sizeof(char));
|
||||
sprintf(cmd, "%s -p0x%x -d0x%x -e%s ", lessecho, openquote, closequote, esc);
|
||||
len = strlen(lessecho) + strlen(ofilename) + (7*strlen(metachars())) + 24;
|
||||
cmd = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF4(cmd, len, "%s -p0x%x -d0x%x -e%s ", lessecho, openquote, closequote, esc);
|
||||
free(esc);
|
||||
for (s = metachars(); *s != '\0'; s++)
|
||||
sprintf(cmd + strlen(cmd), "-n0x%x ", *s);
|
||||
@ -795,6 +803,7 @@ open_altfile(filename, pf, pfd)
|
||||
#else
|
||||
char *lessopen;
|
||||
char *cmd;
|
||||
int len;
|
||||
FILE *fd;
|
||||
#if HAVE_FILENO
|
||||
int returnfd = 0;
|
||||
@ -822,9 +831,9 @@ open_altfile(filename, pf, pfd)
|
||||
#endif
|
||||
}
|
||||
|
||||
cmd = (char *) ecalloc(strlen(lessopen) + strlen(filename) + 2,
|
||||
sizeof(char));
|
||||
sprintf(cmd, lessopen, filename);
|
||||
len = strlen(lessopen) + strlen(filename) + 2;
|
||||
cmd = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF1(cmd, len, lessopen, filename);
|
||||
fd = shellcmd(cmd);
|
||||
free(cmd);
|
||||
if (fd == NULL)
|
||||
@ -884,6 +893,7 @@ close_altfile(altfilename, filename, pipefd)
|
||||
char *lessclose;
|
||||
FILE *fd;
|
||||
char *cmd;
|
||||
int len;
|
||||
|
||||
if (secure)
|
||||
return;
|
||||
@ -900,9 +910,9 @@ close_altfile(altfilename, filename, pipefd)
|
||||
}
|
||||
if ((lessclose = lgetenv("LESSCLOSE")) == NULL)
|
||||
return;
|
||||
cmd = (char *) ecalloc(strlen(lessclose) + strlen(filename) +
|
||||
strlen(altfilename) + 2, sizeof(char));
|
||||
sprintf(cmd, lessclose, filename, altfilename);
|
||||
len = strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2;
|
||||
cmd = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF2(cmd, len, lessclose, filename, altfilename);
|
||||
fd = shellcmd(cmd);
|
||||
free(cmd);
|
||||
if (fd != NULL)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -124,13 +124,6 @@ forw(n, pos, force, only_last, nblank)
|
||||
|
||||
if (!do_repaint)
|
||||
{
|
||||
/*
|
||||
* Forget any current line shift we might have
|
||||
* (from the last line of the previous screenful).
|
||||
*/
|
||||
extern int cshift;
|
||||
cshift = 0;
|
||||
|
||||
if (top_scroll && n >= sc_height - 1 && pos != ch_length())
|
||||
{
|
||||
/*
|
||||
@ -142,7 +135,7 @@ forw(n, pos, force, only_last, nblank)
|
||||
pos_clear();
|
||||
add_forw_pos(pos);
|
||||
force = 1;
|
||||
if (top_scroll == OPT_ONPLUS || first_time)
|
||||
if (top_scroll == OPT_ONPLUS || (first_time && top_scroll != OPT_ON))
|
||||
clear();
|
||||
home();
|
||||
} else
|
||||
@ -240,7 +233,7 @@ forw(n, pos, force, only_last, nblank)
|
||||
if (top_scroll == OPT_ON)
|
||||
clear_eol();
|
||||
put_line();
|
||||
if (clear_bg && final_attr != AT_NORMAL)
|
||||
if (clear_bg && apply_at_specials(final_attr) != AT_NORMAL)
|
||||
{
|
||||
/*
|
||||
* Writing the last character on the last line
|
||||
|
@ -21,14 +21,11 @@
|
||||
public void clear ();
|
||||
public void clear_eol ();
|
||||
public void clear_bot ();
|
||||
public void so_enter ();
|
||||
public void so_exit ();
|
||||
public void ul_enter ();
|
||||
public void ul_exit ();
|
||||
public void bo_enter ();
|
||||
public void bo_exit ();
|
||||
public void bl_enter ();
|
||||
public void bl_exit ();
|
||||
public void at_enter ();
|
||||
public void at_exit ();
|
||||
public void at_switch ();
|
||||
public int is_at_equiv ();
|
||||
public int apply_at_specials ();
|
||||
public void backspace ();
|
||||
public void putbs ();
|
||||
public char WIN32getch ();
|
||||
@ -54,6 +51,15 @@
|
||||
public int binary_char ();
|
||||
public int control_char ();
|
||||
public char * prchar ();
|
||||
public char * prutfchar ();
|
||||
public int utf_len ();
|
||||
public int is_utf8_well_formed ();
|
||||
public LWCHAR get_wchar ();
|
||||
public LWCHAR step_char ();
|
||||
public int is_composing_char ();
|
||||
public int is_ubin_char ();
|
||||
public int is_wide_char ();
|
||||
public int is_combining_char ();
|
||||
public void cmd_reset ();
|
||||
public void clear_cmd ();
|
||||
public void cmd_putstr ();
|
||||
@ -64,6 +70,8 @@
|
||||
public int cmd_char ();
|
||||
public LINENUM cmd_int ();
|
||||
public char * get_cmdbuf ();
|
||||
public void init_cmdhist ();
|
||||
public void save_cmdhist ();
|
||||
public int in_mca ();
|
||||
public void dispversion ();
|
||||
public int getcc ();
|
||||
@ -142,10 +150,14 @@
|
||||
public void jump_line_loc ();
|
||||
public void jump_loc ();
|
||||
public void init_line ();
|
||||
public int is_ascii_char ();
|
||||
public void prewind ();
|
||||
public void plinenum ();
|
||||
public void pshift_all ();
|
||||
public int is_ansi_end ();
|
||||
public int is_ansi_middle ();
|
||||
public int pappend ();
|
||||
public int pflushmbc ();
|
||||
public void pdone ();
|
||||
public int gline ();
|
||||
public void null_line ();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -27,6 +27,7 @@ extern int hshift;
|
||||
extern int quit_if_one_screen;
|
||||
extern int sigs;
|
||||
extern int ignore_eoi;
|
||||
extern int status_col;
|
||||
extern POSITION start_attnpos;
|
||||
extern POSITION end_attnpos;
|
||||
#if HILITE_SEARCH
|
||||
@ -45,10 +46,12 @@ extern int size_linebuf;
|
||||
forw_line(curr_pos)
|
||||
POSITION curr_pos;
|
||||
{
|
||||
POSITION base_pos;
|
||||
POSITION new_pos;
|
||||
register int c;
|
||||
int blankline;
|
||||
int endline;
|
||||
int backchars;
|
||||
|
||||
if (curr_pos == NULL_POSITION)
|
||||
{
|
||||
@ -56,7 +59,7 @@ forw_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
#if HILITE_SEARCH
|
||||
if (hilite_search == OPT_ONPLUS)
|
||||
if (hilite_search == OPT_ONPLUS || status_col)
|
||||
/*
|
||||
* If we are ignoring EOI (command F), only prepare
|
||||
* one line ahead, to avoid getting stuck waiting for
|
||||
@ -73,9 +76,48 @@ forw_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
|
||||
base_pos = curr_pos;
|
||||
for (;;)
|
||||
{
|
||||
if (ABORT_SIGS())
|
||||
{
|
||||
null_line();
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
c = ch_back_get();
|
||||
if (c == EOI)
|
||||
break;
|
||||
if (c == '\n')
|
||||
{
|
||||
(void) ch_forw_get();
|
||||
break;
|
||||
}
|
||||
--base_pos;
|
||||
}
|
||||
|
||||
prewind();
|
||||
plinenum(curr_pos);
|
||||
(void) ch_seek(curr_pos);
|
||||
plinenum(base_pos);
|
||||
(void) ch_seek(base_pos);
|
||||
while (base_pos < curr_pos)
|
||||
{
|
||||
if (ABORT_SIGS())
|
||||
{
|
||||
null_line();
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
c = ch_forw_get();
|
||||
backchars = pappend(c, base_pos);
|
||||
base_pos++;
|
||||
if (backchars > 0)
|
||||
{
|
||||
pshift_all();
|
||||
base_pos -= backchars;
|
||||
while (--backchars >= 0)
|
||||
(void) ch_back_get();
|
||||
}
|
||||
}
|
||||
(void) pflushmbc();
|
||||
pshift_all();
|
||||
|
||||
c = ch_forw_get();
|
||||
if (c == EOI)
|
||||
@ -97,15 +139,24 @@ forw_line(curr_pos)
|
||||
/*
|
||||
* End of the line.
|
||||
*/
|
||||
backchars = pflushmbc();
|
||||
new_pos = ch_tell();
|
||||
if (backchars > 0 && !chopline && hshift == 0)
|
||||
{
|
||||
new_pos -= backchars + 1;
|
||||
endline = FALSE;
|
||||
} else
|
||||
endline = TRUE;
|
||||
break;
|
||||
}
|
||||
if (c != '\r')
|
||||
blankline = 0;
|
||||
|
||||
/*
|
||||
* Append the char to the line and get the next char.
|
||||
*/
|
||||
if (pappend(c, ch_tell()-1))
|
||||
backchars = pappend(c, ch_tell()-1);
|
||||
if (backchars > 0)
|
||||
{
|
||||
/*
|
||||
* The char won't fit in the line; the line
|
||||
@ -123,7 +174,7 @@ forw_line(curr_pos)
|
||||
quit_if_one_screen = FALSE;
|
||||
} else
|
||||
{
|
||||
new_pos = ch_tell() - 1;
|
||||
new_pos = ch_tell() - backchars;
|
||||
endline = FALSE;
|
||||
}
|
||||
break;
|
||||
@ -167,6 +218,7 @@ back_line(curr_pos)
|
||||
POSITION new_pos, begin_new_pos;
|
||||
int c;
|
||||
int endline;
|
||||
int backchars;
|
||||
|
||||
if (curr_pos == NULL_POSITION || curr_pos <= ch_zero())
|
||||
{
|
||||
@ -174,7 +226,7 @@ back_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
#if HILITE_SEARCH
|
||||
if (hilite_search == OPT_ONPLUS)
|
||||
if (hilite_search == OPT_ONPLUS || status_col)
|
||||
prep_hilite((curr_pos < 3*size_linebuf) ?
|
||||
0 : curr_pos - 3*size_linebuf, curr_pos, -1);
|
||||
#endif
|
||||
@ -263,10 +315,10 @@ back_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
endline = FALSE;
|
||||
loop:
|
||||
begin_new_pos = new_pos;
|
||||
prewind();
|
||||
plinenum(new_pos);
|
||||
loop:
|
||||
begin_new_pos = new_pos;
|
||||
(void) ch_seek(new_pos);
|
||||
|
||||
do
|
||||
@ -280,10 +332,17 @@ back_line(curr_pos)
|
||||
new_pos++;
|
||||
if (c == '\n')
|
||||
{
|
||||
backchars = pflushmbc();
|
||||
if (backchars > 0 && !chopline && hshift == 0)
|
||||
{
|
||||
backchars++;
|
||||
goto shift;
|
||||
}
|
||||
endline = TRUE;
|
||||
break;
|
||||
}
|
||||
if (pappend(c, ch_tell()-1))
|
||||
backchars = pappend(c, ch_tell()-1);
|
||||
if (backchars > 0)
|
||||
{
|
||||
/*
|
||||
* Got a full printable line, but we haven't
|
||||
@ -296,9 +355,13 @@ back_line(curr_pos)
|
||||
quit_if_one_screen = FALSE;
|
||||
break;
|
||||
}
|
||||
pdone(0);
|
||||
shift:
|
||||
pshift_all();
|
||||
while (backchars-- > 0)
|
||||
{
|
||||
(void) ch_back_get();
|
||||
new_pos--;
|
||||
}
|
||||
goto loop;
|
||||
}
|
||||
} while (new_pos < curr_pos);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -22,6 +22,7 @@ extern int squished;
|
||||
extern int screen_trashed;
|
||||
extern int sc_width, sc_height;
|
||||
extern int show_attn;
|
||||
extern int top_scroll;
|
||||
|
||||
/*
|
||||
* Jump to the end of the file.
|
||||
@ -279,7 +280,10 @@ jump_loc(pos, sline)
|
||||
}
|
||||
}
|
||||
lastmark();
|
||||
if (top_scroll != OPT_ON)
|
||||
clear();
|
||||
else
|
||||
home();
|
||||
screen_trashed = 0;
|
||||
add_back_pos(pos);
|
||||
back(sc_height-1, pos, 1, 0);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -79,13 +79,21 @@
|
||||
#if HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
/* OS-specific includes */
|
||||
#ifdef _OSK
|
||||
#include <modes.h>
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef __TANDEM
|
||||
#include <floss.h>
|
||||
#endif
|
||||
|
||||
#if MSDOS_COMPILER==WIN32C || OS2
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#if MSDOS_COMPILER==DJGPPC
|
||||
#include <io.h>
|
||||
#include <sys/exceptn.h>
|
||||
@ -104,16 +112,40 @@ void free();
|
||||
* Simple lowercase test which can be used during option processing
|
||||
* (before options are parsed which might tell us what charset to use).
|
||||
*/
|
||||
#define SIMPLE_IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
|
||||
#define SIMPLE_IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
|
||||
#define SIMPLE_TO_UPPER(c) ((c) - 'a' + 'A')
|
||||
#define SIMPLE_TO_LOWER(c) ((c) - 'A' + 'a')
|
||||
#define ASCII_IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
|
||||
#define ASCII_IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
|
||||
#define ASCII_TO_UPPER(c) ((c) - 'a' + 'A')
|
||||
#define ASCII_TO_LOWER(c) ((c) - 'A' + 'a')
|
||||
|
||||
#undef IS_UPPER
|
||||
#undef IS_LOWER
|
||||
#undef TO_UPPER
|
||||
#undef TO_LOWER
|
||||
#undef IS_SPACE
|
||||
#undef IS_DIGIT
|
||||
|
||||
#if !HAVE_UPPER_LOWER
|
||||
#define isupper(c) SIMPLE_IS_UPPER(c)
|
||||
#define islower(c) SIMPLE_IS_LOWER(c)
|
||||
#define toupper(c) SIMPLE_TO_UPPER(c)
|
||||
#define tolower(c) SIMPLE_TO_LOWER(c)
|
||||
#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)
|
||||
#else
|
||||
#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))
|
||||
#endif
|
||||
|
||||
#ifdef isspace
|
||||
#define IS_SPACE(c) isspace((unsigned char)(c))
|
||||
#else
|
||||
#define IS_SPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r' || (c) == '\f')
|
||||
#endif
|
||||
|
||||
#ifdef isdigit
|
||||
#define IS_DIGIT(c) isdigit((unsigned char)(c))
|
||||
#else
|
||||
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
@ -137,6 +169,19 @@ void free();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HAVE_SNPRINTF
|
||||
#define SNPRINTF1(str, size, fmt, v1) snprintf((str), (size), (fmt), (v1))
|
||||
#define SNPRINTF2(str, size, fmt, v1, v2) snprintf((str), (size), (fmt), (v1), (v2))
|
||||
#define SNPRINTF3(str, size, fmt, v1, v2, v3) snprintf((str), (size), (fmt), (v1), (v2), (v3))
|
||||
#define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) snprintf((str), (size), (fmt), (v1), (v2), (v3), (v4))
|
||||
#else
|
||||
/* Use unsafe sprintf if we don't have snprintf. */
|
||||
#define SNPRINTF1(str, size, fmt, v1) sprintf((str), (fmt), (v1))
|
||||
#define SNPRINTF2(str, size, fmt, v1, v2) sprintf((str), (fmt), (v1), (v2))
|
||||
#define SNPRINTF3(str, size, fmt, v1, v2, v3) sprintf((str), (fmt), (v1), (v2), (v3))
|
||||
#define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) sprintf((str), (fmt), (v1), (v2), (v3), (v4))
|
||||
#endif
|
||||
|
||||
#define BAD_LSEEK ((off_t)-1)
|
||||
|
||||
#ifndef CHAR_BIT
|
||||
@ -153,9 +198,11 @@ void free();
|
||||
/*
|
||||
* Special types and constants.
|
||||
*/
|
||||
typedef unsigned long LWCHAR;
|
||||
typedef off_t POSITION;
|
||||
typedef off_t LINENUM;
|
||||
#define MIN_LINENUM_WIDTH 7 /* Min printing width of a line number */
|
||||
#define MAX_UTF_CHAR_LEN 6 /* Max bytes in one UTF-8 char */
|
||||
|
||||
#define NULL_POSITION ((POSITION)(-1))
|
||||
|
||||
@ -264,14 +311,14 @@ struct textlist
|
||||
#define BS_CONTROL 2 /* \b treated as control char; prints as ^H */
|
||||
|
||||
/* How should we search? */
|
||||
#define SRCH_FORW 000001 /* Search forward from current position */
|
||||
#define SRCH_BACK 000002 /* Search backward from current position */
|
||||
#define SRCH_NO_MOVE 000004 /* Highlight, but don't move */
|
||||
#define SRCH_FIND_ALL 000010 /* Find and highlight all matches */
|
||||
#define SRCH_NO_MATCH 000100 /* Search for non-matching lines */
|
||||
#define SRCH_PAST_EOF 000200 /* Search past end-of-file, into next file */
|
||||
#define SRCH_FIRST_FILE 000400 /* Search starting at the first file */
|
||||
#define SRCH_NO_REGEX 001000 /* Don't use regular expressions */
|
||||
#define SRCH_FORW (1 << 0) /* Search forward from current position */
|
||||
#define SRCH_BACK (1 << 1) /* Search backward from current position */
|
||||
#define SRCH_NO_MOVE (1 << 2) /* Highlight, but don't move */
|
||||
#define SRCH_FIND_ALL (1 << 4) /* Find and highlight all matches */
|
||||
#define SRCH_NO_MATCH (1 << 8) /* Search for non-matching lines */
|
||||
#define SRCH_PAST_EOF (1 << 9) /* Search past end-of-file, into next file */
|
||||
#define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
|
||||
#define SRCH_NO_REGEX (1 << 12) /* Don't use regular expressions */
|
||||
|
||||
#define SRCH_REVERSE(t) (((t) & SRCH_FORW) ? \
|
||||
(((t) & ~SRCH_FORW) | SRCH_BACK) : \
|
||||
@ -289,13 +336,15 @@ struct textlist
|
||||
|
||||
#define CF_QUIT_ON_ERASE 0001 /* Abort cmd if its entirely erased */
|
||||
|
||||
/* Special chars used to tell put_line() to do something special */
|
||||
/* Special char bit-flags used to tell put_line() to do something special */
|
||||
#define AT_NORMAL (0)
|
||||
#define AT_UNDERLINE (1)
|
||||
#define AT_BOLD (2)
|
||||
#define AT_BLINK (3)
|
||||
#define AT_INVIS (4)
|
||||
#define AT_STANDOUT (5)
|
||||
#define AT_UNDERLINE (1 << 0)
|
||||
#define AT_BOLD (1 << 1)
|
||||
#define AT_BLINK (1 << 2)
|
||||
#define AT_STANDOUT (1 << 3)
|
||||
#define AT_ANSI (1 << 4) /* Content-supplied "ANSI" escape sequence */
|
||||
#define AT_BINARY (1 << 5) /* LESS*BINFMT representation */
|
||||
#define AT_HILITE (1 << 6) /* Internal highlights (e.g., for search) */
|
||||
|
||||
#if '0' == 240
|
||||
#define IS_EBCDIC_HOST 1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,24 +1,24 @@
|
||||
.TH LESS 1 "Version 381: 17 Jan 2003"
|
||||
.TH LESS 1 "Version 394: 03 Dec 2005"
|
||||
.SH NAME
|
||||
less \- opposite of more
|
||||
.SH SYNOPSIS
|
||||
.B "less -?"
|
||||
.B "less \-?"
|
||||
.br
|
||||
.B "less --help"
|
||||
.B "less \-\-help"
|
||||
.br
|
||||
.B "less -V"
|
||||
.B "less \-V"
|
||||
.br
|
||||
.B "less --version"
|
||||
.B "less \-\-version"
|
||||
.br
|
||||
.B "less [-[+]aBcCdeEfFgGiIJLmMnNqQrRsSuUVwWX~]"
|
||||
.B "less [\-[+]aBcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]"
|
||||
.br
|
||||
.B " [-b \fIspace\fP] [-h \fIlines\fP] [-j \fIline\fP] [-k \fIkeyfile\fP]"
|
||||
.B " [\-b \fIspace\fP] [\-h \fIlines\fP] [\-j \fIline\fP] [\-k \fIkeyfile\fP]"
|
||||
.br
|
||||
.B " [-{oO} \fIlogfile\fP] [-p \fIpattern\fP] [-P \fIprompt\fP] [-t \fItag\fP]"
|
||||
.B " [\-{oO} \fIlogfile\fP] [\-p \fIpattern\fP] [\-P \fIprompt\fP] [\-t \fItag\fP]"
|
||||
.br
|
||||
.B " [-T \fItagsfile\fP] [-x \fItab\fP,...] [-y \fIlines\fP] [-[z] \fIlines\fP]"
|
||||
.B " [\-T \fItagsfile\fP] [\-x \fItab\fP,...] [\-y \fIlines\fP] [\-[z] \fIlines\fP]"
|
||||
.br
|
||||
.B " [-# \fIshift\fP] [+[+]\fIcmd\fP] [--] [\fIfilename\fP]..."
|
||||
.B " [\-# \fIshift\fP] [+[+]\fIcmd\fP] [\-\-] [\fIfilename\fP]..."
|
||||
.br
|
||||
(See the OPTIONS section for alternate option syntax with long option names.)
|
||||
|
||||
@ -57,7 +57,7 @@ two character sequence "ESCAPE", then "v".
|
||||
Help: display a summary of these commands.
|
||||
If you forget all the other commands, remember this one.
|
||||
.IP "SPACE or ^V or f or ^F"
|
||||
Scroll forward N lines, default one window (see option -z below).
|
||||
Scroll forward N lines, default one window (see option \-z below).
|
||||
If N is more than the screen size, only the final screenful is displayed.
|
||||
Warning: some systems use ^V as a special literalization character.
|
||||
.IP "z"
|
||||
@ -73,7 +73,7 @@ Scroll forward N lines, default one half of the screen size.
|
||||
If N is specified, it becomes the new default for
|
||||
subsequent d and u commands.
|
||||
.IP "b or ^B or ESC-v"
|
||||
Scroll backward N lines, default one window (see option -z below).
|
||||
Scroll backward N lines, default one window (see option \-z below).
|
||||
If N is more than the screen size, only the final screenful is displayed.
|
||||
.IP "w"
|
||||
Like ESC-v, but if N is specified, it becomes the new window size.
|
||||
@ -87,14 +87,14 @@ If N is specified, it becomes the new default for
|
||||
subsequent d and u commands.
|
||||
.IP "ESC-) or RIGHTARROW"
|
||||
Scroll horizontally right N characters, default half the screen width
|
||||
(see the -# option).
|
||||
(see the \-# option).
|
||||
If a number N is specified, it becomes the default for future RIGHTARROW
|
||||
and LEFTARROW commands.
|
||||
While the text is scrolled, it acts as though the -S option
|
||||
While the text is scrolled, it acts as though the \-S option
|
||||
(chop lines) were in effect.
|
||||
.IP "ESC-( or LEFTARROW"
|
||||
Scroll horizontally left N characters, default half the screen width
|
||||
(see the -# option).
|
||||
(see the \-# option).
|
||||
If a number N is specified, it becomes the default for future RIGHTARROW
|
||||
and LEFTARROW commands.
|
||||
.IP "r or ^R or ^L"
|
||||
@ -108,7 +108,7 @@ end of file is reached.
|
||||
Normally this command would be used when already at the end of the file.
|
||||
It is a way to monitor the tail of a file which is growing
|
||||
while it is being viewed.
|
||||
(The behavior is similar to the "tail -f" command.)
|
||||
(The behavior is similar to the "tail \-f" command.)
|
||||
.IP "g or < or ESC-<"
|
||||
Go to line N in the file, default 1 (beginning of file).
|
||||
(Warning: this may be slow if N is large.)
|
||||
@ -175,9 +175,9 @@ Same as single quote.
|
||||
Search forward in the file for the N-th line containing the pattern.
|
||||
N defaults to 1.
|
||||
The pattern is a regular expression, as recognized by
|
||||
.I ed.
|
||||
the regular expression library supplied by your system.
|
||||
The search starts at the second line displayed
|
||||
(but see the -a and -j options, which change this).
|
||||
(but see the \-a and \-j options, which change this).
|
||||
.sp
|
||||
Certain characters are special
|
||||
if entered at the beginning of the pattern;
|
||||
@ -194,7 +194,7 @@ the search continues in the next file in the command line list.
|
||||
Begin the search at the first line of the FIRST file
|
||||
in the command line list,
|
||||
regardless of what is currently displayed on the screen
|
||||
or the settings of the -a or -j options.
|
||||
or the settings of the \-a or \-j options.
|
||||
.IP "^K"
|
||||
Highlight any text which matches the pattern on the current screen,
|
||||
but don't move to the first match (KEEP current position).
|
||||
@ -219,7 +219,7 @@ the search continues in the previous file in the command line list.
|
||||
Begin the search at the last line of the last file
|
||||
in the command line list,
|
||||
regardless of what is currently displayed on the screen
|
||||
or the settings of the -a or -j options.
|
||||
or the settings of the \-a or \-j options.
|
||||
.IP "^K"
|
||||
As in forward searches.
|
||||
.IP "^R"
|
||||
@ -252,7 +252,7 @@ Turn off highlighting of strings matching the current search pattern.
|
||||
If highlighting is already off because of a previous ESC-u command,
|
||||
turn highlighting back on.
|
||||
Any search command will also turn highlighting back on.
|
||||
(Highlighting can also be disabled by toggling the -G option;
|
||||
(Highlighting can also be disabled by toggling the \-G option;
|
||||
in that case search commands do not turn highlighting back on.)
|
||||
.IP ":e [filename]"
|
||||
Examine a new file.
|
||||
@ -272,7 +272,7 @@ If the filename consists of several files, they are all inserted into
|
||||
the list of files and the first one is examined.
|
||||
If the filename contains one or more spaces,
|
||||
the entire filename should be enclosed in double quotes
|
||||
(also see the -" option).
|
||||
(also see the \-" option).
|
||||
.IP "^X^V or E"
|
||||
Same as :e.
|
||||
Warning: some systems use ^V as a special literalization character.
|
||||
@ -306,8 +306,8 @@ this will change the setting of that option
|
||||
and print a message describing the new setting.
|
||||
If a ^P (CONTROL-P) is entered immediately after the dash,
|
||||
the setting of the option is changed but no message is printed.
|
||||
If the option letter has a numeric value (such as -b or -h),
|
||||
or a string value (such as -P or -t),
|
||||
If the option letter has a numeric value (such as \-b or \-h),
|
||||
or a string value (such as \-P or \-t),
|
||||
a new value may be entered after the option letter.
|
||||
If no new value is entered, a message describing
|
||||
the current setting is printed and nothing is changed.
|
||||
@ -401,17 +401,17 @@ either a dash followed by a single letter,
|
||||
or two dashes followed by a long option name.
|
||||
A long option name may be abbreviated as long as
|
||||
the abbreviation is unambiguous.
|
||||
For example, --quit-at-eof may be abbreviated --quit, but not
|
||||
--qui, since both --quit-at-eof and --quiet begin with --qui.
|
||||
Some long option names are in uppercase, such as --QUIT-AT-EOF, as
|
||||
distinct from --quit-at-eof.
|
||||
For example, \-\-quit-at-eof may be abbreviated \-\-quit, but not
|
||||
--qui, since both \-\-quit-at-eof and \-\-quiet begin with \-\-qui.
|
||||
Some long option names are in uppercase, such as \-\-QUIT-AT-EOF, as
|
||||
distinct from \-\-quit-at-eof.
|
||||
Such option names need only have their first letter capitalized;
|
||||
the remainder of the name may be in either case.
|
||||
For example, --Quit-at-eof is equivalent to --QUIT-AT-EOF.
|
||||
For example, \-\-Quit-at-eof is equivalent to \-\-QUIT-AT-EOF.
|
||||
.PP
|
||||
Options are also taken from the environment variable "LESS".
|
||||
For example,
|
||||
to avoid typing "less -options ..." each time
|
||||
to avoid typing "less \-options ..." each time
|
||||
.I less
|
||||
is invoked, you might tell
|
||||
.I csh:
|
||||
@ -432,62 +432,62 @@ If an option appears in the LESS variable, it can be reset
|
||||
to its default value on the command line by beginning the command
|
||||
line option with "\-+".
|
||||
.sp
|
||||
For options like -P or -D which take a following string,
|
||||
For options like \-P or \-D which take a following string,
|
||||
a dollar sign ($) must be used to signal the end of the string.
|
||||
For example, to set two -D options on MS-DOS, you must have
|
||||
For example, to set two \-D options on MS-DOS, you must have
|
||||
a dollar sign between them, like this:
|
||||
.sp
|
||||
LESS="-Dn9.1$-Ds4.1"
|
||||
.sp
|
||||
.IP "-? or --help"
|
||||
.IP "\-? or \-\-help"
|
||||
This option displays a summary of the commands accepted by
|
||||
.I less
|
||||
(the same as the h command).
|
||||
(Depending on how your shell interprets the question mark,
|
||||
it may be necessary to quote the question mark, thus: "-\e?".)
|
||||
.IP "-a or --search-skip-screen"
|
||||
it may be necessary to quote the question mark, thus: "\-\e?".)
|
||||
.IP "\-a or \-\-search-skip-screen"
|
||||
Causes searches to start after the last line
|
||||
displayed on the screen,
|
||||
thus skipping all lines displayed on the screen.
|
||||
By default, searches start at the second line on the screen
|
||||
(or after the last found line; see the -j option).
|
||||
.IP "-b\fIn\fP or --buffers=\fIn\fP"
|
||||
(or after the last found line; see the \-j option).
|
||||
.IP "\-b\fIn\fP or \-\-buffers=\fIn\fP"
|
||||
Specifies the amount of buffer space
|
||||
.I less
|
||||
will use for each file, in units of kilobytes (1024 bytes).
|
||||
By default 64K of buffer space is used for each file
|
||||
(unless the file is a pipe; see the -B option).
|
||||
The -b option specifies instead that \fIn\fP kilobytes of
|
||||
(unless the file is a pipe; see the \-B option).
|
||||
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,
|
||||
If \fIn\fP is \-1, buffer space is unlimited; that is,
|
||||
the entire file is read into memory.
|
||||
.IP "-B or --auto-buffers"
|
||||
.IP "\-B or \-\-auto-buffers"
|
||||
By default, when data is read from a pipe,
|
||||
buffers are allocated automatically as needed.
|
||||
If a large amount of data is read from the pipe, this can cause
|
||||
a large amount of memory to be allocated.
|
||||
The -B option disables this automatic allocation of buffers for pipes,
|
||||
The \-B option disables this automatic allocation of buffers for pipes,
|
||||
so that only 64K
|
||||
(or the amount of space specified by the -b option)
|
||||
(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
|
||||
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.
|
||||
.IP "-c or --clear-screen"
|
||||
.IP "\-c or \-\-clear-screen"
|
||||
Causes full screen repaints to be painted from the top line down.
|
||||
By default,
|
||||
full screen repaints are done by scrolling from the bottom of the screen.
|
||||
.IP "-C or --CLEAR-SCREEN"
|
||||
The -C option is like -c, but the screen is cleared before it is repainted.
|
||||
.IP "-d or --dumb"
|
||||
The -d option suppresses the error message
|
||||
.IP "\-C or \-\-CLEAR-SCREEN"
|
||||
The \-C option is like \-c, but the screen is cleared before it is repainted.
|
||||
.IP "\-d or \-\-dumb"
|
||||
The \-d option suppresses the error message
|
||||
normally displayed if the terminal is dumb;
|
||||
that is, lacks some important capability,
|
||||
such as the ability to clear the screen or scroll backward.
|
||||
The -d option does not otherwise change the behavior of
|
||||
The \-d option does not otherwise change the behavior of
|
||||
.I less
|
||||
on a dumb terminal.
|
||||
.IP "-D\fBx\fP\fIcolor\fP or --color=\fBx\fP\fIcolor\fP"
|
||||
.IP "\-D\fBx\fP\fIcolor\fP or \-\-color=\fBx\fP\fIcolor\fP"
|
||||
[MS-DOS only]
|
||||
Sets the color of the text displayed.
|
||||
\fBx\fP is a single character which selects the type of text whose color is
|
||||
@ -496,7 +496,7 @@ being set: n=normal, s=standout, d=bold, u=underlined, k=blink.
|
||||
The first number selects the foreground color and the second selects
|
||||
the background color of the text.
|
||||
A single number \fIN\fP is the same as \fIN.0\fP.
|
||||
.IP "-e or --quit-at-eof"
|
||||
.IP "\-e or \-\-quit-at-eof"
|
||||
Causes
|
||||
.I less
|
||||
to automatically exit
|
||||
@ -504,50 +504,50 @@ the second time it reaches end-of-file.
|
||||
By default, the only way to exit
|
||||
.I less
|
||||
is via the "q" command.
|
||||
.IP "-E or --QUIT-AT-EOF"
|
||||
.IP "\-E or \-\-QUIT-AT-EOF"
|
||||
Causes
|
||||
.I less
|
||||
to automatically exit the first time it reaches end-of-file.
|
||||
.IP "-f or --force"
|
||||
.IP "\-f or \-\-force"
|
||||
Forces non-regular files to be opened.
|
||||
(A non-regular file is a directory or a device special file.)
|
||||
Also suppresses the warning message when a binary file is opened.
|
||||
By default,
|
||||
.I less
|
||||
will refuse to open non-regular files.
|
||||
.IP "-F or --quit-if-one-screen"
|
||||
.IP "\-F or \-\-quit-if-one-screen"
|
||||
Causes
|
||||
.I less
|
||||
to automatically exit
|
||||
if the entire file can be displayed on the first screen.
|
||||
.IP "-g or --hilite-search"
|
||||
.IP "\-g or \-\-hilite-search"
|
||||
Normally,
|
||||
.I less
|
||||
will highlight ALL strings which match the last search command.
|
||||
The -g option changes this behavior to highlight only the particular string
|
||||
The \-g option changes this behavior to highlight only the particular string
|
||||
which was found by the last search command.
|
||||
This can cause
|
||||
.I less
|
||||
to run somewhat faster than the default.
|
||||
.IP "-G or --HILITE-SEARCH"
|
||||
The -G option suppresses all highlighting of strings found by search commands.
|
||||
.IP "-h\fIn\fP or ---max-back-scroll=\fIn\fP"
|
||||
.IP "\-G or \-\-HILITE-SEARCH"
|
||||
The \-G option suppresses all highlighting of strings found by search commands.
|
||||
.IP "\-h\fIn\fP or \-\-max-back-scroll=\fIn\fP"
|
||||
Specifies a maximum number of lines to scroll backward.
|
||||
If it is necessary to scroll backward more than \fIn\fP lines,
|
||||
the screen is repainted in a forward direction instead.
|
||||
(If the terminal does not have the ability to scroll
|
||||
backward, -h0 is implied.)
|
||||
.IP "-i or --ignore-case"
|
||||
backward, \-h0 is implied.)
|
||||
.IP "\-i or \-\-ignore-case"
|
||||
Causes searches to ignore case; that is,
|
||||
uppercase and lowercase are considered identical.
|
||||
This option is ignored if any uppercase letters
|
||||
appear in the search pattern;
|
||||
in other words,
|
||||
if a pattern contains uppercase letters, then that search does not ignore case.
|
||||
.IP "-I or --IGNORE-CASE"
|
||||
Like -i, but searches ignore case even if
|
||||
.IP "\-I or \-\-IGNORE-CASE"
|
||||
Like \-i, but searches ignore case even if
|
||||
the pattern contains uppercase letters.
|
||||
.IP "-j\fIn\fP or --jump-target=\fIn\fP"
|
||||
.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,
|
||||
@ -556,36 +556,43 @@ jump to a file percentage, or jump to a marked position.
|
||||
The screen line is 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.
|
||||
If the -j option is used, searches begin at the line immediately
|
||||
of the screen: the bottom line on the screen is \-1, the second
|
||||
to the bottom is \-2, and so on.
|
||||
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
|
||||
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.
|
||||
.IP "-J or --status-column"
|
||||
.IP "\-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 effect.
|
||||
.IP "-k\fIfilename\fP or --lesskey-file=\fIfilename\fP"
|
||||
The status column is also used if the \-w or \-W option is in effect.
|
||||
.IP "\-k\fIfilename\fP or \-\-lesskey-file=\fIfilename\fP"
|
||||
Causes
|
||||
.I less
|
||||
to open and interpret the named file as a
|
||||
.I lesskey
|
||||
(1) file.
|
||||
Multiple -k options may be specified.
|
||||
Multiple \-k options may be specified.
|
||||
If the 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
|
||||
.I lesskey
|
||||
file.
|
||||
.IP "-L or --no-lessopen"
|
||||
.IP "\-K or \-\-quit-on-intr"
|
||||
Causes
|
||||
.I less
|
||||
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.
|
||||
.IP "\-L or \-\-no-lessopen"
|
||||
Ignore the LESSOPEN environment variable
|
||||
(see the INPUT PREPROCESSOR section below).
|
||||
This option can be set from within \fIless\fP,
|
||||
but it will apply only to files opened subsequently, not to the
|
||||
file which is currently open.
|
||||
.IP "-m or --long-prompt"
|
||||
.IP "\-m or \-\-long-prompt"
|
||||
Causes
|
||||
.I less
|
||||
to prompt verbosely (like \fImore\fP),
|
||||
@ -593,25 +600,25 @@ with the percent into the file.
|
||||
By default,
|
||||
.I less
|
||||
prompts with a colon.
|
||||
.IP "-M or --LONG-PROMPT"
|
||||
.IP "\-M or \-\-LONG-PROMPT"
|
||||
Causes
|
||||
.I less
|
||||
to prompt even more verbosely than
|
||||
.I more.
|
||||
.IP "-n or --line-numbers"
|
||||
.IP "\-n or \-\-line-numbers"
|
||||
Suppresses line numbers.
|
||||
The default (to use line numbers) may cause
|
||||
.I less
|
||||
to run more slowly in some cases, especially with a very large input file.
|
||||
Suppressing line numbers with the -n option will avoid this problem.
|
||||
Suppressing line numbers with the \-n option will avoid this problem.
|
||||
Using line numbers means: the line number will be displayed in the verbose
|
||||
prompt and in the = command,
|
||||
and the v command will pass the current line number to the editor
|
||||
(see also the discussion of LESSEDIT in PROMPTS below).
|
||||
.IP "-N or --LINE-NUMBERS"
|
||||
.IP "\-N or \-\-LINE-NUMBERS"
|
||||
Causes a line number to be displayed at the beginning of
|
||||
each line in the display.
|
||||
.IP "-o\fIfilename\fP or --log-file=\fIfilename\fP"
|
||||
.IP "\-o\fIfilename\fP or \-\-log-file=\fIfilename\fP"
|
||||
Causes
|
||||
.I less
|
||||
to copy its input to the named file as it is being viewed.
|
||||
@ -620,24 +627,24 @@ not an ordinary file.
|
||||
If the file already exists,
|
||||
.I less
|
||||
will ask for confirmation before overwriting it.
|
||||
.IP "-O\fIfilename\fP or --LOG-FILE=\fIfilename\fP"
|
||||
The -O option is like -o, but it will overwrite an existing
|
||||
.IP "\-O\fIfilename\fP or \-\-LOG-FILE=\fIfilename\fP"
|
||||
The \-O option is like \-o, but it will overwrite an existing
|
||||
file without asking for confirmation.
|
||||
.sp
|
||||
If no log file has been specified,
|
||||
the -o and -O options can be used from within
|
||||
the \-o and \-O options can be used from within
|
||||
.I less
|
||||
to specify a log file.
|
||||
Without a file name, they will simply report the name of the log file.
|
||||
The "s" command is equivalent to specifying -o from within
|
||||
The "s" command is equivalent to specifying \-o from within
|
||||
.I less.
|
||||
.IP "-p\fIpattern\fP or --pattern=\fIpattern\fP"
|
||||
The -p option on the command line is equivalent to
|
||||
.IP "\-p\fIpattern\fP or \-\-pattern=\fIpattern\fP"
|
||||
The \-p option on the command line is equivalent to
|
||||
specifying +/\fIpattern\fP;
|
||||
that is, it tells
|
||||
.I less
|
||||
to start at the first occurrence of \fIpattern\fP in the file.
|
||||
.IP "-P\fIprompt\fP or --prompt=\fIprompt\fP"
|
||||
.IP "\-P\fIprompt\fP or \-\-prompt=\fIprompt\fP"
|
||||
Provides a way to tailor the three prompt
|
||||
styles to your own preference.
|
||||
This option would normally be put in the LESS environment
|
||||
@ -648,15 +655,15 @@ Such an option must either be the last option in the LESS variable,
|
||||
or be terminated by a dollar sign.
|
||||
-Ps followed by a string changes the default (short) prompt
|
||||
to that string.
|
||||
-Pm changes the medium (-m) prompt.
|
||||
-PM changes the long (-M) prompt.
|
||||
-Pm changes the medium (\-m) prompt.
|
||||
-PM changes the long (\-M) prompt.
|
||||
-Ph changes the prompt for the help screen.
|
||||
-P= changes the message printed by the = command.
|
||||
-Pw changes the message printed while waiting for data (in the F command).
|
||||
All prompt strings consist of a sequence of
|
||||
letters and special escape sequences.
|
||||
See the section on PROMPTS for more details.
|
||||
.IP "-q or --quiet or --silent"
|
||||
.IP "\-q or \-\-quiet or \-\-silent"
|
||||
Causes moderately "quiet" operation:
|
||||
the terminal bell is not rung
|
||||
if an attempt is made to scroll past the end of the file
|
||||
@ -665,50 +672,54 @@ If the terminal has a "visual bell", it is used instead.
|
||||
The bell will be rung on certain other errors,
|
||||
such as typing an invalid character.
|
||||
The default is to ring the terminal bell in all such cases.
|
||||
.IP "-Q or --QUIET or --SILENT"
|
||||
.IP "\-Q or \-\-QUIET or \-\-SILENT"
|
||||
Causes totally "quiet" operation:
|
||||
the terminal bell is never rung.
|
||||
.IP "-r or --raw-control-chars"
|
||||
.IP "\-r or \-\-raw-control-chars"
|
||||
Causes "raw" control characters to be displayed.
|
||||
The default is to display control characters using the caret notation;
|
||||
for example, a control-A (octal 001) is displayed as "^A".
|
||||
Warning: when the -r option is used,
|
||||
Warning: when the \-r option is used,
|
||||
.I less
|
||||
cannot keep track of the actual appearance of the screen
|
||||
(since this depends on how the screen responds to
|
||||
each type of control character).
|
||||
Thus, various display problems may result,
|
||||
such as long lines being split in the wrong place.
|
||||
.IP "-R or --RAW-CONTROL-CHARS"
|
||||
Like -r, but tries to keep track of the screen appearance where possible.
|
||||
This works only if the input consists of normal text and possibly some
|
||||
ANSI "color" escape sequences, which are sequences of the form:
|
||||
.IP "\-R or \-\-RAW-CONTROL-CHARS"
|
||||
Like \-r, but only ANSI "color" escape sequences are output in "raw" form.
|
||||
Unlike \-r, the screen appearance is maintained correctly in most cases.
|
||||
ANSI "color" escape sequences are sequences of the form:
|
||||
.sp
|
||||
ESC [ ... m
|
||||
.sp
|
||||
where the "..." is zero or more characters other than "m".
|
||||
where the "..." is zero or more color specification characters
|
||||
For the purpose of keeping track of screen appearance,
|
||||
all control characters and all ANSI color escape sequences are
|
||||
assumed to not move the cursor.
|
||||
ANSI color escape sequences are assumed to not move the cursor.
|
||||
You can make
|
||||
.I less
|
||||
think that characters other than "m" can end ANSI color escape sequences
|
||||
by setting the environment variable LESSANSIENDCHARS to the list of
|
||||
characters which can end a color escape sequence.
|
||||
.IP "-s or --squeeze-blank-lines"
|
||||
And you can make
|
||||
.I less
|
||||
think that characters other than the standard ones may appear between
|
||||
the ESC and the m by setting the environment variable LESSANSIMIDCHARS
|
||||
to the list of characters which can appear.
|
||||
.IP "\-s or \-\-squeeze-blank-lines"
|
||||
Causes consecutive blank lines to be squeezed into a single blank line.
|
||||
This is useful when viewing
|
||||
.I nroff
|
||||
output.
|
||||
.IP "-S or --chop-long-lines"
|
||||
.IP "\-S or \-\-chop-long-lines"
|
||||
Causes lines longer than the screen width to be
|
||||
chopped rather than folded.
|
||||
That is, the portion of a long line that does not fit in
|
||||
the screen width is not shown.
|
||||
The default is to fold long lines; that is, display the remainder
|
||||
on the next line.
|
||||
.IP "-t\fItag\fP or --tag=\fItag\fP"
|
||||
The -t option, followed immediately by a TAG,
|
||||
.IP "\-t\fItag\fP or \-\-tag=\fItag\fP"
|
||||
The \-t option, followed immediately by a TAG,
|
||||
will edit the file containing that tag.
|
||||
For this to work, tag information must be available;
|
||||
for example, there may be a file in the current directory called "tags",
|
||||
@ -720,22 +731,22 @@ the name of a command compatible with
|
||||
.I global
|
||||
(1), and that command is executed to find the tag.
|
||||
(See http://www.gnu.org/software/global/global.html).
|
||||
The -t option may also be specified from within
|
||||
The \-t option may also be specified from within
|
||||
.I less
|
||||
(using the \- command) as a way of examining a new file.
|
||||
The command ":t" is equivalent to specifying -t from within
|
||||
The command ":t" is equivalent to specifying \-t from within
|
||||
.I less.
|
||||
.IP "-T\fItagsfile\fP or --tag-file=\fItagsfile\fP"
|
||||
.IP "\-T\fItagsfile\fP or \-\-tag-file=\fItagsfile\fP"
|
||||
Specifies a tags file to be used instead of "tags".
|
||||
.IP "-u or --underline-special"
|
||||
.IP "\-u or \-\-underline-special"
|
||||
Causes backspaces and carriage returns to be treated as printable characters;
|
||||
that is, they are sent to the terminal when they appear in the input.
|
||||
.IP "-U or --UNDERLINE-SPECIAL"
|
||||
.IP "\-U or \-\-UNDERLINE-SPECIAL"
|
||||
Causes backspaces, tabs and carriage returns to be
|
||||
treated as control characters;
|
||||
that is, they are handled as specified by the -r option.
|
||||
that is, they are handled as specified by the \-r option.
|
||||
.sp
|
||||
By default, if neither -u nor -U is given,
|
||||
By default, if neither \-u nor \-U is given,
|
||||
backspaces which appear adjacent to an underscore character
|
||||
are treated specially:
|
||||
the underlined text is displayed
|
||||
@ -746,25 +757,25 @@ the overstruck text is printed
|
||||
using the terminal's hardware boldface capability.
|
||||
Other backspaces are deleted, along with the preceding character.
|
||||
Carriage returns immediately followed by a newline are deleted.
|
||||
other carriage returns are handled as specified by the -r option.
|
||||
other carriage returns are handled as specified by the \-r option.
|
||||
Text which is overstruck or underlined can be searched for
|
||||
if neither -u nor -U is in effect.
|
||||
.IP "-V or --version"
|
||||
if neither \-u nor \-U is in effect.
|
||||
.IP "\-V or \-\-version"
|
||||
Displays the version number of
|
||||
.I less.
|
||||
.IP "-w or --hilite-unread"
|
||||
.IP "\-w or \-\-hilite-unread"
|
||||
Temporarily highlights the first "new" line after a forward movement
|
||||
of a full page.
|
||||
The first "new" line is the line immediately following the line previously
|
||||
at the bottom of the screen.
|
||||
Also highlights the target line after a g or p command.
|
||||
The highlight is removed at the next command which causes movement.
|
||||
The entire line is highlighted, unless the -J option is in effect,
|
||||
The entire line is highlighted, unless the \-J option is in effect,
|
||||
in which case only the status column is highlighted.
|
||||
.IP "-W or --HILITE-UNREAD"
|
||||
Like -w, but temporarily highlights the first new line after any
|
||||
.IP "\-W or \-\-HILITE-UNREAD"
|
||||
Like \-w, but temporarily highlights the first new line after any
|
||||
forward movement command larger than one line.
|
||||
.IP "-x\fIn\fP,... or --tabs=\fIn\fP,..."
|
||||
.IP "\-x\fIn\fP,... or \-\-tabs=\fIn\fP,..."
|
||||
Sets tab stops.
|
||||
If only one \fIn\fP is specified, tab stops are set at multiples of \fIn\fP.
|
||||
If multiple values separated by commas are specified, tab stops
|
||||
@ -772,24 +783,24 @@ are set at those positions, and then continue with the same spacing as the
|
||||
last two.
|
||||
For example, \fI-x9,17\fP will set tabs at positions 9, 17, 25, 33, etc.
|
||||
The default for \fIn\fP is 8.
|
||||
.IP "-X or --no-init"
|
||||
.IP "\-X or \-\-no-init"
|
||||
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"
|
||||
.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"
|
||||
.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,
|
||||
the screen is repainted instead.
|
||||
The -c or -C option may be used to repaint from the top of
|
||||
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.
|
||||
.IP "-[z]\fIn\fP or --window=\fIn\fP"
|
||||
.IP "\-[z]\fIn\fP or \-\-window=\fIn\fP"
|
||||
Changes the default scrolling window size to \fIn\fP lines.
|
||||
The default is one screenful.
|
||||
The z and w commands can also be used to change the window size.
|
||||
@ -800,10 +811,10 @@ If the number
|
||||
is negative, it indicates
|
||||
.I n
|
||||
lines less than the current screen size.
|
||||
For example, if the screen is 24 lines, \fI-z-4\fP sets the
|
||||
For example, if the screen is 24 lines, \fI\-z-4\fP sets the
|
||||
scrolling window to 20 lines. If the screen is resized to 40 lines,
|
||||
the scrolling window automatically changes to 36 lines.
|
||||
.IP "-\fI\(dqcc\fP\ or\ --quotes=\fIcc\fP"
|
||||
.IP "\-\fI\(dqcc\fP\ or\ \-\-quotes=\fIcc\fP"
|
||||
Changes the filename quoting character.
|
||||
This may be necessary if you are trying to name a file
|
||||
which contains both spaces and quote characters.
|
||||
@ -816,19 +827,19 @@ 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 quote).
|
||||
.IP "-~ or --tilde"
|
||||
remains \-" (a dash followed by a double quote).
|
||||
.IP "\-~ or \-\-tilde"
|
||||
Normally lines after end of file are displayed as a single tilde (~).
|
||||
This option causes lines after end of file to be displayed as blank lines.
|
||||
.IP "-# or --shift"
|
||||
.IP "\-# or \-\-shift"
|
||||
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 --
|
||||
A command line argument of "--" marks the end of option arguments.
|
||||
.IP \-\-
|
||||
A command line argument of "\-\-" marks the end of option arguments.
|
||||
Any arguments following this are interpreted as filenames.
|
||||
This can be useful when viewing a file whose name begins with a "-" or "+".
|
||||
This can be useful when viewing a file whose name begins with a "\-" or "+".
|
||||
.IP +
|
||||
If a command line option begins with \fB+\fP,
|
||||
the remainder of that option is taken to be an initial command to
|
||||
@ -1019,15 +1030,15 @@ lessopen.sh:
|
||||
.br
|
||||
case "$1" in
|
||||
.br
|
||||
*.Z) uncompress -c $1 >/tmp/less.$$ 2>/dev/null
|
||||
*.Z) uncompress -\c $1 >/tmp/less.$$ 2>/dev/null
|
||||
.br
|
||||
if [ -s /tmp/less.$$ ]; then
|
||||
if [ \-s /tmp/less.$$ ]; then
|
||||
.br
|
||||
echo /tmp/less.$$
|
||||
.br
|
||||
else
|
||||
.br
|
||||
rm -f /tmp/less.$$
|
||||
rm \-f /tmp/less.$$
|
||||
.br
|
||||
fi
|
||||
.br
|
||||
@ -1074,7 +1085,7 @@ lesspipe.sh:
|
||||
.br
|
||||
case "$1" in
|
||||
.br
|
||||
*.Z) uncompress -c $1 2>/dev/null
|
||||
*.Z) uncompress \-c $1 2>/dev/null
|
||||
.br
|
||||
;;
|
||||
.br
|
||||
@ -1087,7 +1098,7 @@ When an input pipe is used, a LESSCLOSE postprocessor can be used,
|
||||
but it is usually not necessary since there is no replacement file
|
||||
to clean up.
|
||||
In this case, the replacement file name passed to the LESSCLOSE
|
||||
postprocessor is "-".
|
||||
postprocessor is "\-".
|
||||
|
||||
.SH "NATIONAL CHARACTER SETS"
|
||||
There are three types of characters in the input file:
|
||||
@ -1131,6 +1142,8 @@ Selects a Russian character set.
|
||||
Selects a character set appropriate for NeXT computers.
|
||||
.IP utf-8
|
||||
Selects the UTF-8 encoding of the ISO 10646 character set.
|
||||
.IP windows
|
||||
Selects a character set appropriate for Microsoft Windows (cp 1251).
|
||||
.PP
|
||||
In special cases, it may be desired to tailor
|
||||
.I less
|
||||
@ -1173,7 +1186,8 @@ to each of the possible values for LESSCHARSET:
|
||||
next\ \ 8bcccbcc18b95.bb125.bb
|
||||
.PP
|
||||
If neither LESSCHARSET nor LESSCHARDEF is set,
|
||||
but the string "UTF-8" is found in the LC_ALL, LC_TYPE or LANG
|
||||
but any of the strings "UTF-8", "UTF8", "utf-8" or "utf8"
|
||||
is found in the LC_ALL, LC_TYPE or LANG
|
||||
environment variables, then the default character set is utf-8.
|
||||
.PP
|
||||
If that string is not found, but your system supports the
|
||||
@ -1205,10 +1219,28 @@ printf-style escape sequence (a % followed by x, X, o, d, etc.).
|
||||
For example, if LESSBINFMT is "*u[%x]", binary characters
|
||||
are displayed in underlined hexadecimal surrounded by brackets.
|
||||
The default if no LESSBINFMT is specified is "*s<%X>".
|
||||
The default if no LESSBINFMT is specified is "*s<%02X>".
|
||||
Warning: the result of expanding the character via LESSBINFMT must
|
||||
be less than 31 characters.
|
||||
.PP
|
||||
When the character set is utf-8, the LESSUTFBINFMT environment variable
|
||||
acts similarly to LESSBINFMT but it applies to Unicode code points
|
||||
that were successfully decoded but are unsuitable for display (e.g.,
|
||||
unassigned code points).
|
||||
Its default value is "<U+%04lX>".
|
||||
Note that LESSUTFBINFMT and LESSBINFMT share their display attribute
|
||||
setting ("*x") so specifying one will affect both;
|
||||
LESSUTFBINFMT is read after LESSBINFMT so its setting, if any,
|
||||
will have priority.
|
||||
Problematic octets in a UTF-8 file (octets of a truncated sequence,
|
||||
octets of a complete but non-shortest form sequence, illegal octets,
|
||||
and stray trailing octets)
|
||||
are displayed individually using LESSBINFMT so as to facilitate diagnostic
|
||||
of how the UTF-8 file is ill-formed.
|
||||
|
||||
.SH "PROMPTS"
|
||||
The -P option allows you to tailor the prompt to your preference.
|
||||
The string given to the -P option replaces the specified prompt string.
|
||||
The \-P option allows you to tailor the prompt to your preference.
|
||||
The string given to the \-P option replaces the specified prompt string.
|
||||
Certain characters in the string are interpreted specially.
|
||||
The prompt mechanism is rather complicated to provide flexibility,
|
||||
but the ordinary user need not understand the details of constructing
|
||||
@ -1225,7 +1257,7 @@ display is 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.
|
||||
and a "j" means use the "target" line, as specified by the \-j option.
|
||||
.IP "%B"
|
||||
Replaced by the size of the current input file.
|
||||
.IP "%c"
|
||||
@ -1350,7 +1382,7 @@ followed by the name of the next file, if there is one.
|
||||
Finally, any trailing spaces are truncated.
|
||||
This is the default prompt.
|
||||
For reference, here are the defaults for
|
||||
the other two prompts (-m and -M respectively).
|
||||
the other two prompts (\-m and \-M respectively).
|
||||
Each is broken into two lines here for readability only.
|
||||
.nf
|
||||
.sp
|
||||
@ -1398,11 +1430,11 @@ the pipe command
|
||||
the examine command.
|
||||
.IP "v"
|
||||
the editing command
|
||||
.IP "s -o"
|
||||
.IP "s \-o"
|
||||
log files
|
||||
.IP "-k"
|
||||
.IP "\-k"
|
||||
use of lesskey files
|
||||
.IP "-t"
|
||||
.IP "\-t"
|
||||
use of tags files
|
||||
.IP " "
|
||||
metacharacters in filenames, such as *
|
||||
@ -1447,8 +1479,12 @@ Options which are passed to
|
||||
.I less
|
||||
automatically.
|
||||
.IP LESSANSIENDCHARS
|
||||
Characters which are assumed to end an ANSI color escape sequence
|
||||
Characters which may end an ANSI color escape sequence
|
||||
(default "m").
|
||||
.IP LESSANSIMIDCHARS
|
||||
Characters which may appear between the ESC character and the
|
||||
end character in an ANSI color escape sequence
|
||||
(default "0123456789;[?!"'#%()*+\ ".
|
||||
.IP LESSBINFMT
|
||||
Format for displaying non-printable, non-control characters.
|
||||
.IP LESSCHARDEF
|
||||
@ -1465,10 +1501,21 @@ in filenames on Unix systems.
|
||||
Editor prototype string (used for the v command).
|
||||
See discussion under PROMPTS.
|
||||
.IP LESSGLOBALTAGS
|
||||
Name of the command used by the -t option to find global tags.
|
||||
Name of the command used by the \-t option to find global tags.
|
||||
Normally should be set to "global" if your system has the
|
||||
.I global
|
||||
(1) command. If not set, global tags are not used.
|
||||
.IP LESSHISTFILE
|
||||
Name of the history file used to remember search commands and
|
||||
shell commands between invocations of
|
||||
.I less.
|
||||
If set to "\-", a history file is not used.
|
||||
The default is "$HOME/.lesshst" on Unix systems, "$HOME/_lesshst" on
|
||||
DOS and Windows systems, or "$HOME/lesshst.ini" or "$INIT/lesshst.ini"
|
||||
on OS/2 systems.
|
||||
.IP LESSHISTSIZE
|
||||
The maximum number of commands to save in the history file.
|
||||
The default is 100.
|
||||
.IP LESSKEY
|
||||
Name of the default lesskey(1) file.
|
||||
.IP LESSKEY_SYSTEM
|
||||
@ -1487,6 +1534,8 @@ Runs less in "secure" mode.
|
||||
See discussion under SECURITY.
|
||||
.IP LESSSEPARATOR
|
||||
String to be appended to a directory name in filename completion.
|
||||
.IP LESSUTFBINFMT
|
||||
Format for displaying non-printable Unicode code points.
|
||||
.IP LINES
|
||||
Sets the number of lines on the screen.
|
||||
Takes precedence over the number of lines specified by the TERM variable.
|
||||
@ -1509,7 +1558,7 @@ The name of the editor (used for the v command).
|
||||
lesskey(1)
|
||||
|
||||
.SH WARNINGS
|
||||
The = command and prompts (unless changed by -P)
|
||||
The = command and prompts (unless changed by \-P)
|
||||
report the line numbers of the lines at the top and bottom of the screen,
|
||||
but the byte and percent of the line after the one at the bottom of the screen.
|
||||
.PP
|
||||
@ -1528,7 +1577,7 @@ 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.)
|
||||
.PP
|
||||
When viewing text containing ANSI color escape sequences using the -R option,
|
||||
When viewing text containing ANSI color escape sequences using the \-R option,
|
||||
searching will not find text containing an embedded escape sequence.
|
||||
Also, search highlighting may change the color of some of the text
|
||||
which follows the highlighted text.
|
||||
@ -1543,11 +1592,12 @@ to treat some binary files as ordinary, non-binary files.
|
||||
To workaround this problem, set the environment variable
|
||||
LESSCHARSET to "ascii" (or whatever character set is appropriate).
|
||||
.PP
|
||||
See http://www.greenwoodsoftware.com/less for the latest list of known bugs in this
|
||||
version of less.
|
||||
This manual is too long.
|
||||
.PP
|
||||
See http://www.greenwoodsoftware.com/less for the list of known bugs in all versions of less.
|
||||
|
||||
.SH COPYRIGHT
|
||||
Copyright (C) 2002 Mark Nudelman
|
||||
Copyright (C) 1984-2005 Mark Nudelman
|
||||
.PP
|
||||
less is part of the GNU project and is free software.
|
||||
You can redistribute it and/or modify it
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
#include "less.h"
|
||||
|
||||
static char *version = "$Revision: 1.9 $";
|
||||
static char *version = "$Revision: 1.10 $";
|
||||
|
||||
static int quote_all = 0;
|
||||
static char openquote = '"';
|
||||
|
49
contrib/less/lessecho.man
Normal file
49
contrib/less/lessecho.man
Normal file
@ -0,0 +1,49 @@
|
||||
LESSECHO(1) LESSECHO(1)
|
||||
|
||||
|
||||
|
||||
NNAAMMEE
|
||||
lessecho - expand metacharacters
|
||||
|
||||
SSYYNNOOPPSSIISS
|
||||
lleesssseecchhoo _[_-_o_x_] _[_-_c_x_] _[_-_p_n_] _[_-_d_n_] _[_-_m_x_] _[_-_n_n_] _[_-_e_x_] _[_-_a_] _f_i_l_e _._._.
|
||||
|
||||
DDEESSCCRRIIPPTTIIOONN
|
||||
_l_e_s_s_e_c_h_o is a program that simply echos its arguments on standard out-
|
||||
put. But any argument containing spaces is enclosed in quotes.
|
||||
|
||||
OOPPTTIIOONNSS
|
||||
A summary of options is included below.
|
||||
|
||||
--ooxx Specifies "x" to be the open quote character.
|
||||
|
||||
--ccxx Specifies "x" to be the close quote character.
|
||||
|
||||
--ppnn Specifies "n" to be the open quote character, as an integer.
|
||||
|
||||
--ddnn Specifies "n" to be the close quote character, as an integer.
|
||||
|
||||
--mmxx Specifies "x" to be a metachar.
|
||||
|
||||
--nnnn Specifies "n" to be a metachar, as an integer.
|
||||
|
||||
--eexx Specifies "x" to be the escape char for metachars.
|
||||
|
||||
--ffnn Specifies "n" to be the escape char for metachars, as an inte-
|
||||
ger.
|
||||
|
||||
--aa Specifies that all arguments are to be quoted. The default is
|
||||
that only arguments containing spaces are quoted.
|
||||
|
||||
SSEEEE AALLSSOO
|
||||
less(1)
|
||||
|
||||
AAUUTTHHOORR
|
||||
This manual page was written by Thomas Schoepf <schoepf@debian.org>,
|
||||
for the Debian GNU/Linux system (but may be used by others).
|
||||
|
||||
Send bug reports or comments to bug-less@gnu.org.
|
||||
|
||||
|
||||
|
||||
Version 394: 03 Dec 2005 LESSECHO(1)
|
47
contrib/less/lessecho.nro
Normal file
47
contrib/less/lessecho.nro
Normal file
@ -0,0 +1,47 @@
|
||||
.TH LESSECHO 1 "Version 394: 03 Dec 2005"
|
||||
.SH NAME
|
||||
lessecho \- expand metacharacters
|
||||
.SH SYNOPSIS
|
||||
.B lessecho
|
||||
.I "[-ox] [-cx] [-pn] [-dn] [-mx] [-nn] [-ex] [-a] file ..."
|
||||
.SH "DESCRIPTION"
|
||||
.I lessecho
|
||||
is a program that simply echos its arguments on standard output.
|
||||
But any argument containing spaces is enclosed in quotes.
|
||||
.SH OPTIONS
|
||||
A summary of options is included below.
|
||||
.TP
|
||||
.B \-ox
|
||||
Specifies "x" to be the open quote character.
|
||||
.TP
|
||||
.B \-cx
|
||||
Specifies "x" to be the close quote character.
|
||||
.TP
|
||||
.B \-pn
|
||||
Specifies "n" to be the open quote character, as an integer.
|
||||
.TP
|
||||
.B \-dn
|
||||
Specifies "n" to be the close quote character, as an integer.
|
||||
.TP
|
||||
.B \-mx
|
||||
Specifies "x" to be a metachar.
|
||||
.TP
|
||||
.B \-nn
|
||||
Specifies "n" to be a metachar, as an integer.
|
||||
.TP
|
||||
.B \-ex
|
||||
Specifies "x" to be the escape char for metachars.
|
||||
.TP
|
||||
.B \-fn
|
||||
Specifies "n" to be the escape char for metachars, as an integer.
|
||||
.TP
|
||||
.B \-a
|
||||
Specifies that all arguments are to be quoted.
|
||||
The default is that only arguments containing spaces are quoted.
|
||||
.SH "SEE ALSO"
|
||||
less(1)
|
||||
.SH AUTHOR
|
||||
This manual page was written by Thomas Schoepf <schoepf@debian.org>,
|
||||
for the Debian GNU/Linux system (but may be used by others).
|
||||
.PP
|
||||
Send bug reports or comments to bug-less@gnu.org.
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,9 +1,7 @@
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
|
||||
NNAAMMEE
|
||||
lesskey - specify key bindings for less
|
||||
|
||||
@ -14,33 +12,29 @@ SSYYNNOOPPSSIISS
|
||||
lleesssskkeeyy ----vveerrssiioonn
|
||||
|
||||
DDEESSCCRRIIPPTTIIOONN
|
||||
_L_e_s_s_k_e_y is used to specify a set of key bindings to be
|
||||
used by _l_e_s_s_. The input file is a text file which
|
||||
describes the key bindings, If the input file is "-",
|
||||
standard input is read. If no input file is specified, a
|
||||
standard filename is used as the name of the input file,
|
||||
which depends on the system being used: On Unix systems,
|
||||
$HOME/.lesskey is used; on MS-DOS systems, $HOME/_lesskey
|
||||
is used; and on OS/2 systems $HOME/lesskey.ini is used, or
|
||||
$INIT/lesskey.ini if $HOME is undefined. The output file
|
||||
is a binary file which is used by _l_e_s_s_. If no output file
|
||||
is specified, and the environment variable LESSKEY is set,
|
||||
the value of LESSKEY is used as the name of the output
|
||||
file. Otherwise, a standard filename is used as the name
|
||||
of the output file, which depends on the system being
|
||||
used: On Unix and OS-9 systems, $HOME/.less is used; on
|
||||
MS-DOS systems, $HOME/_less is used; and on OS/2 systems,
|
||||
$HOME/less.ini is used, or $INIT/less.ini if $HOME is
|
||||
undefined. If the output file already exists, _l_e_s_s_k_e_y
|
||||
will overwrite it.
|
||||
_L_e_s_s_k_e_y is used to specify a set of key bindings to be used by _l_e_s_s_.
|
||||
The input file is a text file which describes the key bindings, If the
|
||||
input file is "-", standard input is read. If no input file is speci-
|
||||
fied, a standard filename is used as the name of the input file, which
|
||||
depends on the system being used: On Unix systems, $HOME/.lesskey is
|
||||
used; on MS-DOS systems, $HOME/_lesskey is used; and on OS/2 systems
|
||||
$HOME/lesskey.ini is used, or $INIT/lesskey.ini if $HOME is undefined.
|
||||
The output file is a binary file which is used by _l_e_s_s_. If no output
|
||||
file is specified, and the environment variable LESSKEY is set, the
|
||||
value of LESSKEY is used as the name of the output file. Otherwise, a
|
||||
standard filename is used as the name of the output file, which depends
|
||||
on the system being used: On Unix and OS-9 systems, $HOME/.less is
|
||||
used; on MS-DOS systems, $HOME/_less is used; and on OS/2 systems,
|
||||
$HOME/less.ini is used, or $INIT/less.ini if $HOME is undefined. If
|
||||
the output file already exists, _l_e_s_s_k_e_y will overwrite it.
|
||||
|
||||
The -V or --version option causes _l_e_s_s_k_e_y to print its
|
||||
version number and immediately exit. If -V or --version
|
||||
is present, other options and arguments are ignored.
|
||||
The -V or --version option causes _l_e_s_s_k_e_y to print its version number
|
||||
and immediately exit. If -V or --version is present, other options and
|
||||
arguments are ignored.
|
||||
|
||||
The input file consists of one or more _s_e_c_t_i_o_n_s_. Each
|
||||
section starts with a line that identifies the type of
|
||||
section. Possible sections are:
|
||||
The input file consists of one or more _s_e_c_t_i_o_n_s_. Each section starts
|
||||
with a line that identifies the type of section. Possible sections
|
||||
are:
|
||||
|
||||
#command
|
||||
Defines new command keys.
|
||||
@ -50,8 +44,8 @@ DDEESSCCRRIIPPTTIIOONN
|
||||
|
||||
#env Defines environment variables.
|
||||
|
||||
Blank lines and lines which start with a pound sign (#)
|
||||
are ignored, except for the special section header lines.
|
||||
Blank lines and lines which start with a pound sign (#) are ignored,
|
||||
except for the special section header lines.
|
||||
|
||||
|
||||
CCOOMMMMAANNDD SSEECCTTIIOONN
|
||||
@ -59,33 +53,19 @@ CCOOMMMMAANNDD SSEECCTTIIOONN
|
||||
|
||||
#command
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
If the command section is the first section in the file,
|
||||
this line may be omitted. The command section consists of
|
||||
lines of the form:
|
||||
If the command section is the first section in the file, this line may
|
||||
be omitted. The command section consists of lines of the form:
|
||||
|
||||
_s_t_r_i_n_g <whitespace> _a_c_t_i_o_n [extra-string] <newline>
|
||||
|
||||
Whitespace is any sequence of one or more spaces and/or
|
||||
tabs. The _s_t_r_i_n_g is the command key(s) which invoke the
|
||||
action. The _s_t_r_i_n_g may be a single command key, or a
|
||||
sequence of up to 15 keys. The _a_c_t_i_o_n is the name of the
|
||||
less action, from the list below. The characters in the
|
||||
_s_t_r_i_n_g may appear literally, or be prefixed by a caret to
|
||||
indicate a control key. A backslash followed by one to
|
||||
three octal digits may be used to specify a character by
|
||||
its octal value. A backslash followed by certain charac
|
||||
ters specifies input characters as follows:
|
||||
Whitespace is any sequence of one or more spaces and/or tabs. The
|
||||
_s_t_r_i_n_g is the command key(s) which invoke the action. The _s_t_r_i_n_g may
|
||||
be a single command key, or a sequence of up to 15 keys. The _a_c_t_i_o_n is
|
||||
the name of the less action, from the list below. The characters in
|
||||
the _s_t_r_i_n_g may appear literally, or be prefixed by a caret to indicate
|
||||
a control key. A backslash followed by one to three octal digits may
|
||||
be used to specify a character by its octal value. A backslash fol-
|
||||
lowed by certain characters specifies input characters as follows:
|
||||
|
||||
\b BACKSPACE
|
||||
|
||||
@ -115,37 +95,22 @@ LESSKEY(1) LESSKEY(1)
|
||||
|
||||
\kx DELETE
|
||||
|
||||
A backslash followed by any other character indicates that
|
||||
character is to be taken literally. Characters which must
|
||||
be preceded by backslash include caret, space, tab and the
|
||||
backslash itself.
|
||||
A backslash followed by any other character indicates that character is
|
||||
to be taken literally. Characters which must be preceded by backslash
|
||||
include caret, space, tab and the backslash itself.
|
||||
|
||||
An action may be followed by an "extra" string. When such
|
||||
a command is entered while running _l_e_s_s_, the action is
|
||||
performed, and then the extra string is parsed, just as if
|
||||
it were typed in to _l_e_s_s_. This feature can be used in
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
certain cases to extend the functionality of a command.
|
||||
For example, see the "{" and ":t" commands in the example
|
||||
below. The extra string has a special meaning for the
|
||||
"quit" action: when _l_e_s_s quits, first character of the
|
||||
extra string is used as its exit status.
|
||||
An action may be followed by an "extra" string. When such a command is
|
||||
entered while running _l_e_s_s_, the action is performed, and then the extra
|
||||
string is parsed, just as if it were typed in to _l_e_s_s_. This feature
|
||||
can be used in certain cases to extend the functionality of a command.
|
||||
For example, see the "{" and ":t" commands in the example below. The
|
||||
extra string has a special meaning for the "quit" action: when _l_e_s_s
|
||||
quits, first character of the extra string is used as its exit status.
|
||||
|
||||
|
||||
EEXXAAMMPPLLEE
|
||||
The following input file describes the set of default com
|
||||
mand keys used by less:
|
||||
The following input file describes the set of default command keys used
|
||||
by less:
|
||||
|
||||
#command
|
||||
\r forw-line
|
||||
@ -190,18 +155,6 @@ EEXXAAMMPPLLEE
|
||||
< goto-line
|
||||
\e< goto-line
|
||||
p percent
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
% percent
|
||||
\e[ left-scroll
|
||||
\e] right-scroll
|
||||
@ -256,18 +209,6 @@ LESSKEY(1) LESSKEY(1)
|
||||
0 digit
|
||||
1 digit
|
||||
2 digit
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
3 digit
|
||||
4 digit
|
||||
5 digit
|
||||
@ -283,27 +224,23 @@ LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
PPRREECCEEDDEENNCCEE
|
||||
Commands specified by _l_e_s_s_k_e_y take precedence over the
|
||||
default commands. A default command key may be disabled
|
||||
by including it in the input file with the action
|
||||
"invalid". Alternatively, a key may be defined to do
|
||||
nothing by using the action "noaction". "noaction" is
|
||||
similar to "invalid", but _l_e_s_s will give an error beep for
|
||||
an "invalid" command, but not for a "noaction" command.
|
||||
In addition, ALL default commands may be disabled by
|
||||
adding this control line to the input file:
|
||||
Commands specified by _l_e_s_s_k_e_y take precedence over the default com-
|
||||
mands. A default command key may be disabled by including it in the
|
||||
input file with the action "invalid". Alternatively, a key may be
|
||||
defined to do nothing by using the action "noaction". "noaction" is
|
||||
similar to "invalid", but _l_e_s_s will give an error beep for an "invalid"
|
||||
command, but not for a "noaction" command. In addition, ALL default
|
||||
commands may be disabled by adding this control line to the input file:
|
||||
|
||||
#stop
|
||||
|
||||
This will cause all default commands to be ignored. The
|
||||
#stop line should be the last line in that section of the
|
||||
file.
|
||||
This will cause all default commands to be ignored. The #stop line
|
||||
should be the last line in that section of the file.
|
||||
|
||||
Be aware that #stop can be dangerous. Since all default
|
||||
commands are disabled, you must provide sufficient com
|
||||
mands before the #stop line to enable all necessary
|
||||
actions. For example, failure to provide a "quit" command
|
||||
can lead to frustration.
|
||||
Be aware that #stop can be dangerous. Since all default commands are
|
||||
disabled, you must provide sufficient commands before the #stop line to
|
||||
enable all necessary actions. For example, failure to provide a "quit"
|
||||
command can lead to frustration.
|
||||
|
||||
|
||||
LLIINNEE EEDDIITTIINNGG SSEECCTTIIOONN
|
||||
@ -311,28 +248,15 @@ LLIINNEE EEDDIITTIINNGG SSEECCTTIIOONN
|
||||
|
||||
#line-edit
|
||||
|
||||
This section specifies new key bindings for the line edit
|
||||
ing commands, in a manner similar to the way key bindings
|
||||
for ordinary commands are specified in the #command sec
|
||||
tion. The line-editing section consists of a list of keys
|
||||
and actions, one per line as in the example below.
|
||||
This section specifies new key bindings for the line editing commands,
|
||||
in a manner similar to the way key bindings for ordinary commands are
|
||||
specified in the #command section. The line-editing section consists
|
||||
of a list of keys and actions, one per line as in the example below.
|
||||
|
||||
|
||||
EEXXAAMMPPLLEE
|
||||
The following input file describes the set of default
|
||||
line-editing keys used by less:
|
||||
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 5
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
The following input file describes the set of default line-editing keys
|
||||
used by less:
|
||||
|
||||
#line-edit
|
||||
\t forw-complete
|
||||
@ -370,35 +294,21 @@ LLEESSSS EENNVVIIRROONNMMEENNTT VVAARRIIAABBLLEESS
|
||||
|
||||
#env
|
||||
|
||||
Following this line is a list of environment variable
|
||||
assignments. Each line consists of an environment vari
|
||||
able name, an equals sign (=) and the value to be assigned
|
||||
to the environment variable. White space before and after
|
||||
the equals sign is ignored. Variables assigned in this
|
||||
way are visible only to _l_e_s_s_. If a variable is specified
|
||||
in the system environment and also in a lesskey file, the
|
||||
value in the lesskey file takes precedence. Although the
|
||||
lesskey file can be used to override variables set in the
|
||||
environment, the main purpose of assigning variables in
|
||||
the lesskey file is simply to have all _l_e_s_s configuration
|
||||
Following this line is a list of environment variable assignments.
|
||||
Each line consists of an environment variable name, an equals sign (=)
|
||||
and the value to be assigned to the environment variable. White space
|
||||
before and after the equals sign is ignored. Variables assigned in
|
||||
this way are visible only to _l_e_s_s_. If a variable is specified in the
|
||||
system environment and also in a lesskey file, the value in the lesskey
|
||||
file takes precedence. Although the lesskey file can be used to over-
|
||||
ride variables set in the environment, the main purpose of assigning
|
||||
variables in the lesskey file is simply to have all _l_e_s_s configuration
|
||||
information stored in one file.
|
||||
|
||||
|
||||
EEXXAAMMPPLLEE
|
||||
The following input file sets the -i option whenever _l_e_s_s
|
||||
is run, and specifies the character set to be "latin1":
|
||||
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 6
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LESSKEY(1) LESSKEY(1)
|
||||
|
||||
The following input file sets the -i option whenever _l_e_s_s is run, and
|
||||
specifies the character set to be "latin1":
|
||||
|
||||
#env
|
||||
LESS = -i
|
||||
@ -411,52 +321,40 @@ SSEEEE AALLSSOO
|
||||
|
||||
|
||||
WWAARRNNIINNGGSS
|
||||
It is not possible to specify special keys, such as upar
|
||||
row, in a keyboard-independent manner. The only way to
|
||||
specify such keys is to specify the escape sequence which
|
||||
a particular keyboard sends when such a key is pressed.
|
||||
It is not possible to specify special keys, such as uparrow, in a key-
|
||||
board-independent manner. The only way to specify such keys is to
|
||||
specify the escape sequence which a particular keyboard sends when such
|
||||
a key is pressed.
|
||||
|
||||
On MS-DOS and OS/2 systems, certain keys send a sequence
|
||||
of characters which start with a NUL character (0). This
|
||||
NUL character should be represented as \340 in a lesskey
|
||||
file.
|
||||
On MS-DOS and OS/2 systems, certain keys send a sequence of characters
|
||||
which start with a NUL character (0). This NUL character should be
|
||||
represented as \340 in a lesskey file.
|
||||
|
||||
|
||||
CCOOPPYYRRIIGGHHTT
|
||||
Copyright (C) 2000 Mark Nudelman
|
||||
Copyright (C) 2004 Mark Nudelman
|
||||
|
||||
lesskey is part of the GNU project and is free software;
|
||||
you can redistribute it and/or modify it under the terms
|
||||
of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
lesskey is part of the GNU project and is free software; you can redis-
|
||||
tribute it and/or modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either version 2,
|
||||
or (at your option) any later version.
|
||||
|
||||
lesskey is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied war
|
||||
ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PUR
|
||||
POSE. See the GNU General Public License for more
|
||||
details.
|
||||
lesskey is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with lesskey; see the file COPYING. If not,
|
||||
write to the Free Software Foundation, 59 Temple Place,
|
||||
Suite 330, Boston, MA 02111-1307, USA.
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with lesskey; see the file COPYING. If not, write to the Free Software
|
||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
|
||||
AAUUTTHHOORR
|
||||
Mark Nudelman <markn@greenwoodsoftware.com>
|
||||
Send bug reports or comments to the above address or to
|
||||
bug-less@gnu.org.
|
||||
Send bug reports or comments to the above address or to bug-
|
||||
less@gnu.org.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Version 381: 17 Jan 2003 7
|
||||
|
||||
|
||||
Version 394: 03 Dec 2005 LESSKEY(1)
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH LESSKEY 1 "Version 381: 17 Jan 2003"
|
||||
.TH LESSKEY 1 "Version 394: 03 Dec 2005"
|
||||
.SH NAME
|
||||
lesskey \- specify key bindings for less
|
||||
.SH SYNOPSIS
|
||||
@ -358,7 +358,7 @@ which start with a NUL character (0).
|
||||
This NUL character should be represented as \e340 in a lesskey file.
|
||||
|
||||
.SH COPYRIGHT
|
||||
Copyright (C) 2000 Mark Nudelman
|
||||
Copyright (C) 2004 Mark Nudelman
|
||||
.PP
|
||||
lesskey is part of the GNU project and is free software;
|
||||
you can redistribute it and/or modify it
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -133,9 +133,9 @@ lsystem(cmd, donemsg)
|
||||
char *esccmd = shell_quote(cmd);
|
||||
if (esccmd != NULL)
|
||||
{
|
||||
p = (char *) ecalloc(strlen(shell) +
|
||||
strlen(esccmd) + 5, sizeof(char));
|
||||
sprintf(p, "%s %s %s", shell, shell_coption(), esccmd);
|
||||
int len = strlen(shell) + strlen(esccmd) + 5;
|
||||
p = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF3(p, len, "%s %s %s", shell, shell_coption(), esccmd);
|
||||
free(esccmd);
|
||||
}
|
||||
}
|
||||
@ -367,143 +367,3 @@ pipe_data(cmd, spos, epos)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _OSK
|
||||
/*
|
||||
* Popen, and Pclose, for OS-9.
|
||||
*
|
||||
* Based on code copyright (c) 1988 by Wolfgang Ocker, Puchheim,
|
||||
* Ulli Dessauer, Germering and
|
||||
* Reimer Mellin, Muenchen
|
||||
* (W-Germany)
|
||||
*
|
||||
* These functions can be copied and distributed freely for any
|
||||
* non-commercial purposes. It can only be incorporated into
|
||||
* commercial software with the written permission of the authors.
|
||||
*
|
||||
* TOP-specific code stripped out and adapted for less by M.Gregorie, 1996
|
||||
*
|
||||
* address: Wolfgang Ocker
|
||||
* Lochhauserstrasse 35a
|
||||
* D-8039 Puchheim
|
||||
* West Germany
|
||||
*
|
||||
* e-mail: weo@altger.UUCP, ud@altger.UUCP, ram@altger.UUCP
|
||||
* pyramid!tmpmbx!recco!weo
|
||||
* pyramid!tmpmbx!nitmar!ud
|
||||
* pyramid!tmpmbx!ramsys!ram
|
||||
*
|
||||
* Martin Gregorie
|
||||
* 10 Sadlers Mead
|
||||
* Harlow
|
||||
* Essex, CM18 6HG
|
||||
* U.K.
|
||||
*
|
||||
* gregorie@logica.com
|
||||
*/
|
||||
#include <strings.h>
|
||||
#include <errno.h>
|
||||
extern char **environ;
|
||||
extern char *getenv();
|
||||
extern int os9forkc();
|
||||
static int pids[_NFILE] = { 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
/*
|
||||
* p o p e n
|
||||
*/
|
||||
FILE *popen(name, mode)
|
||||
char *name;
|
||||
char *mode;
|
||||
{
|
||||
int fd, fd2, fdsav, pid;
|
||||
static char *argv[] = {NULL, NULL, NULL };
|
||||
static char cmd[200];
|
||||
static char cmd_path[200];
|
||||
char *cp;
|
||||
char *shell;
|
||||
FILE *r;
|
||||
if ((shell = getenv("SHELL")) == NULL)
|
||||
return(NULL);
|
||||
cp = name;
|
||||
while (*cp == ' ')
|
||||
cp++;
|
||||
strcpy(cmd_path, cp);
|
||||
if (cp = index(cmd_path, ' '))
|
||||
*cp++ = '\0';
|
||||
strcpy(cmd, "ex ");
|
||||
strcat(cmd, cmd_path);
|
||||
if (cp)
|
||||
{
|
||||
strcat(cmd, " ");
|
||||
strcat(cmd, cp);
|
||||
}
|
||||
argv[0] = shell;
|
||||
argv[1] = cmd;
|
||||
/*
|
||||
mode is "r" (stdout) or "w" (stdin)
|
||||
*/
|
||||
switch(mode[0])
|
||||
{
|
||||
case 'w': fd = 0;
|
||||
break;
|
||||
case 'r': fd = 1;
|
||||
break;
|
||||
default: return(NULL);
|
||||
}
|
||||
if (fd == 1)
|
||||
fflush(stdout);
|
||||
fdsav = dup(fd);
|
||||
close(fd);
|
||||
|
||||
creat("/pipe", S_IWRITE+S_IREAD);
|
||||
pid = os9exec(os9forkc, argv[0], argv, environ, 0, 0, 3);
|
||||
fd2 = dup(fd);
|
||||
close(fd);
|
||||
dup(fdsav);
|
||||
close(fdsav);
|
||||
if (pid > 0)
|
||||
{
|
||||
pids[fd2] = pid;
|
||||
r = fdopen(fd2, mode);
|
||||
}
|
||||
else
|
||||
{
|
||||
close(fd2);
|
||||
r = NULL;
|
||||
}
|
||||
return(r);
|
||||
}
|
||||
|
||||
/*
|
||||
* p c l o s e
|
||||
*/
|
||||
int pclose(fp)
|
||||
FILE *fp;
|
||||
{
|
||||
unsigned int status;
|
||||
int pid;
|
||||
int fd,
|
||||
i;
|
||||
fd = fileno(fp);
|
||||
if (pids[fd] == 0)
|
||||
return(-1);
|
||||
fflush(fp);
|
||||
fclose(fp);
|
||||
while ((pid = wait(&status)) != -1)
|
||||
if (pid == pids[fd])
|
||||
break;
|
||||
else
|
||||
for (i = 0; i < _NFILE; i++)
|
||||
if (pids[i] == pid)
|
||||
{
|
||||
pids[i] = 0;
|
||||
break;
|
||||
}
|
||||
if (pid == -1)
|
||||
status = -1;
|
||||
pids[fd] = 0;
|
||||
return(status);
|
||||
}
|
||||
#endif /* _OSK */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -114,6 +114,7 @@ main(argc, argv)
|
||||
init_prompt();
|
||||
init_charset();
|
||||
init_line();
|
||||
init_cmdhist();
|
||||
init_option();
|
||||
s = lgetenv("LESS");
|
||||
if (s != NULL)
|
||||
@ -335,14 +336,14 @@ sprefix(ps, s, uppercase)
|
||||
c = *ps;
|
||||
if (uppercase)
|
||||
{
|
||||
if (len == 0 && SIMPLE_IS_LOWER(c))
|
||||
if (len == 0 && ASCII_IS_LOWER(c))
|
||||
return (-1);
|
||||
if (SIMPLE_IS_UPPER(c))
|
||||
c = SIMPLE_TO_LOWER(c);
|
||||
if (ASCII_IS_UPPER(c))
|
||||
c = ASCII_TO_LOWER(c);
|
||||
}
|
||||
sc = *s;
|
||||
if (len > 0 && SIMPLE_IS_UPPER(sc))
|
||||
sc = SIMPLE_TO_LOWER(sc);
|
||||
if (len > 0 && ASCII_IS_UPPER(sc))
|
||||
sc = ASCII_TO_LOWER(sc);
|
||||
if (c != sc)
|
||||
break;
|
||||
len++;
|
||||
@ -369,6 +370,7 @@ quit(status)
|
||||
save_status = status;
|
||||
quitting = 1;
|
||||
edit((char*)NULL);
|
||||
save_cmdhist();
|
||||
if (any_display && is_tty)
|
||||
clear_bot();
|
||||
deinit();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -37,6 +37,7 @@ extern int sc_height;
|
||||
extern int secure;
|
||||
extern int dohelp;
|
||||
extern int any_display;
|
||||
extern int less_is_more;
|
||||
extern char openquote;
|
||||
extern char closequote;
|
||||
extern char *prproto[];
|
||||
@ -201,10 +202,13 @@ opt_t(type, s)
|
||||
}
|
||||
findtag(skipsp(s));
|
||||
save_ifile = save_curr_ifile();
|
||||
if (edit_tagfile())
|
||||
break;
|
||||
if ((pos = tagsearch()) == NULL_POSITION)
|
||||
/*
|
||||
* Try to open the file containing the tag
|
||||
* and search for the tag in that file.
|
||||
*/
|
||||
if (edit_tagfile() || (pos = tagsearch()) == NULL_POSITION)
|
||||
{
|
||||
/* Failed: reopen the old file. */
|
||||
reedit_ifile(save_ifile);
|
||||
break;
|
||||
}
|
||||
@ -259,6 +263,11 @@ opt_p(type, s)
|
||||
*/
|
||||
plusoption = TRUE;
|
||||
ungetsc(s);
|
||||
/*
|
||||
* In "more" mode, the -p argument is a command,
|
||||
* not a search string, so we don't need a slash.
|
||||
*/
|
||||
if (!less_is_more);
|
||||
ungetsc("/");
|
||||
break;
|
||||
}
|
||||
@ -367,7 +376,7 @@ opt__V(type, s)
|
||||
any_display = 1;
|
||||
putstr("less ");
|
||||
putstr(version);
|
||||
putstr("\nCopyright (C) 2002 Mark Nudelman\n\n");
|
||||
putstr("\nCopyright (C) 1984-2005 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");
|
||||
@ -450,8 +459,8 @@ opt_D(type, s)
|
||||
}
|
||||
if (type == TOGGLE)
|
||||
{
|
||||
so_enter();
|
||||
so_exit();
|
||||
at_enter(AT_STANDOUT);
|
||||
at_exit();
|
||||
}
|
||||
break;
|
||||
case QUERY:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -142,12 +142,12 @@ scan_option(s)
|
||||
if (optname == NULL)
|
||||
{
|
||||
printopt = propt(optc);
|
||||
lc = SIMPLE_IS_LOWER(optc);
|
||||
lc = ASCII_IS_LOWER(optc);
|
||||
o = findopt(optc);
|
||||
} else
|
||||
{
|
||||
printopt = optname;
|
||||
lc = SIMPLE_IS_LOWER(optname[0]);
|
||||
lc = ASCII_IS_LOWER(optname[0]);
|
||||
o = findopt_name(&optname, NULL, &err);
|
||||
s = optname;
|
||||
optname = NULL;
|
||||
@ -350,14 +350,14 @@ toggle_option(c, s, how_toggle)
|
||||
{
|
||||
case OPT_TOGGLE:
|
||||
*(o->ovar) = flip_triple(*(o->ovar),
|
||||
islower(c));
|
||||
ASCII_IS_LOWER(c));
|
||||
break;
|
||||
case OPT_UNSET:
|
||||
*(o->ovar) = o->odefault;
|
||||
break;
|
||||
case OPT_SET:
|
||||
*(o->ovar) = flip_triple(o->odefault,
|
||||
islower(c));
|
||||
ASCII_IS_LOWER(c));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -48,10 +48,13 @@ public int show_attn; /* Hilite first unread line */
|
||||
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 */
|
||||
#if HILITE_SEARCH
|
||||
public int hilite_search; /* Highlight matched search patterns? */
|
||||
#endif
|
||||
|
||||
public int less_is_more = 0; /* Make compatible with POSIX more */
|
||||
|
||||
/*
|
||||
* Long option names.
|
||||
*/
|
||||
@ -76,6 +79,7 @@ static struct optname J__optname = { "status-column", NULL };
|
||||
#if USERFILE
|
||||
static struct optname k_optname = { "lesskey-file", NULL };
|
||||
#endif
|
||||
static struct optname K__optname = { "quit-on-intr", NULL };
|
||||
static struct optname L__optname = { "no-lessopen", NULL };
|
||||
static struct optname m_optname = { "long-prompt", NULL };
|
||||
static struct optname n_optname = { "line-numbers", NULL };
|
||||
@ -245,6 +249,14 @@ static struct loption option[] =
|
||||
{ NULL, NULL, NULL }
|
||||
},
|
||||
#endif
|
||||
{ 'K', &K__optname,
|
||||
BOOL, OPT_OFF, &quit_on_intr, NULL,
|
||||
{
|
||||
"Interrupt (ctrl-C) returns to prompt",
|
||||
"Interrupt (ctrl-C) exits less",
|
||||
NULL
|
||||
}
|
||||
},
|
||||
{ 'l', NULL,
|
||||
STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_l,
|
||||
{ NULL, NULL, NULL }
|
||||
@ -428,6 +440,11 @@ static struct loption option[] =
|
||||
init_option()
|
||||
{
|
||||
register struct loption *o;
|
||||
char *p;
|
||||
|
||||
p = lgetenv("LESS_IS_MORE");
|
||||
if (p != NULL && *p != '\0')
|
||||
less_is_more = 1;
|
||||
|
||||
for (o = option; o->oletter != '\0'; o++)
|
||||
{
|
||||
@ -454,7 +471,7 @@ findopt(c)
|
||||
{
|
||||
if (o->oletter == c)
|
||||
return (o);
|
||||
if ((o->otype & TRIPLE) && toupper(o->oletter) == c)
|
||||
if ((o->otype & TRIPLE) && ASCII_TO_UPPER(o->oletter) == c)
|
||||
return (o);
|
||||
}
|
||||
return (NULL);
|
||||
@ -467,9 +484,9 @@ findopt(c)
|
||||
is_optchar(c)
|
||||
char c;
|
||||
{
|
||||
if (SIMPLE_IS_UPPER(c))
|
||||
if (ASCII_IS_UPPER(c))
|
||||
return 1;
|
||||
if (SIMPLE_IS_LOWER(c))
|
||||
if (ASCII_IS_LOWER(c))
|
||||
return 1;
|
||||
if (c == '-')
|
||||
return 1;
|
||||
@ -498,7 +515,6 @@ findopt_name(p_optname, p_oname, p_err)
|
||||
int maxlen = 0;
|
||||
int ambig = 0;
|
||||
int exact = 0;
|
||||
char *eq;
|
||||
|
||||
/*
|
||||
* Check all options.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -216,6 +216,7 @@ errno_message(filename)
|
||||
{
|
||||
register char *p;
|
||||
register char *m;
|
||||
int len;
|
||||
#if HAVE_ERRNO
|
||||
#if MUST_DEFINE_ERRNO
|
||||
extern int errno;
|
||||
@ -224,8 +225,9 @@ errno_message(filename)
|
||||
#else
|
||||
p = "cannot open";
|
||||
#endif
|
||||
m = (char *) ecalloc(strlen(filename) + strlen(p) + 3, sizeof(char));
|
||||
sprintf(m, "%s: %s", filename, p);
|
||||
len = strlen(filename) + strlen(p) + 3;
|
||||
m = (char *) ecalloc(len, sizeof(char));
|
||||
SNPRINTF2(m, len, "%s: %s", filename, p);
|
||||
return (m);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -47,7 +47,6 @@ put_line()
|
||||
register int c;
|
||||
register int i;
|
||||
int a;
|
||||
int curr_attr;
|
||||
|
||||
if (ABORT_SIGS())
|
||||
{
|
||||
@ -58,49 +57,19 @@ put_line()
|
||||
return;
|
||||
}
|
||||
|
||||
curr_attr = AT_NORMAL;
|
||||
final_attr = AT_NORMAL;
|
||||
|
||||
for (i = 0; (c = gline(i, &a)) != '\0'; i++)
|
||||
{
|
||||
if (a != curr_attr)
|
||||
{
|
||||
/*
|
||||
* Changing attributes.
|
||||
* Display the exit sequence for the old attribute
|
||||
* and the enter sequence for the new one.
|
||||
*/
|
||||
switch (curr_attr)
|
||||
{
|
||||
case AT_UNDERLINE: ul_exit(); break;
|
||||
case AT_BOLD: bo_exit(); break;
|
||||
case AT_BLINK: bl_exit(); break;
|
||||
case AT_STANDOUT: so_exit(); break;
|
||||
}
|
||||
switch (a)
|
||||
{
|
||||
case AT_UNDERLINE: ul_enter(); break;
|
||||
case AT_BOLD: bo_enter(); break;
|
||||
case AT_BLINK: bl_enter(); break;
|
||||
case AT_STANDOUT: so_enter(); break;
|
||||
}
|
||||
curr_attr = a;
|
||||
}
|
||||
if (curr_attr == AT_INVIS)
|
||||
continue;
|
||||
at_switch(a);
|
||||
final_attr = a;
|
||||
if (c == '\b')
|
||||
putbs();
|
||||
else
|
||||
putchr(c);
|
||||
}
|
||||
|
||||
switch (curr_attr)
|
||||
{
|
||||
case AT_UNDERLINE: ul_exit(); break;
|
||||
case AT_BOLD: bo_exit(); break;
|
||||
case AT_BLINK: bl_exit(); break;
|
||||
case AT_STANDOUT: so_exit(); break;
|
||||
}
|
||||
final_attr = curr_attr;
|
||||
at_exit();
|
||||
}
|
||||
|
||||
static char obuf[OUTBUF_SIZE];
|
||||
@ -360,6 +329,25 @@ flush()
|
||||
putchr(c)
|
||||
int c;
|
||||
{
|
||||
#if 0 /* fake UTF-8 output for testing */
|
||||
extern int utf_mode;
|
||||
if (utf_mode)
|
||||
{
|
||||
static char ubuf[MAX_UTF_CHAR_LEN];
|
||||
static int ubuf_len = 0;
|
||||
static int ubuf_index = 0;
|
||||
if (ubuf_len == 0)
|
||||
{
|
||||
ubuf_len = utf_len(c);
|
||||
ubuf_index = 0;
|
||||
}
|
||||
ubuf[ubuf_index++] = c;
|
||||
if (ubuf_index < ubuf_len)
|
||||
return c;
|
||||
c = get_wchar(ubuf) & 0xFF;
|
||||
ubuf_len = 0;
|
||||
}
|
||||
#endif
|
||||
if (need_clr)
|
||||
{
|
||||
need_clr = 0;
|
||||
@ -534,8 +522,9 @@ error(fmt, parg)
|
||||
|
||||
if (any_display && is_tty)
|
||||
{
|
||||
at_exit();
|
||||
clear_bot();
|
||||
so_enter();
|
||||
at_enter(AT_STANDOUT);
|
||||
col += so_s_width;
|
||||
}
|
||||
|
||||
@ -548,7 +537,7 @@ error(fmt, parg)
|
||||
}
|
||||
|
||||
putstr(return_to_continue);
|
||||
so_exit();
|
||||
at_exit();
|
||||
col += sizeof(return_to_continue) + so_e_width;
|
||||
|
||||
get_return();
|
||||
@ -578,11 +567,12 @@ ierror(fmt, parg)
|
||||
char *fmt;
|
||||
PARG *parg;
|
||||
{
|
||||
at_exit();
|
||||
clear_bot();
|
||||
so_enter();
|
||||
at_enter(AT_STANDOUT);
|
||||
(void) less_printf(fmt, parg);
|
||||
putstr(intr_to_abort);
|
||||
so_exit();
|
||||
at_exit();
|
||||
flush();
|
||||
need_clr = 1;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -164,7 +164,7 @@ curr_byte(where)
|
||||
POSITION pos;
|
||||
|
||||
pos = position(where);
|
||||
while (pos == NULL_POSITION && where >= 0 && where < sc_height)
|
||||
while (pos == NULL_POSITION && where >= 0 && where < sc_height-1)
|
||||
pos = position(++where);
|
||||
if (pos == NULL_POSITION)
|
||||
pos = ch_length();
|
||||
@ -200,7 +200,7 @@ cond(c, where)
|
||||
case 'd': /* Same as l */
|
||||
return (linenums);
|
||||
case 'L': /* Final line number known? */
|
||||
case 'D': /* Same as L */
|
||||
case 'D': /* Final page number known? */
|
||||
return (linenums && ch_length() != NULL_POSITION);
|
||||
case 'm': /* More than one file? */
|
||||
#if TAGS
|
||||
@ -254,6 +254,9 @@ protochar(c, where, iseditproto)
|
||||
LINENUM last_linenum;
|
||||
IFILE h;
|
||||
|
||||
#undef PAGE_NUM
|
||||
#define PAGE_NUM(linenum) ((((linenum) - 1) / (sc_height - 1)) + 1)
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'b': /* Current byte offset */
|
||||
@ -269,17 +272,26 @@ protochar(c, where, iseditproto)
|
||||
case 'd': /* Current page number */
|
||||
linenum = currline(where);
|
||||
if (linenum > 0 && sc_height > 1)
|
||||
ap_linenum(((linenum - 1) / (sc_height - 1)) + 1);
|
||||
ap_linenum(PAGE_NUM(linenum));
|
||||
else
|
||||
ap_quest();
|
||||
break;
|
||||
case 'D': /* Last page number */
|
||||
case 'D': /* Final page number */
|
||||
/* Find the page number of the last byte in the file (len-1). */
|
||||
len = ch_length();
|
||||
if (len == NULL_POSITION || len == ch_zero() ||
|
||||
(linenum = find_linenum(len)) <= 0)
|
||||
if (len == NULL_POSITION)
|
||||
ap_quest();
|
||||
else if (len == 0)
|
||||
/* An empty file has no pages. */
|
||||
ap_linenum(0);
|
||||
else
|
||||
{
|
||||
linenum = find_linenum(len - 1);
|
||||
if (linenum <= 0)
|
||||
ap_quest();
|
||||
else
|
||||
ap_linenum(((linenum - 1) / (sc_height - 1)) + 1);
|
||||
ap_linenum(PAGE_NUM(linenum));
|
||||
}
|
||||
break;
|
||||
#if EDITOR
|
||||
case 'E': /* Editor name */
|
||||
@ -518,7 +530,7 @@ pr_expand(proto, maxwidth)
|
||||
}
|
||||
|
||||
if (mp == message)
|
||||
return (NULL);
|
||||
return ("");
|
||||
if (maxwidth > 0 && mp >= message + maxwidth)
|
||||
{
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -38,11 +38,12 @@ extern int fd0;
|
||||
|
||||
#else
|
||||
|
||||
#if HAVE_TERMIOS_H && HAVE_TERMIOS_FUNCS
|
||||
#include <termios.h>
|
||||
#if HAVE_SYS_IOCTL_H && !defined(TIOCGWINSZ)
|
||||
#if HAVE_SYS_IOCTL_H
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_TERMIOS_H && HAVE_TERMIOS_FUNCS
|
||||
#include <termios.h>
|
||||
#else
|
||||
#if HAVE_TERMIO_H
|
||||
#include <termio.h>
|
||||
@ -52,9 +53,6 @@ extern int fd0;
|
||||
#else
|
||||
#include <sgtty.h>
|
||||
#endif
|
||||
#if HAVE_SYS_IOCTL_H && (defined(TIOCGWINSZ) || defined(TCGETA) || defined(TIOCGETP) || defined(WIOCGETD))
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -189,7 +187,9 @@ static int init_done = 0;
|
||||
|
||||
public int auto_wrap; /* Terminal does \r\n when write past margin */
|
||||
public int ignaw; /* Terminal ignores \n immediately after wrap */
|
||||
public int erase_char, kill_char; /* The user's erase and line-kill chars */
|
||||
public int erase_char; /* The user's erase char */
|
||||
public int erase2_char; /* The user's other erase char */
|
||||
public int kill_char; /* The user's line-kill char */
|
||||
public int werase_char; /* The user's word-erase char */
|
||||
public int sc_width, sc_height; /* Height & width of screen */
|
||||
public int bo_s_width, bo_e_width; /* Printing width of boldface seq */
|
||||
@ -202,6 +202,7 @@ public int clear_bg; /* Clear fills with background color */
|
||||
public int missing_cap = 0; /* Some capability is missing */
|
||||
|
||||
static int attrmode = AT_NORMAL;
|
||||
extern int binattr;
|
||||
|
||||
#if !MSDOS_COMPILER
|
||||
static char *cheaper();
|
||||
@ -230,6 +231,7 @@ extern int sigs;
|
||||
extern int wscroll;
|
||||
extern int screen_trashed;
|
||||
extern int tty;
|
||||
extern int top_scroll;
|
||||
#if HILITE_SEARCH
|
||||
extern int hilite_search;
|
||||
#endif
|
||||
@ -257,6 +259,7 @@ raw_mode(on)
|
||||
|
||||
if (on == curr_on)
|
||||
return;
|
||||
erase2_char = '\b'; /* in case OS doesn't know about erase2 */
|
||||
#if HAVE_TERMIOS_H && HAVE_TERMIOS_FUNCS
|
||||
{
|
||||
struct termios s;
|
||||
@ -339,6 +342,9 @@ raw_mode(on)
|
||||
}
|
||||
#endif
|
||||
erase_char = s.c_cc[VERASE];
|
||||
#ifdef VERASE2
|
||||
erase2_char = s.c_cc[VERASE2];
|
||||
#endif
|
||||
kill_char = s.c_cc[VKILL];
|
||||
#ifdef VWERASE
|
||||
werase_char = s.c_cc[VWERASE];
|
||||
@ -1201,7 +1207,7 @@ get_term()
|
||||
if (below_mem && (sc_eos_clear == NULL || *sc_eos_clear == '\0'))
|
||||
{
|
||||
missing_cap = 1;
|
||||
sc_eol_clear = "";
|
||||
sc_eos_clear = "";
|
||||
}
|
||||
|
||||
sc_clear = ltgetstr("cl", &sp);
|
||||
@ -1505,6 +1511,19 @@ init()
|
||||
tputs(sc_init, sc_height, putchr);
|
||||
if (!no_keypad)
|
||||
tputs(sc_s_keypad, sc_height, putchr);
|
||||
if (top_scroll)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* This is nice to terminals with no alternate screen,
|
||||
* but with saved scrolled-off-the-top lines. This way,
|
||||
* no previous line is lost, but we start with a whole
|
||||
* screen to ourself.
|
||||
*/
|
||||
for (i = 1; i < sc_height; i++)
|
||||
putchr('\n');
|
||||
}
|
||||
#else
|
||||
#if MSDOS_COMPILER==WIN32C
|
||||
if (!no_init)
|
||||
@ -1846,12 +1865,12 @@ create_flash()
|
||||
videopages = w.numvideopages;
|
||||
if (videopages < 2)
|
||||
{
|
||||
so_enter();
|
||||
so_exit();
|
||||
at_enter(AT_STANDOUT);
|
||||
at_exit();
|
||||
} else
|
||||
{
|
||||
_setactivepage(1);
|
||||
so_enter();
|
||||
at_enter(AT_STANDOUT);
|
||||
blanks = (char *) ecalloc(w.numtextcols, sizeof(char));
|
||||
for (col = 0; col < w.numtextcols; col++)
|
||||
blanks[col] = ' ';
|
||||
@ -1860,7 +1879,7 @@ create_flash()
|
||||
_setactivepage(0);
|
||||
_setvisualpage(0);
|
||||
free(blanks);
|
||||
so_exit();
|
||||
at_exit();
|
||||
}
|
||||
#else
|
||||
#if MSDOS_COMPILER==BORLANDC
|
||||
@ -2090,153 +2109,111 @@ clear_bot()
|
||||
* cleared area with the current attribute.
|
||||
*/
|
||||
lower_left();
|
||||
switch (attrmode)
|
||||
if (attrmode == AT_NORMAL)
|
||||
clear_eol_bot();
|
||||
else
|
||||
{
|
||||
case AT_STANDOUT:
|
||||
so_exit();
|
||||
int saved_attrmode = attrmode;
|
||||
|
||||
at_exit();
|
||||
clear_eol_bot();
|
||||
so_enter();
|
||||
break;
|
||||
case AT_UNDERLINE:
|
||||
ul_exit();
|
||||
clear_eol_bot();
|
||||
ul_enter();
|
||||
break;
|
||||
case AT_BOLD:
|
||||
bo_exit();
|
||||
clear_eol_bot();
|
||||
bo_enter();
|
||||
break;
|
||||
case AT_BLINK:
|
||||
bl_exit();
|
||||
clear_eol_bot();
|
||||
bl_enter();
|
||||
break;
|
||||
default:
|
||||
clear_eol_bot();
|
||||
break;
|
||||
at_enter(saved_attrmode);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Begin "standout" (bold, underline, or whatever).
|
||||
*/
|
||||
public void
|
||||
so_enter()
|
||||
at_enter(attr)
|
||||
int attr;
|
||||
{
|
||||
attr = apply_at_specials(attr);
|
||||
|
||||
#if !MSDOS_COMPILER
|
||||
/* The one with the most priority is last. */
|
||||
if (attr & AT_UNDERLINE)
|
||||
tputs(sc_u_in, 1, putchr);
|
||||
if (attr & AT_BOLD)
|
||||
tputs(sc_b_in, 1, putchr);
|
||||
if (attr & AT_BLINK)
|
||||
tputs(sc_bl_in, 1, putchr);
|
||||
if (attr & AT_STANDOUT)
|
||||
tputs(sc_s_in, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
/* The one with the most priority is first. */
|
||||
if (attr & AT_STANDOUT)
|
||||
{
|
||||
SETCOLORS(so_fg_color, so_bg_color);
|
||||
#endif
|
||||
attrmode = AT_STANDOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
* End "standout".
|
||||
*/
|
||||
public void
|
||||
so_exit()
|
||||
} else if (attr & AT_BLINK)
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_s_out, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(nm_fg_color, nm_bg_color);
|
||||
#endif
|
||||
attrmode = AT_NORMAL;
|
||||
SETCOLORS(bl_fg_color, bl_bg_color);
|
||||
}
|
||||
|
||||
/*
|
||||
* Begin "underline" (hopefully real underlining,
|
||||
* otherwise whatever the terminal provides).
|
||||
*/
|
||||
public void
|
||||
ul_enter()
|
||||
else if (attr & AT_BOLD)
|
||||
{
|
||||
SETCOLORS(bo_fg_color, bo_bg_color);
|
||||
}
|
||||
else if (attr & AT_UNDERLINE)
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_u_in, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(ul_fg_color, ul_bg_color);
|
||||
}
|
||||
#endif
|
||||
attrmode = AT_UNDERLINE;
|
||||
|
||||
attrmode = attr;
|
||||
}
|
||||
|
||||
/*
|
||||
* End "underline".
|
||||
*/
|
||||
public void
|
||||
ul_exit()
|
||||
at_exit()
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
/* Undo things in the reverse order we did them. */
|
||||
if (attrmode & AT_STANDOUT)
|
||||
tputs(sc_s_out, 1, putchr);
|
||||
if (attrmode & AT_BLINK)
|
||||
tputs(sc_bl_out, 1, putchr);
|
||||
if (attrmode & AT_BOLD)
|
||||
tputs(sc_b_out, 1, putchr);
|
||||
if (attrmode & AT_UNDERLINE)
|
||||
tputs(sc_u_out, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(nm_fg_color, nm_bg_color);
|
||||
#endif
|
||||
|
||||
attrmode = AT_NORMAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Begin "bold"
|
||||
*/
|
||||
public void
|
||||
bo_enter()
|
||||
at_switch(attr)
|
||||
int attr;
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_b_in, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(bo_fg_color, bo_bg_color);
|
||||
#endif
|
||||
attrmode = AT_BOLD;
|
||||
if (apply_at_specials(attr) != attrmode)
|
||||
{
|
||||
at_exit();
|
||||
at_enter(attr);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* End "bold".
|
||||
*/
|
||||
public void
|
||||
bo_exit()
|
||||
public int
|
||||
is_at_equiv(attr1, attr2)
|
||||
int attr1;
|
||||
int attr2;
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_b_out, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(nm_fg_color, nm_bg_color);
|
||||
#endif
|
||||
attrmode = AT_NORMAL;
|
||||
attr1 = apply_at_specials(attr1);
|
||||
attr2 = apply_at_specials(attr2);
|
||||
|
||||
return (attr1 == attr2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Begin "blink"
|
||||
*/
|
||||
public void
|
||||
bl_enter()
|
||||
public int
|
||||
apply_at_specials(attr)
|
||||
int attr;
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_bl_in, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(bl_fg_color, bl_bg_color);
|
||||
#endif
|
||||
attrmode = AT_BLINK;
|
||||
}
|
||||
if (attr & AT_BINARY)
|
||||
attr |= binattr;
|
||||
if (attr & AT_HILITE)
|
||||
attr |= AT_STANDOUT;
|
||||
attr &= ~(AT_BINARY|AT_HILITE);
|
||||
|
||||
/*
|
||||
* End "blink".
|
||||
*/
|
||||
public void
|
||||
bl_exit()
|
||||
{
|
||||
#if !MSDOS_COMPILER
|
||||
tputs(sc_bl_out, 1, putchr);
|
||||
#else
|
||||
flush();
|
||||
SETCOLORS(nm_fg_color, nm_bg_color);
|
||||
#endif
|
||||
attrmode = AT_NORMAL;
|
||||
return attr;
|
||||
}
|
||||
|
||||
#if 0 /* No longer used */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -120,9 +120,9 @@ cvt_text(odst, osrc, ops)
|
||||
|
||||
for (src = osrc, dst = odst; *src != '\0'; src++)
|
||||
{
|
||||
if ((ops & CVT_TO_LC) && isupper((unsigned char) *src))
|
||||
if ((ops & CVT_TO_LC) && IS_UPPER(*src))
|
||||
/* Convert uppercase to lowercase. */
|
||||
*dst++ = tolower((unsigned char) *src);
|
||||
*dst++ = TO_LOWER(*src);
|
||||
else if ((ops & CVT_BS) && *src == '\b' && dst > odst)
|
||||
/* Delete BS and preceding char. */
|
||||
dst--;
|
||||
@ -130,7 +130,7 @@ cvt_text(odst, osrc, ops)
|
||||
{
|
||||
/* Skip to end of ANSI escape sequence. */
|
||||
while (src[1] != '\0')
|
||||
if (is_ansi_end(*++src))
|
||||
if (!is_ansi_middle(*++src))
|
||||
break;
|
||||
} else
|
||||
/* Just copy. */
|
||||
@ -175,7 +175,7 @@ is_ucase(s)
|
||||
register char *p;
|
||||
|
||||
for (p = s; *p != '\0'; p++)
|
||||
if (isupper((unsigned char) *p))
|
||||
if (IS_UPPER(*p))
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
@ -247,11 +247,18 @@ repaint_hilite(on)
|
||||
if (pos == NULL_POSITION)
|
||||
continue;
|
||||
epos = position(slinenum+1);
|
||||
#if 0
|
||||
/*
|
||||
* If any character in the line is highlighted,
|
||||
* repaint the line.
|
||||
*
|
||||
* {{ This doesn't work -- if line is drawn with highlights
|
||||
* which should be erased (e.g. toggle -i with status column),
|
||||
* we must redraw the line even if it has no highlights.
|
||||
* For now, just repaint every line. }}
|
||||
*/
|
||||
if (is_hilited(pos, epos, 1))
|
||||
if (is_hilited(pos, epos, 1, NULL))
|
||||
#endif
|
||||
{
|
||||
(void) forw_line(pos);
|
||||
goto_line(slinenum);
|
||||
@ -530,17 +537,43 @@ clr_hilite()
|
||||
prep_startpos = prep_endpos = NULL_POSITION;
|
||||
}
|
||||
|
||||
/*
|
||||
* Should any characters in a specified range be highlighted?
|
||||
*/
|
||||
static int
|
||||
is_hilited_range(pos, epos)
|
||||
POSITION pos;
|
||||
POSITION epos;
|
||||
{
|
||||
struct hilite *hl;
|
||||
|
||||
/*
|
||||
* Look at each highlight and see if any part of it falls in the range.
|
||||
*/
|
||||
for (hl = hilite_anchor.hl_first; hl != NULL; hl = hl->hl_next)
|
||||
{
|
||||
if (hl->hl_endpos > pos &&
|
||||
(epos == NULL_POSITION || epos > hl->hl_startpos))
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Should any characters in a specified range be highlighted?
|
||||
* If nohide is nonzero, don't consider hide_hilite.
|
||||
*/
|
||||
public int
|
||||
is_hilited(pos, epos, nohide)
|
||||
is_hilited(pos, epos, nohide, p_matches)
|
||||
POSITION pos;
|
||||
POSITION epos;
|
||||
int nohide;
|
||||
int *p_matches;
|
||||
{
|
||||
struct hilite *hl;
|
||||
int match;
|
||||
|
||||
if (p_matches != NULL)
|
||||
*p_matches = 0;
|
||||
|
||||
if (!status_col &&
|
||||
start_attnpos != NULL_POSITION &&
|
||||
@ -551,6 +584,16 @@ is_hilited(pos, epos, nohide)
|
||||
*/
|
||||
return (1);
|
||||
|
||||
match = is_hilited_range(pos, epos);
|
||||
if (!match)
|
||||
return (0);
|
||||
|
||||
if (p_matches != NULL)
|
||||
/*
|
||||
* Report matches, even if we're hiding highlights.
|
||||
*/
|
||||
*p_matches = 1;
|
||||
|
||||
if (hilite_search == 0)
|
||||
/*
|
||||
* Not doing highlighting.
|
||||
@ -563,17 +606,8 @@ is_hilited(pos, epos, nohide)
|
||||
*/
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Look at each highlight and see if any part of it falls in the range.
|
||||
*/
|
||||
for (hl = hilite_anchor.hl_first; hl != NULL; hl = hl->hl_next)
|
||||
{
|
||||
if (hl->hl_endpos > pos &&
|
||||
(epos == NULL_POSITION || epos > hl->hl_startpos))
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a new hilite to a hilite list.
|
||||
@ -615,6 +649,30 @@ add_hilite(anchor, hl)
|
||||
ihl->hl_next = hl;
|
||||
}
|
||||
|
||||
static void
|
||||
adj_hilite_ansi(cvt_ops, line, npos)
|
||||
int cvt_ops;
|
||||
char **line;
|
||||
POSITION *npos;
|
||||
{
|
||||
if (cvt_ops & CVT_ANSI)
|
||||
while (**line == ESC)
|
||||
{
|
||||
/*
|
||||
* Found an ESC. The file position moves
|
||||
* forward past the entire ANSI escape sequence.
|
||||
*/
|
||||
(*line)++;
|
||||
(*npos)++;
|
||||
while (**line != '\0')
|
||||
{
|
||||
(*npos)++;
|
||||
if (!is_ansi_middle(*(*line)++))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Adjust hl_startpos & hl_endpos to account for backspace processing.
|
||||
*/
|
||||
@ -664,38 +722,30 @@ adj_hilite(anchor, linepos, cvt_ops)
|
||||
}
|
||||
if (*line == '\0')
|
||||
break;
|
||||
if (cvt_ops & CVT_ANSI)
|
||||
{
|
||||
while (line[0] == ESC)
|
||||
{
|
||||
/*
|
||||
* Found an ESC. The file position moves
|
||||
* forward past the entire ANSI escape sequence.
|
||||
*/
|
||||
line++;
|
||||
npos++;
|
||||
while (*line != '\0')
|
||||
{
|
||||
npos++;
|
||||
if (is_ansi_end(*line++))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
adj_hilite_ansi(cvt_ops, &line, &npos);
|
||||
opos++;
|
||||
npos++;
|
||||
line++;
|
||||
if (cvt_ops & CVT_BS)
|
||||
{
|
||||
while (line[0] == '\b' && line[1] != '\0')
|
||||
while (*line == '\b')
|
||||
{
|
||||
npos++;
|
||||
line++;
|
||||
adj_hilite_ansi(cvt_ops, &line, &npos);
|
||||
if (*line == '\0')
|
||||
{
|
||||
--npos;
|
||||
--line;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Found a backspace. The file position moves
|
||||
* forward by 2 relative to the processed line
|
||||
* which was searched in hilite_line.
|
||||
*/
|
||||
npos += 2;
|
||||
line += 2;
|
||||
npos++;
|
||||
line++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1041,7 +1091,7 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
|
||||
* Return it.
|
||||
*/
|
||||
#if HILITE_SEARCH
|
||||
if (hilite_search == 1)
|
||||
if (hilite_search == OPT_ON)
|
||||
{
|
||||
/*
|
||||
* Clear the hilite list and add only
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -33,6 +33,7 @@ extern int lnloop;
|
||||
extern int linenums;
|
||||
extern int wscroll;
|
||||
extern int reading;
|
||||
extern int quit_on_intr;
|
||||
|
||||
/*
|
||||
* Interrupt signal handler.
|
||||
@ -247,6 +248,8 @@ psignals()
|
||||
#endif
|
||||
if (tsignals & S_INTERRUPT)
|
||||
{
|
||||
if (quit_on_intr)
|
||||
quit(QUIT_OK);
|
||||
bell();
|
||||
/*
|
||||
* {{ You may wish to replace the bell() with
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -498,7 +498,7 @@ findgtag(tag, type)
|
||||
#if !HAVE_POPEN
|
||||
return TAG_NOFILE;
|
||||
#else
|
||||
char command[512];
|
||||
char *command;
|
||||
char *flag;
|
||||
char *qtag;
|
||||
char *cmd = lgetenv("LESSGLOBALTAGS");
|
||||
@ -528,10 +528,13 @@ findgtag(tag, type)
|
||||
qtag = shell_quote(tag);
|
||||
if (qtag == NULL)
|
||||
qtag = tag;
|
||||
command = (char *) ecalloc(strlen(cmd) + strlen(flag) +
|
||||
strlen(qtag) + 5, sizeof(char));
|
||||
sprintf(command, "%s -x%s %s", cmd, flag, qtag);
|
||||
if (qtag != tag)
|
||||
free(qtag);
|
||||
fp = popen(command, "r");
|
||||
free(command);
|
||||
#endif
|
||||
}
|
||||
if (fp != NULL)
|
||||
@ -539,6 +542,7 @@ findgtag(tag, type)
|
||||
while (fgets(buf, sizeof(buf), fp))
|
||||
{
|
||||
char *name, *file, *line;
|
||||
int len;
|
||||
|
||||
if (sigs)
|
||||
{
|
||||
@ -548,8 +552,9 @@ findgtag(tag, type)
|
||||
#endif
|
||||
return TAG_INTR;
|
||||
}
|
||||
if (buf[strlen(buf) - 1] == '\n')
|
||||
buf[strlen(buf) - 1] = 0;
|
||||
len = strlen(buf);
|
||||
if (len > 0 && buf[len-1] == '\n')
|
||||
buf[len-1] = '\0';
|
||||
else
|
||||
{
|
||||
int c;
|
||||
@ -695,14 +700,6 @@ gtagsearch()
|
||||
* The tag, file, and line will each be NUL-terminated pointers
|
||||
* into buf.
|
||||
*/
|
||||
|
||||
#ifndef isspace
|
||||
#define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r' || (c) == '\f')
|
||||
#endif
|
||||
#ifndef isdigit
|
||||
#define isdigit(c) ((c) >= '0' && (c <= '9'))
|
||||
#endif
|
||||
|
||||
static int
|
||||
getentry(buf, tag, file, line)
|
||||
char *buf; /* standard or extended ctags -x format data */
|
||||
@ -712,12 +709,12 @@ getentry(buf, tag, file, line)
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
for (*tag = p; *p && !isspace(*p); p++) /* tag name */
|
||||
for (*tag = p; *p && !IS_SPACE(*p); p++) /* tag name */
|
||||
;
|
||||
if (*p == 0)
|
||||
return (-1);
|
||||
*p++ = 0;
|
||||
for ( ; *p && isspace(*p); p++) /* (skip blanks) */
|
||||
for ( ; *p && IS_SPACE(*p); p++) /* (skip blanks) */
|
||||
;
|
||||
if (*p == 0)
|
||||
return (-1);
|
||||
@ -725,27 +722,27 @@ getentry(buf, tag, file, line)
|
||||
* If the second part begin with other than digit,
|
||||
* it is assumed tag type. Skip it.
|
||||
*/
|
||||
if (!isdigit(*p))
|
||||
if (!IS_DIGIT(*p))
|
||||
{
|
||||
for ( ; *p && !isspace(*p); p++) /* (skip tag type) */
|
||||
for ( ; *p && !IS_SPACE(*p); p++) /* (skip tag type) */
|
||||
;
|
||||
for (; *p && isspace(*p); p++) /* (skip blanks) */
|
||||
for (; *p && IS_SPACE(*p); p++) /* (skip blanks) */
|
||||
;
|
||||
}
|
||||
if (!isdigit(*p))
|
||||
if (!IS_DIGIT(*p))
|
||||
return (-1);
|
||||
*line = p; /* line number */
|
||||
for (*line = p; *p && !isspace(*p); p++)
|
||||
for (*line = p; *p && !IS_SPACE(*p); p++)
|
||||
;
|
||||
if (*p == 0)
|
||||
return (-1);
|
||||
*p++ = 0;
|
||||
for ( ; *p && isspace(*p); p++) /* (skip blanks) */
|
||||
for ( ; *p && IS_SPACE(*p); p++) /* (skip blanks) */
|
||||
;
|
||||
if (*p == 0)
|
||||
return (-1);
|
||||
*file = p; /* file name */
|
||||
for (*file = p; *p && !isspace(*p); p++)
|
||||
for (*file = p; *p && !IS_SPACE(*p); p++)
|
||||
;
|
||||
if (*p == 0)
|
||||
return (-1);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2004 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -26,6 +26,7 @@ static DWORD console_mode;
|
||||
|
||||
public int tty;
|
||||
extern int sigs;
|
||||
extern int utf_mode;
|
||||
|
||||
/*
|
||||
* Open keyboard for input.
|
||||
@ -101,6 +102,8 @@ getchr()
|
||||
{
|
||||
char c;
|
||||
int result;
|
||||
int hex_in = 0;
|
||||
int hex_value = 0;
|
||||
|
||||
do
|
||||
{
|
||||
@ -131,6 +134,34 @@ getchr()
|
||||
*/
|
||||
quit(QUIT_ERROR);
|
||||
}
|
||||
#endif
|
||||
#if 0 /* allow entering arbitrary hex chars for testing */
|
||||
/* ctrl-A followed by two hex chars makes a byte */
|
||||
if (c == CONTROL('A'))
|
||||
{
|
||||
hex_in = 2;
|
||||
result = 0;
|
||||
continue;
|
||||
}
|
||||
if (hex_in > 0)
|
||||
{
|
||||
int v;
|
||||
if (c >= '0' && c <= '9')
|
||||
v = c - '0';
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
v = c - 'a' + 10;
|
||||
else if (c >= 'A' && c <= 'F')
|
||||
v = c - 'A' + 10;
|
||||
else
|
||||
hex_in = 0;
|
||||
hex_value = (hex_value << 4) | v;
|
||||
if (--hex_in > 0)
|
||||
{
|
||||
result = 0;
|
||||
continue;
|
||||
}
|
||||
c = hex_value;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Various parts of the program cannot handle
|
||||
@ -141,5 +172,5 @@ getchr()
|
||||
c = '\340';
|
||||
} while (result != 1);
|
||||
|
||||
return (c & 0377);
|
||||
return (c & 0xFF);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2002 Mark Nudelman
|
||||
* Copyright (C) 1984-2005 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -644,6 +644,30 @@ v379 11/23/02 Add -L option; fix bug with ctrl-K in lesskey files;
|
||||
fix minor man page problems; change to autoconf 2.54.
|
||||
v380 11/24/02 Make LINENUM same as POSITION.
|
||||
v381 11/28/02 Make -N use 7 columns for line number if possible.
|
||||
-----------------------------------------------------------------
|
||||
v382 2/3/04 Remove copyrighted code.
|
||||
-----------------------------------------------------------------
|
||||
v383 2/16/04 Add history file; add -K option; improve UTF-8 handling;
|
||||
fix some signed char bugs (thanks to Christian Biere);
|
||||
fix some upper/lower case bugs (thanks to Bjoern Jacke);
|
||||
add erase2 char (thanks to David Lawrence);
|
||||
add windows charset (thanks to Dimitar Zhekov).
|
||||
v384 2/20/04 Improvements in UTF-8 handling.
|
||||
v385 2/23/04 Fix UTF-8 output bug.
|
||||
-----------------------------------------------------------------
|
||||
v386 9/13/05 Improvements to UTF-8 shift & color (thanks to Charles Levert);
|
||||
protect against invalid LESSOPEN and LESSCLOSE values.
|
||||
v387 9/14/05 Update Charles Levert's UTF-8 patch.
|
||||
v388 9/14/05 Change history behavior; change most sprintf calls to snprintf.
|
||||
v389 9/14/05 Fix copy & paste with long lines; improve performance of
|
||||
expand_linebuf; fix crash in init_mlist;
|
||||
v390 9/15/05 Show search matches in status column even if -G is set.
|
||||
-----------------------------------------------------------------
|
||||
v391 9/17/05 Fix bugs.
|
||||
v392 10/14/05 Fix line wrapping bug.
|
||||
v393 10/19/05 Allow multiple attributes per char; fix bold+underline bug
|
||||
(thanks again to Charles Levert).
|
||||
v394 11/8/05 Fix prompt bug; fix compile problem in Windows build.
|
||||
*/
|
||||
|
||||
char version[] = "381";
|
||||
char version[] = "394";
|
||||
|
Loading…
Reference in New Issue
Block a user