git: eed6d080a74f - stable/13 - MFC: MFV: less v668.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 22 Dec 2024 07:47:47 UTC
The branch stable/13 has been updated by delphij:
URL: https://cgit.FreeBSD.org/src/commit/?id=eed6d080a74f9f74e367a9178b2764780724518c
commit eed6d080a74f9f74e367a9178b2764780724518c
Author: Xin LI <delphij@FreeBSD.org>
AuthorDate: 2024-12-09 04:50:00 +0000
Commit: Xin LI <delphij@FreeBSD.org>
CommitDate: 2024-12-22 07:47:24 +0000
MFC: MFV: less v668.
(cherry picked from commit c77c488926555ca344ae3a417544cf7a720e1de1)
---
contrib/less/LICENSE | 2 +-
contrib/less/NEWS | 134 ++++++++
contrib/less/brac.c | 2 +-
contrib/less/ch.c | 131 ++++----
contrib/less/charset.c | 181 +++++-----
contrib/less/charset.h | 2 +-
contrib/less/cmd.h | 6 +-
contrib/less/cmdbuf.c | 217 ++++++------
contrib/less/command.c | 392 ++++++++++++++--------
contrib/less/compose.uni | 2 +-
contrib/less/cvt.c | 33 +-
contrib/less/decode.c | 376 +++++++++++++++------
contrib/less/edit.c | 362 ++++++++++----------
contrib/less/evar.c | 192 +++++++++++
contrib/less/filename.c | 430 ++++++++++++------------
contrib/less/fmt.uni | 2 +-
contrib/less/forwback.c | 84 +++--
contrib/less/funcs.h | 387 ++++++++++++----------
contrib/less/help.c | 54 +--
contrib/less/ifile.c | 18 +-
contrib/less/input.c | 109 +++---
contrib/less/jump.c | 51 ++-
contrib/less/lang.h | 57 ++++
contrib/less/less.h | 125 ++++---
contrib/less/less.hlp | 52 ++-
contrib/less/less.nro | 389 +++++++++++++++++-----
contrib/less/lessecho.c | 15 +-
contrib/less/lessecho.nro | 6 +-
contrib/less/lesskey.c | 73 ++--
contrib/less/lesskey.h | 24 +-
contrib/less/lesskey.nro | 38 ++-
contrib/less/lesskey_parse.c | 114 +++++--
contrib/less/lglob.h | 2 +-
contrib/less/line.c | 440 ++++++++++++++++--------
contrib/less/linenum.c | 83 +++--
contrib/less/lsystem.c | 17 +-
contrib/less/main.c | 272 ++++++++++++---
contrib/less/mark.c | 36 +-
contrib/less/optfunc.c | 533 ++++++++++++++++++-----------
contrib/less/option.c | 262 ++++++++++-----
contrib/less/option.h | 9 +-
contrib/less/opttbl.c | 113 ++++---
contrib/less/os.c | 64 ++--
contrib/less/output.c | 501 ++++++++++++++++------------
contrib/less/pattern.c | 40 +--
contrib/less/pattern.h | 6 +-
contrib/less/pckeys.h | 2 +-
contrib/less/position.c | 70 +++-
contrib/less/position.h | 2 +-
contrib/less/prompt.c | 112 ++++---
contrib/less/regexp.c | 120 +++----
contrib/less/regexp.h | 14 +-
contrib/less/screen.c | 744 ++++++++++++++++++++++++++---------------
contrib/less/scrsize.c | 2 +-
contrib/less/search.c | 774 +++++++++++++++++++++++++++++++++++++------
contrib/less/signal.c | 22 +-
contrib/less/tags.c | 79 ++---
contrib/less/ttyin.c | 47 ++-
contrib/less/ubin.uni | 2 +-
contrib/less/version.c | 47 ++-
contrib/less/wide.uni | 6 +-
contrib/less/xbuf.c | 64 +++-
contrib/less/xbuf.h | 13 +-
usr.bin/less/Makefile | 2 +-
usr.bin/less/defines.h | 62 ++--
65 files changed, 5718 insertions(+), 2904 deletions(-)
diff --git a/contrib/less/LICENSE b/contrib/less/LICENSE
index d22cc6070c51..d4f3bf6d1ce6 100644
--- a/contrib/less/LICENSE
+++ b/contrib/less/LICENSE
@@ -2,7 +2,7 @@
------------
Less
-Copyright (C) 1984-2023 Mark Nudelman
+Copyright (C) 1984-2024 Mark Nudelman
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
diff --git a/contrib/less/NEWS b/contrib/less/NEWS
index b1f8771c6c31..e869439ea4ee 100644
--- a/contrib/less/NEWS
+++ b/contrib/less/NEWS
@@ -9,6 +9,140 @@
Report bugs, suggestions or comments at
https://github.com/gwsw/less/issues.
+======================================================================
+
+ Major changes between "less" versions 661 and 668
+
+* Make 256/true colors work better on Windows without -Da
+ (github #539, github #546, github #562).
+
+* Fix build using --with-secure (github #544).
+
+* Fix crash when using --header on command line (github #545).
+
+* Fix possible crash when scrolling left/right or toggling -S (github #547).
+
+* Fix bug when using #stop in a lesskey file (github #551).
+
+* Fix bug when using --shift or --match-shift on command line with
+ a parameter starting with '.' (github #554).
+
+* Fix bug in R command when file size changes (github #553).
+
+* Fix bug using --header when file does not fill screen (github #556).
+
+* Fix ^X bug when output is not a terminal (github #558).
+
+* Fix bug where ^Z is not handled immediately (github #563).
+
+* Fix bug where first byte from a LESSOPEN filter is deleted if it is
+ greater than 0x7F (github #568).
+
+* Fix uninitialized variable in edit_ifile (github #573).
+
+* Fix incorrect handling of UTF-8 chars in prompts (github #576).
+
+======================================================================
+
+ Major changes between "less" versions 643 and 661
+
+* Add ^O^N, ^O^P, ^O^L and ^O^O commands and mouse clicks (with --mouse)
+ to find and open OSC8 hyperlinks (github #251).
+
+* Add --match-shift option.
+
+* Add --lesskey-content option (github #447).
+
+* Add LESSKEY_CONTENT environment variable (github #447).
+
+* Add --no-search-header-lines and --no-search-header-columns options
+ (github #397).
+
+* Add ctrl-L search modifier (github #367).
+
+* A ctrl-P at the start of a shell command suppresses the "done"
+ message (github #462).
+
+* Add attribute characters ('*', '~', '_', '&') to --color
+ parameter (github #471).
+
+* Allow expansion of environment variables in lesskey files.
+
+* Add LESSSECURE_ALLOW environment variable (github #449).
+
+* Add LESS_UNSUPPORT environment variable.
+
+* Add line number parameter to --header option (github #436).
+
+* Mouse right-click jumps to position marked by left-click (github #390).
+
+* Ensure that the target line is not obscured by a header line
+ set by --header (github #444).
+
+* Change default character set to "utf-8", except remains "dos" on MS-DOS.
+
+* Add message when search with ^W wraps (github #459).
+
+* UCRT builds on Windows 10 and later now support Unicode file names
+ (github #438).
+
+* Improve behavior of interrupt while reading non-terminated pipe
+ (github #414).
+
+* Improve parsing of -j, -x and -# options (github #393).
+
+* Support files larger than 4GB on Windows (github #417).
+
+* Support entry of Unicode chars larger than U+FFFF on Windows (github #391).
+
+* Improve colors of bold, underline and standout text on Windows.
+
+* Allow --rscroll to accept non-ASCII characters (github #483).
+
+* Allow the parameter to certain options to be terminated with a
+ space (--color, --quotes, --rscroll, --search-options
+ and --intr) (github #495).
+
+* Fix bug where # substitution failed after viewing help (github #420).
+
+* Fix crash if files are deleted while less is viewing them (github #404).
+
+* Workaround unreliable ReadConsoleInputW behavior on Windows
+ with non-ASCII input.
+
+* Fix -J display when searching for non-ASCII characters (github #422).
+
+* Don't filter header lines via the & command (github #423).
+
+* Fix bug when horizontally shifting long lines (github #425).
+
+* Add -x and -D options to lesstest, to make it easier to diagnose
+ a failed lesstest run.
+
+* Fix bug searching long lines with --incsearch and -S (github #428).
+
+* Fix bug that made ESC-} fail if top line on screen was empty (github #429).
+
+* Fix bug with --mouse on Windows when used with pipes (github #440).
+
+* Fix bug in --+OPTION command line syntax.
+
+* Fix display bug when using -w with an empty line with a CR/LF
+ line ending (github #474).
+
+* When substituting '#' or '%' with a filename, quote the filename
+ if it contains a space (github #480).
+
+* Fix wrong sleep time when system has usleep but not nanosleep (github #489).
+
+* Fix bug when file name contains a newline.
+
+* Fix bug when file name contains nonprintable characters (github #503).
+
+* Fix DJGPP build (github #497).
+
+* Update Unicode tables.
+
======================================================================
Major changes between "less" versions 633 and 643
diff --git a/contrib/less/brac.c b/contrib/less/brac.c
index da4efab8605e..170cd73da516 100644
--- a/contrib/less/brac.c
+++ b/contrib/less/brac.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1984-2023 Mark Nudelman
+ * Copyright (C) 1984-2024 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.
diff --git a/contrib/less/ch.c b/contrib/less/ch.c
index 51045438a296..336af7792120 100644
--- a/contrib/less/ch.c
+++ b/contrib/less/ch.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1984-2023 Mark Nudelman
+ * Copyright (C) 1984-2024 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.
@@ -20,13 +20,6 @@
#include <windows.h>
#endif
-#if HAVE_PROCFS
-#include <sys/statfs.h>
-#if HAVE_LINUX_MAGIC_H
-#include <linux/magic.h>
-#endif
-#endif
-
typedef POSITION BLOCKNUM;
public int ignore_eoi;
@@ -46,7 +39,7 @@ struct bufnode {
struct buf {
struct bufnode node;
BLOCKNUM block;
- unsigned int datasize;
+ size_t datasize;
unsigned char data[LBUFSIZE];
};
#define bufnode_buf(bn) ((struct buf *) bn)
@@ -64,7 +57,7 @@ struct filestate {
POSITION fpos;
int nbufs;
BLOCKNUM block;
- unsigned int offset;
+ size_t offset;
POSITION fsize;
};
@@ -122,15 +115,14 @@ struct filestate {
thisfile->hashtbl[h].hnext = (bn);
static struct filestate *thisfile;
-static int ch_ungotchar = -1;
+static unsigned char ch_ungotchar;
+static lbool ch_have_ungotchar = FALSE;
static int maxbufs = -1;
extern int autobuf;
extern int sigs;
-extern int secure;
-extern int screen_trashed;
extern int follow_mode;
-extern int waiting_for_data;
+extern lbool waiting_for_data;
extern constant char helpdata[];
extern constant int size_helpdata;
extern IFILE curr_ifile;
@@ -141,6 +133,13 @@ extern char *namelogfile;
static int ch_addbuf();
+/*
+ * Return the file position corresponding to an offset within a block.
+ */
+static POSITION ch_position(BLOCKNUM block, size_t offset)
+{
+ return (block * LBUFSIZE) + (POSITION) offset;
+}
/*
* Get the character pointed to by the read pointer.
@@ -149,8 +148,8 @@ static int ch_get(void)
{
struct buf *bp;
struct bufnode *bn;
- int n;
- int read_again;
+ ssize_t n;
+ lbool read_again;
int h;
POSITION pos;
POSITION len;
@@ -187,6 +186,8 @@ static int ch_get(void)
goto found;
}
}
+ if (ABORT_SIGS())
+ return (EOI);
if (bn == END_OF_HCHAIN(h))
{
/*
@@ -223,7 +224,7 @@ static int ch_get(void)
for (;;)
{
- pos = (ch_block * LBUFSIZE) + bp->datasize;
+ pos = ch_position(ch_block, bp->datasize);
if ((len = ch_length()) != NULL_POSITION && pos >= len)
/*
* At end of file.
@@ -239,7 +240,7 @@ static int ch_get(void)
*/
if (!(ch_flags & CH_CANSEEK))
return ('?');
- if (lseek(ch_file, (off_t)pos, SEEK_SET) == BAD_LSEEK)
+ if (less_lseek(ch_file, (less_off_t)pos, SEEK_SET) == BAD_LSEEK)
{
error("seek error", NULL_PARG);
clear_eol();
@@ -253,19 +254,18 @@ static int ch_get(void)
* If we read less than a full block, that's ok.
* We use partial block and pick up the rest next time.
*/
- if (ch_ungotchar != -1)
+ if (ch_have_ungotchar)
{
bp->data[bp->datasize] = ch_ungotchar;
n = 1;
- ch_ungotchar = -1;
+ ch_have_ungotchar = FALSE;
} else if (ch_flags & CH_HELPFILE)
{
- bp->data[bp->datasize] = helpdata[ch_fpos];
+ bp->data[bp->datasize] = (unsigned char) helpdata[ch_fpos];
n = 1;
} else
{
- n = iread(ch_file, &bp->data[bp->datasize],
- (unsigned int)(LBUFSIZE - bp->datasize));
+ n = iread(ch_file, &bp->data[bp->datasize], LBUFSIZE - bp->datasize);
}
read_again = FALSE;
@@ -295,12 +295,15 @@ static int ch_get(void)
/*
* If we have a log file, write the new data to it.
*/
- if (!secure && logfile >= 0 && n > 0)
- write(logfile, (char *) &bp->data[bp->datasize], n);
+ if (secure_allow(SF_LOGFILE))
+ {
+ if (logfile >= 0 && n > 0)
+ write(logfile, &bp->data[bp->datasize], (size_t) n);
+ }
#endif
ch_fpos += n;
- bp->datasize += n;
+ bp->datasize += (size_t) n;
if (n == 0)
{
@@ -323,7 +326,7 @@ static int ch_get(void)
if (ignore_eoi && follow_mode == FOLLOW_NAME && curr_ifile_changed())
{
/* screen_trashed=2 causes make_display to reopen the file. */
- screen_trashed = 2;
+ screen_trashed_num(2);
return (EOI);
}
if (sigs)
@@ -363,9 +366,15 @@ static int ch_get(void)
*/
public void ch_ungetchar(int c)
{
- if (c != -1 && ch_ungotchar != -1)
- error("ch_ungetchar overrun", NULL_PARG);
- ch_ungotchar = c;
+ if (c < 0)
+ ch_have_ungotchar = FALSE;
+ else
+ {
+ if (ch_have_ungotchar)
+ error("ch_ungetchar overrun", NULL_PARG);
+ ch_ungotchar = (unsigned char) c;
+ ch_have_ungotchar = TRUE;
+ }
}
#if LOGFILE
@@ -375,7 +384,7 @@ public void ch_ungetchar(int c)
*/
public void end_logfile(void)
{
- static int tried = FALSE;
+ static lbool tried = FALSE;
if (logfile < 0)
return;
@@ -402,7 +411,7 @@ public void sync_logfile(void)
{
struct buf *bp;
struct bufnode *bn;
- int warned = FALSE;
+ lbool warned = FALSE;
BLOCKNUM block;
BLOCKNUM nblocks;
@@ -411,13 +420,13 @@ public void sync_logfile(void)
nblocks = (ch_fpos + LBUFSIZE - 1) / LBUFSIZE;
for (block = 0; block < nblocks; block++)
{
- int wrote = FALSE;
+ lbool wrote = FALSE;
FOR_BUFS(bn)
{
bp = bufnode_buf(bn);
if (bp->block == block)
{
- write(logfile, (char *) bp->data, bp->datasize);
+ write(logfile, bp->data, bp->datasize);
wrote = TRUE;
break;
}
@@ -436,7 +445,7 @@ public void sync_logfile(void)
/*
* Determine if a specific block is currently in one of the buffers.
*/
-static int buffered(BLOCKNUM block)
+static lbool buffered(BLOCKNUM block)
{
struct buf *bp;
struct bufnode *bn;
@@ -486,7 +495,7 @@ public int ch_seek(POSITION pos)
* Set read pointer.
*/
ch_block = new_block;
- ch_offset = pos % LBUFSIZE;
+ ch_offset = (size_t) (pos % LBUFSIZE);
return (0);
}
@@ -533,7 +542,7 @@ public int ch_end_buffer_seek(void)
FOR_BUFS(bn)
{
bp = bufnode_buf(bn);
- buf_pos = (bp->block * LBUFSIZE) + bp->datasize;
+ buf_pos = ch_position(bp->block, bp->datasize);
if (buf_pos > end_pos)
end_pos = buf_pos;
}
@@ -597,7 +606,7 @@ public POSITION ch_tell(void)
{
if (thisfile == NULL)
return (NULL_POSITION);
- return (ch_block * LBUFSIZE) + ch_offset;
+ return ch_position(ch_block, ch_offset);
}
/*
@@ -647,14 +656,14 @@ public int ch_back_get(void)
* Set max amount of buffer space.
* bufspace is in units of 1024 bytes. -1 mean no limit.
*/
-public void ch_setbufspace(int bufspace)
+public void ch_setbufspace(ssize_t bufspace)
{
if (bufspace < 0)
maxbufs = -1;
else
{
- int lbufk = LBUFSIZE / 1024;
- maxbufs = bufspace / lbufk + (bufspace % lbufk != 0);
+ size_t lbufk = LBUFSIZE / 1024;
+ maxbufs = (int) (bufspace / lbufk + (bufspace % lbufk != 0));
if (maxbufs < 1)
maxbufs = 1;
}
@@ -688,11 +697,6 @@ public void ch_flush(void)
bufnode_buf(bn)->block = -1;
}
- /*
- * Figure out the size of the file, if we can.
- */
- ch_fsize = filesize(ch_file);
-
/*
* Seek to a known position: the beginning of the file.
*/
@@ -700,19 +704,16 @@ public void ch_flush(void)
ch_block = 0; /* ch_fpos / LBUFSIZE; */
ch_offset = 0; /* ch_fpos % LBUFSIZE; */
- /*
- * This is a kludge to workaround a Linux kernel bug: files in
- * /proc have a size of 0 according to fstat() but have readable
- * data. They are sometimes, but not always, seekable.
- * Force them to be non-seekable here.
- */
- if (ch_fsize == 0)
+ if (ch_flags & CH_NOTRUSTSIZE)
{
ch_fsize = NULL_POSITION;
ch_flags &= ~CH_CANSEEK;
+ } else
+ {
+ ch_fsize = (ch_flags & CH_HELPFILE) ? size_helpdata : filesize(ch_file);
}
- if (lseek(ch_file, (off_t)0, SEEK_SET) == BAD_LSEEK)
+ if (less_lseek(ch_file, (less_off_t)0, SEEK_SET) == BAD_LSEEK)
{
/*
* Warning only; even if the seek fails for some reason,
@@ -795,7 +796,7 @@ public int seekable(int f)
return (0);
}
#endif
- return (lseek(f, (off_t)1, SEEK_SET) != BAD_LSEEK);
+ return (less_lseek(f, (less_off_t)1, SEEK_SET) != BAD_LSEEK);
}
/*
@@ -812,7 +813,7 @@ public void ch_set_eof(void)
/*
* Initialize file state for a new file.
*/
-public void ch_init(int f, int flags)
+public void ch_init(int f, int flags, ssize_t nread)
{
/*
* See if we already have a filestate for this file.
@@ -843,6 +844,22 @@ public void ch_init(int f, int flags)
}
if (thisfile->file == -1)
thisfile->file = f;
+
+ /*
+ * Figure out the size of the file, if we can.
+ */
+ ch_fsize = (flags & CH_HELPFILE) ? size_helpdata : filesize(ch_file);
+
+ /*
+ * This is a kludge to workaround a Linux kernel bug: files in some
+ * pseudo filesystems like /proc and tracefs have a size of 0 according
+ * to fstat() but have readable data.
+ */
+ if (ch_fsize == 0 && nread > 0)
+ {
+ ch_flags |= CH_NOTRUSTSIZE;
+ }
+
ch_flush();
}
@@ -851,7 +868,7 @@ public void ch_init(int f, int flags)
*/
public void ch_close(void)
{
- int keepstate = FALSE;
+ lbool keepstate = FALSE;
if (thisfile == NULL)
return;
diff --git a/contrib/less/charset.c b/contrib/less/charset.c
index 881ebafd02cf..3e8fb0fa9354 100644
--- a/contrib/less/charset.c
+++ b/contrib/less/charset.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1984-2023 Mark Nudelman
+ * Copyright (C) 1984-2024 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,8 +120,8 @@ struct cs_alias {
#define IS_CONTROL_CHAR 02
static char chardef[256];
-static char *binfmt = NULL;
-static char *utfbinfmt = NULL;
+static constant char *binfmt = NULL;
+static constant char *utfbinfmt = NULL;
public int binattr = AT_STANDOUT|AT_COLOR_BIN;
static struct xbuffer user_wide_array;
@@ -139,13 +139,13 @@ static struct wchar_range_table user_prt_table;
static void wchar_range_table_set(struct wchar_range_table *tbl, struct xbuffer *arr)
{
tbl->table = (struct wchar_range *) arr->data;
- tbl->count = arr->end / sizeof(struct wchar_range);
+ tbl->count = (unsigned int) (arr->end / sizeof(struct wchar_range));
}
/*
* Skip over a "U" or "U+" prefix before a hex codepoint.
*/
-static char * skip_uprefix(char *s)
+static constant char * skip_uprefix(constant char *s)
{
if (*s == 'U' || *s == 'u')
if (*++s == '+') ++s;
@@ -155,14 +155,14 @@ static char * skip_uprefix(char *s)
/*
* Parse a dash-separated range of hex values.
*/
-static void wchar_range_get(char **ss, struct wchar_range *range)
+static void wchar_range_get(constant char **ss, struct wchar_range *range)
{
- char *s = skip_uprefix(*ss);
- range->first = lstrtoul(s, &s, 16);
+ constant char *s = skip_uprefix(*ss);
+ range->first = lstrtoulc(s, &s, 16);
if (s[0] == '-')
{
s = skip_uprefix(&s[1]);
- range->last = lstrtoul(s, &s, 16);
+ range->last = lstrtoulc(s, &s, 16);
} else
{
range->last = range->first;
@@ -173,7 +173,7 @@ static void wchar_range_get(char **ss, struct wchar_range *range)
/*
* Parse the LESSUTFCHARDEF variable.
*/
-static void ichardef_utf(char *s)
+static void ichardef_utf(constant char *s)
{
xbuf_init(&user_wide_array);
xbuf_init(&user_ubin_array);
@@ -241,7 +241,7 @@ static void ichardef_utf(char *s)
* b binary character
* c control character
*/
-static void ichardef(char *s)
+static void ichardef(constant char *s)
{
char *cp;
int n;
@@ -298,7 +298,7 @@ static void ichardef(char *s)
* Define a charset, given a charset name.
* The valid charset names are listed in the "charsets" array.
*/
-static int icharset(char *name, int no_error)
+static int icharset(constant char *name, int no_error)
{
struct charset *p;
struct cs_alias *a;
@@ -363,23 +363,8 @@ static void ilocale(void)
/*
* Define the printing format for control (or binary utf) chars.
*/
-public void setfmt(char *s, char **fmtvarptr, int *attrptr, char *default_fmt, int for_printf)
+public void setfmt(constant char *s, constant char **fmtvarptr, int *attrptr, constant char *default_fmt, lbool for_printf)
{
- if (s && utf_mode)
- {
- /* It would be too hard to account for width otherwise. */
- char constant *t = s;
- while (*t)
- {
- if (*t < ' ' || *t > '~')
- {
- s = default_fmt;
- goto attr;
- }
- t++;
- }
- }
-
if (s == NULL || *s == '\0')
s = default_fmt;
else if (for_printf &&
@@ -391,7 +376,6 @@ public void setfmt(char *s, char **fmtvarptr, int *attrptr, char *default_fmt, i
/*
* Select the attributes if it starts with "*".
*/
- attr:
if (*s == '*' && s[1] != '\0')
{
switch (s[1])
@@ -412,16 +396,7 @@ public void setfmt(char *s, char **fmtvarptr, int *attrptr, char *default_fmt, i
*/
static void set_charset(void)
{
- char *s;
-
-#if MSDOS_COMPILER==WIN32C
- /*
- * If the Windows console is using UTF-8, we'll use it too.
- */
- if (GetConsoleOutputCP() == CP_UTF8)
- if (icharset("utf-8", 1))
- return;
-#endif
+ constant char *s;
ichardef_utf(lgetenv("LESSUTFCHARDEF"));
@@ -476,15 +451,13 @@ static void set_charset(void)
ilocale();
#else
#if MSDOS_COMPILER
- /*
- * Default to "dos".
- */
+#if MSDOS_COMPILER==WIN32C
+ (void) icharset("utf-8", 1);
+#else
(void) icharset("dos", 1);
+#endif
#else
- /*
- * Default to "latin1".
- */
- (void) icharset("latin1", 1);
+ (void) icharset("utf-8", 1);
#endif
#endif
}
@@ -494,7 +467,7 @@ static void set_charset(void)
*/
public void init_charset(void)
{
- char *s;
+ constant char *s;
#if HAVE_LOCALE
setlocale(LC_ALL, "");
@@ -512,20 +485,22 @@ public void init_charset(void)
/*
* Is a given character a "binary" character?
*/
-public int binary_char(LWCHAR c)
+public lbool binary_char(LWCHAR c)
{
if (utf_mode)
return (is_ubin_char(c));
- c &= 0377;
- return (chardef[c] & IS_BINARY_CHAR);
+ if (c >= sizeof(chardef))
+ return TRUE;
+ return ((chardef[c] & IS_BINARY_CHAR) != 0);
}
/*
* Is a given character a "control" character?
*/
-public int control_char(LWCHAR c)
+public lbool control_char(LWCHAR c)
{
- c &= 0377;
+ if (c >= sizeof(chardef))
+ return TRUE;
return (chardef[c] & IS_CONTROL_CHAR);
}
@@ -533,12 +508,12 @@ public int control_char(LWCHAR c)
* Return the printable form of a character.
* For example, in the "ascii" charset '\3' is printed as "^C".
*/
-public char * prchar(LWCHAR c)
+public constant char * prchar(LWCHAR c)
{
- /* {{ This buffer can be overrun if LESSBINFMT is a long string. }} */
+ /* {{ Fixed buffer size means LESSBINFMT etc can be truncated. }} */
static char buf[MAX_PRCHAR_LEN+1];
- c &= 0377;
+ c &= 0377; /*{{type-issue}}*/
if ((c < 128 || !utf_mode) && !control_char(c))
SNPRINTF1(buf, sizeof(buf), "%c", (int) c);
else if (c == ESC)
@@ -567,7 +542,7 @@ public char * prchar(LWCHAR c)
/*
* Return the printable form of a UTF-8 character.
*/
-public char * prutfchar(LWCHAR ch)
+public constant char * prutfchar(LWCHAR ch)
{
static char buf[MAX_PRCHAR_LEN+1];
@@ -596,7 +571,7 @@ public char * prutfchar(LWCHAR ch)
/*
* Get the length of a UTF-8 character in bytes.
*/
-public int utf_len(int ch)
+public int utf_len(char ch)
{
if ((ch & 0x80) == 0)
return 1;
@@ -606,10 +581,12 @@ public int utf_len(int ch)
return 3;
if ((ch & 0xF8) == 0xF0)
return 4;
+#if 0
if ((ch & 0xFC) == 0xF8)
return 5;
if ((ch & 0xFE) == 0xFC)
return 6;
+#endif
/* Invalid UTF-8 encoding. */
return 1;
}
@@ -617,42 +594,41 @@ public int utf_len(int ch)
/*
* Does the parameter point to the lead byte of a well-formed UTF-8 character?
*/
-public int is_utf8_well_formed(char *ss, int slen)
+public lbool is_utf8_well_formed(constant char *ss, int slen)
{
int i;
int len;
- unsigned char *s = (unsigned char *) ss;
+ unsigned char s0 = (unsigned char) ss[0];
- if (IS_UTF8_INVALID(s[0]))
- return (0);
+ if (IS_UTF8_INVALID(s0))
+ return (FALSE);
- len = utf_len(s[0]);
+ len = utf_len(ss[0]);
if (len > slen)
- return (0);
+ return (FALSE);
if (len == 1)
- return (1);
+ return (TRUE);
if (len == 2)
{
- if (s[0] < 0xC2)
- return (0);
+ if (s0 < 0xC2)
+ return (FALSE);
} else
{
- unsigned char mask;
- mask = (~((1 << (8-len)) - 1)) & 0xFF;
- if (s[0] == mask && (s[1] & mask) == 0x80)
- return (0);
+ unsigned char mask = (unsigned char) (~((1 << (8-len)) - 1));
+ if (s0 == mask && (ss[1] & mask) == 0x80)
+ return (FALSE);
}
for (i = 1; i < len; i++)
- if (!IS_UTF8_TRAIL(s[i]))
- return (0);
- return (1);
+ if (!IS_UTF8_TRAIL(ss[i]))
+ return (FALSE);
+ return (TRUE);
}
/*
* Skip bytes until a UTF-8 lead byte (11xxxxxx) or ASCII byte (0xxxxxxx) is found.
*/
-public void utf_skip_to_lead(char **pp, char *limit)
+public void utf_skip_to_lead(constant char **pp, constant char *limit)
{
do {
++(*pp);
@@ -663,9 +639,10 @@ public void utf_skip_to_lead(char **pp, char *limit)
/*
* Get the value of a UTF-8 character.
*/
-public LWCHAR get_wchar(constant char *p)
+public LWCHAR get_wchar(constant char *sp)
{
- switch (utf_len(p[0]))
+ constant unsigned char *p = (constant unsigned char *) sp;
+ switch (utf_len(sp[0]))
{
case 1:
default:
@@ -690,6 +667,7 @@ public LWCHAR get_wchar(constant char *p)
((p[1] & 0x3F) << 12) |
((p[2] & 0x3F) << 6) |
(p[3] & 0x3F));
+#if 0
case 5:
/* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
return (LWCHAR) (
@@ -707,13 +685,14 @@ public LWCHAR get_wchar(constant char *p)
((p[3] & 0x3F) << 12) |
((p[4] & 0x3F) << 6) |
(p[5] & 0x3F));
+#endif
}
}
/*
* Store a character into a UTF-8 string.
*/
-public void put_wchar(char **pp, LWCHAR ch)
+public void put_wchar(mutable char **pp, LWCHAR ch)
{
if (!utf_mode || ch < 0x80)
{
@@ -737,6 +716,7 @@ public void put_wchar(char **pp, LWCHAR ch)
*(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
*(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
*(*pp)++ = (char) (0x80 | (ch & 0x3F));
+#if 0
} else if (ch < 0x4000000)
{
/* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
@@ -754,17 +734,18 @@ public void put_wchar(char **pp, LWCHAR ch)
*(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
*(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
*(*pp)++ = (char) (0x80 | (ch & 0x3F));
+#endif
}
}
/*
* Step forward or backward one character in a string.
*/
-public LWCHAR step_char(char **pp, signed int dir, constant char *limit)
+public LWCHAR step_charc(constant char **pp, signed int dir, constant char *limit)
{
LWCHAR ch;
int len;
- char *p = *pp;
+ constant char *p = *pp;
if (!utf_mode)
{
@@ -798,6 +779,14 @@ public LWCHAR step_char(char **pp, signed int dir, constant char *limit)
return ch;
}
+public LWCHAR step_char(char **pp, signed int dir, constant char *limit)
+{
+ constant char *p = (constant char *) *pp;
+ LWCHAR ch = step_charc(&p, dir, limit);
+ *pp = (char *) p;
+ return ch;
+}
+
*** 16754 LINES SKIPPED ***