diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | common/common.h | 1 | ||||
-rw-r--r-- | common/log.c | 23 | ||||
-rw-r--r-- | common/mem.h | 12 | ||||
-rw-r--r-- | common/options.c | 4 | ||||
-rw-r--r-- | man/vi.1 | 51 | ||||
-rw-r--r-- | vi/vs_refresh.c | 15 |
7 files changed, 60 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c935b3c2a19..9451eaa89799 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,6 @@ if (NOT APPLE) endif() add_compile_options($<$<CONFIG:Release>:-Wuninitialized>) add_compile_options($<$<CONFIG:Release>:-Wno-dangling-else>) -add_compile_options(-Wno-string-compare) add_compile_options(-Wstack-protector -fstack-protector) add_compile_options(-Wstrict-aliasing -fstrict-aliasing) diff --git a/common/common.h b/common/common.h index 45f22fb49d1b..fd97a4655cf5 100644 --- a/common/common.h +++ b/common/common.h @@ -17,6 +17,7 @@ #include <db.h> #endif #include <regex.h> /* May refer to the bundled regex. */ +#include <stdint.h> /* * Forward structure declarations. Not pretty, but the include files diff --git a/common/log.c b/common/log.c index 96b246efad02..7aad94d7e74a 100644 --- a/common/log.c +++ b/common/log.c @@ -18,7 +18,6 @@ #include <fcntl.h> #include <libgen.h> #include <limits.h> -#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -706,30 +705,18 @@ apply_with(int (*db_func)(SCR *, recno_t, CHAR_T *, size_t), SCR *sp, recno_t lno, u_char *p, size_t len) { #ifdef USE_WIDECHAR - typedef unsigned long nword; - static size_t blen; - static nword *bp; - nword *lp = (nword *)((uintptr_t)p / sizeof(nword) * sizeof(nword)); - - if (lp != (nword *)p) { - int offl = ((uintptr_t)p - (uintptr_t)lp) << 3; - int offr = (sizeof(nword) << 3) - offl; - size_t i, cnt = (len + sizeof(nword) / 2) / sizeof(nword); + static u_char *bp; + if (!is_aligned(p, sizeof(unsigned long))) { if (len > blen) { blen = p2roundup(MAX(len, 512)); - REALLOC(sp, bp, nword *, blen); + REALLOC(sp, bp, u_char *, blen); if (bp == NULL) return (1); } - for (i = 0; i < cnt; ++i) -#if BYTE_ORDER == BIG_ENDIAN - bp[i] = (lp[i] << offl) ^ (lp[i+1] >> offr); -#else - bp[i] = (lp[i] >> offl) ^ (lp[i+1] << offr); -#endif - p = (u_char *)bp; + memmove(bp, p, len); + p = bp; } #endif return db_func(sp, lno, (CHAR_T *)p, len / sizeof(CHAR_T)); diff --git a/common/mem.h b/common/mem.h index d24ec0b50b09..0c83b70dec2f 100644 --- a/common/mem.h +++ b/common/mem.h @@ -212,6 +212,18 @@ p2roundup(size_t n) return (n); } +/* + * is_aligned -- + * Determine whether the program can safely read an object with an + * alignment requirement from ptr. + * + * See also: https://clang.llvm.org/docs/LanguageExtensions.html#alignment-builtins + */ +static __inline int +is_aligned(void *ptr, size_t alignment) { + return ((uintptr_t)ptr % alignment) == 0; +} + /* Additional TAILQ helper. */ #define TAILQ_ENTRY_ISVALID(elm, field) \ ((elm)->field.tqe_prev != NULL) diff --git a/common/options.c b/common/options.c index c3d1f7343f9a..87d5c5a88521 100644 --- a/common/options.c +++ b/common/options.c @@ -181,6 +181,8 @@ OPTLIST const optlist[] = { {L("shellmeta"), NULL, OPT_STR, 0}, /* O_SHIFTWIDTH 4BSD */ {L("shiftwidth"), NULL, OPT_NUM, OPT_NOZERO}, +/* O_SHOWFILENAME */ + {L("showfilename"), NULL, OPT_0BOOL, 0}, /* O_SHOWMATCH 4BSD */ {L("showmatch"), NULL, OPT_0BOOL, 0}, /* O_SHOWMODE 4.4BSD */ @@ -317,7 +319,7 @@ opts_init(SCR *sp, int *oargs) /* Set numeric and string default values. */ #define OI(indx, str) do { \ a.len = STRLEN(str); \ - if ((CHAR_T*)str != b2) /* GCC puts strings in text-space. */ \ + if (STRCMP((CHAR_T*)str, b2) != 0) \ (void)MEMCPY(b2, str, a.len+1); \ if (opts_set(sp, argv, NULL)) { \ optindx = indx; \ @@ -12,11 +12,13 @@ .\" that you would have purchased it, or if any company wishes to .\" redistribute it, contributions to the authors would be appreciated. .\" -.Dd November 2, 2013 +.Dd April 18, 2024 .Dt VI 1 .Os .Sh NAME -.Nm ex , vi , view +.Nm ex , +.Nm vi , +.Nm view .Nd text editors .Sh SYNOPSIS .Nm ex @@ -302,7 +304,7 @@ Quit editing and leave (if you've modified the file, but not saved your changes, .Nm vi will refuse to quit). -.It Cm :q! +.It Cm :q\&! Quit, discarding any modifications that you may have made. .El .Pp @@ -706,7 +708,7 @@ Execute the .Nm ex command being entered, or cancel it if it is only partial. .Pp -.It Aq Cm control-] +.It Aq Cm control-\(rB Push a tag reference onto the tag stack. .Pp .It Aq Cm control-\(ha @@ -830,7 +832,7 @@ or to the position of the cursor before the last of the following commands: .Aq Cm control-A , .Aq Cm control-T , -.Aq Cm control-] , +.Aq Cm control-\(rB , .Cm % , .Cm \(aq , .Cm \` , @@ -1809,8 +1811,8 @@ Display buffers, Cscope connections, screens or tags. .Op Ar +cmd .Op Ar file .Xc -Edit a different file. The capitalized command opens a new screen below the -current screen. +Edit a different file. +The capitalized command opens a new screen below the current screen. .Pp .It Xo .Cm exu Ns Op Cm sage @@ -1833,8 +1835,8 @@ Display and optionally change the file name. .Xc .Nm vi mode only. -Foreground the specified screen. The capitalized command opens a new screen -below the current screen. +Foreground the specified screen. +The capitalized command opens a new screen below the current screen. .Pp .It Xo .Op Ar range @@ -1921,8 +1923,8 @@ Write the abbreviations, editor options and maps to the specified .Op Cm !\& .Op Ar .Xc -Edit the next file from the argument list. The capitalized command opens a -new screen below the current screen. +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 @@ -1943,8 +1945,8 @@ option. .Cm rev Ns Op Cm ious Ns .Op Cm !\& .Xc -Edit the previous file from the argument list. The capitalized command opens -a new screen below the current screen. +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 @@ -2107,8 +2109,8 @@ character is usually .Op Cm !\& .Ar tagstring .Xc -Edit the file containing the specified tag. The capitalized command opens a -new screen below the current screen. +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 @@ -2178,8 +2180,8 @@ Enter .Op Ar file .Xc .Nm vi -mode only. Edit a different file by opening a new screen below the current -screen. +mode only. +Edit a different file by opening a new screen below the current screen. .Pp .It Xo .Cm viu Ns Op Cm sage @@ -2226,7 +2228,8 @@ Write the entire file, or .Sq !\& overwrites a different, preexisting file. .Sq >> -appends to a file that may preexist. Whitespace followed by +appends to a file that may preexist. +Whitespace followed by .Sq !\& pipes the file to .Ar shell-command . @@ -2479,7 +2482,7 @@ Set the number of lines about which the editor reports changes or yanks. .It Cm ruler Bq off .Nm vi only. -Display a row/column ruler on the colon command line. +Display a row/column/percentage ruler on the colon command line. .It Cm scroll , scr Bq "window size / 2" Set the number of lines scrolled. .It Cm searchincr Bq off @@ -2505,6 +2508,10 @@ Set the meta characters checked to determine if file name expansion is necessary. .It Cm shiftwidth , sw Bq 8 Set the autoindent and shift command indentation width. +.It Cm showfilename Bq off +.Nm vi +only. +Display the file name on the colon command line. .It Cm showmatch , sm Bq off .Nm vi only. @@ -2773,10 +2780,8 @@ and \*(Gt0 if an error occurs. .Xr ctags 1 , .Xr iconv 1 , .Xr re_format 7 -.Rs -.%T vi/ex reference manual -.%U https://docs.freebsd.org/44doc/usd/13.viref/paper.pdf -.Re +.Pp +.Lk https://docs.freebsd.org/44doc/usd/13.viref/paper.pdf "Vi/Ex Reference Manual" .Sh STANDARDS .Nm nex Ns / Ns Nm nvi is close to diff --git a/vi/vs_refresh.c b/vi/vs_refresh.c index b64ec7392cbb..406a89ad7d9d 100644 --- a/vi/vs_refresh.c +++ b/vi/vs_refresh.c @@ -774,7 +774,8 @@ vs_modeline(SCR *sp) size_t cols, curcol, curlen, endpoint, len, midpoint; const char *t = NULL; int ellipsis; - char buf[20]; + char buf[30]; + recno_t last; gp = sp->gp; @@ -795,7 +796,7 @@ vs_modeline(SCR *sp) /* If more than one screen in the display, show the file name. */ curlen = 0; - if (IS_SPLIT(sp)) { + if (IS_SPLIT(sp) || O_ISSET(sp, O_SHOWFILENAME)) { CHAR_T *wp, *p; size_t l; @@ -846,8 +847,14 @@ vs_modeline(SCR *sp) cols = sp->cols - 1; if (O_ISSET(sp, O_RULER)) { vs_column(sp, &curcol); - len = snprintf(buf, sizeof(buf), "%lu,%lu", - (u_long)sp->lno, (u_long)(curcol + 1)); + + if (db_last(sp, &last) || last == 0) + len = snprintf(buf, sizeof(buf), "%lu,%zu", + (u_long)sp->lno, curcol + 1); + else + len = snprintf(buf, sizeof(buf), "%lu,%zu %lu%%", + (u_long)sp->lno, curcol + 1, + (u_long)(sp->lno * 100) / last); midpoint = (cols - ((len + 1) / 2)) / 2; if (curlen < midpoint) { |