From 1e54e8719ad33f4245dfb99bd64c7d555a0f376c Mon Sep 17 00:00:00 2001 From: delphij Date: Wed, 7 Mar 2018 06:39:00 +0000 Subject: [PATCH] MFC r316339,317396,317829,326010,329554: less v530. Relnotes: yes git-svn-id: svn://svn.freebsd.org/base/stable/10@330571 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- contrib/less/LICENSE | 2 +- contrib/less/NEWS | 76 +++++ contrib/less/README | 5 +- contrib/less/brac.c | 10 +- contrib/less/ch.c | 49 ++- contrib/less/charset.c | 138 +++++---- contrib/less/charset.h | 2 +- contrib/less/cmd.h | 224 +++++++------- contrib/less/cmdbuf.c | 122 ++++---- contrib/less/command.c | 377 ++++++++++++++--------- contrib/less/compose.uni | 82 ++++- contrib/less/cvt.c | 6 +- contrib/less/decode.c | 68 +++-- contrib/less/edit.c | 265 ++++++++++------- contrib/less/filename.c | 142 ++++----- contrib/less/fmt.uni | 19 ++ contrib/less/forwback.c | 26 +- contrib/less/funcs.h | 608 +++++++++++++++++++------------------- contrib/less/help.c | 13 +- contrib/less/ifile.c | 67 ++++- contrib/less/input.c | 15 +- contrib/less/jump.c | 31 +- contrib/less/less.h | 20 +- contrib/less/less.hlp | 11 +- contrib/less/less.nro | 84 ++++-- contrib/less/lessecho.c | 2 +- contrib/less/lessecho.nro | 2 +- contrib/less/lesskey.c | 34 ++- contrib/less/lesskey.h | 2 +- contrib/less/lesskey.nro | 20 +- contrib/less/lglob.h | 2 +- contrib/less/line.c | 230 ++++++++++---- contrib/less/linenum.c | 22 +- contrib/less/lsystem.c | 12 +- contrib/less/main.c | 44 +-- contrib/less/mark.c | 58 +++- contrib/less/mkhelp.c | 68 ----- contrib/less/mkutable | 55 ++-- contrib/less/optfunc.c | 112 +++++-- contrib/less/option.c | 20 +- contrib/less/option.h | 4 +- contrib/less/opttbl.c | 23 +- contrib/less/os.c | 13 +- contrib/less/output.c | 183 ++++++++---- contrib/less/pattern.c | 144 ++++----- contrib/less/pattern.h | 28 +- contrib/less/pckeys.h | 2 +- contrib/less/position.c | 55 ++-- contrib/less/position.h | 2 +- contrib/less/prompt.c | 12 +- contrib/less/screen.c | 78 ++++- contrib/less/scrsize.c | 2 +- contrib/less/search.c | 135 +++++---- contrib/less/signal.c | 40 +-- contrib/less/tags.c | 74 +++-- contrib/less/ttyin.c | 12 +- contrib/less/ubin.uni | 23 +- contrib/less/version.c | 70 ++++- contrib/less/wide.uni | 187 +++++++----- usr.bin/less/defines.h | 7 +- 60 files changed, 2579 insertions(+), 1660 deletions(-) create mode 100644 contrib/less/fmt.uni delete mode 100644 contrib/less/mkhelp.c diff --git a/contrib/less/LICENSE b/contrib/less/LICENSE index 376b8c8be..832ca1b37 100644 --- a/contrib/less/LICENSE +++ b/contrib/less/LICENSE @@ -2,7 +2,7 @@ ------------ Less -Copyright (C) 1984-2015 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 diff --git a/contrib/less/NEWS b/contrib/less/NEWS index 43f124737..14997c253 100644 --- a/contrib/less/NEWS +++ b/contrib/less/NEWS @@ -9,6 +9,82 @@ To report bugs, suggestions or comments, send email to bug-less@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 diff --git a/contrib/less/README b/contrib/less/README index 10884310f..ea8ed232d 100644 --- a/contrib/less/README +++ b/contrib/less/README @@ -7,9 +7,9 @@ ************************************************************************** ************************************************************************** - Less, version 481 + Less, version 530 - This is the distribution of less, version 481, released 31 Aug 2015. + 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 @@ -23,6 +23,7 @@ Please report any problems to bug-less@gnu.org. See http://www.greenwoodsoftware.com/less for the latest info. + Source repository is at https://github.com/gwsw/less.git. ========================================================================= diff --git a/contrib/less/brac.c b/contrib/less/brac.c index 10a0843ca..44f240361 100644 --- a/contrib/less/brac.c +++ b/contrib/less/brac.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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)(); diff --git a/contrib/less/ch.c b/contrib/less/ch.c index da729c5de..47c1a3235 100644 --- a/contrib/less/ch.c +++ b/contrib/less/ch.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -146,11 +146,11 @@ static int ch_addbuf(); 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; @@ -419,8 +419,8 @@ end_logfile() 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; @@ -457,9 +457,9 @@ sync_logfile() 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) @@ -477,7 +477,7 @@ buffered(block) */ public int ch_seek(pos) - register POSITION pos; + POSITION pos; { BLOCKNUM new_block; POSITION len; @@ -544,8 +544,8 @@ ch_end_seek() public int ch_end_buffer_seek() { - register struct buf *bp; - register struct bufnode *bn; + struct buf *bp; + struct bufnode *bn; POSITION buf_pos; POSITION end_pos; @@ -572,8 +572,8 @@ ch_end_buffer_seek() 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. @@ -632,7 +632,7 @@ ch_tell() public int ch_forw_get() { - register int c; + int c; if (thisfile == NULL) return (EOI); @@ -695,7 +695,7 @@ ch_setbufspace(bufspace) public void ch_flush() { - register struct bufnode *bn; + struct bufnode *bn; if (thisfile == NULL) return; @@ -762,8 +762,8 @@ ch_flush() 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 @@ -787,7 +787,7 @@ ch_addbuf() static void init_hashtbl() { - register int h; + int h; for (h = 0; h < BUFHASH_SIZE; h++) { @@ -802,7 +802,7 @@ init_hashtbl() static void ch_delbufs() { - register struct bufnode *bn; + struct bufnode *bn; while (ch_bufhead != END_OF_CHAIN) { @@ -867,13 +867,12 @@ ch_init(f, flags) 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. @@ -898,7 +897,7 @@ ch_close() 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. diff --git a/contrib/less/charset.c b/contrib/less/charset.c index 4c62664e7..88978918e 100644 --- a/contrib/less/charset.c +++ b/contrib/less/charset.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 +#endif + +extern int bs_mode; + public int utf_mode = 0; /* @@ -64,6 +71,8 @@ struct cs_alias { 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 @@ public int binattr = AT_STANDOUT; 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 @@ ichardef(s) */ 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 @@ icharset(name, no_error) { 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 @@ icharset(name, no_error) static void ilocale() { - register int c; + int c; for (c = 0; c < (int) sizeof(chardef); c++) { @@ -249,16 +264,17 @@ ilocale() /* * 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 @@ setbinfmt(s, fmtvarptr, default_fmt) * 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,6 +319,14 @@ set_charset() { 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. */ @@ -352,6 +376,7 @@ set_charset() * rather than from predefined charset entry. */ ilocale(); +#else #if MSDOS_COMPILER /* * Default to "dos". @@ -381,10 +406,10 @@ init_charset() set_charset(); s = lgetenv("LESSBINFMT"); - setbinfmt(s, &binfmt, "*s<%02X>"); + setfmt(s, &binfmt, &binattr, "*s<%02X>"); s = lgetenv("LESSUTFBINFMT"); - setbinfmt(s, &utfbinfmt, ""); + setfmt(s, &utfbinfmt, &binattr, ""); } /* @@ -484,7 +509,7 @@ prutfchar(ch) */ public int utf_len(ch) - char ch; + unsigned char ch; { if ((ch & 0x80) == 0) return 1; @@ -506,17 +531,18 @@ utf_len(ch) * Does the parameter point to the lead byte of a well-formed UTF-8 character? */ public int -is_utf8_well_formed(s, slen) - 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) @@ -540,40 +566,25 @@ is_utf8_well_formed(s, slen) } /* - * Return number of invalid UTF-8 sequences found in a buffer. + * Skip bytes until a UTF-8 lead byte (11xxxxxx) or ASCII byte (0xxxxxxx) is found. */ - public int -utf_bin_count(data, len) - unsigned char *data; - int len; + public void +utf_skip_to_lead(pp, limit) + char **pp; + char *limit; { - int bin_count = 0; - while (len > 0) - { - if (is_utf8_well_formed(data, len)) - { - int clen = utf_len(*data); - data += clen; - len -= clen; - } else - { - /* Skip to next lead byte. */ - bin_count++; - do { - ++data; - --len; - } while (len > 0 && !IS_UTF8_LEAD(*data)); - } - } - return (bin_count); + 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])) { @@ -677,7 +688,7 @@ put_wchar(pp, ch) step_char(pp, dir, limit) char **pp; signed int dir; - char *limit; + constant char *limit; { LWCHAR ch; int len; @@ -687,16 +698,16 @@ step_char(pp, dir, limit) { /* 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); if (p + len > limit) { ch = 0; - p = limit; + p = (char *) limit; } else { ch = get_wchar(p); @@ -737,6 +748,10 @@ 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}, @@ -777,7 +792,8 @@ is_in_table(ch, table) is_composing_char(ch) LWCHAR ch; { - return is_in_table(ch, &compose_table); + return is_in_table(ch, &compose_table) || + (bs_mode != BS_CONTROL && is_in_table(ch, &fmt_table)); } /* @@ -787,7 +803,21 @@ is_composing_char(ch) is_ubin_char(ch) LWCHAR ch; { - return is_in_table(ch, &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; } /* diff --git a/contrib/less/charset.h b/contrib/less/charset.h index bb1e4376c..1e3f06910 100644 --- a/contrib/less/charset.h +++ b/contrib/less/charset.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/cmd.h b/contrib/less/cmd.h index 8a943d152..632b65ea3 100644 --- a/contrib/less/cmd.h +++ b/contrib/less/cmd.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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,127 +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_GOEND_BUF 57 +#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 diff --git a/contrib/less/cmdbuf.c b/contrib/less/cmdbuf.c index 69d7414e9..db5b2595f 100644 --- a/contrib/less/cmdbuf.c +++ b/contrib/less/cmdbuf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 int in_completion = 0; 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 */ 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 @@ clear_cmd() */ 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 @@ len_cmdbuf() /* * 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 @@ cmd_step_common(p, ch, len, pwidth, bswidth) int *bswidth; { char *pr; + int width; if (len == 1) { pr = prchar((int) ch); - if (pwidth != NULL || bswidth != NULL) - { - int len = (int) 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 = (int) 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 @@ cmd_step_left(pp, pwidth, bswidth) */ static void cmd_repaint(old_cp) - char *old_cp; + constant char *old_cp; { /* * Repaint the line from the current position. @@ -453,8 +427,9 @@ cmd_right() 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 @@ cmd_ichar(cs, clen) static int cmd_erase() { - register char *s; + char *s; int clen; if (cp == cmdbuf) @@ -687,7 +662,7 @@ set_mlist(mlist, cmdflags) cmd_updown(action) int action; { - char *s; + constant char *s; struct mlist *ml; if (curr_mlist == NULL) @@ -749,7 +724,7 @@ cmd_updown(action) public void cmd_addhist(mlist, cmd, modified) struct mlist *mlist; - char *cmd; + constant char *cmd; int modified; { #if CMD_HISTORY @@ -966,7 +941,7 @@ delimit_word() char *p; int delim_quoted = 0; int meta_quoted = 0; - char *esc = get_meta_escape(); + constant char *esc = get_meta_escape(); int esclen = (int) strlen(esc); #endif @@ -1249,6 +1224,13 @@ cmd_char(c) *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); diff --git a/contrib/less/command.c b/contrib/less/command.c index ddcddd473..a2f18c158 100644 --- a/contrib/less/command.c +++ b/contrib/less/command.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ /* - * Copyright (C) 1984-2015 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. @@ -27,6 +27,7 @@ extern int quit_if_one_screen; extern int squished; extern int sc_width; extern int sc_height; +extern char *kent; extern int swindow; extern int jump_sline; extern int quitting; @@ -38,16 +39,18 @@ 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; @@ -57,7 +60,6 @@ extern int screen_trashed; /* The screen has been overwritten */ extern int shift_count; extern int oldbot; extern int forw_prompt; -extern int same_pos_bell; #if SHELL_ESCAPE static char *shellcmd = NULL; /* For holding last shell command for "!!" */ @@ -77,10 +79,10 @@ static int save_bs_mode; static char pipec; #endif +/* Stack of ungotten chars (via ungetcc) */ struct ungot { struct ungot *ug_next; - char ug_char; - char ug_end_command; + LWCHAR ug_char; }; static struct ungot* ungot = NULL; @@ -94,9 +96,7 @@ static void multi_search(); static void cmd_exec() { -#if HILITE_SEARCH - clear_attn(); -#endif + clear_attn(); clear_bot(); flush(); } @@ -108,7 +108,7 @@ cmd_exec() start_mca(action, prompt, mlist, cmdflags) int action; constant char *prompt; - constant void *mlist; + void *mlist; int cmdflags; { mca = action; @@ -208,7 +208,7 @@ mca_opt_toggle() static void exec_mca() { - register char *cbuf; + char *cbuf; cmd_exec(); cbuf = get_cmdbuf(); @@ -302,12 +302,22 @@ is_erase_char(c) return (c == erase_char || c == erase2_char || c == kill_char); } +/* + * 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) @@ -427,7 +437,7 @@ mca_opt_char(c) 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) { @@ -595,7 +605,7 @@ mca_char(c) /* * The multichar command is terminated by a newline. */ - if (c == '\n' || c == '\r') + if (is_newline_char(c)) { /* * Execute the command. @@ -691,9 +701,9 @@ make_display() static void prompt() { - register constant char *p; + constant char *p; - if (ungot != NULL && !ungot->ug_end_command) + if (ungot != NULL && ungot->ug_char != CHAR_END_COMMAND) { /* * No prompt necessary if commands are from @@ -774,75 +784,123 @@ dispversion() error("less %s", &parg); } +/* + * 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) { + 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; - int end_command = ug->ug_end_command; + c = ug->ug_char; ungot = ug->ug_next; free(ug); - if (end_command) - { - /* - * 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'); + if (c == CHAR_END_COMMAND) + c = getcc_end_command(); + } + return (c); +} - default: - /* - * Some other incomplete command. Let user complete it. - */ - return (getchr()); - } +/* + * 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]; } - return (c); + /* 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)); - ug->ug_char = (char) c; - ug->ug_end_command = (c == CHAR_END_COMMAND); + ug->ug_char = c; ug->ug_next = ungot; ungot = ug; } @@ -855,12 +913,23 @@ ungetcc(c) ungetsc(s) char *s; { - register char *p; + char *p; for (p = s + strlen(s) - 1; p >= s; p--) ungetcc(*p); } +/* + * 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. @@ -872,7 +941,7 @@ multi_search(pattern, n, silent) int n; int silent; { - register int nomore; + int nomore; IFILE save_ifile; int changed_file; @@ -1007,9 +1076,9 @@ forw_loop(until_hilite) 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; @@ -1477,6 +1546,9 @@ commands() break; case A_UNDO_SEARCH: + /* + * Clear search string highlighting. + */ undo_search(); break; @@ -1495,60 +1567,54 @@ commands() 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: /* * Invoke an editor on the input file. */ #if EDITOR - if (secure) - { - error("Command not available", NULL_PARG); - break; - } - if (ch_getflags() & CH_HELPFILE) - break; - if (strcmp(get_filename(curr_ifile), "-") == 0) + if (!secure) { - error("Cannot edit standard input", 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 (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: /* @@ -1594,6 +1660,9 @@ commands() break; case A_NEXT_TAG: + /* + * Jump to the next tag in the current tag list. + */ #if TAGS if (number <= 0) number = 1; @@ -1603,6 +1672,7 @@ commands() error("No next tag", NULL_PARG); break; } + cmd_exec(); if (edit(tagfile) == 0) { POSITION pos = tagsearch(); @@ -1615,6 +1685,9 @@ commands() break; case A_PREV_TAG: + /* + * Jump to the previous tag in the current tag list. + */ #if TAGS if (number <= 0) number = 1; @@ -1624,6 +1697,7 @@ commands() error("No previous tag", NULL_PARG); break; } + cmd_exec(); if (edit(tagfile) == 0) { POSITION pos = tagsearch(); @@ -1646,6 +1720,9 @@ commands() break; case A_REMOVE_FILE: + /* + * Remove a file from the input file list. + */ if (ch_getflags() & CH_HELPFILE) break; old_ifile = curr_ifile; @@ -1664,6 +1741,9 @@ commands() break; case A_OPT_TOGGLE: + /* + * Change the setting of an option. + */ optflag = OPT_TOGGLE; optgetname = FALSE; mca_opt_toggle(); @@ -1672,7 +1752,7 @@ commands() case A_DISP_OPTION: /* - * Report a flag setting. + * Report the setting of an option. */ optflag = OPT_NO_TOGGLE; optgetname = FALSE; @@ -1693,69 +1773,78 @@ commands() * 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 (is_erase_char(c) || is_newline_char(c)) + break; + 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 (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); + 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); 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: @@ -1764,6 +1853,9 @@ commands() goto again; case A_LSHIFT: + /* + * Shift view left. + */ if (number > 0) shift_count = number; else @@ -1776,6 +1868,9 @@ commands() break; case A_RSHIFT: + /* + * Shift view right. + */ if (number > 0) shift_count = number; else @@ -1785,6 +1880,22 @@ commands() 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). diff --git a/contrib/less/compose.uni b/contrib/less/compose.uni index b814ce991..2a4b18025 100644 --- a/contrib/less/compose.uni +++ b/contrib/less/compose.uni @@ -1,4 +1,5 @@ -/* Generated by "./mkutable -f2 Mn Me -- unicode/UnicodeData.txt" on Mon Jul 14 16:21:21 PDT 2014 */ +/* 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 */ @@ -7,13 +8,17 @@ { 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 */ @@ -23,7 +28,9 @@ { 0x0825, 0x0827 }, /* Mn */ { 0x0829, 0x082d }, /* Mn */ { 0x0859, 0x085b }, /* Mn */ - { 0x08e4, 0x0902 }, /* Mn */ + { 0x08d4, 0x08e1 }, /* Mn */ + { 0x08e2, 0x08e2 }, /* Cf */ + { 0x08e3, 0x0902 }, /* Mn */ { 0x093a, 0x093a }, /* Mn */ { 0x093c, 0x093c }, /* Mn */ { 0x0941, 0x0948 }, /* Mn */ @@ -49,6 +56,7 @@ { 0x0ac7, 0x0ac8 }, /* Mn */ { 0x0acd, 0x0acd }, /* Mn */ { 0x0ae2, 0x0ae3 }, /* Mn */ + { 0x0afa, 0x0aff }, /* Mn */ { 0x0b01, 0x0b01 }, /* Mn */ { 0x0b3c, 0x0b3c }, /* Mn */ { 0x0b3f, 0x0b3f }, /* Mn */ @@ -71,7 +79,8 @@ { 0x0cc6, 0x0cc6 }, /* Mn */ { 0x0ccc, 0x0ccd }, /* Mn */ { 0x0ce2, 0x0ce3 }, /* Mn */ - { 0x0d01, 0x0d01 }, /* Mn */ + { 0x0d00, 0x0d01 }, /* Mn */ + { 0x0d3b, 0x0d3c }, /* Mn */ { 0x0d41, 0x0d44 }, /* Mn */ { 0x0d4d, 0x0d4d }, /* Mn */ { 0x0d62, 0x0d63 }, /* Mn */ @@ -117,6 +126,8 @@ { 0x17c9, 0x17d3 }, /* Mn */ { 0x17dd, 0x17dd }, /* Mn */ { 0x180b, 0x180d }, /* Mn */ + { 0x180e, 0x180e }, /* Cf */ + { 0x1885, 0x1886 }, /* Mn */ { 0x18a9, 0x18a9 }, /* Mn */ { 0x1920, 0x1922 }, /* Mn */ { 0x1927, 0x1928 }, /* Mn */ @@ -155,8 +166,12 @@ { 0x1ced, 0x1ced }, /* Mn */ { 0x1cf4, 0x1cf4 }, /* Mn */ { 0x1cf8, 0x1cf9 }, /* Mn */ - { 0x1dc0, 0x1df5 }, /* Mn */ - { 0x1dfc, 0x1dff }, /* 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 */ @@ -170,13 +185,13 @@ { 0xa66f, 0xa66f }, /* Mn */ { 0xa670, 0xa672 }, /* Me */ { 0xa674, 0xa67d }, /* Mn */ - { 0xa69f, 0xa69f }, /* Mn */ + { 0xa69e, 0xa69f }, /* Mn */ { 0xa6f0, 0xa6f1 }, /* Mn */ { 0xa802, 0xa802 }, /* Mn */ { 0xa806, 0xa806 }, /* Mn */ { 0xa80b, 0xa80b }, /* Mn */ { 0xa825, 0xa826 }, /* Mn */ - { 0xa8c4, 0xa8c4 }, /* Mn */ + { 0xa8c4, 0xa8c5 }, /* Mn */ { 0xa8e0, 0xa8f1 }, /* Mn */ { 0xa926, 0xa92d }, /* Mn */ { 0xa947, 0xa951 }, /* Mn */ @@ -203,7 +218,9 @@ { 0xabed, 0xabed }, /* Mn */ { 0xfb1e, 0xfb1e }, /* Mn */ { 0xfe00, 0xfe0f }, /* Mn */ - { 0xfe20, 0xfe2d }, /* Mn */ + { 0xfe20, 0xfe2f }, /* Mn */ + { 0xfeff, 0xfeff }, /* Cf */ + { 0xfff9, 0xfffb }, /* Cf */ { 0x101fd, 0x101fd }, /* Mn */ { 0x102e0, 0x102e0 }, /* Mn */ { 0x10376, 0x1037a }, /* Mn */ @@ -218,22 +235,28 @@ { 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 */ - { 0x11301, 0x11301 }, /* 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 */ @@ -241,6 +264,7 @@ { 0x115b2, 0x115b5 }, /* Mn */ { 0x115bc, 0x115bd }, /* Mn */ { 0x115bf, 0x115c0 }, /* Mn */ + { 0x115dc, 0x115dd }, /* Mn */ { 0x11633, 0x1163a }, /* Mn */ { 0x1163d, 0x1163d }, /* Mn */ { 0x1163f, 0x11640 }, /* Mn */ @@ -248,14 +272,54 @@ { 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 */ diff --git a/contrib/less/cvt.c b/contrib/less/cvt.c index d9836418e..3a7794904 100644 --- a/contrib/less/cvt.c +++ b/contrib/less/cvt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ cvt_text(odst, osrc, chpos, lenp, ops) char *dst; char *edst = odst; char *src; - register char *src_end; + char *src_end; LWCHAR ch; if (lenp != NULL) @@ -83,7 +83,7 @@ cvt_text(odst, osrc, chpos, lenp, ops) /* 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)) { diff --git a/contrib/less/decode.c b/contrib/less/decode.c index 1cd159973..80f47f99d 100644 --- a/contrib/less/decode.c +++ b/contrib/less/decode.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ static unsigned char cmdtable[] = 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, @@ -136,6 +140,8 @@ static unsigned char cmdtable[] = 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, @@ -233,9 +239,9 @@ expand_special_keys(table, len) 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 +292,33 @@ expand_special_keys(table, len) } } +/* + * 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. */ @@ -325,7 +358,7 @@ add_cmd_table(tlist, buf, len) char *buf; int len; { - register struct tablelist *t; + struct tablelist *t; if (len == 0) return (0); @@ -338,7 +371,6 @@ add_cmd_table(tlist, buf, len) { return (-1); } - expand_special_keys(buf, len); t->t_start = buf; t->t_end = buf + len; t->t_next = *tlist; @@ -393,9 +425,9 @@ cmd_search(cmd, table, endtable, sp) 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++) @@ -484,8 +516,8 @@ cmd_decode(tlist, cmd, sp) 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. @@ -595,8 +627,8 @@ new_lesskey(buf, len, sysvar) int sysvar; { char *p; - register int c; - register int n; + int c; + int n; /* * New-style lesskey file. @@ -647,19 +679,17 @@ lesskey(filename, sysvar) 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); /* * Try to open the lesskey file. */ - filename = shell_unquote(filename); f = open(filename, OPEN_READ); - free(filename); if (f < 0) return (1); diff --git a/contrib/less/edit.c b/contrib/less/edit.c index 2a35adec4..7dc80bbd6 100644 --- a/contrib/less/edit.c +++ b/contrib/less/edit.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 #endif +#if OS2 +#include +#endif public int fd0 = 0; @@ -26,7 +30,7 @@ extern int sigs; 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,9 +47,6 @@ public dev_t curr_dev; 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. @@ -148,6 +149,24 @@ back_textlist(tlist, prev) return (s); } +/* + * 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. */ @@ -155,6 +174,9 @@ back_textlist(tlist, prev) close_file() { struct scrpos scrpos; + int chflags; + FILE *altpipe; + char *altfilename; if (curr_ifile == NULL_IFILE) return; @@ -163,7 +185,7 @@ close_file() * 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_file() /* * 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 @@ edit_ifile(ifile) 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 @@ edit_ifile(ifile) } 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) - { - /* - * 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); -#endif - } else if (strcmp(open_filename, FAKE_EMPTYFILE) == 0) - { + chflags = 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) + alt_filename = get_altfilename(ifile); + open_filename = (alt_filename != NULL) ? alt_filename : filename; + } else { - /* - * It looks like a bad file. Don't try to open it. - */ - error("%s", &parg); - free(parg.p_string); - err1: - if (alt_filename != NULL) + 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) { - 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) + /* + * 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; /* - * Whoops. The "current" ifile is the one we just deleted. - * Just give up. + * Must switch stdin to BINARY mode. */ - 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)) + 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); +#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) { /* - * Looks like a binary file. - * Ask user if we should proceed. + * It looks like a bad file. Don't try to open it. */ - parg.p_string = filename; - answer = query("\"%s\" may be a binary file. See it anyway? ", - &parg); - if (answer != 'y' && answer != 'Y') + error("%s", &parg); + free(parg.p_string); + err1: + if (alt_filename != NULL) { - close(f); + 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) + { + /* + * 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)) + { + /* + * 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 @@ edit_ifile(ifile) 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 @@ edit_ifile(ifile) #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; @@ -417,7 +467,6 @@ edit_ifile(ifile) } } - free(qopen_filename); no_display = !any_display; flush(); any_display = TRUE; @@ -468,6 +517,7 @@ edit_list(filelist) char *filename; char *gfilelist; char *gfilename; + char *qfilename; struct textlist tl_files; struct textlist tl_gfiles; @@ -489,8 +539,10 @@ edit_list(filelist) 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); } @@ -716,7 +768,7 @@ edit_stdin() public void cat_file() { - register int c; + int c; while ((c = ch_forw_get()) != EOI) putchr(c); @@ -734,8 +786,8 @@ cat_file() use_logfile(filename) char *filename; { - register int exists; - register int answer; + int exists; + int answer; PARG parg; if (ch_getflags() & CH_CANSEEK) @@ -747,7 +799,6 @@ use_logfile(filename) /* * {{ We could use access() here. }} */ - filename = shell_unquote(filename); exists = open(filename, OPEN_READ); if (exists >= 0) close(exists); @@ -816,10 +867,8 @@ use_logfile(filename) */ parg.p_string = filename; error("Cannot write to \"%s\"", &parg); - free(filename); return; } - free(filename); SET_BINARY(logfile); } diff --git a/contrib/less/filename.c b/contrib/less/filename.c index 9631f1c2b..983a02b0e 100644 --- a/contrib/less/filename.c +++ b/contrib/less/filename.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 #endif #endif -#if OS2 -#include -#endif #if HAVE_STAT #include @@ -46,7 +43,6 @@ #endif #endif - extern int force_open; extern int secure; extern int use_lessopen; @@ -226,7 +222,6 @@ dirfile(dirname, filename) char *filename; { char *pathname; - char *qpathname; int len; int f; @@ -243,8 +238,7 @@ dirfile(dirname, filename) /* * 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 @@ dirfile(dirname, filename) { close(f); } - free(qpathname); return (pathname); } @@ -264,7 +257,7 @@ dirfile(dirname, filename) homefile(filename) char *filename; { - register char *pathname; + char *pathname; /* * Try $HOME/filename. @@ -314,9 +307,9 @@ homefile(filename) 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) \ @@ -474,7 +467,7 @@ bin_file(f) int bin_count = 0; char data[256]; char* p; - char* pend; + char* edata; if (!seekable(f)) return (0); @@ -483,21 +476,19 @@ bin_file(f) n = read(f, data, sizeof(data)); if (n <= 0) return (0); - if (utf_mode) + edata = &data[n]; + for (p = data; p < edata; ) { - bin_count = utf_bin_count(data, n); - } else - { - pend = &data[n]; - for (p = data; p < pend; ) + if (utf_mode && !is_utf8_well_formed(p, edata-data)) { - LWCHAR c = step_char(&p, +1, pend); + bin_count++; + utf_skip_to_lead(&p, edata); + } else + { + LWCHAR c = step_char(&p, +1, edata); if (ctldisp == OPT_ONPLUS && IS_CSI_START(c)) - { - do { - c = step_char(&p, +1, pend); - } while (p < pend && is_ansi_middle(c)); - } else if (binary_char(c)) + skip_ansi(&p, edata); + else if (binary_char(c)) bin_count++; } } @@ -632,12 +623,10 @@ lglob(filename) 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 { @@ -652,8 +641,7 @@ lglob(filename) 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)) @@ -690,18 +678,17 @@ lglob(filename) * 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); @@ -710,13 +697,13 @@ lglob(filename) p = gfilename; do { n = (int) (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) + 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 = (int) strlen(qpathname); + n = (int) strlen(qfilename); while (p - gfilename + n + 2 >= len) { /* @@ -731,8 +718,8 @@ lglob(filename) gfilename = p; p = gfilename + strlen(gfilename); } - strcpy(p, qpathname); - free(qpathname); + strcpy(p, qfilename); + free(qfilename); p += n; *p++ = ' '; } @@ -764,8 +751,7 @@ lglob(filename) esc = shell_quote(esc); if (esc == NULL) { - free(filename); - return (ofilename); + return (filename); } lessecho = lgetenv("LESSECHO"); if (lessecho == NULL || *lessecho == '\0') @@ -773,13 +759,13 @@ lglob(filename) /* * Invoke lessecho, and read its output (a globbed list of filenames). */ - len = (int) (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) @@ -788,16 +774,14 @@ lglob(filename) * Cannot create the pipe. * Just return the original (fexpanded) filename. */ - free(filename); - return (ofilename); + return (filename); } gfilename = readfd(fd); pclose(fd); if (*gfilename == '\0') { free(gfilename); - free(filename); - return (ofilename); + return (save(filename)); } } #else @@ -809,7 +793,6 @@ lglob(filename) #endif #endif free(filename); - free(ofilename); return (gfilename); } @@ -853,6 +836,7 @@ open_altfile(filename, pf, pfd) return (NULL); #else char *lessopen; + char *qfilename; char *cmd; int len; FILE *fd; @@ -879,24 +863,28 @@ open_altfile(filename, pf, pfd) 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 = (int) (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) @@ -909,11 +897,12 @@ open_altfile(filename, pf, pfd) #if HAVE_FILENO if (returnfd) { - int f; char c; + int f; /* - * 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); @@ -956,10 +945,9 @@ open_altfile(filename, pf, pfd) * 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; @@ -969,22 +957,12 @@ close_altfile(altfilename, filename, pipefd) 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", NULL_PARG); + error("LESSCLOSE ignored; must contain no more than 2 %%s", NULL_PARG); return; } len = (int) (strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2); @@ -1006,7 +984,6 @@ is_dir(filename) { int isdir = 0; - filename = shell_unquote(filename); #if HAVE_STAT { int r; @@ -1018,7 +995,7 @@ is_dir(filename) #else #ifdef _OSK { - register int f; + int f; f = open(filename, S_IREAD | S_IFDIR); if (f >= 0) @@ -1027,7 +1004,6 @@ is_dir(filename) } #endif #endif - free(filename); return (isdir); } @@ -1040,9 +1016,8 @@ is_dir(filename) 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"; @@ -1074,7 +1049,6 @@ bad_file(filename) } #endif } - free(filename); return (m); } diff --git a/contrib/less/fmt.uni b/contrib/less/fmt.uni new file mode 100644 index 000000000..a0bad7784 --- /dev/null +++ b/contrib/less/fmt.uni @@ -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 */ diff --git a/contrib/less/forwback.c b/contrib/less/forwback.c index 9626dc116..edcc88a19 100644 --- a/contrib/less/forwback.c +++ b/contrib/less/forwback.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ /* - * Copyright (C) 1984-2015 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,7 +126,7 @@ squish_check() */ public void forw(n, pos, force, only_last, nblank) - register int n; + int n; POSITION pos; int force; int only_last; @@ -290,7 +290,7 @@ forw(n, pos, force, only_last, nblank) forw_prompt = 1; } - if (nlines == 0 && same_pos_bell) + if (nlines == 0 && !ignore_eoi && same_pos_bell) eof_bell(); else if (do_repaint) repaint(); @@ -303,7 +303,7 @@ forw(n, pos, force, only_last, nblank) */ public void back(n, pos, force, only_last) - register int n; + int n; POSITION pos; int force; int only_last; @@ -449,3 +449,21 @@ get_back_scroll() 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; +} diff --git a/contrib/less/funcs.h b/contrib/less/funcs.h index 53550f0cc..d70c359df 100644 --- a/contrib/less/funcs.h +++ b/contrib/less/funcs.h @@ -1,298 +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_end_buffer_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 int utf_bin_count (); - 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_forw_buffered (); - 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 time_type 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 valid_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 POSITION next_unfiltered (); - public POSITION prev_unfiltered (); - 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)); diff --git a/contrib/less/help.c b/contrib/less/help.c index aba711677..efa236af8 100644 --- a/contrib/less/help.c +++ b/contrib/less/help.c @@ -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,8 +23,10 @@ constant char helpdata[] = { ' ',' ','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', @@ -70,10 +72,12 @@ constant char helpdata[] = { ' ',' ',' ',' ',' ',' ',' ',' ','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', @@ -102,6 +106,7 @@ constant char helpdata[] = { '\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', diff --git a/contrib/less/ifile.c b/contrib/less/ifile.c index fea2ea1ea..613312b1c 100644 --- a/contrib/less/ifile.c +++ b/contrib/less/ifile.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 int ifiles = 0; 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 @@ new_ifile(filename, prev) char *filename; struct ifile *prev; { - register struct ifile *p; + struct ifile *p; /* * Allocate and initialize structure. @@ -129,7 +131,7 @@ new_ifile(filename, prev) del_ifile(h) IFILE h; { - register struct ifile *p; + struct ifile *p; if (h == NULL_IFILE) return; @@ -153,7 +155,7 @@ del_ifile(h) 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 @@ next_ifile(h) 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 @@ nifile() 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 @@ get_ifile(filename, prev) 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 @@ set_filestate(ifile, filestate) 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) { diff --git a/contrib/less/input.c b/contrib/less/input.c index 9419a0271..27be124c7 100644 --- a/contrib/less/input.c +++ b/contrib/less/input.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ forw_line(curr_pos) { POSITION base_pos; POSITION new_pos; - register int c; + int c; int blankline; int endline; + int chopped; int backchars; get_forw_line: @@ -143,6 +143,7 @@ forw_line(curr_pos) /* * Read each character in the line and append to the line buffer. */ + chopped = FALSE; for (;;) { if (ABORT_SIGS()) @@ -193,6 +194,7 @@ forw_line(curr_pos) new_pos = ch_tell(); endline = TRUE; quit_if_one_screen = FALSE; + chopped = TRUE; } else { new_pos = ch_tell() - backchars; @@ -203,7 +205,7 @@ forw_line(curr_pos) c = ch_forw_get(); } - pdone(endline, 1); + pdone(endline, chopped, 1); #if HILITE_SEARCH if (is_filtered(base_pos)) @@ -255,6 +257,7 @@ back_line(curr_pos) POSITION new_pos, begin_new_pos, base_pos; int c; int endline; + int chopped; int backchars; get_back_line: @@ -359,6 +362,7 @@ back_line(curr_pos) loop: begin_new_pos = new_pos; (void) ch_seek(new_pos); + chopped = FALSE; do { @@ -391,6 +395,7 @@ back_line(curr_pos) if (chopline || hshift > 0) { endline = TRUE; + chopped = TRUE; quit_if_one_screen = FALSE; break; } @@ -405,7 +410,7 @@ back_line(curr_pos) } } while (new_pos < curr_pos); - pdone(endline, 0); + pdone(endline, chopped, 0); #if HILITE_SEARCH if (is_filtered(base_pos)) diff --git a/contrib/less/jump.c b/contrib/less/jump.c index 8373d8b54..2c7d28bd7 100644 --- a/contrib/less/jump.c +++ b/contrib/less/jump.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ jump_forw() 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); @@ -122,9 +122,13 @@ repaint() * 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); } /* @@ -196,14 +200,15 @@ jump_loc(pos, sline) POSITION pos; int sline; { - register int nline; + int nline; + int sindex; POSITION tpos; POSITION bpos; /* * Normalize sline. */ - sline = adjsline(sline); + sindex = sindex_from_sline(sline); if ((nline = onscreen(pos)) >= 0) { @@ -211,10 +216,10 @@ jump_loc(pos, sline) * 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) @@ -247,7 +252,7 @@ jump_loc(pos, sline) * 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) { @@ -256,7 +261,7 @@ jump_loc(pos, sline) * 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); @@ -278,16 +283,16 @@ jump_loc(pos, sline) 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 { /* * 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) diff --git a/contrib/less/less.h b/contrib/less/less.h index f57fb1ecf..39ca65e2a 100644 --- a/contrib/less/less.h +++ b/contrib/less/less.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ -507,7 +514,6 @@ struct wchar_range_table #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/\\@" @@ -525,9 +531,13 @@ struct wchar_range_table #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*)); diff --git a/contrib/less/less.hlp b/contrib/less/less.hlp index 2a8e3e723..0bbada91b 100644 --- a/contrib/less/less.hlp +++ b/contrib/less/less.hlp @@ -20,8 +20,10 @@ 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. @@ -67,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 . + m_<_l_e_t_t_e_r_> Mark the current top line with . + M_<_l_e_t_t_e_r_> Mark the current bottom line with . '_<_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: @@ -99,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". --------------------------------------------------------------------------- diff --git a/contrib/less/less.nro b/contrib/less/less.nro index b3d98746a..fa0b4ffff 100644 --- a/contrib/less/less.nro +++ b/contrib/less/less.nro @@ -1,4 +1,4 @@ -.TH LESS 1 "Version 481: 31 Aug 2015" +.TH LESS 1 "Version 530: 05 Dec 2017" .SH NAME less \- opposite of more .SH SYNOPSIS @@ -44,7 +44,7 @@ of the screen are prefixed with a caret.) Commands are based on both .I more and -.I vi. +.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. @@ -101,6 +101,10 @@ Scroll horizontally left N characters, default half the screen width (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 @@ -170,11 +174,16 @@ respectively. 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. @@ -184,6 +193,9 @@ Marks are preserved when a new file is examined, 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. @@ -388,7 +400,7 @@ Prints the version number of being run. .IP "q or Q or :q or :Q or ZZ" Exits -.I less. +.IR less . .PP The following four @@ -413,8 +425,10 @@ On MS-DOS and OS/2 systems, the shell is the normal command processor. .IP "| shell-command" 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. may also be ^ or $ to indicate beginning or end of file respectively. If is \&.\& or newline, the current screen is piped. .IP "s filename" @@ -445,12 +459,12 @@ For example, to avoid typing "less \-options \&...\&" each time .I less is invoked, you might tell -.I csh: +.IR csh : .sp setenv LESS "\-options" .sp or if you use -.I sh: +.IR sh : .sp LESS="\-options"; export LESS .sp @@ -528,7 +542,7 @@ 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. +.IR less . .IP "\-d or \-\-dumb" The \-d option suppresses the error message normally displayed if the terminal is dumb; @@ -547,6 +561,9 @@ 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 @@ -630,7 +647,8 @@ 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 @@ -672,7 +690,7 @@ prompts with a colon. Causes .I less to prompt even more verbosely than -.I more. +.IR more . .IP "\-n or \-\-line-numbers" Suppresses line numbers. The default (to use line numbers) may cause @@ -705,7 +723,7 @@ the \-o and \-O options can be used from within 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 specifying +/\fIpattern\fP; @@ -728,6 +746,7 @@ to that string. \-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. @@ -803,15 +822,15 @@ 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" 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, @@ -830,7 +849,7 @@ 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. +.IR less . .IP "\-w or \-\-hilite-unread" Temporarily highlights the first "new" line after a forward movement of a full page. @@ -863,12 +882,12 @@ the screen is repainted instead. The \-c or \-C option may be used to repaint from the top of the screen if desired. By default, any forward movement causes scrolling. -.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. +.IR more . If the number .I n is negative, it indicates @@ -877,7 +896,7 @@ lines less than the current screen size. 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. @@ -929,6 +948,11 @@ This option changes the interpretations of options which follow this one. 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. @@ -936,7 +960,7 @@ This can be useful when viewing a file whose name begins with a "\-" or "+". .IP + If a command line option begins with \fB+\fP, the remainder of that option is taken to be an initial command to -.I less. +.IR less . For example, +G tells .I less to start at the end of the file rather than the beginning, @@ -1075,7 +1099,7 @@ 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. +.IR less . Before .I less opens a file, it first gives your input preprocessor a chance to modify the @@ -1160,7 +1184,7 @@ 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, +.IR less , rather than putting the data into a replacement file. This avoids the need to decompress the entire file before starting to view it. @@ -1175,6 +1199,8 @@ uses the original file, as normal. To use an input pipe, 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: @@ -1205,11 +1231,11 @@ 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. +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 @@ -1220,7 +1246,7 @@ In this case, the replacement file name passed to the LESSCLOSE 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. @@ -1680,7 +1706,7 @@ Normally should be set to "global" if your system has the .IP LESSHISTFILE Name of the history file used to remember search commands and shell commands between invocations of -.I less. +.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" @@ -1740,7 +1766,7 @@ The name of the editor (used for the v command). lesskey(1) .SH COPYRIGHT -Copyright (C) 1984-2015 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 diff --git a/contrib/less/lessecho.c b/contrib/less/lessecho.c index fb0b22ddc..4ed4830e1 100644 --- a/contrib/less/lessecho.c +++ b/contrib/less/lessecho.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/lessecho.nro b/contrib/less/lessecho.nro index 78b893f18..49a97fff1 100644 --- a/contrib/less/lessecho.nro +++ b/contrib/less/lessecho.nro @@ -1,4 +1,4 @@ -.TH LESSECHO 1 "Version 481: 31 Aug 2015" +.TH LESSECHO 1 "Version 530: 05 Dec 2017" .SH NAME lessecho \- expand metacharacters .SH SYNOPSIS diff --git a/contrib/less/lesskey.c b/contrib/less/lesskey.c index 298748b9a..fa1ab6d3a 100644 --- a/contrib/less/lesskey.c +++ b/contrib/less/lesskey.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ struct cmdname cmdnames[] = { "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 }, @@ -130,6 +132,7 @@ struct cmdname cmdnames[] = { "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 }, @@ -144,6 +147,7 @@ struct cmdname cmdnames[] = { "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 }, @@ -359,9 +363,9 @@ tstr(pp, xlate) 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' }; @@ -421,7 +425,7 @@ tstr(pp, xlate) 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 (""); } @@ -472,7 +476,7 @@ tstr(pp, xlate) */ public char * skipsp(s) - register char *s; + char *s; { while (*s == ' ' || *s == '\t') s++; @@ -484,7 +488,7 @@ skipsp(s) */ public char * skipnsp(s) - register char *s; + char *s; { while (*s != '\0' && *s != ' ' && *s != '\t') s++; @@ -499,7 +503,7 @@ skipnsp(s) 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++) @@ -518,7 +522,7 @@ add_cmd_char(c) { if (currtable->pbuffer >= currtable->buffer + MAX_USERCMD) { - error("too many commands"); + error("too many commands", NULL_PARG); exit(1); } *(currtable->pbuffer)++ = c; @@ -618,16 +622,18 @@ findaction(actname) 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; } @@ -650,7 +656,7 @@ parse_cmdline(p) s = tstr(&p, 1); 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'); @@ -667,7 +673,7 @@ parse_cmdline(p) p = skipsp(p); if (*p == '\0') { - error("missing action"); + error("missing action", NULL_PARG); return; } actname = p; @@ -720,7 +726,7 @@ parse_varline(p) p = skipsp(p); if (*p++ != '=') { - error("missing ="); + error("missing =", NULL_PARG); return; } diff --git a/contrib/less/lesskey.h b/contrib/less/lesskey.h index 34b8c1758..92d4d93af 100644 --- a/contrib/less/lesskey.h +++ b/contrib/less/lesskey.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/lesskey.nro b/contrib/less/lesskey.nro index 826332de5..ffe520be3 100644 --- a/contrib/less/lesskey.nro +++ b/contrib/less/lesskey.nro @@ -1,4 +1,4 @@ -.TH LESSKEY 1 "Version 481: 31 Aug 2015" +.TH LESSKEY 1 "Version 530: 05 Dec 2017" .SH NAME lesskey \- specify key bindings for less .SH SYNOPSIS @@ -134,7 +134,7 @@ default command keys used by less: \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 @@ default command keys used by less: ^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 @@ default command keys used by less: ^L repaint \eeu undo-hilite g goto-line - \ekh goto-line + \ekh goto-line < goto-line \ee< goto-line p percent @@ -180,6 +180,8 @@ default command keys used by less: \ee) right-scroll \ekl left-scroll \ekr right-scroll + \ee{ no-scroll + \ee} end-scroll { forw-bracket {} } back-bracket {} ( forw-bracket () @@ -191,7 +193,7 @@ default command keys used by less: G goto-end \ee> goto-end > goto-end - \eke goto-end + \eke goto-end \eeG goto-end-buffered = status ^G status @@ -206,6 +208,8 @@ default command keys used by less: \eeN reverse-search-all & filter m set-mark + M set-mark-bottom + \eem clear-mark ' goto-mark ^X^X goto-mark E examine @@ -359,7 +363,7 @@ which start with a NUL character (0). This NUL character should be represented as \e340 in a lesskey file. .SH COPYRIGHT -Copyright (C) 1984-2015 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 diff --git a/contrib/less/lglob.h b/contrib/less/lglob.h index 87b5fb45c..0d9fb5b98 100644 --- a/contrib/less/lglob.h +++ b/contrib/less/lglob.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/line.c b/contrib/less/line.c index e54835d47..dd890f3db 100644 --- a/contrib/less/line.c +++ b/contrib/less/line.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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,6 +15,12 @@ #include "less.h" #include "charset.h" +#include "position.h" + +#if MSDOS_COMPILER==WIN32C +#define WIN32_LEAN_AND_MEAN +#include +#endif static char *linebuf = NULL; /* Buffer which holds the current output line */ static char *attr = NULL; /* Extension of linebuf to hold attributes */ @@ -31,6 +36,8 @@ public POSITION highest_hilite; /* Pos of last hilite in file found so far */ 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 */ @@ -40,9 +47,9 @@ 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 sc_width, sc_height; 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; @@ -151,6 +160,8 @@ prewind() { curr = 0; column = 0; + right_curr = 0; + right_column = 0; cshift = 0; overstrike = 0; last_overstrike = AT_NORMAL; @@ -159,7 +170,33 @@ prewind() 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; } /* @@ -169,8 +206,8 @@ prewind() plinenum(pos) POSITION pos; { - register LINENUM linenum = 0; - register int i; + LINENUM linenum = 0; + int i; if (linenums == OPT_ONPLUS) { @@ -190,45 +227,48 @@ plinenum(pos) */ 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. */ 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 = (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); } } @@ -539,7 +579,7 @@ is_ansi_end(ch) } /* - * + * Can a char appear in an ANSI escape sequence, before the end char? */ public int is_ansi_middle(ch) @@ -552,6 +592,23 @@ is_ansi_middle(ch) return (strchr(mid_ansi_chars, (char) ch) != NULL); } +/* + * 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. */ @@ -647,11 +704,15 @@ store_char(ch, a, rep, pos) 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); @@ -850,7 +911,7 @@ do_append(ch, rep, pos) char *rep; POSITION pos; { - register int a; + int a; LWCHAR prev_ch; a = AT_NORMAL; @@ -998,12 +1059,27 @@ pflushmbc() return r; } +/* + * 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(); @@ -1022,15 +1098,34 @@ pdone(endline, forw) 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(); } /* @@ -1048,9 +1143,7 @@ pdone(endline, forw) */ 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) { @@ -1068,13 +1161,10 @@ pdone(endline, forw) * 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); } /* @@ -1084,8 +1174,7 @@ pdone(endline, forw) set_status_col(c) char c; { - linebuf[0] = c; - attr[0] = AT_NORMAL|AT_HILITE; + set_linebuf(0, c, AT_NORMAL|AT_HILITE); } /* @@ -1095,8 +1184,8 @@ set_status_col(c) */ public int gline(i, ap) - register int i; - register int *ap; + int i; + int *ap; { if (is_null_line) { @@ -1143,8 +1232,8 @@ forw_raw_line(curr_pos, linep, line_lenp) 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) || @@ -1192,8 +1281,8 @@ back_raw_line(curr_pos, linep, line_lenp) 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() || @@ -1255,3 +1344,30 @@ back_raw_line(curr_pos, linep, line_lenp) *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; +} diff --git a/contrib/less/linenum.c b/contrib/less/linenum.c index 6d078ec86..4e726377e 100644 --- a/contrib/less/linenum.c +++ b/contrib/less/linenum.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ extern int screen_trashed; 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 @@ clr_linenum() */ 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 @@ add_lnum(linenum, pos) 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. @@ -265,8 +265,8 @@ abort_long() 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_linenum(pos) find_pos(linenum) LINENUM linenum; { - register struct linenum_info *p; + struct linenum_info *p; POSITION cpos; LINENUM clinenum; diff --git a/contrib/less/lsystem.c b/contrib/less/lsystem.c index 8a7cb8f2a..10911ebe1 100644 --- a/contrib/less/lsystem.c +++ b/contrib/less/lsystem.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ lsystem(cmd, donemsg) 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 @@ -289,8 +289,8 @@ pipe_data(cmd, spos, epos) POSITION spos; POSITION epos; { - register FILE *f; - register int c; + FILE *f; + int c; extern FILE *popen(); /* diff --git a/contrib/less/main.c b/contrib/less/main.c index 6cfd34d43..6f136d759 100644 --- a/contrib/less/main.c +++ b/contrib/less/main.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ /* - * Copyright (C) 1984-2015 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,11 +54,13 @@ extern int jump_sline; 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; /* @@ -113,8 +115,9 @@ main(argc, argv) * Command line arguments override environment arguments. */ is_tty = isatty(1); - get_term(); init_cmds(); + get_term(); + expand_cmd_tables(); init_charset(); init_line(); init_cmdhist(); @@ -189,7 +192,6 @@ main(argc, argv) 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, @@ -198,25 +200,24 @@ main(argc, argv) * 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); 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 } /* @@ -283,10 +284,19 @@ main(argc, argv) { 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(); @@ -302,9 +312,9 @@ main(argc, argv) */ 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); @@ -320,7 +330,7 @@ ecalloc(count, size) int count; unsigned int size; { - register VOID_POINTER p; + VOID_POINTER p; p = (VOID_POINTER) calloc(count, size); if (p != NULL) @@ -336,7 +346,7 @@ ecalloc(count, size) */ public char * skipsp(s) - register char *s; + char *s; { while (*s == ' ' || *s == '\t') s++; @@ -354,9 +364,9 @@ sprefix(ps, s, uppercase) 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++) { diff --git a/contrib/less/mark.c b/contrib/less/mark.c index 44d606fc9..fbdac6e3f 100644 --- a/contrib/less/mark.c +++ b/contrib/less/mark.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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; @@ -61,7 +62,7 @@ getumark(c) getmark(c) int c; { - register struct mark *m; + struct mark *m; static struct mark sm; switch (c) @@ -86,7 +87,7 @@ getmark(c) } 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 '.': @@ -94,7 +95,7 @@ getmark(c) * 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 '\'': @@ -134,20 +135,36 @@ badmark(c) * 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). */ @@ -158,7 +175,7 @@ lastmark() if (ch_getflags() & CH_HELPFILE) return; - get_scrpos(&scrpos); + get_scrpos(&scrpos, TOP); if (scrpos.pos == NULL_POSITION) return; marks[LASTMARK].m_scrpos = scrpos; @@ -172,7 +189,7 @@ lastmark() gomark(c) int c; { - register struct mark *m; + struct mark *m; struct scrpos scrpos; m = getmark(c); @@ -220,7 +237,7 @@ gomark(c) markpos(c) int c; { - register struct mark *m; + struct mark *m; m = getmark(c); if (m == NULL) @@ -234,6 +251,27 @@ markpos(c) return (m->m_scrpos.pos); } +/* + * 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. */ diff --git a/contrib/less/mkhelp.c b/contrib/less/mkhelp.c deleted file mode 100644 index d4e406337..000000000 --- a/contrib/less/mkhelp.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 1984-2015 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information, see the README file. - */ - - -/* - * Silly little program to generate the help.c source file - * from the less.hlp text file. - * help.c just contains a char array whose contents are - * the contents of less.hlp. - */ - -#include - - int -main(argc, argv) - int argc; - char *argv[]; -{ - int ch; - int prevch; - - printf("/* This file was generated by mkhelp from less.hlp */\n"); - printf("#include \"less.h\"\n"); - printf("constant char helpdata[] = {\n"); - ch = 0; - while (prevch = ch, (ch = getchar()) != EOF) - { - switch (ch) - { - case '\'': - printf("'\\'',"); - break; - case '\\': - printf("'\\\\',"); - break; - case '\b': - printf("'\\b',"); - break; - case '\t': - printf("'\\t',"); - break; - case '\n': - if (prevch != '\r') - printf("'\\n',\n"); - break; - case '\r': - if (prevch != '\n') - printf("'\\n',\n"); - break; - default: - if (ch >= ' ' && ch < 0x7f) - printf("'%c',", ch); - else - printf("0x%02x,", ch); - break; - } - } - /* Add an extra null char to avoid having a trailing comma. */ - printf(" 0 };\n"); - printf("constant int size_helpdata = sizeof(helpdata) - 1;\n"); - return (0); -} diff --git a/contrib/less/mkutable b/contrib/less/mkutable index 803335b92..276062876 100755 --- a/contrib/less/mkutable +++ b/contrib/less/mkutable @@ -4,14 +4,24 @@ use strict; my $USAGE = <<__EOF__; usage: mkutable [-n] [-f#] type... [--] [<] UnicodeData.txt -n = take non-matching types - -f = zero-based type field (default 2) + -f = zero-based type field (default 2) __EOF__ use vars qw( $opt_f $opt_n ); use Getopt::Std; my $type_field = 2; -exit (main() ? 1 : 0); +# 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`; @@ -28,48 +38,59 @@ sub main { $types{$arg} = 1; } my %out = ( 'types' => \%types ); - my $last_code = 0; print $header; + my $last_code = 0; while (<>) { chomp; s/#.*//; my @fields = split /;/; next if not @fields; - my $code = hex $fields[0]; + 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; - while (++$last_code < $code) { - output(\%out, $last_code, '?'); + 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, $code, $type); } - output(\%out, $last_code+1, '?'); + output(\%out, $last_code); + return 1; } sub output { my ($out, $code, $type) = @_; - my $match = ${${$out}{types}}{$type}; - my $type_change = (not $$out{start_type} or $type ne $$out{start_type}); - $match = not $match if $opt_n; - if ($match and (not $$out{in_run} or $type_change)) { - end_run($out, $code-1); + 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); - } elsif (not $match and $$out{in_run}) { - end_run($out, $code-1); } + $$out{prev_code} = $code; } sub start_run { my ($out, $code, $type) = @_; $$out{start_code} = $code; - $$out{start_type} = $type; + $$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{start_type}; + printf "\t{ 0x%04x, 0x%04x }, /* %s */\n", $$out{start_code}, $code, $$out{run_type}; $$out{in_run} = 0; } diff --git a/contrib/less/optfunc.c b/contrib/less/optfunc.c index c3bb6b2d9..9185c011b 100644 --- a/contrib/less/optfunc.c +++ b/contrib/less/optfunc.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -47,9 +47,11 @@ 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; @@ -67,6 +69,12 @@ extern int bo_fg_color, bo_bg_color; 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 @@ -80,6 +88,7 @@ opt_o(type, s) char *s; { PARG parg; + char *filename; if (secure) { @@ -105,7 +114,9 @@ opt_o(type, s) s = skipsp(s); if (namelogfile != NULL) free(namelogfile); - namelogfile = lglob(s); + filename = lglob(s); + namelogfile = shell_unquote(filename); + free(filename); use_logfile(namelogfile); sync_logfile(); break; @@ -179,7 +190,7 @@ opt_j(type, s) } else { - sprintf(buf, ".%06d", jump_sline_fraction); + sprintf(buf, ".%06ld", jump_sline_fraction); len = (int) strlen(buf); while (len > 2 && buf[len-1] == '0') len--; @@ -244,7 +255,7 @@ opt_shift(type, s) } else { - sprintf(buf, ".%06d", shift_count_fraction); + sprintf(buf, ".%06ld", shift_count_fraction); len = (int) strlen(buf); while (len > 2 && buf[len-1] == '0') len--; @@ -335,6 +346,7 @@ opt__T(type, s) char *s; { PARG parg; + char *filename; switch (type) { @@ -345,7 +357,9 @@ opt__T(type, s) s = skipsp(s); if (tags != NULL && tags != ztags) free(tags); - tags = lglob(s); + filename = lglob(s); + tags = shell_unquote(filename); + free(filename); break; case QUERY: parg.p_string = tags; @@ -361,7 +375,7 @@ opt__T(type, s) public void opt_p(type, s) int type; - register char *s; + char *s; { switch (type) { @@ -397,9 +411,9 @@ opt_p(type, s) public void opt__P(type, s) int type; - register char *s; + char *s; { - register char **proto; + char **proto; PARG parg; switch (type) @@ -517,7 +531,7 @@ opt__V(type, s) putstr("no "); #endif putstr("regular expressions)\n"); - putstr("Copyright (C) 1984-2015 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"); @@ -539,12 +553,27 @@ colordesc(s, fg_color, bg_color) { 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; @@ -558,6 +587,14 @@ colordesc(s, fg_color, bg_color) 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; @@ -573,6 +610,8 @@ opt_D(type, s) int type; char *s; { + PARG p; + switch (type) { case INIT: @@ -594,8 +633,11 @@ opt_D(type, s) 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) @@ -605,6 +647,8 @@ opt_D(type, s) } break; case QUERY: + p.p_string = (sgr_mode) ? "on" : "off"; + error("SGR mode is %s", &p); break; } } @@ -616,7 +660,7 @@ opt_D(type, s) public void opt_x(type, s) int type; - register char *s; + char *s; { extern int tabstops[]; extern int ntabstops; @@ -674,7 +718,7 @@ opt_x(type, s) public void opt_quote(type, s) int type; - register char *s; + char *s; { char buf[3]; PARG parg; @@ -709,6 +753,40 @@ opt_quote(type, s) } } +/* + * 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. diff --git a/contrib/less/option.c b/contrib/less/option.c index 256f5697b..8ba67bce3 100644 --- a/contrib/less/option.c +++ b/contrib/less/option.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ propt(c) scan_option(s) char *s; { - register struct loption *o; - register int optc; + struct loption *o; + int optc; char *optname; char *printopt; char *str; @@ -305,7 +305,7 @@ toggle_option(o, lower, s, how_toggle) char *s; int how_toggle; { - register int num; + int num; int no_prompt; int err; PARG parg; @@ -568,8 +568,8 @@ optstring(s, p_str, printopt, validchars) char *printopt; char *validchars; { - register char *p; - register char *out; + char *p; + char *out; if (*s == '\0') { @@ -632,9 +632,9 @@ getnum(sp, printopt, errp) char *printopt; int *errp; { - register char *s; - register int n; - register int neg; + char *s; + int n; + int neg; s = skipsp(*sp); neg = FALSE; @@ -669,7 +669,7 @@ getfraction(sp, printopt, errp) char *printopt; int *errp; { - register char *s; + char *s; long frac = 0; int fraclen = 0; diff --git a/contrib/less/option.h b/contrib/less/option.h index dc97d75f7..b253da86f 100644 --- a/contrib/less/option.h +++ b/contrib/less/option.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ struct loption 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 */ }; diff --git a/contrib/less/opttbl.c b/contrib/less/opttbl.c index b896391aa..0c68ccc3c 100644 --- a/contrib/less/opttbl.c +++ b/contrib/less/opttbl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 quit_on_intr; /* Quit on interrupt */ 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 keypad_optname = { "no-keypad", NULL }; 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 @@ static struct loption option[] = }, #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 @@ static struct loption option[] = 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 @@ static struct loption option[] = public void init_option() { - register struct loption *o; + struct loption *o; char *p; p = lgetenv("LESS_IS_MORE"); @@ -492,7 +499,7 @@ init_option() findopt(c) int c; { - register struct loption *o; + struct loption *o; for (o = option; o->oletter != '\0'; o++) { @@ -533,9 +540,9 @@ findopt_name(p_optname, p_oname, p_err) 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; diff --git a/contrib/less/os.c b/contrib/less/os.c index 530abe19d..df117610d 100644 --- a/contrib/less/os.c +++ b/contrib/less/os.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -62,10 +62,10 @@ extern int sigs; 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 @@ -226,8 +226,8 @@ strerror(err) errno_message(filename) char *filename; { - register char *p; - register char *m; + char *p; + char *m; int len; #if HAVE_ERRNO #if MUST_DEFINE_ERRNO @@ -271,7 +271,8 @@ muldiv(val, num, den) */ public int percentage(num, den) - POSITION num, den; + POSITION num; + POSITION den; { return (int) muldiv(num, (POSITION) 100, den); } diff --git a/contrib/less/output.c b/contrib/less/output.c index d6cfc3826..c6a998120 100644 --- a/contrib/less/output.c +++ b/contrib/less/output.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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,6 +15,9 @@ #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() */ @@ -37,6 +40,10 @@ extern int bo_fg_color, bo_bg_color; 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 /* @@ -45,8 +52,8 @@ extern int bl_fg_color, bl_bg_color; public void put_line() { - register int c; - register int i; + int c; + int i; int a; if (ABORT_SIGS()) @@ -95,8 +102,8 @@ static char *ob = obuf; public void flush() { - register int n; - register int fd; + int n; + int fd; n = (int) (ob - obuf); if (n == 0) @@ -126,8 +133,9 @@ flush() * 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 @@ flush() }; #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 @@ flush() */ 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; @@ -212,34 +230,60 @@ flush() 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 */ 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,62 +291,88 @@ flush() 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; } 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) { -#if MSDOS_COMPILER==WIN32C - fg |= FOREGROUND_INTENSITY; - bg |= BACKGROUND_INTENSITY; -#else - fg = bo_fg_color; - bg = bo_bg_color; -#endif + f = bg | bgi; + b = fg | fgi; } 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) + { + f = fg | fgi; + b = bg | bgi; + } + } else { - fg = bl_fg_color; - bg = bl_bg_color; + 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; + } } - fg &= 0xf; - bg &= 0xf; - WIN32setcolors(fg, bg); + if (at & 16) + f = b ^ 8; + f &= 0xf; +#if MSDOS_COMPILER==WIN32C + b &= 0xf | (COMMON_LVB_UNDERSCORE >> 4); +#else + b &= 0xf; +#endif + WIN32setcolors(f, b); p_next = anchor = p + 1; } else p_next++; @@ -381,7 +451,7 @@ putchr(c) */ public void putstr(s) - register char *s; + constant char *s; { while (*s != '\0') putchr(*s++); @@ -398,7 +468,7 @@ void funcname(num, buf) \ { \ 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 { \ @@ -446,11 +516,11 @@ iprint_linenum(num) */ 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 @@ less_printf(fmt, parg) col += iprint_linenum(parg->p_linenum); parg++; break; + case '%': + putchr('%'); + break; } } } @@ -545,7 +618,7 @@ error(fmt, parg) get_return(); lower_left(); - clear_eol(); + clear_eol(); if (col >= sc_width) /* @@ -590,7 +663,7 @@ query(fmt, parg) char *fmt; PARG *parg; { - register int c; + int c; int col = 0; if (any_display && is_tty) diff --git a/contrib/less/pattern.c b/contrib/less/pattern.c index 71141c7d0..563bde0cc 100644 --- a/contrib/less/pattern.c +++ b/contrib/less/pattern.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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; @@ -23,7 +22,7 @@ extern int caseless; 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) @@ -32,8 +31,6 @@ compile_pattern2(pattern, search_type, comp_pattern, show_error) #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)) { @@ -42,13 +39,15 @@ compile_pattern2(pattern, search_type, comp_pattern, 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); @@ -56,13 +55,15 @@ compile_pattern2(pattern, search_type, comp_pattern, 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; @@ -75,35 +76,32 @@ compile_pattern2(pattern, search_type, comp_pattern, 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) { 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) { 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; reg_show_error = show_error; comp = regcomp(pattern); reg_show_error = 1; @@ -115,9 +113,9 @@ compile_pattern2(pattern, search_type, comp_pattern, show_error) */ return (-1); } - if (*pcomp != NULL) - free(*pcomp); - *pcomp = comp; + if (*comp_pattern != NULL) + free(*comp_pattern); + *comp_pattern = comp; #endif } return (0); @@ -130,7 +128,7 @@ compile_pattern2(pattern, search_type, comp_pattern, show_error) compile_pattern(pattern, search_type, comp_pattern) char *pattern; int search_type; - void **comp_pattern; + PATTERN_TYPE *comp_pattern; { char *cvt_pattern; int result; @@ -153,41 +151,41 @@ compile_pattern(pattern, search_type, comp_pattern) */ 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 } @@ -198,7 +196,7 @@ uncompile_pattern(pattern) valid_pattern(pattern) char *pattern; { - void *comp_pattern; + PATTERN_TYPE comp_pattern; int result; CLEAR_PATTERN(comp_pattern); @@ -214,7 +212,7 @@ valid_pattern(pattern) */ public int is_null_pattern(pattern) - void *pattern; + PATTERN_TYPE pattern; { #if HAVE_GNU_REGEX return (pattern == NULL); @@ -251,9 +249,9 @@ match(pattern, pattern_len, buf, buf_len, pfound, pend) 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++) { @@ -286,7 +284,7 @@ match(pattern, pattern_len, buf, buf_len, pfound, pend) */ 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; @@ -296,24 +294,6 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) 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 @@ -326,9 +306,9 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) #if HAVE_GNU_REGEX { struct re_registers search_regs; - spattern->not_bol = notbol; - spattern->regs_allocated = REGS_UNALLOCATED; - 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]; @@ -345,7 +325,7 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) rm.rm_so = 0; rm.rm_eo = line_len; #endif - matched = !regexec(spattern, line, 1, &rm, flags); + matched = !regexec(pattern, line, 1, &rm, flags); if (matched) { #ifndef __WATCOMC__ @@ -362,7 +342,7 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) { 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) { @@ -379,21 +359,21 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) *sp = *ep = NULL; #endif #if HAVE_REGCMP - *ep = regex(spattern, line); + *ep = regex(pattern, line); matched = (*ep != NULL); if (matched) *sp = __loc1; #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 } diff --git a/contrib/less/pattern.h b/contrib/less/pattern.h index 712fdcf89..9b559d713 100644 --- a/contrib/less/pattern.h +++ b/contrib/less/pattern.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 -#define DEFINE_PATTERN(name) struct re_pattern_buffer *name +#define PATTERN_TYPE struct re_pattern_buffer * #define CLEAR_PATTERN(name) name = NULL #endif @@ -18,43 +18,43 @@ #include #ifdef REG_EXTENDED extern int less_is_more; -#define REGCOMP_FLAG (less_is_more ? 0 : REG_EXTENDED) +#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 -#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" extern int reg_show_error; -#define DEFINE_PATTERN(name) struct regexp *name +#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 diff --git a/contrib/less/pckeys.h b/contrib/less/pckeys.h index 8fb680090..e0d86e7bd 100644 --- a/contrib/less/pckeys.h +++ b/contrib/less/pckeys.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/position.c b/contrib/less/position.c index dc80fd636..ae3899c1e 100644 --- a/contrib/less/position.c +++ b/contrib/less/position.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ extern int sc_width, sc_height; * 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 @@ position(where) add_forw_pos(pos) POSITION pos; { - register int i; + int i; /* * Scroll the position table up. @@ -77,7 +78,7 @@ add_forw_pos(pos) add_back_pos(pos) POSITION pos; { - register int i; + int i; /* * Scroll the position table down. @@ -93,7 +94,7 @@ add_back_pos(pos) public void pos_clear() { - register int i; + int i; for (i = 0; i < sc_height; i++) table[i] = NULL_POSITION; @@ -115,7 +116,7 @@ pos_init() */ if (table != NULL) { - get_scrpos(&scrpos); + get_scrpos(&scrpos, TOP); free((char*)table); } else scrpos.pos = NULL_POSITION; @@ -135,7 +136,7 @@ pos_init() onscreen(pos) POSITION pos; { - register int i; + int i; if (pos < table[0]) return (-1); @@ -159,7 +160,7 @@ empty_lines(s, e) int s; int e; { - register int i; + int i; for (i = s; i <= e; i++) if (table[i] != NULL_POSITION && table[i] != 0) @@ -176,22 +177,34 @@ empty_lines(s, e) * 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; scrpos->pos = table[i]; return; } + if (i == last) break; + } /* * The screen is empty. */ @@ -208,7 +221,7 @@ get_scrpos(scrpos) * relative to the bottom of the screen. */ public int -adjsline(sline) +sindex_from_sline(sline) int sline; { /* @@ -218,12 +231,12 @@ adjsline(sline) 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. */ diff --git a/contrib/less/position.h b/contrib/less/position.h index e0e2bff49..30678962c 100644 --- a/contrib/less/position.h +++ b/contrib/less/position.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/prompt.c b/contrib/less/prompt.c index 50ced97bf..3067d2bbe 100644 --- a/contrib/less/prompt.c +++ b/contrib/less/prompt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -394,9 +394,9 @@ protochar(c, where, iseditproto) */ 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 @@ wherechar(p, wp) 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 @@ pr_expand(proto, maxwidth) constant char *proto; int maxwidth; { - register constant char *p; - register int c; + constant char *p; + int c; int where; mp = message; diff --git a/contrib/less/screen.c b/contrib/less/screen.c index 8f8a433af..dfee5d217 100644 --- a/contrib/less/screen.c +++ b/contrib/less/screen.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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_save = INVALID_HANDLE_VALUE; /* previous console */ 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_fg_color; /* Color of blinking text */ 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 above_mem, below_mem; /* Memory retained above/below screen */ 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 wscroll; 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 @@ ltgetstr(capname, pp) public void scrsize() { - register char *s; + char *s; int sys_height; int sys_width; #if !MSDOS_COMPILER @@ -1106,6 +1117,7 @@ get_term() so_bg_color = 9; bl_fg_color = 15; bl_bg_color = 0; + sgr_mode = 0; /* * Get size of the screen. @@ -1117,7 +1129,7 @@ get_term() #else /* !MSDOS_COMPILER */ char *sp; - register char *t1, *t2; + char *t1, *t2; char *term; char termbuf[TERMBUF_SIZE]; @@ -1206,7 +1218,8 @@ get_term() 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 @@ _settextposition(int row, int col) 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 @@ win32_init_term() 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 @@ win32_init_term() (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 @@ win32_deinit_term() 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 @@ deinit() #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 @@ win32_scroll_up(n) public void lower_left() { + if (!init_done) + return; #if !MSDOS_COMPILER tputs(sc_lower_left, 1, putchr); #else @@ -1893,14 +1921,14 @@ check_winch() * 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 @@ create_flash() } #else #if MSDOS_COMPILER==BORLANDC - register int n; + int n; whitescreen = (unsigned short *) malloc(sc_width * sc_height * sizeof(short)); @@ -1951,7 +1979,7 @@ create_flash() 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 @@ win32_kbhit(tty) 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 @@ WIN32textout(text, len) { #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'; diff --git a/contrib/less/scrsize.c b/contrib/less/scrsize.c index 91fc03f25..001c55ace 100644 --- a/contrib/less/scrsize.c +++ b/contrib/less/scrsize.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. diff --git a/contrib/less/search.c b/contrib/less/search.c index e824acb4a..72191889a 100644 --- a/contrib/less/search.c +++ b/contrib/less/search.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 jump_sline; 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; @@ -103,7 +102,7 @@ static struct hilite_tree filter_anchor = HILITE_INITIALIZER(); * search pattern and filter pattern. */ struct pattern_info { - DEFINE_PATTERN(compiled); + PATTERN_TYPE compiled; char* text; int search_type; }; @@ -259,7 +258,7 @@ prev_pattern(info) repaint_hilite(on) int on; { - int slinenum; + int sindex; POSITION pos; int save_hide_hilite; @@ -281,13 +280,13 @@ repaint_hilite(on) 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; (void) forw_line(pos); - goto_line(slinenum); + goto_line(sindex); put_line(); } lower_left(); @@ -300,7 +299,7 @@ repaint_hilite(on) public void clear_attn() { - int slinenum; + int sindex; POSITION old_start_attnpos; POSITION old_end_attnpos; POSITION pos; @@ -321,17 +320,17 @@ clear_attn() 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; } @@ -349,9 +348,14 @@ undo_search() { 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); @@ -621,11 +625,18 @@ is_hilited(pos, epos, nohide, p_matches) 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) /* @@ -1015,27 +1026,6 @@ hilite_line(linepos, line, line_len, chpos, sp, ep, cvt_ops) } #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. @@ -1045,7 +1035,7 @@ hilite_screen() { 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); @@ -1080,7 +1070,7 @@ search_pos(search_type) int search_type; { POSITION pos; - int linenum; + int sindex; if (empty_screen()) { @@ -1103,7 +1093,7 @@ search_pos(search_type) pos = ch_length(); } } - linenum = 0; + sindex = 0; } else { int add_one = 0; @@ -1114,18 +1104,18 @@ search_pos(search_type) * 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)) { /* * 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 { /* @@ -1133,11 +1123,11 @@ search_pos(search_type) * It starts at the jump target (if searching backwards), * or at the jump target plus one (if forwards). */ - linenum = adjsline(jump_sline); + sindex = sindex_from_sline(jump_sline); if (search_type & SRCH_FORW) add_one = 1; } - pos = position(linenum); + pos = position(sindex); if (add_one) pos = forw_raw_line(pos, (char **)NULL, (int *)NULL); } @@ -1149,17 +1139,17 @@ search_pos(search_type) { while (pos == NULL_POSITION) { - if (++linenum >= sc_height) + if (++sindex >= sc_height) break; - pos = position(linenum); + pos = position(sindex); } } else { while (pos == NULL_POSITION) { - if (--linenum < 0) + if (--sindex < 0) break; - pos = position(linenum); + pos = position(sindex); } } return (pos); @@ -1292,6 +1282,8 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos) hl.hl_startpos = linepos; hl.hl_endpos = pos; add_hilite(&filter_anchor, &hl); + free(cline); + free(chpos); continue; } } @@ -1380,6 +1372,30 @@ hist_pattern(search_type) #endif /* CMD_HISTORY */ } +/* + * 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. @@ -1415,7 +1431,7 @@ search(search_type, pattern, n) return -1; } #if HILITE_SEARCH - if (hilite_search == OPT_ON) + if (hilite_search == OPT_ON || status_col) { /* * Erase the highlights currently on screen. @@ -1442,7 +1458,7 @@ search(search_type, pattern, n) 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. @@ -1452,7 +1468,7 @@ search(search_type, pattern, n) hide_hilite = 0; clr_hilite(); } - if (hilite_search == OPT_ONPLUS) + if (hilite_search == OPT_ONPLUS || status_col) { /* * Highlight any matches currently on screen, @@ -1474,7 +1490,8 @@ search(search_type, pattern, n) */ 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); } @@ -1487,7 +1504,7 @@ search(search_type, pattern, n) * 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. */ @@ -1505,7 +1522,7 @@ search(search_type, pattern, n) } #if HILITE_SEARCH - if (hilite_search == OPT_ON) + if (hilite_search == OPT_ON || status_col) /* * Display new hilites in the matching line. */ diff --git a/contrib/less/signal.c b/contrib/less/signal.c index caa21431d..b2736d274 100644 --- a/contrib/less/signal.c +++ b/contrib/less/signal.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -82,22 +82,16 @@ stop(type) } #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 */ @@ -106,13 +100,12 @@ winch(type) winch(type) int type; { - LSIGNAL(SIGWIND, winch); + LSIGNAL(SIG_LESSWINDOW, winch); sigs |= S_WINCH; if (reading) intread(); } #endif -#endif #if MSDOS_COMPILER==WIN32C /* @@ -137,6 +130,13 @@ wbreak_handler(dwCtrlType) } #endif + static RETSIGTYPE +terminate(type) + int type; +{ + quit(15); +} + /* * Set up the signal handlers. */ @@ -164,6 +164,9 @@ init_signals(on) #endif #ifdef SIGQUIT (void) LSIGNAL(SIGQUIT, SIG_IGN); +#endif +#ifdef SIGTERM + (void) LSIGNAL(SIGTERM, terminate); #endif } else { @@ -185,6 +188,9 @@ init_signals(on) #endif #ifdef SIGQUIT (void) LSIGNAL(SIGQUIT, SIG_DFL); +#endif +#ifdef SIGTERM + (void) LSIGNAL(SIGTERM, SIG_DFL); #endif } } @@ -196,7 +202,7 @@ init_signals(on) public void psignals() { - register int tsignals; + int tsignals; if ((tsignals = sigs) == 0) return; diff --git a/contrib/less/tags.c b/contrib/less/tags.c index 5acf3747b..ebb30488d 100644 --- a/contrib/less/tags.c +++ b/contrib/less/tags.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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,7 @@ static int curseq; extern int linenums; extern int sigs; +extern int ctldisp; enum tag_result { TAG_FOUND, @@ -63,8 +64,6 @@ struct taglist { 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 */ @@ -72,6 +71,8 @@ struct tag { 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) \ @@ -90,7 +91,7 @@ static struct tag *curtag; public void cleantags() { - register struct tag *tp; + struct tag *tp; /* * Delete any existing tag list. @@ -100,6 +101,8 @@ cleantags() while ((tp = taglist.tl_first) != TAG_END) { TAG_RM(tp); + free(tp->tag_file); + free(tp->tag_pattern); free(tp); } curtag = NULL; @@ -117,7 +120,7 @@ maketagent(name, file, linenum, pattern, endline) 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)); @@ -170,7 +173,7 @@ gettagtype() */ public void findtag(tag) - register char *tag; + char *tag; { int type = gettagtype(); enum tag_result result; @@ -266,11 +269,11 @@ curr_tag() */ 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; @@ -384,6 +387,26 @@ edit_tagfile() 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(). @@ -398,13 +421,14 @@ ctagsearch() { 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 @@ -418,7 +442,7 @@ ctagsearch() * 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++; @@ -439,19 +463,21 @@ ctagsearch() 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 = (int) 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); } } diff --git a/contrib/less/ttyin.c b/contrib/less/ttyin.c index 129eea158..87cffc28e 100644 --- a/contrib/less/ttyin.c +++ b/contrib/less/ttyin.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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 @@ getchr() 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 @@ getchr() #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; diff --git a/contrib/less/ubin.uni b/contrib/less/ubin.uni index 39ec303f7..888fe75ca 100644 --- a/contrib/less/ubin.uni +++ b/contrib/less/ubin.uni @@ -1,31 +1,16 @@ -/* Generated by "./mkutable -f2 Cc Cf Cs Co Zl Zp -- unicode/UnicodeData.txt" on Mon Jul 14 16:21:22 PDT 2014 */ - { 0x0000, 0x001f }, /* Cc */ +/* 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 */ - { 0x00ad, 0x00ad }, /* Cf */ - { 0x0600, 0x0605 }, /* Cf */ - { 0x061c, 0x061c }, /* Cf */ - { 0x06dd, 0x06dd }, /* Cf */ - { 0x070f, 0x070f }, /* Cf */ - { 0x180e, 0x180e }, /* Cf */ - { 0x200b, 0x200f }, /* Cf */ { 0x2028, 0x2028 }, /* Zl */ { 0x2029, 0x2029 }, /* Zp */ - { 0x202a, 0x202e }, /* Cf */ - { 0x2060, 0x2064 }, /* Cf */ - { 0x2066, 0x206f }, /* Cf */ { 0xd800, 0xd800 }, /* Cs */ { 0xdb7f, 0xdb80 }, /* Cs */ { 0xdbff, 0xdc00 }, /* Cs */ { 0xdfff, 0xdfff }, /* Cs */ { 0xe000, 0xe000 }, /* Co */ { 0xf8ff, 0xf8ff }, /* Co */ - { 0xfeff, 0xfeff }, /* Cf */ - { 0xfff9, 0xfffb }, /* Cf */ - { 0x110bd, 0x110bd }, /* Cf */ - { 0x1bca0, 0x1bca3 }, /* Cf */ - { 0x1d173, 0x1d17a }, /* Cf */ - { 0xe0001, 0xe0001 }, /* Cf */ - { 0xe0020, 0xe007f }, /* Cf */ { 0xf0000, 0xf0000 }, /* Co */ { 0xffffd, 0xffffd }, /* Co */ { 0x100000, 0x100000 }, /* Co */ diff --git a/contrib/less/version.c b/contrib/less/version.c index 87b0b42bc..1432b374e 100644 --- a/contrib/less/version.c +++ b/contrib/less/version.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1984-2015 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. @@ -789,8 +789,70 @@ 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. +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[] = "481"; +char version[] = "530"; diff --git a/contrib/less/wide.uni b/contrib/less/wide.uni index b43f7d359..801a3525e 100644 --- a/contrib/less/wide.uni +++ b/contrib/less/wide.uni @@ -1,81 +1,108 @@ -/* Generated by "./mkutable -f1 W -- unicode/EastAsianWidth.txt" on Mon Jul 14 16:21:23 PDT 2014 */ - { 0x1100, 0x1100 }, /* W */ +/* 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 */ - { 0x2e80, 0x2e80 }, /* W */ - { 0x2e9b, 0x2e9b }, /* W */ - { 0x2f00, 0x2f00 }, /* W */ - { 0x2ff0, 0x2ff0 }, /* W */ - { 0x3001, 0x3001 }, /* W */ - { 0x3004, 0x3012 }, /* W */ - { 0x3014, 0x301e }, /* W */ - { 0x3020, 0x3021 }, /* W */ - { 0x302a, 0x302a }, /* W */ - { 0x302e, 0x302e }, /* W */ - { 0x3030, 0x3031 }, /* W */ - { 0x3036, 0x3036 }, /* W */ - { 0x3038, 0x3038 }, /* W */ - { 0x303b, 0x303e }, /* W */ - { 0x3041, 0x3041 }, /* W */ - { 0x3099, 0x3099 }, /* W */ - { 0x309b, 0x309b }, /* W */ - { 0x309d, 0x309d }, /* W */ - { 0x309f, 0x30a1 }, /* W */ - { 0x30fb, 0x30fc }, /* W */ - { 0x30ff, 0x30ff }, /* W */ - { 0x3105, 0x3105 }, /* W */ - { 0x3131, 0x3131 }, /* W */ - { 0x3190, 0x3190 }, /* W */ - { 0x3192, 0x3192 }, /* W */ - { 0x3196, 0x3196 }, /* W */ - { 0x31a0, 0x31a0 }, /* W */ - { 0x31c0, 0x31c0 }, /* W */ - { 0x31f0, 0x31f0 }, /* W */ - { 0x3200, 0x3200 }, /* W */ - { 0x3220, 0x3220 }, /* W */ - { 0x322a, 0x322a }, /* W */ - { 0x3250, 0x3251 }, /* W */ - { 0x3260, 0x3260 }, /* W */ - { 0x3280, 0x3280 }, /* W */ - { 0x328a, 0x328a }, /* W */ - { 0x32b1, 0x32b1 }, /* W */ - { 0x32c0, 0x32c0 }, /* W */ - { 0x3300, 0x3300 }, /* W */ - { 0x3400, 0x3400 }, /* W */ - { 0x4db6, 0x4db6 }, /* W */ - { 0x4e00, 0x4e00 }, /* W */ - { 0x9fcd, 0x9fcd }, /* W */ - { 0xa000, 0xa000 }, /* W */ - { 0xa015, 0xa016 }, /* W */ - { 0xa490, 0xa490 }, /* W */ - { 0xa960, 0xa960 }, /* W */ - { 0xac00, 0xac00 }, /* W */ - { 0xf900, 0xf900 }, /* W */ - { 0xfa6e, 0xfa6e }, /* W */ - { 0xfa70, 0xfa70 }, /* W */ - { 0xfada, 0xfada }, /* W */ - { 0xfe10, 0xfe10 }, /* W */ - { 0xfe17, 0xfe19 }, /* W */ - { 0xfe30, 0xfe31 }, /* W */ - { 0xfe33, 0xfe33 }, /* W */ - { 0xfe35, 0xfe45 }, /* W */ - { 0xfe47, 0xfe49 }, /* W */ - { 0xfe4d, 0xfe4d }, /* W */ - { 0xfe50, 0xfe50 }, /* W */ - { 0xfe54, 0xfe54 }, /* W */ - { 0xfe58, 0xfe5f }, /* W */ - { 0xfe62, 0xfe64 }, /* W */ - { 0xfe68, 0xfe6a }, /* W */ - { 0x1b000, 0x1b000 }, /* W */ - { 0x1f200, 0x1f200 }, /* W */ - { 0x1f210, 0x1f210 }, /* W */ - { 0x1f240, 0x1f240 }, /* W */ - { 0x1f250, 0x1f250 }, /* W */ - { 0x20000, 0x20000 }, /* W */ - { 0x2a6d7, 0x2a6d7 }, /* W */ - { 0x2a700, 0x2a700 }, /* W */ - { 0x2b735, 0x2b735 }, /* W */ - { 0x2b740, 0x2b740 }, /* W */ - { 0x2b81e, 0x2b81e }, /* W */ - { 0x2f800, 0x2f800 }, /* W */ - { 0x2fa1e, 0x2fa1e }, /* W */ - { 0x30000, 0x30000 }, /* 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 */ diff --git a/usr.bin/less/defines.h b/usr.bin/less/defines.h index 9b0f5c92b..d013b0510 100644 --- a/usr.bin/less/defines.h +++ b/usr.bin/less/defines.h @@ -135,6 +135,11 @@ */ #define TGETENT_OK 1 +/* + * HAVE_ANSI_PROTOS is 1 if your compiler supports ANSI function prototypes. + */ +#define HAVE_ANSI_PROTOS 1 + /* * HAVE_SYS_TYPES_H is 1 if your system has . */ @@ -164,7 +169,7 @@ /* * Default shell metacharacters and meta-escape character. */ -#define DEF_METACHARS "; *?\t\n'\"()<>[]|&^`#\\$%=~" +#define DEF_METACHARS "; *?\t\n'\"()<>[]|&^`#\\$%=~{}," #define DEF_METAESCAPE "\\" /* -- 2.45.0