Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Sep 2021 10:31:08 GMT
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 4581de213ef4 - stable/12 - import nvi 2.2.0-3bbdfe4
Message-ID:  <202109221031.18MAV8OE009340@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=4581de213ef452b0e593a7d87b930d48d64aa71d

commit 4581de213ef452b0e593a7d87b930d48d64aa71d
Author:     Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2021-05-21 20:50:50 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2021-09-22 10:29:20 +0000

    import nvi 2.2.0-3bbdfe4
    
    (cherry picked from commit 6680e5a52f8abf059bbbd3e0be66d9dce476cdf9)
---
 contrib/nvi/.gitignore                           |   5 +
 contrib/nvi/CMakeLists.txt                       |  38 +-
 contrib/nvi/cl/cl.h                              |   3 -
 contrib/nvi/cl/cl_read.c                         |   4 +-
 contrib/nvi/cl/extern.h                          |  31 --
 contrib/nvi/common/common.h                      |   6 +-
 contrib/nvi/common/conv.h                        |   2 +-
 contrib/nvi/common/exf.c                         |  27 ++
 contrib/nvi/common/extern.h                      | 131 -------
 contrib/nvi/common/key.h                         |   6 +-
 contrib/nvi/common/options.h                     |   4 +
 contrib/nvi/common/recover.c                     |  12 +
 contrib/nvi/ex/ex.c                              |   3 +-
 contrib/nvi/ex/ex_cscope.c                       |  14 +
 contrib/nvi/ex/extern.h                          | 131 -------
 contrib/nvi/man/vi.1                             |  50 ++-
 contrib/nvi/vi/extern.h                          | 145 --------
 contrib/nvi/vi/v_increment.c                     |   4 +-
 contrib/nvi/vi/vs_line.c                         |   2 +-
 usr.bin/vi/Makefile                              |   5 +-
 usr.bin/vi/config.h                              |   9 +
 {contrib/nvi => usr.bin/vi}/ex/version.h         |   2 +
 {contrib/nvi/ex => usr.bin/vi}/ex_def.h          |   0
 usr.bin/vi/extern.h                              | 444 +++++++++++++++++++++++
 {contrib/nvi/common => usr.bin/vi}/options_def.h |   0
 25 files changed, 607 insertions(+), 471 deletions(-)

diff --git a/contrib/nvi/.gitignore b/contrib/nvi/.gitignore
index aac7860d7299..2b79229e57e0 100644
--- a/contrib/nvi/.gitignore
+++ b/contrib/nvi/.gitignore
@@ -7,3 +7,8 @@ extern.h
 version.h
 tags
 build/
+
+# Ignore files by the GNU Global source code tagging system.
+/GPATH
+/GRTAGS
+/GTAGS
diff --git a/contrib/nvi/CMakeLists.txt b/contrib/nvi/CMakeLists.txt
index 996e0e72de99..66d3ca2aafb0 100644
--- a/contrib/nvi/CMakeLists.txt
+++ b/contrib/nvi/CMakeLists.txt
@@ -13,20 +13,28 @@ project(nvi2 C)
 
 include(CheckIncludeFiles)
 include(CheckFunctionExists)
+include(CheckSymbolExists)
 include(CheckStructHasMember)
 include(CheckCSourceCompiles)
+include(CheckCCompilerFlag)
 
 mark_as_advanced(CMAKE_INSTALL_PREFIX)
 
 option(USE_WIDECHAR "Enable wide character support" ON)
 option(USE_ICONV "Enable iconv support" ON)
 
-add_compile_options(-fcolor-diagnostics)
+check_c_compiler_flag(-fcolor-diagnostics USE_FCOLOR_DIAGNOSTICS)
+if(USE_FCOLOR_DIAGNOSTICS)
+    add_compile_options(-fcolor-diagnostics)
+endif()
+
 add_compile_options($<$<CONFIG:Debug>:-Wall>)
 add_compile_options($<$<CONFIG:Debug>:-Wno-parentheses>)
 add_compile_options($<$<CONFIG:Debug>:-Wno-uninitialized>)
 add_compile_options($<$<CONFIG:Debug>:-Wmissing-prototypes>)
-add_compile_options($<$<CONFIG:Debug>:-Wsystem-headers>)
+if (NOT APPLE)
+    add_compile_options($<$<CONFIG:Debug>:-Wsystem-headers>)
+endif()
 add_compile_options($<$<CONFIG:Release>:-Wuninitialized>)
 add_compile_options($<$<CONFIG:Release>:-Wno-dangling-else>)
 add_compile_options(-Wstack-protector -fstack-protector)
@@ -126,6 +134,11 @@ if(NOT RESOLV_IN_LIBC)
     target_link_libraries(nvi PRIVATE ${RESOLV_LIBRARY})
 endif()
 
+check_symbol_exists(asprintf "stdio.h" ASPRINTF_IN_STDIO_H)
+if(NOT ASPRINTF_IN_STDIO_H)
+    target_compile_definitions(nvi PRIVATE _GNU_SOURCE)
+endif()
+
 if(USE_WIDECHAR)
     find_library(CURSES_LIBRARY NAMES ncursesw cursesw curses HINTS /usr/lib)
     find_library(TERMINFO_LIBRARY NAMES tinfow terminfo HINTS /usr/lib)
@@ -142,7 +155,10 @@ else()
     target_compile_options(nvi PRIVATE -Wno-pointer-sign)
 endif()
 
-target_link_libraries(nvi PRIVATE ${CURSES_LIBRARY} ${TERMINFO_LIBRARY})
+target_link_libraries(nvi PRIVATE ${CURSES_LIBRARY})
+if(TERMINFO_LIBRARY)
+    target_link_libraries(nvi PRIVATE ${TERMINFO_LIBRARY})
+endif()
 
 if(USE_ICONV)
     check_function_exists(iconv ICONV_IN_LIBC)
@@ -189,6 +205,18 @@ check_function_exists(dbopen DBOPEN_IN_LIBC)
 if(NOT DBOPEN_IN_LIBC)
     target_link_libraries(nvi PRIVATE db1)
 endif()
+if (APPLE)
+    # Avoid using an incompatible db.h installed to /usr/local (since this is
+    # part of the default search path on macOS)
+    set(DB_H_GUESS "${CMAKE_OSX_SYSROOT}/usr/include/db.h")
+    if (NOT EXISTS ${DB_H_GUESS})
+        message(FATAL_ERROR "Could not find db.h at the expected path (${DB_H_GUESS}).")
+    endif()
+    add_definitions("-DDB_H_ABS_PATH=<${DB_H_GUESS}>")
+else()
+    find_path(DB_INCLUDE_DIR db.h PATH_SUFFIXES db1)
+    target_include_directories(nvi PRIVATE ${DB_INCLUDE_DIR})
+endif()
 
 check_include_files(libutil.h HAVE_LIBUTIL_H)
 check_include_files(ncurses.h HAVE_NCURSES_H)
@@ -196,6 +224,10 @@ check_include_files(ncursesw/ncurses.h HAVE_NCURSESW_NCURSES_H)
 check_include_files(pty.h HAVE_PTY_H)
 check_include_files(term.h HAVE_TERM_H)
 check_struct_has_member("struct dirent" d_namlen dirent.h HAVE_DIRENT_D_NAMLEN LANGUAGE C)
+check_struct_has_member("struct stat" st_mtimespec
+    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC LANGUAGE C)
+check_struct_has_member("struct stat" st_mtim
+    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM LANGUAGE C)
 
 configure_file(files/config.h.in config.h)
 
diff --git a/contrib/nvi/cl/cl.h b/contrib/nvi/cl/cl.h
index d230a55a56d7..a04c9e9f1b0d 100644
--- a/contrib/nvi/cl/cl.h
+++ b/contrib/nvi/cl/cl.h
@@ -7,9 +7,6 @@
  * See the LICENSE file for redistribution information.
  */
 
-#ifdef USE_WIDECHAR
-#define _XOPEN_SOURCE_EXTENDED
-#endif
 #ifdef HAVE_NCURSESW_NCURSES_H
 #include <ncursesw/ncurses.h>
 #elif defined HAVE_NCURSES_H
diff --git a/contrib/nvi/cl/cl_read.c b/contrib/nvi/cl/cl_read.c
index ddf3acc1918c..8dc1d3cbebc9 100644
--- a/contrib/nvi/cl/cl_read.c
+++ b/contrib/nvi/cl/cl_read.c
@@ -317,10 +317,10 @@ cl_resize(SCR *sp, size_t lines, size_t columns)
 	argv[0] = &a;
 	argv[1] = &b;
 
-	a.len = SPRINTF(b1, sizeof(b1), L("lines=%lu"), (u_long)lines);
+	a.len = SPRINTF(b1, SIZE(b1), L("lines=%lu"), (u_long)lines);
 	if (opts_set(sp, argv, NULL))
 		return (1);
-	a.len = SPRINTF(b1, sizeof(b1), L("columns=%lu"), (u_long)columns);
+	a.len = SPRINTF(b1, SIZE(b1), L("columns=%lu"), (u_long)columns);
 	if (opts_set(sp, argv, NULL))
 		return (1);
 	return (0);
diff --git a/contrib/nvi/cl/extern.h b/contrib/nvi/cl/extern.h
deleted file mode 100644
index 7b01ccd3f8cf..000000000000
--- a/contrib/nvi/cl/extern.h
+++ /dev/null
@@ -1,31 +0,0 @@
-int cl_waddstr(SCR *, const CHAR_T *, size_t);
-int cl_addstr(SCR *, const char *, size_t);
-int cl_attr(SCR *, scr_attr_t, int);
-int cl_baud(SCR *, u_long *);
-int cl_bell(SCR *);
-int cl_clrtoeol(SCR *);
-int cl_cursor(SCR *, size_t *, size_t *);
-int cl_deleteln(SCR *);
-int cl_discard(SCR *, SCR **);
-int cl_ex_adjust(SCR *, exadj_t);
-int cl_insertln(SCR *);
-int cl_keyval(SCR *, scr_keyval_t, CHAR_T *, int *);
-int cl_move(SCR *, size_t, size_t);
-int cl_refresh(SCR *, int);
-int cl_rename(SCR *, char *, int);
-void cl_setname(GS *, char *);
-int cl_split(SCR *, SCR *);
-int cl_suspend(SCR *, int *);
-void cl_usage(void);
-int sig_init(GS *, SCR *);
-int cl_event(SCR *, EVENT *, u_int32_t, int);
-int cl_screen(SCR *, u_int32_t);
-int cl_quit(GS *);
-int cl_getcap(SCR *, char *, char **);
-int cl_term_init(SCR *);
-int cl_term_end(GS *);
-int cl_fmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t);
-int cl_optchange(SCR *, int, char *, u_long *);
-int cl_omesg(SCR *, CL_PRIVATE *, int);
-int cl_ssize(SCR *, int, size_t *, size_t *, int *);
-int cl_putchar(int);
diff --git a/contrib/nvi/common/common.h b/contrib/nvi/common/common.h
index f2cb42fa9b9c..45f22fb49d1b 100644
--- a/contrib/nvi/common/common.h
+++ b/contrib/nvi/common/common.h
@@ -11,10 +11,10 @@
 #define TCSASOFT 0
 #endif
 
-#ifdef __linux__
-#include "/usr/include/db1/db.h"	/* Only include db1. */
+#ifdef DB_H_ABS_PATH
+#include DB_H_ABS_PATH
 #else
-#include <db.h>			/* Only include db1. */
+#include <db.h>
 #endif
 #include <regex.h>		/* May refer to the bundled regex. */
 
diff --git a/contrib/nvi/common/conv.h b/contrib/nvi/common/conv.h
index ee3efb5a8308..4daa8221ff8f 100644
--- a/contrib/nvi/common/conv.h
+++ b/contrib/nvi/common/conv.h
@@ -28,7 +28,7 @@ typedef int	iconv_t;
 #define KEY_NEEDSWIDE(sp, ch)						\
 	(INTISWIDE(ch) && KEY_LEN(sp, ch) <= 4)
 #define KEY_COL(sp, ch)							\
-	(KEY_NEEDSWIDE(sp, ch) ? CHAR_WIDTH(sp, ch) : KEY_LEN(sp, ch))
+	(KEY_NEEDSWIDE(sp, ch) ? XCHAR_WIDTH(sp, ch) : KEY_LEN(sp, ch))
 
 enum { IC_FE_CHAR2INT, IC_FE_INT2CHAR, IC_IE_CHAR2INT, IC_IE_TO_UTF16 };
 
diff --git a/contrib/nvi/common/exf.c b/contrib/nvi/common/exf.c
index f9eb2150276d..49e39c242648 100644
--- a/contrib/nvi/common/exf.c
+++ b/contrib/nvi/common/exf.c
@@ -199,7 +199,14 @@ file_init(SCR *sp, FREF *frp, char *rcv_name, int flags)
 		if (!LF_ISSET(FS_OPENERR))
 			F_SET(frp, FR_NEWFILE);
 
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+		ep->mtim = sb.st_mtimespec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 		ep->mtim = sb.st_mtim;
+#else
+		ep->mtim.tv_sec = sb.st_mtime;
+		ep->mtim.tv_nsec = 0;
+#endif
 	} else {
 		/*
 		 * XXX
@@ -218,7 +225,14 @@ file_init(SCR *sp, FREF *frp, char *rcv_name, int flags)
 		ep->mdev = sb.st_dev;
 		ep->minode = sb.st_ino;
 
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+		ep->mtim = sb.st_mtimespec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 		ep->mtim = sb.st_mtim;
+#else
+		ep->mtim.tv_sec = sb.st_mtime;
+		ep->mtim.tv_nsec = 0;
+#endif
 
 		if (!S_ISREG(sb.st_mode))
 			msgq_str(sp, M_ERR, oname,
@@ -796,7 +810,13 @@ file_write(SCR *sp, MARK *fm, MARK *tm, char *name, int flags)
 		if (noname && !LF_ISSET(FS_FORCE | FS_APPEND) &&
 		    ((F_ISSET(ep, F_DEVSET) &&
 		    (sb.st_dev != ep->mdev || sb.st_ino != ep->minode)) ||
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+		    timespeccmp(&sb.st_mtimespec, &ep->mtim, !=))) {
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 		    timespeccmp(&sb.st_mtim, &ep->mtim, !=))) {
+#else
+		    sb.st_mtime != ep->mtim.tv_sec)) {
+#endif
 			msgq_str(sp, M_ERR, name, LF_ISSET(FS_POSSIBLE) ?
 "250|%s: file modified more recently than this copy; use ! to override" :
 "251|%s: file modified more recently than this copy");
@@ -895,7 +915,14 @@ success_open:
 			ep->mdev = sb.st_dev;
 			ep->minode = sb.st_ino;
 
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+			ep->mtim = sb.st_mtimespec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 			ep->mtim = sb.st_mtim;
+#else
+			ep->mtim.tv_sec = sb.st_mtime;
+			ep->mtim.tv_nsec = 0;
+#endif
 		}
 	}
 
diff --git a/contrib/nvi/common/extern.h b/contrib/nvi/common/extern.h
deleted file mode 100644
index c887696080de..000000000000
--- a/contrib/nvi/common/extern.h
+++ /dev/null
@@ -1,131 +0,0 @@
-char * codeset(void);
-void conv_init(SCR *, SCR *);
-int conv_enc(SCR *, int, char *);
-void conv_end(SCR *);
-int cut(SCR *, CHAR_T *, MARK *, MARK *, int);
-int cut_line(SCR *, recno_t, size_t, size_t, CB *);
-void cut_close(GS *);
-TEXT *text_init(SCR *, const CHAR_T *, size_t, size_t);
-void text_lfree(TEXTH *);
-void text_free(TEXT *);
-int del(SCR *, MARK *, MARK *, int);
-int looks_utf8(const char *, size_t);
-int looks_utf16(const char *, size_t);
-int decode_utf8(const char *);
-int decode_utf16(const char *, int);
-FREF *file_add(SCR *, char *);
-int file_init(SCR *, FREF *, char *, int);
-int file_end(SCR *, EXF *, int);
-int file_write(SCR *, MARK *, MARK *, char *, int);
-int file_m1(SCR *, int, int);
-int file_m2(SCR *, int);
-int file_m3(SCR *, int);
-int file_aw(SCR *, int);
-void set_alt_name(SCR *, char *);
-lockr_t file_lock(SCR *, char *, int, int);
-int v_key_init(SCR *);
-void v_key_ilookup(SCR *);
-size_t v_key_len(SCR *, ARG_CHAR_T);
-char *v_key_name(SCR *, ARG_CHAR_T);
-e_key_t v_key_val(SCR *, ARG_CHAR_T);
-int v_event_push(SCR *, EVENT *, CHAR_T *, size_t, u_int);
-int v_event_get(SCR *, EVENT *, int, u_int32_t);
-void v_event_err(SCR *, EVENT *);
-int v_event_flush(SCR *, u_int);
-int db_eget(SCR *, recno_t, CHAR_T **, size_t *, int *);
-int db_get(SCR *, recno_t, u_int32_t, CHAR_T **, size_t *);
-int db_delete(SCR *, recno_t);
-int db_append(SCR *, int, recno_t, CHAR_T *, size_t);
-int db_insert(SCR *, recno_t, CHAR_T *, size_t);
-int db_set(SCR *, recno_t, CHAR_T *, size_t);
-int db_exist(SCR *, recno_t);
-int db_last(SCR *, recno_t *);
-int db_rget(SCR *, recno_t, char **, size_t *);
-int db_rset(SCR *, recno_t, char *, size_t);
-void db_err(SCR *, recno_t);
-int log_init(SCR *, EXF *);
-int log_end(SCR *, EXF *);
-int log_cursor(SCR *);
-int log_line(SCR *, recno_t, u_int);
-int log_mark(SCR *, LMARK *);
-int log_backward(SCR *, MARK *);
-int log_setline(SCR *);
-int log_forward(SCR *, MARK *);
-int editor(GS *, int, char *[]);
-void v_end(GS *);
-int mark_init(SCR *, EXF *);
-int mark_end(SCR *, EXF *);
-int mark_get(SCR *, ARG_CHAR_T, MARK *, mtype_t);
-int mark_set(SCR *, ARG_CHAR_T, MARK *, int);
-int mark_insdel(SCR *, lnop_t, recno_t);
-void msgq(SCR *, mtype_t, const char *, ...);
-void msgq_wstr(SCR *, mtype_t, const CHAR_T *, const char *);
-void msgq_str(SCR *, mtype_t, const char *, const char *);
-void mod_rpt(SCR *);
-void msgq_status(SCR *, recno_t, u_int);
-int msg_open(SCR *, char *);
-void msg_close(GS *);
-const char *msg_cmsg(SCR *, cmsg_t, size_t *);
-const char *msg_cat(SCR *, const char *, size_t *);
-char *msg_print(SCR *, const char *, int *);
-int opts_init(SCR *, int *);
-int opts_set(SCR *, ARGS *[], char *);
-int o_set(SCR *, int, u_int, char *, u_long);
-int opts_empty(SCR *, int, int);
-void opts_dump(SCR *, enum optdisp);
-int opts_save(SCR *, FILE *);
-OPTLIST const *opts_search(CHAR_T *);
-void opts_nomatch(SCR *, CHAR_T *);
-int opts_copy(SCR *, SCR *);
-void opts_free(SCR *);
-int f_altwerase(SCR *, OPTION *, char *, u_long *);
-int f_columns(SCR *, OPTION *, char *, u_long *);
-int f_lines(SCR *, OPTION *, char *, u_long *);
-int f_lisp(SCR *, OPTION *, char *, u_long *);
-int f_msgcat(SCR *, OPTION *, char *, u_long *);
-int f_print(SCR *, OPTION *, char *, u_long *);
-int f_readonly(SCR *, OPTION *, char *, u_long *);
-int f_recompile(SCR *, OPTION *, char *, u_long *);
-int f_reformat(SCR *, OPTION *, char *, u_long *);
-int f_ttywerase(SCR *, OPTION *, char *, u_long *);
-int f_w300(SCR *, OPTION *, char *, u_long *);
-int f_w1200(SCR *, OPTION *, char *, u_long *);
-int f_w9600(SCR *, OPTION *, char *, u_long *);
-int f_window(SCR *, OPTION *, char *, u_long *);
-int f_encoding(SCR *, OPTION *, char *, u_long *);
-int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int);
-int rcv_tmp(SCR *, EXF *, char *);
-int rcv_init(SCR *);
-int rcv_sync(SCR *, u_int);
-int rcv_list(SCR *);
-int rcv_read(SCR *, FREF *);
-int screen_init(GS *, SCR *, SCR **);
-int screen_end(SCR *);
-SCR *screen_next(SCR *);
-int f_search(SCR *,
-   MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int);
-int b_search(SCR *,
-   MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int);
-void search_busy(SCR *, busy_t);
-int seq_set(SCR *, CHAR_T *,
-   size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int);
-int seq_delete(SCR *, CHAR_T *, size_t, seq_t);
-int seq_free(SEQ *);
-SEQ *seq_find
-  (SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *);
-void seq_close(GS *);
-int seq_dump(SCR *, seq_t, int);
-int seq_save(SCR *, FILE *, char *, seq_t);
-int e_memcmp(CHAR_T *, EVENT *, size_t);
-void *binc(SCR *, void *, size_t *, size_t);
-int nonblank(SCR *, recno_t, size_t *);
-char *join(char *, char *);
-char *expanduser(char *);
-char *quote(char *);
-char *v_strdup(SCR *, const char *, size_t);
-CHAR_T *v_wstrdup(SCR *, const CHAR_T *, size_t);
-enum nresult nget_uslong(u_long *, const CHAR_T *, CHAR_T **, int);
-enum nresult nget_slong(long *, const CHAR_T *, CHAR_T **, int);
-void timepoint_steady(struct timespec *);
-void timepoint_system(struct timespec *);
-void TRACE(SCR *, const char *, ...);
diff --git a/contrib/nvi/common/key.h b/contrib/nvi/common/key.h
index 3e55d3044129..ae0ba92d1ce5 100644
--- a/contrib/nvi/common/key.h
+++ b/contrib/nvi/common/key.h
@@ -22,8 +22,8 @@
     sp->conv.input2int(sp, n, nlen, &(cw), &wlen, &w)
 #define CONST
 #define INTISWIDE(c)        (wctob(c) == EOF)
-#define CHAR_WIDTH(sp, ch)  wcwidth(ch)
-#define CAN_PRINT(sp, ch)   (CHAR_WIDTH(sp, ch) > 0)
+#define XCHAR_WIDTH(sp, ch) wcwidth(ch)
+#define CAN_PRINT(sp, ch)   (XCHAR_WIDTH(sp, ch) > 0)
 #else
 #define FILE2INT5(sp,buf,n,nlen,w,wlen) \
     (w = n, wlen = nlen, 0)
@@ -37,7 +37,7 @@
     (w = n, wlen = nlen, 0)
 #define CONST               const
 #define INTISWIDE(c)        0
-#define CHAR_WIDTH(sp, ch)  1
+#define XCHAR_WIDTH(sp, ch) 1
 #define CAN_PRINT(sp, ch)   isprint(ch)
 #endif
 #define FILE2INT(sp,n,nlen,w,wlen)					    \
diff --git a/contrib/nvi/common/options.h b/contrib/nvi/common/options.h
index 5ed12d39c342..d723a51217bc 100644
--- a/contrib/nvi/common/options.h
+++ b/contrib/nvi/common/options.h
@@ -97,4 +97,8 @@ enum optdisp { NO_DISPLAY, ALL_DISPLAY, CHANGED_DISPLAY, SELECT_DISPLAY };
 /* Options array. */
 extern OPTLIST const optlist[];
 
+#ifdef O_PATH
+#undef O_PATH	/* bits/fcntl-linux.h may have defined O_PATH. */
+#endif
+
 #include "options_def.h"
diff --git a/contrib/nvi/common/recover.c b/contrib/nvi/common/recover.c
index 120cf4f60b19..cf222bfb5200 100644
--- a/contrib/nvi/common/recover.c
+++ b/contrib/nvi/common/recover.c
@@ -701,7 +701,13 @@ rcv_read(SCR *sp, FREF *frp)
 		/* If we've found more than one, take the most recent. */
 		(void)fstat(fileno(fp), &sb);
 		if (recp == NULL ||
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+		    timespeccmp(&rec_mtim, &sb.st_mtimespec, <)) {
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 		    timespeccmp(&rec_mtim, &sb.st_mtim, <)) {
+#else
+		    rec_mtim.tv_sec < sb.st_mtime) {
+#endif
 			p = recp;
 			t = pathp;
 			recp = recpath;
@@ -710,7 +716,13 @@ rcv_read(SCR *sp, FREF *frp)
 				free(p);
 				free(t);
 			}
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+			rec_mtim = sb.st_mtimespec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 			rec_mtim = sb.st_mtim;
+#else
+			rec_mtim.tv_sec = sb.st_mtime;
+#endif
 			if (sv_fd != -1)
 				(void)close(sv_fd);
 			sv_fd = dup(fileno(fp));
diff --git a/contrib/nvi/ex/ex.c b/contrib/nvi/ex/ex.c
index 343131537afa..fd920a8df9a1 100644
--- a/contrib/nvi/ex/ex.c
+++ b/contrib/nvi/ex/ex.c
@@ -2266,7 +2266,8 @@ ex_comm_search(CHAR_T *name, size_t len)
 			return (NULL);
 		if (cp->name[0] != name[0])
 			continue;
-		if (!MEMCMP(name, cp->name, len))
+		if (STRLEN(cp->name) >= len &&
+			!MEMCMP(name, cp->name, len))
 			return (cp);
 	}
 	return (NULL);
diff --git a/contrib/nvi/ex/ex_cscope.c b/contrib/nvi/ex/ex_cscope.c
index 74d7f8af95be..e07aa64df802 100644
--- a/contrib/nvi/ex/ex_cscope.c
+++ b/contrib/nvi/ex/ex_cscope.c
@@ -261,7 +261,14 @@ cscope_add(SCR *sp, EXCMD *cmdp, CHAR_T *dname)
 	csc->dname = csc->buf;
 	csc->dlen = len;
 	memcpy(csc->dname, np, len);
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+	csc->mtim = sb.st_mtimespec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 	csc->mtim = sb.st_mtim;
+#else
+	csc->mtim.tv_sec = sb.st_mtime;
+	csc->mtim.tv_nsec = 0;
+#endif
 
 	/* Get the search paths for the cscope. */
 	if (get_paths(sp, csc))
@@ -812,8 +819,15 @@ csc_file(SCR *sp, CSC *csc, char *name, char **dirp, size_t *dlenp, int *isolder
 			free(buf);
 			*dirp = *pp;
 			*dlenp = strlen(*pp);
+#if defined HAVE_STRUCT_STAT_ST_MTIMESPEC
+			*isolderp = timespeccmp(
+			    &sb.st_mtimespec, &csc->mtim, <);
+#elif defined HAVE_STRUCT_STAT_ST_MTIM
 			*isolderp = timespeccmp(
 			    &sb.st_mtim, &csc->mtim, <);
+#else
+			*isolderp = sb.st_mtime < csc->mtim.tv_sec;
+#endif
 			return;
 		}
 		free(buf);
diff --git a/contrib/nvi/ex/extern.h b/contrib/nvi/ex/extern.h
deleted file mode 100644
index 9d7b1d674c3c..000000000000
--- a/contrib/nvi/ex/extern.h
+++ /dev/null
@@ -1,131 +0,0 @@
-int ex(SCR **);
-int ex_cmd(SCR *);
-int ex_range(SCR *, EXCMD *, int *);
-int ex_is_abbrev(CHAR_T *, size_t);
-int ex_is_unmap(CHAR_T *, size_t);
-void ex_badaddr
-  (SCR *, EXCMDLIST const *, enum badaddr, enum nresult);
-int ex_abbr(SCR *, EXCMD *);
-int ex_unabbr(SCR *, EXCMD *);
-int ex_append(SCR *, EXCMD *);
-int ex_change(SCR *, EXCMD *);
-int ex_insert(SCR *, EXCMD *);
-int ex_next(SCR *, EXCMD *);
-int ex_prev(SCR *, EXCMD *);
-int ex_rew(SCR *, EXCMD *);
-int ex_args(SCR *, EXCMD *);
-char **ex_buildargv(SCR *, EXCMD *, char *);
-int argv_init(SCR *, EXCMD *);
-int argv_exp0(SCR *, EXCMD *, CHAR_T *, size_t);
-int argv_exp1(SCR *, EXCMD *, CHAR_T *, size_t, int);
-int argv_exp2(SCR *, EXCMD *, CHAR_T *, size_t);
-int argv_exp3(SCR *, EXCMD *, CHAR_T *, size_t);
-int argv_flt_ex(SCR *, EXCMD *, CHAR_T *, size_t);
-int argv_free(SCR *);
-int argv_flt_path(SCR *, EXCMD *, CHAR_T *, size_t);
-CHAR_T *argv_esc(SCR *, EXCMD *, CHAR_T *, size_t);
-CHAR_T *argv_uesc(SCR *, EXCMD *, CHAR_T *, size_t);
-int ex_at(SCR *, EXCMD *);
-int ex_bang(SCR *, EXCMD *);
-int ex_cd(SCR *, EXCMD *);
-int ex_cscope(SCR *, EXCMD *);
-int cscope_end(SCR *);
-int cscope_display(SCR *);
-int cscope_search(SCR *, TAGQ *, TAG *);
-int ex_delete(SCR *, EXCMD *);
-int ex_display(SCR *, EXCMD *);
-int ex_edit(SCR *, EXCMD *);
-int ex_equal(SCR *, EXCMD *);
-int ex_file(SCR *, EXCMD *);
-int ex_filter(SCR *, 
-   EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype);
-int ex_global(SCR *, EXCMD *);
-int ex_v(SCR *, EXCMD *);
-int ex_g_insdel(SCR *, lnop_t, recno_t);
-int ex_screen_copy(SCR *, SCR *);
-int ex_screen_end(SCR *);
-int ex_optchange(SCR *, int, char *, u_long *);
-int ex_exrc(SCR *);
-int ex_run_str(SCR *, char *, CHAR_T *, size_t, int, int);
-int ex_join(SCR *, EXCMD *);
-int ex_map(SCR *, EXCMD *);
-int ex_unmap(SCR *, EXCMD *);
-int ex_mark(SCR *, EXCMD *);
-int ex_mkexrc(SCR *, EXCMD *);
-int ex_copy(SCR *, EXCMD *);
-int ex_move(SCR *, EXCMD *);
-int ex_open(SCR *, EXCMD *);
-int ex_preserve(SCR *, EXCMD *);
-int ex_recover(SCR *, EXCMD *);
-int ex_list(SCR *, EXCMD *);
-int ex_number(SCR *, EXCMD *);
-int ex_pr(SCR *, EXCMD *);
-int ex_print(SCR *, EXCMD *, MARK *, MARK *, u_int32_t);
-int ex_ldisplay(SCR *, const CHAR_T *, size_t, size_t, u_int);
-int ex_scprint(SCR *, MARK *, MARK *);
-int ex_printf(SCR *, const char *, ...);
-int ex_puts(SCR *, const char *);
-int ex_fflush(SCR *sp);
-int ex_put(SCR *, EXCMD *);
-int ex_quit(SCR *, EXCMD *);
-int ex_read(SCR *, EXCMD *);
-int ex_readfp(SCR *, char *, FILE *, MARK *, recno_t *, int);
-int ex_bg(SCR *, EXCMD *);
-int ex_fg(SCR *, EXCMD *);
-int ex_resize(SCR *, EXCMD *);
-int ex_sdisplay(SCR *);
-int ex_script(SCR *, EXCMD *);
-int sscr_exec(SCR *, recno_t);
-int sscr_input(SCR *);
-int sscr_end(SCR *);
-int ex_set(SCR *, EXCMD *);
-int ex_shell(SCR *, EXCMD *);
-int ex_exec_proc(SCR *, EXCMD *, char *, const char *, int);
-int proc_wait(SCR *, long, const char *, int, int);
-int ex_shiftl(SCR *, EXCMD *);
-int ex_shiftr(SCR *, EXCMD *);
-int ex_retab(SCR *, EXCMD *);
-int ex_source(SCR *, EXCMD *);
-int ex_stop(SCR *, EXCMD *);
-int ex_s(SCR *, EXCMD *);
-int ex_subagain(SCR *, EXCMD *);
-int ex_subtilde(SCR *, EXCMD *);
-int re_compile(SCR *,
-    CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int);
-void re_error(SCR *, int, regex_t *);
-int ex_tag_first(SCR *, CHAR_T *);
-int ex_tag_push(SCR *, EXCMD *);
-int ex_tag_next(SCR *, EXCMD *);
-int ex_tag_prev(SCR *, EXCMD *);
-int ex_tag_nswitch(SCR *, TAG *, int);
-int ex_tag_Nswitch(SCR *, TAG *, int);
-int ex_tag_pop(SCR *, EXCMD *);
-int ex_tag_top(SCR *, EXCMD *);
-int ex_tag_display(SCR *);
-int ex_tag_copy(SCR *, SCR *);
-int tagq_free(SCR *, TAGQ *);
-int tagq_push(SCR*, TAGQ*, int, int );
-void tag_msg(SCR *, tagmsg_t, char *);
-int ex_tagf_alloc(SCR *, char *);
-int ex_tag_free(SCR *);
-int ex_txt(SCR *, TEXTH *, ARG_CHAR_T, u_int32_t);
-int ex_undo(SCR *, EXCMD *);
-int ex_help(SCR *, EXCMD *);
-int ex_usage(SCR *, EXCMD *);
-int ex_viusage(SCR *, EXCMD *);
-void ex_cinit(SCR *, EXCMD *, int, int, recno_t, recno_t, int);
-int ex_getline(SCR *, FILE *, size_t *);
-int ex_ncheck(SCR *, int);
-int ex_init(SCR *);
-void ex_wemsg(SCR *, CHAR_T *, exm_t);
-void ex_emsg(SCR *, char *, exm_t);
-int ex_version(SCR *, EXCMD *);
-int ex_visual(SCR *, EXCMD *);
-int ex_wn(SCR *, EXCMD *);
-int ex_wq(SCR *, EXCMD *);
-int ex_write(SCR *, EXCMD *);
-int ex_xit(SCR *, EXCMD *);
-int ex_writefp(SCR *,
-   char *, FILE *, MARK *, MARK *, u_long *, u_long *, int);
-int ex_yank(SCR *, EXCMD *);
-int ex_z(SCR *, EXCMD *);
diff --git a/contrib/nvi/man/vi.1 b/contrib/nvi/man/vi.1
index 8c75e9e66a33..b6eaf6964bbd 100644
--- a/contrib/nvi/man/vi.1
+++ b/contrib/nvi/man/vi.1
@@ -1809,7 +1809,8 @@ Display buffers, Cscope connections, screens or tags.
 .Op Ar +cmd
 .Op Ar file
 .Xc
-Edit a different file.
+Edit a different file. The capitalized command opens a new screen below the
+current screen.
 .Pp
 .It Xo
 .Cm exu Ns Op Cm sage
@@ -1832,7 +1833,8 @@ Display and optionally change the file name.
 .Xc
 .Nm vi
 mode only.
-Foreground the specified screen.
+Foreground the specified screen. The capitalized command opens a new screen
+below the current screen.
 .Pp
 .It Xo
 .Op Ar range
@@ -1919,7 +1921,8 @@ Write the abbreviations, editor options and maps to the specified
 .Op Cm !\&
 .Op Ar
 .Xc
-Edit the next file from the argument list.
+Edit the next file from the argument list. The capitalized command opens a
+new screen below the current screen.
 .\" .Pp
 .\" .It Xo
 .\" .Op Ar line
@@ -1940,7 +1943,8 @@ option.
 .Cm rev Ns Op Cm ious Ns
 .Op Cm !\&
 .Xc
-Edit the previous file from the argument list.
+Edit the previous file from the argument list. The capitalized command opens
+a new screen below the current screen.
 .Pp
 .It Xo
 .Op Ar range
@@ -2103,7 +2107,8 @@ character is usually
 .Op Cm !\&
 .Ar tagstring
 .Xc
-Edit the file containing the specified tag.
+Edit the file containing the specified tag. The capitalized command opens a
+new screen below the current screen.
 .Pp
 .It Xo
 .Cm tagn Ns Op Cm ext Ns
@@ -2166,15 +2171,15 @@ Enter
 .Nm vi .
 .Pp
 .It Xo
-.Op Cm Vi Ns
-.Cm i Ns Op Cm sual Ns
+.Cm Vi Ns
+.Op Cm sual Ns
 .Op Cm !\&
 .Op Ar +cmd
 .Op Ar file
 .Xc
 .Nm vi
-mode only.
-Edit a new file.
+mode only. Edit a different file by opening a new screen below the current
+screen.
 .Pp
 .It Xo
 .Cm viu Ns Op Cm sage
@@ -2185,6 +2190,14 @@ Display usage for a
 command.
 .Pp
 .It Xo
+.Cm vs Ns Op Cm plit
+.Op Ar +cmd
+.Op Ar file
+.Xc
+Edit a different file by opening a new screen to the right of the current
+screen.
+.Pp
+.It Xo
 .Op Ar range
 .Cm w Ns Op Cm rite Ns
 .Op Cm !\&
@@ -2194,8 +2207,7 @@ command.
 .It Xo
 .Op Ar range
 .Cm w Ns Op Cm rite
-.Op Cm !\&
-.Op Ar file
+.Cm !\& Ns Ar shell-command
 .Xc
 .It Xo
 .Op Ar range
@@ -2209,7 +2221,21 @@ command.
 .Op >>
 .Op Ar file
 .Xc
-Write the file.
+Write the entire file, or
+.Ar range .
+.Sq !\&
+overwrites a different, preexisting file.
+.Sq >>
+appends to a file that may preexist. Whitespace followed by
+.Sq !\&
+pipes the file to
+.Ar shell-command .
+.Cm wn
+moves to the next file if writing succeeds.
+.Cm wq
+exits the editor if writing succeeds, unless there are more files to edit;
+.Sq !\&
+exits regardless.
 .Pp
 .It Xo
 .Op Ar range
diff --git a/contrib/nvi/vi/extern.h b/contrib/nvi/vi/extern.h
deleted file mode 100644
index 8e145c6318ef..000000000000
--- a/contrib/nvi/vi/extern.h
+++ /dev/null
@@ -1,145 +0,0 @@
-int cs_init(SCR *, VCS *);
-int cs_next(SCR *, VCS *);
-int cs_fspace(SCR *, VCS *);
-int cs_fblank(SCR *, VCS *);
-int cs_prev(SCR *, VCS *);
-int cs_bblank(SCR *, VCS *);
-int v_at(SCR *, VICMD *);
-int v_chrepeat(SCR *, VICMD *);
-int v_chrrepeat(SCR *, VICMD *);
-int v_cht(SCR *, VICMD *);
-int v_chf(SCR *, VICMD *);
-int v_chT(SCR *, VICMD *);
-int v_chF(SCR *, VICMD *);
-int v_delete(SCR *, VICMD *);
-int v_again(SCR *, VICMD *);
-int v_exmode(SCR *, VICMD *);
-int v_join(SCR *, VICMD *);
-int v_shiftl(SCR *, VICMD *);
-int v_shiftr(SCR *, VICMD *);
-int v_suspend(SCR *, VICMD *);
-int v_switch(SCR *, VICMD *);
-int v_tagpush(SCR *, VICMD *);
-int v_tagpop(SCR *, VICMD *);
-int v_filter(SCR *, VICMD *);
-int v_ex(SCR *, VICMD *);
-int v_ecl_exec(SCR *);
-int v_increment(SCR *, VICMD *);
-int v_screen_copy(SCR *, SCR *);
-int v_screen_end(SCR *);
-int v_optchange(SCR *, int, char *, u_long *);
-int v_iA(SCR *, VICMD *);
-int v_ia(SCR *, VICMD *);
-int v_iI(SCR *, VICMD *);
-int v_ii(SCR *, VICMD *);
-int v_iO(SCR *, VICMD *);
-int v_io(SCR *, VICMD *);
-int v_change(SCR *, VICMD *);
-int v_Replace(SCR *, VICMD *);
-int v_subst(SCR *, VICMD *);
-int v_left(SCR *, VICMD *);
-int v_cfirst(SCR *, VICMD *);
-int v_first(SCR *, VICMD *);
-int v_ncol(SCR *, VICMD *);
-int v_zero(SCR *, VICMD *);
-int v_mark(SCR *, VICMD *);
-int v_bmark(SCR *, VICMD *);
-int v_fmark(SCR *, VICMD *);
-int v_emark(SCR *, VICMD *);
-int v_match(SCR *, VICMD *);
-int v_buildmcs(SCR *, char *);
-int v_paragraphf(SCR *, VICMD *);
-int v_paragraphb(SCR *, VICMD *);
-int v_buildps(SCR *, char *, char *);
-int v_Put(SCR *, VICMD *);
-int v_put(SCR *, VICMD *);
-int v_redraw(SCR *, VICMD *);
-int v_replace(SCR *, VICMD *);
-int v_right(SCR *, VICMD *);
-int v_dollar(SCR *, VICMD *);
-int v_screen(SCR *, VICMD *);
-int v_lgoto(SCR *, VICMD *);
-int v_home(SCR *, VICMD *);
-int v_middle(SCR *, VICMD *);
-int v_bottom(SCR *, VICMD *);
-int v_up(SCR *, VICMD *);
-int v_cr(SCR *, VICMD *);
-int v_down(SCR *, VICMD *);
-int v_hpageup(SCR *, VICMD *);
-int v_hpagedown(SCR *, VICMD *);
-int v_pagedown(SCR *, VICMD *);
-int v_pageup(SCR *, VICMD *);
-int v_lineup(SCR *, VICMD *);
-int v_linedown(SCR *, VICMD *);
-int v_searchb(SCR *, VICMD *);
-int v_searchf(SCR *, VICMD *);
-int v_searchN(SCR *, VICMD *);
-int v_searchn(SCR *, VICMD *);
-int v_searchw(SCR *, VICMD *);
-int v_correct(SCR *, VICMD *, int);
-int v_sectionf(SCR *, VICMD *);
-int v_sectionb(SCR *, VICMD *);
-int v_sentencef(SCR *, VICMD *);
-int v_sentenceb(SCR *, VICMD *);
-int v_status(SCR *, VICMD *);
-int v_tcmd(SCR *, VICMD *, ARG_CHAR_T, u_int);
-int v_txt(SCR *, VICMD *, MARK *,
-   const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t);
-int v_txt_auto(SCR *, recno_t, TEXT *, size_t, TEXT *);
-int v_ulcase(SCR *, VICMD *);
-int v_mulcase(SCR *, VICMD *);
-int v_Undo(SCR *, VICMD *);
-int v_undo(SCR *, VICMD *);
-void v_eof(SCR *, MARK *);
-void v_eol(SCR *, MARK *);
-void v_nomove(SCR *);
-void v_sof(SCR *, MARK *);
-void v_sol(SCR *);
-int v_isempty(CHAR_T *, size_t);
-void v_emsg(SCR *, char *, vim_t);
-int v_wordW(SCR *, VICMD *);
-int v_wordw(SCR *, VICMD *);
-int v_wordE(SCR *, VICMD *);
-int v_worde(SCR *, VICMD *);
-int v_wordB(SCR *, VICMD *);
-int v_wordb(SCR *, VICMD *);
-int v_xchar(SCR *, VICMD *);
-int v_Xchar(SCR *, VICMD *);
-int v_yank(SCR *, VICMD *);
-int v_z(SCR *, VICMD *);
-int vs_crel(SCR *, long);
-int v_zexit(SCR *, VICMD *);
-int vi(SCR **);
-int v_curword(SCR *);
-int vs_line(SCR *, SMAP *, size_t *, size_t *);
-int vs_number(SCR *);
-void vs_busy(SCR *, const char *, busy_t);
-void vs_home(SCR *);
-void vs_update(SCR *, const char *, const CHAR_T *);
-void vs_msg(SCR *, mtype_t, char *, size_t);
-int vs_ex_resolve(SCR *, int *);
-int vs_resolve(SCR *, SCR *, int);
-int vs_repaint(SCR *, EVENT *);
-int vs_refresh(SCR *, int);
-int vs_column(SCR *, size_t *);
-size_t vs_screens(SCR *, recno_t, size_t *);
-size_t vs_columns(SCR *, CHAR_T *, recno_t, size_t *, size_t *);
-size_t vs_rcm(SCR *, recno_t, int);
-size_t vs_colpos(SCR *, recno_t, size_t);
-int vs_change(SCR *, recno_t, lnop_t);
-int vs_sm_fill(SCR *, recno_t, pos_t);
-int vs_sm_scroll(SCR *, MARK *, recno_t, scroll_t);
-int vs_sm_1up(SCR *);
-int vs_sm_1down(SCR *);
-int vs_sm_next(SCR *, SMAP *, SMAP *);
-int vs_sm_prev(SCR *, SMAP *, SMAP *);
-int vs_sm_cursor(SCR *, SMAP **);
-int vs_sm_position(SCR *, MARK *, u_long, pos_t);
-recno_t vs_sm_nlines(SCR *, SMAP *, recno_t, size_t);
-int vs_split(SCR *, SCR *, int);
-int vs_vsplit(SCR *, SCR *);
-int vs_discard(SCR *, SCR **);
-int vs_fg(SCR *, SCR **, CHAR_T *, int);
-int vs_bg(SCR *);
-int vs_swap(SCR *, SCR **, char *);
-int vs_resize(SCR *, long, adj_t);
diff --git a/contrib/nvi/vi/v_increment.c b/contrib/nvi/vi/v_increment.c
index 6c59836cab7e..2583d9704579 100644
--- a/contrib/nvi/vi/v_increment.c
+++ b/contrib/nvi/vi/v_increment.c
@@ -198,7 +198,7 @@ nonum:			msgq(sp, M_ERR, "181|Cursor not in a number");
 		/* If we cross 0, signed numbers lose their sign. */
 		if (lval == 0 && ntype == fmt[SDEC])
 			ntype = fmt[DEC];
-		nlen = SPRINTF(nbuf, sizeof(nbuf), ntype, lval);
+		nlen = SPRINTF(nbuf, SIZE(nbuf), ntype, lval);
 	} else {
 		if ((nret = nget_uslong(&ulval, t, NULL, base)) != NUM_OK)
 			goto err;
@@ -220,7 +220,7 @@ nonum:			msgq(sp, M_ERR, "181|Cursor not in a number");
 		if (base == 16)
 			wlen -= 2;
 
*** 529 LINES SKIPPED ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109221031.18MAV8OE009340>