[Midnightbsd-cvs] src [11360] vendor/less/dist: less 530

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Fri Jul 6 08:43:10 EDT 2018


Revision: 11360
          http://svnweb.midnightbsd.org/src/?rev=11360
Author:   laffer1
Date:     2018-07-06 08:43:09 -0400 (Fri, 06 Jul 2018)
Log Message:
-----------
less 530

Modified Paths:
--------------
    vendor/less/dist/LICENSE
    vendor/less/dist/NEWS
    vendor/less/dist/README
    vendor/less/dist/brac.c
    vendor/less/dist/ch.c
    vendor/less/dist/charset.c
    vendor/less/dist/charset.h
    vendor/less/dist/cmd.h
    vendor/less/dist/cmdbuf.c
    vendor/less/dist/command.c
    vendor/less/dist/cvt.c
    vendor/less/dist/decode.c
    vendor/less/dist/edit.c
    vendor/less/dist/filename.c
    vendor/less/dist/forwback.c
    vendor/less/dist/funcs.h
    vendor/less/dist/help.c
    vendor/less/dist/ifile.c
    vendor/less/dist/input.c
    vendor/less/dist/jump.c
    vendor/less/dist/less.h
    vendor/less/dist/less.hlp
    vendor/less/dist/less.nro
    vendor/less/dist/lessecho.c
    vendor/less/dist/lessecho.nro
    vendor/less/dist/lesskey.c
    vendor/less/dist/lesskey.h
    vendor/less/dist/lesskey.nro
    vendor/less/dist/lglob.h
    vendor/less/dist/line.c
    vendor/less/dist/linenum.c
    vendor/less/dist/lsystem.c
    vendor/less/dist/main.c
    vendor/less/dist/mark.c
    vendor/less/dist/optfunc.c
    vendor/less/dist/option.c
    vendor/less/dist/option.h
    vendor/less/dist/opttbl.c
    vendor/less/dist/os.c
    vendor/less/dist/output.c
    vendor/less/dist/pattern.c
    vendor/less/dist/pattern.h
    vendor/less/dist/pckeys.h
    vendor/less/dist/position.c
    vendor/less/dist/position.h
    vendor/less/dist/prompt.c
    vendor/less/dist/regexp.c
    vendor/less/dist/screen.c
    vendor/less/dist/scrsize.c
    vendor/less/dist/search.c
    vendor/less/dist/signal.c
    vendor/less/dist/tags.c
    vendor/less/dist/ttyin.c
    vendor/less/dist/version.c

Added Paths:
-----------
    vendor/less/dist/compose.uni
    vendor/less/dist/fmt.uni
    vendor/less/dist/mkutable
    vendor/less/dist/ubin.uni
    vendor/less/dist/wide.uni

Property Changed:
----------------
    vendor/less/dist/install.sh
    vendor/less/dist/mkinstalldirs

Modified: vendor/less/dist/LICENSE
===================================================================
--- vendor/less/dist/LICENSE	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/LICENSE	2018-07-06 12:43:09 UTC (rev 11360)
@@ -2,7 +2,7 @@
                           ------------
 
 Less
-Copyright (C) 1984-2012  Mark Nudelman
+Copyright (C) 1984-2016  Mark Nudelman
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions

Modified: vendor/less/dist/NEWS
===================================================================
--- vendor/less/dist/NEWS	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/NEWS	2018-07-06 12:43:09 UTC (rev 11360)
@@ -7,10 +7,123 @@
       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 at gnu.org.
+  To report bugs, suggestions or comments, send email to bug-less at gnu.org
 
 ======================================================================
 
+	Major changes between "less" versions 487 and 530
+
+* Don't output terminal init sequence if using -F and file fits on one screen.
+
+* When using -S, mark truncated lines with a special character.
+  The character can be changed or disabled via the new --rscroll option.
+
+* New command M marks the last line displayed on the screen.
+
+* New command ESC-m removes a line mark.
+
+* Status column (enabled via -J) now shows mark letters.
+
+* Status column shows search matches even if highlighting is disabled via -G.
+
+* A second ESC-u command will clear search match markers in the status column.
+
+* Do same ANSI escape code filtering for tag matching that we do for 
+  searching, to help when viewing syntax-highlighted code.
+  
+* Catch SIGTERM and clean up before exiting.
+
+* Fix bug initializing default charset on Windows.
+
+* Handle keypad ENTER key correctly if it sends something other than newline.
+
+* Fix buffering bug when using stdin with a LESSOPEN pipe.
+
+* On Windows, allow 'u' in -D option to enable underlining.
+
+* On Windows, use underline in sgr mode.
+
+* On Windows, convert UTF-8 to multibyte if console is not UTF-8.
+
+* Update Unicode tables to 2017-03-08.
+
+* Pass-thru Unicode formating chars (Cf type) instead of treating them
+  as binary chars. But treat them as binary if -U is set.
+
+* Fix erroneous binary file warning when UTF-8 file contains ANSI SGR sequences.
+
+* Fix bugs when using LESSOPEN and switching between stdin and other files.
+
+* Fix some bugs handling filenames containing shell metacharacters.
+
+* Fix some memory leaks.
+
+* Allow some debugging environment variables to be set in lesskey file.
+
+* Code improvements:
+  . Use ANSI prototypes in funcs.h declarations.
+  . Fix some const mismatches.
+  . Remove archaic "register" in variable declarations.
+
+======================================================================
+
+	Major changes between "less" versions 481 and 487
+
+* New commands ESC-{ and ESC-} to shift to start/end of displayed lines.
+
+* Make search highlights work correctly when changing caselessness with -i.
+
+* New option -Da in Windows version to enable SGR mode.
+
+* Fix "nothing to search" error when top or bottom line on screen is empty.
+
+* Fix bug when terminal has no "cm" termcap entry.
+
+* Fix incorrect display when entering double-width chars in search string.
+
+* Fix bug in Unicode handling that missed some double width characters.
+
+* Update Unicode database to 9.0.0.
+
+======================================================================
+
+	Major changes between "less" versions 458 and 481
+
+* Don't overwrite history file; just append to it.
+
+* New command ESC-G goes to end of currently buffered data in a pipe.
+
+* Disable history feature when compiled with LESSHISTFILE set to "-".
+
+* In more-compatible mode, make the -p option apply to every file opened,
+  not just the first one.
+
+* In more-compatible mode, change the -e option to work like -E, not -EF.
+
+* Treat multiple CRs before LF are like one CR (all the CRs are hidden).
+
+* Allow "extra" string in lesskey file to append to a multi-char command
+  (like a search pattern), without executing the command.
+
+* Ignore -u/-U setting while viewing help file, so that 
+  underline and bold chars are displayed correctly.
+
+* Improve detection of "binary" files in UTF-8 mode.
+
+* Fix bug with ++ commands.
+
+* Fix bug where prompt was sometimes not displayed with +G.
+
+* Fix possible memory corruption 
+
+* Fix bugs and improve performance in ampersand filtering.
+
+* Automate construction of Unicode tables from Unicode database.
+
+* Allow %% escape sequence in LESSOPEN variable.
+
+======================================================================
+
 	Major changes between "less" versions 451 and 458
 
 * Allow backslash escaping of metacharacters in LESS environment variable

Modified: vendor/less/dist/README
===================================================================
--- vendor/less/dist/README	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/README	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,7 +1,15 @@
+**************************************************************************
+**************************************************************************
+**                                                                      **
+** The FreeBSD Project has chosen to redistribute and modify Less under **
+** the 'Less License' (as described in the 'LICENSE' file).             **
+**                                                                      **
+**************************************************************************
+**************************************************************************
 
-                            Less, version 458
+                            Less, version 530
 
-    This is the distribution of less, version 458, released 04 Apr 2013.
+    This is the distribution of less, version 530, released 05 Dec 2017.
     This program is part of the GNU project (http://www.gnu.org).
 
     This program is free software.  You may redistribute it and/or
@@ -15,6 +23,7 @@
 
     Please report any problems to bug-less at gnu.org.
     See http://www.greenwoodsoftware.com/less for the latest info.
+    Source repository is at https://github.com/gwsw/less.git.
 
 =========================================================================
 
@@ -45,8 +54,9 @@
      Specifies the regular expression library used by less for pattern
      matching.  The default is "auto", which means the configure program 
      finds a regular expression library automatically.  Other values are:
+        gnu            Use the GNU regex library.
+        pcre           Use the PCRE library.
         posix          Use the POSIX-compatible regcomp.
-        pcre           Use the PCRE library.
         regcmp         Use the regcmp library.
         re_comp        Use the re_comp library.
         regcomp        Use the V8-compatible regcomp.

Modified: vendor/less/dist/brac.c
===================================================================
--- vendor/less/dist/brac.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/brac.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -25,13 +25,13 @@
  */
 	public void
 match_brac(obrac, cbrac, forwdir, n)
-	register int obrac;
-	register int cbrac;
+	int obrac;
+	int cbrac;
 	int forwdir;
 	int n;
 {
-	register int c;
-	register int nest;
+	int c;
+	int nest;
 	POSITION pos;
 	int (*chget)();
 

Modified: vendor/less/dist/ch.c
===================================================================
--- vendor/less/dist/ch.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/ch.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -54,7 +54,7 @@
  * The file state is maintained in a filestate structure.
  * A pointer to the filestate is kept in the ifile structure.
  */
-#define	BUFHASH_SIZE	64
+#define	BUFHASH_SIZE	1024
 struct filestate {
 	struct bufnode buflist;
 	struct bufnode hashtbl[BUFHASH_SIZE];
@@ -146,11 +146,11 @@
 	int
 ch_get()
 {
-	register struct buf *bp;
-	register struct bufnode *bn;
-	register int n;
-	register int slept;
-	register int h;
+	struct buf *bp;
+	struct bufnode *bn;
+	int n;
+	int slept;
+	int h;
 	POSITION pos;
 	POSITION len;
 
@@ -323,13 +323,16 @@
 #if HAVE_STAT_INO
 			if (follow_mode == FOLLOW_NAME)
 			{
-				/* See whether the file's i-number has changed.
+				/* See whether the file's i-number has changed,
+				 * or the file has shrunk.
 				 * If so, force the file to be closed and
 				 * reopened. */
 				struct stat st;
+				POSITION curr_pos = ch_tell();
 				int r = stat(get_filename(curr_ifile), &st);
 				if (r == 0 && (st.st_ino != curr_ino ||
-					st.st_dev != curr_dev))
+					st.st_dev != curr_dev ||
+					(curr_pos != NULL_POSITION && st.st_size < curr_pos)))
 				{
 					/* screen_trashed=2 causes
 					 * make_display to reopen the file. */
@@ -416,8 +419,8 @@
 	public void
 sync_logfile()
 {
-	register struct buf *bp;
-	register struct bufnode *bn;
+	struct buf *bp;
+	struct bufnode *bn;
 	int warned = FALSE;
 	BLOCKNUM block;
 	BLOCKNUM nblocks;
@@ -454,9 +457,9 @@
 buffered(block)
 	BLOCKNUM block;
 {
-	register struct buf *bp;
-	register struct bufnode *bn;
-	register int h;
+	struct buf *bp;
+	struct bufnode *bn;
+	int h;
 
 	h = BUFHASH(block);
 	FOR_BUFS_IN_CHAIN(h, bn)
@@ -474,7 +477,7 @@
  */
 	public int
 ch_seek(pos)
-	register POSITION pos;
+	POSITION pos;
 {
 	BLOCKNUM new_block;
 	POSITION len;
@@ -536,6 +539,32 @@
 }
 
 /*
+ * Seek to the last position in the file that is currently buffered.
+ */
+	public int
+ch_end_buffer_seek()
+{
+	struct buf *bp;
+	struct bufnode *bn;
+	POSITION buf_pos;
+	POSITION end_pos;
+
+	if (thisfile == NULL || (ch_flags & CH_CANSEEK))
+		return (ch_end_seek());
+
+	end_pos = 0;
+	FOR_BUFS(bn)
+	{
+		bp = bufnode_buf(bn);
+		buf_pos = (bp->block * LBUFSIZE) + bp->datasize;
+		if (buf_pos > end_pos)
+			end_pos = buf_pos;
+	}
+
+	return (ch_seek(end_pos));
+}
+
+/*
  * Seek to the beginning of the file, or as close to it as we can get.
  * We may not be able to seek there if input is a pipe and the
  * beginning of the pipe is no longer buffered.
@@ -543,8 +572,8 @@
 	public int
 ch_beg_seek()
 {
-	register struct bufnode *bn;
-	register struct bufnode *firstbn;
+	struct bufnode *bn;
+	struct bufnode *firstbn;
 
 	/*
 	 * Try a plain ch_seek first.
@@ -603,7 +632,7 @@
 	public int
 ch_forw_get()
 {
-	register int c;
+	int c;
 
 	if (thisfile == NULL)
 		return (EOI);
@@ -666,7 +695,7 @@
 	public void
 ch_flush()
 {
-	register struct bufnode *bn;
+	struct bufnode *bn;
 
 	if (thisfile == NULL)
 		return;
@@ -733,8 +762,8 @@
 	static int
 ch_addbuf()
 {
-	register struct buf *bp;
-	register struct bufnode *bn;
+	struct buf *bp;
+	struct bufnode *bn;
 
 	/*
 	 * Allocate and initialize a new buffer and link it 
@@ -758,7 +787,7 @@
 	static void
 init_hashtbl()
 {
-	register int h;
+	int h;
 
 	for (h = 0;  h < BUFHASH_SIZE;  h++)
 	{
@@ -773,7 +802,7 @@
 	static void
 ch_delbufs()
 {
-	register struct bufnode *bn;
+	struct bufnode *bn;
 
 	while (ch_bufhead != END_OF_CHAIN)
 	{
@@ -838,13 +867,12 @@
 				calloc(1, sizeof(struct filestate));
 		thisfile->buflist.next = thisfile->buflist.prev = END_OF_CHAIN;
 		thisfile->nbufs = 0;
-		thisfile->flags = 0;
+		thisfile->flags = flags;
 		thisfile->fpos = 0;
 		thisfile->block = 0;
 		thisfile->offset = 0;
 		thisfile->file = -1;
 		thisfile->fsize = NULL_POSITION;
-		ch_flags = flags;
 		init_hashtbl();
 		/*
 		 * Try to seek; set CH_CANSEEK if it works.
@@ -869,7 +897,7 @@
 	if (thisfile == NULL)
 		return;
 
-	if (ch_flags & (CH_CANSEEK|CH_POPENED|CH_HELPFILE))
+	if ((ch_flags & (CH_CANSEEK|CH_POPENED|CH_HELPFILE)) && !(ch_flags & CH_KEEPOPEN))
 	{
 		/*
 		 * We can seek or re-open, so we don't need to keep buffers.

Modified: vendor/less/dist/charset.c
===================================================================
--- vendor/less/dist/charset.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/charset.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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,13 @@
 
 #include "charset.h"
 
+#if MSDOS_COMPILER==WIN32C
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
+extern int bs_mode;
+
 public int utf_mode = 0;
 
 /*
@@ -64,6 +71,8 @@
 	char *oname;
 } cs_aliases[] = {
 	{ "UTF-8",		"utf-8" },
+	{ "utf8",		"utf-8" },
+	{ "UTF8",		"utf-8" },
 	{ "ANSI_X3.4-1968",	"ascii" },
 	{ "US-ASCII",		"ascii" },
 	{ "latin1",		"iso8859" },
@@ -133,9 +142,9 @@
 ichardef(s)
 	char *s;
 {
-	register char *cp;
-	register int n;
-	register char v;
+	char *cp;
+	int n;
+	char v;
 
 	n = 0;
 	v = 0;
@@ -188,11 +197,11 @@
  */
 	static int
 icharset(name, no_error)
-	register char *name;
+	char *name;
 	int no_error;
 {
-	register struct charset *p;
-	register struct cs_alias *a;
+	struct charset *p;
+	struct cs_alias *a;
 
 	if (name == NULL || *name == '\0')
 		return (0);
@@ -213,7 +222,13 @@
 		{
 			ichardef(p->desc);
 			if (p->p_flag != NULL)
+			{
+#if MSDOS_COMPILER==WIN32C
+				*(p->p_flag) = 1 + (GetConsoleOutputCP() != CP_UTF8);
+#else
 				*(p->p_flag) = 1;
+#endif
+			}
 			return (1);
 		}
 	}
@@ -232,7 +247,7 @@
 	static void
 ilocale()
 {
-	register int c;
+	int c;
 
 	for (c = 0;  c < (int) sizeof(chardef);  c++)
 	{
@@ -249,16 +264,17 @@
 /*
  * Define the printing format for control (or binary utf) chars.
  */
-   	static void
-setbinfmt(s, fmtvarptr, default_fmt)
+	public void
+setfmt(s, fmtvarptr, attrptr, default_fmt)
 	char *s;
 	char **fmtvarptr;
+	int *attrptr;
 	char *default_fmt;
 {
 	if (s && utf_mode)
 	{
 		/* It would be too hard to account for width otherwise.  */
-		char *t = s;
+		char constant *t = s;
 		while (*t)
 		{
 			if (*t < ' ' || *t > '~')
@@ -280,15 +296,15 @@
 	 * Select the attributes if it starts with "*".
 	 */
  attr:
-	if (*s == '*')
+	if (*s == '*' && s[1] != '\0')
 	{
 		switch (s[1])
 		{
-		case 'd':  binattr = AT_BOLD;      break;
-		case 'k':  binattr = AT_BLINK;     break;
-		case 's':  binattr = AT_STANDOUT;  break;
-		case 'u':  binattr = AT_UNDERLINE; break;
-		default:   binattr = AT_NORMAL;    break;
+		case 'd':  *attrptr = AT_BOLD;      break;
+		case 'k':  *attrptr = AT_BLINK;     break;
+		case 's':  *attrptr = AT_STANDOUT;  break;
+		case 'u':  *attrptr = AT_UNDERLINE; break;
+		default:   *attrptr = AT_NORMAL;    break;
 		}
 		s += 2;
 	}
@@ -303,7 +319,15 @@
 {
 	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
+	/*
 	 * See if environment variable LESSCHARSET is defined.
 	 */
 	s = lgetenv("LESSCHARSET");
@@ -352,6 +376,7 @@
 	 * rather than from predefined charset entry.
 	 */
 	ilocale();
+#else
 #if MSDOS_COMPILER
 	/*
 	 * Default to "dos".
@@ -381,10 +406,10 @@
 	set_charset();
 
 	s = lgetenv("LESSBINFMT");
-	setbinfmt(s, &binfmt, "*s<%02X>");
+	setfmt(s, &binfmt, &binattr, "*s<%02X>");
 	
 	s = lgetenv("LESSUTFBINFMT");
-	setbinfmt(s, &utfbinfmt, "<U+%04lX>");
+	setfmt(s, &utfbinfmt, &binattr, "<U+%04lX>");
 }
 
 /*
@@ -466,36 +491,15 @@
 		else
 			SNPRINTF1(buf, sizeof(buf), binfmt, (char) ch);
 	} else if (is_ubin_char(ch))
+	{
 		SNPRINTF1(buf, sizeof(buf), utfbinfmt, ch);
-	else
+	} else
 	{
-		int len;
+		char *p = buf;
 		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;
-		}
+			ch = 0xFFFD; /* REPLACEMENT CHARACTER */
+		put_wchar(&p, ch);
+		*p = '\0';
 	}
 	return (buf);
 }
@@ -505,7 +509,7 @@
  */
 	public int
 utf_len(ch)
-	char ch;
+	unsigned char ch;
 {
 	if ((ch & 0x80) == 0)
 		return 1;
@@ -524,19 +528,23 @@
 }
 
 /*
- * Is a UTF-8 character well-formed?
+ * Does the parameter point to the lead byte of a well-formed UTF-8 character?
  */
 	public int
-is_utf8_well_formed(s)
-	unsigned char *s;
+is_utf8_well_formed(ss, slen)
+	char *ss;
+	int slen;
 {
 	int i;
 	int len;
+	unsigned char *s = (unsigned char *) ss;
 
 	if (IS_UTF8_INVALID(s[0]))
 		return (0);
 
-	len = utf_len((char) s[0]);
+	len = utf_len(s[0]);
+	if (len > slen)
+		return (0);
 	if (len == 1)
 		return (1);
 	if (len == 2)
@@ -558,11 +566,25 @@
 }
 
 /*
+ * Skip bytes until a UTF-8 lead byte (11xxxxxx) or ASCII byte (0xxxxxxx) is found.
+ */
+	public void
+utf_skip_to_lead(pp, limit)
+	char **pp;
+	char *limit;
+{
+	do {
+		++(*pp);
+	} while (*pp < limit && !IS_UTF8_LEAD((*pp)[0] & 0377) && !IS_ASCII_OCTET((*pp)[0]));
+}
+
+
+/*
  * Get the value of a UTF-8 character.
  */
 	public LWCHAR
 get_wchar(p)
-	char *p;
+	constant char *p;
 {
 	switch (utf_len(p[0]))
 	{
@@ -666,7 +688,7 @@
 step_char(pp, dir, limit)
 	char **pp;
 	signed int dir;
-	char *limit;
+	constant char *limit;
 {
 	LWCHAR ch;
 	int len;
@@ -676,9 +698,9 @@
 	{
 		/* It's easy if chars are one byte. */
 		if (dir > 0)
-			ch = (LWCHAR) ((p < limit) ? *p++ : 0);
+			ch = (LWCHAR) (unsigned char) ((p < limit) ? *p++ : 0);
 		else
-			ch = (LWCHAR) ((p > limit) ? *--p : 0);
+			ch = (LWCHAR) (unsigned char) ((p > limit) ? *--p : 0);
 	} else if (dir > 0)
 	{
 		len = utf_len(*p);
@@ -685,7 +707,7 @@
 		if (p + len > limit)
 		{
 			ch = 0;
-			p = limit;
+			p = (char *) limit;
 		} else
 		{
 			ch = get_wchar(p);
@@ -706,411 +728,55 @@
 
 /*
  * Unicode characters data
+ * Actual data is in the generated *.uni files.
  */
-struct wchar_range { LWCHAR first, last; };
 
-/*
- * Characters with general category values
- *	Mn: Mark, Nonspacing
- *	Me: Mark, Enclosing
- * Last synched with
- *	<http://www.unicode.org/Public/5.0.0/ucd/UnicodeData-5.0.0d7.txt>
- *	dated 2005-11-30T00:58:48Z
- */
-static struct wchar_range comp_table[] = {
-	{  0x0300,  0x036F} /* Mn */, {  0x0483,  0x0486} /* Mn */,
-	{  0x0488,  0x0489} /* Me */,
-	{  0x0591,  0x05BD} /* Mn */, {  0x05BF,  0x05BF} /* Mn */,
-	{  0x05C1,  0x05C2} /* Mn */, {  0x05C4,  0x05C5} /* Mn */,
-	{  0x05C7,  0x05C7} /* Mn */, {  0x0610,  0x0615} /* Mn */,
-	{  0x064B,  0x065E} /* Mn */, {  0x0670,  0x0670} /* Mn */,
-	{  0x06D6,  0x06DC} /* Mn */,
-	{  0x06DE,  0x06DE} /* Me */,
-	{  0x06DF,  0x06E4} /* Mn */, {  0x06E7,  0x06E8} /* Mn */,
-	{  0x06EA,  0x06ED} /* Mn */, {  0x0711,  0x0711} /* Mn */,
-	{  0x0730,  0x074A} /* Mn */, {  0x07A6,  0x07B0} /* Mn */,
-	{  0x07EB,  0x07F3} /* Mn */, {  0x0901,  0x0902} /* Mn */,
-	{  0x093C,  0x093C} /* Mn */, {  0x0941,  0x0948} /* Mn */,
-	{  0x094D,  0x094D} /* Mn */, {  0x0951,  0x0954} /* Mn */,
-	{  0x0962,  0x0963} /* Mn */, {  0x0981,  0x0981} /* Mn */,
-	{  0x09BC,  0x09BC} /* Mn */, {  0x09C1,  0x09C4} /* Mn */,
-	{  0x09CD,  0x09CD} /* Mn */, {  0x09E2,  0x09E3} /* Mn */,
-	{  0x0A01,  0x0A02} /* Mn */, {  0x0A3C,  0x0A3C} /* Mn */,
-	{  0x0A41,  0x0A42} /* Mn */, {  0x0A47,  0x0A48} /* Mn */,
-	{  0x0A4B,  0x0A4D} /* Mn */, {  0x0A70,  0x0A71} /* Mn */,
-	{  0x0A81,  0x0A82} /* Mn */, {  0x0ABC,  0x0ABC} /* Mn */,
-	{  0x0AC1,  0x0AC5} /* Mn */, {  0x0AC7,  0x0AC8} /* Mn */,
-	{  0x0ACD,  0x0ACD} /* Mn */, {  0x0AE2,  0x0AE3} /* Mn */,
-	{  0x0B01,  0x0B01} /* Mn */, {  0x0B3C,  0x0B3C} /* Mn */,
-	{  0x0B3F,  0x0B3F} /* Mn */, {  0x0B41,  0x0B43} /* Mn */,
-	{  0x0B4D,  0x0B4D} /* Mn */, {  0x0B56,  0x0B56} /* Mn */,
-	{  0x0B82,  0x0B82} /* Mn */, {  0x0BC0,  0x0BC0} /* Mn */,
-	{  0x0BCD,  0x0BCD} /* Mn */, {  0x0C3E,  0x0C40} /* Mn */,
-	{  0x0C46,  0x0C48} /* Mn */, {  0x0C4A,  0x0C4D} /* Mn */,
-	{  0x0C55,  0x0C56} /* Mn */, {  0x0CBC,  0x0CBC} /* Mn */,
-	{  0x0CBF,  0x0CBF} /* Mn */, {  0x0CC6,  0x0CC6} /* Mn */,
-	{  0x0CCC,  0x0CCD} /* Mn */, {  0x0CE2,  0x0CE3} /* Mn */,
-	{  0x0D41,  0x0D43} /* Mn */, {  0x0D4D,  0x0D4D} /* Mn */,
-	{  0x0DCA,  0x0DCA} /* Mn */, {  0x0DD2,  0x0DD4} /* Mn */,
-	{  0x0DD6,  0x0DD6} /* Mn */, {  0x0E31,  0x0E31} /* Mn */,
-	{  0x0E34,  0x0E3A} /* Mn */, {  0x0E47,  0x0E4E} /* Mn */,
-	{  0x0EB1,  0x0EB1} /* Mn */, {  0x0EB4,  0x0EB9} /* Mn */,
-	{  0x0EBB,  0x0EBC} /* Mn */, {  0x0EC8,  0x0ECD} /* Mn */,
-	{  0x0F18,  0x0F19} /* Mn */, {  0x0F35,  0x0F35} /* Mn */,
-	{  0x0F37,  0x0F37} /* Mn */, {  0x0F39,  0x0F39} /* Mn */,
-	{  0x0F71,  0x0F7E} /* Mn */, {  0x0F80,  0x0F84} /* Mn */,
-	{  0x0F86,  0x0F87} /* Mn */, {  0x0F90,  0x0F97} /* Mn */,
-	{  0x0F99,  0x0FBC} /* Mn */, {  0x0FC6,  0x0FC6} /* Mn */,
-	{  0x102D,  0x1030} /* Mn */, {  0x1032,  0x1032} /* Mn */,
-	{  0x1036,  0x1037} /* Mn */, {  0x1039,  0x1039} /* Mn */,
-	{  0x1058,  0x1059} /* Mn */, {  0x135F,  0x135F} /* Mn */,
-	{  0x1712,  0x1714} /* Mn */, {  0x1732,  0x1734} /* Mn */,
-	{  0x1752,  0x1753} /* Mn */, {  0x1772,  0x1773} /* Mn */,
-	{  0x17B7,  0x17BD} /* Mn */, {  0x17C6,  0x17C6} /* Mn */,
-	{  0x17C9,  0x17D3} /* Mn */, {  0x17DD,  0x17DD} /* Mn */,
-	{  0x180B,  0x180D} /* Mn */, {  0x18A9,  0x18A9} /* Mn */,
-	{  0x1920,  0x1922} /* Mn */, {  0x1927,  0x1928} /* Mn */,
-	{  0x1932,  0x1932} /* Mn */, {  0x1939,  0x193B} /* Mn */,
-	{  0x1A17,  0x1A18} /* Mn */, {  0x1B00,  0x1B03} /* Mn */,
-	{  0x1B34,  0x1B34} /* Mn */, {  0x1B36,  0x1B3A} /* Mn */,
-	{  0x1B3C,  0x1B3C} /* Mn */, {  0x1B42,  0x1B42} /* Mn */,
-	{  0x1B6B,  0x1B73} /* Mn */, {  0x1DC0,  0x1DCA} /* Mn */,
-	{  0x1DFE,  0x1DFF} /* Mn */, {  0x20D0,  0x20DC} /* Mn */,
-	{  0x20DD,  0x20E0} /* Me */,
-	{  0x20E1,  0x20E1} /* Mn */,
-	{  0x20E2,  0x20E4} /* Me */,
-	{  0x20E5,  0x20EF} /* Mn */, {  0x302A,  0x302F} /* Mn */,
-	{  0x3099,  0x309A} /* Mn */, {  0xA806,  0xA806} /* Mn */,
-	{  0xA80B,  0xA80B} /* Mn */, {  0xA825,  0xA826} /* Mn */,
-	{  0xFB1E,  0xFB1E} /* Mn */, {  0xFE00,  0xFE0F} /* Mn */,
-	{  0xFE20,  0xFE23} /* Mn */, { 0x10A01, 0x10A03} /* Mn */,
-	{ 0x10A05, 0x10A06} /* Mn */, { 0x10A0C, 0x10A0F} /* Mn */,
-	{ 0x10A38, 0x10A3A} /* Mn */, { 0x10A3F, 0x10A3F} /* Mn */,
-	{ 0x1D167, 0x1D169} /* Mn */, { 0x1D17B, 0x1D182} /* Mn */,
-	{ 0x1D185, 0x1D18B} /* Mn */, { 0x1D1AA, 0x1D1AD} /* Mn */,
-	{ 0x1D242, 0x1D244} /* Mn */, { 0xE0100, 0xE01EF} /* Mn */,
-};
+#define DECLARE_RANGE_TABLE_START(name) \
+    static struct wchar_range name##_array[] = {
+#define DECLARE_RANGE_TABLE_END(name) \
+    }; struct wchar_range_table name##_table = { name##_array, sizeof(name##_array)/sizeof(*name##_array) };
 
-/*
- * Special pairs, not ranges.
- */
+DECLARE_RANGE_TABLE_START(compose)
+#include "compose.uni"
+DECLARE_RANGE_TABLE_END(compose)
+
+DECLARE_RANGE_TABLE_START(ubin)
+#include "ubin.uni"
+DECLARE_RANGE_TABLE_END(ubin)
+
+DECLARE_RANGE_TABLE_START(wide)
+#include "wide.uni"
+DECLARE_RANGE_TABLE_END(wide)
+
+DECLARE_RANGE_TABLE_START(fmt)
+#include "fmt.uni"
+DECLARE_RANGE_TABLE_END(fmt)
+
+/* comb_table is special pairs, not ranges. */
 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
- * Last synched with
- *	<http://www.unicode.org/Public/5.0.0/ucd/UnicodeData-5.0.0d7.txt>
- *	dated 2005-11-30T00:58:48Z
- */
-static struct wchar_range ubin_table[] = {
-	{  0x0000,  0x0007} /* Cc */, 
-	{  0x000B,  0x000C} /* Cc */, 
-	{  0x000E,  0x001A} /* Cc */, 
-	{  0x001C,  0x001F} /* Cc */, 
-	{  0x007F,  0x009F} /* Cc */,
-#if 0
-	{  0x00AD,  0x00AD} /* Cf */,
-#endif
-	{  0x0370,  0x0373} /* Cn */, {  0x0376,  0x0379} /* Cn */,
-	{  0x037F,  0x0383} /* Cn */, {  0x038B,  0x038B} /* Cn */,
-	{  0x038D,  0x038D} /* Cn */, {  0x03A2,  0x03A2} /* Cn */,
-	{  0x03CF,  0x03CF} /* Cn */, {  0x0487,  0x0487} /* Cn */,
-	{  0x0514,  0x0530} /* Cn */, {  0x0557,  0x0558} /* Cn */,
-	{  0x0560,  0x0560} /* Cn */, {  0x0588,  0x0588} /* Cn */,
-	{  0x058B,  0x0590} /* Cn */, {  0x05C8,  0x05CF} /* Cn */,
-	{  0x05EB,  0x05EF} /* Cn */, {  0x05F5,  0x05FF} /* Cn */,
-#if 0
-	{  0x0600,  0x0603} /* Cf */,
-#endif
-	{  0x0604,  0x060A} /* Cn */, {  0x0616,  0x061A} /* Cn */,
-	{  0x061C,  0x061D} /* Cn */, {  0x0620,  0x0620} /* Cn */,
-	{  0x063B,  0x063F} /* Cn */, {  0x065F,  0x065F} /* Cn */,
-#if 0
-	{  0x06DD,  0x06DD} /* Cf */,
-#endif
-	{  0x070E,  0x070E} /* Cn */,
-#if 0
-	{  0x070F,  0x070F} /* Cf */,
-#endif
-	{  0x074B,  0x074C} /* Cn */, {  0x076E,  0x077F} /* Cn */,
-	{  0x07B2,  0x07BF} /* Cn */, {  0x07FB,  0x0900} /* Cn */,
-	{  0x093A,  0x093B} /* Cn */, {  0x094E,  0x094F} /* Cn */,
-	{  0x0955,  0x0957} /* Cn */, {  0x0971,  0x097A} /* Cn */,
-	{  0x0980,  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 */,
-	{  0x09CF,  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 */, {  0x0BBA,  0x0BBD} /* Cn */,
-	{  0x0BC3,  0x0BC5} /* Cn */, {  0x0BC9,  0x0BC9} /* Cn */,
-	{  0x0BCE,  0x0BD6} /* Cn */, {  0x0BD8,  0x0BE5} /* 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 */,
-	{  0x0CE4,  0x0CE5} /* Cn */, {  0x0CF0,  0x0CF0} /* Cn */,
-	{  0x0CF3,  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 */, {  0x0FD2,  0x0FFF} /* Cn */,
-	{  0x1022,  0x1022} /* Cn */, {  0x1028,  0x1028} /* Cn */,
-	{  0x102B,  0x102B} /* Cn */, {  0x1033,  0x1035} /* Cn */,
-	{  0x103A,  0x103F} /* Cn */, {  0x105A,  0x109F} /* Cn */,
-	{  0x10C6,  0x10CF} /* Cn */, {  0x10FD,  0x10FF} /* Cn */,
-	{  0x115A,  0x115E} /* Cn */, {  0x11A3,  0x11A7} /* Cn */,
-	{  0x11FA,  0x11FF} /* Cn */, {  0x1249,  0x1249} /* Cn */,
-	{  0x124E,  0x124F} /* Cn */, {  0x1257,  0x1257} /* Cn */,
-	{  0x1259,  0x1259} /* Cn */, {  0x125E,  0x125F} /* Cn */,
-	{  0x1289,  0x1289} /* Cn */, {  0x128E,  0x128F} /* Cn */,
-	{  0x12B1,  0x12B1} /* Cn */, {  0x12B6,  0x12B7} /* Cn */,
-	{  0x12BF,  0x12BF} /* Cn */, {  0x12C1,  0x12C1} /* Cn */,
-	{  0x12C6,  0x12C7} /* Cn */, {  0x12D7,  0x12D7} /* Cn */,
-	{  0x1311,  0x1311} /* Cn */, {  0x1316,  0x1317} /* Cn */,
-	{  0x135B,  0x135E} /* Cn */, {  0x137D,  0x137F} /* Cn */,
-	{  0x139A,  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,  0x197F} /* Cn */, {  0x19AA,  0x19AF} /* Cn */,
-	{  0x19CA,  0x19CF} /* Cn */, {  0x19DA,  0x19DD} /* Cn */,
-	{  0x1A1C,  0x1A1D} /* Cn */, {  0x1A20,  0x1AFF} /* Cn */,
-	{  0x1B4C,  0x1B4F} /* Cn */, {  0x1B7D,  0x1CFF} /* Cn */,
-	{  0x1DCB,  0x1DFD} /* 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 */,
-	{  0x2060,  0x2063} /* Cf */,
-	{  0x2064,  0x2069} /* Cn */,
-	{  0x206A,  0x206F} /* Cf */,
-	{  0x2072,  0x2073} /* Cn */, {  0x208F,  0x208F} /* Cn */,
-	{  0x2095,  0x209F} /* Cn */, {  0x20B6,  0x20CF} /* Cn */,
-	{  0x20F0,  0x20FF} /* Cn */, {  0x214F,  0x2152} /* Cn */,
-	{  0x2185,  0x218F} /* Cn */, {  0x23E8,  0x23FF} /* Cn */,
-	{  0x2427,  0x243F} /* Cn */, {  0x244B,  0x245F} /* Cn */,
-	{  0x269D,  0x269F} /* Cn */, {  0x26B3,  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,  0x27BF} /* Cn */, {  0x27CB,  0x27CF} /* Cn */,
-	{  0x27EC,  0x27EF} /* Cn */, {  0x2B1B,  0x2B1F} /* Cn */,
-	{  0x2B24,  0x2BFF} /* Cn */, {  0x2C2F,  0x2C2F} /* Cn */,
-	{  0x2C5F,  0x2C5F} /* Cn */, {  0x2C6D,  0x2C73} /* Cn */,
-	{  0x2C78,  0x2C7F} /* Cn */, {  0x2CEB,  0x2CF8} /* Cn */,
-	{  0x2D26,  0x2D2F} /* Cn */, {  0x2D66,  0x2D6E} /* Cn */,
-	{  0x2D70,  0x2D7F} /* Cn */, {  0x2D97,  0x2D9F} /* Cn */,
-	{  0x2DA7,  0x2DA7} /* Cn */, {  0x2DAF,  0x2DAF} /* Cn */,
-	{  0x2DB7,  0x2DB7} /* Cn */, {  0x2DBF,  0x2DBF} /* Cn */,
-	{  0x2DC7,  0x2DC7} /* Cn */, {  0x2DCF,  0x2DCF} /* Cn */,
-	{  0x2DD7,  0x2DD7} /* Cn */, {  0x2DDF,  0x2DFF} /* Cn */,
-	{  0x2E18,  0x2E1B} /* Cn */, {  0x2E1E,  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,  0x31BF} /* Cn */,
-	{  0x31D0,  0x31EF} /* Cn */, {  0x321F,  0x321F} /* Cn */,
-	{  0x3244,  0x324F} /* Cn */, {  0x32FF,  0x32FF} /* Cn */,
-	{  0x4DB6,  0x4DBF} /* Cn */, {  0x9FBC,  0x9FFF} /* Cn */,
-	{  0xA48D,  0xA48F} /* Cn */, {  0xA4C7,  0xA6FF} /* Cn */,
-	{  0xA71B,  0xA71F} /* Cn */, {  0xA722,  0xA7FF} /* Cn */,
-	{  0xA82C,  0xA83F} /* Cn */, {  0xA878,  0xABFF} /* Cn */,
-	{  0xD7A4,  0xD7FF} /* Cn */,
-	{  0xD800,  0xDFFF} /* Cs */,
-	{  0xE000,  0xF8FF} /* Co */,
-	{  0xFA2E,  0xFA2F} /* Cn */, {  0xFA6B,  0xFA6F} /* Cn */,
-	{  0xFADA,  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 */, {  0xFE1A,  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 */,
-	{ 0x1018B, 0x102FF} /* Cn */, { 0x1031F, 0x1031F} /* Cn */,
-	{ 0x10324, 0x1032F} /* Cn */, { 0x1034B, 0x1037F} /* Cn */,
-	{ 0x1039E, 0x1039E} /* Cn */, { 0x103C4, 0x103C7} /* Cn */,
-	{ 0x103D6, 0x103FF} /* Cn */,
-	{ 0x1049E, 0x1049F} /* Cn */, { 0x104AA, 0x107FF} /* Cn */,
-	{ 0x10806, 0x10807} /* Cn */, { 0x10809, 0x10809} /* Cn */,
-	{ 0x10836, 0x10836} /* Cn */, { 0x10839, 0x1083B} /* Cn */,
-	{ 0x1083D, 0x1083E} /* Cn */, { 0x10840, 0x108FF} /* Cn */,
-	{ 0x1091A, 0x1091E} /* Cn */, { 0x10920, 0x109FF} /* Cn */,
-	{ 0x10A04, 0x10A04} /* Cn */, { 0x10A07, 0x10A0B} /* Cn */,
-	{ 0x10A14, 0x10A14} /* Cn */, { 0x10A18, 0x10A18} /* Cn */,
-	{ 0x10A34, 0x10A37} /* Cn */, { 0x10A3B, 0x10A3E} /* Cn */,
-	{ 0x10A48, 0x10A4F} /* Cn */, { 0x10A59, 0x11FFF} /* Cn */,
-	{ 0x1236F, 0x123FF} /* Cn */, { 0x12463, 0x1246F} /* Cn */,
-	{ 0x12474, 0x1CFFF} /* Cn */, { 0x1D0F6, 0x1D0FF} /* Cn */,
-	{ 0x1D127, 0x1D129} /* Cn */,
-	{ 0x1D173, 0x1D17A} /* Cf */,
-	{ 0x1D1DE, 0x1D1FF} /* Cn */, { 0x1D246, 0x1D2FF} /* Cn */,
-	{ 0x1D357, 0x1D35F} /* Cn */, { 0x1D372, 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 */,
-	{ 0x1D6A6, 0x1D6A7} /* Cn */, { 0x1D7CC, 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
- * Unassigned code points may be included when they allow ranges to be merged.
- * Last synched with
- *	<http://www.unicode.org/Public/5.0.0/ucd/EastAsianWidth-5.0.0d2.txt>
- *	dated 2005-11-08T01:32:56Z
- */
-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,  0x9FBB} /* W */, {  0xA000,  0xA4C6} /* W */,
-	{  0xAC00,  0xD7A3} /* W */, {  0xF900,  0xFAD9} /* W */,
-	{  0xFE10,  0xFE19} /* W */, {  0xFE30,  0xFE6B} /* W */,
-	{  0xFF01,  0xFF60} /* F */, {  0xFFE0,  0xFFE6} /* F */,
-	{ 0x20000, 0x2FFFD} /* W */, { 0x30000, 0x3FFFD} /* W */,
-};
-
 	static int
-is_in_table(ch, table, tsize)
+is_in_table(ch, table)
 	LWCHAR ch;
-	struct wchar_range table[];
-	int tsize;
+	struct wchar_range_table *table;
 {
 	int hi;
 	int lo;
 
 	/* Binary search in the table. */
-	if (ch < table[0].first)
+	if (ch < table->table[0].first)
 		return 0;
 	lo = 0;
-	hi = tsize - 1;
+	hi = table->count - 1;
 	while (lo <= hi)
 	{
 		int mid = (lo + hi) / 2;
-		if (ch > table[mid].last)
+		if (ch > table->table[mid].last)
 			lo = mid + 1;
-		else if (ch < table[mid].first)
+		else if (ch < table->table[mid].first)
 			hi = mid - 1;
 		else
 			return 1;
@@ -1126,7 +792,8 @@
 is_composing_char(ch)
 	LWCHAR ch;
 {
-	return is_in_table(ch, comp_table, (sizeof(comp_table) / sizeof(*comp_table)));
+	return is_in_table(ch, &compose_table) ||
+	       (bs_mode != BS_CONTROL && is_in_table(ch, &fmt_table));
 }
 
 /*
@@ -1136,7 +803,21 @@
 is_ubin_char(ch)
 	LWCHAR ch;
 {
-	return is_in_table(ch, ubin_table, (sizeof(ubin_table) / sizeof(*ubin_table)));
+	int ubin = is_in_table(ch, &ubin_table) ||
+	           (bs_mode == BS_CONTROL && is_in_table(ch, &fmt_table));
+#if MSDOS_COMPILER==WIN32C
+	if (!ubin && utf_mode == 2 && ch < 0x10000)
+	{
+		/*
+		 * Consider it binary if it can't be converted.
+		 */
+		BOOL used_default = TRUE;
+		WideCharToMultiByte(GetConsoleOutputCP(), WC_NO_BEST_FIT_CHARS, (LPCWSTR) &ch, 1, NULL, 0, NULL, &used_default);
+		if (used_default)
+			ubin = 1;
+	}
+#endif
+	return ubin;
 }
 
 /*
@@ -1146,7 +827,7 @@
 is_wide_char(ch)
 	LWCHAR ch;
 {
-	return is_in_table(ch, wide_table, (sizeof(wide_table) / sizeof(*wide_table)));
+	return is_in_table(ch, &wide_table);
 }
 
 /*

Modified: vendor/less/dist/charset.h
===================================================================
--- vendor/less/dist/charset.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/charset.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/cmd.h
===================================================================
--- vendor/less/dist/cmd.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/cmd.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -8,126 +8,131 @@
  */
 
 
-#define	MAX_USERCMD		1000
-#define	MAX_CMDLEN		16
+#define MAX_USERCMD            1000
+#define MAX_CMDLEN             16
 
-#define	A_B_LINE		2
-#define	A_B_SCREEN		3
-#define	A_B_SCROLL		4
-#define	A_B_SEARCH		5
-#define	A_DIGIT			6
-#define	A_DISP_OPTION		7
-#define	A_DEBUG			8
-#define	A_EXAMINE		9
-#define	A_FIRSTCMD		10
-#define	A_FREPAINT		11
-#define	A_F_LINE		12
-#define	A_F_SCREEN		13
-#define	A_F_SCROLL		14
-#define	A_F_SEARCH		15
-#define	A_GOEND			16
-#define	A_GOLINE		17
-#define	A_GOMARK		18
-#define	A_HELP			19
-#define	A_NEXT_FILE		20
-#define	A_PERCENT		21
-#define	A_PREFIX		22
-#define	A_PREV_FILE		23
-#define	A_QUIT			24
-#define	A_REPAINT		25
-#define	A_SETMARK		26
-#define	A_SHELL			27
-#define	A_STAT			28
-#define	A_FF_LINE		29
-#define	A_BF_LINE		30
-#define	A_VERSION		31
-#define	A_VISUAL		32
-#define	A_F_WINDOW		33
-#define	A_B_WINDOW		34
-#define	A_F_BRACKET		35
-#define	A_B_BRACKET		36
-#define	A_PIPE			37
-#define	A_INDEX_FILE		38
-#define	A_UNDO_SEARCH		39
-#define	A_FF_SCREEN		40
-#define	A_LSHIFT		41
-#define	A_RSHIFT		42
-#define	A_AGAIN_SEARCH		43
-#define	A_T_AGAIN_SEARCH	44
-#define	A_REVERSE_SEARCH	45
-#define	A_T_REVERSE_SEARCH	46
-#define	A_OPT_TOGGLE		47
-#define	A_OPT_SET		48
-#define	A_OPT_UNSET		49
-#define	A_F_FOREVER		50
-#define	A_GOPOS			51
-#define	A_REMOVE_FILE		52
-#define	A_NEXT_TAG		53
-#define	A_PREV_TAG		54
-#define	A_FILTER		55
-#define	A_F_UNTIL_HILITE	56
+#define A_B_LINE               2
+#define A_B_SCREEN             3
+#define A_B_SCROLL             4
+#define A_B_SEARCH             5
+#define A_DIGIT                6
+#define A_DISP_OPTION          7
+#define A_DEBUG                8
+#define A_EXAMINE              9
+#define A_FIRSTCMD             10
+#define A_FREPAINT             11
+#define A_F_LINE               12
+#define A_F_SCREEN             13
+#define A_F_SCROLL             14
+#define A_F_SEARCH             15
+#define A_GOEND                16
+#define A_GOLINE               17
+#define A_GOMARK               18
+#define A_HELP                 19
+#define A_NEXT_FILE            20
+#define A_PERCENT              21
+#define A_PREFIX               22
+#define A_PREV_FILE            23
+#define A_QUIT                 24
+#define A_REPAINT              25
+#define A_SETMARK              26
+#define A_SHELL                27
+#define A_STAT                 28
+#define A_FF_LINE              29
+#define A_BF_LINE              30
+#define A_VERSION              31
+#define A_VISUAL               32
+#define A_F_WINDOW             33
+#define A_B_WINDOW             34
+#define A_F_BRACKET            35
+#define A_B_BRACKET            36
+#define A_PIPE                 37
+#define A_INDEX_FILE           38
+#define A_UNDO_SEARCH          39
+#define A_FF_SCREEN            40
+#define A_LSHIFT               41
+#define A_RSHIFT               42
+#define A_AGAIN_SEARCH         43
+#define A_T_AGAIN_SEARCH       44
+#define A_REVERSE_SEARCH       45
+#define A_T_REVERSE_SEARCH     46
+#define A_OPT_TOGGLE           47
+#define A_OPT_SET              48
+#define A_OPT_UNSET            49
+#define A_F_FOREVER            50
+#define A_GOPOS                51
+#define A_REMOVE_FILE          52
+#define A_NEXT_TAG             53
+#define A_PREV_TAG             54
+#define A_FILTER               55
+#define A_F_UNTIL_HILITE       56
+#define A_GOEND_BUF            57
+#define A_LLSHIFT              58
+#define A_RRSHIFT              59
+#define A_CLRMARK              62
+#define A_SETMARKBOT           63
 
-#define	A_INVALID		100
-#define	A_NOACTION		101
-#define	A_UINVALID		102
-#define	A_END_LIST		103
-#define	A_SPECIAL_KEY		104
+#define A_INVALID              100
+#define A_NOACTION             101
+#define A_UINVALID             102
+#define A_END_LIST             103
+#define A_SPECIAL_KEY          104
 
-#define A_SKIP			127
+#define A_SKIP                 127
 
-#define	A_EXTRA			0200
+#define A_EXTRA                0200
 
 
 /* Line editing characters */
 
-#define	EC_BACKSPACE	1
-#define	EC_LINEKILL	2
-#define	EC_RIGHT	3
-#define	EC_LEFT		4
-#define	EC_W_LEFT	5
-#define	EC_W_RIGHT	6
-#define	EC_INSERT 	7
-#define	EC_DELETE	8
-#define	EC_HOME		9
-#define	EC_END		10
-#define	EC_W_BACKSPACE	11
-#define	EC_W_DELETE	12
-#define	EC_UP		13
-#define	EC_DOWN		14
-#define	EC_EXPAND	15
-#define	EC_F_COMPLETE	17
-#define	EC_B_COMPLETE	18
-#define	EC_LITERAL	19
-#define	EC_ABORT	20
+#define EC_BACKSPACE           1
+#define EC_LINEKILL            2
+#define EC_RIGHT               3
+#define EC_LEFT                4
+#define EC_W_LEFT              5
+#define EC_W_RIGHT             6
+#define EC_INSERT              7
+#define EC_DELETE              8
+#define EC_HOME                9
+#define EC_END                 10
+#define EC_W_BACKSPACE         11
+#define EC_W_DELETE            12
+#define EC_UP                  13
+#define EC_DOWN                14
+#define EC_EXPAND              15
+#define EC_F_COMPLETE          17
+#define EC_B_COMPLETE          18
+#define EC_LITERAL             19
+#define EC_ABORT               20
 
-#define	EC_NOACTION	101
-#define	EC_UINVALID	102
+#define EC_NOACTION            101
+#define EC_UINVALID            102
 
 /* Flags for editchar() */
-#define	EC_PEEK		01
-#define	EC_NOHISTORY	02
-#define	EC_NOCOMPLETE	04
-#define	EC_NORIGHTLEFT	010
+#define EC_PEEK                01
+#define EC_NOHISTORY           02
+#define EC_NOCOMPLETE          04
+#define EC_NORIGHTLEFT         010
 
 /* Environment variable stuff */
-#define	EV_OK		01
+#define EV_OK                  01
 
 /* Special keys (keys which output different strings on different terminals) */
-#define SK_SPECIAL_KEY		CONTROL('K')
-#define SK_RIGHT_ARROW		1
-#define SK_LEFT_ARROW		2
-#define SK_UP_ARROW		3
-#define SK_DOWN_ARROW		4
-#define SK_PAGE_UP		5
-#define SK_PAGE_DOWN		6
-#define SK_HOME			7
-#define SK_END			8
-#define SK_DELETE		9
-#define SK_INSERT		10
-#define SK_CTL_LEFT_ARROW	11
-#define SK_CTL_RIGHT_ARROW	12
-#define SK_CTL_DELETE		13
-#define SK_F1			14
-#define SK_BACKTAB		15
-#define SK_CTL_BACKSPACE	16
-#define SK_CONTROL_K		40
+#define SK_SPECIAL_KEY         CONTROL('K')
+#define SK_RIGHT_ARROW         1
+#define SK_LEFT_ARROW          2
+#define SK_UP_ARROW            3
+#define SK_DOWN_ARROW          4
+#define SK_PAGE_UP             5
+#define SK_PAGE_DOWN           6
+#define SK_HOME                7
+#define SK_END                 8
+#define SK_DELETE              9
+#define SK_INSERT              10
+#define SK_CTL_LEFT_ARROW      11
+#define SK_CTL_RIGHT_ARROW     12
+#define SK_CTL_DELETE          13
+#define SK_F1                  14
+#define SK_BACKTAB             15
+#define SK_CTL_BACKSPACE       16
+#define SK_CONTROL_K           40

Modified: vendor/less/dist/cmdbuf.c
===================================================================
--- vendor/less/dist/cmdbuf.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/cmdbuf.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -40,7 +40,7 @@
 static char *tk_text;
 static char *tk_original;
 static char *tk_ipoint;
-static char *tk_trial;
+static char *tk_trial = NULL;
 static struct textlist tk_tlist;
 #endif
 
@@ -76,25 +76,25 @@
  */
 struct mlist mlist_search =  
 	{ &mlist_search,  &mlist_search,  &mlist_search,  NULL, 0 };
-public void * constant ml_search = (void *) &mlist_search;
+public void *ml_search = (void *) &mlist_search;
 
 struct mlist mlist_examine = 
 	{ &mlist_examine, &mlist_examine, &mlist_examine, NULL, 0 };
-public void * constant ml_examine = (void *) &mlist_examine;
+public void *ml_examine = (void *) &mlist_examine;
 
 #if SHELL_ESCAPE || PIPEC
 struct mlist mlist_shell =   
 	{ &mlist_shell,   &mlist_shell,   &mlist_shell,   NULL, 0 };
-public void * constant ml_shell = (void *) &mlist_shell;
+public void *ml_shell = (void *) &mlist_shell;
 #endif
 
 #else /* CMD_HISTORY */
 
 /* If CMD_HISTORY is off, these are just flags. */
-public void * constant ml_search = (void *)1;
-public void * constant ml_examine = (void *)2;
+public void *ml_search = (void *)1;
+public void *ml_examine = (void *)2;
 #if SHELL_ESCAPE || PIPEC
-public void * constant ml_shell = (void *)3;
+public void *ml_shell = (void *)3;
 #endif
 
 #endif /* CMD_HISTORY */
@@ -141,28 +141,26 @@
  */
 	public void
 cmd_putstr(s)
-	char *s;
+	constant char *s;
 {
 	LWCHAR prev_ch = 0;
 	LWCHAR ch;
-	char *endline = s + strlen(s);
+	constant char *endline = s + strlen(s);
 	while (*s != '\0')
 	{
-		char *ns = s;
+		char *ns = (char *) s;
+		int width;
 		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;
-		}
+			width = 1;
+		else if (is_composing_char(ch) || is_combining_char(prev_ch, ch))
+			width = 0;
+		else
+			width = is_wide_char(ch) ? 2 : 1;
+		cmd_col += width;
+		prompt_col += width;
 		prev_ch = ch;
 	}
 }
@@ -187,6 +185,8 @@
 
 /*
  * Common part of cmd_step_right() and cmd_step_left().
+ * {{ Returning pwidth and bswidth separately is a historical artifact
+ *    since they're always the same. Maybe clean this up someday. }}
  */
 	static char *
 cmd_step_common(p, ch, len, pwidth, bswidth)
@@ -197,58 +197,32 @@
 	int *bswidth;
 {
 	char *pr;
+	int width;
 
 	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;
-		}
+		width = (int) strlen(pr);
 	} else
 	{
 		pr = prutfchar(ch);
-		if (pwidth != NULL || bswidth != NULL)
+		if (is_composing_char(ch))
+			width = 0;
+		else if (is_ubin_char(ch))
+			width = (int) strlen(pr);
+		else
 		{
-			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;
-				}
-			}
+			LWCHAR prev_ch = step_char(&p, -1, cmdbuf);
+			if (is_combining_char(prev_ch, ch))
+				width = 0;
+			else
+				width = is_wide_char(ch) ? 2 : 1;
 		}
 	}
-
+	if (pwidth != NULL)
+		*pwidth	= width;
+	if (bswidth != NULL)
+		*bswidth = width;
 	return (pr);
 }
 
@@ -288,7 +262,7 @@
  */
 	static void
 cmd_repaint(old_cp)
-	char *old_cp;
+	constant char *old_cp;
 {
 	/*
 	 * Repaint the line from the current position.
@@ -375,7 +349,7 @@
 		s = ns;
 	}
 
-	cmd_offset = s - cmdbuf;
+	cmd_offset = (int) (s - cmdbuf);
 	save_cp = cp;
 	cmd_home();
 	cmd_repaint(save_cp);
@@ -405,7 +379,7 @@
 		cols += width;
 	}
 
-	cmd_offset = s - cmdbuf;
+	cmd_offset = (int) (s - cmdbuf);
 	save_cp = cp;
 	cmd_home();
 	cmd_repaint(save_cp);
@@ -453,8 +427,9 @@
 cmd_left()
 {
 	char *ncp;
-	int width, bswidth;
-	
+	int width = 0;
+	int bswidth = 0;
+
 	if (cp <= cmdbuf)
 	{
 		/* Already at the beginning of the line */
@@ -519,7 +494,7 @@
 	static int
 cmd_erase()
 {
-	register char *s;
+	char *s;
 	int clen;
 
 	if (cp == cmdbuf)
@@ -535,7 +510,7 @@
 	 */
 	s = cp;
 	cmd_left();
-	clen = s - cp;
+	clen = (int) (s - cp);
 
 	/*
 	 * Remove the char from the buffer (shift the buffer left).
@@ -687,7 +662,7 @@
 cmd_updown(action)
 	int action;
 {
-	char *s;
+	constant char *s;
 	struct mlist *ml;
 	
 	if (curr_mlist == NULL)
@@ -701,7 +676,7 @@
 
 	if (updown_match < 0)
 	{
-		updown_match = cp - cmdbuf;
+		updown_match = (int) (cp - cmdbuf);
 	}
 
 	/*
@@ -744,12 +719,13 @@
 #endif
 
 /*
- * Add a string to a history list.
+ * Add a string to an mlist.
  */
 	public void
-cmd_addhist(mlist, cmd)
+cmd_addhist(mlist, cmd, modified)
 	struct mlist *mlist;
-	char *cmd;
+	constant char *cmd;
+	int modified;
 {
 #if CMD_HISTORY
 	struct mlist *ml;
@@ -773,6 +749,7 @@
 		 */
 		ml = (struct mlist *) ecalloc(1, sizeof(struct mlist));
 		ml->string = save(cmd);
+		ml->modified = modified;
 		ml->next = mlist;
 		ml->prev = mlist->prev;
 		mlist->prev->next = ml;
@@ -799,7 +776,7 @@
 	 */
 	if (curr_mlist == NULL)
 		return;
-	cmd_addhist(curr_mlist, cmdbuf);
+	cmd_addhist(curr_mlist, cmdbuf, 1);
 	curr_mlist->modified = 1;
 #endif
 }
@@ -964,8 +941,8 @@
 	char *p;
 	int delim_quoted = 0;
 	int meta_quoted = 0;
-	char *esc = get_meta_escape();
-	int esclen = strlen(esc);
+	constant char *esc = get_meta_escape();
+	int esclen = (int) strlen(esc);
 #endif
 	
 	/*
@@ -1247,6 +1224,13 @@
 			*cmd_mbc_buf = c;
 			if (IS_ASCII_OCTET(c))
 				cmd_mbc_buf_len = 1;
+#if MSDOS_COMPILER || OS2
+			else if (c == (unsigned char) '\340' && IS_ASCII_OCTET(peekcc()))
+			{
+				/* Assume a special key. */
+				cmd_mbc_buf_len = 1;
+			}
+#endif
 			else if (IS_UTF8_LEAD(c))
 			{
 				cmd_mbc_buf_len = utf_len(c);
@@ -1262,7 +1246,7 @@
 			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))
+			if (!is_utf8_well_formed(cmd_mbc_buf, cmd_mbc_buf_index))
 			{
 				/* complete, but not well formed (non-shortest form), sequence */
 				cmd_mbc_buf_len = 0;
@@ -1359,6 +1343,18 @@
 
 #if CMD_HISTORY
 /*
+ */
+	static int
+mlist_size(ml)
+	struct mlist *ml;
+{
+	int size = 0;
+	for (ml = ml->next;  ml->string != NULL;  ml = ml->next)
+		++size;
+	return size;
+}
+
+/*
  * Get the name of the history file.
  */
 	static char *
@@ -1378,6 +1374,10 @@
 		return (save(name));
 	}
 
+	/* See if history file is disabled in the build. */
+	if (strcmp(LESSHISTFILE, "") == 0 || strcmp(LESSHISTFILE, "-") == 0)
+		return (NULL);
+
 	/* Otherwise, file is in $HOME. */
 	home = lgetenv("HOME");
 	if (home == NULL || *home == '\0')
@@ -1388,25 +1388,28 @@
 #endif
 			return (NULL);
 	}
-	len = strlen(home) + strlen(LESSHISTFILE) + 2;
+	len = (int) (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.
+ * Read a .lesshst file and call a callback for each line in the file.
  */
-	public void
-init_cmdhist()
+	static void
+read_cmdhist2(action, uparam, skip_search, skip_shell)
+	void (*action)(void*,struct mlist*,char*);
+	void *uparam;
+	int skip_search;
+	int skip_shell;
 {
-#if CMD_HISTORY
 	struct mlist *ml = NULL;
 	char line[CMDBUF_SIZE];
 	char *filename;
 	FILE *f;
 	char *p;
+	int *skip = NULL;
 
 	filename = histfile_name();
 	if (filename == NULL)
@@ -1432,84 +1435,170 @@
 			}
 		}
 		if (strcmp(line, HISTFILE_SEARCH_SECTION) == 0)
+		{
 			ml = &mlist_search;
-		else if (strcmp(line, HISTFILE_SHELL_SECTION) == 0)
+			skip = &skip_search;
+		} else if (strcmp(line, HISTFILE_SHELL_SECTION) == 0)
 		{
 #if SHELL_ESCAPE || PIPEC
 			ml = &mlist_shell;
+			skip = &skip_shell;
 #else
 			ml = NULL;
+			skip = NULL;
 #endif
 		} else if (*line == '"')
 		{
 			if (ml != NULL)
-				cmd_addhist(ml, line+1);
+			{
+				if (skip != NULL && *skip > 0)
+					--(*skip);
+				else
+					(*action)(uparam, ml, line+1);
+			}
 		}
 	}
 	fclose(f);
+}
+
+	static void
+read_cmdhist(action, uparam, skip_search, skip_shell)
+	void (*action)(void*,struct mlist*,char*);
+	void *uparam;
+	int skip_search;
+	int skip_shell;
+{
+	read_cmdhist2(action, uparam, skip_search, skip_shell);
+	(*action)(uparam, NULL, NULL); /* signal end of file */
+}
+
+	static void
+addhist_init(void *uparam, struct mlist *ml, char *string)
+{
+	if (ml == NULL || string == NULL)
+		return;
+	cmd_addhist(ml, string, 0);
+}
 #endif /* CMD_HISTORY */
+
+/*
+ * Initialize history from a .lesshist file.
+ */
+	public void
+init_cmdhist()
+{
+#if CMD_HISTORY
+	read_cmdhist(&addhist_init, NULL, 0, 0);
+#endif /* CMD_HISTORY */
 }
 
 /*
- *
+ * Write the header for a section of the history file.
  */
 #if CMD_HISTORY
 	static void
-save_mlist(ml, f)
+write_mlist_header(ml, f)
 	struct mlist *ml;
 	FILE *f;
 {
-	int histsize = 0;
-	int n;
-	char *s;
+	if (ml == &mlist_search)
+		fprintf(f, "%s\n", HISTFILE_SEARCH_SECTION);
+#if SHELL_ESCAPE || PIPEC
+	else if (ml == &mlist_shell)
+		fprintf(f, "%s\n", HISTFILE_SHELL_SECTION);
+#endif
+}
 
-	s = lgetenv("LESSHISTSIZE");
-	if (s != NULL)
-		histsize = atoi(s);
-	if (histsize == 0)
-		histsize = 100;
-
-	ml = ml->prev;
-	for (n = 0;  n < histsize;  n++)
+/*
+ * Write all modified entries in an mlist to the history file.
+ */
+	static void
+write_mlist(ml, f)
+	struct mlist *ml;
+	FILE *f;
+{
+	for (ml = ml->next;  ml->string != NULL;  ml = ml->next)
 	{
-		if (ml->string == NULL)
-			break;
-		ml = ml->prev;
+		if (!ml->modified)
+			continue;
+		fprintf(f, "\"%s\n", ml->string);
+		ml->modified = 0;
 	}
-	for (ml = ml->next;  ml->string != NULL;  ml = ml->next)
-		fprintf(f, "\"%s\n", ml->string);
+	ml->modified = 0; /* entire mlist is now unmodified */
 }
-#endif /* CMD_HISTORY */
 
 /*
- *
+ * Make a temp name in the same directory as filename.
  */
-	public void
-save_cmdhist()
+	static char *
+make_tempname(filename)
+	char *filename;
 {
-#if CMD_HISTORY
-	char *filename;
-	FILE *f;
-	int modified = 0;
+	char lastch;
+	char *tempname = ecalloc(1, strlen(filename)+1);
+	strcpy(tempname, filename);
+	lastch = tempname[strlen(tempname)-1];
+	tempname[strlen(tempname)-1] = (lastch == 'Q') ? 'Z' : 'Q';
+	return tempname;
+}
 
-	if (mlist_search.modified)
-		modified = 1;
+struct save_ctx
+{
+	struct mlist *mlist;
+	FILE *fout;
+};
+
+/*
+ * Copy entries from the saved history file to a new file.
+ * At the end of each mlist, append any new entries
+ * created during this session.
+ */
+	static void
+copy_hist(void *uparam, struct mlist *ml, char *string)
+{
+	struct save_ctx *ctx = (struct save_ctx *) uparam;
+
+	if (ml != ctx->mlist) {
+		/* We're changing mlists. */
+		if (ctx->mlist)
+			/* Append any new entries to the end of the current mlist. */
+			write_mlist(ctx->mlist, ctx->fout);
+		/* Write the header for the new mlist. */
+		ctx->mlist = ml;
+		write_mlist_header(ctx->mlist, ctx->fout);
+	}
+	if (string != NULL)
+	{
+		/* Copy the entry. */
+		fprintf(ctx->fout, "\"%s\n", string);
+	}
+	if (ml == NULL) /* End of file */
+	{
+		/* Write any sections that were not in the original file. */
+		if (mlist_search.modified)
+		{
+			write_mlist_header(&mlist_search, ctx->fout);
+			write_mlist(&mlist_search, ctx->fout);
+		}
 #if SHELL_ESCAPE || PIPEC
-	if (mlist_shell.modified)
-		modified = 1;
+		if (mlist_shell.modified)
+		{
+			write_mlist_header(&mlist_shell, ctx->fout);
+			write_mlist(&mlist_shell, ctx->fout);
+		}
 #endif
-	if (!modified)
-		return;
-	filename = histfile_name();
-	if (filename == NULL)
-		return;
-	f = fopen(filename, "w");
-	free(filename);
-	if (f == NULL)
-		return;
+	}
+}
+#endif /* CMD_HISTORY */
+
+/*
+ * Make a file readable only by its owner.
+ */
+	static void
+make_file_private(f)
+	FILE *f;
+{
 #if HAVE_FCHMOD
-{
-	/* Make history file readable only by owner. */
 	int do_chmod = 1;
 #if HAVE_STAT
 	struct stat statbuf;
@@ -1520,19 +1609,74 @@
 #endif
 	if (do_chmod)
 		fchmod(fileno(f), 0600);
+#endif
 }
+
+/*
+ * Does the history file need to be updated?
+ */
+	static int
+histfile_modified()
+{
+	if (mlist_search.modified)
+		return 1;
+#if SHELL_ESCAPE || PIPEC
+	if (mlist_shell.modified)
+		return 1;
 #endif
+	return 0;
+}
 
-	fprintf(f, "%s\n", HISTFILE_FIRST_LINE);
+/*
+ * Update the .lesshst file.
+ */
+	public void
+save_cmdhist()
+{
+#if CMD_HISTORY
+	char *histname;
+	char *tempname;
+	int skip_search;
+	int skip_shell;
+	struct save_ctx ctx;
+	char *s;
+	FILE *fout = NULL;
+	int histsize = 0;
 
-	fprintf(f, "%s\n", HISTFILE_SEARCH_SECTION);
-	save_mlist(&mlist_search, f);
-
+	if (!histfile_modified())
+		return;
+	histname = histfile_name();
+	if (histname == NULL)
+		return;
+	tempname = make_tempname(histname);
+	fout = fopen(tempname, "w");
+	if (fout != NULL)
+	{
+		make_file_private(fout);
+		s = lgetenv("LESSHISTSIZE");
+		if (s != NULL)
+			histsize = atoi(s);
+		if (histsize <= 0)
+			histsize = 100;
+		skip_search = mlist_size(&mlist_search) - histsize;
 #if SHELL_ESCAPE || PIPEC
-	fprintf(f, "%s\n", HISTFILE_SHELL_SECTION);
-	save_mlist(&mlist_shell, f);
+		skip_shell = mlist_size(&mlist_shell) - histsize;
 #endif
-
-	fclose(f);
+		fprintf(fout, "%s\n", HISTFILE_FIRST_LINE);
+		ctx.fout = fout;
+		ctx.mlist = NULL;
+		read_cmdhist(copy_hist, &ctx, skip_search, skip_shell);
+		fclose(fout);
+#if MSDOS_COMPILER==WIN32C
+		/*
+		 * Windows rename doesn't remove an existing file,
+		 * making it useless for atomic operations. Sigh.
+		 */
+		remove(histname);
+#endif
+		rename(tempname, histname);
+	}
+	free(tempname);
+	free(histname);
 #endif /* CMD_HISTORY */
 }

Modified: vendor/less/dist/command.c
===================================================================
--- vendor/less/dist/command.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/command.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,6 @@
+/* $FreeBSD: stable/10/contrib/less/command.c 330571 2018-03-07 06:39:00Z delphij $ */
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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 +27,7 @@
 extern int squished;
 extern int sc_width;
 extern int sc_height;
+extern char *kent;
 extern int swindow;
 extern int jump_sline;
 extern int quitting;
@@ -34,17 +36,21 @@
 extern int ignore_eoi;
 extern int secure;
 extern int hshift;
+extern int bs_mode;
 extern int show_attn;
+extern int less_is_more;
+extern int status_col;
 extern POSITION highest_hilite;
+extern POSITION start_attnpos;
+extern POSITION end_attnpos;
 extern char *every_first_cmd;
-extern char *curr_altfilename;
 extern char version[];
 extern struct scrpos initial_scrpos;
 extern IFILE curr_ifile;
-extern void constant *ml_search;
-extern void constant *ml_examine;
+extern void *ml_search;
+extern void *ml_examine;
 #if SHELL_ESCAPE || PIPEC
-extern void constant *ml_shell;
+extern void *ml_shell;
 #endif
 #if EDITOR
 extern char *editor;
@@ -68,16 +74,17 @@
 static int optgetname;
 static POSITION bottompos;
 static int save_hshift;
+static int save_bs_mode;
 #if PIPEC
 static char pipec;
 #endif
 
+/* Stack of ungotten chars (via ungetcc) */
 struct ungot {
 	struct ungot *ug_next;
-	char ug_char;
+	LWCHAR ug_char;
 };
 static struct ungot* ungot = NULL;
-static int unget_end = 0;
 
 static void multi_search();
 
@@ -89,9 +96,7 @@
 	static void
 cmd_exec()
 {
-#if HILITE_SEARCH
-	clear_attn();
-#endif
+    clear_attn();
 	clear_bot();
 	flush();
 }
@@ -103,7 +108,7 @@
 start_mca(action, prompt, mlist, cmdflags)
 	int action;
 	constant char *prompt;
-	constant void *mlist;
+	void *mlist;
 	int cmdflags;
 {
 	mca = action;
@@ -158,6 +163,7 @@
 		cmd_putstr("/");
 	else
 		cmd_putstr("?");
+	forw_prompt = 0;
 	set_mlist(ml_search, 0);
 }
 
@@ -192,6 +198,7 @@
 		cmd_putstr("!");
 		break;
 	}
+	forw_prompt = 0;
 	set_mlist(NULL, 0);
 }
 
@@ -201,7 +208,7 @@
 	static void
 exec_mca()
 {
-	register char *cbuf;
+	char *cbuf;
 
 	cmd_exec();
 	cbuf = get_cmdbuf();
@@ -210,7 +217,7 @@
 	{
 	case A_F_SEARCH:
 	case A_B_SEARCH:
-		multi_search(cbuf, (int) number);
+		multi_search(cbuf, (int) number, 0);
 		break;
 #if HILITE_SEARCH
 	case A_FILTER:
@@ -296,11 +303,21 @@
 }
 
 /*
+ * Is a character a carriage return or newline?
+ */
+	static int
+is_newline_char(c)
+	int c;
+{
+	return (c == '\n' || c == '\r');
+}
+
+/*
  * Handle the first char of an option (after the initial dash).
  */
 	static int
 mca_opt_first_char(c)
-    int c;
+	int c;
 {
 	int flag = (optflag & ~OPT_NO_PROMPT);
 	if (flag == OPT_NO_TOGGLE)
@@ -420,7 +437,7 @@
 	if (optgetname)
 	{
 		/* We're getting a long option name.  */
-		if (c != '\n' && c != '\r')
+		if (!is_newline_char(c))
 			return (mca_opt_nonfirst_char(c));
 		if (curropt == NULL)
 		{
@@ -484,13 +501,17 @@
 
 	switch (c)
 	{
+	case '*':
+		if (less_is_more)
+			break;
 	case CONTROL('E'): /* ignore END of file */
-	case '*':
 		if (mca != A_FILTER)
 			flag = SRCH_PAST_EOF;
 		break;
+	case '@':
+		if (less_is_more)
+			break;
 	case CONTROL('F'): /* FIRST file */
-	case '@':
 		if (mca != A_FILTER)
 			flag = SRCH_FIRST_FILE;
 		break;
@@ -584,7 +605,7 @@
 	/*
 	 * The multichar command is terminated by a newline.
 	 */
-	if (c == '\n' || c == '\r')
+	if (is_newline_char(c))
 	{
 		/*
 		 * Execute the command.
@@ -680,9 +701,9 @@
 	static void
 prompt()
 {
-	register constant char *p;
+	constant char *p;
 
-	if (ungot != NULL)
+	if (ungot != NULL && ungot->ug_char != CHAR_END_COMMAND)
 	{
 		/*
 		 * No prompt necessary if commands are from 
@@ -764,76 +785,118 @@
 }
 
 /*
+ * Return a character to complete a partial command, if possible.
+ */
+	static LWCHAR
+getcc_end_command()
+{
+	switch (mca)
+	{
+	case A_DIGIT:
+		/* We have a number but no command.  Treat as #g. */
+		return ('g');
+	case A_F_SEARCH:
+	case A_B_SEARCH:
+		/* We have "/string" but no newline.  Add the \n. */
+		return ('\n'); 
+	default:
+		/* Some other incomplete command.  Let user complete it. */
+		return (getchr());
+	}
+}
+
+/*
  * Get command character.
  * The character normally comes from the keyboard,
  * but may come from ungotten characters
  * (characters previously given to ungetcc or ungetsc).
  */
-	public int
-getcc()
+	static LWCHAR
+getccu(VOID_PARAM)
 {
-	if (unget_end) 
-	{
-		/*
-		 * We have just run out of ungotten chars.
-		 */
-		unget_end = 0;
-		if (len_cmdbuf() == 0 || !empty_screen())
-			return (getchr());
-		/*
-		 * Command is incomplete, so try to complete it.
-		 */
-		switch (mca)
-		{
-		case A_DIGIT:
-			/*
-			 * We have a number but no command.  Treat as #g.
-			 */
-			return ('g');
-
-		case A_F_SEARCH:
-		case A_B_SEARCH:
-			/*
-			 * We have "/string" but no newline.  Add the \n.
-			 */
-			return ('\n'); 
-
-		default:
-			/*
-			 * Some other incomplete command.  Let user complete it.
-			 */
-			return (getchr());
-		}
-	}
-
+	LWCHAR c;
 	if (ungot == NULL)
 	{
-		/*
-		 * Normal case: no ungotten chars, so get one from the user.
-		 */
-		return (getchr());
-	}
-
-	/*
-	 * Return the next ungotten char.
-	 */
+		/* Normal case: no ungotten chars.
+		 * Get char from the user. */
+		c = getchr();
+	} else
 	{
+		/* Ungotten chars available:
+		 * Take the top of stack (most recent). */
 		struct ungot *ug = ungot;
-		char c = ug->ug_char;
+		c = ug->ug_char;
 		ungot = ug->ug_next;
 		free(ug);
-		unget_end = (ungot == NULL);
-		return (c);
+
+		if (c == CHAR_END_COMMAND)
+			c = getcc_end_command();
 	}
+	return (c);
 }
 
 /*
+ * Get a command character, but if we receive the orig sequence,
+ * convert it to the repl sequence.
+ */
+	static LWCHAR
+getcc_repl(orig, repl, gr_getc, gr_ungetc)
+	char const* orig;
+	char const* repl;
+	LWCHAR (*gr_getc)(VOID_PARAM);
+	void (*gr_ungetc)(LWCHAR);
+{
+	LWCHAR c;
+	LWCHAR keys[16];
+	int ki = 0;
+
+	c = (*gr_getc)();
+	if (orig == NULL || orig[0] == '\0')
+		return c;
+	for (;;)
+	{
+		keys[ki] = c;
+		if (c != orig[ki] || ki >= sizeof(keys)-1)
+		{
+			/* This is not orig we have been receiving.
+			 * If we have stashed chars in keys[],
+			 * unget them and return the first one. */
+			while (ki > 0)
+				(*gr_ungetc)(keys[ki--]);
+			return keys[0];
+		}
+		if (orig[++ki] == '\0')
+		{
+			/* We've received the full orig sequence.
+			 * Return the repl sequence. */
+			ki = strlen(repl)-1;
+			while (ki > 0)
+				(*gr_ungetc)(repl[ki--]);
+			return repl[0];
+		}
+		/* We've received a partial orig sequence (ki chars of it).
+		 * Get next char and see if it continues to match orig. */
+		c = (*gr_getc)();
+	}
+}
+
+/*
+ * Get command character.
+ */
+	public int
+getcc()
+{
+    /* Replace kent (keypad Enter) with a newline. */
+    return getcc_repl(kent, "\n", getccu, ungetcc);
+}
+
+/*
  * "Unget" a command character.
  * The next getcc() will return this character.
  */
 	public void
 ungetcc(c)
-	int c;
+	LWCHAR c;
 {
 	struct ungot *ug = (struct ungot *) ecalloc(1, sizeof(struct ungot));
 
@@ -840,7 +903,6 @@
 	ug->ug_char = c;
 	ug->ug_next = ungot;
 	ungot = ug;
-	unget_end = 0;
 }
 
 /*
@@ -851,7 +913,7 @@
 ungetsc(s)
 	char *s;
 {
-	register char *p;
+	char *p;
 
 	for (p = s + strlen(s) - 1;  p >= s;  p--)
 		ungetcc(*p);
@@ -858,16 +920,28 @@
 }
 
 /*
+ * Peek the next command character, without consuming it.
+ */
+	public LWCHAR
+peekcc()
+{
+	LWCHAR c = getcc();
+	ungetcc(c);
+	return c;
+}
+
+/*
  * Search for a pattern, possibly in multiple files.
  * If SRCH_FIRST_FILE is set, begin searching at the first file.
  * If SRCH_PAST_EOF is set, continue the search thru multiple files.
  */
 	static void
-multi_search(pattern, n)
+multi_search(pattern, n, silent)
 	char *pattern;
 	int n;
+	int silent;
 {
-	register int nomore;
+	int nomore;
 	IFILE save_ifile;
 	int changed_file;
 
@@ -940,7 +1014,7 @@
 	 * Didn't find it.
 	 * Print an error message if we haven't already.
 	 */
-	if (n > 0)
+	if (n > 0 && !silent)
 		error("Pattern not found", NULL_PARG);
 
 	if (changed_file)
@@ -968,7 +1042,7 @@
 		return (A_NOACTION);
 
 	cmd_exec();
-	jump_forw();
+	jump_forw_buffered();
 	curr_len = ch_length();
 	highest_hilite = until_hilite ? curr_len : NULL_POSITION;
 	ignore_eoi = 1;
@@ -1002,9 +1076,9 @@
 	public void
 commands()
 {
-	register int c;
-	register int action;
-	register char *cbuf;
+	int c;
+	int action;
+	char *cbuf;
 	int newaction;
 	int save_search_type;
 	char *extra;
@@ -1013,7 +1087,6 @@
 	IFILE old_ifile;
 	IFILE new_ifile;
 	char *tagfile;
-	int until_hilite = 0;
 
 	search_type = SRCH_FORW;
 	wscroll = (sc_height + 1) / 2;
@@ -1241,6 +1314,8 @@
 			/*
 			 * Forward forever, ignoring EOF.
 			 */
+			if (show_attn)
+				set_attnpos(bottompos);
 			newaction = forw_loop(0);
 			break;
 
@@ -1326,6 +1401,17 @@
 				jump_back(number);
 			break;
 
+		case A_GOEND_BUF:
+			/*
+			 * Go to line N, default last buffered byte.
+			 */
+			cmd_exec();
+			if (number <= 0)
+				jump_forw_buffered();
+			else
+				jump_back(number);
+			break;
+
 		case A_GOPOS:
 			/*
 			 * Go to a specified byte position in the file.
@@ -1368,6 +1454,7 @@
 				 * previous file.
 				 */
 				hshift = save_hshift;
+				bs_mode = save_bs_mode;
 				if (edit_prev(1) == 0)
 					break;
 			}
@@ -1383,7 +1470,7 @@
 			if (number <= 0) number = 1;	\
 			mca_search();			\
 			cmd_exec();			\
-			multi_search((char *)NULL, (int) number);
+			multi_search((char *)NULL, (int) number, 0);
 
 
 		case A_F_SEARCH:
@@ -1459,6 +1546,9 @@
 			break;
 
 		case A_UNDO_SEARCH:
+			/*
+			 * Clear search string highlighting.
+			 */
 			undo_search();
 			break;
 
@@ -1471,26 +1561,25 @@
 			cmd_exec();
 			save_hshift = hshift;
 			hshift = 0;
+			save_bs_mode = bs_mode;
+			bs_mode = BS_SPECIAL;
 			(void) edit(FAKE_HELPFILE);
 			break;
 
 		case A_EXAMINE:
-#if EXAMINE
 			/*
 			 * Edit a new file.  Get the filename.
 			 */
-			if (secure)
+#if EXAMINE
+			if (!secure)
 			{
-				error("Command not available", NULL_PARG);
-				break;
+				start_mca(A_EXAMINE, "Examine: ", ml_examine, 0);
+				c = getcc();
+				goto again;
 			}
-			start_mca(A_EXAMINE, "Examine: ", ml_examine, 0);
-			c = getcc();
-			goto again;
-#else
+#endif
 			error("Command not available", NULL_PARG);
 			break;
-#endif
 			
 		case A_VISUAL:
 			/*
@@ -1497,38 +1586,35 @@
 			 * Invoke an editor on the input file.
 			 */
 #if EDITOR
-			if (secure)
+			if (!secure)
 			{
-				error("Command not available", NULL_PARG);
+				if (ch_getflags() & CH_HELPFILE)
+					break;
+				if (strcmp(get_filename(curr_ifile), "-") == 0)
+				{
+					error("Cannot edit standard input", NULL_PARG);
+					break;
+				}
+				if (get_altfilename(curr_ifile) != NULL)
+				{
+					error("WARNING: This file was viewed via LESSOPEN",
+						NULL_PARG);
+				}
+				start_mca(A_SHELL, "!", ml_shell, 0);
+				/*
+				 * Expand the editor prototype string
+				 * and pass it to the system to execute.
+				 * (Make sure the screen is displayed so the
+				 * expansion of "+%lm" works.)
+				 */
+				make_display();
+				cmd_exec();
+				lsystem(pr_expand(editproto, 0), (char*)NULL);
 				break;
 			}
-			if (ch_getflags() & CH_HELPFILE)
-				break;
-			if (strcmp(get_filename(curr_ifile), "-") == 0)
-			{
-				error("Cannot edit standard input", NULL_PARG);
-				break;
-			}
-			if (curr_altfilename != NULL)
-			{
-				error("WARNING: This file was viewed via LESSOPEN",
-					NULL_PARG);
-			}
-			start_mca(A_SHELL, "!", ml_shell, 0);
-			/*
-			 * Expand the editor prototype string
-			 * and pass it to the system to execute.
-			 * (Make sure the screen is displayed so the
-			 * expansion of "+%lm" works.)
-			 */
-			make_display();
-			cmd_exec();
-			lsystem(pr_expand(editproto, 0), (char*)NULL);
-			break;
-#else
+#endif
 			error("Command not available", NULL_PARG);
 			break;
-#endif
 
 		case A_NEXT_FILE:
 			/*
@@ -1574,6 +1660,9 @@
 			break;
 
 		case A_NEXT_TAG:
+			/*
+			 * Jump to the next tag in the current tag list.
+			 */
 #if TAGS
 			if (number <= 0)
 				number = 1;
@@ -1583,6 +1672,7 @@
 				error("No next tag", NULL_PARG);
 				break;
 			}
+			cmd_exec();
 			if (edit(tagfile) == 0)
 			{
 				POSITION pos = tagsearch();
@@ -1595,6 +1685,9 @@
 			break;
 
 		case A_PREV_TAG:
+			/*
+			 * Jump to the previous tag in the current tag list.
+			 */
 #if TAGS
 			if (number <= 0)
 				number = 1;
@@ -1604,6 +1697,7 @@
 				error("No previous tag", NULL_PARG);
 				break;
 			}
+			cmd_exec();
 			if (edit(tagfile) == 0)
 			{
 				POSITION pos = tagsearch();
@@ -1626,6 +1720,9 @@
 			break;
 
 		case A_REMOVE_FILE:
+			/*
+			 * Remove a file from the input file list.
+			 */
 			if (ch_getflags() & CH_HELPFILE)
 				break;
 			old_ifile = curr_ifile;
@@ -1644,6 +1741,9 @@
 			break;
 
 		case A_OPT_TOGGLE:
+			/*
+			 * Change the setting of an  option.
+			 */
 			optflag = OPT_TOGGLE;
 			optgetname = FALSE;
 			mca_opt_toggle();
@@ -1652,7 +1752,7 @@
 
 		case A_DISP_OPTION:
 			/*
-			 * Report a flag setting.
+			 * Report the setting of an option.
 			 */
 			optflag = OPT_NO_TOGGLE;
 			optgetname = FALSE;
@@ -1673,41 +1773,50 @@
 			 * Shell escape.
 			 */
 #if SHELL_ESCAPE
-			if (secure)
+			if (!secure)
 			{
-				error("Command not available", NULL_PARG);
-				break;
+				start_mca(A_SHELL, "!", ml_shell, 0);
+				c = getcc();
+				goto again;
 			}
-			start_mca(A_SHELL, "!", ml_shell, 0);
-			c = getcc();
-			goto again;
-#else
+#endif
 			error("Command not available", NULL_PARG);
 			break;
-#endif
 
 		case A_SETMARK:
+		case A_SETMARKBOT:
 			/*
 			 * Set a mark.
 			 */
 			if (ch_getflags() & CH_HELPFILE)
 				break;
-			start_mca(A_SETMARK, "mark: ", (void*)NULL, 0);
+			start_mca(A_SETMARK, "set mark: ", (void*)NULL, 0);
 			c = getcc();
-			if (c == erase_char || c == erase2_char ||
-			    c == kill_char || c == '\n' || c == '\r')
+			if (is_erase_char(c) || is_newline_char(c))
 				break;
-			setmark(c);
+			setmark(c, action == A_SETMARKBOT ? BOTTOM : TOP);
+			repaint();
 			break;
 
+		case A_CLRMARK:
+			/*
+			 * Clear a mark.
+			 */
+			start_mca(A_CLRMARK, "clear mark: ", (void*)NULL, 0);
+			c = getcc();
+			if (is_erase_char(c) || is_newline_char(c))
+				break;
+			clrmark(c);
+			repaint();
+			break;
+
 		case A_GOMARK:
 			/*
-			 * Go to a mark.
+			 * Jump to a marked position.
 			 */
 			start_mca(A_GOMARK, "goto mark: ", (void*)NULL, 0);
 			c = getcc();
-			if (c == erase_char || c == erase2_char ||
-			    c == kill_char || c == '\n' || c == '\r')
+			if (is_erase_char(c) || is_newline_char(c))
 				break;
 			cmd_exec();
 			gomark(c);
@@ -1714,28 +1823,28 @@
 			break;
 
 		case A_PIPE:
+			/*
+			 * Write part of the input to a pipe to a shell command.
+			 */
 #if PIPEC
-			if (secure)
+			if (!secure)
 			{
-				error("Command not available", NULL_PARG);
-				break;
+				start_mca(A_PIPE, "|mark: ", (void*)NULL, 0);
+				c = getcc();
+				if (is_erase_char(c))
+					break;
+				if (is_newline_char(c))
+					c = '.';
+				if (badmark(c))
+					break;
+				pipec = c;
+				start_mca(A_PIPE, "!", ml_shell, 0);
+				c = getcc();
+				goto again;
 			}
-			start_mca(A_PIPE, "|mark: ", (void*)NULL, 0);
-			c = getcc();
-			if (c == erase_char || c == erase2_char || c == kill_char)
-				break;
-			if (c == '\n' || c == '\r')
-				c = '.';
-			if (badmark(c))
-				break;
-			pipec = c;
-			start_mca(A_PIPE, "!", ml_shell, 0);
-			c = getcc();
-			goto again;
-#else
+#endif
 			error("Command not available", NULL_PARG);
 			break;
-#endif
 
 		case A_B_BRACKET:
 		case A_F_BRACKET:
@@ -1744,6 +1853,9 @@
 			goto again;
 
 		case A_LSHIFT:
+			/*
+			 * Shift view left.
+			 */
 			if (number > 0)
 				shift_count = number;
 			else
@@ -1756,6 +1868,9 @@
 			break;
 
 		case A_RSHIFT:
+			/*
+			 * Shift view right.
+			 */
 			if (number > 0)
 				shift_count = number;
 			else
@@ -1765,6 +1880,22 @@
 			screen_trashed = 1;
 			break;
 
+		case A_LLSHIFT:
+			/*
+			 * Shift view left to margin.
+			 */
+			hshift = 0;
+			screen_trashed = 1;
+			break;
+
+		case A_RRSHIFT:
+			/*
+			 * Shift view right to view rightmost char on screen.
+			 */
+			hshift = rrshift();
+			screen_trashed = 1;
+			break;
+
 		case A_PREFIX:
 			/*
 			 * The command is incomplete (more chars are needed).

Added: vendor/less/dist/compose.uni
===================================================================
--- vendor/less/dist/compose.uni	                        (rev 0)
+++ vendor/less/dist/compose.uni	2018-07-06 12:43:09 UTC (rev 11360)
@@ -0,0 +1,325 @@
+/* Generated by "./mkutable -f2 Mn Me Cf -- unicode/UnicodeData.txt" on Tue Jul 25 09:04:35 PDT 2017 */
+	{ 0x00ad, 0x00ad }, /* Cf */
+	{ 0x0300, 0x036f }, /* Mn */
+	{ 0x0483, 0x0487 }, /* Mn */
+	{ 0x0488, 0x0489 }, /* Me */
+	{ 0x0591, 0x05bd }, /* Mn */
+	{ 0x05bf, 0x05bf }, /* Mn */
+	{ 0x05c1, 0x05c2 }, /* Mn */
+	{ 0x05c4, 0x05c5 }, /* Mn */
+	{ 0x05c7, 0x05c7 }, /* Mn */
+	{ 0x0600, 0x0605 }, /* Cf */
+	{ 0x0610, 0x061a }, /* Mn */
+	{ 0x061c, 0x061c }, /* Cf */
+	{ 0x064b, 0x065f }, /* Mn */
+	{ 0x0670, 0x0670 }, /* Mn */
+	{ 0x06d6, 0x06dc }, /* Mn */
+	{ 0x06dd, 0x06dd }, /* Cf */
+	{ 0x06df, 0x06e4 }, /* Mn */
+	{ 0x06e7, 0x06e8 }, /* Mn */
+	{ 0x06ea, 0x06ed }, /* Mn */
+	{ 0x070f, 0x070f }, /* Cf */
+	{ 0x0711, 0x0711 }, /* Mn */
+	{ 0x0730, 0x074a }, /* Mn */
+	{ 0x07a6, 0x07b0 }, /* Mn */
+	{ 0x07eb, 0x07f3 }, /* Mn */
+	{ 0x0816, 0x0819 }, /* Mn */
+	{ 0x081b, 0x0823 }, /* Mn */
+	{ 0x0825, 0x0827 }, /* Mn */
+	{ 0x0829, 0x082d }, /* Mn */
+	{ 0x0859, 0x085b }, /* Mn */
+	{ 0x08d4, 0x08e1 }, /* Mn */
+	{ 0x08e2, 0x08e2 }, /* Cf */
+	{ 0x08e3, 0x0902 }, /* Mn */
+	{ 0x093a, 0x093a }, /* Mn */
+	{ 0x093c, 0x093c }, /* Mn */
+	{ 0x0941, 0x0948 }, /* Mn */
+	{ 0x094d, 0x094d }, /* Mn */
+	{ 0x0951, 0x0957 }, /* Mn */
+	{ 0x0962, 0x0963 }, /* Mn */
+	{ 0x0981, 0x0981 }, /* Mn */
+	{ 0x09bc, 0x09bc }, /* Mn */
+	{ 0x09c1, 0x09c4 }, /* Mn */
+	{ 0x09cd, 0x09cd }, /* Mn */
+	{ 0x09e2, 0x09e3 }, /* Mn */
+	{ 0x0a01, 0x0a02 }, /* Mn */
+	{ 0x0a3c, 0x0a3c }, /* Mn */
+	{ 0x0a41, 0x0a42 }, /* Mn */
+	{ 0x0a47, 0x0a48 }, /* Mn */
+	{ 0x0a4b, 0x0a4d }, /* Mn */
+	{ 0x0a51, 0x0a51 }, /* Mn */
+	{ 0x0a70, 0x0a71 }, /* Mn */
+	{ 0x0a75, 0x0a75 }, /* Mn */
+	{ 0x0a81, 0x0a82 }, /* Mn */
+	{ 0x0abc, 0x0abc }, /* Mn */
+	{ 0x0ac1, 0x0ac5 }, /* Mn */
+	{ 0x0ac7, 0x0ac8 }, /* Mn */
+	{ 0x0acd, 0x0acd }, /* Mn */
+	{ 0x0ae2, 0x0ae3 }, /* Mn */
+	{ 0x0afa, 0x0aff }, /* Mn */
+	{ 0x0b01, 0x0b01 }, /* Mn */
+	{ 0x0b3c, 0x0b3c }, /* Mn */
+	{ 0x0b3f, 0x0b3f }, /* Mn */
+	{ 0x0b41, 0x0b44 }, /* Mn */
+	{ 0x0b4d, 0x0b4d }, /* Mn */
+	{ 0x0b56, 0x0b56 }, /* Mn */
+	{ 0x0b62, 0x0b63 }, /* Mn */
+	{ 0x0b82, 0x0b82 }, /* Mn */
+	{ 0x0bc0, 0x0bc0 }, /* Mn */
+	{ 0x0bcd, 0x0bcd }, /* Mn */
+	{ 0x0c00, 0x0c00 }, /* Mn */
+	{ 0x0c3e, 0x0c40 }, /* Mn */
+	{ 0x0c46, 0x0c48 }, /* Mn */
+	{ 0x0c4a, 0x0c4d }, /* Mn */
+	{ 0x0c55, 0x0c56 }, /* Mn */
+	{ 0x0c62, 0x0c63 }, /* Mn */
+	{ 0x0c81, 0x0c81 }, /* Mn */
+	{ 0x0cbc, 0x0cbc }, /* Mn */
+	{ 0x0cbf, 0x0cbf }, /* Mn */
+	{ 0x0cc6, 0x0cc6 }, /* Mn */
+	{ 0x0ccc, 0x0ccd }, /* Mn */
+	{ 0x0ce2, 0x0ce3 }, /* Mn */
+	{ 0x0d00, 0x0d01 }, /* Mn */
+	{ 0x0d3b, 0x0d3c }, /* Mn */
+	{ 0x0d41, 0x0d44 }, /* Mn */
+	{ 0x0d4d, 0x0d4d }, /* Mn */
+	{ 0x0d62, 0x0d63 }, /* Mn */
+	{ 0x0dca, 0x0dca }, /* Mn */
+	{ 0x0dd2, 0x0dd4 }, /* Mn */
+	{ 0x0dd6, 0x0dd6 }, /* Mn */
+	{ 0x0e31, 0x0e31 }, /* Mn */
+	{ 0x0e34, 0x0e3a }, /* Mn */
+	{ 0x0e47, 0x0e4e }, /* Mn */
+	{ 0x0eb1, 0x0eb1 }, /* Mn */
+	{ 0x0eb4, 0x0eb9 }, /* Mn */
+	{ 0x0ebb, 0x0ebc }, /* Mn */
+	{ 0x0ec8, 0x0ecd }, /* Mn */
+	{ 0x0f18, 0x0f19 }, /* Mn */
+	{ 0x0f35, 0x0f35 }, /* Mn */
+	{ 0x0f37, 0x0f37 }, /* Mn */
+	{ 0x0f39, 0x0f39 }, /* Mn */
+	{ 0x0f71, 0x0f7e }, /* Mn */
+	{ 0x0f80, 0x0f84 }, /* Mn */
+	{ 0x0f86, 0x0f87 }, /* Mn */
+	{ 0x0f8d, 0x0f97 }, /* Mn */
+	{ 0x0f99, 0x0fbc }, /* Mn */
+	{ 0x0fc6, 0x0fc6 }, /* Mn */
+	{ 0x102d, 0x1030 }, /* Mn */
+	{ 0x1032, 0x1037 }, /* Mn */
+	{ 0x1039, 0x103a }, /* Mn */
+	{ 0x103d, 0x103e }, /* Mn */
+	{ 0x1058, 0x1059 }, /* Mn */
+	{ 0x105e, 0x1060 }, /* Mn */
+	{ 0x1071, 0x1074 }, /* Mn */
+	{ 0x1082, 0x1082 }, /* Mn */
+	{ 0x1085, 0x1086 }, /* Mn */
+	{ 0x108d, 0x108d }, /* Mn */
+	{ 0x109d, 0x109d }, /* Mn */
+	{ 0x135d, 0x135f }, /* Mn */
+	{ 0x1712, 0x1714 }, /* Mn */
+	{ 0x1732, 0x1734 }, /* Mn */
+	{ 0x1752, 0x1753 }, /* Mn */
+	{ 0x1772, 0x1773 }, /* Mn */
+	{ 0x17b4, 0x17b5 }, /* Mn */
+	{ 0x17b7, 0x17bd }, /* Mn */
+	{ 0x17c6, 0x17c6 }, /* Mn */
+	{ 0x17c9, 0x17d3 }, /* Mn */
+	{ 0x17dd, 0x17dd }, /* Mn */
+	{ 0x180b, 0x180d }, /* Mn */
+	{ 0x180e, 0x180e }, /* Cf */
+	{ 0x1885, 0x1886 }, /* Mn */
+	{ 0x18a9, 0x18a9 }, /* Mn */
+	{ 0x1920, 0x1922 }, /* Mn */
+	{ 0x1927, 0x1928 }, /* Mn */
+	{ 0x1932, 0x1932 }, /* Mn */
+	{ 0x1939, 0x193b }, /* Mn */
+	{ 0x1a17, 0x1a18 }, /* Mn */
+	{ 0x1a1b, 0x1a1b }, /* Mn */
+	{ 0x1a56, 0x1a56 }, /* Mn */
+	{ 0x1a58, 0x1a5e }, /* Mn */
+	{ 0x1a60, 0x1a60 }, /* Mn */
+	{ 0x1a62, 0x1a62 }, /* Mn */
+	{ 0x1a65, 0x1a6c }, /* Mn */
+	{ 0x1a73, 0x1a7c }, /* Mn */
+	{ 0x1a7f, 0x1a7f }, /* Mn */
+	{ 0x1ab0, 0x1abd }, /* Mn */
+	{ 0x1abe, 0x1abe }, /* Me */
+	{ 0x1b00, 0x1b03 }, /* Mn */
+	{ 0x1b34, 0x1b34 }, /* Mn */
+	{ 0x1b36, 0x1b3a }, /* Mn */
+	{ 0x1b3c, 0x1b3c }, /* Mn */
+	{ 0x1b42, 0x1b42 }, /* Mn */
+	{ 0x1b6b, 0x1b73 }, /* Mn */
+	{ 0x1b80, 0x1b81 }, /* Mn */
+	{ 0x1ba2, 0x1ba5 }, /* Mn */
+	{ 0x1ba8, 0x1ba9 }, /* Mn */
+	{ 0x1bab, 0x1bad }, /* Mn */
+	{ 0x1be6, 0x1be6 }, /* Mn */
+	{ 0x1be8, 0x1be9 }, /* Mn */
+	{ 0x1bed, 0x1bed }, /* Mn */
+	{ 0x1bef, 0x1bf1 }, /* Mn */
+	{ 0x1c2c, 0x1c33 }, /* Mn */
+	{ 0x1c36, 0x1c37 }, /* Mn */
+	{ 0x1cd0, 0x1cd2 }, /* Mn */
+	{ 0x1cd4, 0x1ce0 }, /* Mn */
+	{ 0x1ce2, 0x1ce8 }, /* Mn */
+	{ 0x1ced, 0x1ced }, /* Mn */
+	{ 0x1cf4, 0x1cf4 }, /* Mn */
+	{ 0x1cf8, 0x1cf9 }, /* Mn */
+	{ 0x1dc0, 0x1df9 }, /* Mn */
+	{ 0x1dfb, 0x1dff }, /* Mn */
+	{ 0x200b, 0x200f }, /* Cf */
+	{ 0x202a, 0x202e }, /* Cf */
+	{ 0x2060, 0x2064 }, /* Cf */
+	{ 0x2066, 0x206f }, /* Cf */
+	{ 0x20d0, 0x20dc }, /* Mn */
+	{ 0x20dd, 0x20e0 }, /* Me */
+	{ 0x20e1, 0x20e1 }, /* Mn */
+	{ 0x20e2, 0x20e4 }, /* Me */
+	{ 0x20e5, 0x20f0 }, /* Mn */
+	{ 0x2cef, 0x2cf1 }, /* Mn */
+	{ 0x2d7f, 0x2d7f }, /* Mn */
+	{ 0x2de0, 0x2dff }, /* Mn */
+	{ 0x302a, 0x302d }, /* Mn */
+	{ 0x3099, 0x309a }, /* Mn */
+	{ 0xa66f, 0xa66f }, /* Mn */
+	{ 0xa670, 0xa672 }, /* Me */
+	{ 0xa674, 0xa67d }, /* Mn */
+	{ 0xa69e, 0xa69f }, /* Mn */
+	{ 0xa6f0, 0xa6f1 }, /* Mn */
+	{ 0xa802, 0xa802 }, /* Mn */
+	{ 0xa806, 0xa806 }, /* Mn */
+	{ 0xa80b, 0xa80b }, /* Mn */
+	{ 0xa825, 0xa826 }, /* Mn */
+	{ 0xa8c4, 0xa8c5 }, /* Mn */
+	{ 0xa8e0, 0xa8f1 }, /* Mn */
+	{ 0xa926, 0xa92d }, /* Mn */
+	{ 0xa947, 0xa951 }, /* Mn */
+	{ 0xa980, 0xa982 }, /* Mn */
+	{ 0xa9b3, 0xa9b3 }, /* Mn */
+	{ 0xa9b6, 0xa9b9 }, /* Mn */
+	{ 0xa9bc, 0xa9bc }, /* Mn */
+	{ 0xa9e5, 0xa9e5 }, /* Mn */
+	{ 0xaa29, 0xaa2e }, /* Mn */
+	{ 0xaa31, 0xaa32 }, /* Mn */
+	{ 0xaa35, 0xaa36 }, /* Mn */
+	{ 0xaa43, 0xaa43 }, /* Mn */
+	{ 0xaa4c, 0xaa4c }, /* Mn */
+	{ 0xaa7c, 0xaa7c }, /* Mn */
+	{ 0xaab0, 0xaab0 }, /* Mn */
+	{ 0xaab2, 0xaab4 }, /* Mn */
+	{ 0xaab7, 0xaab8 }, /* Mn */
+	{ 0xaabe, 0xaabf }, /* Mn */
+	{ 0xaac1, 0xaac1 }, /* Mn */
+	{ 0xaaec, 0xaaed }, /* Mn */
+	{ 0xaaf6, 0xaaf6 }, /* Mn */
+	{ 0xabe5, 0xabe5 }, /* Mn */
+	{ 0xabe8, 0xabe8 }, /* Mn */
+	{ 0xabed, 0xabed }, /* Mn */
+	{ 0xfb1e, 0xfb1e }, /* Mn */
+	{ 0xfe00, 0xfe0f }, /* Mn */
+	{ 0xfe20, 0xfe2f }, /* Mn */
+	{ 0xfeff, 0xfeff }, /* Cf */
+	{ 0xfff9, 0xfffb }, /* Cf */
+	{ 0x101fd, 0x101fd }, /* Mn */
+	{ 0x102e0, 0x102e0 }, /* Mn */
+	{ 0x10376, 0x1037a }, /* Mn */
+	{ 0x10a01, 0x10a03 }, /* Mn */
+	{ 0x10a05, 0x10a06 }, /* Mn */
+	{ 0x10a0c, 0x10a0f }, /* Mn */
+	{ 0x10a38, 0x10a3a }, /* Mn */
+	{ 0x10a3f, 0x10a3f }, /* Mn */
+	{ 0x10ae5, 0x10ae6 }, /* Mn */
+	{ 0x11001, 0x11001 }, /* Mn */
+	{ 0x11038, 0x11046 }, /* Mn */
+	{ 0x1107f, 0x11081 }, /* Mn */
+	{ 0x110b3, 0x110b6 }, /* Mn */
+	{ 0x110b9, 0x110ba }, /* Mn */
+	{ 0x110bd, 0x110bd }, /* Cf */
+	{ 0x11100, 0x11102 }, /* Mn */
+	{ 0x11127, 0x1112b }, /* Mn */
+	{ 0x1112d, 0x11134 }, /* Mn */
+	{ 0x11173, 0x11173 }, /* Mn */
+	{ 0x11180, 0x11181 }, /* Mn */
+	{ 0x111b6, 0x111be }, /* Mn */
+	{ 0x111ca, 0x111cc }, /* Mn */
+	{ 0x1122f, 0x11231 }, /* Mn */
+	{ 0x11234, 0x11234 }, /* Mn */
+	{ 0x11236, 0x11237 }, /* Mn */
+	{ 0x1123e, 0x1123e }, /* Mn */
+	{ 0x112df, 0x112df }, /* Mn */
+	{ 0x112e3, 0x112ea }, /* Mn */
+	{ 0x11300, 0x11301 }, /* Mn */
+	{ 0x1133c, 0x1133c }, /* Mn */
+	{ 0x11340, 0x11340 }, /* Mn */
+	{ 0x11366, 0x1136c }, /* Mn */
+	{ 0x11370, 0x11374 }, /* Mn */
+	{ 0x11438, 0x1143f }, /* Mn */
+	{ 0x11442, 0x11444 }, /* Mn */
+	{ 0x11446, 0x11446 }, /* Mn */
+	{ 0x114b3, 0x114b8 }, /* Mn */
+	{ 0x114ba, 0x114ba }, /* Mn */
+	{ 0x114bf, 0x114c0 }, /* Mn */
+	{ 0x114c2, 0x114c3 }, /* Mn */
+	{ 0x115b2, 0x115b5 }, /* Mn */
+	{ 0x115bc, 0x115bd }, /* Mn */
+	{ 0x115bf, 0x115c0 }, /* Mn */
+	{ 0x115dc, 0x115dd }, /* Mn */
+	{ 0x11633, 0x1163a }, /* Mn */
+	{ 0x1163d, 0x1163d }, /* Mn */
+	{ 0x1163f, 0x11640 }, /* Mn */
+	{ 0x116ab, 0x116ab }, /* Mn */
+	{ 0x116ad, 0x116ad }, /* Mn */
+	{ 0x116b0, 0x116b5 }, /* Mn */
+	{ 0x116b7, 0x116b7 }, /* Mn */
+	{ 0x1171d, 0x1171f }, /* Mn */
+	{ 0x11722, 0x11725 }, /* Mn */
+	{ 0x11727, 0x1172b }, /* Mn */
+	{ 0x11a01, 0x11a06 }, /* Mn */
+	{ 0x11a09, 0x11a0a }, /* Mn */
+	{ 0x11a33, 0x11a38 }, /* Mn */
+	{ 0x11a3b, 0x11a3e }, /* Mn */
+	{ 0x11a47, 0x11a47 }, /* Mn */
+	{ 0x11a51, 0x11a56 }, /* Mn */
+	{ 0x11a59, 0x11a5b }, /* Mn */
+	{ 0x11a8a, 0x11a96 }, /* Mn */
+	{ 0x11a98, 0x11a99 }, /* Mn */
+	{ 0x11c30, 0x11c36 }, /* Mn */
+	{ 0x11c38, 0x11c3d }, /* Mn */
+	{ 0x11c3f, 0x11c3f }, /* Mn */
+	{ 0x11c92, 0x11ca7 }, /* Mn */
+	{ 0x11caa, 0x11cb0 }, /* Mn */
+	{ 0x11cb2, 0x11cb3 }, /* Mn */
+	{ 0x11cb5, 0x11cb6 }, /* Mn */
+	{ 0x11d31, 0x11d36 }, /* Mn */
+	{ 0x11d3a, 0x11d3a }, /* Mn */
+	{ 0x11d3c, 0x11d3d }, /* Mn */
+	{ 0x11d3f, 0x11d45 }, /* Mn */
+	{ 0x11d47, 0x11d47 }, /* Mn */
+	{ 0x16af0, 0x16af4 }, /* Mn */
+	{ 0x16b30, 0x16b36 }, /* Mn */
+	{ 0x16f8f, 0x16f92 }, /* Mn */
+	{ 0x1bc9d, 0x1bc9e }, /* Mn */
+	{ 0x1bca0, 0x1bca3 }, /* Cf */
+	{ 0x1d167, 0x1d169 }, /* Mn */
+	{ 0x1d173, 0x1d17a }, /* Cf */
+	{ 0x1d17b, 0x1d182 }, /* Mn */
+	{ 0x1d185, 0x1d18b }, /* Mn */
+	{ 0x1d1aa, 0x1d1ad }, /* Mn */
+	{ 0x1d242, 0x1d244 }, /* Mn */
+	{ 0x1da00, 0x1da36 }, /* Mn */
+	{ 0x1da3b, 0x1da6c }, /* Mn */
+	{ 0x1da75, 0x1da75 }, /* Mn */
+	{ 0x1da84, 0x1da84 }, /* Mn */
+	{ 0x1da9b, 0x1da9f }, /* Mn */
+	{ 0x1daa1, 0x1daaf }, /* Mn */
+	{ 0x1e000, 0x1e006 }, /* Mn */
+	{ 0x1e008, 0x1e018 }, /* Mn */
+	{ 0x1e01b, 0x1e021 }, /* Mn */
+	{ 0x1e023, 0x1e024 }, /* Mn */
+	{ 0x1e026, 0x1e02a }, /* Mn */
+	{ 0x1e8d0, 0x1e8d6 }, /* Mn */
+	{ 0x1e944, 0x1e94a }, /* Mn */
+	{ 0xe0001, 0xe0001 }, /* Cf */
+	{ 0xe0020, 0xe007f }, /* Cf */
+	{ 0xe0100, 0xe01ef }, /* Mn */

Modified: vendor/less/dist/cvt.c
===================================================================
--- vendor/less/dist/cvt.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/cvt.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -65,7 +65,7 @@
 	char *dst;
 	char *edst = odst;
 	char *src;
-	register char *src_end;
+	char *src_end;
 	LWCHAR ch;
 
 	if (lenp != NULL)
@@ -75,8 +75,8 @@
 
 	for (src = osrc, dst = odst;  src < src_end;  )
 	{
-		int src_pos = src - osrc;
-		int dst_pos = dst - odst;
+		int src_pos = (int) (src - osrc);
+		int dst_pos = (int) (dst - odst);
 		ch = step_char(&src, +1, src_end);
 		if ((ops & CVT_BS) && ch == '\b' && dst > odst)
 		{
@@ -83,7 +83,7 @@
 			/* Delete backspace and preceding char. */
 			do {
 				dst--;
-			} while (dst > odst &&
+			} while (dst > odst && utf_mode &&
 				!IS_ASCII_OCTET(*dst) && !IS_UTF8_LEAD(*dst));
 		} else if ((ops & CVT_ANSI) && IS_CSI_START(ch))
 		{
@@ -109,6 +109,6 @@
 		edst--;
 	*edst = '\0';
 	if (lenp != NULL)
-		*lenp = edst - odst;
+		*lenp = (int) (edst - odst);
 	/* FIXME: why was this here?  if (chpos != NULL) chpos[dst - odst] = src - osrc; */
 }

Modified: vendor/less/dist/decode.c
===================================================================
--- vendor/less/dist/decode.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/decode.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -94,8 +94,12 @@
 	ESC,']',0,			A_RSHIFT,
 	ESC,'(',0,			A_LSHIFT,
 	ESC,')',0,			A_RSHIFT,
+	ESC,'{',0,			A_LLSHIFT,
+	ESC,'}',0,			A_RRSHIFT,
 	SK(SK_RIGHT_ARROW),0,		A_RSHIFT,
 	SK(SK_LEFT_ARROW),0,		A_LSHIFT,
+	SK(SK_CTL_RIGHT_ARROW),0,	A_RRSHIFT,
+	SK(SK_CTL_LEFT_ARROW),0,	A_LLSHIFT,
 	'{',0,				A_F_BRACKET|A_EXTRA,	'{','}',0,
 	'}',0,				A_B_BRACKET|A_EXTRA,	'{','}',0,
 	'(',0,				A_F_BRACKET|A_EXTRA,	'(',')',0,
@@ -105,6 +109,7 @@
 	ESC,CONTROL('F'),0,		A_F_BRACKET,
 	ESC,CONTROL('B'),0,		A_B_BRACKET,
 	'G',0,				A_GOEND,
+	ESC,'G',0,			A_GOEND_BUF,
 	ESC,'>',0,			A_GOEND,
 	'>',0,				A_GOEND,
 	SK(SK_END),0,			A_GOEND,
@@ -135,6 +140,8 @@
 	ESC,'N',0,			A_T_REVERSE_SEARCH,
 	'&',0,				A_FILTER,
 	'm',0,				A_SETMARK,
+	'M',0,				A_SETMARKBOT,
+	ESC,'m',0,			A_CLRMARK,
 	'\'',0,				A_GOMARK,
 	CONTROL('X'),CONTROL('X'),0,	A_GOMARK,
 	'E',0,				A_EXAMINE,
@@ -232,9 +239,9 @@
 	char *table;
 	int len;
 {
-	register char *fm;
-	register char *to;
-	register int a;
+	char *fm;
+	char *to;
+	int a;
 	char *repl;
 	int klen;
 
@@ -286,6 +293,33 @@
 }
 
 /*
+ * Expand special key abbreviations in a list of command tables.
+ */
+	static void
+expand_cmd_table(tlist)
+	struct tablelist *tlist;
+{
+	struct tablelist *t;
+	for (t = tlist;  t != NULL;  t = t->t_next)
+	{
+		expand_special_keys(t->t_start, t->t_end - t->t_start);
+	}
+}
+
+/*
+ * Expand special key abbreviations in all command tables.
+ */
+	public void
+expand_cmd_tables()
+{
+	expand_cmd_table(list_fcmd_tables);
+	expand_cmd_table(list_ecmd_tables);
+	expand_cmd_table(list_var_tables);
+	expand_cmd_table(list_sysvar_tables);
+}
+
+
+/*
  * Initialize the command lists.
  */
 	public void
@@ -324,7 +358,7 @@
 	char *buf;
 	int len;
 {
-	register struct tablelist *t;
+	struct tablelist *t;
 
 	if (len == 0)
 		return (0);
@@ -337,7 +371,6 @@
 	{
 		return (-1);
 	}
-	expand_special_keys(buf, len);
 	t->t_start = buf;
 	t->t_end = buf + len;
 	t->t_next = *tlist;
@@ -392,9 +425,9 @@
 	char *endtable;
 	char **sp;
 {
-	register char *p;
-	register char *q;
-	register int a;
+	char *p;
+	char *q;
+	int a;
 
 	*sp = NULL;
 	for (p = table, q = cmd;  p < endtable;  p++, q++)
@@ -483,8 +516,8 @@
 	char *cmd;
 	char **sp;
 {
-	register struct tablelist *t;
-	register int action = A_INVALID;
+	struct tablelist *t;
+	int action = A_INVALID;
 
 	/*
 	 * Search thru all the command tables.
@@ -594,8 +627,8 @@
 	int sysvar;
 {
 	char *p;
-	register int c;
-	register int n;
+	int c;
+	int n;
 
 	/*
 	 * New-style lesskey file.
@@ -646,10 +679,10 @@
 	char *filename;
 	int sysvar;
 {
-	register char *buf;
-	register POSITION len;
-	register long n;
-	register int f;
+	char *buf;
+	POSITION len;
+	long n;
+	int f;
 
 	if (secure)
 		return (1);
@@ -656,9 +689,7 @@
 	/*
 	 * Try to open the lesskey file.
 	 */
-	filename = shell_unquote(filename);
 	f = open(filename, OPEN_READ);
-	free(filename);
 	if (f < 0)
 		return (1);
 

Modified: vendor/less/dist/edit.c
===================================================================
--- vendor/less/dist/edit.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/edit.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -9,9 +9,13 @@
 
 
 #include "less.h"
+#include "position.h"
 #if HAVE_STAT
 #include <sys/stat.h>
 #endif
+#if OS2
+#include <signal.h>
+#endif
 
 public int fd0 = 0;
 
@@ -26,7 +30,7 @@
 extern IFILE curr_ifile;
 extern IFILE old_ifile;
 extern struct scrpos initial_scrpos;
-extern void constant *ml_examine;
+extern void *ml_examine;
 #if SPACES_IN_FILENAMES
 extern char openquote;
 extern char closequote;
@@ -43,10 +47,7 @@
 public ino_t curr_ino;
 #endif
 
-char *curr_altfilename = NULL;
-static void *curr_altpipe;
 
-
 /*
  * Textlist functions deal with a list of words separated by spaces.
  * init_textlist sets up a textlist structure.
@@ -64,7 +65,7 @@
 	int meta_quoted = 0;
 	int delim_quoted = 0;
 	char *esc = get_meta_escape();
-	int esclen = strlen(esc);
+	int esclen = (int) strlen(esc);
 #endif
 	
 	tlist->string = skipsp(str);
@@ -149,6 +150,24 @@
 }
 
 /*
+ * Close a pipe opened via popen.
+ */
+	static void
+close_pipe(FILE *pipefd)
+{
+	if (pipefd == NULL)
+		return;
+#if OS2
+	/*
+	 * The pclose function of OS/2 emx sometimes fails.
+	 * Send SIGINT to the piped process before closing it.
+	 */
+	kill(pipefd->_pid, SIGINT);
+#endif
+	pclose(pipefd);
+}
+
+/*
  * Close the current input file.
  */
 	static void
@@ -155,6 +174,9 @@
 close_file()
 {
 	struct scrpos scrpos;
+	int chflags;
+	FILE *altpipe;
+	char *altfilename;
 	
 	if (curr_ifile == NULL_IFILE)
 		return;
@@ -163,7 +185,7 @@
 	 * Save the current position so that we can return to
 	 * the same position if we edit this file again.
 	 */
-	get_scrpos(&scrpos);
+	get_scrpos(&scrpos, TOP);
 	if (scrpos.pos != NULL_POSITION)
 	{
 		store_pos(curr_ifile, &scrpos);
@@ -172,17 +194,23 @@
 	/*
 	 * Close the file descriptor, unless it is a pipe.
 	 */
+	chflags = ch_getflags();
 	ch_close();
 	/*
 	 * If we opened a file using an alternate name,
 	 * do special stuff to close it.
 	 */
-	if (curr_altfilename != NULL)
+	altfilename = get_altfilename(curr_ifile);
+	if (altfilename != NULL)
 	{
-		close_altfile(curr_altfilename, get_filename(curr_ifile),
-				curr_altpipe);
-		free(curr_altfilename);
-		curr_altfilename = NULL;
+		altpipe = get_altpipe(curr_ifile);
+		if (altpipe != NULL && !(chflags & CH_KEEPOPEN))
+		{
+			close_pipe(altpipe);
+			set_altpipe(curr_ifile, NULL);
+		}
+		close_altfile(altfilename, get_filename(curr_ifile));
+		set_altfilename(curr_ifile, NULL);
 	}
 	curr_ifile = NULL_IFILE;
 #if HAVE_STAT_INO
@@ -218,9 +246,8 @@
 	int chflags;
 	char *filename;
 	char *open_filename;
-	char *qopen_filename;
 	char *alt_filename;
-	void *alt_pipe;
+	void *altpipe;
 	IFILE was_curr_ifile;
 	PARG parg;
 		
@@ -270,107 +297,129 @@
 	}
 
 	filename = save(get_filename(ifile));
+
 	/*
 	 * See if LESSOPEN specifies an "alternate" file to open.
 	 */
-	alt_pipe = NULL;
-	alt_filename = open_altfile(filename, &f, &alt_pipe);
-	open_filename = (alt_filename != NULL) ? alt_filename : filename;
-	qopen_filename = shell_unquote(open_filename);
-
-	chflags = 0;
-	if (alt_pipe != NULL)
+	altpipe = get_altpipe(ifile);
+	if (altpipe != NULL)
 	{
 		/*
-		 * The alternate "file" is actually a pipe.
-		 * f has already been set to the file descriptor of the pipe
-		 * in the call to open_altfile above.
-		 * Keep the file descriptor open because it was opened 
-		 * via popen(), and pclose() wants to close it.
+		 * File is already open.
+		 * chflags and f are not used by ch_init if ifile has 
+		 * filestate which should be the case if we're here. 
+		 * Set them here to avoid uninitialized variable warnings.
 		 */
-		chflags |= CH_POPENED;
-	} else if (strcmp(open_filename, "-") == 0)
+		chflags = 0; 
+		f = -1;
+		alt_filename = get_altfilename(ifile);
+		open_filename = (alt_filename != NULL) ? alt_filename : filename;
+	} else
 	{
-		/* 
-		 * Use standard input.
-		 * Keep the file descriptor open because we can't reopen it.
-		 */
-		f = fd0;
-		chflags |= CH_KEEPOPEN;
-		/*
-		 * Must switch stdin to BINARY mode.
-		 */
-		SET_BINARY(f);
+		if (strcmp(filename, FAKE_HELPFILE) == 0 ||
+			 strcmp(filename, FAKE_EMPTYFILE) == 0)
+			alt_filename = NULL;
+		else
+			alt_filename = open_altfile(filename, &f, &altpipe);
+
+		open_filename = (alt_filename != NULL) ? alt_filename : filename;
+
+		chflags = 0;
+		if (altpipe != NULL)
+		{
+			/*
+			 * The alternate "file" is actually a pipe.
+			 * f has already been set to the file descriptor of the pipe
+			 * in the call to open_altfile above.
+			 * Keep the file descriptor open because it was opened 
+			 * via popen(), and pclose() wants to close it.
+			 */
+			chflags |= CH_POPENED;
+			if (strcmp(filename, "-") == 0)
+				chflags |= CH_KEEPOPEN;
+		} else if (strcmp(filename, "-") == 0)
+		{
+			/* 
+			 * Use standard input.
+			 * Keep the file descriptor open because we can't reopen it.
+			 */
+			f = fd0;
+			chflags |= CH_KEEPOPEN;
+			/*
+			 * Must switch stdin to BINARY mode.
+			 */
+			SET_BINARY(f);
 #if MSDOS_COMPILER==DJGPPC
-		/*
-		 * Setting stdin to binary by default causes
-		 * Ctrl-C to not raise SIGINT.  We must undo
-		 * that side-effect.
-		 */
-		__djgpp_set_ctrl_c(1);
+			/*
+			 * Setting stdin to binary by default causes
+			 * Ctrl-C to not raise SIGINT.  We must undo
+			 * that side-effect.
+			 */
+			__djgpp_set_ctrl_c(1);
 #endif
-	} else if (strcmp(open_filename, FAKE_EMPTYFILE) == 0)
-	{
-		f = -1;
-		chflags |= CH_NODATA;
-	} else if (strcmp(open_filename, FAKE_HELPFILE) == 0)
-	{
-		f = -1;
-		chflags |= CH_HELPFILE;
-	} else if ((parg.p_string = bad_file(open_filename)) != NULL)
-	{
-		/*
-		 * It looks like a bad file.  Don't try to open it.
-		 */
-		error("%s", &parg);
-		free(parg.p_string);
-	    err1:
-		if (alt_filename != NULL)
+		} else if (strcmp(open_filename, FAKE_EMPTYFILE) == 0)
 		{
-			close_altfile(alt_filename, filename, alt_pipe);
-			free(alt_filename);
-		}
-		del_ifile(ifile);
-		free(qopen_filename);
-		free(filename);
-		/*
-		 * Re-open the current file.
-		 */
-		if (was_curr_ifile == ifile)
+			f = -1;
+			chflags |= CH_NODATA;
+		} else if (strcmp(open_filename, FAKE_HELPFILE) == 0)
 		{
+			f = -1;
+			chflags |= CH_HELPFILE;
+		} else if ((parg.p_string = bad_file(open_filename)) != NULL)
+		{
 			/*
-			 * Whoops.  The "current" ifile is the one we just deleted.
-			 * Just give up.
+			 * It looks like a bad file.  Don't try to open it.
 			 */
-			quit(QUIT_ERROR);
-		}
-		reedit_ifile(was_curr_ifile);
-		return (1);
-	} else if ((f = open(qopen_filename, OPEN_READ)) < 0)
-	{
-		/*
-		 * Got an error trying to open it.
-		 */
-		parg.p_string = errno_message(filename);
-		error("%s", &parg);
-		free(parg.p_string);
-	    	goto err1;
-	} else 
-	{
-		chflags |= CH_CANSEEK;
-		if (!force_open && !opened(ifile) && bin_file(f))
+			error("%s", &parg);
+			free(parg.p_string);
+			err1:
+			if (alt_filename != NULL)
+			{
+				close_pipe(altpipe);
+				close_altfile(alt_filename, filename);
+				free(alt_filename);
+			}
+			del_ifile(ifile);
+			free(filename);
+			/*
+			 * 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(open_filename, OPEN_READ)) < 0)
 		{
 			/*
-			 * Looks like a binary file.  
-			 * Ask user if we should proceed.
+			 * Got an error trying to open it.
 			 */
-			parg.p_string = filename;
-			answer = query("\"%s\" may be a binary file.  See it anyway? ",
-				&parg);
-			if (answer != 'y' && answer != 'Y')
+			parg.p_string = errno_message(filename);
+			error("%s", &parg);
+			free(parg.p_string);
+				goto err1;
+		} else 
+		{
+			chflags |= CH_CANSEEK;
+			if (!force_open && !opened(ifile) && bin_file(f))
 			{
-				close(f);
-				goto err1;
+				/*
+				 * Looks like a binary file.  
+				 * Ask user if we should proceed.
+				 */
+				parg.p_string = filename;
+				answer = query("\"%s\" may be a binary file.  See it anyway? ",
+					&parg);
+				if (answer != 'y' && answer != 'Y')
+				{
+					close(f);
+					goto err1;
+				}
 			}
 		}
 	}
@@ -385,8 +434,8 @@
 		unsave_ifile(was_curr_ifile);
 	}
 	curr_ifile = ifile;
-	curr_altfilename = alt_filename;
-	curr_altpipe = alt_pipe;
+	set_altfilename(curr_ifile, alt_filename);
+	set_altpipe(curr_ifile, altpipe);
 	set_open(curr_ifile); /* File has been opened */
 	get_pos(curr_ifile, &initial_scrpos);
 	new_file = TRUE;
@@ -400,9 +449,10 @@
 #endif
 #if HAVE_STAT_INO
 		/* Remember the i-number and device of the opened file. */
+		if (strcmp(open_filename, "-") != 0)
 		{
 			struct stat statbuf;
-			int r = stat(qopen_filename, &statbuf);
+			int r = stat(open_filename, &statbuf);
 			if (r == 0)
 			{
 				curr_ino = statbuf.st_ino;
@@ -411,10 +461,12 @@
 		}
 #endif
 		if (every_first_cmd != NULL)
+		{
+			ungetcc(CHAR_END_COMMAND);
 			ungetsc(every_first_cmd);
+		}
 	}
 
-	free(qopen_filename);
 	no_display = !any_display;
 	flush();
 	any_display = TRUE;
@@ -433,7 +485,8 @@
 #if HILITE_SEARCH
 		clr_hilite();
 #endif
-		cmd_addhist(ml_examine, filename);
+		if (strcmp(filename, FAKE_HELPFILE) && strcmp(filename, FAKE_EMPTYFILE))
+			cmd_addhist(ml_examine, filename, 1);
 		if (no_display && errmsgs > 0)
 		{
 			/*
@@ -464,6 +517,7 @@
 	char *filename;
 	char *gfilelist;
 	char *gfilename;
+	char *qfilename;
 	struct textlist tl_files;
 	struct textlist tl_gfiles;
 
@@ -485,8 +539,10 @@
 		gfilename = NULL;
 		while ((gfilename = forw_textlist(&tl_gfiles, gfilename)) != NULL)
 		{
-			if (edit(gfilename) == 0 && good_filename == NULL)
+			qfilename = shell_unquote(gfilename);
+			if (edit(qfilename) == 0 && good_filename == NULL)
 				good_filename = get_filename(curr_ifile);
+			free(qfilename);
 		}
 		free(gfilelist);
 	}
@@ -712,7 +768,7 @@
 	public void
 cat_file()
 {
-	register int c;
+	int c;
 
 	while ((c = ch_forw_get()) != EOI)
 		putchr(c);
@@ -730,8 +786,8 @@
 use_logfile(filename)
 	char *filename;
 {
-	register int exists;
-	register int answer;
+	int exists;
+	int answer;
 	PARG parg;
 
 	if (ch_getflags() & CH_CANSEEK)
@@ -743,9 +799,9 @@
 	/*
 	 * {{ We could use access() here. }}
 	 */
-	filename = shell_unquote(filename);
 	exists = open(filename, OPEN_READ);
-	close(exists);
+	if (exists >= 0)
+		close(exists);
 	exists = (exists >= 0);
 
 	/*
@@ -811,10 +867,8 @@
 		 */
 		parg.p_string = filename;
 		error("Cannot write to \"%s\"", &parg);
-		free(filename);
 		return;
 	}
-	free(filename);
 	SET_BINARY(logfile);
 }
 

Modified: vendor/less/dist/filename.c
===================================================================
--- vendor/less/dist/filename.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/filename.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -32,9 +32,6 @@
 #include <modes.h>
 #endif
 #endif
-#if OS2
-#include <signal.h>
-#endif
 
 #if HAVE_STAT
 #include <sys/stat.h>
@@ -46,7 +43,6 @@
 #endif
 #endif
 
-
 extern int force_open;
 extern int secure;
 extern int use_lessopen;
@@ -86,7 +82,7 @@
 	} else
 	{
 		char *esc = get_meta_escape();
-		int esclen = strlen(esc);
+		int esclen = (int) strlen(esc);
 		while (*str != '\0')
 		{
 			if (esclen > 0 && strncmp(str, esc, esclen) == 0)
@@ -150,7 +146,7 @@
 	char *newstr;
 	int len;
 	char *esc = get_meta_escape();
-	int esclen = strlen(esc);
+	int esclen = (int) strlen(esc);
 	int use_quotes = 0;
 	int have_quotes = 0;
 
@@ -188,7 +184,7 @@
 			 * We can't quote a string that contains quotes.
 			 */
 			return (NULL);
-		len = strlen(s) + 3;
+		len = (int) strlen(s) + 3;
 	}
 	/*
 	 * Allocate and construct the new string.
@@ -226,7 +222,6 @@
 	char *filename;
 {
 	char *pathname;
-	char *qpathname;
 	int len;
 	int f;
 
@@ -235,7 +230,7 @@
 	/*
 	 * Construct the full pathname.
 	 */
-	len= strlen(dirname) + strlen(filename) + 2;
+	len = (int) (strlen(dirname) + strlen(filename) + 2);
 	pathname = (char *) calloc(len, sizeof(char));
 	if (pathname == NULL)
 		return (NULL);
@@ -243,8 +238,7 @@
 	/*
 	 * Make sure the file exists.
 	 */
-	qpathname = shell_unquote(pathname);
-	f = open(qpathname, OPEN_READ);
+	f = open(pathname, OPEN_READ);
 	if (f < 0)
 	{
 		free(pathname);
@@ -253,7 +247,6 @@
 	{
 		close(f);
 	}
-	free(qpathname);
 	return (pathname);
 }
 
@@ -264,7 +257,7 @@
 homefile(filename)
 	char *filename;
 {
-	register char *pathname;
+	char *pathname;
 
 	/*
 	 * Try $HOME/filename.
@@ -314,9 +307,9 @@
 fexpand(s)
 	char *s;
 {
-	register char *fr, *to;
-	register int n;
-	register char *e;
+	char *fr, *to;
+	int n;
+	char *e;
 	IFILE ifile;
 
 #define	fchar_ifile(c) \
@@ -350,7 +343,7 @@
 				if (ifile == NULL_IFILE)
 					n++;
 				else
-					n += strlen(get_filename(ifile));
+					n += (int) strlen(get_filename(ifile));
 			}
 			/*
 			 * Else it is the first char in a string of
@@ -432,7 +425,7 @@
 		for (slash = s+strlen(s)-1;  slash > s;  slash--)
 			if (*slash == *PATHNAME_SEP || *slash == '/')
 				break;
-		len = strlen(s) + 4;
+		len = (int) strlen(s) + 4;
 		fpat = (char *) ecalloc(len, sizeof(char));
 		if (strchr(slash, '.') == NULL)
 			SNPRINTF1(fpat, len, "%s*.*", s);
@@ -441,7 +434,7 @@
 	}
 #else
 	{
-	int len = strlen(s) + 2;
+	int len = (int) strlen(s) + 2;
 	fpat = (char *) ecalloc(len, sizeof(char));
 	SNPRINTF1(fpat, len, "%s*", s);
 	}
@@ -474,7 +467,7 @@
 	int bin_count = 0;
 	char data[256];
 	char* p;
-	char* pend;
+	char* edata;
 
 	if (!seekable(f))
 		return (0);
@@ -481,17 +474,23 @@
 	if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK)
 		return (0);
 	n = read(f, data, sizeof(data));
-	pend = &data[n];
-	for (p = data;  p < pend;  )
+	if (n <= 0)
+		return (0);
+	edata = &data[n];
+	for (p = data;  p < edata;  )
 	{
-		LWCHAR c = step_char(&p, +1, pend);
-		if (ctldisp == OPT_ONPLUS && IS_CSI_START(c))
+		if (utf_mode && !is_utf8_well_formed(p, edata-data))
 		{
-			do {
-				c = step_char(&p, +1, pend);
-			} while (p < pend && is_ansi_middle(c));
-		} else if (binary_char(c))
 			bin_count++;
+			utf_skip_to_lead(&p, edata);
+		} else 
+		{
+			LWCHAR c = step_char(&p, +1, edata);
+			if (ctldisp == OPT_ONPLUS && IS_CSI_START(c))
+				skip_ansi(&p, edata);
+			else if (binary_char(c))
+				bin_count++;
+		}
 	}
 	/*
 	 * Call it a binary file if there are more than 5 binary characters
@@ -593,7 +592,7 @@
 			fd = popen(cmd, "r");
 		} else
 		{
-			int len = strlen(shell) + strlen(esccmd) + 5;
+			int len = (int) (strlen(shell) + strlen(esccmd) + 5);
 			scmd = (char *) ecalloc(len, sizeof(char));
 			SNPRINTF3(scmd, len, "%s %s %s", shell, shell_coption(), esccmd);
 			free(esccmd);
@@ -624,12 +623,10 @@
 	char *filename;
 {
 	char *gfilename;
-	char *ofilename;
 
-	ofilename = fexpand(filename);
+	filename = fexpand(filename);
 	if (secure)
-		return (ofilename);
-	filename = shell_unquote(ofilename);
+		return (filename);
 
 #ifdef DECL_GLOB_LIST
 {
@@ -644,8 +641,7 @@
 	GLOB_LIST(filename, list);
 	if (GLOB_LIST_FAILED(list))
 	{
-		free(filename);
-		return (ofilename);
+		return (filename);
 	}
 	length = 1; /* Room for trailing null byte */
 	for (SCAN_GLOB_LIST(list, p))
@@ -682,18 +678,17 @@
 	 * The globbing function returns a single name, and
 	 * is called multiple times to walk thru all names.
 	 */
-	register char *p;
-	register int len;
-	register int n;
-	char *pathname;
-	char *qpathname;
+	char *p;
+	int len;
+	int n;
+	char *pfilename;
+	char *qfilename;
 	DECL_GLOB_NAME(fnd,drive,dir,fname,ext,handle)
 	
 	GLOB_FIRST_NAME(filename, &fnd, handle);
 	if (GLOB_FIRST_FAILED(handle))
 	{
-		free(filename);
-		return (ofilename);
+		return (filename);
 	}
 
 	_splitpath(filename, drive, dir, fname, ext);
@@ -701,14 +696,14 @@
 	gfilename = (char *) ecalloc(len, sizeof(char));
 	p = gfilename;
 	do {
-		n = strlen(drive) + strlen(dir) + strlen(fnd.GLOB_NAME) + 1;
-		pathname = (char *) ecalloc(n, sizeof(char));
-		SNPRINTF3(pathname, n, "%s%s%s", drive, dir, fnd.GLOB_NAME);
-		qpathname = shell_quote(pathname);
-		free(pathname);
-		if (qpathname != NULL)
+		n = (int) (strlen(drive) + strlen(dir) + strlen(fnd.GLOB_NAME) + 1);
+		pfilename = (char *) ecalloc(n, sizeof(char));
+		SNPRINTF3(pfilename, n, "%s%s%s", drive, dir, fnd.GLOB_NAME);
+		qfilename = shell_quote(pfilename);
+		free(pfilename);
+		if (qfilename != NULL)
 		{
-			n = strlen(qpathname);
+			n = (int) strlen(qfilename);
 			while (p - gfilename + n + 2 >= len)
 			{
 				/*
@@ -723,8 +718,8 @@
 				gfilename = p;
 				p = gfilename + strlen(gfilename);
 			}
-			strcpy(p, qpathname);
-			free(qpathname);
+			strcpy(p, qfilename);
+			free(qfilename);
 			p += n;
 			*p++ = ' ';
 		}
@@ -756,8 +751,7 @@
 	esc = shell_quote(esc);
 	if (esc == NULL)
 	{
-		free(filename);
-		return (ofilename);
+		return (filename);
 	}
 	lessecho = lgetenv("LESSECHO");
 	if (lessecho == NULL || *lessecho == '\0')
@@ -765,13 +759,13 @@
 	/*
 	 * Invoke lessecho, and read its output (a globbed list of filenames).
 	 */
-	len = strlen(lessecho) + strlen(ofilename) + (7*strlen(metachars())) + 24;
+	len = (int) (strlen(lessecho) + strlen(filename) + (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);
-	sprintf(cmd + strlen(cmd), "-- %s", ofilename);
+	sprintf(cmd + strlen(cmd), "-- %s", filename);
 	fd = shellcmd(cmd);
 	free(cmd);
 	if (fd == NULL)
@@ -780,8 +774,7 @@
 		 * Cannot create the pipe.
 		 * Just return the original (fexpanded) filename.
 		 */
-		free(filename);
-		return (ofilename);
+		return (filename);
 	}
 	gfilename = readfd(fd);
 	pclose(fd);
@@ -788,8 +781,7 @@
 	if (*gfilename == '\0')
 	{
 		free(gfilename);
-		free(filename);
-		return (ofilename);
+		return (save(filename));
 	}
 }
 #else
@@ -801,7 +793,6 @@
 #endif
 #endif
 	free(filename);
-	free(ofilename);
 	return (gfilename);
 }
 
@@ -813,15 +804,20 @@
 num_pct_s(lessopen)
 	char *lessopen;
 {
-	int num;
+	int num = 0;
 
-	for (num = 0;; num++)
+	while (*lessopen != '\0')
 	{
-		lessopen = strchr(lessopen, '%');
-		if (lessopen == NULL)
-			break;
-		if (*++lessopen != 's')
-			return (999);
+		if (*lessopen == '%')
+		{
+			if (lessopen[1] == '%')
+				++lessopen;
+			else if (lessopen[1] == 's')
+				++num;
+			else
+				return (999);
+		}
+		++lessopen;
 	}
 	return (num);
 }
@@ -840,6 +836,7 @@
 	return (NULL);
 #else
 	char *lessopen;
+	char *qfilename;
 	char *cmd;
 	int len;
 	FILE *fd;
@@ -866,24 +863,28 @@
 		returnfd++;
 #endif
 	}
-	if (*lessopen == '-') {
+	if (*lessopen == '-')
+	{
 		/*
 		 * Lessopen preprocessor will accept "-" as a filename.
 		 */
 		lessopen++;
-	} else {
+	} else
+	{
 		if (strcmp(filename, "-") == 0)
 			return (NULL);
 	}
-	if (num_pct_s(lessopen) > 1)
+	if (num_pct_s(lessopen) != 1)
 	{
-		error("Invalid LESSOPEN variable", NULL_PARG);
+		error("LESSOPEN ignored: must contain exactly one %%s", NULL_PARG);
 		return (NULL);
 	}
 
-	len = strlen(lessopen) + strlen(filename) + 2;
+	qfilename = shell_quote(filename);
+	len = (int) (strlen(lessopen) + strlen(qfilename) + 2);
 	cmd = (char *) ecalloc(len, sizeof(char));
-	SNPRINTF1(cmd, len, lessopen, filename);
+	SNPRINTF1(cmd, len, lessopen, qfilename);
+	free(qfilename);
 	fd = shellcmd(cmd);
 	free(cmd);
 	if (fd == NULL)
@@ -896,11 +897,12 @@
 #if HAVE_FILENO
 	if (returnfd)
 	{
+		char c;
 		int f;
-		char c;
 
 		/*
-		 * Read one char to see if the pipe will produce any data.
+		 * The first time we open the file, read one char 
+		 * to see if the pipe will produce any data.
 		 * If it does, push the char back on the pipe.
 		 */
 		f = fileno(fd);
@@ -943,10 +945,9 @@
  * Close a replacement file.
  */
 	public void
-close_altfile(altfilename, filename, pipefd)
+close_altfile(altfilename, filename)
 	char *altfilename;
 	char *filename;
-	void *pipefd;
 {
 #if HAVE_POPEN
 	char *lessclose;
@@ -956,25 +957,15 @@
 	
 	if (secure)
 		return;
-	if (pipefd != NULL)
-	{
-#if OS2
-		/*
-		 * The pclose function of OS/2 emx sometimes fails.
-		 * Send SIGINT to the piped process before closing it.
-		 */
-		kill(((FILE*)pipefd)->_pid, SIGINT);
-#endif
-		pclose((FILE*) pipefd);
-	}
+	ch_ungetchar(-1);
 	if ((lessclose = lgetenv("LESSCLOSE")) == NULL)
 	     	return;
 	if (num_pct_s(lessclose) > 2) 
 	{
-		error("Invalid LESSCLOSE variable");
+		error("LESSCLOSE ignored; must contain no more than 2 %%s", NULL_PARG);
 		return;
 	}
-	len = strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2;
+	len = (int) (strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2);
 	cmd = (char *) ecalloc(len, sizeof(char));
 	SNPRINTF2(cmd, len, lessclose, filename, altfilename);
 	fd = shellcmd(cmd);
@@ -993,7 +984,6 @@
 {
 	int isdir = 0;
 
-	filename = shell_unquote(filename);
 #if HAVE_STAT
 {
 	int r;
@@ -1005,7 +995,7 @@
 #else
 #ifdef _OSK
 {
-	register int f;
+	int f;
 
 	f = open(filename, S_IREAD | S_IFDIR);
 	if (f >= 0)
@@ -1014,7 +1004,6 @@
 }
 #endif
 #endif
-	free(filename);
 	return (isdir);
 }
 
@@ -1027,9 +1016,8 @@
 bad_file(filename)
 	char *filename;
 {
-	register char *m = NULL;
+	char *m = NULL;
 
-	filename = shell_unquote(filename);
 	if (!force_open && is_dir(filename))
 	{
 		static char is_a_dir[] = " is a directory";
@@ -1061,7 +1049,6 @@
 		}
 #endif
 	}
-	free(filename);
 	return (m);
 }
 

Added: vendor/less/dist/fmt.uni
===================================================================
--- vendor/less/dist/fmt.uni	                        (rev 0)
+++ vendor/less/dist/fmt.uni	2018-07-06 12:43:09 UTC (rev 11360)
@@ -0,0 +1,19 @@
+/* Generated by "./mkutable -f2 Cf -- unicode/UnicodeData.txt" on Sun Nov 12 16:13:49 PST 2017 */
+	{ 0x00ad, 0x00ad }, /* Cf */
+	{ 0x0600, 0x0605 }, /* Cf */
+	{ 0x061c, 0x061c }, /* Cf */
+	{ 0x06dd, 0x06dd }, /* Cf */
+	{ 0x070f, 0x070f }, /* Cf */
+	{ 0x08e2, 0x08e2 }, /* Cf */
+	{ 0x180e, 0x180e }, /* Cf */
+	{ 0x200b, 0x200f }, /* Cf */
+	{ 0x202a, 0x202e }, /* Cf */
+	{ 0x2060, 0x2064 }, /* Cf */
+	{ 0x2066, 0x206f }, /* Cf */
+	{ 0xfeff, 0xfeff }, /* Cf */
+	{ 0xfff9, 0xfffb }, /* Cf */
+	{ 0x110bd, 0x110bd }, /* Cf */
+	{ 0x1bca0, 0x1bca3 }, /* Cf */
+	{ 0x1d173, 0x1d17a }, /* Cf */
+	{ 0xe0001, 0xe0001 }, /* Cf */
+	{ 0xe0020, 0xe007f }, /* Cf */

Modified: vendor/less/dist/forwback.c
===================================================================
--- vendor/less/dist/forwback.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/forwback.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,6 @@
+/* $FreeBSD: stable/10/contrib/less/forwback.c 330571 2018-03-07 06:39:00Z delphij $ */
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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,11 +21,13 @@
 public int squished;
 public int no_back_scroll = 0;
 public int forw_prompt;
+public int same_pos_bell = 1;
 
 extern int sigs;
 extern int top_scroll;
 extern int quiet;
 extern int sc_width, sc_height;
+extern int less_is_more;
 extern int plusoption;
 extern int forw_scroll;
 extern int back_scroll;
@@ -32,6 +35,11 @@
 extern int clear_bg;
 extern int final_attr;
 extern int oldbot;
+#if HILITE_SEARCH
+extern int size_linebuf;
+extern int hilite_search;
+extern int status_col;
+#endif
 #if TAGS
 extern char *tagoption;
 #endif
@@ -118,13 +126,12 @@
  */
 	public void
 forw(n, pos, force, only_last, nblank)
-	register int n;
+	int n;
 	POSITION pos;
 	int force;
 	int only_last;
 	int nblank;
 {
-	int eof = 0;
 	int nlines = 0;
 	int do_repaint;
 	static int first_time = 1;
@@ -143,6 +150,13 @@
 	do_repaint = (only_last && n > sc_height-1) || 
 		(forw_scroll >= 0 && n > forw_scroll && n != sc_height-1);
 
+#if HILITE_SEARCH
+	if (hilite_search == OPT_ONPLUS || is_filtering() || status_col) {
+		prep_hilite(pos, pos + 4*size_linebuf, ignore_eoi ? 1 : -1);
+		pos = next_unfiltered(pos);
+	}
+#endif
+
 	if (!do_repaint)
 	{
 		if (top_scroll && n >= sc_height - 1 && pos != ch_length())
@@ -156,8 +170,10 @@
 			pos_clear();
 			add_forw_pos(pos);
 			force = 1;
-			clear();
-			home();
+			if (less_is_more == 0) {
+				clear();
+				home();
+			}
 		}
 
 		if (pos != position(BOTTOM_PLUS_ONE) || empty_screen())
@@ -202,6 +218,9 @@
 			 * Get the next line from the file.
 			 */
 			pos = forw_line(pos);
+#if HILITE_SEARCH
+			pos = next_unfiltered(pos);
+#endif
 			if (pos == NULL_POSITION)
 			{
 				/*
@@ -210,7 +229,6 @@
 				 * Even if force is true, stop when the last
 				 * line in the file reaches the top of screen.
 				 */
-				eof = 1;
 				if (!force && position(TOP) != NULL_POSITION)
 					break;
 				if (!empty_lines(0, 0) && 
@@ -237,7 +255,8 @@
 		 * start the display after the beginning of the file,
 		 * and it is not appropriate to squish in that case.
 		 */
-		if (first_time && pos == NULL_POSITION && !top_scroll && 
+		if ((first_time || less_is_more) &&
+		    pos == NULL_POSITION && !top_scroll && 
 #if TAGS
 		    tagoption == NULL &&
 #endif
@@ -271,7 +290,7 @@
 		forw_prompt = 1;
 	}
 
-	if (nlines == 0)
+	if (nlines == 0 && !ignore_eoi && same_pos_bell)
 		eof_bell();
 	else if (do_repaint)
 		repaint();
@@ -284,7 +303,7 @@
  */
 	public void
 back(n, pos, force, only_last)
-	register int n;
+	int n;
 	POSITION pos;
 	int force;
 	int only_last;
@@ -294,11 +313,20 @@
 
 	squish_check();
 	do_repaint = (n > get_back_scroll() || (only_last && n > sc_height-1));
+#if HILITE_SEARCH
+	if (hilite_search == OPT_ONPLUS || is_filtering() || status_col) {
+		prep_hilite((pos < 3*size_linebuf) ?  0 : pos - 3*size_linebuf, pos, -1);
+	}
+#endif
 	while (--n >= 0)
 	{
 		/*
 		 * Get the previous line of input.
 		 */
+#if HILITE_SEARCH
+		pos = prev_unfiltered(pos);
+#endif
+
 		pos = back_line(pos);
 		if (pos == NULL_POSITION)
 		{
@@ -322,7 +350,7 @@
 		}
 	}
 
-	if (nlines == 0)
+	if (nlines == 0 && same_pos_bell)
 		eof_bell();
 	else if (do_repaint)
 		repaint();
@@ -421,3 +449,21 @@
 		return (sc_height - 2);
 	return (10000); /* infinity */
 }
+
+/*
+ * Return number of displayable lines in the file.
+ * Stop counting at screen height + 1.
+ */
+	public int
+get_line_count()
+{
+	int nlines;
+	POSITION pos = ch_zero();
+
+	for (nlines = 0;  nlines <= sc_height;  nlines++)
+	{
+		pos = forw_line(pos);
+		if (pos == NULL_POSITION) break;
+	}
+	return nlines;
+}

Modified: vendor/less/dist/funcs.h
===================================================================
--- vendor/less/dist/funcs.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/funcs.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,292 +1,310 @@
-	public char * save ();
-	public VOID_POINTER ecalloc ();
-	public char * skipsp ();
-	public int sprefix ();
-	public void quit ();
-	public void raw_mode ();
-	public void scrsize ();
-	public char * special_key_str ();
-	public void get_term ();
-	public void init ();
-	public void deinit ();
-	public void home ();
-	public void add_line ();
-	public void remove_top ();
-	public void win32_scroll_up ();
-	public void lower_left ();
-	public void line_left ();
-	public void check_winch ();
-	public void goto_line ();
-	public void vbell ();
-	public void bell ();
-	public void clear ();
-	public void clear_eol ();
-	public void clear_bot ();
-	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 ();
-	public void WIN32setcolors ();
-	public void WIN32textout ();
-	public void match_brac ();
-	public void ch_ungetchar ();
-	public void end_logfile ();
-	public void sync_logfile ();
-	public int ch_seek ();
-	public int ch_end_seek ();
-	public int ch_beg_seek ();
-	public POSITION ch_length ();
-	public POSITION ch_tell ();
-	public int ch_forw_get ();
-	public int ch_back_get ();
-	public void ch_setbufspace ();
-	public void ch_flush ();
-	public int seekable ();
-	public void ch_set_eof ();
-	public void ch_init ();
-	public void ch_close ();
-	public int ch_getflags ();
-	public void ch_dump ();
-	public void init_charset ();
-	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 void put_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 ();
-	public int len_cmdbuf ();
-	public void set_mlist ();
-	public void cmd_addhist ();
-	public void cmd_accept ();
-	public int cmd_char ();
-	public LINENUM cmd_int ();
-	public char * get_cmdbuf ();
-	public char * cmd_lastpattern ();
-	public void init_cmdhist ();
-	public void save_cmdhist ();
-	public int in_mca ();
-	public void dispversion ();
-	public int getcc ();
-	public void ungetcc ();
-	public void ungetsc ();
-	public void commands ();
-	public int cvt_length ();
-	public int * cvt_alloc_chpos ();
-	public void cvt_text ();
-	public void init_cmds ();
-	public void add_fcmd_table ();
-	public void add_ecmd_table ();
-	public int fcmd_decode ();
-	public int ecmd_decode ();
-	public char * lgetenv ();
-	public int lesskey ();
-	public void add_hometable ();
-	public int editchar ();
-	public void init_textlist ();
-	public char * forw_textlist ();
-	public char * back_textlist ();
-	public int edit ();
-	public int edit_ifile ();
-	public int edit_list ();
-	public int edit_first ();
-	public int edit_last ();
-	public int edit_next ();
-	public int edit_prev ();
-	public int edit_index ();
-	public IFILE save_curr_ifile ();
-	public void unsave_ifile ();
-	public void reedit_ifile ();
-	public void reopen_curr_ifile ();
-	public int edit_stdin ();
-	public void cat_file ();
-	public void use_logfile ();
-	public char * shell_unquote ();
-	public char * get_meta_escape ();
-	public char * shell_quote ();
-	public char * homefile ();
-	public char * fexpand ();
-	public char * fcomplete ();
-	public int bin_file ();
-	public char * lglob ();
-	public char * open_altfile ();
-	public void close_altfile ();
-	public int is_dir ();
-	public char * bad_file ();
-	public POSITION filesize ();
-	public char * shell_coption ();
-	public char * last_component ();
-	public int eof_displayed ();
-	public int entire_file_displayed ();
-	public void squish_check ();
-	public void forw ();
-	public void back ();
-	public void forward ();
-	public void backward ();
-	public int get_back_scroll ();
-	public void del_ifile ();
-	public IFILE next_ifile ();
-	public IFILE prev_ifile ();
-	public IFILE getoff_ifile ();
-	public int nifile ();
-	public IFILE get_ifile ();
-	public char * get_filename ();
-	public int get_index ();
-	public void store_pos ();
-	public void get_pos ();
-	public void set_open ();
-	public int opened ();
-	public void hold_ifile ();
-	public int held_ifile ();
-	public void * get_filestate ();
-	public void set_filestate ();
-	public void if_dump ();
-	public POSITION forw_line ();
-	public POSITION back_line ();
-	public void set_attnpos ();
-	public void jump_forw ();
-	public void jump_back ();
-	public void repaint ();
-	public void jump_percent ();
-	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 void set_status_col ();
-	public int gline ();
-	public void null_line ();
-	public POSITION forw_raw_line ();
-	public POSITION back_raw_line ();
-	public void clr_linenum ();
-	public void add_lnum ();
-	public LINENUM find_linenum ();
-	public POSITION find_pos ();
-	public LINENUM currline ();
-	public void lsystem ();
-	public int pipe_mark ();
-	public int pipe_data ();
-	public void init_mark ();
-	public int badmark ();
-	public void setmark ();
-	public void lastmark ();
-	public void gomark ();
-	public POSITION markpos ();
-	public void unmark ();
-	public void opt_o ();
-	public void opt__O ();
-	public void opt_j ();
-	public void calc_jump_sline ();
-	public void opt_shift ();
-	public void calc_shift_count ();
-	public void opt_k ();
-	public void opt_t ();
-	public void opt__T ();
-	public void opt_p ();
-	public void opt__P ();
-	public void opt_b ();
-	public void opt_i ();
-	public void opt__V ();
-	public void opt_D ();
-	public void opt_x ();
-	public void opt_quote ();
-	public void opt_query ();
-	public int get_swindow ();
-	public char * propt ();
-	public void scan_option ();
-	public void toggle_option ();
-	public int opt_has_param ();
-	public char * opt_prompt ();
-	public int isoptpending ();
-	public void nopendopt ();
-	public int getnum ();
-	public long getfraction ();
-	public int get_quit_at_eof ();
-	public void init_option ();
-	public struct loption * findopt ();
-	public struct loption * findopt_name ();
-	public int iread ();
-	public void intread ();
-	public long get_time ();
-	public char * errno_message ();
-	public int percentage ();
-	public POSITION percent_pos ();
-	public int  os9_signal ();
-	public void put_line ();
-	public void flush ();
-	public int putchr ();
-	public void putstr ();
-	public void get_return ();
-	public void error ();
-	public void ierror ();
-	public int query ();
-	public int compile_pattern ();
-	public void uncompile_pattern ();
-	public int is_null_pattern ();
-	public int match_pattern ();
-	public POSITION position ();
-	public void add_forw_pos ();
-	public void add_back_pos ();
-	public void pos_clear ();
-	public void pos_init ();
-	public int onscreen ();
-	public int empty_screen ();
-	public int empty_lines ();
-	public void get_scrpos ();
-	public int adjsline ();
-	public void init_prompt ();
-	public char * pr_expand ();
-	public char * eq_message ();
-	public char * pr_string ();
-	public char * wait_message ();
-	public void init_search ();
-	public void repaint_hilite ();
-	public void clear_attn ();
-	public void undo_search ();
-	public void clr_hlist ();
-	public void clr_hilite ();
-	public void clr_filter ();
-	public int is_filtered ();
-	public int is_hilited ();
-	public void chg_caseless ();
-	public void chg_hilite ();
-	public int search ();
-	public void prep_hilite ();
-	public void set_filter_pattern ();
-	public int is_filtering ();
-	public RETSIGTYPE winch ();
-	public RETSIGTYPE winch ();
-	public void init_signals ();
-	public void psignals ();
-	public void cleantags ();
-	public int gettagtype ();
-	public void findtag ();
-	public POSITION tagsearch ();
-	public char * nexttag ();
-	public char * prevtag ();
-	public int ntags ();
-	public int curr_tag ();
-	public int edit_tagfile ();
-	public void open_getchr ();
-	public void close_getchr ();
-	public int getchr ();
+public char * save LESSPARAMS ((constant char *s));
+public VOID_POINTER ecalloc LESSPARAMS ((int count, unsigned int size));
+public char * skipsp LESSPARAMS ((char *s));
+public int sprefix LESSPARAMS ((char *ps, char *s, int uppercase));
+public void quit LESSPARAMS ((int status));
+public void raw_mode LESSPARAMS ((int on));
+public void scrsize LESSPARAMS ((VOID_PARAM));
+public char * special_key_str LESSPARAMS ((int key));
+public void get_term LESSPARAMS ((VOID_PARAM));
+public void init LESSPARAMS ((VOID_PARAM));
+public void deinit LESSPARAMS ((VOID_PARAM));
+public void home LESSPARAMS ((VOID_PARAM));
+public void add_line LESSPARAMS ((VOID_PARAM));
+public void remove_top LESSPARAMS ((int n));
+public void win32_scroll_up LESSPARAMS ((int n));
+public void lower_left LESSPARAMS ((VOID_PARAM));
+public void line_left LESSPARAMS ((VOID_PARAM));
+public void check_winch LESSPARAMS ((VOID_PARAM));
+public void goto_line LESSPARAMS ((int sindex));
+public void vbell LESSPARAMS ((VOID_PARAM));
+public void bell LESSPARAMS ((VOID_PARAM));
+public void clear LESSPARAMS ((VOID_PARAM));
+public void clear_eol LESSPARAMS ((VOID_PARAM));
+public void clear_bot LESSPARAMS ((VOID_PARAM));
+public void at_enter LESSPARAMS ((int attr));
+public void at_exit LESSPARAMS ((VOID_PARAM));
+public void at_switch LESSPARAMS ((int attr));
+public int is_at_equiv LESSPARAMS ((int attr1, int attr2));
+public int apply_at_specials LESSPARAMS ((int attr));
+public void backspace LESSPARAMS ((VOID_PARAM));
+public void putbs LESSPARAMS ((VOID_PARAM));
+public char WIN32getch LESSPARAMS ((int tty));
+public void WIN32setcolors LESSPARAMS ((int fg, int bg));
+public void WIN32textout LESSPARAMS ((char *text, int len));
+public void match_brac LESSPARAMS ((int obrac, int cbrac, int forwdir, int n));
+public void ch_ungetchar LESSPARAMS ((int c));
+public void end_logfile LESSPARAMS ((VOID_PARAM));
+public void sync_logfile LESSPARAMS ((VOID_PARAM));
+public int ch_seek LESSPARAMS ((POSITION pos));
+public int ch_end_seek LESSPARAMS ((VOID_PARAM));
+public int ch_end_buffer_seek LESSPARAMS ((VOID_PARAM));
+public int ch_beg_seek LESSPARAMS ((VOID_PARAM));
+public POSITION ch_length LESSPARAMS ((VOID_PARAM));
+public POSITION ch_tell LESSPARAMS ((VOID_PARAM));
+public int ch_forw_get LESSPARAMS ((VOID_PARAM));
+public int ch_back_get LESSPARAMS ((VOID_PARAM));
+public void ch_setbufspace LESSPARAMS ((int bufspace));
+public void ch_flush LESSPARAMS ((VOID_PARAM));
+public int seekable LESSPARAMS ((int f));
+public void ch_set_eof LESSPARAMS ((VOID_PARAM));
+public void ch_init LESSPARAMS ((int f, int flags));
+public void ch_close LESSPARAMS ((VOID_PARAM));
+public int ch_getflags LESSPARAMS ((VOID_PARAM));
+public void ch_dump LESSPARAMS ((VOID_PARAM));
+public void setfmt LESSPARAMS ((char *s, char **fmtvarptr, int *attrptr, char *default_fmt));
+public void init_charset LESSPARAMS ((VOID_PARAM));
+public int binary_char LESSPARAMS ((LWCHAR c));
+public int control_char LESSPARAMS ((LWCHAR c));
+public char * prchar LESSPARAMS ((LWCHAR c));
+public char * prutfchar LESSPARAMS ((LWCHAR ch));
+public int utf_len LESSPARAMS ((unsigned char ch));
+public int is_utf8_well_formed LESSPARAMS ((char *ss, int slen));
+public void utf_skip_to_lead LESSPARAMS ((char **pp, char *limit));
+public LWCHAR get_wchar LESSPARAMS ((constant char *p));
+public void put_wchar LESSPARAMS ((char **pp, LWCHAR ch));
+public LWCHAR step_char LESSPARAMS ((char **pp, signed int dir, constant char *limit));
+public int is_composing_char LESSPARAMS ((LWCHAR ch));
+public int is_ubin_char LESSPARAMS ((LWCHAR ch));
+public int is_wide_char LESSPARAMS ((LWCHAR ch));
+public int is_combining_char LESSPARAMS ((LWCHAR ch1, LWCHAR ch2));
+public void cmd_reset LESSPARAMS ((VOID_PARAM));
+public void clear_cmd LESSPARAMS ((VOID_PARAM));
+public void cmd_putstr LESSPARAMS ((constant char *s));
+public int len_cmdbuf LESSPARAMS ((VOID_PARAM));
+public void set_mlist LESSPARAMS ((void *mlist, int cmdflags));
+public void cmd_addhist LESSPARAMS ((struct mlist *mlist, constant char *cmd, int modified));
+public void cmd_accept LESSPARAMS ((VOID_PARAM));
+public int cmd_char LESSPARAMS ((int c));
+public LINENUM cmd_int LESSPARAMS ((long *frac));
+public char * get_cmdbuf LESSPARAMS ((VOID_PARAM));
+public char * cmd_lastpattern LESSPARAMS ((VOID_PARAM));
+public void init_cmdhist LESSPARAMS ((VOID_PARAM));
+public void save_cmdhist LESSPARAMS ((VOID_PARAM));
+public int in_mca LESSPARAMS ((VOID_PARAM));
+public void dispversion LESSPARAMS ((VOID_PARAM));
+public int getcc LESSPARAMS ((VOID_PARAM));
+public void ungetcc LESSPARAMS ((LWCHAR c));
+public void ungetsc LESSPARAMS ((char *s));
+public LWCHAR peekcc LESSPARAMS ((VOID_PARAM));
+public void commands LESSPARAMS ((VOID_PARAM));
+public int cvt_length LESSPARAMS ((int len, int ops));
+public int * cvt_alloc_chpos LESSPARAMS ((int len));
+public void cvt_text LESSPARAMS ((char *odst, char *osrc, int *chpos, int *lenp, int ops));
+public void expand_cmd_tables LESSPARAMS ((VOID_PARAM));
+public void init_cmds LESSPARAMS ((VOID_PARAM));
+public void add_fcmd_table LESSPARAMS ((char *buf, int len));
+public void add_ecmd_table LESSPARAMS ((char *buf, int len));
+public int fcmd_decode LESSPARAMS ((char *cmd, char **sp));
+public int ecmd_decode LESSPARAMS ((char *cmd, char **sp));
+public char * lgetenv LESSPARAMS ((char *var));
+public int lesskey LESSPARAMS ((char *filename, int sysvar));
+public void add_hometable LESSPARAMS ((char *envname, char *def_filename, int sysvar));
+public int editchar LESSPARAMS ((int c, int flags));
+public void init_textlist LESSPARAMS ((struct textlist *tlist, char *str));
+public char * forw_textlist LESSPARAMS ((struct textlist *tlist, char *prev));
+public char * back_textlist LESSPARAMS ((struct textlist *tlist, char *prev));
+public int edit LESSPARAMS ((char *filename));
+public int edit_ifile LESSPARAMS ((IFILE ifile));
+public int edit_list LESSPARAMS ((char *filelist));
+public int edit_first LESSPARAMS ((VOID_PARAM));
+public int edit_last LESSPARAMS ((VOID_PARAM));
+public int edit_next LESSPARAMS ((int n));
+public int edit_prev LESSPARAMS ((int n));
+public int edit_index LESSPARAMS ((int n));
+public IFILE save_curr_ifile LESSPARAMS ((VOID_PARAM));
+public void unsave_ifile LESSPARAMS ((IFILE save_ifile));
+public void reedit_ifile LESSPARAMS ((IFILE save_ifile));
+public void reopen_curr_ifile LESSPARAMS ((VOID_PARAM));
+public int edit_stdin LESSPARAMS ((VOID_PARAM));
+public void cat_file LESSPARAMS ((VOID_PARAM));
+public void use_logfile LESSPARAMS ((char *filename));
+public char * shell_unquote LESSPARAMS ((char *str));
+public char * get_meta_escape LESSPARAMS ((VOID_PARAM));
+public char * shell_quote LESSPARAMS ((char *s));
+public char * homefile LESSPARAMS ((char *filename));
+public char * fexpand LESSPARAMS ((char *s));
+public char * fcomplete LESSPARAMS ((char *s));
+public int bin_file LESSPARAMS ((int f));
+public char * lglob LESSPARAMS ((char *filename));
+public char * open_altfile LESSPARAMS ((char *filename, int *pf, void **pfd));
+public void close_altfile LESSPARAMS ((char *altfilename, char *filename));
+public int is_dir LESSPARAMS ((char *filename));
+public char * bad_file LESSPARAMS ((char *filename));
+public POSITION filesize LESSPARAMS ((int f));
+public char * shell_coption LESSPARAMS ((VOID_PARAM));
+public char * last_component LESSPARAMS ((char *name));
+public int eof_displayed LESSPARAMS ((VOID_PARAM));
+public int entire_file_displayed LESSPARAMS ((VOID_PARAM));
+public void squish_check LESSPARAMS ((VOID_PARAM));
+public void forw LESSPARAMS ((int n, POSITION pos, int force, int only_last, int nblank));
+public void back LESSPARAMS ((int n, POSITION pos, int force, int only_last));
+public void forward LESSPARAMS ((int n, int force, int only_last));
+public void backward LESSPARAMS ((int n, int force, int only_last));
+public int get_back_scroll LESSPARAMS ((VOID_PARAM));
+public int get_line_count LESSPARAMS ((VOID_PARAM));
+public void del_ifile LESSPARAMS ((IFILE h));
+public IFILE next_ifile LESSPARAMS ((IFILE h));
+public IFILE prev_ifile LESSPARAMS ((IFILE h));
+public IFILE getoff_ifile LESSPARAMS ((IFILE ifile));
+public int nifile LESSPARAMS ((VOID_PARAM));
+public IFILE get_ifile LESSPARAMS ((char *filename, IFILE prev));
+public char * get_filename LESSPARAMS ((IFILE ifile));
+public int get_index LESSPARAMS ((IFILE ifile));
+public void store_pos LESSPARAMS ((IFILE ifile, struct scrpos *scrpos));
+public void get_pos LESSPARAMS ((IFILE ifile, struct scrpos *scrpos));
+public void set_open LESSPARAMS ((IFILE ifile));
+public int opened LESSPARAMS ((IFILE ifile));
+public void hold_ifile LESSPARAMS ((IFILE ifile, int incr));
+public int held_ifile LESSPARAMS ((IFILE ifile));
+public void * get_filestate LESSPARAMS ((IFILE ifile));
+public void set_filestate LESSPARAMS ((IFILE ifile, void *filestate));
+public void set_altpipe LESSPARAMS ((IFILE ifile, void *p));
+public void * get_altpipe LESSPARAMS ((IFILE ifile));
+public void set_altfilename LESSPARAMS ((IFILE ifile, char *altfilename));
+public char * get_altfilename LESSPARAMS ((IFILE ifile));
+public void if_dump LESSPARAMS ((VOID_PARAM));
+public POSITION forw_line LESSPARAMS ((POSITION curr_pos));
+public POSITION back_line LESSPARAMS ((POSITION curr_pos));
+public void set_attnpos LESSPARAMS ((POSITION pos));
+public void jump_forw LESSPARAMS ((VOID_PARAM));
+public void jump_forw_buffered LESSPARAMS ((VOID_PARAM));
+public void jump_back LESSPARAMS ((LINENUM linenum));
+public void repaint LESSPARAMS ((VOID_PARAM));
+public void jump_percent LESSPARAMS ((int percent, long fraction));
+public void jump_line_loc LESSPARAMS ((POSITION pos, int sline));
+public void jump_loc LESSPARAMS ((POSITION pos, int sline));
+public void init_line LESSPARAMS ((VOID_PARAM));
+public int is_ascii_char LESSPARAMS ((LWCHAR ch));
+public void prewind LESSPARAMS ((VOID_PARAM));
+public void plinenum LESSPARAMS ((POSITION pos));
+public void pshift_all LESSPARAMS ((VOID_PARAM));
+public int is_ansi_end LESSPARAMS ((LWCHAR ch));
+public int is_ansi_middle LESSPARAMS ((LWCHAR ch));
+public void skip_ansi LESSPARAMS ((char **pp, constant char *limit));
+public int pappend LESSPARAMS ((unsigned char c, POSITION pos));
+public int pflushmbc LESSPARAMS ((VOID_PARAM));
+public void pdone LESSPARAMS ((int endline, int chopped, int forw));
+public void set_status_col LESSPARAMS ((char c));
+public int gline LESSPARAMS ((int i, int *ap));
+public void null_line LESSPARAMS ((VOID_PARAM));
+public POSITION forw_raw_line LESSPARAMS ((POSITION curr_pos, char **linep, int *line_lenp));
+public POSITION back_raw_line LESSPARAMS ((POSITION curr_pos, char **linep, int *line_lenp));
+public int rrshift LESSPARAMS ((VOID_PARAM));
+public void clr_linenum LESSPARAMS ((VOID_PARAM));
+public void add_lnum LESSPARAMS ((LINENUM linenum, POSITION pos));
+public LINENUM find_linenum LESSPARAMS ((POSITION pos));
+public POSITION find_pos LESSPARAMS ((LINENUM linenum));
+public LINENUM currline LESSPARAMS ((int where));
+public void lsystem LESSPARAMS ((char *cmd, char *donemsg));
+public int pipe_mark LESSPARAMS ((int c, char *cmd));
+public int pipe_data LESSPARAMS ((char *cmd, POSITION spos, POSITION epos));
+public void init_mark LESSPARAMS ((VOID_PARAM));
+public int badmark LESSPARAMS ((int c));
+public void setmark LESSPARAMS ((int c, int where));
+public void clrmark LESSPARAMS ((int c));
+public void lastmark LESSPARAMS ((VOID_PARAM));
+public void gomark LESSPARAMS ((int c));
+public POSITION markpos LESSPARAMS ((int c));
+public char posmark LESSPARAMS ((POSITION pos));
+public void unmark LESSPARAMS ((IFILE ifile));
+public void opt_o LESSPARAMS ((int type, char *s));
+public void opt__O LESSPARAMS ((int type, char *s));
+public void opt_j LESSPARAMS ((int type, char *s));
+public void calc_jump_sline LESSPARAMS ((VOID_PARAM));
+public void opt_shift LESSPARAMS ((int type, char *s));
+public void calc_shift_count LESSPARAMS ((VOID_PARAM));
+public void opt_k LESSPARAMS ((int type, char *s));
+public void opt_t LESSPARAMS ((int type, char *s));
+public void opt__T LESSPARAMS ((int type, char *s));
+public void opt_p LESSPARAMS ((int type, char *s));
+public void opt__P LESSPARAMS ((int type, char *s));
+public void opt_b LESSPARAMS ((int type, char *s));
+public void opt_i LESSPARAMS ((int type, char *s));
+public void opt__V LESSPARAMS ((int type, char *s));
+public void opt_D LESSPARAMS ((int type, char *s));
+public void opt_x LESSPARAMS ((int type, char *s));
+public void opt_quote LESSPARAMS ((int type, char *s));
+public void opt_rscroll LESSPARAMS ((int type, char *s));
+public void opt_query LESSPARAMS ((int type, char *s));
+public int get_swindow LESSPARAMS ((VOID_PARAM));
+public char * propt LESSPARAMS ((int c));
+public void scan_option LESSPARAMS ((char *s));
+public void toggle_option LESSPARAMS ((struct loption *o, int lower, char *s, int how_toggle));
+public int opt_has_param LESSPARAMS ((struct loption *o));
+public char * opt_prompt LESSPARAMS ((struct loption *o));
+public int isoptpending LESSPARAMS ((VOID_PARAM));
+public void nopendopt LESSPARAMS ((VOID_PARAM));
+public int getnum LESSPARAMS ((char **sp, char *printopt, int *errp));
+public long getfraction LESSPARAMS ((char **sp, char *printopt, int *errp));
+public int get_quit_at_eof LESSPARAMS ((VOID_PARAM));
+public void init_option LESSPARAMS ((VOID_PARAM));
+public struct loption * findopt LESSPARAMS ((int c));
+public struct loption * findopt_name LESSPARAMS ((char **p_optname, char **p_oname, int *p_err));
+public int iread LESSPARAMS ((int fd, unsigned char *buf, unsigned int len));
+public void intread LESSPARAMS ((VOID_PARAM));
+public time_type get_time LESSPARAMS ((VOID_PARAM));
+public char * errno_message LESSPARAMS ((char *filename));
+public int percentage LESSPARAMS ((POSITION num, POSITION den));
+public POSITION percent_pos LESSPARAMS ((POSITION pos, int percent, long fraction));
+public int  os9_signal LESSPARAMS ((int type, RETSIGTYPE (*handler)()));
+public void put_line LESSPARAMS ((VOID_PARAM));
+public void flush LESSPARAMS ((VOID_PARAM));
+public int putchr LESSPARAMS ((int c));
+public void putstr LESSPARAMS ((constant char *s));
+public void get_return LESSPARAMS ((VOID_PARAM));
+public void error LESSPARAMS ((char *fmt, PARG *parg));
+public void ierror LESSPARAMS ((char *fmt, PARG *parg));
+public int query LESSPARAMS ((char *fmt, PARG *parg));
+public int compile_pattern LESSPARAMS ((char *pattern, int search_type, PATTERN_TYPE *comp_pattern));
+public void uncompile_pattern LESSPARAMS ((PATTERN_TYPE *pattern));
+public int valid_pattern LESSPARAMS ((char *pattern));
+public int is_null_pattern LESSPARAMS ((PATTERN_TYPE pattern));
+public int match_pattern LESSPARAMS ((PATTERN_TYPE pattern, char *tpattern, char *line, int line_len, char **sp, char **ep, int notbol, int search_type));
+public POSITION position LESSPARAMS ((int sindex));
+public void add_forw_pos LESSPARAMS ((POSITION pos));
+public void add_back_pos LESSPARAMS ((POSITION pos));
+public void pos_clear LESSPARAMS ((VOID_PARAM));
+public void pos_init LESSPARAMS ((VOID_PARAM));
+public int onscreen LESSPARAMS ((POSITION pos));
+public int empty_screen LESSPARAMS ((VOID_PARAM));
+public int empty_lines LESSPARAMS ((int s, int e));
+public void get_scrpos LESSPARAMS ((struct scrpos *scrpos, int where));
+public int sindex_from_sline LESSPARAMS ((int sline));
+public void init_prompt LESSPARAMS ((VOID_PARAM));
+public char * pr_expand LESSPARAMS ((constant char *proto, int maxwidth));
+public char * eq_message LESSPARAMS ((VOID_PARAM));
+public char * pr_string LESSPARAMS ((VOID_PARAM));
+public char * wait_message LESSPARAMS ((VOID_PARAM));
+public void init_search LESSPARAMS ((VOID_PARAM));
+public void repaint_hilite LESSPARAMS ((int on));
+public void clear_attn LESSPARAMS ((VOID_PARAM));
+public void undo_search LESSPARAMS ((VOID_PARAM));
+public void clr_hlist LESSPARAMS ((struct hilite_tree *anchor));
+public void clr_hilite LESSPARAMS ((VOID_PARAM));
+public void clr_filter LESSPARAMS ((VOID_PARAM));
+public int is_filtered LESSPARAMS ((POSITION pos));
+public POSITION next_unfiltered LESSPARAMS ((POSITION pos));
+public POSITION prev_unfiltered LESSPARAMS ((POSITION pos));
+public int is_hilited LESSPARAMS ((POSITION pos, POSITION epos, int nohide, int *p_matches));
+public void chg_hilite LESSPARAMS ((VOID_PARAM));
+public void chg_caseless LESSPARAMS ((VOID_PARAM));
+public int search LESSPARAMS ((int search_type, char *pattern, int n));
+public void prep_hilite LESSPARAMS ((POSITION spos, POSITION epos, int maxlines));
+public void set_filter_pattern LESSPARAMS ((char *pattern, int search_type));
+public int is_filtering LESSPARAMS ((VOID_PARAM));
+public RETSIGTYPE winch LESSPARAMS ((int type));
+public void init_signals LESSPARAMS ((int on));
+public void psignals LESSPARAMS ((VOID_PARAM));
+public void cleantags LESSPARAMS ((VOID_PARAM));
+public int gettagtype LESSPARAMS ((VOID_PARAM));
+public void findtag LESSPARAMS ((char *tag));
+public POSITION tagsearch LESSPARAMS ((VOID_PARAM));
+public char * nexttag LESSPARAMS ((int n));
+public char * prevtag LESSPARAMS ((int n));
+public int ntags LESSPARAMS ((VOID_PARAM));
+public int curr_tag LESSPARAMS ((VOID_PARAM));
+public int edit_tagfile LESSPARAMS ((VOID_PARAM));
+public void open_getchr LESSPARAMS ((VOID_PARAM));
+public void close_getchr LESSPARAMS ((VOID_PARAM));
+public int getchr LESSPARAMS ((VOID_PARAM));

Modified: vendor/less/dist/help.c
===================================================================
--- vendor/less/dist/help.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/help.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,4 +1,4 @@
-/* This file was generated by mkhelp from less.hlp */
+/* This file was generated by mkhelp.pl from less.hlp at 22:56 on 2017/12/5 */
 #include "less.h"
 constant char helpdata[] = {
 '\n',
@@ -23,9 +23,12 @@
 ' ',' ','E','S','C','-','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','F','o','r','w','a','r','d',' ',' ','o','n','e',' ','w','i','n','d','o','w',',',' ','b','u','t',' ','d','o','n','\'','t',' ','s','t','o','p',' ','a','t',' ','e','n','d','-','o','f','-','f','i','l','e','.','\n',
 ' ',' ','d',' ',' ','^','D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','F','o','r','w','a','r','d',' ',' ','o','n','e',' ','h','a','l','f','-','w','i','n','d','o','w',' ','(','a','n','d',' ','s','e','t',' ','h','a','l','f','-','w','i','n','d','o','w',' ','t','o',' ','_','\b','N',')','.','\n',
 ' ',' ','u',' ',' ','^','U',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','B','a','c','k','w','a','r','d',' ','o','n','e',' ','h','a','l','f','-','w','i','n','d','o','w',' ','(','a','n','d',' ','s','e','t',' ','h','a','l','f','-','w','i','n','d','o','w',' ','t','o',' ','_','\b','N',')','.','\n',
-' ',' ','E','S','C','-',')',' ',' ','R','i','g','h','t','A','r','r','o','w',' ','*',' ',' ','L','e','f','t',' ',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',' ','(','o','r',' ','_','\b','N',' ','p','o','s','i','t','i','o','n','s',')','.','\n',
-' ',' ','E','S','C','-','(',' ',' ','L','e','f','t','A','r','r','o','w',' ',' ','*',' ',' ','R','i','g','h','t',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',' ','(','o','r',' ','_','\b','N',' ','p','o','s','i','t','i','o','n','s',')','.','\n',
+' ',' ','E','S','C','-',')',' ',' ','R','i','g','h','t','A','r','r','o','w',' ','*',' ',' ','R','i','g','h','t',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',' ','(','o','r',' ','_','\b','N',' ','p','o','s','i','t','i','o','n','s',')','.','\n',
+' ',' ','E','S','C','-','(',' ',' ','L','e','f','t','A','r','r','o','w',' ',' ','*',' ',' ','L','e','f','t',' ',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',' ','(','o','r',' ','_','\b','N',' ','p','o','s','i','t','i','o','n','s',')','.','\n',
+' ',' ','E','S','C','-','}',' ',' ','^','R','i','g','h','t','A','r','r','o','w',' ',' ',' ','R','i','g','h','t',' ','t','o',' ','l','a','s','t',' ','c','o','l','u','m','n',' ','d','i','s','p','l','a','y','e','d','.','\n',
+' ',' ','E','S','C','-','{',' ',' ','^','L','e','f','t','A','r','r','o','w',' ',' ',' ',' ','L','e','f','t',' ',' ','t','o',' ','f','i','r','s','t',' ','c','o','l','u','m','n','.','\n',
 ' ',' ','F',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','f','o','r','e','v','e','r',';',' ','l','i','k','e',' ','"','t','a','i','l',' ','-','f','"','.','\n',
+' ',' ','E','S','C','-','F',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','L','i','k','e',' ','F',' ','b','u','t',' ','s','t','o','p',' ','w','h','e','n',' ','s','e','a','r','c','h',' ','p','a','t','t','e','r','n',' ','i','s',' ','f','o','u','n','d','.','\n',
 ' ',' ','r',' ',' ','^','R',' ',' ','^','L',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','R','e','p','a','i','n','t',' ','s','c','r','e','e','n','.','\n',
 ' ',' ','R',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','R','e','p','a','i','n','t',' ','s','c','r','e','e','n',',',' ','d','i','s','c','a','r','d','i','n','g',' ','b','u','f','f','e','r','e','d',' ','i','n','p','u','t','.','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
@@ -69,10 +72,12 @@
 ' ',' ',' ',' ',' ',' ',' ',' ','E','a','c','h',' ','"','f','i','n','d',' ','o','p','e','n',' ','b','r','a','c','k','e','t','"',' ','c','o','m','m','a','n','d',' ','g','o','e','s',' ','b','a','c','k','w','a','r','d',' ','t','o',' ','t','h','e',' ','o','p','e','n',' ','b','r','a','c','k','e','t',' ','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','m','a','t','c','h','i','n','g',' ','t','h','e',' ','(','_','\b','N','-','t','h',')',' ','c','l','o','s','e',' ','b','r','a','c','k','e','t',' ','i','n',' ','t','h','e',' ','b','o','t','t','o','m',' ','l','i','n','e','.','\n',
 '\n',
-' ',' ','m','_','\b','<','_','\b','l','_','\b','e','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','M','a','r','k',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','p','o','s','i','t','i','o','n',' ','w','i','t','h',' ','<','l','e','t','t','e','r','>','.','\n',
+' ',' ','m','_','\b','<','_','\b','l','_','\b','e','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','M','a','r','k',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','t','o','p',' ','l','i','n','e',' ','w','i','t','h',' ','<','l','e','t','t','e','r','>','.','\n',
+' ',' ','M','_','\b','<','_','\b','l','_','\b','e','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','M','a','r','k',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','b','o','t','t','o','m',' ','l','i','n','e',' ','w','i','t','h',' ','<','l','e','t','t','e','r','>','.','\n',
 ' ',' ','\'','_','\b','<','_','\b','l','_','\b','e','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','G','o',' ','t','o',' ','a',' ','p','r','e','v','i','o','u','s','l','y',' ','m','a','r','k','e','d',' ','p','o','s','i','t','i','o','n','.','\n',
 ' ',' ','\'','\'',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','G','o',' ','t','o',' ','t','h','e',' ','p','r','e','v','i','o','u','s',' ','p','o','s','i','t','i','o','n','.','\n',
 ' ',' ','^','X','^','X',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','a','m','e',' ','a','s',' ','\'','.','\n',
+' ',' ','E','S','C','-','M','_','\b','<','_','\b','l','_','\b','e','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','>',' ',' ',' ',' ',' ',' ',' ',' ','C','l','e','a','r',' ','a',' ','m','a','r','k','.','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ','A',' ','m','a','r','k',' ','i','s',' ','a','n','y',' ','u','p','p','e','r','-','c','a','s','e',' ','o','r',' ','l','o','w','e','r','-','c','a','s','e',' ','l','e','t','t','e','r','.','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ','C','e','r','t','a','i','n',' ','m','a','r','k','s',' ','a','r','e',' ','p','r','e','d','e','f','i','n','e','d',':','\n',
@@ -101,6 +106,7 @@
 '\n',
 ' ',' ','!','_','\b','c','_','\b','o','_','\b','m','_','\b','m','_','\b','a','_','\b','n','_','\b','d',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','x','e','c','u','t','e',' ','t','h','e',' ','s','h','e','l','l',' ','c','o','m','m','a','n','d',' ','w','i','t','h',' ','$','S','H','E','L','L','.','\n',
 ' ',' ','|','X','\b','X','_','\b','c','_','\b','o','_','\b','m','_','\b','m','_','\b','a','_','\b','n','_','\b','d',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','P','i','p','e',' ','f','i','l','e',' ','b','e','t','w','e','e','n',' ','c','u','r','r','e','n','t',' ','p','o','s',' ','&',' ','m','a','r','k',' ','X','\b','X',' ','t','o',' ','s','h','e','l','l',' ','c','o','m','m','a','n','d','.','\n',
+' ',' ','s',' ','_','\b','f','_','\b','i','_','\b','l','_','\b','e',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','a','v','e',' ','i','n','p','u','t',' ','t','o',' ','a',' ','f','i','l','e','.','\n',
 ' ',' ','v',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','d','i','t',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','f','i','l','e',' ','w','i','t','h',' ','$','V','I','S','U','A','L',' ','o','r',' ','$','E','D','I','T','O','R','.','\n',
 ' ',' ','V',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','P','r','i','n','t',' ','v','e','r','s','i','o','n',' ','n','u','m','b','e','r',' ','o','f',' ','"','l','e','s','s','"','.','\n',
 ' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
@@ -204,6 +210,8 @@
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','s','e','n','d',' ','t','e','r','m','c','a','p',' ','k','e','y','p','a','d',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','t','r','i','n','g','s','.','\n',
 ' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','f','o','l','l','o','w','-','n','a','m','e','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','T','h','e',' ','F',' ','c','o','m','m','a','n','d',' ','c','h','a','n','g','e','s',' ','f','i','l','e','s',' ','i','f',' ','t','h','e',' ','i','n','p','u','t',' ','f','i','l','e',' ','i','s',' ','r','e','n','a','m','e','d','.','\n',
+' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','u','s','e','-','b','a','c','k','s','l','a','s','h','\n',
+' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','u','b','s','e','q','u','e','n','t',' ','o','p','t','i','o','n','s',' ','u','s','e',' ','b','a','c','k','s','l','a','s','h',' ','a','s',' ','e','s','c','a','p','e',' ','c','h','a','r','.','\n',
 '\n',
 '\n',
 ' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
@@ -213,22 +221,22 @@
 ' ',' ',' ',' ',' ',' ',' ',' ','T','h','e','s','e',' ','k','e','y','s',' ','c','a','n',' ','b','e',' ','u','s','e','d',' ','t','o',' ','e','d','i','t',' ','t','e','x','t',' ','b','e','i','n','g',' ','e','n','t','e','r','e','d',' ','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ','o','n',' ','t','h','e',' ','"','c','o','m','m','a','n','d',' ','l','i','n','e','"',' ','a','t',' ','t','h','e',' ','b','o','t','t','o','m',' ','o','f',' ','t','h','e',' ','s','c','r','e','e','n','.','\n',
 '\n',
-' ','R','i','g','h','t','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','l',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n',
-' ','L','e','f','t','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','h',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n',
-' ','c','t','r','l','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','w',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','w','o','r','d','.','\n',
-' ','c','t','r','l','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','b',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','w','o','r','d','.','\n',
-' ','H','O','M','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','0',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','s','t','a','r','t',' ','o','f',' ','l','i','n','e','.','\n',
-' ','E','N','D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','$',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','e','n','d',' ','o','f',' ','l','i','n','e','.','\n',
-' ','B','A','C','K','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n',
-' ','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','x',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n',
-' ','c','t','r','l','-','B','A','C','K','S','P','A','C','E',' ',' ',' ','E','S','C','-','B','A','C','K','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n',
-' ','c','t','r','l','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','X',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n',
-' ','c','t','r','l','-','U',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C',' ','(','M','S','-','D','O','S',' ','o','n','l','y',')',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','e','n','t','i','r','e',' ','l','i','n','e','.','\n',
-' ','U','p','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','k',' ',' ',' ',' ',' ','R','e','t','r','i','e','v','e',' ','p','r','e','v','i','o','u','s',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n',
-' ','D','o','w','n','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','j',' ',' ',' ',' ',' ','R','e','t','r','i','e','v','e',' ','n','e','x','t',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n',
-' ','T','A','B',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','c','y','c','l','e','.','\n',
-' ','S','H','I','F','T','-','T','A','B',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','T','A','B',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','r','e','v','e','r','s','e',' ','c','y','c','l','e','.','\n',
-' ','c','t','r','l','-','L',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',',',' ','l','i','s','t',' ','a','l','l','.','\n',
+' ','R','i','g','h','t','A','r','r','o','w',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','l',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n',
+' ','L','e','f','t','A','r','r','o','w',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','h',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n',
+' ','c','t','r','l','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','w',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','w','o','r','d','.','\n',
+' ','c','t','r','l','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','b',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','w','o','r','d','.','\n',
+' ','H','O','M','E',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','0',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','s','t','a','r','t',' ','o','f',' ','l','i','n','e','.','\n',
+' ','E','N','D',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','$',' ','.','.','.',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','e','n','d',' ','o','f',' ','l','i','n','e','.','\n',
+' ','B','A','C','K','S','P','A','C','E',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n',
+' ','D','E','L','E','T','E',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','x',' ','.','.','.',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n',
+' ','c','t','r','l','-','B','A','C','K','S','P','A','C','E',' ',' ',' ','E','S','C','-','B','A','C','K','S','P','A','C','E',' ','.','.','.','.','.','.','.','.','.','.','.',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n',
+' ','c','t','r','l','-','D','E','L','E','T','E',' ','.','.','.','.',' ','E','S','C','-','D','E','L','E','T','E',' ','.','.','.','.',' ','E','S','C','-','X',' ','.','.','.',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n',
+' ','c','t','r','l','-','U',' ','.','.','.','.','.','.','.','.','.',' ','E','S','C',' ','(','M','S','-','D','O','S',' ','o','n','l','y',')',' ','.','.','.','.','.','.','.',' ','D','e','l','e','t','e',' ','e','n','t','i','r','e',' ','l','i','n','e','.','\n',
+' ','U','p','A','r','r','o','w',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','k',' ','.','.','.',' ','R','e','t','r','i','e','v','e',' ','p','r','e','v','i','o','u','s',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n',
+' ','D','o','w','n','A','r','r','o','w',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','j',' ','.','.','.',' ','R','e','t','r','i','e','v','e',' ','n','e','x','t',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n',
+' ','T','A','B',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','c','y','c','l','e','.','\n',
+' ','S','H','I','F','T','-','T','A','B',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','E','S','C','-','T','A','B',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','r','e','v','e','r','s','e',' ','c','y','c','l','e','.','\n',
+' ','c','t','r','l','-','L',' ','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',',',' ','l','i','s','t',' ','a','l','l','.','\n',
 '\n',
 '\n',
  0 };

Modified: vendor/less/dist/ifile.c
===================================================================
--- vendor/less/dist/ifile.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/ifile.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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,14 +24,16 @@
 extern IFILE	curr_ifile;
 
 struct ifile {
-	struct ifile *h_next;		/* Links for command line list */
+	struct ifile *h_next;           /* Links for command line list */
 	struct ifile *h_prev;
-	char *h_filename;		/* Name of the file */
-	void *h_filestate;		/* File state (used in ch.c) */
-	int h_index;			/* Index within command line list */
-	int h_hold;			/* Hold count */
-	char h_opened;			/* Has this ifile been opened? */
-	struct scrpos h_scrpos;		/* Saved position within the file */
+	char *h_filename;               /* Name of the file */
+	void *h_filestate;              /* File state (used in ch.c) */
+	int h_index;                    /* Index within command line list */
+	int h_hold;                     /* Hold count */
+	char h_opened;                  /* Has this ifile been opened? */
+	struct scrpos h_scrpos;         /* Saved position within the file */
+	void *h_altpipe;                /* Alt pipe */
+	char *h_altfilename;            /* Alt filename */
 };
 
 /*
@@ -50,7 +52,7 @@
 
 	static void
 incr_index(p, incr)
-	register struct ifile *p;
+	struct ifile *p;
 	int incr;
 {
 	for (;  p != &anchor;  p = p->h_next)
@@ -107,7 +109,7 @@
 	char *filename;
 	struct ifile *prev;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	/*
 	 * Allocate and initialize structure.
@@ -129,7 +131,7 @@
 del_ifile(h)
 	IFILE h;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	if (h == NULL_IFILE)
 		return;
@@ -153,7 +155,7 @@
 next_ifile(h)
 	IFILE h;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	p = (h == NULL_IFILE) ? &anchor : int_ifile(h);
 	if (p->h_next == &anchor)
@@ -168,7 +170,7 @@
 prev_ifile(h)
 	IFILE h;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	p = (h == NULL_IFILE) ? &anchor : int_ifile(h);
 	if (p->h_prev == &anchor)
@@ -208,7 +210,7 @@
 find_ifile(filename)
 	char *filename;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	for (p = anchor.h_next;  p != &anchor;  p = p->h_next)
 		if (strcmp(filename, p->h_filename) == 0)
@@ -226,7 +228,7 @@
 	char *filename;
 	IFILE prev;
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	if ((p = find_ifile(filename)) == NULL)
 		p = new_ifile(filename, int_ifile(prev));
@@ -328,11 +330,44 @@
 	int_ifile(ifile)->h_filestate = filestate;
 }
 
+	public void
+set_altpipe(ifile, p)
+	IFILE ifile;
+	void *p;
+{
+	int_ifile(ifile)->h_altpipe = p;
+}
+
+	public void *
+get_altpipe(ifile)
+	IFILE ifile;
+{
+	return (int_ifile(ifile)->h_altpipe);
+}
+
+	public void
+set_altfilename(ifile, altfilename)
+	IFILE ifile;
+	char *altfilename;
+{
+	struct ifile *p = int_ifile(ifile);
+	if (p->h_altfilename != NULL)
+		free(p->h_altfilename);
+	p->h_altfilename = altfilename;
+}
+
+	public char *
+get_altfilename(ifile)
+	IFILE ifile;
+{
+	return (int_ifile(ifile)->h_altfilename);
+}
+
 #if 0
 	public void
 if_dump()
 {
-	register struct ifile *p;
+	struct ifile *p;
 
 	for (p = anchor.h_next;  p != &anchor;  p = p->h_next)
 	{

Modified: vendor/less/dist/input.c
===================================================================
--- vendor/less/dist/input.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/input.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -7,7 +7,6 @@
  * For more information, see the README file.
  */
 
-
 /*
  * High level routines dealing with getting lines of input 
  * from the file being viewed.
@@ -47,9 +46,10 @@
 {
 	POSITION base_pos;
 	POSITION new_pos;
-	register int c;
+	int c;
 	int blankline;
 	int endline;
+	int chopped;
 	int backchars;
 
 get_forw_line:
@@ -60,6 +60,7 @@
 	}
 #if HILITE_SEARCH
 	if (hilite_search == OPT_ONPLUS || is_filtering() || status_col)
+	{
 		/*
 		 * If we are ignoring EOI (command F), only prepare
 		 * one line ahead, to avoid getting stuck waiting for
@@ -69,6 +70,8 @@
 		 */
 		prep_hilite(curr_pos, curr_pos + 3*size_linebuf, 
 				ignore_eoi ? 1 : -1);
+		curr_pos = next_unfiltered(curr_pos);
+	}
 #endif
 	if (ch_seek(curr_pos))
 	{
@@ -140,6 +143,7 @@
 	/*
 	 * Read each character in the line and append to the line buffer.
 	 */
+	chopped = FALSE;
 	for (;;)
 	{
 		if (ABORT_SIGS())
@@ -190,6 +194,7 @@
 				new_pos = ch_tell();
 				endline = TRUE;
 				quit_if_one_screen = FALSE;
+				chopped = TRUE;
 			} else
 			{
 				new_pos = ch_tell() - backchars;
@@ -200,7 +205,7 @@
 		c = ch_forw_get();
 	}
 
-	pdone(endline, 1);
+	pdone(endline, chopped, 1);
 
 #if HILITE_SEARCH
 	if (is_filtered(base_pos))
@@ -252,6 +257,7 @@
 	POSITION new_pos, begin_new_pos, base_pos;
 	int c;
 	int endline;
+	int chopped;
 	int backchars;
 
 get_back_line:
@@ -356,6 +362,7 @@
     loop:
 	begin_new_pos = new_pos;
 	(void) ch_seek(new_pos);
+	chopped = FALSE;
 
 	do
 	{
@@ -388,6 +395,7 @@
 			if (chopline || hshift > 0)
 			{
 				endline = TRUE;
+				chopped = TRUE;
 				quit_if_one_screen = FALSE;
 				break;
 			}
@@ -402,7 +410,7 @@
 		}
 	} while (new_pos < curr_pos);
 
-	pdone(endline, 0);
+	pdone(endline, chopped, 0);
 
 #if HILITE_SEARCH
 	if (is_filtered(base_pos))
@@ -439,19 +447,22 @@
 		{
 			c = ch_forw_get();
 			if (c == EOI)
-				return;
-			if (c != '\n' && c != '\r')
 				break;
+			if (c == '\n' || c == '\r')
+			{
+				(void) ch_back_get();
+				break;
+			}
 			pos++;
 		}
+		end_attnpos = pos;
+		for (;;)
+		{
+			c = ch_back_get();
+			if (c == EOI || c == '\n' || c == '\r')
+				break;
+			pos--;
+		}
 	}
 	start_attnpos = pos;
-	for (;;)
-	{
-		c = ch_forw_get();
-		pos++;
-		if (c == EOI || c == '\n' || c == '\r')
-			break;
-	}
-	end_attnpos = pos;
 }

Index: vendor/less/dist/install.sh
===================================================================
--- vendor/less/dist/install.sh	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/install.sh	2018-07-06 12:43:09 UTC (rev 11360)

Property changes on: vendor/less/dist/install.sh
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Modified: vendor/less/dist/jump.c
===================================================================
--- vendor/less/dist/jump.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/jump.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -51,7 +51,7 @@
 	end_pos = ch_tell();
 	pos = back_line(end_pos);
 	if (pos == NULL_POSITION)
-		jump_loc((POSITION)0, sc_height-1);
+		jump_loc(ch_zero(), sc_height-1);
 	else
 	{
 		jump_loc(pos, sc_height-1);
@@ -61,6 +61,24 @@
 }
 
 /*
+ * Jump to the last buffered line in the file.
+ */
+	public void
+jump_forw_buffered()
+{
+	POSITION end;
+
+	if (ch_end_buffer_seek())
+	{
+		error("Cannot seek to end of buffers", NULL_PARG);
+		return;
+	}
+	end = ch_tell();
+	if (end != NULL_POSITION && end > 0)
+		jump_line_loc(end-1, sc_height-1);
+}
+
+/*
  * Jump to line n in the file.
  */
 	public void
@@ -104,9 +122,13 @@
 	 * Start at the line currently at the top of the screen
 	 * and redisplay the screen.
 	 */
-	get_scrpos(&scrpos);
+	get_scrpos(&scrpos, TOP);
 	pos_clear();
-	jump_loc(scrpos.pos, scrpos.ln);
+	if (scrpos.pos == NULL_POSITION)
+		/* Screen hasn't been drawn yet. */
+		jump_loc(ch_zero(), 1);
+	else
+		jump_loc(scrpos.pos, scrpos.ln);
 }
 
 /*
@@ -178,7 +200,8 @@
 	POSITION pos;
 	int sline;
 {
-	register int nline;
+	int nline;
+	int sindex;
 	POSITION tpos;
 	POSITION bpos;
 
@@ -185,7 +208,7 @@
 	/*
 	 * Normalize sline.
 	 */
-	sline = adjsline(sline);
+	sindex = sindex_from_sline(sline);
 
 	if ((nline = onscreen(pos)) >= 0)
 	{
@@ -193,10 +216,10 @@
 		 * The line is currently displayed.  
 		 * Just scroll there.
 		 */
-		nline -= sline;
+		nline -= sindex;
 		if (nline > 0)
 			forw(nline, position(BOTTOM_PLUS_ONE), 1, 0, 0);
-		else
+		else if (nline < 0)
 			back(-nline, position(TOP), 1, 0);
 #if HILITE_SEARCH
 		if (show_attn)
@@ -229,7 +252,7 @@
 		 * call forw() and put the desired line at the 
 		 * sline-th line on the screen.
 		 */
-		for (nline = 0;  nline < sline;  nline++)
+		for (nline = 0;  nline < sindex;  nline++)
 		{
 			if (bpos != NULL_POSITION && pos <= bpos)
 			{
@@ -238,7 +261,7 @@
 				 * close enough to the current screen
 				 * that we can just scroll there after all.
 				 */
-				forw(sc_height-sline+nline-1, bpos, 1, 0, 0);
+				forw(sc_height-sindex+nline-1, bpos, 1, 0, 0);
 #if HILITE_SEARCH
 				if (show_attn)
 					repaint_hilite(1);
@@ -260,7 +283,7 @@
 		lastmark();
 		squished = 0;
 		screen_trashed = 0;
-		forw(sc_height-1, pos, 1, 0, sline-nline);
+		forw(sc_height-1, pos, 1, 0, sindex-nline);
 	} else
 	{
 		/*
@@ -267,9 +290,9 @@
 		 * The desired line is before the current screen.
 		 * Move forward in the file far enough so that we
 		 * can call back() and put the desired line at the 
-		 * sline-th line on the screen.
+		 * sindex-th line on the screen.
 		 */
-		for (nline = sline;  nline < sc_height - 1;  nline++)
+		for (nline = sindex;  nline < sc_height - 1;  nline++)
 		{
 			pos = forw_line(pos);
 			if (pos == NULL_POSITION)
@@ -281,6 +304,9 @@
 				 */
 				break;
 			}
+#if HILITE_SEARCH
+			pos = next_unfiltered(pos);
+#endif
 			if (pos >= tpos)
 			{
 				/* 

Modified: vendor/less/dist/less.h
===================================================================
--- vendor/less/dist/less.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/less.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -39,10 +39,17 @@
 /*
  * Language details.
  */
+#if HAVE_ANSI_PROTOS
+#define LESSPARAMS(a) a
+#else
+#define LESSPARAMS(a) ()
+#endif
 #if HAVE_VOID
 #define	VOID_POINTER	void *
+#define	VOID_PARAM	void
 #else
 #define	VOID_POINTER	char *
+#define	VOID_PARAM
 #define	void  int
 #endif
 #if HAVE_CONST
@@ -295,6 +302,15 @@
 	int ln;
 };
 
+/*
+ * A mark is an ifile (input file) plus a position within the file.
+ */
+struct mark 
+{
+	IFILE m_ifile;
+	struct scrpos m_scrpos;
+};
+
 typedef union parg
 {
 	char *p_string;
@@ -310,6 +326,17 @@
 	char *endstring;
 };
 
+struct wchar_range
+{
+	LWCHAR first, last;
+};
+
+struct wchar_range_table 
+{
+	struct wchar_range *table;
+	int count;
+};
+
 #define	EOI		(-1)
 
 #define	READ_INTR	(-2)
@@ -445,6 +472,7 @@
 
 #define	ESC		CONTROL('[')
 #define	CSI		((unsigned char)'\233')
+#define	CHAR_END_COMMAND 0x40000000
 
 #if _OSK_MWC32
 #define	LSIGNAL(sig,func)	os9_signal(sig,func)
@@ -486,7 +514,6 @@
 #define	CH_HELPFILE	010
 #define	CH_NODATA  	020	/* Special case for zero length files */
 
-
 #define	ch_zero()	((POSITION)0)
 
 #define	FAKE_HELPFILE	"@/\\less/\\help/\\file/\\@"
@@ -498,9 +525,19 @@
 #define	CVT_CRLF	04	/* Remove CR after LF */
 #define	CVT_ANSI	010	/* Remove ANSI escape sequences */
 
+#if HAVE_TIME_T
+#define time_type	time_t
+#else
+#define	time_type	long
+#endif
+
+struct mlist;
+struct loption;
+struct hilite_tree;
+#include "pattern.h"
 #include "funcs.h"
 
 /* Functions not included in funcs.h */
-void postoa();
-void linenumtoa();
-void inttoa();
+void postoa LESSPARAMS ((POSITION, char*));
+void linenumtoa LESSPARAMS ((LINENUM, char*));
+void inttoa LESSPARAMS ((int, char*));

Modified: vendor/less/dist/less.hlp
===================================================================
--- vendor/less/dist/less.hlp	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/less.hlp	2018-07-06 12:43:09 UTC (rev 11360)
@@ -20,9 +20,12 @@
   ESC-SPACE         *  Forward  one window, but don't stop at end-of-file.
   d  ^D             *  Forward  one half-window (and set half-window to _N).
   u  ^U             *  Backward one half-window (and set half-window to _N).
-  ESC-)  RightArrow *  Left  one half screen width (or _N positions).
-  ESC-(  LeftArrow  *  Right one half screen width (or _N positions).
+  ESC-)  RightArrow *  Right one half screen width (or _N positions).
+  ESC-(  LeftArrow  *  Left  one half screen width (or _N positions).
+  ESC-}  ^RightArrow   Right to last column displayed.
+  ESC-{  ^LeftArrow    Left  to first column.
   F                    Forward forever; like "tail -f".
+  ESC-F                Like F but stop when search pattern is found.
   r  ^R  ^L            Repaint screen.
   R                    Repaint screen, discarding buffered input.
         ---------------------------------------------------
@@ -66,10 +69,12 @@
         Each "find open bracket" command goes backward to the open bracket 
           matching the (_N-th) close bracket in the bottom line.
 
-  m_<_l_e_t_t_e_r_>            Mark the current position with <letter>.
+  m_<_l_e_t_t_e_r_>            Mark the current top line with <letter>.
+  M_<_l_e_t_t_e_r_>            Mark the current bottom line with <letter>.
   '_<_l_e_t_t_e_r_>            Go to a previously marked position.
   ''                   Go to the previous position.
   ^X^X                 Same as '.
+  ESC-M_<_l_e_t_t_e_r_>        Clear a mark.
         ---------------------------------------------------
         A mark is any upper-case or lower-case letter.
         Certain marks are predefined:
@@ -98,6 +103,7 @@
 
   !_c_o_m_m_a_n_d             Execute the shell command with $SHELL.
   |XX_c_o_m_m_a_n_d            Pipe file between current pos & mark XX to shell command.
+  s _f_i_l_e               Save input to a file.
   v                    Edit the current file with $VISUAL or $EDITOR.
   V                    Print version number of "less".
  ---------------------------------------------------------------------------
@@ -201,6 +207,8 @@
                   Don't send termcap keypad init/deinit strings.
       ........  --follow-name
                   The F command changes files if the input file is renamed.
+      ........  --use-backslash
+                  Subsequent options use backslash as escape char.
 
 
  ---------------------------------------------------------------------------
@@ -210,21 +218,21 @@
         These keys can be used to edit text being entered 
         on the "command line" at the bottom of the screen.
 
- RightArrow                       ESC-l     Move cursor right one character.
- LeftArrow                        ESC-h     Move cursor left one character.
- ctrl-RightArrow  ESC-RightArrow  ESC-w     Move cursor right one word.
- ctrl-LeftArrow   ESC-LeftArrow   ESC-b     Move cursor left one word.
- HOME                             ESC-0     Move cursor to start of line.
- END                              ESC-$     Move cursor to end of line.
- BACKSPACE                                  Delete char to left of cursor.
- DELETE                           ESC-x     Delete char under cursor.
- ctrl-BACKSPACE   ESC-BACKSPACE             Delete word to left of cursor.
- ctrl-DELETE      ESC-DELETE      ESC-X     Delete word under cursor.
- ctrl-U           ESC (MS-DOS only)         Delete entire line.
- UpArrow                          ESC-k     Retrieve previous command line.
- DownArrow                        ESC-j     Retrieve next command line.
- TAB                                        Complete filename & cycle.
- SHIFT-TAB                        ESC-TAB   Complete filename & reverse cycle.
- ctrl-L                                     Complete filename, list all.
+ RightArrow ..................... ESC-l ... Move cursor right one character.
+ LeftArrow ...................... ESC-h ... Move cursor left one character.
+ ctrl-RightArrow  ESC-RightArrow  ESC-w ... Move cursor right one word.
+ ctrl-LeftArrow   ESC-LeftArrow   ESC-b ... Move cursor left one word.
+ HOME ........................... ESC-0 ... Move cursor to start of line.
+ END ............................ ESC-$ ... Move cursor to end of line.
+ BACKSPACE ................................ Delete char to left of cursor.
+ DELETE ......................... ESC-x ... Delete char under cursor.
+ ctrl-BACKSPACE   ESC-BACKSPACE ........... Delete word to left of cursor.
+ ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor.
+ ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line.
+ UpArrow ........................ ESC-k ... Retrieve previous command line.
+ DownArrow ...................... ESC-j ... Retrieve next command line.
+ TAB ...................................... Complete filename & cycle.
+ SHIFT-TAB ...................... ESC-TAB   Complete filename & reverse cycle.
+ ctrl-L ................................... Complete filename, list all.
 
 

Modified: vendor/less/dist/less.nro
===================================================================
--- vendor/less/dist/less.nro	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/less.nro	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,4 +1,4 @@
-.TH LESS 1 "Version 458: 04 Apr 2013"
+.TH LESS 1 "Version 530: 05 Dec 2017"
 .SH NAME
 less \- opposite of more
 .SH SYNOPSIS
@@ -12,19 +12,19 @@
 .br
 .B "less [\-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]"
 .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.)
 
 .SH DESCRIPTION
 .I Less
-is a program similar to 
+is a program similar to
 .I more
 (1), but which allows backward movement
 in the file as well as forward movement.
@@ -44,8 +44,8 @@
 Commands are based on both
 .I more
 and
-.I vi.
-Commands may be preceded by a decimal number, 
+.IR vi .
+Commands may be preceded by a decimal number,
 called N in the descriptions below.
 The number is used by some commands, as indicated.
 
@@ -70,7 +70,7 @@
 The entire N lines are displayed, even if N is more than the screen size.
 .IP "d or ^D"
 Scroll forward N lines, default one half of the screen size.
-If N is specified, it becomes the new default for 
+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).
@@ -83,8 +83,12 @@
 Warning: some systems use ^Y as a special job control character.
 .IP "u or ^U"
 Scroll backward N lines, default one half of the screen size.
-If N is specified, it becomes the new default for 
+If N is specified, it becomes the new default for
 subsequent d and u commands.
+.IP "J"
+Like j, but continues to scroll beyond the end of the file.
+.IP "K or Y"
+Like k, but continues to scroll beyond the beginning of the file.
 .IP "ESC-) or RIGHTARROW"
 Scroll horizontally right N characters, default half the screen width
 (see the \-# option).
@@ -97,6 +101,10 @@
 (see the \-# option).
 If a number N is specified, it becomes the default for future RIGHTARROW
 and LEFTARROW commands.
+.IP "ESC-} or ^RIGHTARROW"
+Scroll horizontally right to show the end of the longest displayed line.
+.IP "ESC-{ or ^LEFTARROW"
+Scroll horizontally left back to the first column.
 .IP "r or ^R or ^L"
 Repaint the screen.
 .IP R
@@ -111,7 +119,7 @@
 (The behavior is similar to the "tail \-f" command.)
 .IP "ESC-F"
 Like F, but as soon as a line is found which matches
-the last search pattern, the terminal bell is rung 
+the last search pattern, the terminal bell is rung
 and forward scrolling stops.
 .IP "g or < or ESC-<"
 Go to line N in the file, default 1 (beginning of file).
@@ -121,6 +129,9 @@
 (Warning: this may be slow if N is large,
 or if N is not specified and
 standard input, rather than a file, is being read.)
+.IP "ESC-G"
+Same as G, except if no number N is specified and the input is standard input,
+goes to the last line which is currently buffered.
 .IP "p or %"
 Go to a position N percent into the file.
 N should be between 0 and 100, and may contain a decimal point.
@@ -154,20 +165,25 @@
 Followed by two characters,
 acts like {, but uses the two characters as open and close brackets,
 respectively.
-For example, "ESC ^F < >" could be used to 
+For example, "ESC ^F < >" could be used to
 go forward to the > which matches the < in the top displayed line.
 .IP "ESC-^B"
 Followed by two characters,
 acts like }, but uses the two characters as open and close brackets,
 respectively.
-For example, "ESC ^B < >" could be used to 
+For example, "ESC ^B < >" could be used to
 go backward to the < which matches the > in the bottom displayed line.
 .IP m
-Followed by any lowercase letter, 
-marks the current position with that letter.
+Followed by any lowercase or uppercase letter,
+marks the first displayed line with that letter.
+If the status column is enabled via the \-J option,
+the status column shows the marked line.
+.IP M
+Acts like m, except the last displayed line is marked
+rather than the first displayed line.
 .IP "'"
 (Single quote.)
-Followed by any lowercase letter, returns to the position which
+Followed by any lowercase or uppercase letter, returns to the position which
 was previously marked with that letter.
 Followed by another single quote, returns to the position at
 which the last "large" movement command was executed.
@@ -177,6 +193,9 @@
 so the ' command can be used to switch between input files.
 .IP "^X^X"
 Same as single quote.
+.IP "ESC-m"
+Followed by any lowercase or uppercase letter,
+clears the mark identified by that letter.
 .IP /pattern
 Search forward in the file for the N-th line containing the pattern.
 N defaults to 1.
@@ -193,7 +212,7 @@
 Search for lines which do NOT match the pattern.
 .IP "^E or *"
 Search multiple files.
-That is, if the search reaches the END of the current file 
+That is, if the search reaches the END of the current file
 without finding a match,
 the search continues in the next file in the command line list.
 .IP "^F or @"
@@ -202,7 +221,7 @@
 regardless of what is currently displayed on the screen
 or the settings of the \-a or \-j options.
 .IP "^K"
-Highlight any text which matches the pattern on the current screen, 
+Highlight any text which matches the pattern on the current screen,
 but don't move to the first match (KEEP current position).
 .IP "^R"
 Don't interpret regular expression metacharacters;
@@ -210,7 +229,8 @@
 .RE
 .IP ?pattern
 Search backward in the file for the N-th line containing the pattern.
-The search starts at the line immediately before the top line displayed.
+The search starts at the last line displayed 
+(but see the \-a and \-j options, which change this).
 .sp
 Certain characters are special as in the / command:
 .RS
@@ -218,7 +238,7 @@
 Search for lines which do NOT match the pattern.
 .IP "^E or *"
 Search multiple files.
-That is, if the search reaches the beginning of the current file 
+That is, if the search reaches the beginning of the current file
 without finding a match,
 the search continues in the previous file in the command line list.
 .IP "^F or @"
@@ -254,7 +274,7 @@
 and crossing file boundaries.
 .IP "ESC-u"
 Undo search highlighting.
-Turn off highlighting of strings matching the current search pattern. 
+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.
@@ -282,10 +302,10 @@
 If the filename is missing, the "current" file (see the :n and :p commands
 below) from the list of files in the command line is re-examined.
 A percent sign (%) in the filename is replaced by the name of the
-current file.  
+current file.
 A pound sign (#) is replaced by the name of the previously examined file.
-However, two consecutive percent signs are simply 
-replaced with a single percent sign.  
+However, two consecutive percent signs are simply
+replaced with a single percent sign.
 This allows you to enter a filename that contains a percent sign
 in the name.
 Similarly, two consecutive pound signs are replaced with a single pound sign.
@@ -338,7 +358,7 @@
 Like the \- command, but takes a long option name (see OPTIONS below)
 rather than a single option letter.
 You must press ENTER or RETURN after typing the option name.
-A ^P immediately after the second dash suppresses printing of a 
+A ^P immediately after the second dash suppresses printing of a
 message describing the new setting, as in the \- command.
 .IP \-+
 Followed by one of the command line option letters
@@ -370,19 +390,19 @@
 You must press ENTER or RETURN after typing the option name.
 .IP +cmd
 Causes the specified cmd to be executed each time a new file is examined.
-For example, +G causes 
+For example, +G causes
 .I less
-to initially display each file starting at the end 
+to initially display each file starting at the end
 rather than the beginning.
 .IP V
-Prints the version number of 
-.I less 
+Prints the version number of
+.I less
 being run.
 .IP "q or Q or :q or :Q or ZZ"
 Exits
-.I less.
+.IR less .
 .PP
-The following 
+The following
 four
 commands may or may not be valid, depending on your particular installation.
 .PP
@@ -395,7 +415,7 @@
 .IP "! shell-command"
 Invokes a shell to run the shell-command given.
 A percent sign (%) in the command is replaced by the name of the
-current file.  
+current file.
 A pound sign (#) is replaced by the name of the previously examined file.
 "!!" repeats the last shell command.
 "!" with no shell command simply invokes a shell.
@@ -405,10 +425,12 @@
 .IP "| <m> shell-command"
 <m> represents any mark letter.
 Pipes a section of the input file to the given shell command.
-The section of the file to be piped is between the first line on
-the current screen and the position marked by the letter.
+The section of the file to be piped is between the position marked by 
+the letter and the current screen.
+The entire current screen is included, regardless of whether the
+marked position is before or after the current screen.
 <m> may also be ^ or $ to indicate beginning or end of file respectively.
-If <m> is . or newline, the current screen is piped.
+If <m> is \&.\& or newline, the current screen is piped.
 .IP "s filename"
 Save the input to a file.
 This only works if the input is a pipe, not an ordinary file.
@@ -416,16 +438,16 @@
 .SH OPTIONS
 Command line options are described below.
 Most options may be changed while
-.I less 
+.I less
 is running, via the "\-" command.
 .PP
-Most options may be given in one of two forms: 
+Most options may be given in one of two forms:
 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.
+\-\-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;
@@ -433,20 +455,20 @@
 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 
-.I less 
-is invoked, you might tell 
-.I csh:
+For example,
+to avoid typing "less \-options \&...\&" each time
+.I less
+is invoked, you might tell
+.IR csh :
 .sp
-setenv LESS "-options"
+setenv LESS "\-options"
 .sp
-or if you use 
-.I sh:
+or if you use
+.IR sh :
 .sp
-LESS="-options"; export LESS
+LESS="\-options"; export LESS
 .sp
-On MS-DOS, you don't need the quotes, but you should replace any 
+On MS-DOS, you don't need the quotes, but you should replace any
 percent signs in the options string by double percent signs.
 .sp
 The environment variable is parsed before the command line,
@@ -461,11 +483,11 @@
 .sp
 LESS="Dn9.1$Ds4.1"
 .sp
-If the --use-backslash option appears earlier in the options, then
+If the \-\-use-backslash option appears earlier in the options, then
 a dollar sign or backslash may be included literally in an option string
 by preceding it with a backslash.
-If the --use-backslash option is not in effect, then backslashes are
-not treated specially, and there is no way to include a dollar sign 
+If the \-\-use-backslash option is not in effect, then backslashes are
+not treated specially, and there is no way to include a dollar sign
 in the option string.
 .IP "\-? or \-\-help"
 This option displays a summary of the commands accepted by
@@ -484,8 +506,8 @@
 and backward searches to start at the top of the screen,
 thus skipping all lines displayed on the screen.
 .IP "\-A or \-\-SEARCH-SKIP-SCREEN"
-Causes all forward searches (not just non-repeated searches) 
-to start just after the target line, and all backward searches 
+Causes all forward searches (not just non-repeated searches)
+to start just after the target line, and all backward searches
 to start just before the target line.
 Thus, forward searches will skip part of the displayed screen
 (from the first line up to and including the target line).
@@ -496,9 +518,9 @@
 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
+By default 64\ K 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 
+The \-b option specifies instead that \fIn\fP kilobytes of
 buffer space should be used for each file.
 If \fIn\fP is \-1, buffer space is unlimited; that is,
 the entire file can be read into memory.
@@ -508,11 +530,11 @@
 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,
-so that only 64K 
+so that only 64\ K
 (or the amount of space specified by the \-b option)
 is used for the pipe.
 Warning: use of \-B can result in erroneous display, since only the
-most recently viewed part of the piped data is kept in memory; 
+most recently viewed part of the piped data is kept in memory;
 any earlier data is lost.
 .IP "\-c or \-\-clear-screen"
 Causes full screen repaints to be painted from the top line down.
@@ -519,8 +541,8 @@
 By default,
 full screen repaints are done by scrolling from the bottom of the screen.
 .IP "\-C or \-\-CLEAR-SCREEN"
-Same as \-c, for compatibility with older versions of 
-.I less.
+Same as \-c, for compatibility with older versions of
+.IR less .
 .IP "\-d or \-\-dumb"
 The \-d option suppresses the error message
 normally displayed if the terminal is dumb;
@@ -532,24 +554,27 @@
 .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 
+\fBx\fP is a single character which selects the type of text whose color is
 being set: n=normal, s=standout, d=bold, u=underlined, k=blink.
-\fIcolor\fP is a pair of numbers separated by a period.  
-The first number selects the foreground color and the second selects 
+\fIcolor\fP is a pair of numbers separated by a period.
+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.M\fP,
 where \fIM\fP is the normal background color.
+The color may start or end with \fBu\fP to use underline (with the normal
+color, if by itself), if the system supports it (Windows only).
+\fBx\fP may also be \fBa\fP to toggle strict ANSI sequence rendering (SGR mode).
 
 .IP "\-e or \-\-quit-at-eof"
-Causes 
-.I less 
+Causes
+.I less
 to automatically exit
 the second time it reaches end-of-file.
-By default, the only way to exit 
+By default, the only way to exit
 .I less
 is via the "q" command.
 .IP "\-E or \-\-QUIT-AT-EOF"
-Causes 
+Causes
 .I less
 to automatically exit the first time it reaches end-of-file.
 .IP "\-f or \-\-force"
@@ -567,13 +592,13 @@
 to automatically exit
 if the entire file can be displayed on the first screen.
 .IP "\-g or \-\-hilite-search"
-Normally, 
-.I less 
+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 
+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.
@@ -587,11 +612,11 @@
 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; 
+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 
+Like \-i, but searches ignore case even if
 the pattern contains uppercase letters.
 .IP "\-j\fIn\fP or \-\-jump-target=\fIn\fP"
 Specifies a line on the screen where the "target" line
@@ -605,21 +630,25 @@
 of the screen: the bottom line on the screen is \-1, the second
 to the bottom is \-2, and so on.
 Alternately, the screen line may be specified as a fraction of the height
-of the screen, starting with a decimal point: .5 is in the middle of the
-screen, .3 is three tenths down from the first line, and so on.
+of the screen, starting with a decimal point: \&.5 is in the middle of the
+screen, \&.3 is three tenths down from the first line, and so on.
 If the line is specified as a fraction, the actual line number
 is recalculated if the terminal window is resized, so that the
 target line remains at the specified fraction of the screen height.
-If any form of the \-j option is used, 
-forward searches begin at the line immediately after the target line,
-and backward searches begin at the target line,
+If any form of the \-j option is used,
+repeated forward searches (invoked with "n" or "N")
+begin at the line immediately after the target line,
+and repeated backward searches begin at the target line,
 unless changed by \-a or \-A.
 For example, if "\-j4" is used, the target line is the
 fourth line on the screen, so forward searches begin at the fifth line
 on the screen.
+However nonrepeated searches (invoked with "/" or "?")
+always begin at the start or end of the current screen respectively.
 .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 shows the lines that matched the current search,
+and any lines that are marked (via the m or M command).
 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
@@ -630,7 +659,7 @@
 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 
+it is also used as a
 .I lesskey
 file.
 .IP "\-K or \-\-quit-on-intr"
@@ -641,16 +670,16 @@
 Normally, an interrupt character causes
 .I less
 to stop whatever it is doing and return to its command prompt.
-Note that use of this option makes it impossible to return to the 
+Note that use of this option makes it impossible to return to the
 command prompt from the "F" command.
 .IP "\-L or \-\-no-lessopen"
 Ignore the LESSOPEN environment variable
 (see the INPUT PREPROCESSOR section below).
-This option can be set from within \fIless\fP, 
-but it will apply only to files opened subsequently, not to the 
+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"
-Causes 
+Causes
 .I less
 to prompt verbosely (like \fImore\fP),
 with the percent into the file.
@@ -658,10 +687,10 @@
 .I less
 prompts with a colon.
 .IP "\-M or \-\-LONG-PROMPT"
-Causes 
+Causes
 .I less
-to prompt even more verbosely than 
-.I more.
+to prompt even more verbosely than
+.IR more .
 .IP "\-n or \-\-line-numbers"
 Suppresses line numbers.
 The default (to use line numbers) may cause
@@ -681,7 +710,7 @@
 to copy its input to the named file as it is being viewed.
 This applies only when the input file is a pipe,
 not an ordinary file.
-If the file already exists, 
+If the file already exists,
 .I less
 will ask for confirmation before overwriting it.
 .IP "\-O\fIfilename\fP or \-\-LOG-FILE=\fIfilename\fP"
@@ -689,14 +718,14 @@
 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
-.I less.
+.IR less .
 .IP "\-p\fIpattern\fP or \-\-pattern=\fIpattern\fP"
-The \-p option on the command line is equivalent to 
+The \-p option on the command line is equivalent to
 specifying +/\fIpattern\fP;
 that is, it tells
 .I less
@@ -705,24 +734,25 @@
 Provides a way to tailor the three prompt
 styles to your own preference.
 This option would normally be put in the LESS environment
-variable, rather than being typed in with each 
+variable, rather than being typed in with each
 .I less
 command.
 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 
+ \-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.
--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 
+ \-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"
 Causes moderately "quiet" operation:
-the terminal bell is not rung 
+the terminal bell is not rung
 if an attempt is made to scroll past the end of the file
 or before the beginning of the file.
 If the terminal has a "visual bell", it is used instead.
@@ -748,9 +778,9 @@
 Unlike \-r, the screen appearance is maintained correctly in most cases.
 ANSI "color" escape sequences are sequences of the form:
 .sp
-	ESC [ ... m
+	ESC [ \&...\& m
 .sp
-where the "..." is zero or more color specification characters 
+where the "...\&" is zero or more color specification characters
 For the purpose of keeping track of screen appearance,
 ANSI color escape sequences are assumed to not move the cursor.
 You can make
@@ -758,9 +788,9 @@
 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.
-And you can make 
-.I less 
-think that characters other than the standard ones may appear between 
+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"
@@ -780,19 +810,19 @@
 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",
-which was previously built by 
+which was previously built by
 .I ctags
 (1) or an equivalent command.
 If the environment variable LESSGLOBALTAGS is set, it is taken to be
-the name of a command compatible with 
+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 
-.I less 
+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
-.I less.
+.IR less .
 .IP "\-T\fItagsfile\fP or \-\-tag-file=\fItagsfile\fP"
 Specifies a tags file to be used instead of "tags".
 .IP "\-u or \-\-underline-special"
@@ -799,18 +829,18 @@
 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"
-Causes backspaces, tabs and carriage returns to be 
-treated as control characters;
+Causes backspaces, tabs, carriage returns and "formatting characters"
+(as defined by Unicode) to be treated as control characters;
 that is, they are handled as specified by the \-r option.
 .sp
 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 
+the underlined text is displayed
 using the terminal's hardware underlining capability.
 Also, backspaces which appear between two identical characters
-are treated specially: 
-the overstruck text is printed 
+are treated specially:
+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.
@@ -818,8 +848,8 @@
 Text which is overstruck or underlined can be searched for
 if neither \-u nor \-U is in effect.
 .IP "\-V or \-\-version"
-Displays the version number of 
-.I less.
+Displays the version number of
+.IR less .
 .IP "\-w or \-\-hilite-unread"
 Temporarily highlights the first "new" line after a forward movement
 of a full page.
@@ -830,9 +860,9 @@
 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 
+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
@@ -852,21 +882,21 @@
 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 or \-\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.
-The "z" may be omitted for compatibility with some versions of 
-.I more.
+The "z" may be omitted for compatibility with some versions of
+.IR more .
 If the number
 .I n
-is negative, it indicates 
+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 "\-\(dq\fIcc\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.
@@ -889,14 +919,14 @@
 If the number specified is zero, it sets the default number of
 positions to one half of the screen width.
 Alternately, the number may be specified as a fraction of the width
-of the screen, starting with a decimal point: .5 is half of the
-screen width, .3 is three tenths of the screen width, and so on.
-If the number is specified as a fraction, the actual number of 
-scroll positions is recalculated if the terminal window is resized, 
-so that the actual scroll remains at the specified fraction 
+of the screen, starting with a decimal point: \&.5 is half of the
+screen width, \&.3 is three tenths of the screen width, and so on.
+If the number is specified as a fraction, the actual number of
+scroll positions is recalculated if the terminal window is resized,
+so that the actual scroll remains at the specified fraction
 of the screen width.
 .IP "\-\-follow-name"
-Normally, if the input file is renamed while an F command is executing, 
+Normally, if the input file is renamed while an F command is executing,
 .I less
 will continue to display the contents of the original file despite
 its name change.
@@ -904,7 +934,7 @@
 .I less
 will periodically attempt to reopen the file by name.
 If the reopen succeeds and the file is a different file from the original
-(which means that a new file has been created 
+(which means that a new file has been created
 with the same name as the original (now renamed) file),
 .I less
 will display the contents of that new file.
@@ -918,6 +948,11 @@
 After the \-\-use-backslash option, any backslash in an option string is
 removed and the following character is taken literally.
 This allows a dollar sign to be included in option strings.
+.IP "\-\-rscroll"
+This option changes the character used to mark truncated lines.
+It may begin with a two-character attribute indicator like LESSBINFMT does.
+If there is no attribute indicator, standout is used.
+If set to "-", truncated lines are not marked.
 .IP \-\-
 A command line argument of "\-\-" marks the end of option arguments.
 Any arguments following this are interpreted as filenames.
@@ -925,12 +960,12 @@
 .IP +
 If a command line option begins with \fB+\fP,
 the remainder of that option is taken to be an initial command to
-.I less.
+.IR less .
 For example, +G tells
 .I less
 to start at the end of the file rather than the beginning,
 and +/xyz tells it to start at the first occurrence of "xyz" in the file.
-As a special case, +<number> acts like +<number>g; 
+As a special case, +<number> acts like +<number>g;
 that is, it starts the display at the specified line number
 (however, see the caveat under the "g" command above).
 If the option starts with ++, the initial command applies to
@@ -944,8 +979,8 @@
 or the pattern for a search command),
 certain keys can be used to manipulate the command line.
 Most commands have an alternate form in [ brackets ] which can be used if
-a key does not exist on a particular keyboard. 
-(Note that the forms beginning with ESC do not work 
+a key does not exist on a particular keyboard.
+(Note that the forms beginning with ESC do not work
 in some MS-DOS and Windows systems because ESC is the line erase character.)
 Any of these special keys may be entered literally by preceding
 it with the "literal" character, either ^V or ^A.
@@ -990,7 +1025,7 @@
 Repeated TABs will cycle thru the other matching filenames.
 If the completed filename is a directory, a "/" is appended to the filename.
 (On MS-DOS systems, a "\e" is appended.)
-The environment variable LESSSEPARATOR can be used to specify a 
+The environment variable LESSSEPARATOR can be used to specify a
 different character to append to a directory name.
 .IP "BACKTAB [ ESC-TAB ]"
 Like, TAB, but cycles in the reverse direction thru the matching filenames.
@@ -1007,9 +1042,9 @@
 Delete the entire command line and return to the main prompt.
 
 .SH "KEY BINDINGS"
-You may define your own 
+You may define your own
 .I less
-commands by using the program 
+commands by using the program
 .I lesskey
 (1)
 to create a lesskey file.
@@ -1022,7 +1057,7 @@
 If the environment variable LESSKEY is set,
 .I less
 uses that as the name of the lesskey file.
-Otherwise, 
+Otherwise,
 .I less
 looks in a standard place for the lesskey file:
 On Unix systems,
@@ -1046,17 +1081,17 @@
 .P
 A system-wide lesskey file may also be set up to provide key bindings.
 If a key is defined in both a local lesskey file and in the
-system-wide file, key bindings in the local file take precedence over 
+system-wide file, key bindings in the local file take precedence over
 those in the system-wide file.
 If the environment variable LESSKEY_SYSTEM is set,
 .I less
 uses that as the name of the system-wide lesskey file.
 Otherwise,
-.I less 
+.I less
 looks in a standard place for the system-wide lesskey file:
 On Unix systems, the system-wide lesskey file is /usr/local/etc/sysless.
-(However, if 
-.I less 
+(However, if
+.I less
 was built with a different sysconf directory than /usr/local/etc,
 that directory is where the sysless file is found.)
 On MS-DOS and Windows systems, the system-wide lesskey file is c:\e_sysless.
@@ -1063,8 +1098,8 @@
 On OS/2 systems, the system-wide lesskey file is c:\esysless.ini.
 
 .SH "INPUT PREPROCESSOR"
-You may define an "input preprocessor" for 
-.I less.
+You may define an "input preprocessor" for
+.IR less .
 Before
 .I less
 opens a file, it first gives your input preprocessor a chance to modify the
@@ -1072,10 +1107,10 @@
 An input preprocessor is simply an executable program (or shell script),
 which writes the contents of the file to a different file,
 called the replacement file.
-The contents of the replacement file are then displayed 
+The contents of the replacement file are then displayed
 in place of the contents of the original file.
 However, it will appear to the user as if the original file is opened;
-that is, 
+that is,
 .I less
 will display the original filename as the name of the current file.
 .PP
@@ -1083,17 +1118,17 @@
 as entered by the user.
 It should create the replacement file, and when finished,
 print the name of the replacement file to its standard output.
-If the input preprocessor does not output a replacement filename, 
+If the input preprocessor does not output a replacement filename,
 .I less
 uses the original file, as normal.
 The input preprocessor is not called when viewing standard input.
 To set up an input preprocessor, set the LESSOPEN environment variable
 to a command line which will invoke your input preprocessor.
-This command line should include one occurrence of the string "%s", 
+This command line should include one occurrence of the string "%s",
 which will be replaced by the filename
 when the input preprocessor command is invoked.
 .PP
-When 
+When
 .I less
 closes a file opened in such a way, it will call another program,
 called the input postprocessor,
@@ -1101,11 +1136,11 @@
 replacement file created by LESSOPEN).
 This program receives two command line arguments, the original filename
 as entered by the user, and the name of the replacement file.
-To set up an input postprocessor, set the LESSCLOSE environment variable 
+To set up an input postprocessor, set the LESSCLOSE environment variable
 to a command line which will invoke your input postprocessor.
-It may include two occurrences of the string "%s"; 
-the first is replaced with the original name of the file and 
-the second with the name of the replacement file, 
+It may include two occurrences of the string "%s";
+the first is replaced with the original name of the file and
+the second with the name of the replacement file,
 which was output by LESSOPEN.
 .PP
 For example, on many Unix systems, these two scripts will allow you
@@ -1119,9 +1154,9 @@
 .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
@@ -1148,10 +1183,10 @@
 to accept other types of compressed files, and so on.
 .PP
 It is also possible to set up an input preprocessor to
-pipe the file data directly to 
-.I less,
+pipe the file data directly to
+.IR less ,
 rather than putting the data into a replacement file.
-This avoids the need to decompress the entire file before 
+This avoids the need to decompress the entire file before
 starting to view it.
 An input preprocessor that works this way is called an input pipe.
 An input pipe, instead of writing the name of a replacement file on
@@ -1158,12 +1193,14 @@
 its standard output,
 writes the entire contents of the replacement file on its standard output.
 If the input pipe does not write any characters on its standard output,
-then there is no replacement file and 
+then there is no replacement file and
 .I less
 uses the original file, as normal.
 To use an input pipe,
-make the first character in the LESSOPEN environment variable a 
+make the first character in the LESSOPEN environment variable a
 vertical bar (|) to signify that the input preprocessor is an input pipe.
+As with non-pipe input preprocessors, the command string must contain one
+occurrence of %s, which is replaced with the filename of the input file.
 .PP
 For example, on many Unix systems, this script will work like the
 previous example scripts:
@@ -1189,16 +1226,16 @@
 LESSOPEN="|lesspipe.sh %s".
 .PP
 Note that a preprocessor cannot output an empty file, since that
-is interpreted as meaning there is no replacement, and 
+is interpreted as meaning there is no replacement, and
 the original file is used.
 To avoid this, if LESSOPEN starts with two vertical bars,
 the exit status of the script becomes meaningful.
-If the exit status is zero, the output is considered to be 
-replacement text, even if it empty.
+If the exit status is zero, the output is considered to be
+replacement text, even if it is empty.
 If the exit status is nonzero, any output is ignored and the
 original file is used.
 For compatibility with previous versions of
-.I less,
+.IR less ,
 if LESSOPEN starts with only one vertical bar, the exit status
 of the preprocessor is ignored.
 .PP
@@ -1209,20 +1246,20 @@
 postprocessor is "\-".
 .PP
 For compatibility with previous versions of
-.I less,
+.IR less ,
 the input preprocessor or pipe is not used if
 .I less
-is viewing standard input.  
+is viewing standard input.
 However, if the first character of LESSOPEN is a dash (\-),
 the input preprocessor is used on standard input as well as other files.
-In this case, the dash is not considered to be part of 
+In this case, the dash is not considered to be part of
 the preprocessor command.
 If standard input is being viewed, the input preprocessor is passed
 a file name consisting of a single dash.
 Similarly, if the first two characters of LESSOPEN are vertical bar and dash
-(|\-) or two vertical bars and a dash (||\-), 
+(|\-) or two vertical bars and a dash (||\-),
 the input pipe is used on standard input as well as other files.
-Again, in this case the dash is not considered to be part of 
+Again, in this case the dash is not considered to be part of
 the input pipe command.
 
 .SH "NATIONAL CHARACTER SETS"
@@ -1282,11 +1319,11 @@
 The character "." is used for a normal character, "c" for control,
 and "b" for binary.
 A decimal number may be used for repetition.
-For example, "bccc4b." would mean character 0 is binary,
+For example, "bccc4b.\&" would mean character 0 is binary,
 1, 2 and 3 are control, 4, 5, 6 and 7 are binary, and 8 is normal.
 All characters after the last are taken to be the same as the last,
 so characters 9 through 255 would be normal.
-(This is an example, and does not necessarily 
+(This is an example, and does not necessarily
 represent any real character set.)
 .PP
 This table shows the value of LESSCHARDEF which is equivalent
@@ -1313,7 +1350,7 @@
 	next\ \ 	8bcccbcc18b95.bb125.bb
 .PP
 If neither LESSCHARSET nor LESSCHARDEF is set,
-but any of the strings "UTF-8", "UTF8", "utf-8" or "utf8" 
+but any of the strings "UTF-8", "UTF8", "utf-8" or "utf8"
 is found in the LC_ALL, LC_CTYPE or LANG
 environment variables, then the default character set is utf-8.
 .PP
@@ -1331,12 +1368,12 @@
 .PP
 Control and binary characters are displayed in standout (reverse video).
 Each such character is displayed in caret notation if possible
-(e.g. ^A for control-A).  Caret notation is used only if 
+(e.g.\& ^A for control-A).  Caret notation is used only if
 inverting the 0100 bit results in a normal printable character.
 Otherwise, the character is displayed as a hex number in angle brackets.
-This format can be changed by 
+This format can be changed by
 setting the LESSBINFMT environment variable.
-LESSBINFMT may begin with a "*" and one character to select 
+LESSBINFMT may begin with a "*" and one character to select
 the display attribute:
 "*k" is blinking, "*d" is bold, "*u" is underlined, "*s" is standout,
 and "*n" is normal.
@@ -1354,12 +1391,12 @@
 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; 
+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. 
+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, 
+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.
@@ -1424,6 +1461,9 @@
 .IP "%t"
 Causes any trailing spaces to be removed.
 Usually used at the end of the string, but may appear anywhere.
+.IP "%T"
+Normally expands to the word "file".
+However if viewing files via a tags list using the \-t option, it expands to the word "tag".
 .IP "%x"
 Replaced by the name of the next input file in the list.
 .PP
@@ -1490,7 +1530,7 @@
 This prompt prints the filename, if known;
 otherwise the string "Standard input".
 .sp
-?f%f .?ltLine %lt:?pt%pt\e%:?btByte %bt:-...
+?f%f \&.?ltLine %lt:?pt%pt\e%:?btByte %bt:-...
 .sp
 This prompt would print the filename, if known.
 The filename is followed by the line number, if known,
@@ -1500,7 +1540,7 @@
 and how the % after the %pt
 is included literally by escaping it with a backslash.
 .sp
-?n?f%f\ .?m(file\ %i\ of\ %m)\ ..?e(END)\ ?x-\ Next\e:\ %x..%t
+?n?f%f\ .?m(%T %i of %m)\ ..?e(END)\ ?x-\ Next\e:\ %x..%t";
 .sp
 This prints the filename if this is the first prompt in a file,
 followed by the "file N of N" message if there is more
@@ -1514,10 +1554,10 @@
 Each is broken into two lines here for readability only.
 .nf
 .sp
-?n?f%f\ .?m(file\ %i\ of\ %m)\ ..?e(END)\ ?x-\ Next\e:\ %x.:
+?n?f%f\ .?m(%T\ %i\ of\ %m)\ ..?e(END)\ ?x-\ Next\e:\ %x.:
 	?pB%pB\e%:byte\ %bB?s/%s...%t
 .sp
-?f%f\ .?n?m(file\ %i\ of\ %m)\ ..?ltlines\ %lt-%lb?L/%L.\ :
+?f%f\ .?n?m(%T\ %i\ of\ %m)\ ..?ltlines\ %lt-%lb?L/%L.\ :
 	byte\ %bB?s/%s.\ .?e(END)\ ?x-\ Next\e:\ %x.:?pB%pB\e%..%t
 .sp
 .fi
@@ -1524,7 +1564,7 @@
 And here is the default message produced by the = command:
 .nf
 .sp
-?f%f\ .?m(file\ %i\ of\ %m)\ .?ltlines\ %lt-%lb?L/%L.\ .
+?f%f\ .?m(%T\ %i\ of\ %m)\ .?ltlines\ %lt-%lb?L/%L.\ .
 	byte\ %bB?s/%s.\ ?e(END)\ :?pB%pB\e%..%t
 .fi
 .PP
@@ -1541,7 +1581,7 @@
 Note that this expands to the editor name, followed by a + and the
 line number, followed by the file name.
 If your editor does not accept the "+linenumber" syntax, or has other
-differences in invocation syntax, the LESSEDIT variable can be 
+differences in invocation syntax, the LESSEDIT variable can be
 changed to modify this default.
 
 .SH SECURITY
@@ -1580,12 +1620,12 @@
 In this mode, less behaves differently in these ways:
 .PP
 The \-e option works differently.
-If the \-e option is not set, 
+If the \-e option is not set,
 .I less
+behaves as if the \-e option were set.
+If the \-e option is set,
+.I less
 behaves as if the \-E option were set.
-If the \-e option is set, 
-.I less
-behaves as if the \-e and \-F options were set.
 .PP
 The \-m option works differently.
 If the \-m option is not set, the medium prompt is used,
@@ -1595,7 +1635,7 @@
 The \-n option acts like the \-z option.
 The normal behavior of the \-n option is unavailable in this mode.
 .PP
-The parameter to the \-p option is taken to be a 
+The parameter to the \-p option is taken to be a
 .I less
 command rather than a search pattern.
 .PP
@@ -1604,10 +1644,10 @@
 
 .SH "ENVIRONMENT VARIABLES"
 Environment variables may be specified either in the system environment
-as usual, or in a 
+as usual, or in a
 .I lesskey
 (1) file.
-If environment variables are defined in more than one place, 
+If environment variables are defined in more than one place,
 variables defined in a local lesskey file take precedence over
 variables defined in the system environment, which take precedence
 over variables defined in the system-wide lesskey file.
@@ -1633,7 +1673,7 @@
 .IP LC_CTYPE
 Language for determining the character set.
 .IP LESS
-Options which are passed to 
+Options which are passed to
 .I less
 automatically.
 .IP LESSANSIENDCHARS
@@ -1642,7 +1682,7 @@
 .IP LESSANSIMIDCHARS
 Characters which may appear between the ESC character and the
 end character in an ANSI color escape sequence
-(default "0123456789;[?!"'#%()*+\ ".
+(default "0123456789:;[?!"'#%()*+\ ".
 .IP LESSBINFMT
 Format for displaying non-printable, non-control characters.
 .IP LESSCHARDEF
@@ -1665,11 +1705,11 @@
 (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.
+shell commands between invocations of
+.IR less .
 If set to "\-" or "/dev/null", 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" 
+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.
@@ -1695,7 +1735,7 @@
 .IP LESSUTFBINFMT
 Format for displaying non-printable Unicode code points.
 .IP LESS_IS_MORE
-Emulate the 
+Emulate the
 .I more
 (1) command.
 .IP LINES
@@ -1707,11 +1747,11 @@
 .IP MORE
 Options which are passed to
 .I less
-automatically when running in 
+automatically when running in
 .I more
 compatible mode.
 .IP PATH
-User's search path (used to find a lesskey file 
+User's search path (used to find a lesskey file
 on MS-DOS and OS/2 systems).
 .IP SHELL
 The shell used to execute the ! command, as well as to expand filenames.
@@ -1726,7 +1766,7 @@
 lesskey(1)
 
 .SH COPYRIGHT
-Copyright (C) 1984-2012  Mark Nudelman
+Copyright (C) 1984-2017  Mark Nudelman
 .PP
 less is part of the GNU project and is free software.
 You can redistribute it and/or modify it
@@ -1735,7 +1775,7 @@
 the Free Software Foundation; or (2) the Less License.
 See the file README in the less distribution for more details
 regarding redistribution.
-You should have received a copy of the GNU General Public License 
+You should have received a copy of the GNU General Public License
 along with the source for less; see the file COPYING.
 If not, write to the Free Software Foundation, 59 Temple Place,
 Suite 330, Boston, MA  02111-1307, USA.
@@ -1749,12 +1789,12 @@
 
 .SH AUTHOR
 .PP
-Mark Nudelman 
+Mark Nudelman
 .br
 Send bug reports or comments to <bug-less at gnu.org>
 .br
 See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less.
 .br
-For more information, see the less homepage at 
+For more information, see the less homepage at
 .br
 http://www.greenwoodsoftware.com/less.

Modified: vendor/less/dist/lessecho.c
===================================================================
--- vendor/less/dist/lessecho.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lessecho.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/lessecho.nro
===================================================================
--- vendor/less/dist/lessecho.nro	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lessecho.nro	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,4 +1,4 @@
-.TH LESSECHO 1 "Version 458: 04 Apr 2013"
+.TH LESSECHO 1 "Version 530: 05 Dec 2017"
 .SH NAME
 lessecho \- expand metacharacters
 .SH SYNOPSIS

Modified: vendor/less/dist/lesskey.c
===================================================================
--- vendor/less/dist/lesskey.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lesskey.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -99,11 +99,13 @@
 	{ "back-scroll",          A_B_SCROLL },
 	{ "back-search",          A_B_SEARCH },
 	{ "back-window",          A_B_WINDOW },
+	{ "clear-mark",           A_CLRMARK },
 	{ "debug",                A_DEBUG },
 	{ "digit",                A_DIGIT },
 	{ "display-flag",         A_DISP_OPTION },
 	{ "display-option",       A_DISP_OPTION },
 	{ "end",                  A_GOEND },
+	{ "end-scroll",           A_RRSHIFT },
 	{ "examine",              A_EXAMINE },
 	{ "filter",               A_FILTER },
 	{ "first-cmd",            A_FIRSTCMD },
@@ -120,6 +122,7 @@
 	{ "forw-search",          A_F_SEARCH },
 	{ "forw-window",          A_F_WINDOW },
 	{ "goto-end",             A_GOEND },
+	{ "goto-end-buffered",    A_GOEND_BUF },
 	{ "goto-line",            A_GOLINE },
 	{ "goto-mark",            A_GOMARK },
 	{ "help",                 A_HELP },
@@ -129,6 +132,7 @@
 	{ "next-file",            A_NEXT_FILE },
 	{ "next-tag",             A_NEXT_TAG },
 	{ "noaction",             A_NOACTION },
+	{ "no-scroll",            A_LLSHIFT },
 	{ "percent",              A_PERCENT },
 	{ "pipe",                 A_PIPE },
 	{ "prev-file",            A_PREV_FILE },
@@ -143,6 +147,7 @@
 	{ "reverse-search-all",   A_T_REVERSE_SEARCH },
 	{ "right-scroll",         A_RSHIFT },
 	{ "set-mark",             A_SETMARK },
+	{ "set-mark-bottom",      A_SETMARKBOT },
 	{ "shell",                A_SHELL },
 	{ "status",               A_STAT },
 	{ "toggle-flag",          A_OPT_TOGGLE },
@@ -358,9 +363,9 @@
 	char **pp;
 	int xlate;
 {
-	register char *p;
-	register char ch;
-	register int i;
+	char *p;
+	char ch;
+	int i;
 	static char buf[10];
 	static char tstr_control_k[] =
 		{ SK_SPECIAL_KEY, SK_CONTROL_K, 6, 1, 1, 1, '\0' };
@@ -420,7 +425,7 @@
 				case 'e': ch = SK_END; break;
 				case 'x': ch = SK_DELETE; break;
 				default:
-					error("illegal char after \\k");
+					error("illegal char after \\k", NULL_PARG);
 					*pp = p+1;
 					return ("");
 				}
@@ -471,7 +476,7 @@
  */
 	public char *
 skipsp(s)
-	register char *s;
+	char *s;
 {
 	while (*s == ' ' || *s == '\t')	
 		s++;
@@ -483,7 +488,7 @@
  */
 	public char *
 skipnsp(s)
-	register char *s;
+	char *s;
 {
 	while (*s != '\0' && *s != ' ' && *s != '\t')
 		s++;
@@ -498,7 +503,7 @@
 clean_line(s)
 	char *s;
 {
-	register int i;
+	int i;
 
 	s = skipsp(s);
 	for (i = 0;  s[i] != '\n' && s[i] != '\r' && s[i] != '\0';  i++)
@@ -517,7 +522,7 @@
 {
 	if (currtable->pbuffer >= currtable->buffer + MAX_USERCMD)
 	{
-		error("too many commands");
+		error("too many commands", NULL_PARG);
 		exit(1);
 	}
 	*(currtable->pbuffer)++ = c;
@@ -617,16 +622,18 @@
 	for (i = 0;  currtable->names[i].cn_name != NULL;  i++)
 		if (strcmp(currtable->names[i].cn_name, actname) == 0)
 			return (currtable->names[i].cn_action);
-	error("unknown action");
+	error("unknown action", NULL_PARG);
 	return (A_INVALID);
 }
 
 	void
-error(s)
+error(s, parg)
 	char *s;
+	PARG *parg;
 {
 	fprintf(stderr, "line %d: %s\n", linenum, s);
 	errors++;
+	(void) parg;
 }
 
 
@@ -647,9 +654,9 @@
 	do
 	{
 		s = tstr(&p, 1);
-		cmdlen += strlen(s);
+		cmdlen += (int) strlen(s);
 		if (cmdlen > MAX_CMDLEN)
-			error("command too long");
+			error("command too long", NULL_PARG);
 		else
 			add_cmd_str(s);
 	} while (*p != ' ' && *p != '\t' && *p != '\0');
@@ -666,7 +673,7 @@
 	p = skipsp(p);
 	if (*p == '\0')
 	{
-		error("missing action");
+		error("missing action", NULL_PARG);
 		return;
 	}
 	actname = p;
@@ -719,7 +726,7 @@
 	p = skipsp(p);
 	if (*p++ != '=')
 	{
-		error("missing =");
+		error("missing =", NULL_PARG);
 		return;
 	}
 

Modified: vendor/less/dist/lesskey.h
===================================================================
--- vendor/less/dist/lesskey.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lesskey.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/lesskey.nro
===================================================================
--- vendor/less/dist/lesskey.nro	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lesskey.nro	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,4 +1,4 @@
-.TH LESSKEY 1 "Version 458: 04 Apr 2013"
+.TH LESSKEY 1 "Version 530: 05 Dec 2017"
 .SH NAME
 lesskey \- specify key bindings for less
 .SH SYNOPSIS
@@ -134,7 +134,7 @@
 	\en		forw-line 
 	e		forw-line 
 	j		forw-line 
-	\ekd	forw-line
+	\ekd		forw-line
 	^E		forw-line 
 	^N		forw-line 
 	k		back-line 
@@ -149,15 +149,15 @@
 	^D		forw-scroll 
 	u		back-scroll 
 	^U		back-scroll 
-	\e40	forw-screen 
+	\e40		forw-screen 
 	f		forw-screen 
 	^F		forw-screen 
 	^V		forw-screen 
-	\ekD	forw-screen
+	\ekD		forw-screen
 	b		back-screen 
 	^B		back-screen 
 	\eev		back-screen 
-	\ekU	back-screen
+	\ekU		back-screen
 	z		forw-window 
 	w		back-window 
 	\ee\e40		forw-screen-force
@@ -169,7 +169,7 @@
 	^L		repaint 
 	\eeu		undo-hilite
 	g		goto-line 
-	\ekh	goto-line
+	\ekh		goto-line
 	<		goto-line 
 	\ee<		goto-line 
 	p		percent 
@@ -178,6 +178,10 @@
 	\ee]		right-scroll
 	\ee(		left-scroll
 	\ee)		right-scroll
+	\ekl		left-scroll
+	\ekr		right-scroll
+	\ee{		no-scroll
+	\ee}		end-scroll
 	{		forw-bracket {}
 	}		back-bracket {}
 	(		forw-bracket ()
@@ -189,7 +193,8 @@
 	G		goto-end 
 	\ee>		goto-end 
 	>		goto-end 
-	\eke	goto-end
+	\eke		goto-end
+	\eeG		goto-end-buffered
 	=		status 
 	^G		status 
 	:f		status 
@@ -203,6 +208,8 @@
 	\eeN		reverse-search-all 
 	&		filter
 	m		set-mark 
+	M		set-mark-bottom
+	\eem		clear-mark
 	'		goto-mark 
 	^X^X		goto-mark 
 	E		examine 
@@ -356,26 +363,29 @@
 This NUL character should be represented as \e340 in a lesskey file.
 
 .SH COPYRIGHT
-Copyright (C) 2000-2012  Mark Nudelman
+Copyright (C) 1984-2017  Mark Nudelman
 .PP
-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.
+less is part of the GNU project and is free software.
+You can redistribute it and/or modify it
+under the terms of either
+(1) the GNU General Public License as published by
+the Free Software Foundation; or (2) the Less License.
+See the file README in the less distribution for more details
+regarding redistribution.
+You should have received a copy of the GNU General Public License
+along with the source for less; see the file COPYING.
+If not, write to the Free Software Foundation, 59 Temple Place,
+Suite 330, Boston, MA  02111-1307, USA.
+You should also have received a copy of the Less License;
+see the file LICENSE.
 .PP
-lesskey is distributed in the hope that it will be useful, but
+less 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.
-.PP
-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.
 
 .SH AUTHOR
 .PP
-Mark Nudelman <bug-less at gnu.org>
+Mark Nudelman
 .br
-Send bug reports or comments to bug-less at gnu.org.
+Send bug reports or comments to <bug-less at gnu.org>.

Modified: vendor/less/dist/lglob.h
===================================================================
--- vendor/less/dist/lglob.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lglob.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/line.c
===================================================================
--- vendor/less/dist/line.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/line.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -7,7 +7,6 @@
  * For more information, see the README file.
  */
 
-
 /*
  * Routines to manipulate the "line buffer".
  * The line buffer holds a line of output as it is being built
@@ -16,7 +15,13 @@
 
 #include "less.h"
 #include "charset.h"
+#include "position.h"
 
+#if MSDOS_COMPILER==WIN32C
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
 static char *linebuf = NULL;	/* Buffer which holds the current output line */
 static char *attr = NULL;	/* Extension of linebuf to hold attributes */
 public int size_linebuf = 0;	/* Size of line buffer (and attr buffer) */
@@ -31,18 +36,20 @@
 static int curr;		/* Index into linebuf */
 static int column;		/* Printable length, accounting for
 				   backspaces, etc. */
+static int right_curr;
+static int right_column;
 static int overstrike;		/* Next char should overstrike previous char */
 static int last_overstrike = AT_NORMAL;
 static int is_null_line;	/* There is no current line */
 static int lmargin;		/* Left margin */
-static char pendc;
+static LWCHAR pendc;
 static POSITION pendpos;
 static char *end_ansi_chars;
 static char *mid_ansi_chars;
 
-static int attr_swidth();
-static int attr_ewidth();
-static int do_append();
+static int attr_swidth LESSPARAMS ((int a));
+static int attr_ewidth LESSPARAMS ((int a));
+static int do_append LESSPARAMS ((LWCHAR ch, char *rep, POSITION pos));
 
 extern int sigs;
 extern int bs_mode;
@@ -60,6 +67,8 @@
 extern int utf_mode;
 extern POSITION start_attnpos;
 extern POSITION end_attnpos;
+extern LWCHAR rscroll_char;
+extern int rscroll_attr;
 
 static char mbc_buf[MAX_UTF_CHAR_LEN];
 static int mbc_buf_len = 0;
@@ -78,7 +87,7 @@
 
 	mid_ansi_chars = lgetenv("LESSANSIMIDCHARS");
 	if (mid_ansi_chars == NULL || *mid_ansi_chars == '\0')
-		mid_ansi_chars = "0123456789;[?!\"'#%()*+ ";
+		mid_ansi_chars = "0123456789:;[?!\"'#%()*+ ";
 
 	linebuf = (char *) ecalloc(LINEBUF_SIZE, sizeof(char));
 	attr = (char *) ecalloc(LINEBUF_SIZE, sizeof(char));
@@ -151,6 +160,8 @@
 {
 	curr = 0;
 	column = 0;
+	right_curr = 0;
+	right_column = 0;
 	cshift = 0;
 	overstrike = 0;
 	last_overstrike = AT_NORMAL;
@@ -159,10 +170,36 @@
 	pendc = '\0';
 	lmargin = 0;
 	if (status_col)
-		lmargin += 1;
+		lmargin += 2;
 }
 
 /*
+ * Set a character in the line buffer.
+ */
+	static void
+set_linebuf(n, ch, a)
+	int n;
+	LWCHAR ch;
+	char a;
+{
+	linebuf[n] = ch;
+	attr[n] = a;
+}
+
+/*
+ * Append a character to the line buffer.
+ */
+	static void
+add_linebuf(ch, a, w)
+	LWCHAR ch;
+	char a;
+	int w;
+{
+	set_linebuf(curr++, ch, a);
+	column += w;
+}
+
+/*
  * Insert the line number (of the given position) into the line buffer.
  */
 	public void
@@ -169,8 +206,8 @@
 plinenum(pos)
 	POSITION pos;
 {
-	register LINENUM linenum = 0;
-	register int i;
+	LINENUM linenum = 0;
+	int i;
 
 	if (linenums == OPT_ONPLUS)
 	{
@@ -190,15 +227,21 @@
 	 */
 	if (status_col)
 	{
-		linebuf[curr] = ' ';
-		if (start_attnpos != NULL_POSITION &&
-		    pos >= start_attnpos && pos < end_attnpos)
-			attr[curr] = AT_NORMAL|AT_HILITE;
-		else
-			attr[curr] = AT_NORMAL;
-		curr++;
-		column++;
+		int a = AT_NORMAL;
+		char c = posmark(pos);
+		if (c != 0)
+			a |= AT_HILITE;
+		else 
+		{
+			c = ' ';
+			if (start_attnpos != NULL_POSITION &&
+			    pos >= start_attnpos && pos <= end_attnpos)
+				a |= AT_HILITE;
+		}
+		add_linebuf(c, a, 1); /* column 0: status */
+		add_linebuf(' ', AT_NORMAL, 1); /* column 1: empty */
 	}
+
 	/*
 	 * Display the line number at the start of each line
 	 * if the -N option is set.
@@ -205,30 +248,27 @@
 	 */
 	if (linenums == OPT_ONPLUS)
 	{
-		char buf[INT_STRLEN_BOUND(pos) + 2];
+		char buf[INT_STRLEN_BOUND(linenum) + 2];
+		int pad = 0;
 		int n;
 
 		linenumtoa(linenum, buf);
-		n = strlen(buf);
+		n = (int) strlen(buf);
 		if (n < MIN_LINENUM_WIDTH)
-			n = MIN_LINENUM_WIDTH;
-		sprintf(linebuf+curr, "%*s ", n, buf);
-		n++;  /* One space after the line number. */
+			pad = MIN_LINENUM_WIDTH - n;
+		for (i = 0; i < pad; i++)
+			add_linebuf(' ', AT_NORMAL, 1);
 		for (i = 0; i < n; i++)
-			attr[curr+i] = AT_NORMAL;
-		curr += n;
-		column += n;
-		lmargin += n;
+			add_linebuf(buf[i], AT_BOLD, 1);
+		add_linebuf(' ', AT_NORMAL, 1);
+		lmargin += n + pad + 1;
 	}
-
 	/*
 	 * Append enough spaces to bring us to the lmargin.
 	 */
 	while (column < lmargin)
 	{
-		linebuf[curr] = ' ';
-		attr[curr++] = AT_NORMAL;
-		column++;
+		add_linebuf(' ', AT_NORMAL, 1);
 	}
 }
 
@@ -491,7 +531,7 @@
 	       && column > lmargin
 	       && (!(attr[curr - 1] & (AT_ANSI|AT_BINARY))))
 	{
-		curr = p - linebuf;
+		curr = (int) (p - linebuf);
 		prev_ch = step_char(&p, -1, linebuf + lmargin);
 		width = pwidth(ch, attr[curr], prev_ch);
 		column -= width;
@@ -539,7 +579,7 @@
 }
 
 /*
- *
+ * Can a char appear in an ANSI escape sequence, before the end char?
  */
 	public int
 is_ansi_middle(ch)
@@ -553,6 +593,23 @@
 }
 
 /*
+ * Skip past an ANSI escape sequence.
+ * pp is initially positioned just after the CSI_START char.
+ */
+	public void
+skip_ansi(pp, limit)
+	char **pp;
+	constant char *limit;
+{
+	LWCHAR c;
+	do {
+		c = step_char(pp, +1, limit);
+	} while (*pp < limit && is_ansi_middle(c));
+	/* Note that we discard final char, for which is_ansi_middle is false. */
+}
+
+
+/*
  * Append a character and attribute to the line buffer.
  */
 #define	STORE_CHAR(ch,a,rep,pos) \
@@ -604,7 +661,7 @@
 			do {
 				bch = step_char(&p, -1, linebuf);
 			} while (p > linebuf && !IS_CSI_START(bch));
-			curr = p - linebuf;
+			curr = (int) (p - linebuf);
 			return 0;
 		}
 		a = AT_ANSI;	/* Will force re-AT_'ing around it.  */
@@ -647,11 +704,15 @@
 			return (1);
 	}
 
+	if (column > right_column && w > 0)
+	{
+		right_column = column;
+		right_curr = curr;
+	}
+
 	while (replen-- > 0)
 	{
-		linebuf[curr] = *rep++;
-		attr[curr] = a;
-		curr++;
+		add_linebuf(*rep++, a, 0);
 	}
 	column += w;
 	return (0);
@@ -697,7 +758,7 @@
 
 	static int
 store_prchar(c, pos)
-	char c;
+	LWCHAR c;
 	POSITION pos;
 {
 	char *s;
@@ -741,7 +802,7 @@
  */
 	public int
 pappend(c, pos)
-	char c;
+	unsigned char c;
 	POSITION pos;
 {
 	int r;
@@ -748,6 +809,8 @@
 
 	if (pendc)
 	{
+		if (c == '\r' && pendc == '\r')
+			return (0);
 		if (do_append(pendc, NULL, pendpos))
 			/*
 			 * Oops.  We've probably lost the char which
@@ -781,7 +844,7 @@
 
 	if (!utf_mode)
 	{
-		r = do_append((LWCHAR) c, NULL, pos);
+		r = do_append(c, NULL, pos);
 	} else
 	{
 		/* Perform strict validation in all possible cases. */
@@ -791,7 +854,7 @@
 			mbc_buf_index = 1;
 			*mbc_buf = c;
 			if (IS_ASCII_OCTET(c))
-				r = do_append((LWCHAR) c, NULL, pos);
+				r = do_append(c, NULL, pos);
 			else if (IS_UTF8_LEAD(c))
 			{
 				mbc_buf_len = utf_len(c);
@@ -805,7 +868,7 @@
 			mbc_buf[mbc_buf_index++] = c;
 			if (mbc_buf_index < mbc_buf_len)
 				return (0);
-			if (is_utf8_well_formed(mbc_buf))
+			if (is_utf8_well_formed(mbc_buf, mbc_buf_index))
 				r = do_append(get_wchar(mbc_buf), mbc_buf, mbc_pos);
 			else
 				/* Complete, but not shortest form, sequence. */
@@ -848,7 +911,7 @@
 	char *rep;
 	POSITION pos;
 {
-	register int a;
+	int a;
 	LWCHAR prev_ch;
 
 	a = AT_NORMAL;
@@ -885,8 +948,14 @@
 		 * or just deletion of the character in the buffer.
 		 */
 		overstrike = utf_mode ? -1 : 0;
-		/* To be correct, this must be a base character.  */
-		prev_ch = get_wchar(linebuf + curr);
+		if (utf_mode)
+		{
+			/* To be correct, this must be a base character.  */
+			prev_ch = get_wchar(linebuf + curr);
+		} else
+		{
+			prev_ch = (unsigned char) linebuf[curr];
+		}
 		a = attr[curr];
 		if (ch == prev_ch)
 		{
@@ -991,11 +1060,26 @@
 }
 
 /*
+ * Switch to normal attribute at end of line.
+ */
+	static void
+add_attr_normal()
+{
+	char *p = "\033[m";
+
+	if (ctldisp != OPT_ONPLUS || !is_ansi_end('m'))
+		return;
+	for ( ;  *p != '\0';  p++)
+		add_linebuf(*p, AT_ANSI, 0);
+}
+
+/*
  * Terminate the line in the line buffer.
  */
 	public void
-pdone(endline, forw)
+pdone(endline, chopped, forw)
 	int endline;
+	int chopped;
 	int forw;
 {
 	(void) pflushmbc();
@@ -1014,15 +1098,34 @@
 	if (cshift < hshift)
 		pshift(hshift - cshift);
 
-	if (ctldisp == OPT_ONPLUS && is_ansi_end('m'))
+	if (chopped && rscroll_char)
 	{
-		/* Switch to normal attribute at end of line. */
-		char *p = "\033[m";
-		for ( ;  *p != '\0';  p++)
+		/*
+		 * Display the right scrolling char.
+		 * If we've already filled the rightmost screen char 
+		 * (in the buffer), overwrite it.
+		 */
+		if (column >= sc_width)
 		{
-			linebuf[curr] = *p;
-			attr[curr++] = AT_ANSI;
+			/* We've already written in the rightmost char. */
+			column = right_column;
+			curr = right_curr;
 		}
+		add_attr_normal();
+		while (column < sc_width-1)
+		{
+			/*
+			 * Space to last (rightmost) char on screen.
+			 * This may be necessary if the char we overwrote
+			 * was double-width.
+			 */
+			add_linebuf(' ', AT_NORMAL, 1);
+		}
+		/* Print rscroll char. It must be single-width. */
+		add_linebuf(rscroll_char, rscroll_attr, 1);
+	} else
+	{
+		add_attr_normal();
 	}
 
 	/*
@@ -1040,9 +1143,7 @@
 	 */
 	if (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON)
 	{
-		linebuf[curr] = '\n';
-		attr[curr] = AT_NORMAL;
-		curr++;
+		add_linebuf('\n', AT_NORMAL, 0);
 	} 
 	else if (ignaw && column >= sc_width && forw)
 	{
@@ -1060,13 +1161,10 @@
 		 * char on the next line.  We don't need to do this "nudge" 
 		 * at the top of the screen anyway.
 		 */
-		linebuf[curr] = ' ';
-		attr[curr++] = AT_NORMAL;
-		linebuf[curr] = '\b'; 
-		attr[curr++] = AT_NORMAL;
+		add_linebuf(' ', AT_NORMAL, 1);
+		add_linebuf('\b', AT_NORMAL, -1);
 	}
-	linebuf[curr] = '\0';
-	attr[curr] = AT_NORMAL;
+	set_linebuf(curr, '\0', AT_NORMAL);
 }
 
 /*
@@ -1076,8 +1174,7 @@
 set_status_col(c)
 	char c;
 {
-	linebuf[0] = c;
-	attr[0] = AT_NORMAL|AT_HILITE;
+	set_linebuf(0, c, AT_NORMAL|AT_HILITE);
 }
 
 /*
@@ -1087,8 +1184,8 @@
  */
 	public int
 gline(i, ap)
-	register int i;
-	register int *ap;
+	int i;
+	int *ap;
 {
 	if (is_null_line)
 	{
@@ -1135,8 +1232,8 @@
 	char **linep;
 	int *line_lenp;
 {
-	register int n;
-	register int c;
+	int n;
+	int c;
 	POSITION new_pos;
 
 	if (curr_pos == NULL_POSITION || ch_seek(curr_pos) ||
@@ -1184,8 +1281,8 @@
 	char **linep;
 	int *line_lenp;
 {
-	register int n;
-	register int c;
+	int n;
+	int c;
 	POSITION new_pos;
 
 	if (curr_pos == NULL_POSITION || curr_pos <= ch_zero() ||
@@ -1247,3 +1344,30 @@
 		*line_lenp = size_linebuf - 1 - n;
 	return (new_pos);
 }
+
+/*
+ * Find the shift necessary to show the end of the longest displayed line.
+ */
+	public int
+rrshift()
+{
+	POSITION pos;
+	int save_width;
+	int line;
+	int longest = 0;
+
+	save_width = sc_width;
+	sc_width = INT_MAX;
+	hshift = 0;
+	pos = position(TOP);
+	for (line = 0; line < sc_height && pos != NULL_POSITION; line++)
+	{
+		pos = forw_line(pos);
+		if (column > longest)
+			longest = column;
+	}
+	sc_width = save_width;
+	if (longest < sc_width)
+		return 0;
+	return longest - sc_width;
+}

Modified: vendor/less/dist/linenum.c
===================================================================
--- vendor/less/dist/linenum.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/linenum.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -75,7 +75,7 @@
 	public void
 clr_linenum()
 {
-	register struct linenum_info *p;
+	struct linenum_info *p;
 
 	/*
 	 * Put all the entries on the free list.
@@ -102,7 +102,7 @@
  */
 	static void
 calcgap(p)
-	register struct linenum_info *p;
+	struct linenum_info *p;
 {
 	/*
 	 * Don't bother to compute a gap for the anchor.
@@ -125,11 +125,11 @@
 	LINENUM linenum;
 	POSITION pos;
 {
-	register struct linenum_info *p;
-	register struct linenum_info *new;
-	register struct linenum_info *nextp;
-	register struct linenum_info *prevp;
-	register POSITION mingap;
+	struct linenum_info *p;
+	struct linenum_info *new;
+	struct linenum_info *nextp;
+	struct linenum_info *prevp;
+	POSITION mingap;
 
 	/*
 	 * Find the proper place in the list for the new one.
@@ -216,7 +216,7 @@
 
 static int loopcount;
 #if HAVE_TIME
-static long startime;
+static time_type startime;
 #endif
 
 	static void
@@ -265,8 +265,8 @@
 find_linenum(pos)
 	POSITION pos;
 {
-	register struct linenum_info *p;
-	register LINENUM linenum;
+	struct linenum_info *p;
+	LINENUM linenum;
 	POSITION cpos;
 
 	if (!linenums)
@@ -380,7 +380,7 @@
 find_pos(linenum)
 	LINENUM linenum;
 {
-	register struct linenum_info *p;
+	struct linenum_info *p;
 	POSITION cpos;
 	LINENUM clinenum;
 

Modified: vendor/less/dist/lsystem.c
===================================================================
--- vendor/less/dist/lsystem.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/lsystem.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -42,10 +42,10 @@
 	char *cmd;
 	char *donemsg;
 {
-	register int inp;
+	int inp;
 #if HAVE_SHELL
-	register char *shell;
-	register char *p;
+	char *shell;
+	char *p;
 #endif
 	IFILE save_ifile;
 #if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C
@@ -137,7 +137,7 @@
 			char *esccmd = shell_quote(cmd);
 			if (esccmd != NULL)
 			{
-				int len = strlen(shell) + strlen(esccmd) + 5;
+				int len = (int) (strlen(shell) + strlen(esccmd) + 5);
 				p = (char *) ecalloc(len, sizeof(char));
 				SNPRINTF3(p, len, "%s %s %s", shell, shell_coption(), esccmd);
 				free(esccmd);
@@ -289,8 +289,8 @@
 	POSITION spos;
 	POSITION epos;
 {
-	register FILE *f;
-	register int c;
+	FILE *f;
+	int c;
 	extern FILE *popen();
 
 	/*

Modified: vendor/less/dist/main.c
===================================================================
--- vendor/less/dist/main.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/main.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,6 @@
+/* $FreeBSD: stable/10/contrib/less/main.c 330571 2018-03-07 06:39:00Z delphij $ */
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -53,11 +54,13 @@
 static char consoleTitle[256];
 #endif
 
+public int  line_count;
 extern int	less_is_more;
 extern int	missing_cap;
 extern int	know_dumb;
+extern int	no_init;
+extern int	pr_type;
 extern int	quit_if_one_screen;
-extern int	pr_type;
 
 
 /*
@@ -70,6 +73,7 @@
 {
 	IFILE ifile;
 	char *s;
+	extern char *__progname;
 
 #ifdef __EMX__
 	_response(&argc, &argv);
@@ -111,8 +115,9 @@
 	 * Command line arguments override environment arguments.
 	 */
 	is_tty = isatty(1);
+	init_cmds();
 	get_term();
-	init_cmds();
+	expand_cmd_tables();
 	init_charset();
 	init_line();
 	init_cmdhist();
@@ -133,11 +138,15 @@
 
 	init_prompt();
 
+	if (less_is_more)
+		scan_option("-fG");
+
 	s = lgetenv(less_is_more ? "MORE" : "LESS");
 	if (s != NULL)
 		scan_option(save(s));
 
-#define	isoptstring(s)	(((s)[0] == '-' || (s)[0] == '+') && (s)[1] != '\0')
+#define	isoptstring(s)	less_is_more   ? (((s)[0] == '-') && (s)[1] != '\0') : \
+			(((s)[0] == '-' || (s)[0] == '+') && (s)[1] != '\0')
 	while (argc > 0 && (isoptstring(*argv) || isoptpending()))
 	{
 		s = *argv++;
@@ -158,8 +167,8 @@
 		quit(QUIT_OK);
 	}
 
-	if (less_is_more && get_quit_at_eof())
-		quit_if_one_screen = TRUE;
+	if (less_is_more)
+		no_init = TRUE;
 
 #if EDITOR
 	editor = lgetenv("VISUAL");
@@ -183,7 +192,6 @@
 		ifile = get_ifile(FAKE_HELPFILE, ifile);
 	while (argc-- > 0)
 	{
-		char *filename;
 #if (MSDOS_COMPILER && MSDOS_COMPILER != DJGPPC)
 		/*
 		 * Because the "shell" doesn't expand filename patterns,
@@ -192,7 +200,9 @@
 		 * Expand the pattern and iterate over the expanded list.
 		 */
 		struct textlist tlist;
+		char *filename;
 		char *gfilename;
+		char *qfilename;
 		
 		gfilename = lglob(*argv++);
 		init_textlist(&tlist, gfilename);
@@ -199,18 +209,15 @@
 		filename = NULL;
 		while ((filename = forw_textlist(&tlist, filename)) != NULL)
 		{
-			(void) get_ifile(filename, ifile);
+			qfilename = shell_unquote(filename);
+			(void) get_ifile(qfilename, ifile);
+			free(qfilename);
 			ifile = prev_ifile(NULL_IFILE);
 		}
 		free(gfilename);
 #else
-		filename = shell_quote(*argv);
-		if (filename == NULL)
-			filename = *argv;
-		argv++;
-		(void) get_ifile(filename, ifile);
+		(void) get_ifile(*argv++, ifile);
 		ifile = prev_ifile(NULL_IFILE);
-		free(filename);
 #endif
 	}
 	/*
@@ -236,7 +243,7 @@
 		quit(QUIT_OK);
 	}
 
-	if (missing_cap && !know_dumb)
+	if (missing_cap && !know_dumb && !less_is_more)
 		error("WARNING: terminal is not fully functional", NULL_PARG);
 	init_mark();
 	open_getchr();
@@ -277,10 +284,19 @@
 	{
 		if (edit_stdin())  /* Edit standard input */
 			quit(QUIT_ERROR);
+		if (quit_if_one_screen)
+			line_count = get_line_count();
 	} else 
 	{
 		if (edit_first())  /* Edit first valid file in cmd line */
 			quit(QUIT_ERROR);
+		if (quit_if_one_screen)
+		{
+			if (nifile() == 1)
+				line_count = get_line_count();
+			else /* If more than one file, -F can not be used */
+				quit_if_one_screen = FALSE;
+		}
 	}
 
 	init();
@@ -296,9 +312,9 @@
  */
 	public char *
 save(s)
-	char *s;
+	constant char *s;
 {
-	register char *p;
+	char *p;
 
 	p = (char *) ecalloc(strlen(s)+1, sizeof(char));
 	strcpy(p, s);
@@ -314,7 +330,7 @@
 	int count;
 	unsigned int size;
 {
-	register VOID_POINTER p;
+	VOID_POINTER p;
 
 	p = (VOID_POINTER) calloc(count, size);
 	if (p != NULL)
@@ -330,7 +346,7 @@
  */
 	public char *
 skipsp(s)
-	register char *s;
+	char *s;
 {
 	while (*s == ' ' || *s == '\t')	
 		s++;
@@ -348,9 +364,9 @@
 	char *s;
 	int uppercase;
 {
-	register int c;
-	register int sc;
-	register int len = 0;
+	int c;
+	int sc;
+	int len = 0;
 
 	for ( ;  *s != '\0';  s++, ps++)
 	{

Modified: vendor/less/dist/mark.c
===================================================================
--- vendor/less/dist/mark.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/mark.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -9,6 +9,7 @@
 
 
 #include "less.h"
+#include "position.h"
 
 extern IFILE curr_ifile;
 extern int sc_height;
@@ -15,14 +16,6 @@
 extern int jump_sline;
 
 /*
- * A mark is an ifile (input file) plus a position within the file.
- */
-struct mark {
-	IFILE m_ifile;
-	struct scrpos m_scrpos;
-};
-
-/*
  * The table of marks.
  * Each mark is identified by a lowercase or uppercase letter.
  * The final one is lmark, for the "last mark"; addressed by the apostrophe.
@@ -69,7 +62,7 @@
 getmark(c)
 	int c;
 {
-	register struct mark *m;
+	struct mark *m;
 	static struct mark sm;
 
 	switch (c)
@@ -94,7 +87,7 @@
 		}
 		m = &sm;
 		m->m_scrpos.pos = ch_tell();
-		m->m_scrpos.ln = sc_height-1;
+		m->m_scrpos.ln = sc_height;
 		m->m_ifile = curr_ifile;
 		break;
 	case '.':
@@ -102,7 +95,7 @@
 		 * Current position in the current file.
 		 */
 		m = &sm;
-		get_scrpos(&m->m_scrpos);
+		get_scrpos(&m->m_scrpos, TOP);
 		m->m_ifile = curr_ifile;
 		break;
 	case '\'':
@@ -142,21 +135,37 @@
  * Set a user-defined mark.
  */
 	public void
-setmark(c)
+setmark(c, where)
 	int c;
+	int where;
 {
-	register struct mark *m;
+	struct mark *m;
 	struct scrpos scrpos;
 
 	m = getumark(c);
 	if (m == NULL)
 		return;
-	get_scrpos(&scrpos);
+	get_scrpos(&scrpos, where);
 	m->m_scrpos = scrpos;
 	m->m_ifile = curr_ifile;
 }
 
 /*
+ * Clear a user-defined mark.
+ */
+	public void
+clrmark(c)
+	int c;
+{
+	struct mark *m;
+
+	m = getumark(c);
+	if (m == NULL)
+		return;
+	m->m_scrpos.pos = NULL_POSITION;
+}
+
+/*
  * Set lmark (the mark named by the apostrophe).
  */
 	public void
@@ -166,7 +175,7 @@
 
 	if (ch_getflags() & CH_HELPFILE)
 		return;
-	get_scrpos(&scrpos);
+	get_scrpos(&scrpos, TOP);
 	if (scrpos.pos == NULL_POSITION)
 		return;
 	marks[LASTMARK].m_scrpos = scrpos;
@@ -180,7 +189,7 @@
 gomark(c)
 	int c;
 {
-	register struct mark *m;
+	struct mark *m;
 	struct scrpos scrpos;
 
 	m = getmark(c);
@@ -228,7 +237,7 @@
 markpos(c)
 	int c;
 {
-	register struct mark *m;
+	struct mark *m;
 
 	m = getmark(c);
 	if (m == NULL)
@@ -243,6 +252,27 @@
 }
 
 /*
+ * Return the mark associated with a given position, if any.
+ */
+	public char
+posmark(pos)
+	POSITION pos;
+{
+	int i;
+
+	/* Only lower case and upper case letters */
+	for (i = 0;  i < 26*2;  i++)
+	{
+		if (marks[i].m_ifile == curr_ifile && marks[i].m_scrpos.pos == pos)
+		{
+			if (i < 26) return 'a' + i;
+			return 'A' + i - 26;
+		}
+	}
+	return 0;
+}
+
+/*
  * Clear the marks associated with a specified ifile.
  */
 	public void

Index: vendor/less/dist/mkinstalldirs
===================================================================
--- vendor/less/dist/mkinstalldirs	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/mkinstalldirs	2018-07-06 12:43:09 UTC (rev 11360)

Property changes on: vendor/less/dist/mkinstalldirs
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Added: vendor/less/dist/mkutable
===================================================================
--- vendor/less/dist/mkutable	                        (rev 0)
+++ vendor/less/dist/mkutable	2018-07-06 12:43:09 UTC (rev 11360)
@@ -0,0 +1,96 @@
+#! /usr/bin/perl
+use strict;
+
+my $USAGE = <<__EOF__;
+   usage: mkutable [-n] [-f#] type... [--] [<] UnicodeData.txt
+          -n = take non-matching types
+      -f = zero-based type field (default 2)
+__EOF__
+
+use vars qw( $opt_f $opt_n );
+use Getopt::Std;
+my $type_field = 2;
+
+# Override Unicode tables for certain control chars
+# that are expected to be found in normal text files.
+my %force_space = (
+    0x08 => 1, # backspace
+    0x09 => 1, # tab
+    0x0a => 1, # newline
+    0x0c => 1, # form feed
+    0x0d => 1, # carriage return
+);
+
+exit (main() ? 0 : 1);
+
+sub main {
+    my $date = `date`;
+    chomp $date;
+    my $args = join ' ', @ARGV;
+    my $header = "/* Generated by \"$0 $args\" on $date */\n";
+
+    die $USAGE if not getopts('f:n');
+    $type_field = $opt_f if $opt_f;
+    my %types;
+    my $arg;
+    while ($arg = shift @ARGV) {
+        last if $arg eq '--';
+        $types{$arg} = 1;
+    }
+    my %out = ( 'types' => \%types );
+
+    print $header;
+    my $last_code = 0;
+    while (<>) {
+        chomp;
+        s/#.*//;
+        my @fields = split /;/;
+        next if not @fields;
+        my ($lo_code, $hi_code);
+        my $codes = $fields[0];
+        if ($codes =~ /(\w+)\.\.(\w+)/) {
+            $lo_code = hex $1;
+            $hi_code = hex $2;
+        } else {
+            $lo_code = $hi_code = hex $fields[0];
+        }
+        my $type = $fields[$type_field];
+        $type =~ s/\s//g;
+        for ($last_code = $lo_code; $last_code <= $hi_code; ++$last_code) {
+            $type = 'Zs' if $force_space{$last_code};
+            output(\%out, $last_code, $type);
+        }
+    }
+    output(\%out, $last_code);
+    return 1;
+}
+
+sub output {
+    my ($out, $code, $type) = @_;
+    my $type_ok = ($type and ${${$out}{types}}{$type});
+    $type_ok = not $type_ok if $opt_n;
+    my $prev_code = $$out{prev_code};
+
+    if (not $type_ok) {
+        end_run($out, $prev_code);
+    } elsif (not $$out{in_run} or $type ne $$out{run_type} or $code != $prev_code+1) {
+        end_run($out, $prev_code);
+        start_run($out, $code, $type);
+    }
+    $$out{prev_code} = $code;
+}
+
+sub start_run {
+    my ($out, $code, $type) = @_;
+    $$out{start_code} = $code;
+    $$out{prev_code} = $code;
+    $$out{run_type} = $type;
+    $$out{in_run} = 1;
+}
+
+sub end_run {
+    my ($out, $code) = @_;
+    return if not $$out{in_run};
+    printf "\t{ 0x%04x, 0x%04x }, /* %s */\n", $$out{start_code}, $code, $$out{run_type};
+    $$out{in_run} = 0;
+}

Modified: vendor/less/dist/optfunc.c
===================================================================
--- vendor/less/dist/optfunc.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/optfunc.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -43,12 +43,15 @@
 extern char *eqproto;
 extern char *hproto;
 extern char *wproto;
+extern char *every_first_cmd;
 extern IFILE curr_ifile;
 extern char version[];
 extern int jump_sline;
-extern int jump_sline_fraction;
+extern long jump_sline_fraction;
 extern int shift_count;
-extern int shift_count_fraction;
+extern long shift_count_fraction;
+extern LWCHAR rscroll_char;
+extern int rscroll_attr;
 extern int less_is_more;
 #if LOGFILE
 extern char *namelogfile;
@@ -58,6 +61,7 @@
 #if TAGS
 public char *tagoption = NULL;
 extern char *tags;
+extern char ztags[];
 #endif
 #if MSDOS_COMPILER
 extern int nm_fg_color, nm_bg_color;
@@ -65,7 +69,13 @@
 extern int ul_fg_color, ul_bg_color;
 extern int so_fg_color, so_bg_color;
 extern int bl_fg_color, bl_bg_color;
+extern int sgr_mode;
+#if MSDOS_COMPILER==WIN32C
+#ifndef COMMON_LVB_UNDERSCORE
+#define COMMON_LVB_UNDERSCORE 0x8000
 #endif
+#endif
+#endif
 
 
 #if LOGFILE
@@ -78,6 +88,7 @@
 	char *s;
 {
 	PARG parg;
+	char *filename;
 
 	if (secure)
 	{
@@ -87,7 +98,7 @@
 	switch (type)
 	{
 	case INIT:
-		namelogfile = s;
+		namelogfile = save(s);
 		break;
 	case TOGGLE:
 		if (ch_getflags() & CH_CANSEEK)
@@ -101,7 +112,11 @@
 			return;
 		}
 		s = skipsp(s);
-		namelogfile = lglob(s);
+		if (namelogfile != NULL)
+			free(namelogfile);
+		filename = lglob(s);
+		namelogfile = shell_unquote(filename);
+		free(filename);
 		use_logfile(namelogfile);
 		sync_logfile();
 		break;
@@ -175,8 +190,8 @@
 		} else
 		{
 
-			sprintf(buf, ".%06d", jump_sline_fraction);
-			len = strlen(buf);
+			sprintf(buf, ".%06ld", jump_sline_fraction);
+			len = (int) strlen(buf);
 			while (len > 2 && buf[len-1] == '0')
 				len--;
 			buf[len] = '\0';
@@ -240,8 +255,8 @@
 		} else
 		{
 
-			sprintf(buf, ".%06d", shift_count_fraction);
-			len = strlen(buf);
+			sprintf(buf, ".%06ld", shift_count_fraction);
+			len = (int) strlen(buf);
 			while (len > 2 && buf[len-1] == '0')
 				len--;
 			buf[len] = '\0';
@@ -295,7 +310,7 @@
 	switch (type)
 	{
 	case INIT:
-		tagoption = s;
+		tagoption = save(s);
 		/* Do the rest in main() */
 		break;
 	case TOGGLE:
@@ -331,15 +346,20 @@
 	char *s;
 {
 	PARG parg;
+	char *filename;
 
 	switch (type)
 	{
 	case INIT:
-		tags = s;
+		tags = save(s);
 		break;
 	case TOGGLE:
 		s = skipsp(s);
-		tags = lglob(s);
+		if (tags != NULL && tags != ztags)
+			free(tags);
+		filename = lglob(s);
+		tags = shell_unquote(filename);
+		free(filename);
 		break;
 	case QUERY:
 		parg.p_string = tags;
@@ -355,24 +375,32 @@
 	public void
 opt_p(type, s)
 	int type;
-	register char *s;
+	char *s;
 {
 	switch (type)
 	{
 	case INIT:
 		/*
-		 * Unget a search command for the specified string.
-		 * {{ This won't work if the "/" command is
-		 *    changed or invalidated by a .lesskey file. }}
+		 * Unget a command for the specified string.
 		 */
-		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)
+		if (less_is_more)
+		{
+			/*
+			 * In "more" mode, the -p argument is a command,
+			 * not a search string, so we don't need a slash.
+			 */
+			every_first_cmd = save(s);
+		} else
+		{
+			plusoption = TRUE;
+			ungetcc(CHAR_END_COMMAND);
+			ungetsc(s);
+			 /*
+			  * {{ This won't work if the "/" command is
+			  *    changed or invalidated by a .lesskey file. }}
+			  */
 			ungetsc("/");
+		}
 		break;
 	}
 }
@@ -383,9 +411,9 @@
 	public void
 opt__P(type, s)
 	int type;
-	register char *s;
+	char *s;
 {
-	register char **proto;
+	char **proto;
 	PARG parg;
 
 	switch (type)
@@ -503,7 +531,7 @@
 		putstr("no ");
 #endif
 		putstr("regular expressions)\n");
-		putstr("Copyright (C) 1984-2012 Mark Nudelman\n\n");
+		putstr("Copyright (C) 1984-2017  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");
@@ -525,12 +553,27 @@
 {
 	int fg, bg;
 	int err;
-	
+#if MSDOS_COMPILER==WIN32C
+	int ul = 0;
+ 	
+	if (*s == 'u')
+	{
+		ul = COMMON_LVB_UNDERSCORE;
+		++s;
+	}
+#endif
 	fg = getnum(&s, "D", &err);
 	if (err)
 	{
-		error("Missing fg color in -D", NULL_PARG);
-		return;
+#if MSDOS_COMPILER==WIN32C
+		if (ul)
+			fg = nm_fg_color;
+		else
+#endif
+		{
+			error("Missing fg color in -D", NULL_PARG);
+			return;
+		}
 	}
 	if (*s != '.')
 		bg = nm_bg_color;
@@ -544,6 +587,14 @@
 			return;
 		}
 	}
+#if MSDOS_COMPILER==WIN32C
+	if (*s == 'u')
+	{
+		ul = COMMON_LVB_UNDERSCORE;
+		++s;
+	}
+	fg |= ul;
+#endif
 	if (*s != '\0')
 		error("Extra characters at end of -D option", NULL_PARG);
 	*fg_color = fg;
@@ -559,6 +610,8 @@
 	int type;
 	char *s;
 {
+	PARG p;
+
 	switch (type)
 	{
 	case INIT:
@@ -580,8 +633,11 @@
 		case 's':
 			colordesc(s, &so_fg_color, &so_bg_color);
 			break;
+		case 'a':
+			sgr_mode = !sgr_mode;
+			break;
 		default:
-			error("-D must be followed by n, d, u, k or s", NULL_PARG);
+			error("-D must be followed by n, d, u, k, s or a", NULL_PARG);
 			break;
 		}
 		if (type == TOGGLE)
@@ -591,6 +647,8 @@
 		}
 		break;
 	case QUERY:
+		p.p_string = (sgr_mode) ? "on" : "off";
+		error("SGR mode is %s", &p);
 		break;
 	}
 }
@@ -602,7 +660,7 @@
 	public void
 opt_x(type, s)
 	int type;
-	register char *s;
+	char *s;
 {
 	extern int tabstops[];
 	extern int ntabstops;
@@ -660,7 +718,7 @@
 	public void
 opt_quote(type, s)
 	int type;
-	register char *s;
+	char *s;
 {
 	char buf[3];
 	PARG parg;
@@ -696,6 +754,40 @@
 }
 
 /*
+ * Handler for the --rscroll option.
+ */
+	/*ARGSUSED*/
+	public void
+opt_rscroll(type, s)
+	int type;
+	char *s;
+{
+	PARG p;
+
+	switch (type)
+	{
+	case INIT:
+	case TOGGLE: {
+		char *fmt;
+		int attr = AT_STANDOUT;
+		setfmt(s, &fmt, &attr, "*s>");
+		if (strcmp(fmt, "-") == 0)
+		{
+			rscroll_char = 0;
+		} else
+		{
+			rscroll_char = *fmt ? *fmt : '>';
+			rscroll_attr = attr;
+		}
+		break; }
+	case QUERY: {
+		p.p_string = rscroll_char ? prchar(rscroll_char) : "-";
+		error("rscroll char is %s", &p);
+		break; }
+	}
+}
+
+/*
  * "-?" means display a help message.
  * If from the command line, exit immediately.
  */

Modified: vendor/less/dist/option.c
===================================================================
--- vendor/less/dist/option.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/option.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -69,8 +69,8 @@
 scan_option(s)
 	char *s;
 {
-	register struct loption *o;
-	register int optc;
+	struct loption *o;
+	int optc;
 	char *optname;
 	char *printopt;
 	char *str;
@@ -152,7 +152,10 @@
 			if (*str == '+')
 				every_first_cmd = save(str+1);
 			else
+			{
+				ungetcc(CHAR_END_COMMAND);
 				ungetsc(str);
+			}
 			free(str);
 			continue;
 		case '0':  case '1':  case '2':  case '3':  case '4':
@@ -302,7 +305,7 @@
 	char *s;
 	int how_toggle;
 {
-	register int num;
+	int num;
 	int no_prompt;
 	int err;
 	PARG parg;
@@ -565,8 +568,8 @@
 	char *printopt;
 	char *validchars;
 {
-	register char *p;
-	register char *out;
+	char *p;
+	char *out;
 
 	if (*s == '\0')
 	{
@@ -629,9 +632,9 @@
 	char *printopt;
 	int *errp;
 {
-	register char *s;
-	register int n;
-	register int neg;
+	char *s;
+	int n;
+	int neg;
 
 	s = skipsp(*sp);
 	neg = FALSE;
@@ -666,7 +669,7 @@
 	char *printopt;
 	int *errp;
 {
-	register char *s;
+	char *s;
 	long frac = 0;
 	int fraclen = 0;
 
@@ -701,5 +704,5 @@
 	if (!less_is_more)
 		return quit_at_eof;
 	/* When less_is_more is set, the -e flag semantics are different. */
-	return quit_at_eof ? OPT_ON : OPT_ONPLUS;
+	return quit_at_eof ? OPT_ONPLUS : OPT_ON;
 }

Modified: vendor/less/dist/option.h
===================================================================
--- vendor/less/dist/option.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/option.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -60,7 +60,7 @@
 	int otype;		/* Type of the option */
 	int odefault;		/* Default value */
 	int *ovar;		/* Pointer to the associated variable */
-	void (*ofunc)();	/* Pointer to special handling function */
+	void (*ofunc) LESSPARAMS ((int, char*)); /* Pointer to special handling function */
 	char *odesc[3];		/* Description of each value */
 };
 

Modified: vendor/less/dist/opttbl.c
===================================================================
--- vendor/less/dist/opttbl.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/opttbl.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -53,6 +53,8 @@
 public int follow_mode;		/* F cmd Follows file desc or file name? */
 public int oldbot;		/* Old bottom of screen behavior {{REMOVE}} */
 public int opt_use_backslash;	/* Use backslash escaping in option parsing */
+public LWCHAR rscroll_char;	/* Char which marks chopped lines with -S */
+public int rscroll_attr;	/* Attribute of rscroll_char */
 #if HILITE_SEARCH
 public int hilite_search;	/* Highlight matched search patterns? */
 #endif
@@ -117,6 +119,7 @@
 static struct optname oldbot_optname = { "old-bot",              NULL };
 static struct optname follow_optname = { "follow-name",          NULL };
 static struct optname use_backslash_optname = { "use-backslash", NULL };
+static struct optname rscroll_optname = { "rscroll", NULL };
 
 
 /*
@@ -176,10 +179,10 @@
 	},
 #if MSDOS_COMPILER
 	{ 'D', &D__optname,
-		STRING|REPAINT|NO_QUERY, 0, NULL, opt_D,
+		STRING|REPAINT, 0, NULL, opt_D,
 		{
 			"color desc: ", 
-			"Ddknsu0123456789.",
+			"Dadknsu0123456789.",
 			NULL
 		}
 	},
@@ -456,6 +459,10 @@
 			NULL
 		}
 	},
+	{ OLETTER_NONE, &rscroll_optname,
+		STRING|REPAINT|INIT_HANDLER, 0, NULL, opt_rscroll,
+		{ "right scroll character: ", NULL, NULL }
+	},
 	{ '\0', NULL, NOVAR, 0, NULL, NULL, { NULL, NULL, NULL } }
 };
 
@@ -466,7 +473,7 @@
 	public void
 init_option()
 {
-	register struct loption *o;
+	struct loption *o;
 	char *p;
 
 	p = lgetenv("LESS_IS_MORE");
@@ -492,7 +499,7 @@
 findopt(c)
 	int c;
 {
-	register struct loption *o;
+	struct loption *o;
 
 	for (o = option;  o->oletter != '\0';  o++)
 	{
@@ -533,9 +540,9 @@
 	int *p_err;
 {
 	char *optname = *p_optname;
-	register struct loption *o;
-	register struct optname *oname;
-	register int len;
+	struct loption *o;
+	struct optname *oname;
+	int len;
 	int uppercase;
 	struct loption *maxo = NULL;
 	struct optname *maxoname = NULL;

Modified: vendor/less/dist/os.c
===================================================================
--- vendor/less/dist/os.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/os.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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,12 +33,6 @@
 #include <values.h>
 #endif
 
-#if HAVE_TIME_T
-#define time_type	time_t
-#else
-#define	time_type	long
-#endif
-
 /*
  * BSD setjmp() saves (and longjmp() restores) the signal mask.
  * This costs a system call or two per setjmp(), so if possible we clear the
@@ -68,10 +62,10 @@
 	public int
 iread(fd, buf, len)
 	int fd;
-	char *buf;
+	unsigned char *buf;
 	unsigned int len;
 {
-	register int n;
+	int n;
 
 start:
 #if MSDOS_COMPILER==WIN32C
@@ -191,7 +185,7 @@
  * Return the current time.
  */
 #if HAVE_TIME
-	public long
+	public time_type
 get_time()
 {
 	time_type t;
@@ -232,8 +226,8 @@
 errno_message(filename)
 	char *filename;
 {
-	register char *p;
-	register char *m;
+	char *p;
+	char *m;
 	int len;
 #if HAVE_ERRNO
 #if MUST_DEFINE_ERRNO
@@ -243,7 +237,7 @@
 #else
 	p = "cannot open";
 #endif
-	len = strlen(filename) + strlen(p) + 3;
+	len = (int) (strlen(filename) + strlen(p) + 3);
 	m = (char *) ecalloc(len, sizeof(char));
 	SNPRINTF2(m, len, "%s: %s", filename, p);
 	return (m);
@@ -277,7 +271,8 @@
  */
 	public int
 percentage(num, den)
-	POSITION num, den;
+	POSITION num;
+	POSITION den;
 {
 	return (int) muldiv(num,  (POSITION) 100, den);
 }

Modified: vendor/less/dist/output.c
===================================================================
--- vendor/less/dist/output.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/output.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -15,7 +15,10 @@
 #include "less.h"
 #if MSDOS_COMPILER==WIN32C
 #include "windows.h"
+#ifndef COMMON_LVB_UNDERSCORE
+#define COMMON_LVB_UNDERSCORE 0x8000
 #endif
+#endif
 
 public int errmsgs;	/* Count of messages displayed by error() */
 public int need_clr;
@@ -37,7 +40,11 @@
 extern int ul_fg_color, ul_bg_color;
 extern int so_fg_color, so_bg_color;
 extern int bl_fg_color, bl_bg_color;
+extern int sgr_mode;
+#if MSDOS_COMPILER==WIN32C
+extern int have_ul;
 #endif
+#endif
 
 /*
  * Display the line which is in the line buffer.
@@ -45,8 +52,8 @@
 	public void
 put_line()
 {
-	register int c;
-	register int i;
+	int c;
+	int i;
 	int a;
 
 	if (ABORT_SIGS())
@@ -95,10 +102,10 @@
 	public void
 flush()
 {
-	register int n;
-	register int fd;
+	int n;
+	int fd;
 
-	n = ob - obuf;
+	n = (int) (ob - obuf);
 	if (n == 0)
 		return;
 
@@ -126,8 +133,9 @@
 			 * the -D command-line option.
 			 */
 			char *anchor, *p, *p_next;
-			unsigned char fg, bg;
-			static unsigned char at;
+			static int fg, fgi, bg, bgi;
+			static int at;
+			int f, b;
 #if MSDOS_COMPILER==WIN32C
 			/* Screen colors used by 3x and 4x SGR commands. */
 			static unsigned char screen_color[] = {
@@ -147,6 +155,13 @@
 			};
 #endif
 
+			if (fg == 0 && bg == 0)
+			{
+				fg  = nm_fg_color & 7;
+				fgi = nm_fg_color & 8;
+				bg  = nm_bg_color & 7;
+				bgi = nm_bg_color & 8;
+			}
 			for (anchor = p_next = obuf;
 			     (p_next = memchr(p_next, ESC, ob - p_next)) != NULL; )
 			{
@@ -173,18 +188,21 @@
 						 */
 						p++;
 						anchor = p_next = p;
-						at = 0;
+						fg  = nm_fg_color & 7;
+						fgi = nm_fg_color & 8;
+						bg  = nm_bg_color & 7;
+						bgi = nm_bg_color & 8;
+						at  = 0;
 						WIN32setcolors(nm_fg_color, nm_bg_color);
 						continue;
 					}
 					p_next = p;
+					at &= ~32;
 
 					/*
 					 * Select foreground/background colors
 					 * based on the escape sequence. 
 					 */
-					fg = nm_fg_color;
-					bg = nm_bg_color;
 					while (!is_ansi_end(*p))
 					{
 						char *q;
@@ -197,7 +215,7 @@
 							 * Leave it unprocessed
 							 * in the buffer.
 							 */
-							int slop = q - anchor;
+							int slop = (int) (q - anchor);
 							/* {{ strcpy args overlap! }} */
 							strcpy(obuf, anchor);
 							ob = &obuf[slop];
@@ -212,17 +230,35 @@
 							break;
 						}
 						if (*q == ';')
+						{
 							q++;
+							at |= 32;
+						}
 
 						switch (code)
 						{
 						default:
 						/* case 0: all attrs off */
-							fg = nm_fg_color;
-							bg = nm_bg_color;
-							at = 0;
+							fg = nm_fg_color & 7;
+							bg = nm_bg_color & 7;
+							at &= 32;
+							/*
+							 * \e[0m use normal
+							 * intensities, but
+							 * \e[0;...m resets them
+							 */
+							if (at & 32)
+							{
+								fgi = 0;
+								bgi = 0;
+							} else
+							{
+								fgi = nm_fg_color & 8;
+								bgi = nm_bg_color & 8;
+							}
 							break;
 						case 1:	/* bold on */
+							fgi = 8;
 							at |= 1;
 							break;
 						case 3:	/* italic on */
@@ -229,17 +265,25 @@
 						case 7: /* inverse on */
 							at |= 2;
 							break;
-						case 4:	/* underline on */
+						case 4: /* underline on */
+#if MSDOS_COMPILER==WIN32C
+							if (have_ul)
+								bgi = COMMON_LVB_UNDERSCORE >> 4;
+							else
+#endif
+								bgi = 8;
 							at |= 4;
 							break;
 						case 5: /* slow blink on */
 						case 6: /* fast blink on */
+							bgi = 8;
 							at |= 8;
 							break;
 						case 8:	/* concealed on */
-							fg = (bg & 7) | 8;
+							at |= 16;
 							break;
 						case 22: /* bold off */
+							fgi = 0;
 							at &= ~1;
 							break;
 						case 23: /* italic off */
@@ -247,23 +291,31 @@
 							at &= ~2;
 							break;
 						case 24: /* underline off */
+							bgi = 0;
 							at &= ~4;
 							break;
+						case 28: /* concealed off */
+							at &= ~16;
+							break;
 						case 30: case 31: case 32:
 						case 33: case 34: case 35:
 						case 36: case 37:
-							fg = (fg & 8) | (screen_color[code - 30]);
+							fg = screen_color[code - 30];
+							at |= 32;
 							break;
 						case 39: /* default fg */
-							fg = nm_fg_color;
+							fg = nm_fg_color & 7;
+							at |= 32;
 							break;
 						case 40: case 41: case 42:
 						case 43: case 44: case 45:
 						case 46: case 47:
-							bg = (bg & 8) | (screen_color[code - 40]);
+							bg = screen_color[code - 40];
+							at |= 32;
 							break;
-						case 49: /* default fg */
-							bg = nm_bg_color;
+						case 49: /* default bg */
+							bg = nm_bg_color & 7;
+							at |= 32;
 							break;
 						}
 						p = q;
@@ -270,39 +322,57 @@
 					}
 					if (!is_ansi_end(*p) || p == p_next)
 						break;
-					if (at & 1)
+					/*
+					 * In SGR mode, the ANSI sequence is
+					 * always honored; otherwise if an attr
+					 * is used by itself ("\e[1m" versus
+					 * "\e[1;33m", for example), set the
+					 * color assigned to that attribute.
+					 */
+					if (sgr_mode || (at & 32))
 					{
-						/*
-						 * If \e[1m use defined bold
-						 * color, else set intensity.
-						 */
-						if (p[-2] == '[')
+						if (at & 2)
 						{
+							f = bg | bgi;
+							b = fg | fgi;
+						} else
+						{
+							f = fg | fgi;
+							b = bg | bgi;
+						}
+					} else
+					{
+						if (at & 1)
+						{
+							f = bo_fg_color;
+							b = bo_bg_color;
+						} else if (at & 2)
+						{
+							f = so_fg_color;
+							b = so_bg_color;
+						} else if (at & 4)
+						{
+							f = ul_fg_color;
+							b = ul_bg_color;
+						} else if (at & 8)
+						{
+							f = bl_fg_color;
+							b = bl_bg_color;
+						} else
+						{
+							f = nm_fg_color;
+							b = nm_bg_color;
+						}
+					}
+					if (at & 16)
+						f = b ^ 8;
+					f &= 0xf;
 #if MSDOS_COMPILER==WIN32C
-							fg |= FOREGROUND_INTENSITY;
-							bg |= BACKGROUND_INTENSITY;
+					b &= 0xf | (COMMON_LVB_UNDERSCORE >> 4);
 #else
-							fg = bo_fg_color;
-							bg = bo_bg_color;
+ 					b &= 0xf;
 #endif
-						} else
-							fg |= 8;
-					} else if (at & 2)
-					{
-						fg = so_fg_color;
-						bg = so_bg_color;
-					} else if (at & 4)
-					{
-						fg = ul_fg_color;
-						bg = ul_bg_color;
-					} else if (at & 8)
-					{
-						fg = bl_fg_color;
-						bg = bl_bg_color;
-					}
-					fg &= 0xf;
-					bg &= 0xf;
-					WIN32setcolors(fg, bg);
+					WIN32setcolors(f, b);
 					p_next = anchor = p + 1;
 				} else
 					p_next++;
@@ -381,7 +451,7 @@
  */
 	public void
 putstr(s)
-	register char *s;
+	constant char *s;
 {
 	while (*s != '\0')
 		putchr(*s++);
@@ -398,7 +468,7 @@
 { \
 	int neg = (num < 0); \
 	char tbuf[INT_STRLEN_BOUND(num)+2]; \
-	register char *s = tbuf + sizeof(tbuf); \
+	char *s = tbuf + sizeof(tbuf); \
 	if (neg) num = -num; \
 	*--s = '\0'; \
 	do { \
@@ -423,7 +493,7 @@
 
 	inttoa(num, buf);
 	putstr(buf);
-	return (strlen(buf));
+	return ((int) strlen(buf));
 }
 
 /*
@@ -437,7 +507,7 @@
 
 	linenumtoa(num, buf);
 	putstr(buf);
-	return (strlen(buf));
+	return ((int) strlen(buf));
 }
 
 /*
@@ -446,11 +516,11 @@
  */
 	static int
 less_printf(fmt, parg)
-	register char *fmt;
+	char *fmt;
 	PARG *parg;
 {
-	register char *s;
-	register int col;
+	char *s;
+	int col;
 
 	col = 0;
 	while (*fmt != '\0')
@@ -481,6 +551,9 @@
 				col += iprint_linenum(parg->p_linenum);
 				parg++;
 				break;
+			case '%':
+				putchr('%');
+				break;
 			}
 		}
 	}
@@ -545,7 +618,7 @@
 
 	get_return();
 	lower_left();
-    clear_eol();
+	clear_eol();
 
 	if (col >= sc_width)
 		/*
@@ -590,7 +663,7 @@
 	char *fmt;
 	PARG *parg;
 {
-	register int c;
+	int c;
 	int col = 0;
 
 	if (any_display && is_tty)

Modified: vendor/less/dist/pattern.c
===================================================================
--- vendor/less/dist/pattern.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/pattern.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -12,7 +12,6 @@
  */
 
 #include "less.h"
-#include "pattern.h"
 
 extern int caseless;
 
@@ -20,10 +19,11 @@
  * Compile a search pattern, for future use by match_pattern.
  */
 	static int
-compile_pattern2(pattern, search_type, comp_pattern)
+compile_pattern2(pattern, search_type, comp_pattern, show_error)
 	char *pattern;
 	int search_type;
-	void **comp_pattern;
+	PATTERN_TYPE *comp_pattern;
+	int show_error;
 {
 	if (search_type & SRCH_NO_REGEX)
 		return (0);
@@ -31,35 +31,39 @@
 #if HAVE_GNU_REGEX
 	struct re_pattern_buffer *comp = (struct re_pattern_buffer *)
 		ecalloc(1, sizeof(struct re_pattern_buffer));
-	struct re_pattern_buffer **pcomp = 
-		(struct re_pattern_buffer **) comp_pattern;
 	re_set_syntax(RE_SYNTAX_POSIX_EXTENDED);
 	if (re_compile_pattern(pattern, strlen(pattern), comp))
 	{
 		free(comp);
-		error("Invalid pattern", NULL_PARG);
+		if (show_error)
+			error("Invalid pattern", NULL_PARG);
 		return (-1);
 	}
-	if (*pcomp != NULL)
-		regfree(*pcomp);
-	*pcomp = comp;
+	if (*comp_pattern != NULL)
+	{
+		regfree(*comp_pattern);
+		free(*comp_pattern);
+	}
+	*comp_pattern = comp;
 #endif
 #if HAVE_POSIX_REGCOMP
 	regex_t *comp = (regex_t *) ecalloc(1, sizeof(regex_t));
-	regex_t **pcomp = (regex_t **) comp_pattern;
 	if (regcomp(comp, pattern, REGCOMP_FLAG))
 	{
 		free(comp);
-		error("Invalid pattern", NULL_PARG);
+		if (show_error)
+			error("Invalid pattern", NULL_PARG);
 		return (-1);
 	}
-	if (*pcomp != NULL)
-		regfree(*pcomp);
-	*pcomp = comp;
+	if (*comp_pattern != NULL)
+	{
+		regfree(*comp_pattern);
+		free(*comp_pattern);
+	}
+	*comp_pattern = comp;
 #endif
 #if HAVE_PCRE
 	pcre *comp;
-	pcre **pcomp = (pcre **) comp_pattern;
 	constant char *errstring;
 	int erroffset;
 	PARG parg;
@@ -68,37 +72,40 @@
 	if (comp == NULL)
 	{
 		parg.p_string = (char *) errstring;
-		error("%s", &parg);
+		if (show_error)
+			error("%s", &parg);
 		return (-1);
 	}
-	*pcomp = comp;
+	*comp_pattern = comp;
 #endif
 #if HAVE_RE_COMP
 	PARG parg;
-	int *pcomp = (int *) comp_pattern;
 	if ((parg.p_string = re_comp(pattern)) != NULL)
 	{
-		error("%s", &parg);
+		if (show_error)
+			error("%s", &parg);
 		return (-1);
 	}
-	*pcomp = 1;
+	*comp_pattern = 1;
 #endif
 #if HAVE_REGCMP
 	char *comp;
-	char **pcomp = (char **) comp_pattern;
 	if ((comp = regcmp(pattern, 0)) == NULL)
 	{
-		error("Invalid pattern", NULL_PARG);
+		if (show_error)
+			error("Invalid pattern", NULL_PARG);
 		return (-1);
 	}
-	if (pcomp != NULL)
-		free(*pcomp);
-	*pcomp = comp;
+	if (comp_pattern != NULL)
+		free(*comp_pattern);
+	*comp_pattern = comp;
 #endif
 #if HAVE_V8_REGCOMP
 	struct regexp *comp;
-	struct regexp **pcomp = (struct regexp **) comp_pattern;
-	if ((comp = regcomp(pattern)) == NULL)
+	reg_show_error = show_error;
+	comp = regcomp(pattern);
+	reg_show_error = 1;
+	if (comp == NULL)
 	{
 		/*
 		 * regcomp has already printed an error message 
@@ -106,9 +113,9 @@
 		 */
 		return (-1);
 	}
-	if (*pcomp != NULL)
-		free(*pcomp);
-	*pcomp = comp;
+	if (*comp_pattern != NULL)
+		free(*comp_pattern);
+	*comp_pattern = comp;
 #endif
   }
 	return (0);
@@ -121,7 +128,7 @@
 compile_pattern(pattern, search_type, comp_pattern)
 	char *pattern;
 	int search_type;
-	void **comp_pattern;
+	PATTERN_TYPE *comp_pattern;
 {
 	char *cvt_pattern;
 	int result;
@@ -133,7 +140,7 @@
 		cvt_pattern = (char*) ecalloc(1, cvt_length(strlen(pattern), CVT_TO_LC));
 		cvt_text(cvt_pattern, pattern, (int *)NULL, (int *)NULL, CVT_TO_LC);
 	}
-	result = compile_pattern2(cvt_pattern, search_type, comp_pattern);
+	result = compile_pattern2(cvt_pattern, search_type, comp_pattern, 1);
 	if (cvt_pattern != pattern)
 		free(cvt_pattern);
 	return (result);
@@ -144,50 +151,68 @@
  */
 	public void
 uncompile_pattern(pattern)
-	void **pattern;
+	PATTERN_TYPE *pattern;
 {
 #if HAVE_GNU_REGEX
-	struct re_pattern_buffer **pcomp = (struct re_pattern_buffer **) pattern;
-	if (*pcomp != NULL)
-		regfree(*pcomp);
-	*pcomp = NULL;
+	if (*pattern != NULL)
+	{
+		regfree(*pattern);
+		free(*pattern);
+	}
+	*pattern = NULL;
 #endif
 #if HAVE_POSIX_REGCOMP
-	regex_t **pcomp = (regex_t **) pattern;
-	if (*pcomp != NULL)
-		regfree(*pcomp);
-	*pcomp = NULL;
+	if (*pattern != NULL)
+	{
+		regfree(*pattern);
+		free(*pattern);
+	}
+	*pattern = NULL;
 #endif
 #if HAVE_PCRE
-	pcre **pcomp = (pcre **) pattern;
-	if (*pcomp != NULL)
-		pcre_free(*pcomp);
-	*pcomp = NULL;
+	if (*pattern != NULL)
+		pcre_free(*pattern);
+	*pattern = NULL;
 #endif
 #if HAVE_RE_COMP
-	int *pcomp = (int *) pattern;
-	*pcomp = 0;
+	*pattern = 0;
 #endif
 #if HAVE_REGCMP
-	char **pcomp = (char **) pattern;
-	if (*pcomp != NULL)
-		free(*pcomp);
-	*pcomp = NULL;
+	if (*pattern != NULL)
+		free(*pattern);
+	*pattern = NULL;
 #endif
 #if HAVE_V8_REGCOMP
-	struct regexp **pcomp = (struct regexp **) pattern;
-	if (*pcomp != NULL)
-		free(*pcomp);
-	*pcomp = NULL;
+	if (*pattern != NULL)
+		free(*pattern);
+	*pattern = NULL;
 #endif
 }
 
 /*
+ * Can a pattern be successfully compiled?
+ */
+	public int
+valid_pattern(pattern)
+	char *pattern;
+{
+	PATTERN_TYPE comp_pattern;
+	int result;
+
+	CLEAR_PATTERN(comp_pattern);
+	result = compile_pattern2(pattern, 0, &comp_pattern, 0);
+	if (result != 0)
+		return (0);
+	uncompile_pattern(&comp_pattern);
+	return (1);
+}
+
+/*
  * Is a compiled pattern null?
  */
 	public int
 is_null_pattern(pattern)
-	void *pattern;
+	PATTERN_TYPE pattern;
 {
 #if HAVE_GNU_REGEX
 	return (pattern == NULL);
@@ -207,6 +232,9 @@
 #if HAVE_V8_REGCOMP
 	return (pattern == NULL);
 #endif
+#if NO_REGEX
+	return (pattern == NULL);
+#endif
 }
 
 /*
@@ -221,15 +249,23 @@
 	int buf_len;
 	char **pfound, **pend;
 {
-	register char *pp, *lp;
-	register char *pattern_end = pattern + pattern_len;
-	register char *buf_end = buf + buf_len;
+	char *pp, *lp;
+	char *pattern_end = pattern + pattern_len;
+	char *buf_end = buf + buf_len;
 
 	for ( ;  buf < buf_end;  buf++)
 	{
-		for (pp = pattern, lp = buf;  *pp == *lp;  pp++, lp++)
+		for (pp = pattern, lp = buf;  ;  pp++, lp++)
+		{
+			char cp = *pp;
+			char cl = *lp;
+			if (caseless == OPT_ONPLUS && ASCII_IS_UPPER(cp))
+				cp = ASCII_TO_LOWER(cp);
+			if (cp != cl)
+				break;
 			if (pp == pattern_end || lp == buf_end)
 				break;
+		}
 		if (pp == pattern_end)
 		{
 			if (pfound != NULL)
@@ -248,7 +284,7 @@
  */
 	public int
 match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type)
-	void *pattern;
+	PATTERN_TYPE pattern;
 	char *tpattern;
 	char *line;
 	int line_len;
@@ -258,25 +294,8 @@
 	int search_type;
 {
 	int matched;
-#if HAVE_GNU_REGEX
-	struct re_pattern_buffer *spattern = (struct re_pattern_buffer *) pattern;
-#endif
-#if HAVE_POSIX_REGCOMP
-	regex_t *spattern = (regex_t *) pattern;
-#endif
-#if HAVE_PCRE
-	pcre *spattern = (pcre *) pattern;
-#endif
-#if HAVE_RE_COMP
-	int spattern = (int) pattern;
-#endif
-#if HAVE_REGCMP
-	char *spattern = (char *) pattern;
-#endif
-#if HAVE_V8_REGCOMP
-	struct regexp *spattern = (struct regexp *) pattern;
-#endif
 
+	*sp = *ep = NULL;
 #if NO_REGEX
 	search_type |= SRCH_NO_REGEX;
 #endif
@@ -287,18 +306,14 @@
 #if HAVE_GNU_REGEX
 	{
 		struct re_registers search_regs;
-		regoff_t *starts = (regoff_t *) ecalloc(1, sizeof (regoff_t));
-		regoff_t *ends = (regoff_t *) ecalloc(1, sizeof (regoff_t));
-		spattern->not_bol = notbol;
-		re_set_registers(spattern, &search_regs, 1, starts, ends);
-		matched = re_search(spattern, line, line_len, 0, line_len, &search_regs) >= 0;
+		pattern->not_bol = notbol;
+		pattern->regs_allocated = REGS_UNALLOCATED;
+		matched = re_search(pattern, line, line_len, 0, line_len, &search_regs) >= 0;
 		if (matched)
 		{
 			*sp = line + search_regs.start[0];
 			*ep = line + search_regs.end[0];
 		}
-		free(starts);
-		free(ends);
 	}
 #endif
 #if HAVE_POSIX_REGCOMP
@@ -305,7 +320,12 @@
 	{
 		regmatch_t rm;
 		int flags = (notbol) ? REG_NOTBOL : 0;
-		matched = !regexec(spattern, line, 1, &rm, flags);
+#ifdef REG_STARTEND
+		flags |= REG_STARTEND;
+		rm.rm_so = 0;
+		rm.rm_eo = line_len;
+#endif
+		matched = !regexec(pattern, line, 1, &rm, flags);
 		if (matched)
 		{
 #ifndef __WATCOMC__
@@ -322,7 +342,7 @@
 	{
 		int flags = (notbol) ? PCRE_NOTBOL : 0;
 		int ovector[3];
-		matched = pcre_exec(spattern, NULL, line, line_len,
+		matched = pcre_exec(pattern, NULL, line, line_len,
 			0, flags, ovector, 3) >= 0;
 		if (matched)
 		{
@@ -339,7 +359,7 @@
 	*sp = *ep = NULL;
 #endif
 #if HAVE_REGCMP
-	*ep = regex(spattern, line);
+	*ep = regex(pattern, line);
 	matched = (*ep != NULL);
 	if (matched)
 		*sp = __loc1;
@@ -346,14 +366,14 @@
 #endif
 #if HAVE_V8_REGCOMP
 #if HAVE_REGEXEC2
-	matched = regexec2(spattern, line, notbol);
+	matched = regexec2(pattern, line, notbol);
 #else
-	matched = regexec(spattern, line);
+	matched = regexec(pattern, line);
 #endif
 	if (matched)
 	{
-		*sp = spattern->startp[0];
-		*ep = spattern->endp[0];
+		*sp = pattern->startp[0];
+		*ep = pattern->endp[0];
 	}
 #endif
 	}

Modified: vendor/less/dist/pattern.h
===================================================================
--- vendor/less/dist/pattern.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/pattern.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -10,7 +10,7 @@
 #if HAVE_GNU_REGEX
 #define __USE_GNU 1
 #include <regex.h>
-#define DEFINE_PATTERN(name)  struct re_pattern_buffer *name
+#define PATTERN_TYPE          struct re_pattern_buffer *
 #define CLEAR_PATTERN(name)   name = NULL
 #endif
 
@@ -17,42 +17,44 @@
 #if HAVE_POSIX_REGCOMP
 #include <regex.h>
 #ifdef REG_EXTENDED
-#define	REGCOMP_FLAG	REG_EXTENDED
+extern int less_is_more;
+#define REGCOMP_FLAG    (less_is_more ? 0 : REG_EXTENDED)
 #else
-#define	REGCOMP_FLAG	0
+#define REGCOMP_FLAG    0
 #endif
-#define DEFINE_PATTERN(name)  regex_t *name
+#define PATTERN_TYPE          regex_t *
 #define CLEAR_PATTERN(name)   name = NULL
 #endif
 
 #if HAVE_PCRE
 #include <pcre.h>
-#define DEFINE_PATTERN(name)  pcre *name
+#define PATTERN_TYPE          pcre *
 #define CLEAR_PATTERN(name)   name = NULL
 #endif
 
 #if HAVE_RE_COMP
-char *re_comp();
-int re_exec();
-#define DEFINE_PATTERN(name)  int name
+char *re_comp LESSPARAMS ((char*));
+int re_exec LESSPARAMS ((char*));
+#define PATTERN_TYPE          int
 #define CLEAR_PATTERN(name)   name = 0
 #endif
 
 #if HAVE_REGCMP
-char *regcmp();
-char *regex();
+char *regcmp LESSPARAMS ((char*));
+char *regex LESSPARAMS ((char**, char*));
 extern char *__loc1;
-#define DEFINE_PATTERN(name)  char *name
+#define PATTERN_TYPE          char **
 #define CLEAR_PATTERN(name)   name = NULL
 #endif
 
 #if HAVE_V8_REGCOMP
 #include "regexp.h"
-#define DEFINE_PATTERN(name)  struct regexp *name
+extern int reg_show_error;
+#define PATTERN_TYPE          struct regexp *
 #define CLEAR_PATTERN(name)   name = NULL
 #endif
 
 #if NO_REGEX
-#define DEFINE_PATTERN(name)  
+#define PATTERN_TYPE          void *
 #define CLEAR_PATTERN(name)   
 #endif

Modified: vendor/less/dist/pckeys.h
===================================================================
--- vendor/less/dist/pckeys.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/pckeys.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/position.c
===================================================================
--- vendor/less/dist/position.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/position.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -36,21 +36,22 @@
  *	the line after the bottom line on the screen
  */
 	public POSITION
-position(where)
-	int where;
+position(sindex)
+	int sindex;
 {
-	switch (where)
+	switch (sindex)
 	{
 	case BOTTOM:
-		where = sc_height - 2;
+		sindex = sc_height - 2;
 		break;
 	case BOTTOM_PLUS_ONE:
-		where = sc_height - 1;
+		sindex = sc_height - 1;
 		break;
 	case MIDDLE:
-		where = (sc_height - 1) / 2;
+		sindex = (sc_height - 1) / 2;
+		break;
 	}
-	return (table[where]);
+	return (table[sindex]);
 }
 
 /*
@@ -60,7 +61,7 @@
 add_forw_pos(pos)
 	POSITION pos;
 {
-	register int i;
+	int i;
 
 	/*
 	 * Scroll the position table up.
@@ -77,7 +78,7 @@
 add_back_pos(pos)
 	POSITION pos;
 {
-	register int i;
+	int i;
 
 	/*
 	 * Scroll the position table down.
@@ -93,7 +94,7 @@
 	public void
 pos_clear()
 {
-	register int i;
+	int i;
 
 	for (i = 0;  i < sc_height;  i++)
 		table[i] = NULL_POSITION;
@@ -115,7 +116,7 @@
 	 */
 	if (table != NULL)
 	{
-		get_scrpos(&scrpos);
+		get_scrpos(&scrpos, TOP);
 		free((char*)table);
 	} else
 		scrpos.pos = NULL_POSITION;
@@ -135,7 +136,7 @@
 onscreen(pos)
 	POSITION pos;
 {
-	register int i;
+	int i;
 
 	if (pos < table[0])
 		return (-1);
@@ -159,7 +160,7 @@
 	int s;
 	int e;
 {
-	register int i;
+	int i;
 
 	for (i = s;  i <= e;  i++)
 		if (table[i] != NULL_POSITION && table[i] != 0)
@@ -176,16 +177,26 @@
  * the screen line to a number > 0.
  */
 	public void
-get_scrpos(scrpos)
+get_scrpos(scrpos, where)
 	struct scrpos *scrpos;
+	int where;
 {
-	register int i;
+	int i;
+	int dir;
+	int last;
 
+	switch (where)
+	{
+	case TOP: i = 0; dir = +1; last = sc_height-2; break;
+	default:  i = sc_height-2; dir = -1; last = 0; break;
+	}
+
 	/*
 	 * Find the first line on the screen which has something on it,
 	 * and return the screen line number and the file position.
 	 */
-	for (i = 0; i < sc_height;  i++)
+	for (;; i += dir)
+	{
 		if (table[i] != NULL_POSITION)
 		{
 			scrpos->ln = i+1;
@@ -192,6 +203,8 @@
 			scrpos->pos = table[i];
 			return;
 		}
+		if (i == last) break;
+	}
 	/*
 	 * The screen is empty.
 	 */
@@ -208,7 +221,7 @@
  * relative to the bottom of the screen.
  */
 	public int
-adjsline(sline)
+sindex_from_sline(sline)
 	int sline;
 {
 	/*
@@ -218,12 +231,12 @@
 	if (sline < 0)
 		sline += sc_height;
 	/*
-	 * Can't be less than 1 or greater than sc_height-1.
+	 * Can't be less than 1 or greater than sc_height.
 	 */
 	if (sline <= 0)
 		sline = 1;
-	if (sline >= sc_height)
-		sline = sc_height - 1;
+	if (sline > sc_height)
+		sline = sc_height;
 	/*
 	 * Return zero-based line number, not one-based.
 	 */

Modified: vendor/less/dist/position.h
===================================================================
--- vendor/less/dist/position.h	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/position.h	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/prompt.c
===================================================================
--- vendor/less/dist/prompt.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/prompt.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -85,9 +85,9 @@
 {
 	int len;
 
-	len = strlen(s);
+	len = (int) strlen(s);
 	if (mp + len >= message + PROMPT_SIZE)
-		len = message + PROMPT_SIZE - mp - 1;
+		len = (int) (message + PROMPT_SIZE - mp - 1);
 	strncpy(mp, s, len);
 	mp += len;
 	*mp = '\0';
@@ -394,9 +394,9 @@
  */
 	static constant char *
 skipcond(p)
-	register constant char *p;
+	constant char *p;
 {
-	register int iflevel;
+	int iflevel;
 
 	/*
 	 * We came in here after processing a ? or :,
@@ -464,7 +464,7 @@
 		case 'm':   *wp = MIDDLE;		break;
 		case 'b':   *wp = BOTTOM;		break;
 		case 'B':   *wp = BOTTOM_PLUS_ONE;	break;
-		case 'j':   *wp = adjsline(jump_sline);	break;
+		case 'j':   *wp = sindex_from_sline(jump_sline); break;
 		default:    *wp = TOP;  p--;		break;
 		}
 	}
@@ -479,8 +479,8 @@
 	constant char *proto;
 	int maxwidth;
 {
-	register constant char *p;
-	register int c;
+	constant char *p;
+	int c;
 	int where;
 
 	mp = message;

Modified: vendor/less/dist/regexp.c
===================================================================
--- vendor/less/dist/regexp.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/regexp.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -243,7 +243,10 @@
 	regcode = r->program;
 	regc(MAGIC);
 	if (reg(0, &flags) == NULL)
+	{
+		free(r);
 		return(NULL);
+	}
 
 	/* Dig out information for optimizations. */
 	r->regstart = '\0';	/* Worst-case defaults. */
@@ -274,7 +277,7 @@
 			for (; scan != NULL; scan = regnext(scan))
 				if (OP(scan) == EXACTLY && ((int) strlen(OPERAND(scan))) >= len) {
 					longest = OPERAND(scan);
-					len = strlen(OPERAND(scan));
+					len = (int) strlen(OPERAND(scan));
 				}
 			r->regmust = longest;
 			r->regmlen = len;
@@ -554,7 +557,7 @@
 			register char ender;
 
 			regparse--;
-			len = strcspn(regparse, META);
+			len = (int) strcspn(regparse, META);
 			if (len <= 0)
 				FAIL("internal disaster");
 			ender = *(regparse+len);
@@ -670,9 +673,9 @@
 	}
 
 	if (OP(scan) == BACK)
-		offset = scan - val;
+		offset = (int) (scan - val);
 	else
-		offset = val - scan;
+		offset = (int) (val - scan);
 	*(scan+1) = (offset>>8)&0377;
 	*(scan+2) = offset&0377;
 }
@@ -870,7 +873,7 @@
 				/* Inline the first character, for speed. */
 				if (*opnd != *reginput)
 					return(0);
-				len = strlen(opnd);
+				len = (int) strlen(opnd);
 				if (len > 1 && strncmp(opnd, reginput, len) != 0)
 					return(0);
 				reginput += len;
@@ -1034,7 +1037,7 @@
 	opnd = OPERAND(p);
 	switch (OP(p)) {
 	case ANY:
-		count = strlen(scan);
+		count = (int) strlen(scan);
 		scan += count;
 		break;
 	case EXACTLY:

Modified: vendor/less/dist/screen.c
===================================================================
--- vendor/less/dist/screen.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/screen.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -126,16 +126,21 @@
 static HANDLE con_out_ours = INVALID_HANDLE_VALUE; /* our own */
 HANDLE con_out = INVALID_HANDLE_VALUE;             /* current console */
 
+extern int utf_mode;
 extern int quitting;
 static void win32_init_term();
 static void win32_deinit_term();
 
+#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
+#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 4
+#endif
+
 #define FG_COLORS       (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
 #define BG_COLORS       (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY)
 #define	MAKEATTR(fg,bg)		((WORD)((fg)|((bg)<<4)))
 #define	SETCOLORS(fg,bg)	{ curr_attr = MAKEATTR(fg,bg); \
 				if (SetConsoleTextAttribute(con_out, curr_attr) == 0) \
-				error("SETCOLORS failed"); }
+				error("SETCOLORS failed", NULL_PARG); }
 #endif
 
 #if MSDOS_COMPILER
@@ -151,7 +156,10 @@
 public int bl_bg_color;
 static int sy_fg_color;		/* Color of system text (before less) */
 static int sy_bg_color;
-
+public int sgr_mode;		/* Honor ANSI sequences rather than using above */
+#if MSDOS_COMPILER==WIN32C
+public int have_ul;		/* Is underline available? */
+#endif
 #else
 
 /*
@@ -200,9 +208,11 @@
 public int can_goto_line;		/* Can move cursor to any line */
 public int clear_bg;		/* Clear fills with background color */
 public int missing_cap = 0;	/* Some capability is missing */
+public char *kent = NULL;	/* Keypad ENTER sequence */
 
 static int attrmode = AT_NORMAL;
 extern int binattr;
+extern int line_count;
 
 #if !MSDOS_COMPILER
 static char *cheaper();
@@ -232,6 +242,7 @@
 extern int screen_trashed;
 extern int tty;
 extern int top_scroll;
+extern int quit_if_one_screen;
 extern int oldbot;
 #if HILITE_SEARCH
 extern int hilite_search;
@@ -693,7 +704,7 @@
 	public void
 scrsize()
 {
-	register char *s;
+	char *s;
 	int sys_height;
 	int sys_width;
 #if !MSDOS_COMPILER
@@ -1106,6 +1117,7 @@
 	so_bg_color = 9;
 	bl_fg_color = 15;
 	bl_bg_color = 0;
+	sgr_mode = 0;
 
 	/*
 	 * Get size of the screen.
@@ -1117,7 +1129,7 @@
 #else /* !MSDOS_COMPILER */
 
 	char *sp;
-	register char *t1, *t2;
+	char *t1, *t2;
 	char *term;
 	char termbuf[TERMBUF_SIZE];
 
@@ -1206,7 +1218,8 @@
 	sc_e_keypad = ltgetstr("ke", &sp);
 	if (sc_e_keypad == NULL)
 		sc_e_keypad = "";
-		
+	kent = ltgetstr("@8", &sp);
+
 	sc_init = ltgetstr("ti", &sp);
 	if (sc_init == NULL)
 		sc_init = "";
@@ -1448,6 +1461,9 @@
 	static void
 initcolor()
 {
+#if MSDOS_COMPILER==BORLANDC || MSDOS_COMPILER==DJGPPC
+	intensevideo();
+#endif
 	SETCOLORS(nm_fg_color, nm_bg_color);
 #if 0
 	/*
@@ -1491,6 +1507,8 @@
 
 	if (con_out_ours == INVALID_HANDLE_VALUE)
 	{
+		DWORD output_mode;
+
 		/*
 		 * Create our own screen buffer, so that we
 		 * may restore the original when done.
@@ -1501,6 +1519,12 @@
 			(LPSECURITY_ATTRIBUTES) NULL,
 			CONSOLE_TEXTMODE_BUFFER,
 			(LPVOID) NULL);
+		/*
+		 * Enable underline, if available.
+		 */
+		GetConsoleMode(con_out_ours, &output_mode);
+		have_ul = SetConsoleMode(con_out_ours,
+			    output_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
 	}
 
 	size.X = scr.srWindow.Right - scr.srWindow.Left + 1;
@@ -1533,7 +1557,9 @@
 init()
 {
 #if !MSDOS_COMPILER
-	if (!no_init)
+	if (quit_if_one_screen && line_count >= sc_height)
+		quit_if_one_screen = FALSE;
+	if (!no_init && !quit_if_one_screen)
 		tputs(sc_init, sc_height, putchr);
 	if (!no_keypad)
 		tputs(sc_s_keypad, sc_height, putchr);
@@ -1573,7 +1599,7 @@
 #if !MSDOS_COMPILER
 	if (!no_keypad)
 		tputs(sc_e_keypad, sc_height, putchr);
-	if (!no_init)
+	if (!no_init && !quit_if_one_screen)
 		tputs(sc_deinit, sc_height, putchr);
 #else
 	/* Restore system colors. */
@@ -1819,6 +1845,8 @@
 	public void
 lower_left()
 {
+	if (!init_done)
+		return;
 #if !MSDOS_COMPILER
 	tputs(sc_lower_left, 1, putchr);
 #else
@@ -1893,14 +1921,14 @@
  * Goto a specific line on the screen.
  */
 	public void
-goto_line(slinenum)
-	int slinenum;
+goto_line(sindex)
+	int sindex;
 {
 #if !MSDOS_COMPILER
-	tputs(tgoto(sc_move, 0, slinenum), 1, putchr);
+	tputs(tgoto(sc_move, 0, sindex), 1, putchr);
 #else
 	flush();
-	_settextposition(slinenum+1, 1);
+	_settextposition(sindex+1, 1);
 #endif
 }
 
@@ -1941,7 +1969,7 @@
 	}
 #else
 #if MSDOS_COMPILER==BORLANDC
-	register int n;
+	int n;
 
 	whitescreen = (unsigned short *) 
 		malloc(sc_width * sc_height * sizeof(short));
@@ -1951,7 +1979,7 @@
 		whitescreen[n] = 0x7020;
 #else
 #if MSDOS_COMPILER==WIN32C
-	register int n;
+	int n;
 
 	whitescreen = (WORD *)
 		malloc(sc_height * sc_width * sizeof(WORD));
@@ -2432,7 +2460,16 @@
 			currentKey.scan = PCK_CTL_DELETE;
 			break;
 		}
+	} else if (ip.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED)
+	{
+		switch (currentKey.scan)
+		{
+		case PCK_SHIFT_TAB: /* tab */
+			currentKey.ascii = 0;
+			break;
+		}
 	}
+
 	return (TRUE);
 }
 
@@ -2490,7 +2527,18 @@
 {
 #if MSDOS_COMPILER==WIN32C
 	DWORD written;
-	WriteConsole(con_out, text, len, &written, NULL);
+	if (utf_mode == 2)
+	{
+		/*
+		 * We've got UTF-8 text in a non-UTF-8 console.  Convert it to
+		 * wide and use WriteConsoleW.
+		 */
+		WCHAR wtext[1024];
+		len = MultiByteToWideChar(CP_UTF8, 0, text, len, wtext,
+					  sizeof(wtext)/sizeof(*wtext));
+		WriteConsoleW(con_out, wtext, len, &written, NULL);
+	} else
+		WriteConsole(con_out, text, len, &written, NULL);
 #else
 	char c = text[len];
 	text[len] = '\0';

Modified: vendor/less/dist/scrsize.c
===================================================================
--- vendor/less/dist/scrsize.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/scrsize.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.

Modified: vendor/less/dist/search.c
===================================================================
--- vendor/less/dist/search.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/search.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -13,7 +13,6 @@
  */
 
 #include "less.h"
-#include "pattern.h"
 #include "position.h"
 #include "charset.h"
 
@@ -29,7 +28,7 @@
 extern int bs_mode;
 extern int ctldisp;
 extern int status_col;
-extern void * constant ml_search;
+extern void *ml_search;
 extern POSITION start_attnpos;
 extern POSITION end_attnpos;
 extern int utf_mode;
@@ -45,15 +44,57 @@
 static int is_caseless;
 static int is_ucase_pattern;
 
+/*
+ * Structures for maintaining a set of ranges for hilites and filtered-out
+ * lines. Each range is stored as a node within a red-black tree, and we
+ * try to extend existing ranges (without creating overlaps) rather than
+ * create new nodes if possible. We remember the last node found by a
+ * search for constant-time lookup if the next search is near enough to
+ * the previous. To aid that, we overlay a secondary doubly-linked list
+ * on top of the red-black tree so we can find the preceding/succeeding
+ * nodes also in constant time.
+ *
+ * Each node is allocated from a series of pools, each pool double the size
+ * of the previous (for amortised constant time allocation). Since our only
+ * tree operations are clear and node insertion, not node removal, we don't
+ * need to maintain a usage bitmap or freelist and can just return nodes
+ * from the pool in-order until capacity is reached.
+ */
 struct hilite
 {
-	struct hilite *hl_next;
 	POSITION hl_startpos;
 	POSITION hl_endpos;
 };
-static struct hilite hilite_anchor = { NULL, NULL_POSITION, NULL_POSITION };
-static struct hilite filter_anchor = { NULL, NULL_POSITION, NULL_POSITION };
-#define	hl_first	hl_next
+struct hilite_node
+{
+	struct hilite_node *parent;
+	struct hilite_node *left;
+	struct hilite_node *right;
+	struct hilite_node *prev;
+	struct hilite_node *next;
+	int red;
+	struct hilite r;
+};
+struct hilite_storage
+{
+	int capacity;
+	int used;
+	struct hilite_storage *next;
+	struct hilite_node *nodes;
+};
+struct hilite_tree
+{
+	struct hilite_storage *first;
+	struct hilite_storage *current;
+	struct hilite_node *root;
+	struct hilite_node *lookaside;
+};
+#define HILITE_INITIALIZER() { NULL, NULL, NULL, NULL }
+#define HILITE_LOOKASIDE_STEPS 2
+
+static struct hilite_tree hilite_anchor = HILITE_INITIALIZER();
+static struct hilite_tree filter_anchor = HILITE_INITIALIZER();
+
 #endif
 
 /*
@@ -61,7 +102,7 @@
  * search pattern and filter pattern.
  */
 struct pattern_info {
-	DEFINE_PATTERN(compiled);
+	PATTERN_TYPE compiled;
 	char* text;
 	int search_type;
 };
@@ -217,9 +258,8 @@
 repaint_hilite(on)
 	int on;
 {
-	int slinenum;
+	int sindex;
 	POSITION pos;
-	POSITION epos;
 	int save_hide_hilite;
 
 	if (squished)
@@ -240,14 +280,13 @@
 		return;
 	}
 
-	for (slinenum = TOP;  slinenum < TOP + sc_height-1;  slinenum++)
+	for (sindex = TOP;  sindex < TOP + sc_height-1;  sindex++)
 	{
-		pos = position(slinenum);
+		pos = position(sindex);
 		if (pos == NULL_POSITION)
 			continue;
-		epos = position(slinenum+1);
 		(void) forw_line(pos);
-		goto_line(slinenum);
+		goto_line(sindex);
 		put_line();
 	}
 	lower_left();
@@ -260,7 +299,7 @@
 	public void
 clear_attn()
 {
-	int slinenum;
+	int sindex;
 	POSITION old_start_attnpos;
 	POSITION old_end_attnpos;
 	POSITION pos;
@@ -281,17 +320,17 @@
 	if (squished)
 		repaint();
 
-	for (slinenum = TOP;  slinenum < TOP + sc_height-1;  slinenum++)
+	for (sindex = TOP;  sindex < TOP + sc_height-1;  sindex++)
 	{
-		pos = position(slinenum);
+		pos = position(sindex);
 		if (pos == NULL_POSITION)
 			continue;
-		epos = position(slinenum+1);
-		if (pos < old_end_attnpos &&
+		epos = position(sindex+1);
+		if (pos <= old_end_attnpos &&
 		     (epos == NULL_POSITION || epos > old_start_attnpos))
 		{
 			(void) forw_line(pos);
-			goto_line(slinenum);
+			goto_line(sindex);
 			put_line();
 			moved = 1;
 		}
@@ -309,9 +348,14 @@
 {
 	if (!prev_pattern(&search_info))
 	{
-		error("No previous regular expression", NULL_PARG);
-		return;
+		if (hilite_anchor.first == NULL)
+		{
+			error("No previous regular expression", NULL_PARG);
+			return;
+		}
+		clr_hilite(); /* Next time, hilite_anchor.first will be NULL. */
 	}
+	clear_pattern(&search_info);
 #if HILITE_SEARCH
 	hide_hilite = !hide_hilite;
 	repaint_hilite(1);
@@ -324,17 +368,23 @@
  */
 	public void
 clr_hlist(anchor)
-	struct hilite *anchor;
+	struct hilite_tree *anchor;
 {
-	struct hilite *hl;
-	struct hilite *nexthl;
+	struct hilite_storage *hls;
+	struct hilite_storage *nexthls;
 
-	for (hl = anchor->hl_first;  hl != NULL;  hl = nexthl)
+	for (hls = anchor->first;  hls != NULL;  hls = nexthls)
 	{
-		nexthl = hl->hl_next;
-		free((void*)hl);
+		nexthls = hls->next;
+		free((void*)hls->nodes);
+		free((void*)hls);
 	}
-	anchor->hl_first = NULL;
+	anchor->first = NULL;
+	anchor->current = NULL;
+	anchor->root = NULL;
+
+	anchor->lookaside = NULL;
+
 	prep_startpos = prep_endpos = NULL_POSITION;
 }
 
@@ -350,7 +400,127 @@
 	clr_hlist(&filter_anchor);
 }
 
+	struct hilite_node*
+hlist_last(anchor)
+	struct hilite_tree *anchor;
+{
+	struct hilite_node *n = anchor->root;
+	while (n != NULL && n->right != NULL)
+		n = n->right;
+	return n;
+}
+
+	struct hilite_node*
+hlist_next(n)
+	struct hilite_node *n;
+{
+	return n->next;
+}
+
+	struct hilite_node*
+hlist_prev(n)
+	struct hilite_node *n;
+{
+	return n->prev;
+}
+
 /*
+ * Find the node covering pos, or the node after it if no node covers it,
+ * or return NULL if pos is after the last range. Remember the found node,
+ * to speed up subsequent searches for the same or similar positions (if
+ * we return NULL, remember the last node.)
+ */
+	struct hilite_node*
+hlist_find(anchor, pos)
+	struct hilite_tree *anchor;
+	POSITION pos;
+{
+	struct hilite_node *n, *m;
+
+	if (anchor->lookaside)
+	{
+		int steps = 0;
+		int hit = 0;
+
+		n = anchor->lookaside;
+
+		for (;;)
+		{
+			if (pos < n->r.hl_endpos)
+			{
+				if (n->prev == NULL || pos >= n->prev->r.hl_endpos)
+				{
+					hit = 1;
+					break;
+				}
+			} else if (n->next == NULL)
+			{
+				n = NULL;
+				hit = 1;
+				break;
+			}
+
+			/*
+			 * If we don't find the right node within a small
+			 * distance, don't keep doing a linear search!
+			 */
+			if (steps >= HILITE_LOOKASIDE_STEPS)
+				break;
+			steps++;
+
+			if (pos < n->r.hl_endpos)
+				anchor->lookaside = n = n->prev;
+			else
+				anchor->lookaside = n = n->next;
+		}
+
+		if (hit)
+			return n;
+	}
+
+	n = anchor->root;
+	m = NULL;
+
+	while (n != NULL)
+	{
+		if (pos < n->r.hl_startpos)
+		{
+			if (n->left != NULL)
+			{
+				m = n;
+				n = n->left;
+				continue;
+			}
+			break;
+		}
+		if (pos >= n->r.hl_endpos)
+		{
+			if (n->right != NULL)
+			{
+				n = n->right;
+				continue;
+			}
+			if (m != NULL)
+			{
+				n = m;
+			} else
+			{
+				m = n;
+				n = NULL;
+			}
+		}
+		break;
+	}
+
+	if (n != NULL)
+		anchor->lookaside = n;
+	else if (m != NULL)
+		anchor->lookaside = m;
+
+	return n;
+}
+
+/*
  * Should any characters in a specified range be highlighted?
  */
 	static int
@@ -358,18 +528,8 @@
 	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);
+	struct hilite_node *n = hlist_find(&hilite_anchor, pos);
+	return (n != NULL && (epos == NULL_POSITION || epos > n->r.hl_startpos));
 }
 
 /* 
@@ -379,24 +539,64 @@
 is_filtered(pos)
 	POSITION pos;
 {
-	struct hilite *hl;
+	struct hilite_node *n;
 
 	if (ch_getflags() & CH_HELPFILE)
 		return (0);
 
-	/*
-	 * Look at each filter and see if the start position
-	 * equals the start position of the line.
-	 */
-	for (hl = filter_anchor.hl_first;  hl != NULL;  hl = hl->hl_next)
+	n = hlist_find(&filter_anchor, pos);
+	return (n != NULL && pos >= n->r.hl_startpos);
+}
+
+/*
+ * If pos is hidden, return the next position which isn't, otherwise
+ * just return pos.
+ */
+	public POSITION
+next_unfiltered(pos)
+	POSITION pos;
+{
+	struct hilite_node *n;
+
+	if (ch_getflags() & CH_HELPFILE)
+		return (pos);
+
+	n = hlist_find(&filter_anchor, pos);
+	while (n != NULL && pos >= n->r.hl_startpos)
 	{
-		if (hl->hl_startpos == pos)
-			return (1);
+		pos = n->r.hl_endpos;
+		n = n->next;
 	}
-	return (0);
+	return (pos);
 }
 
 /*
+ * If pos is hidden, return the previous position which isn't or 0 if
+ * we're filtered right to the beginning, otherwise just return pos.
+ */
+	public POSITION
+prev_unfiltered(pos)
+	POSITION pos;
+{
+	struct hilite_node *n;
+
+	if (ch_getflags() & CH_HELPFILE)
+		return (pos);
+
+	n = hlist_find(&filter_anchor, pos);
+	while (n != NULL && pos >= n->r.hl_startpos)
+	{
+		pos = n->r.hl_startpos;
+		if (pos == 0)
+			break;
+		pos--;
+		n = n->prev;
+	}
+	return (pos);
+}
+
+
+/*
  * Should any characters in a specified range be highlighted?
  * If nohide is nonzero, don't consider hide_hilite.
  */
@@ -425,12 +625,19 @@
 	if (!match)
 		return (0);
 
-	if (p_matches != NULL)
+	if (p_matches == NULL)
 		/*
-		 * Report matches, even if we're hiding highlights.
+		 * Kinda kludgy way to recognize that caller is checking for
+		 * hilite in status column. In this case we want to return
+		 * hilite status even if hiliting is disabled or hidden.
 		 */
-		*p_matches = 1;
+		return (1);
 
+	/*
+	 * Report matches, even if we're hiding highlights.
+	 */
+	*p_matches = 1;
+
 	if (hilite_search == 0)
 		/*
 		 * Not doing highlighting.
@@ -447,43 +654,288 @@
 }
 
 /*
+ * Tree node storage: get the current block of nodes if it has spare
+ * capacity, or create a new one if not.
+ */
+	static struct hilite_storage*
+hlist_getstorage(anchor)
+	struct hilite_tree *anchor;
+{
+	int capacity = 1;
+	struct hilite_storage *s;
+
+	if (anchor->current)
+	{
+		if (anchor->current->used < anchor->current->capacity)
+			return anchor->current;
+		capacity = anchor->current->capacity * 2;
+	}
+
+	s = (struct hilite_storage *) ecalloc(1, sizeof(struct hilite_storage));
+	s->nodes = (struct hilite_node *) ecalloc(capacity, sizeof(struct hilite_node));
+	s->capacity = capacity;
+	s->used = 0;
+	s->next = NULL;
+	if (anchor->current)
+		anchor->current->next = s;
+	else
+		anchor->first = s;
+	anchor->current = s;
+	return s;
+}
+
+/*
+ * Tree node storage: retrieve a new empty node to be inserted into the
+ * tree.
+ */
+	static struct hilite_node*
+hlist_getnode(anchor)
+	struct hilite_tree *anchor;
+{
+	struct hilite_storage *s = hlist_getstorage(anchor);
+	return &s->nodes[s->used++];
+}
+
+/*
+ * Rotate the tree left around a pivot node.
+ */
+	static void
+hlist_rotate_left(anchor, n)
+	struct hilite_tree *anchor;
+	struct hilite_node *n;
+{
+	struct hilite_node *np = n->parent;
+	struct hilite_node *nr = n->right;
+	struct hilite_node *nrl = n->right->left;
+
+	if (np != NULL)
+	{
+		if (n == np->left)
+			np->left = nr;
+		else
+			np->right = nr;
+	} else
+	{
+		anchor->root = nr;
+	}
+	nr->left = n;
+	n->right = nrl;
+
+	nr->parent = np;
+	n->parent = nr;
+	if (nrl != NULL)
+		nrl->parent = n;
+}
+
+/*
+ * Rotate the tree right around a pivot node.
+ */
+	static void
+hlist_rotate_right(anchor, n)
+	struct hilite_tree *anchor;
+	struct hilite_node *n;
+{
+	struct hilite_node *np = n->parent;
+	struct hilite_node *nl = n->left;
+	struct hilite_node *nlr = n->left->right;
+
+	if (np != NULL)
+	{
+		if (n == np->right)
+			np->right = nl;
+		else
+			np->left = nl;
+	} else
+	{
+		anchor->root = nl;
+	}
+	nl->right = n;
+	n->left = nlr;
+
+	nl->parent = np;
+	n->parent = nl;
+	if (nlr != NULL)
+		nlr->parent = n;
+}
+
+
+/*
  * Add a new hilite to a hilite list.
  */
 	static void
 add_hilite(anchor, hl)
-	struct hilite *anchor;
+	struct hilite_tree *anchor;
 	struct hilite *hl;
 {
-	struct hilite *ihl;
+	struct hilite_node *p, *n, *u;
 
+	/* Ignore empty ranges. */
+	if (hl->hl_startpos >= hl->hl_endpos)
+		return;
+
+	p = anchor->root;
+
+	/* Inserting the very first node is trivial. */
+	if (p == NULL)
+	{
+		n = hlist_getnode(anchor);
+		n->r = *hl;
+		anchor->root = n;
+		anchor->lookaside = n;
+		return;
+	}
+
 	/*
-	 * Hilites are sorted in the list; find where new one belongs.
-	 * Insert new one after ihl.
+	 * Find our insertion point. If we come across any overlapping
+	 * or adjoining existing ranges, shrink our range and discard
+	 * if it become empty.
 	 */
-	for (ihl = anchor;  ihl->hl_next != NULL;  ihl = ihl->hl_next)
+	for (;;)
 	{
-		if (ihl->hl_next->hl_startpos > hl->hl_startpos)
+		if (hl->hl_startpos < p->r.hl_startpos)
+		{
+			if (hl->hl_endpos > p->r.hl_startpos)
+				hl->hl_endpos = p->r.hl_startpos;
+			if (p->left != NULL)
+			{
+				p = p->left;
+				continue;
+			}
 			break;
+		}
+		if (hl->hl_startpos < p->r.hl_endpos) {
+			hl->hl_startpos = p->r.hl_endpos;
+			if (hl->hl_startpos >= hl->hl_endpos)
+				return;
+		}
+		if (p->right != NULL)
+		{
+			p = p->right;
+			continue;
+		}
+		break;
 	}
 
 	/*
-	 * Truncate hilite so it doesn't overlap any existing ones
-	 * above and below it.
+	 * Now we're at the right leaf, again check for contiguous ranges
+	 * and extend the existing node if possible to avoid the
+	 * insertion. Otherwise insert a new node at the leaf.
 	 */
-	if (ihl != anchor)
-		hl->hl_startpos = MAXPOS(hl->hl_startpos, ihl->hl_endpos);
-	if (ihl->hl_next != NULL)
-		hl->hl_endpos = MINPOS(hl->hl_endpos, ihl->hl_next->hl_startpos);
-	if (hl->hl_startpos >= hl->hl_endpos)
+	if (hl->hl_startpos < p->r.hl_startpos) {
+		if (hl->hl_endpos == p->r.hl_startpos)
+		{
+			p->r.hl_startpos = hl->hl_startpos;
+			return;
+		}
+		if (p->prev != NULL && p->prev->r.hl_endpos == hl->hl_startpos)
+		{
+			p->prev->r.hl_endpos = hl->hl_endpos;
+			return;
+		}
+
+		p->left = n = hlist_getnode(anchor);
+		n->next = p;
+		if (p->prev != NULL)
+		{
+			n->prev = p->prev;
+			p->prev->next = n;
+		}
+		p->prev = n;
+	} else {
+		if (p->r.hl_endpos == hl->hl_startpos)
+		{
+			p->r.hl_endpos = hl->hl_endpos;
+			return;
+		}
+		if (p->next != NULL && hl->hl_endpos == p->next->r.hl_startpos) {
+			p->next->r.hl_startpos = hl->hl_startpos;
+			return;
+		}
+
+		p->right = n = hlist_getnode(anchor);
+		n->prev = p;
+		if (p->next != NULL)
+		{
+			n->next = p->next;
+			p->next->prev = n;
+		}
+		p->next = n;
+	}
+	n->parent = p;
+	n->red = 1;
+	n->r = *hl;
+
+	/*
+	 * The tree is in the correct order and covers the right ranges
+	 * now, but may have become unbalanced. Rebalance it using the
+	 * standard red-black tree constraints and operations.
+	 */
+	for (;;)
 	{
+		/* case 1 - current is root, root is always black */
+		if (n->parent == NULL)
+		{
+			n->red = 0;
+			break;
+		}
+
+		/* case 2 - parent is black, we can always be red */
+		if (!n->parent->red)
+			break;
+
 		/*
-		 * Hilite was truncated out of existence.
+		 * constraint: because the root must be black, if our
+		 * parent is red it cannot be the root therefore we must
+		 * have a grandparent
 		 */
-		free(hl);
-		return;
+
+		/*
+		 * case 3 - parent and uncle are red, repaint them black,
+		 * the grandparent red, and start again at the grandparent.
+		 */
+		u = n->parent->parent->left;
+		if (n->parent == u) 
+			u = n->parent->parent->right;
+		if (u != NULL && u->red)
+		{
+			n->parent->red = 0;
+			u->red = 0;
+			n = n->parent->parent;
+			n->red = 1;
+			continue;
+		}
+
+		/*
+		 * case 4 - parent is red but uncle is black, parent and
+		 * grandparent on opposite sides. We need to start
+		 * changing the structure now. This and case 5 will shorten
+		 * our branch and lengthen the sibling, between them
+		 * restoring balance.
+		 */
+		if (n == n->parent->right &&
+		    n->parent == n->parent->parent->left)
+		{
+			hlist_rotate_left(anchor, n->parent);
+			n = n->left;
+		} else if (n == n->parent->left &&
+			   n->parent == n->parent->parent->right)
+		{
+			hlist_rotate_right(anchor, n->parent);
+			n = n->right;
+		}
+
+		/*
+		 * case 5 - parent is red but uncle is black, parent and
+		 * grandparent on same side
+		 */
+		n->parent->red = 0;
+		n->parent->parent->red = 1;
+		if (n == n->parent->left)
+			hlist_rotate_right(anchor, n->parent->parent);
+		else
+			hlist_rotate_left(anchor, n->parent->parent);
+		break;
 	}
-	hl->hl_next = ihl->hl_next;
-	ihl->hl_next = hl;
 }
 
 /*
@@ -496,12 +948,11 @@
 	int end_index;
 	int *chpos;
 {
-	struct hilite *hl;
+	struct hilite hl;
 	int i;
 
 	/* Start the first hilite. */
-	hl = (struct hilite *) ecalloc(1, sizeof(struct hilite));
-	hl->hl_startpos = linepos + chpos[start_index];
+	hl.hl_startpos = linepos + chpos[start_index];
 
 	/*
 	 * Step through the displayed chars.
@@ -515,13 +966,12 @@
 	{
 		if (chpos[i] != chpos[i-1] + 1 || i == end_index)
 		{
-			hl->hl_endpos = linepos + chpos[i-1] + 1;
-			add_hilite(&hilite_anchor, hl);
+			hl.hl_endpos = linepos + chpos[i-1] + 1;
+			add_hilite(&hilite_anchor, &hl);
 			/* Start new hilite unless this is the last char. */
 			if (i < end_index)
 			{
-				hl = (struct hilite *) ecalloc(1, sizeof(struct hilite));
-				hl->hl_startpos = linepos + chpos[i];
+				hl.hl_startpos = linepos + chpos[i];
 			}
 		}
 	}
@@ -545,8 +995,6 @@
 	char *searchp;
 	char *line_end = line + line_len;
 
-	if (sp == NULL || ep == NULL)
-		return;
 	/*
 	 * sp and ep delimit the first match in the line.
 	 * Mark the corresponding file positions, then
@@ -559,6 +1007,8 @@
 	 */
 	searchp = line;
 	do {
+		if (sp == NULL || ep == NULL)
+			return;
 		create_hilites(linepos, sp-line, ep-line, chpos);
 		/*
 		 * If we matched more than zero characters,
@@ -576,27 +1026,6 @@
 }
 #endif
 
-/*
- * Change the caseless-ness of searches.  
- * Updates the internal search state to reflect a change in the -i flag.
- */
-	public void
-chg_caseless()
-{
-	if (!is_ucase_pattern)
-		/*
-		 * Pattern did not have uppercase.
-		 * Just set the search caselessness to the global caselessness.
-		 */
-		is_caseless = caseless;
-	else
-		/*
-		 * Pattern did have uppercase.
-		 * Discard the pattern; we can't change search caselessness now.
-		 */
-		clear_pattern(&search_info);
-}
-
 #if HILITE_SEARCH
 /*
  * Find matching text which is currently on screen and highlight it.
@@ -606,7 +1035,7 @@
 {
 	struct scrpos scrpos;
 
-	get_scrpos(&scrpos);
+	get_scrpos(&scrpos, TOP);
 	if (scrpos.pos == NULL_POSITION)
 		return;
 	prep_hilite(scrpos.pos, position(BOTTOM_PLUS_ONE), -1);
@@ -641,7 +1070,7 @@
 	int search_type;
 {
 	POSITION pos;
-	int linenum;
+	int sindex;
 
 	if (empty_screen())
 	{
@@ -664,7 +1093,7 @@
 				pos = ch_length();
 			}
 		}
-		linenum = 0;
+		sindex = 0;
 	} else 
 	{
 		int add_one = 0;
@@ -675,9 +1104,9 @@
 			 * Search does not include current screen.
 			 */
 			if (search_type & SRCH_FORW)
-				linenum = BOTTOM_PLUS_ONE;
+				sindex = sc_height-1; /* BOTTOM_PLUS_ONE */
 			else
-				linenum = TOP;
+				sindex = 0; /* TOP */
 		} else if (how_search == OPT_ONPLUS && !(search_type & SRCH_AFTER_TARGET))
 		{
 			/*
@@ -684,9 +1113,9 @@
 			 * Search includes all of displayed screen.
 			 */
 			if (search_type & SRCH_FORW)
-				linenum = TOP;
+				sindex = 0; /* TOP */
 			else
-				linenum = BOTTOM_PLUS_ONE;
+				sindex = sc_height-1; /* BOTTOM_PLUS_ONE */
 		} else 
 		{
 			/*
@@ -694,12 +1123,11 @@
 			 * It starts at the jump target (if searching backwards),
 			 * or at the jump target plus one (if forwards).
 			 */
-			linenum = jump_sline;
+			sindex = sindex_from_sline(jump_sline);
 			if (search_type & SRCH_FORW) 
-			    add_one = 1;
+				add_one = 1;
 		}
-		linenum = adjsline(linenum);
-		pos = position(linenum);
+		pos = position(sindex);
 		if (add_one)
 			pos = forw_raw_line(pos, (char **)NULL, (int *)NULL);
 	}
@@ -709,20 +1137,20 @@
 	 */
 	if (search_type & SRCH_FORW) 
 	{
-	    while (pos == NULL_POSITION)
-	    {
-	        if (++linenum >= sc_height)
-	            break;
-	        pos = position(linenum);
-	    }
+		while (pos == NULL_POSITION)
+		{
+			if (++sindex >= sc_height)
+				break;
+			pos = position(sindex);
+		}
 	} else 
 	{
-	    while (pos == NULL_POSITION)
-	    {
-	        if (--linenum < 0)
-	            break;
-	        pos = position(linenum);
-	    }
+		while (pos == NULL_POSITION)
+		{
+			if (--sindex < 0)
+				break;
+			pos = position(sindex);
+		}
 	}
 	return (pos);
 }
@@ -842,16 +1270,21 @@
 		 * Check to see if the line matches the filter pattern.
 		 * If so, add an entry to the filter list.
 		 */
-		if ((search_type & SRCH_FIND_ALL) && prev_pattern(&filter_info)) {
+		if (((search_type & SRCH_FIND_ALL) ||
+		     prep_startpos == NULL_POSITION ||
+		     linepos < prep_startpos || linepos >= prep_endpos) &&
+		    prev_pattern(&filter_info)) {
 			int line_filter = match_pattern(info_compiled(&filter_info), filter_info.text,
 				cline, line_len, &sp, &ep, 0, filter_info.search_type);
 			if (line_filter)
 			{
-				struct hilite *hl = (struct hilite *)
-					ecalloc(1, sizeof(struct hilite));
-				hl->hl_startpos = linepos;
-				hl->hl_endpos = pos;
-				add_hilite(&filter_anchor, hl);
+				struct hilite hl;
+				hl.hl_startpos = linepos;
+				hl.hl_endpos = pos;
+				add_hilite(&filter_anchor, &hl);
+				free(cline);
+				free(chpos);
+				continue;
 			}
 		}
 #endif
@@ -940,6 +1373,30 @@
 }
 
 /*
+ * Change the caseless-ness of searches.  
+ * Updates the internal search state to reflect a change in the -i flag.
+ */
+	public void
+chg_caseless()
+{
+	if (!is_ucase_pattern)
+		/*
+		 * Pattern did not have uppercase.
+		 * Just set the search caselessness to the global caselessness.
+		 */
+		is_caseless = caseless;
+	else
+	{
+		/*
+		 * Pattern did have uppercase.
+		 * Regenerate the pattern using the new state.
+		 */
+		clear_pattern(&search_info);
+		hist_pattern(search_info.search_type);
+	}
+}
+
+/*
  * Search for the n-th occurrence of a specified pattern, 
  * either forward or backward.
  * Return the number of matches not yet found in this file
@@ -974,7 +1431,7 @@
 			return -1;
 		}
 #if HILITE_SEARCH
-		if (hilite_search == OPT_ON)
+		if (hilite_search == OPT_ON || status_col)
 		{
 			/*
 			 * Erase the highlights currently on screen.
@@ -1001,7 +1458,7 @@
 		if (set_pattern(&search_info, pattern, search_type) < 0)
 			return (-1);
 #if HILITE_SEARCH
-		if (hilite_search)
+		if (hilite_search || status_col)
 		{
 			/*
 			 * Erase the highlights currently on screen.
@@ -1011,7 +1468,7 @@
 			hide_hilite = 0;
 			clr_hilite();
 		}
-		if (hilite_search == OPT_ONPLUS)
+		if (hilite_search == OPT_ONPLUS || status_col)
 		{
 			/*
 			 * Highlight any matches currently on screen,
@@ -1033,7 +1490,8 @@
 		 */
 		if (search_type & SRCH_PAST_EOF)
 			return (n);
-		/* repaint(); -- why was this here? */
+		if (hilite_search == OPT_ON || status_col)
+			repaint_hilite(1);
 		error("Nothing to search", NULL_PARG);
 		return (-1);
 	}
@@ -1046,7 +1504,7 @@
 		 * Search was unsuccessful.
 		 */
 #if HILITE_SEARCH
-		if (hilite_search == OPT_ON && n > 0)
+		if ((hilite_search == OPT_ON || status_col) && n > 0)
 			/*
 			 * Redisplay old hilites.
 			 */
@@ -1064,7 +1522,7 @@
 	}
 
 #if HILITE_SEARCH
-	if (hilite_search == OPT_ON)
+	if (hilite_search == OPT_ON || status_col)
 		/*
 		 * Display new hilites in the matching line.
 		 */
@@ -1108,6 +1566,12 @@
 		return;
 
 	/*
+	 * Make sure our prep region always starts at the beginning of
+	 * a line. (search_range takes care of the end boundary below.)
+	 */
+	spos = back_raw_line(spos+1, (char **)NULL, (int *)NULL);
+
+	/*
 	 * If we're limited to a max number of lines, figure out the
 	 * file position we should stop at.
 	 */
@@ -1199,12 +1663,48 @@
 	{
 		int search_type = SRCH_FORW | SRCH_FIND_ALL;
 		search_type |= (search_info.search_type & SRCH_NO_REGEX);
-		result = search_range(spos, epos, search_type, 0,
-				maxlines, (POSITION*)NULL, &new_epos);
-		if (result < 0)
-			return;
-		if (prep_endpos == NULL_POSITION || new_epos > prep_endpos)
-			nprep_endpos = new_epos;
+		for (;;) 
+		{
+			result = search_range(spos, epos, search_type, 0, maxlines, (POSITION*)NULL, &new_epos);
+			if (result < 0)
+				return;
+			if (prep_endpos == NULL_POSITION || new_epos > prep_endpos)
+				nprep_endpos = new_epos;
+
+			/*
+			 * Check both ends of the resulting prep region to
+			 * make sure they're not filtered. If they are,
+			 * keep going at least one more line until we find
+			 * something that isn't filtered, or hit the end.
+			 */
+			if (prep_endpos == NULL_POSITION || nprep_endpos > prep_endpos)
+			{
+				if (new_epos >= nprep_endpos && is_filtered(new_epos-1))
+				{
+					spos = nprep_endpos;
+					epos = forw_raw_line(nprep_endpos, (char **)NULL, (int *)NULL);
+					if (epos == NULL_POSITION)
+						break;
+					maxlines = 1;
+					continue;
+				}
+			}
+
+			if (prep_startpos == NULL_POSITION || nprep_startpos < prep_startpos)
+			{
+				if (nprep_startpos > 0 && is_filtered(nprep_startpos))
+				{
+					epos = nprep_startpos;
+					spos = back_raw_line(nprep_startpos, (char **)NULL, (int *)NULL);
+					if (spos == NULL_POSITION)
+						break;
+					nprep_startpos = spos;
+					maxlines = 1;
+					continue;
+				}
+			}
+			break;
+		}
 	}
 	prep_startpos = nprep_startpos;
 	prep_endpos = nprep_endpos;
@@ -1243,6 +1743,8 @@
  * This function is called by the V8 regcomp to report 
  * errors in regular expressions.
  */
+public int reg_show_error = 1;
+
 	void 
 regerror(s) 
 	char *s; 
@@ -1249,6 +1751,8 @@
 {
 	PARG parg;
 
+	if (!reg_show_error)
+		return;
 	parg.p_string = s;
 	error("%s", &parg);
 }

Modified: vendor/less/dist/signal.c
===================================================================
--- vendor/less/dist/signal.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/signal.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -7,6 +7,7 @@
  * For more information, see the README file.
  */
 
+/* $FreeBSD: stable/10/contrib/less/signal.c 330571 2018-03-07 06:39:00Z delphij $ */
 
 /*
  * Routines dealing with signals.
@@ -33,6 +34,7 @@
 extern int wscroll;
 extern int reading;
 extern int quit_on_intr;
+extern int less_is_more;
 extern long jump_sline_fraction;
 
 /*
@@ -58,6 +60,8 @@
 	if (kbhit())
 		getkey();
 #endif
+	if (less_is_more)
+		quit(0);
 	if (reading)
 		intread(); /* May longjmp */
 }
@@ -78,22 +82,16 @@
 }
 #endif
 
+#undef SIG_LESSWINDOW
 #ifdef SIGWINCH
-/*
- * "Window" change handler
- */
-	/* ARGSUSED*/
-	public RETSIGTYPE
-winch(type)
-	int type;
-{
-	LSIGNAL(SIGWINCH, winch);
-	sigs |= S_WINCH;
-	if (reading)
-		intread();
-}
+#define SIG_LESSWINDOW SIGWINCH
 #else
 #ifdef SIGWIND
+#define SIG_LESSWINDOW SIGWIND
+#endif
+#endif
+
+#ifdef SIG_LESSWINDOW
 /*
  * "Window" change handler
  */
@@ -102,13 +100,12 @@
 winch(type)
 	int type;
 {
-	LSIGNAL(SIGWIND, winch);
+	LSIGNAL(SIG_LESSWINDOW, winch);
 	sigs |= S_WINCH;
 	if (reading)
 		intread();
 }
 #endif
-#endif
 
 #if MSDOS_COMPILER==WIN32C
 /*
@@ -133,6 +130,13 @@
 }
 #endif
 
+	static RETSIGTYPE
+terminate(type)
+	int type;
+{
+	quit(15);
+}
+
 /*
  * Set up the signal handlers.
  */
@@ -161,6 +165,9 @@
 #ifdef SIGQUIT
 		(void) LSIGNAL(SIGQUIT, SIG_IGN);
 #endif
+#ifdef SIGTERM
+		(void) LSIGNAL(SIGTERM, terminate);
+#endif
 	} else
 	{
 		/*
@@ -182,6 +189,9 @@
 #ifdef SIGQUIT
 		(void) LSIGNAL(SIGQUIT, SIG_DFL);
 #endif
+#ifdef SIGTERM
+		(void) LSIGNAL(SIGTERM, SIG_DFL);
+#endif
 	}
 }
 
@@ -192,7 +202,7 @@
 	public void
 psignals()
 {
-	register int tsignals;
+	int tsignals;
 
 	if ((tsignals = sigs) == 0)
 		return;

Modified: vendor/less/dist/tags.c
===================================================================
--- vendor/less/dist/tags.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/tags.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -14,7 +14,8 @@
 
 #if TAGS
 
-public char *tags = "tags";
+public char ztags[] = "tags";
+public char *tags = ztags;
 
 static int total;
 static int curseq;
@@ -21,6 +22,7 @@
 
 extern int linenums;
 extern int sigs;
+extern int ctldisp;
 
 enum tag_result {
 	TAG_FOUND,
@@ -62,8 +64,6 @@
 	struct tag *tl_first;
 	struct tag *tl_last;
 };
-#define TAG_END  ((struct tag *) &taglist)
-static struct taglist taglist = { TAG_END, TAG_END };
 struct tag {
 	struct tag *next, *prev; /* List links */
 	char *tag_file;		/* Source file containing the tag */
@@ -71,6 +71,8 @@
 	char *tag_pattern;	/* Pattern used to find the tag */
 	char tag_endline;	/* True if the pattern includes '$' */
 };
+#define TAG_END  ((struct tag *) &taglist)
+static struct taglist taglist = { TAG_END, TAG_END };
 static struct tag *curtag;
 
 #define TAG_INS(tp) \
@@ -89,7 +91,7 @@
 	public void
 cleantags()
 {
-	register struct tag *tp;
+	struct tag *tp;
 
 	/*
 	 * Delete any existing tag list.
@@ -99,6 +101,8 @@
 	while ((tp = taglist.tl_first) != TAG_END)
 	{
 		TAG_RM(tp);
+		free(tp->tag_file);
+		free(tp->tag_pattern);
 		free(tp);
 	}
 	curtag = NULL;
@@ -116,7 +120,7 @@
 	char *pattern;
 	int endline;
 {
-	register struct tag *tp;
+	struct tag *tp;
 
 	tp = (struct tag *) ecalloc(sizeof(struct tag), 1);
 	tp->tag_file = (char *) ecalloc(strlen(file) + 1, sizeof(char));
@@ -169,7 +173,7 @@
  */
 	public void
 findtag(tag)
-	register char *tag;
+	char *tag;
 {
 	int type = gettagtype();
 	enum tag_result result;
@@ -265,11 +269,11 @@
  */
 	static enum tag_result
 findctag(tag)
-	register char *tag;
+	char *tag;
 {
 	char *p;
-	register FILE *f;
-	register int taglen;
+	FILE *f;
+	int taglen;
 	LINENUM taglinenum;
 	char *tagfile;
 	char *tagpattern;
@@ -287,7 +291,7 @@
 
 	cleantags();
 	total = 0;
-	taglen = strlen(tag);
+	taglen = (int) strlen(tag);
 
 	/*
 	 * Search the tags file for the desired tag.
@@ -383,6 +387,26 @@
 	return (edit(curtag->tag_file));
 }
 
+	static int
+curtag_match(char const *line, POSITION linepos)
+{
+	/*
+	 * Test the line to see if we have a match.
+	 * Use strncmp because the pattern may be
+	 * truncated (in the tags file) if it is too long.
+	 * If tagendline is set, make sure we match all
+	 * the way to end of line (no extra chars after the match).
+	 */
+	int len = (int) strlen(curtag->tag_pattern);
+	if (strncmp(curtag->tag_pattern, line, len) == 0 &&
+	    (!curtag->tag_endline || line[len] == '\0' || line[len] == '\r'))
+	{
+		curtag->tag_linenum = find_linenum(linepos);
+		return 1;
+	}
+	return 0;
+}
+
 /*
  * Search for a tag.
  * This is a stripped-down version of search().
@@ -397,13 +421,14 @@
 {
 	POSITION pos, linepos;
 	LINENUM linenum;
-	int len;
+	int line_len;
 	char *line;
+	int found;
 
 	pos = ch_zero();
 	linenum = find_linenum(pos);
 
-	for (;;)
+	for (found = 0; !found;)
 	{
 		/*
 		 * Get lines until we find a matching one or 
@@ -417,7 +442,7 @@
 		 * starting position of that line in linepos.
 		 */
 		linepos = pos;
-		pos = forw_raw_line(pos, &line, (int *)NULL);
+		pos = forw_raw_line(pos, &line, &line_len);
 		if (linenum != 0)
 			linenum++;
 
@@ -438,19 +463,21 @@
 		if (linenums)
 			add_lnum(linenum, pos);
 
-		/*
-		 * Test the line to see if we have a match.
-		 * Use strncmp because the pattern may be
-		 * truncated (in the tags file) if it is too long.
-		 * If tagendline is set, make sure we match all
-		 * the way to end of line (no extra chars after the match).
-		 */
-		len = strlen(curtag->tag_pattern);
-		if (strncmp(curtag->tag_pattern, line, len) == 0 &&
-		    (!curtag->tag_endline || line[len] == '\0' || line[len] == '\r'))
+		if (ctldisp != OPT_ONPLUS)
 		{
-			curtag->tag_linenum = find_linenum(linepos);
-			break;
+			if (curtag_match(line, linepos))
+				found = 1;
+		} else
+		{
+			int cvt_ops = CVT_ANSI;
+			int cvt_len = cvt_length(line_len, cvt_ops);
+			int *chpos = cvt_alloc_chpos(cvt_len);
+			char *cline = (char *) ecalloc(1, cvt_len);
+			cvt_text(cline, line, chpos, &line_len, cvt_ops);
+			if (curtag_match(cline, linepos))
+				found = 1;
+			free(chpos);
+			free(cline);
 		}
 	}
 
@@ -491,7 +518,7 @@
 	{
 		fp = stdin;
 		/* Set tag default because we cannot read stdin again. */
-		tags = "tags";
+		tags = ztags;
 	} else
 	{
 #if !HAVE_POPEN
@@ -551,7 +578,7 @@
 #endif
 				return TAG_INTR;
 			}
-			len = strlen(buf);
+			len = (int) strlen(buf);
 			if (len > 0 && buf[len-1] == '\n')
 				buf[len-1] = '\0';
 			else

Modified: vendor/less/dist/ttyin.c
===================================================================
--- vendor/less/dist/ttyin.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/ttyin.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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,7 +120,11 @@
 		if (c == '\003')
 			return (READ_INTR);
 #else
-		result = iread(tty, &c, sizeof(char));
+		{
+			unsigned char uc;
+			result = iread(tty, &uc, sizeof(char));
+			c = (char) uc;
+		}
 		if (result == READ_INTR)
 			return (READ_INTR);
 		if (result < 0)
@@ -135,8 +139,8 @@
 #if 0 /* allow entering arbitrary hex chars for testing */
 		/* ctrl-A followed by two hex chars makes a byte */
 	{
-		int hex_in = 0;
-		int hex_value = 0;
+		static int hex_in = 0;
+		static int hex_value = 0;
 		if (c == CONTROL('A'))
 		{
 			hex_in = 2;

Added: vendor/less/dist/ubin.uni
===================================================================
--- vendor/less/dist/ubin.uni	                        (rev 0)
+++ vendor/less/dist/ubin.uni	2018-07-06 12:43:09 UTC (rev 11360)
@@ -0,0 +1,17 @@
+/* Generated by "./mkutable -f2 Cc Cs Co Zl Zp -- unicode/UnicodeData.txt" on Tue Jul 25 09:04:35 PDT 2017 */
+	{ 0x0000, 0x0007 }, /* Cc */
+	{ 0x000b, 0x000b }, /* Cc */
+	{ 0x000e, 0x001f }, /* Cc */
+	{ 0x007f, 0x009f }, /* Cc */
+	{ 0x2028, 0x2028 }, /* Zl */
+	{ 0x2029, 0x2029 }, /* Zp */
+	{ 0xd800, 0xd800 }, /* Cs */
+	{ 0xdb7f, 0xdb80 }, /* Cs */
+	{ 0xdbff, 0xdc00 }, /* Cs */
+	{ 0xdfff, 0xdfff }, /* Cs */
+	{ 0xe000, 0xe000 }, /* Co */
+	{ 0xf8ff, 0xf8ff }, /* Co */
+	{ 0xf0000, 0xf0000 }, /* Co */
+	{ 0xffffd, 0xffffd }, /* Co */
+	{ 0x100000, 0x100000 }, /* Co */
+	{ 0x10fffd, 0x10fffd }, /* Co */

Modified: vendor/less/dist/version.c
===================================================================
--- vendor/less/dist/version.c	2018-07-06 12:41:27 UTC (rev 11359)
+++ vendor/less/dist/version.c	2018-07-06 12:43:09 UTC (rev 11360)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2012  Mark Nudelman
+ * Copyright (C) 1984-2017  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.
@@ -762,6 +762,97 @@
 v456  11/8/12   Fix option string incompatibility.
 v457  12/8/12   Use new option string syntax only after --use-backslash.
 v458  4/4/13    Fix display bug in using up/down in cmd buffer.
+-----------------------------------------------------------------
+v459  5/6/13    Fix ++ bug.
+v460  6/19/13   Automate construction of Unicode tables.
+v461  6/21/13   Collapse multiple CRs before LF.
+v462  11/26/13  Don't overwrite history file, just append to it.
+v463  7/13/14   Misc. fixes.
+v464  7/19/14   Fix bugs & improve performance in & filtering
+                (thanks to John Sullivan).
+v465  8/9/14    More fixes from John Sullivan.
+v466  8/23/14   Add colon to LESSANSIMIDCHARS.
+v467  9/18/14   Misc. fixes.
+v468  9/18/14   Fix typo
+v469  10/2/14   Allow extra string in command to append to a multichar
+                cmd without executing it; fix bug using GNU regex.
+v470  10/5/14   Fix some compiler warnings.
+v471  12/14/14  Fix unget issues with prompt. Allow disabling history
+                when compiled value of LESSHISTFILE = "-".
+v473  12/19/14  Fix prompt bug with stdin and -^P in lesskey extra string.
+v474  1/30/15   Fix bug in backwards search with match on bottom line.
+                Make follow mode reopen file if file shrinks.
+v475  3/2/15    Fix possible buffer overrun with invalid UTF-8; 
+                fix bug when compiled with no regex; fix non-match search.
+v476  5/3/15    Update man pages.
+v477  5/19/15   Fix off-by-one in jump_forw_buffered;
+                don't add FAKE_* files to cmd history.
+v478  5/21/15   Fix nonportable pointer usage in hilite tree.
+v479  7/6/15    Allow %% escapes in LESSOPEN variable.
+v480  7/24/15   Fix bug in no-regex searches; support MSVC v1900.
+v481  8/20/15   Fix broken -g option.
+-----------------------------------------------------------------
+v482  2/25/16   Update Unicode database to "2015-06-16, 20:24:00 GMT [KW]".
+v483  2/27/16   Regenerate hilite when change search caselessness.
+                (Thanks to Jason Hood)
+                Fix bug when terminal has no "cm". (Thanks to Noel Cragg)
+v484  9/20/16   Update to Unicode 9.0.0 database.
+v485  10/21/16  Fix "nothing to search" bug when top/bottom line is empty;
+                Display line numbers in bold. (thanks to Jason Hood);
+                Fix incorrect display when entering double-width chars in 
+                search string.
+v486  10/22/16  New commands ESC-{ and ESC-} to shift to start/end of 
+                displayed lines; new option -Da in Windows version to 
+                enable SGR mode (thanks to Jason Hood).
+v487  10/23/16  configure --help formatting.
+-----------------------------------------------------------------
+v488  2/23/17   Fix memory leaks in search (thanks to John Brooks).
+v489  3/30/17   Make -F not do init/deinit if file fits on one screen
+                (thanks to Jindrich Novy).
+v490  4/5/17    Switch to ANSI prototypes in funcs.h; remove "register".
+v491  4/7/17    Fix signed char bug.
+v492  4/21/17   Handle SIGTERM.
+v493  6/22/17   Fix bug initializing charset in MSDOS build.
+v494  6/26/17   Update Unicode tables; make Cf chars composing not binary.
+v495  7/3/17    Improve binary file detection (thanks to Bela Lubkin);
+                do -R filter when matching tags (thanks to Matthew Malcomson).
+v496  7/5/17    Add LESSRSCROLL marker.
+v497  7/5/17    Sync.
+v498  7/7/17    Fix early truncation of text if last char is double-width.
+v499  7/10/17   Misc fixes.
+v500  7/11/17   Fix bug where certain env variables couldn't be set in lesskey.
+v501  7/12/17   Make sure rscroll char is standout by default.
+v502  7/13/17   Control rscroll char via command line option not env variable.
+v503  7/13/17   Switch to git.
+v504  7/13/17   Call opt_rscroll at startup; change mkhelp.c to mkhelp.pl.
+v505  7/17/17   Add M and ESC-M commands; 
+                fix buffer handling with stdin and LESSOPEN.
+v506  7/17/17   On Windows, convert UTF-8 to multibyte if console is not UTF-8;
+                handle extended chars on input (thanks to Jason Hood).
+v507  7/18/17   Fix some bugs handling filenames containing shell metachars.
+v508  7/19/17   Fix bugs when using LESSOPEN to read stdin.
+v509  7/19/17   Fix another stdin bug.
+v510  7/20/17   Fix bug in determining when to reopen a file.
+v511  7/25/17   Fix bugs in recent MSDOS changes (thanks to Jason Hood).
+v512  7/26/17   Fix MSDOS build.
+v513  7/26/17   Fix switch to normal attr at end of line with -R and rscroll.
+v514  7/27/17   Fix bug in fcomplete when pattern does not match a file.
+v515  7/28/17   Allow 'u' in -D option on Windows.
+v516  7/29/17   Fix bug using LESSOPEN with filename containing metachars.
+v517  7/30/17   Status column shows matches even if hiliting is disabled via -G.
+v518  8/1/17    Use underline in sgr mode in MSDOS (thanks to Jason Hood).
+v519  8/10/17   Fix rscroll bug when last char of line starts coloration.
+v520  9/3/17    Fix compiler warning.
+v521  10/20/17  Fix binary file warning in UTF-8 files with SGI sequences.
+v522  10/20/17  Handle keypad ENTER key properly.
+v523  10/23/17  Cleanup.
+v524  10/24/17  Fix getcc bug.
+v525  10/24/17  Change M command to mark last displayed line.
+v526  10/25/17  Fix search hilite bug introduced in v517.
+v527  10/30/17  Fix search hilite bug on last page with -a.
+v528  11/3/17   Make second ESC-u clear status column.
+v529  11/12/17  Display Unicode formatting chars in hex if -U is set.
+v530  12/2/17   Minor doc change and add missing VOID_PARAM.
 */
 
-char version[] = "458";
+char version[] = "530";

Added: vendor/less/dist/wide.uni
===================================================================
--- vendor/less/dist/wide.uni	                        (rev 0)
+++ vendor/less/dist/wide.uni	2018-07-06 12:43:09 UTC (rev 11360)
@@ -0,0 +1,108 @@
+/* Generated by "./mkutable -f1 W F -- unicode/EastAsianWidth.txt" on Tue Jul 25 09:04:35 PDT 2017 */
+	{ 0x1100, 0x115f }, /* W */
+	{ 0x231a, 0x231b }, /* W */
+	{ 0x2329, 0x232a }, /* W */
+	{ 0x23e9, 0x23ec }, /* W */
+	{ 0x23f0, 0x23f0 }, /* W */
+	{ 0x23f3, 0x23f3 }, /* W */
+	{ 0x25fd, 0x25fe }, /* W */
+	{ 0x2614, 0x2615 }, /* W */
+	{ 0x2648, 0x2653 }, /* W */
+	{ 0x267f, 0x267f }, /* W */
+	{ 0x2693, 0x2693 }, /* W */
+	{ 0x26a1, 0x26a1 }, /* W */
+	{ 0x26aa, 0x26ab }, /* W */
+	{ 0x26bd, 0x26be }, /* W */
+	{ 0x26c4, 0x26c5 }, /* W */
+	{ 0x26ce, 0x26ce }, /* W */
+	{ 0x26d4, 0x26d4 }, /* W */
+	{ 0x26ea, 0x26ea }, /* W */
+	{ 0x26f2, 0x26f3 }, /* W */
+	{ 0x26f5, 0x26f5 }, /* W */
+	{ 0x26fa, 0x26fa }, /* W */
+	{ 0x26fd, 0x26fd }, /* W */
+	{ 0x2705, 0x2705 }, /* W */
+	{ 0x270a, 0x270b }, /* W */
+	{ 0x2728, 0x2728 }, /* W */
+	{ 0x274c, 0x274c }, /* W */
+	{ 0x274e, 0x274e }, /* W */
+	{ 0x2753, 0x2755 }, /* W */
+	{ 0x2757, 0x2757 }, /* W */
+	{ 0x2795, 0x2797 }, /* W */
+	{ 0x27b0, 0x27b0 }, /* W */
+	{ 0x27bf, 0x27bf }, /* W */
+	{ 0x2b1b, 0x2b1c }, /* W */
+	{ 0x2b50, 0x2b50 }, /* W */
+	{ 0x2b55, 0x2b55 }, /* W */
+	{ 0x2e80, 0x2e99 }, /* W */
+	{ 0x2e9b, 0x2ef3 }, /* W */
+	{ 0x2f00, 0x2fd5 }, /* W */
+	{ 0x2ff0, 0x2ffb }, /* W */
+	{ 0x3000, 0x3000 }, /* F */
+	{ 0x3001, 0x303e }, /* W */
+	{ 0x3041, 0x3096 }, /* W */
+	{ 0x3099, 0x30ff }, /* W */
+	{ 0x3105, 0x312e }, /* W */
+	{ 0x3131, 0x318e }, /* W */
+	{ 0x3190, 0x31ba }, /* W */
+	{ 0x31c0, 0x31e3 }, /* W */
+	{ 0x31f0, 0x321e }, /* W */
+	{ 0x3220, 0x3247 }, /* W */
+	{ 0x3250, 0x32fe }, /* W */
+	{ 0x3300, 0x4dbf }, /* W */
+	{ 0x4e00, 0xa48c }, /* W */
+	{ 0xa490, 0xa4c6 }, /* W */
+	{ 0xa960, 0xa97c }, /* W */
+	{ 0xac00, 0xd7a3 }, /* W */
+	{ 0xf900, 0xfaff }, /* W */
+	{ 0xfe10, 0xfe19 }, /* W */
+	{ 0xfe30, 0xfe52 }, /* W */
+	{ 0xfe54, 0xfe66 }, /* W */
+	{ 0xfe68, 0xfe6b }, /* W */
+	{ 0xff01, 0xff60 }, /* F */
+	{ 0xffe0, 0xffe6 }, /* F */
+	{ 0x16fe0, 0x16fe1 }, /* W */
+	{ 0x17000, 0x187ec }, /* W */
+	{ 0x18800, 0x18af2 }, /* W */
+	{ 0x1b000, 0x1b11e }, /* W */
+	{ 0x1b170, 0x1b2fb }, /* W */
+	{ 0x1f004, 0x1f004 }, /* W */
+	{ 0x1f0cf, 0x1f0cf }, /* W */
+	{ 0x1f18e, 0x1f18e }, /* W */
+	{ 0x1f191, 0x1f19a }, /* W */
+	{ 0x1f200, 0x1f202 }, /* W */
+	{ 0x1f210, 0x1f23b }, /* W */
+	{ 0x1f240, 0x1f248 }, /* W */
+	{ 0x1f250, 0x1f251 }, /* W */
+	{ 0x1f260, 0x1f265 }, /* W */
+	{ 0x1f300, 0x1f320 }, /* W */
+	{ 0x1f32d, 0x1f335 }, /* W */
+	{ 0x1f337, 0x1f37c }, /* W */
+	{ 0x1f37e, 0x1f393 }, /* W */
+	{ 0x1f3a0, 0x1f3ca }, /* W */
+	{ 0x1f3cf, 0x1f3d3 }, /* W */
+	{ 0x1f3e0, 0x1f3f0 }, /* W */
+	{ 0x1f3f4, 0x1f3f4 }, /* W */
+	{ 0x1f3f8, 0x1f43e }, /* W */
+	{ 0x1f440, 0x1f440 }, /* W */
+	{ 0x1f442, 0x1f4fc }, /* W */
+	{ 0x1f4ff, 0x1f53d }, /* W */
+	{ 0x1f54b, 0x1f54e }, /* W */
+	{ 0x1f550, 0x1f567 }, /* W */
+	{ 0x1f57a, 0x1f57a }, /* W */
+	{ 0x1f595, 0x1f596 }, /* W */
+	{ 0x1f5a4, 0x1f5a4 }, /* W */
+	{ 0x1f5fb, 0x1f64f }, /* W */
+	{ 0x1f680, 0x1f6c5 }, /* W */
+	{ 0x1f6cc, 0x1f6cc }, /* W */
+	{ 0x1f6d0, 0x1f6d2 }, /* W */
+	{ 0x1f6eb, 0x1f6ec }, /* W */
+	{ 0x1f6f4, 0x1f6f8 }, /* W */
+	{ 0x1f910, 0x1f93e }, /* W */
+	{ 0x1f940, 0x1f94c }, /* W */
+	{ 0x1f950, 0x1f96b }, /* W */
+	{ 0x1f980, 0x1f997 }, /* W */
+	{ 0x1f9c0, 0x1f9c0 }, /* W */
+	{ 0x1f9d0, 0x1f9e6 }, /* W */
+	{ 0x20000, 0x2fffd }, /* W */
+	{ 0x30000, 0x3fffd }, /* W */



More information about the Midnightbsd-cvs mailing list