diff options
Diffstat (limited to 'src')
68 files changed, 1362 insertions, 925 deletions
diff --git a/src/man/Makefile b/src/man/Makefile new file mode 100644 index 0000000000..3c0457e2ab --- /dev/null +++ b/src/man/Makefile @@ -0,0 +1,5 @@ +MAN = nvim.1 + +lint: + mandoc -Tlint -Wall $(MAN) + igor $(MAN) diff --git a/src/man/nvim.1 b/src/man/nvim.1 new file mode 100644 index 0000000000..9f35014ee8 --- /dev/null +++ b/src/man/nvim.1 @@ -0,0 +1,401 @@ +.Dd December 17, 2017 +.Dt NVIM 1 +.Os +.Sh NAME +.Nm nvim +.Nd edit text +.Sh SYNOPSIS +.Nm +.Op Ar options +.Op Ar file ... +.Nm +.Op Ar options +.Fl +.Nm +.Op Ar options +.Fl t Ar tag +.Nm +.Op Ar options +.Fl q Op Ar errorfile +.Sh DESCRIPTION +.Nm +is a text editor based on Vim. +Start +.Nm +followed by any number of options and/or files: +.Pp +.Dl nvim [options] [file ...] +.Pp +Commands in +.Nm +begin with colon +.Pq Sq \&: . +Type ":help subject" to get help on a specific subject. +Use <Tab> and CTRL-D to complete subjects (":help cmdline\-completion"). +.Pp +The "quickref" help section is a condensed reference of editor features: +.Dl :help quickref +.Pp +If you are new to Vim/Nvim, start with the 30-minute tutorial: +.Dl :Tutor +.Pp +After installing/updating Nvim, it's a good idea to run the self-check: +.Dl :checkhealth +.Pp +.Bl -tag -width Fl +.It Ar file ... +File(s) to edit. +Opens one buffer per file. +To switch between buffers, use the +.Ic :next +and +.Ic :previous +commands. +.It Fl +Reads text from standard input until +.Dv EOF , +then opens a buffer with that text. +User input is read from standard error, which should be a terminal. +.El +.Sh OPTIONS +.Bl -tag -width Fl +.It Fl t Ar tag +Finds +.Ar tag +in the tags file, the associated file becomes the current +file and the associated command is executed. +Cursor is positioned at the tag location in the file. +.Ic ":help tag-commands" +.It Fl q Op Ar errorfile +QuickFix mode. +Display the first error in +.Ar errorfile . +If +.Ar errorfile +is omitted, the value of the 'errorfile' option is used (defaults to +.Cm errors.err ) . +Further errors can be jumped to with the +.Ic :cnext +command. +.Ic ":help quickfix" +.It Fl - +End of options. +Remaining arguments are treated as literal file names, including filenames starting with hyphen +.Pq Sq - . +.It Fl e +Ex mode, reading stdin as Ex commands. +.Ic ":help Ex-mode" +.It Fl E +Ex mode, reading stdin as text. +.Ic :help Ex-mode +.It Fl es +Silent (non-interactive) Ex mode, reading stdin as Ex commands. +Useful for scripting because it does NOT start a UI, unlike +.Fl e . +.Ic :help silent-mode +.It Fl \&Es +Silent (non-interactive) Ex mode, reading stdin as text. +Useful for scripting because it does NOT start a UI, unlike +.Fl E . +.Ic :help silent-mode +.It Fl d +Diff mode. +Show the difference between two to eight files, similar to +.Xr sdiff 1 . +.Ic ":help diff" +.It Fl R +Read-only mode. +Sets the 'readonly' option. +Implies +.Fl n . +Buffers can still be edited, but cannot be written to disk if already +associated with a file. +To overwrite a file, add an exclamation mark to the relevant Ex command, such as +.Ic :w! . +.Ic ":help 'readonly'" +.It Fl m +Resets the 'write' option, to disable file modifications. +Writing to a file is disabled, but buffers can still be modified. +.It Fl M +Resets the 'write' and 'modifiable' options, to disable file and buffer +modifications. +.It Fl b +Binary mode. +.Ic ":help edit-binary" +.It Fl l +Lisp mode. +Sets the 'lisp' and 'showmatch' options. +.It Fl A +Arabic mode. +Sets the 'arabic' option. +.It Fl H +Hebrew mode. +Sets the 'hkmap' and 'rightleft' options. +.It Fl V Ns Oo Ar N Oc Ns Op Ar file +Verbose mode. +Prints debug messages. +.Ar N +is the 'verbose' level, defaults to +.Cm 10 . +If +.Ar file +is specified, append messages to +.Ar file +instead of printing them. +.Ic ":help 'verbose'" +.It Fl D +Debug mode for VimL (Vim script). +Started when executing the first command from a script. +:help debug-mode +.It Fl n +Disable the use of swap files. +Sets the 'updatecount' option to +.Cm 0 . +Can be useful for editing files on a slow medium. +.It Fl r Op Ar file +Recovery mode. +If +.Ar file +is omitted +then list swap files with recovery information. +Otherwise the swap file +.Ar file +is used to recover a crashed session. +The swap file has the same name as the file it's associated with, but with +.Sq .swp +appended. +.Ic ":help recovery" +.It Fl L Op Ar file +Alias for +.Fl r . +.It Fl u Ar vimrc +Use +.Ar vimrc +instead of the default +.Pa ~/.config/nvim/init.vim . +If +.Ar vimrc +is +.Cm NORC , +do not load any initialization files (except plugins). +If +.Ar vimrc +is +.Cm NONE , +loading plugins is also skipped. +.Ic ":help initialization" +.It Fl i Ar shada +Use +.Ar shada +instead of the default +.Pa ~/.local/state/nvim/shada/main.shada . +If +.Ar shada +is +.Cm NONE , +do not read or write a ShaDa file. +.Ic ":help shada" +.It Fl -noplugin +Skip loading plugins. +Implied by +.Cm -u NONE . +.It Fl -clean +Mimic a fresh install of Nvim. Skip loading non-builtin plugins and shada (viminfo) file. +.It Fl o Ns Op Ar N +Open +.Ar N +windows stacked horizontally. +If +.Ar N +is omitted, open one window for each file. +If +.Ar N +is less than the number of file arguments, allocate windows for the first +.Ar N +files and hide the rest. +.It Fl O Ns Op Ar N +Like +.Fl o , +but tile windows vertically. +.It Fl p Ns Op Ar N +Like +.Fl o , +but for tab pages. +.It Cm + Ns Op Ar linenum +For the first file, position the cursor on line +.Ar linenum . +If +.Ar linenum +is omitted, position the cursor on the last line of the file. +.Cm +5 +and +.Cm -c 5 +on the command-line are equivalent to +.Ic :5 +inside +.Nm . +.It Cm +/ Ns Op Ar pattern +For the first file, position the cursor on the first occurrence of +.Ar pattern . +If +.Ar pattern +is omitted, the most recent search pattern is used (if any). +.Cm +/foo +and +.Cm -c /foo +on the command-line are equivalent to +.Ic /foo +and +.Ic :/foo +inside +.Nm . +.Ic ":help search-pattern" +.It \fB\+\fR\fI\,command\/\fR , Fl c Ar command +Execute +.Ar command +after reading the first file. +Up to 10 instances allowed. +.Qq Cm +foo +and +.Cm -c \(dqfoo\(dq +are equivalent. +.It Fl -cmd Ar command +Like +.Fl c , +but execute +.Ar command +before processing any vimrc. +Up to 10 instances of these can be used independently from instances of +.Fl c . +.It Fl S Op Ar session +Source +.Ar session +after the first file argument has been read. +Equivalent to +.Cm -c \(dqsource session\(dq . +.Ar session +cannot start with a hyphen +.Pq Sq - . +If +.Ar session +is omitted then +.Pa Session.vim +is used, if found. +.Ic ":help session-file" +.It Fl s Ar scriptin +Read normal mode commands from +.Ar scriptin . +The same can be done with the command +.Ic ":source! scriptin" . +If the end of the file is reached before +.Nm +exits, further characters are read from the keyboard. +.It Fl w Ar scriptout +Append all typed characters to +.Ar scriptout . +Can be used for creating a script to be used with +.Fl s +or +.Ic :source! . +.It Fl W Ar scriptout +Like +.Fl w , +but truncate +.Ar scriptout . +.It Fl -startuptime Ar file +During startup, append timing messages to +.Ar file . +Can be used to diagnose slow startup times. +.It Fl -api-info +Dump API metadata serialized to msgpack and exit. +.It Fl -embed +Use standard input and standard output as a msgpack-rpc channel. +:help --embed +.It Fl -headless +Do not start a UI. +When supplied with --embed this implies that the embedding application does not intend to (immediately) start a UI. +Also useful for "scraping" messages in a pipe. +:help --headless +.It Fl -listen Ar address +Start RPC server on this pipe or TCP socket. +.It Fl h , -help +Print usage information and exit. +.It Fl v , -version +Print version information and exit. +.El +.Sh ENVIRONMENT +.Bl -tag -width Fl +.It Ev NVIM_LOG_FILE +Low-level log file, usually found at ~/.local/state/nvim/log. +:help $NVIM_LOG_FILE +.It Ev VIM +Used to locate user files, such as init.vim. +System-dependent. +:help $VIM +.It Ev VIMRUNTIME +Used to locate runtime files (documentation, syntax highlighting, etc.). +.It Ev XDG_CONFIG_HOME +Path to the user-local configuration directory, see +.Sx FILES . +Defaults to +.Pa ~/.config . +:help xdg +.It Ev XDG_STATE_HOME +Like +.Ev XDG_CONFIG_HOME , +but used to store data not generally edited by the user, +namely swap, backup, and ShaDa files. +Defaults to +.Pa ~/.local/state . +:help xdg +.It Ev XDG_DATA_HOME +Like +.Ev XDG_CONFIG_HOME , +but used to store data not generally edited by the user, +things like runtime files. +Defaults to +.Pa ~/.local/share . +:help xdg +.It Ev VIMINIT +Ex commands to be executed at startup. +.Ic ":help VIMINIT" +.It Ev SHELL +Used to initialize the 'shell' option, which decides the default shell used by +features like +.Ic :terminal , +.Ic :! , and +.Ic system() . +.El +.Sh FILES +.Bl -tag -width "~/.config/nvim/init.vim" +.It Pa ~/.config/nvim/init.vim +User-local +.Nm +configuration file. +.It Pa ~/.config/nvim +User-local +.Nm +configuration directory. +See also +.Ev XDG_CONFIG_HOME . +.It Pa $VIM/sysinit.vim +System-global +.Nm +configuration file. +.It Pa $VIM +System-global +.Nm +runtime directory. +.El +.Sh AUTHORS +Nvim was started by +.An Thiago de Arruda . +Most of Vim was written by +.An -nosplit +.An Bram Moolenaar . +Vim is based on Stevie, worked on by +.An Tim Thompson , +.An Tony Andrews , +and +.An G.R. (Fred) Walter . +.Ic ":help credits" diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 37f3aa1a23..0b29abaf5f 100755 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -161,12 +161,10 @@ list(REMOVE_ITEM NVIM_SOURCES ${to_remove}) # Legacy files that do not yet pass -Wconversion. set(CONV_SOURCES - ex_cmds.c fileio.c lua/treesitter.c mbyte.c memline.c - message.c regexp.c screen.c search.c diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c index 3a35e49dc8..bf6402f938 100644 --- a/src/nvim/api/autocmd.c +++ b/src/nvim/api/autocmd.c @@ -549,9 +549,7 @@ Integer nvim_create_autocmd(uint64_t channel_id, Object event, Dict(create_autoc int retval; - for (size_t i = 0; i < patterns.size; i++) { - Object pat = patterns.items[i]; - + FOREACH_ITEM(patterns, pat, { // See: TODO(sctx) WITH_SCRIPT_CONTEXT(channel_id, { retval = autocmd_register(autocmd_id, @@ -569,7 +567,7 @@ Integer nvim_create_autocmd(uint64_t channel_id, Object event, Dict(create_autoc api_set_error(err, kErrorTypeException, "Failed to set autocmd"); goto cleanup; } - } + }) }); cleanup: @@ -781,14 +779,12 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) bool modeline = true; buf_T *buf = curbuf; - bool set_buf = false; - - char *pattern = NULL; - Object *data = NULL; - bool set_pattern = false; + Array patterns = ARRAY_DICT_INIT; Array event_array = ARRAY_DICT_INIT; + Object *data = NULL; + if (!unpack_string_or_array(&event_array, &event, "event", true, err)) { goto cleanup; } @@ -826,21 +822,18 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) } buf = find_buffer_by_handle((Buffer)buf_obj.data.integer, err); - set_buf = true; if (ERROR_SET(err)) { goto cleanup; } } - if (opts->pattern.type != kObjectTypeNil) { - if (opts->pattern.type != kObjectTypeString) { - api_set_error(err, kErrorTypeValidation, "'pattern' must be a string"); - goto cleanup; - } + if (!get_patterns_from_pattern_or_buf(&patterns, opts->pattern, opts->buffer, err)) { + goto cleanup; + } - pattern = string_to_cstr(opts->pattern.data.string); - set_pattern = true; + if (patterns.size == 0) { + ADD(patterns, STRING_OBJ(STATIC_CSTR_TO_STRING(""))); } if (opts->data.type != kObjectTypeNil) { @@ -849,16 +842,15 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) modeline = api_object_to_bool(opts->modeline, "modeline", true, err); - if (set_pattern && set_buf) { - api_set_error(err, kErrorTypeValidation, "must not set 'buffer' and 'pattern'"); - goto cleanup; - } - bool did_aucmd = false; FOREACH_ITEM(event_array, event_str, { GET_ONE_EVENT(event_nr, event_str, cleanup) - did_aucmd |= apply_autocmds_group(event_nr, pattern, NULL, true, au_group, buf, NULL, data); + FOREACH_ITEM(patterns, pat, { + char *fname = opts->buffer.type == kObjectTypeNil ? pat.data.string.data : NULL; + did_aucmd |= + apply_autocmds_group(event_nr, fname, NULL, true, au_group, buf, NULL, data); + }) }) if (did_aucmd && modeline) { @@ -867,13 +859,13 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) cleanup: api_free_array(event_array); - XFREE_CLEAR(pattern); + api_free_array(patterns); } static bool check_autocmd_string_array(Array arr, char *k, Error *err) { - for (size_t i = 0; i < arr.size; i++) { - if (arr.items[i].type != kObjectTypeString) { + FOREACH_ITEM(arr, entry, { + if (entry.type != kObjectTypeString) { api_set_error(err, kErrorTypeValidation, "All entries in '%s' must be strings", @@ -882,13 +874,13 @@ static bool check_autocmd_string_array(Array arr, char *k, Error *err) } // Disallow newlines in the middle of the line. - const String l = arr.items[i].data.string; + const String l = entry.data.string; if (memchr(l.data, NL, l.size)) { api_set_error(err, kErrorTypeValidation, "String cannot contain newlines"); return false; } - } + }) return true; } @@ -975,8 +967,8 @@ static bool get_patterns_from_pattern_or_buf(Array *patterns, Object pattern, Ob } Array array = v->data.array; - for (size_t i = 0; i < array.size; i++) { - char *pat = array.items[i].data.string.data; + FOREACH_ITEM(array, entry, { + char *pat = entry.data.string.data; size_t patlen = aucmd_pattern_length(pat); while (patlen) { ADD(*patterns, STRING_OBJ(cbuf_to_string((char *)pat, patlen))); @@ -984,15 +976,15 @@ static bool get_patterns_from_pattern_or_buf(Array *patterns, Object pattern, Ob pat = aucmd_next_pattern(pat, patlen); patlen = aucmd_pattern_length(pat); } - } + }) } else { api_set_error(err, kErrorTypeValidation, - "'pattern' must be a string"); + "'pattern' must be a string or table"); return false; } } else if (buffer.type != kObjectTypeNil) { - if (buffer.type != kObjectTypeInteger) { + if (buffer.type != kObjectTypeInteger && buffer.type != kObjectTypeBuffer) { api_set_error(err, kErrorTypeValidation, "'buffer' must be an integer"); diff --git a/src/nvim/api/command.c b/src/nvim/api/command.c index 141e1256ff..80a5449d29 100644 --- a/src/nvim/api/command.c +++ b/src/nvim/api/command.c @@ -13,6 +13,7 @@ #include "nvim/ex_docmd.h" #include "nvim/lua/executor.h" #include "nvim/ops.h" +#include "nvim/regexp.h" #include "nvim/window.h" #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -94,6 +95,7 @@ Dictionary nvim_parse_cmd(String str, Dictionary opts, Error *err) } goto end; } + vim_regfree(cmdinfo.cmdmod.cmod_filter_regmatch.regprog); // Parse arguments Array args = ARRAY_DICT_INIT; @@ -411,7 +413,7 @@ String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Error // Simply pass the first argument (if it exists) as the arg pointer to `set_cmd_addr_type()` // since it only ever checks the first argument. - set_cmd_addr_type(&ea, argc > 0 ? (char_u *)args[0] : NULL); + set_cmd_addr_type(&ea, argc > 0 ? args[0] : NULL); if (HAS_KEY(cmd->range)) { if (!(ea.argt & EX_RANGE)) { diff --git a/src/nvim/api/options.c b/src/nvim/api/options.c index 19ce25f676..8c174fc129 100644 --- a/src/nvim/api/options.c +++ b/src/nvim/api/options.c @@ -162,6 +162,19 @@ void nvim_set_option_value(String name, Object value, Dict(option) *opts, Error return; } + // If: + // - window id is provided + // - scope is not provided + // - option is global or local to window (global-local) + // + // Then force scope to local since we don't want to change the global option + if (opt_type == SREQ_WIN && scope == 0) { + int flags = get_option_value_strict(name.data, NULL, NULL, opt_type, to); + if (flags & SOPT_GLOBAL) { + scope = OPT_LOCAL; + } + } + long numval = 0; char *stringval = NULL; @@ -460,11 +473,12 @@ void set_option_to(uint64_t channel_id, void *to, int type, String name, Object stringval = value.data.string.data; } - WITH_SCRIPT_CONTEXT(channel_id, { - const int opt_flags = (type == SREQ_WIN && !(flags & SOPT_GLOBAL)) - ? 0 : (type == SREQ_GLOBAL) - ? OPT_GLOBAL : OPT_LOCAL; + // For global-win-local options -> setlocal + // For win-local options -> setglobal and setlocal (opt_flags == 0) + const int opt_flags = (type == SREQ_WIN && !(flags & SOPT_GLOBAL)) ? 0 : + (type == SREQ_GLOBAL) ? OPT_GLOBAL : OPT_LOCAL; + WITH_SCRIPT_CONTEXT(channel_id, { access_option_value_for(name.data, &numval, &stringval, opt_flags, type, to, false, err); }); } diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index c5881dbc5f..bf3fb04a18 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -2109,7 +2109,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * bool highlights = false; if (str.size < 2 || memcmp(str.data, "%!", 2)) { - const char *const errmsg = check_stl_option((char_u *)str.data); + const char *const errmsg = check_stl_option(str.data); if (errmsg) { api_set_error(err, kErrorTypeValidation, "%s", errmsg); return result; diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 69f01afcb6..7301e07a06 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -174,7 +174,7 @@ static void aupat_show(AutoPat *ap, event_T event, int previous_group) } msg_col = 4; - msg_outtrans((char_u *)ap->pat); + msg_outtrans(ap->pat); for (AutoCmd *ac = ap->cmds; ac != NULL; ac = ac->next) { // skip removed commands @@ -195,10 +195,10 @@ static void aupat_show(AutoPat *ap, event_T event, int previous_group) size_t msglen = 100; char *msg = (char *)xmallocz(msglen); snprintf(msg, msglen, "%s [%s]", exec_to_string, ac->desc); - msg_outtrans((char_u *)msg); + msg_outtrans(msg); XFREE_CLEAR(msg); } else { - msg_outtrans((char_u *)exec_to_string); + msg_outtrans(exec_to_string); } XFREE_CLEAR(exec_to_string); if (p_verbose > 0) { @@ -471,7 +471,7 @@ void augroup_del(char *name, bool stupid_legacy_mode) FOR_ALL_AUEVENTS(event) { FOR_ALL_AUPATS_IN_EVENT(event, ap) { if (ap->group == i && ap->pat != NULL) { - give_warning((char_u *)_("W19: Deleting augroup that is still in use"), true); + give_warning(_("W19: Deleting augroup that is still in use"), true); map_put(String, int)(&map_augroup_name_to_id, cstr_as_string(name), AUGROUP_DELETED); augroup_map_del(ap->group, NULL); return; @@ -717,7 +717,7 @@ char *au_event_disable(char *what) } else { STRCAT(new_ei, what); } - set_string_option_direct("ei", -1, (char_u *)new_ei, OPT_FREE, SID_NONE); + set_string_option_direct("ei", -1, new_ei, OPT_FREE, SID_NONE); xfree(new_ei); return save_ei; @@ -726,7 +726,7 @@ char *au_event_disable(char *what) void au_event_restore(char *old_ei) { if (old_ei != NULL) { - set_string_option_direct("ei", -1, (char_u *)old_ei, OPT_FREE, SID_NONE); + set_string_option_direct("ei", -1, old_ei, OPT_FREE, SID_NONE); xfree(old_ei); } } diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 85e34e910d..46adb55746 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -948,7 +948,7 @@ char *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr, int end int deleted = 0; // number of buffers deleted char *errormsg = NULL; // return value int bnr; // buffer number - char_u *p; + char *p; if (addr_count == 0) { (void)do_buffer(command, DOBUF_CURRENT, FORWARD, 0, forceit); @@ -985,13 +985,12 @@ char *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr, int end break; } if (!ascii_isdigit(*arg)) { - p = skiptowhite_esc(arg); - bnr = buflist_findpat(arg, p, command == DOBUF_WIPE, - false, false); + p = (char *)skiptowhite_esc(arg); + bnr = buflist_findpat(arg, (char_u *)p, command == DOBUF_WIPE, false, false); if (bnr < 0) { // failed break; } - arg = p; + arg = (char_u *)p; } else { bnr = getdigits_int(&arg, false, 0); } @@ -1679,8 +1678,8 @@ static inline void buf_init_changedtick(buf_T *const buf) /// @return pointer to the buffer buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int flags) { - char_u *ffname = ffname_arg; - char_u *sfname = sfname_arg; + char *ffname = (char *)ffname_arg; + char *sfname = (char *)sfname_arg; buf_T *buf; fname_expand(curbuf, &ffname, &sfname); // will allocate ffname @@ -1690,11 +1689,9 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl // We can use inode numbers when the file exists. Works better // for hard links. FileID file_id; - bool file_id_valid = (sfname != NULL - && os_fileid((char *)sfname, &file_id)); + bool file_id_valid = (sfname != NULL && os_fileid(sfname, &file_id)); if (ffname != NULL && !(flags & (BLN_DUMMY | BLN_NEW)) - && (buf = buflist_findname_file_id(ffname, &file_id, - file_id_valid)) != NULL) { + && (buf = buflist_findname_file_id(ffname, &file_id, file_id_valid)) != NULL) { xfree(ffname); if (lnum != 0) { buflist_setfpos(buf, (flags & BLN_NOCURWIN) ? NULL : curwin, @@ -1749,8 +1746,8 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl } if (ffname != NULL) { - buf->b_ffname = ffname; - buf->b_sfname = vim_strsave(sfname); + buf->b_ffname = (char_u *)ffname; + buf->b_sfname = vim_strsave((char_u *)sfname); } clear_wininfo(buf); @@ -2045,20 +2042,20 @@ void buflist_getfpos(void) /// @return buffer or NULL if not found buf_T *buflist_findname_exp(char_u *fname) { - char_u *ffname; + char *ffname; buf_T *buf = NULL; // First make the name into a full path name - ffname = (char_u *)FullName_save((char *)fname, + ffname = FullName_save((char *)fname, #ifdef UNIX - // force expansion, get rid of symbolic links - true + // force expansion, get rid of symbolic links + true #else - false + false #endif - ); // NOLINT(whitespace/parens) + ); // NOLINT(whitespace/parens) if (ffname != NULL) { - buf = buflist_findname(ffname); + buf = buflist_findname((char_u *)ffname); xfree(ffname); } return buf; @@ -2073,14 +2070,14 @@ buf_T *buflist_findname(char_u *ffname) { FileID file_id; bool file_id_valid = os_fileid((char *)ffname, &file_id); - return buflist_findname_file_id(ffname, &file_id, file_id_valid); + return buflist_findname_file_id((char *)ffname, &file_id, file_id_valid); } /// Same as buflist_findname(), but pass the FileID structure to avoid /// getting it twice for the same file. /// /// @return buffer or NULL if not found -static buf_T *buflist_findname_file_id(char_u *ffname, FileID *file_id, bool file_id_valid) +static buf_T *buflist_findname_file_id(char *ffname, FileID *file_id, bool file_id_valid) FUNC_ATTR_PURE { // Start at the last buffer, expect to find a match sooner. @@ -2213,7 +2210,7 @@ int buflist_findpat(const char_u *pattern, const char_u *pattern_end, bool unlis typedef struct { buf_T *buf; - char_u *match; + char *match; } bufmatch_T; /// Compare functions for qsort() below, that compares b_last_used. @@ -2236,9 +2233,9 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) { int count = 0; int round; - char_u *p; + char *p; int attempt; - char_u *patc; + char *patc; bufmatch_T *matches = NULL; *num_file = 0; // return values in case of FAIL @@ -2254,20 +2251,20 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) STRCPY(patc, "\\(^\\|[\\/]\\)"); STRCPY(patc + 11, pat + 1); } else { - patc = pat; + patc = (char *)pat; } // attempt == 0: try match with '\<', match at start of word // attempt == 1: try match without '\<', match anywhere for (attempt = 0; attempt <= 1; attempt++) { - if (attempt > 0 && patc == pat) { + if (attempt > 0 && (char_u *)patc == pat) { break; // there was no anchor, no need to try again } regmatch_T regmatch; - regmatch.regprog = vim_regcomp((char *)patc + attempt * 11, RE_MAGIC); + regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC); if (regmatch.regprog == NULL) { - if (patc != pat) { + if ((char_u *)patc != pat) { xfree(patc); } return FAIL; @@ -2294,16 +2291,16 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) count++; } else { if (options & WILD_HOME_REPLACE) { - p = home_replace_save(buf, p); + p = (char *)home_replace_save(buf, (char_u *)p); } else { - p = vim_strsave(p); + p = xstrdup(p); } if (matches != NULL) { matches[count].buf = buf; matches[count].match = p; count++; } else { - (*file)[count++] = p; + (*file)[count++] = (char_u *)p; } } } @@ -2325,7 +2322,7 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) } } - if (patc != pat) { + if ((char_u *)patc != pat) { xfree(patc); } @@ -2337,12 +2334,12 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) // if the current buffer is first in the list, place it at the end if (matches[0].buf == curbuf) { for (int i = 1; i < count; i++) { - (*file)[i - 1] = matches[i].match; + (*file)[i - 1] = (char_u *)matches[i].match; } - (*file)[count - 1] = matches[0].match; + (*file)[count - 1] = (char_u *)matches[0].match; } else { for (int i = 0; i < count; i++) { - (*file)[i] = matches[i].match; + (*file)[i] = (char_u *)matches[i].match; } } xfree(matches); @@ -2355,12 +2352,12 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) /// Check for a match on the file name for buffer "buf" with regprog "prog". /// /// @param ignore_case When true, ignore case. Use 'fic' otherwise. -static char_u *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case) +static char *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case) { // First try the short file name, then the long file name. - char_u *match = fname_match(rmp, buf->b_sfname, ignore_case); + char *match = fname_match(rmp, (char *)buf->b_sfname, ignore_case); if (match == NULL && rmp->regprog != NULL) { - match = fname_match(rmp, buf->b_ffname, ignore_case); + match = fname_match(rmp, (char *)buf->b_ffname, ignore_case); } return match; } @@ -2370,20 +2367,20 @@ static char_u *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case) /// @param ignore_case When true, ignore case. Use 'fileignorecase' otherwise. /// /// @return "name" when there is a match, NULL when not. -static char_u *fname_match(regmatch_T *rmp, char_u *name, bool ignore_case) +static char *fname_match(regmatch_T *rmp, char *name, bool ignore_case) { - char_u *match = NULL; - char_u *p; + char *match = NULL; + char *p; if (name != NULL) { // Ignore case when 'fileignorecase' or the argument is set. rmp->rm_ic = p_fic || ignore_case; - if (vim_regexec(rmp, name, (colnr_T)0)) { + if (vim_regexec(rmp, (char_u *)name, (colnr_T)0)) { match = name; } else if (rmp->regprog != NULL) { // Replace $(HOME) with '~' and try matching again. - p = home_replace_save(NULL, name); - if (vim_regexec(rmp, p, (colnr_T)0)) { + p = (char *)home_replace_save(NULL, (char_u *)name); + if (vim_regexec(rmp, (char_u *)p, (colnr_T)0)) { match = name; } xfree(p); @@ -2658,7 +2655,7 @@ void buflist_list(exarg_T *eap) if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); + home_replace(buf, buf->b_fname, (char *)NameBuff, MAXPATHL, true); } if (message_filtered(NameBuff)) { @@ -2688,7 +2685,7 @@ void buflist_list(exarg_T *eap) } // put "line 999" in column 40 or after the file name - i = 40 - vim_strsize(IObuff); + i = 40 - vim_strsize((char *)IObuff); do { IObuff[len++] = ' '; } while (--i > 0 && len < IOSIZE - 18); @@ -2699,7 +2696,7 @@ void buflist_list(exarg_T *eap) buf == curbuf ? (int64_t)curwin->w_cursor.lnum : (int64_t)buflist_findlnum(buf)); } - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); line_breakcheck(); } @@ -2735,10 +2732,10 @@ int buflist_name_nr(int fnum, char_u **fname, linenr_T *lnum) /// @param message give message when buffer already exists /// /// @return FAIL for failure (file name already in use by other buffer) OK otherwise. -int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, bool message) +int setfname(buf_T *buf, char *ffname_arg, char *sfname_arg, bool message) { - char_u *ffname = ffname_arg; - char_u *sfname = sfname_arg; + char *ffname = ffname_arg; + char *sfname = sfname_arg; buf_T *obuf = NULL; FileID file_id; bool file_id_valid = false; @@ -2760,7 +2757,7 @@ int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, bool message) // If the file name is already used in another buffer: // - if the buffer is loaded, fail // - if the buffer is not loaded, delete it from the list - file_id_valid = os_fileid((char *)ffname, &file_id); + file_id_valid = os_fileid(ffname, &file_id); if (!(buf->b_flags & BF_DUMMY)) { obuf = buflist_findname_file_id(ffname, &file_id, file_id_valid); } @@ -2775,16 +2772,16 @@ int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, bool message) // delete from the list close_buffer(NULL, obuf, DOBUF_WIPE, false, false); } - sfname = vim_strsave(sfname); + sfname = xstrdup(sfname); #ifdef USE_FNAME_CASE - path_fix_case(sfname); // set correct case for short file name + path_fix_case((char_u *)sfname); // set correct case for short file name #endif if (buf->b_sfname != buf->b_ffname) { xfree(buf->b_sfname); } xfree(buf->b_ffname); - buf->b_ffname = ffname; - buf->b_sfname = sfname; + buf->b_ffname = (char_u *)ffname; + buf->b_sfname = (char_u *)sfname; } buf->b_fname = (char *)buf->b_sfname; if (!file_id_valid) { @@ -2814,7 +2811,7 @@ void buf_set_name(int fnum, char_u *name) buf->b_sfname = NULL; // Allocate ffname and expand into full path. Also resolves .lnk // files on Win32. - fname_expand(buf, &buf->b_ffname, &buf->b_sfname); + fname_expand(buf, (char **)&buf->b_ffname, (char **)&buf->b_sfname); buf->b_fname = (char *)buf->b_sfname; } } @@ -2859,16 +2856,16 @@ buf_T *setaltfname(char_u *ffname, char_u *sfname, linenr_T lnum) /// @param errmsg give error message char_u *getaltfname(bool errmsg) { - char_u *fname; + char *fname; linenr_T dummy; - if (buflist_name_nr(0, &fname, &dummy) == FAIL) { + if (buflist_name_nr(0, (char_u **)&fname, &dummy) == FAIL) { if (errmsg) { emsg(_(e_noalt)); } return NULL; } - return fname; + return (char_u *)fname; } /// Add a file name to the buflist and return its number. @@ -2916,7 +2913,7 @@ void buflist_altfpos(win_T *win) bool otherfile(char_u *ffname) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { - return otherfile_buf(curbuf, ffname, NULL, false); + return otherfile_buf(curbuf, (char *)ffname, NULL, false); } /// Check that "ffname" is not the same file as the file loaded in "buf". @@ -2926,7 +2923,7 @@ bool otherfile(char_u *ffname) /// @param ffname full path name to check /// @param file_id_p information about the file at "ffname". /// @param file_id_valid whether a valid "file_id_p" was passed in. -static bool otherfile_buf(buf_T *buf, char_u *ffname, FileID *file_id_p, bool file_id_valid) +static bool otherfile_buf(buf_T *buf, char *ffname, FileID *file_id_p, bool file_id_valid) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { // no name is different @@ -2941,7 +2938,7 @@ static bool otherfile_buf(buf_T *buf, char_u *ffname, FileID *file_id_p, bool fi // If no struct stat given, get it now if (file_id_p == NULL) { file_id_p = &file_id; - file_id_valid = os_fileid((char *)ffname, file_id_p); + file_id_valid = os_fileid(ffname, file_id_p); } if (!file_id_valid) { // file_id not valid, assume files are different. @@ -2995,7 +2992,7 @@ static bool buf_same_file_id(buf_T *buf, FileID *file_id) /// @param fullname when non-zero print full path void fileinfo(int fullname, int shorthelp, int dont_truncate) { - char_u *name; + char *name; int n; char *p; char *buffer; @@ -3015,11 +3012,11 @@ void fileinfo(int fullname, int shorthelp, int dont_truncate) STRLCPY(p, buf_spname(curbuf), IOSIZE - (p - buffer)); } else { if (!fullname && curbuf->b_fname != NULL) { - name = (char_u *)curbuf->b_fname; + name = curbuf->b_fname; } else { - name = curbuf->b_ffname; + name = (char *)curbuf->b_ffname; } - home_replace(shorthelp ? curbuf : NULL, name, (char_u *)p, + home_replace(shorthelp ? curbuf : NULL, name, p, (size_t)(IOSIZE - (p - buffer)), true); } @@ -3069,7 +3066,7 @@ void fileinfo(int fullname, int shorthelp, int dont_truncate) (int)curwin->w_cursor.col + 1, (int)curwin->w_virtcol + 1); } - (void)append_arg_number(curwin, (char_u *)buffer, IOSIZE, !shortmess(SHM_FILE)); + (void)append_arg_number(curwin, buffer, IOSIZE, !shortmess(SHM_FILE)); if (dont_truncate) { // Temporarily set msg_scroll to avoid the message being truncated. @@ -3103,14 +3100,14 @@ void col_print(char_u *buf, size_t buflen, int col, int vcol) } } -static char_u *lasttitle = NULL; -static char_u *lasticon = NULL; +static char *lasttitle = NULL; +static char *lasticon = NULL; /// Put the title name in the title bar and icon of the window. void maketitle(void) { - char_u *title_str = NULL; - char_u *icon_str = NULL; + char *title_str = NULL; + char *icon_str = NULL; int maxlen = 0; int len; int mustset; @@ -3145,14 +3142,13 @@ void maketitle(void) build_stl_str_hl(curwin, buf, sizeof(buf), (char *)p_titlestring, use_sandbox, 0, maxlen, NULL, NULL); - title_str = (char_u *)buf; + title_str = buf; if (called_emsg) { - set_string_option_direct("titlestring", -1, (char_u *)"", - OPT_FREE, SID_ERROR); + set_string_option_direct("titlestring", -1, "", OPT_FREE, SID_ERROR); } called_emsg |= save_called_emsg; } else { - title_str = p_titlestring; + title_str = (char *)p_titlestring; } } else { // Format: "fname + (path) (1 of 2) - VIM". @@ -3195,7 +3191,7 @@ void maketitle(void) // Get path of file, replace home dir with ~. *buf_p++ = ' '; *buf_p++ = '('; - home_replace(curbuf, curbuf->b_ffname, (char_u *)buf_p, + home_replace(curbuf, (char *)curbuf->b_ffname, buf_p, (SPACE_FOR_DIR - (size_t)(buf_p - buf)), true); #ifdef BACKSLASH_IN_FILENAME // Avoid "c:/name" to be reduced to "c". @@ -3232,18 +3228,17 @@ void maketitle(void) *buf_p = NUL; } - append_arg_number(curwin, (char_u *)buf_p, - (int)(SPACE_FOR_ARGNR - (size_t)(buf_p - buf)), false); + append_arg_number(curwin, buf_p, (int)(SPACE_FOR_ARGNR - (size_t)(buf_p - buf)), false); xstrlcat(buf_p, " - NVIM", (sizeof(buf) - (size_t)(buf_p - buf))); if (maxlen > 0) { // Make it shorter by removing a bit in the middle. - if (vim_strsize((char_u *)buf) > maxlen) { + if (vim_strsize(buf) > maxlen) { trunc_string((char_u *)buf, (char_u *)buf, maxlen, sizeof(buf)); } } - title_str = (char_u *)buf; + title_str = buf; #undef SPACE_FOR_FNAME #undef SPACE_FOR_DIR #undef SPACE_FOR_ARGNR @@ -3252,7 +3247,7 @@ void maketitle(void) mustset = value_change(title_str, &lasttitle); if (p_icon) { - icon_str = (char_u *)buf; + icon_str = buf; if (*p_iconstring != NUL) { if (stl_syntax & STL_IN_ICON) { int use_sandbox = false; @@ -3260,34 +3255,33 @@ void maketitle(void) use_sandbox = was_set_insecurely(curwin, "iconstring", 0); called_emsg = false; - build_stl_str_hl(curwin, (char *)icon_str, sizeof(buf), + build_stl_str_hl(curwin, icon_str, sizeof(buf), (char *)p_iconstring, use_sandbox, 0, 0, NULL, NULL); if (called_emsg) { - set_string_option_direct("iconstring", -1, - (char_u *)"", OPT_FREE, SID_ERROR); + set_string_option_direct("iconstring", -1, "", OPT_FREE, SID_ERROR); } called_emsg |= save_called_emsg; } else { - icon_str = p_iconstring; + icon_str = (char *)p_iconstring; } } else { - char_u *buf_p; + char *buf_p; if (buf_spname(curbuf) != NULL) { buf_p = buf_spname(curbuf); } else { // use file name only in icon - buf_p = (char_u *)path_tail((char *)curbuf->b_ffname); + buf_p = path_tail((char *)curbuf->b_ffname); } *icon_str = NUL; // Truncate name at 100 bytes. len = (int)STRLEN(buf_p); if (len > 100) { len -= 100; - len += mb_tail_off(buf_p, buf_p + len) + 1; + len += mb_tail_off((char_u *)buf_p, (char_u *)buf_p + len) + 1; buf_p += len; } STRCPY(icon_str, buf_p); - trans_characters(icon_str, IOSIZE); + trans_characters((char_u *)icon_str, IOSIZE); } } @@ -3306,7 +3300,7 @@ void maketitle(void) /// @param[in,out] last current title string /// /// @return true if resettitle() is to be called. -static bool value_change(char_u *str, char_u **last) +static bool value_change(char *str, char **last) FUNC_ATTR_WARN_UNUSED_RESULT { if ((str == NULL) != (*last == NULL) @@ -3316,7 +3310,7 @@ static bool value_change(char_u *str, char_u **last) *last = NULL; resettitle(); } else { - *last = vim_strsave(str); + *last = xstrdup(str); return true; } } @@ -3326,8 +3320,8 @@ static bool value_change(char_u *str, char_u **last) /// Set current window title void resettitle(void) { - ui_call_set_icon(cstr_as_string((char *)lasticon)); - ui_call_set_title(cstr_as_string((char *)lasttitle)); + ui_call_set_icon(cstr_as_string(lasticon)); + ui_call_set_title(cstr_as_string(lasttitle)); ui_flush(); } @@ -3431,7 +3425,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san } // Get line & check if empty (cursorpos will show "0-1"). - const char_u *line_ptr = ml_get_buf(wp->w_buffer, lnum, false); + const char *line_ptr = (char *)ml_get_buf(wp->w_buffer, lnum, false); bool empty_line = (*line_ptr == NUL); // Get the byte value now, in case we need it below. This is more @@ -3445,7 +3439,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san wp->w_cursor.coladd = 0; byteval = 0; } else { - byteval = utf_ptr2char((char *)line_ptr + wp->w_cursor.col); + byteval = utf_ptr2char(line_ptr + wp->w_cursor.col); } int groupdepth = 0; @@ -3522,7 +3516,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san continue; } stl_items[curitem].type = Separate; - stl_items[curitem++].start = (char_u *)out_p; + stl_items[curitem++].start = out_p; continue; } @@ -3530,7 +3524,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san if (*fmt_p == STL_TRUNCMARK) { fmt_p++; stl_items[curitem].type = Trunc; - stl_items[curitem++].start = (char_u *)out_p; + stl_items[curitem++].start = out_p; continue; } @@ -3546,7 +3540,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Determine how long the group is. // Note: We set the current output position to null // so `vim_strsize` will work. - char_u *t = stl_items[stl_groupitems[groupdepth]].start; + char *t = stl_items[stl_groupitems[groupdepth]].start; *out_p = NUL; long group_len = vim_strsize(t); @@ -3579,7 +3573,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san } if (n == curitem && group_start_userhl == group_end_userhl) { // empty group - out_p = (char *)t; + out_p = t; group_len = 0; for (n = stl_groupitems[groupdepth] + 1; n < curitem; n++) { // do not use the highlighting from the removed group @@ -3589,7 +3583,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // adjust the start position of TabPage to the next // item position if (stl_items[n].type == TabPage) { - stl_items[n].start = (char_u *)out_p; + stl_items[n].start = out_p; } } } @@ -3604,7 +3598,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san long n = 0; while (group_len >= stl_items[stl_groupitems[groupdepth]].maxwid) { group_len -= ptr2cells(t + n); - n += utfc_ptr2len((char *)t + n); + n += utfc_ptr2len(t + n); } // } @@ -3612,7 +3606,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san *t = '<'; // { Move the truncated output - memmove(t + 1, t + n, (size_t)((char_u *)out_p - (t + n))); + memmove(t + 1, t + n, (size_t)(out_p - (t + n))); out_p = out_p - n + 1; // Fill up space left over by half a double-wide char. while (++group_len < stl_items[stl_groupitems[groupdepth]].minwid) { @@ -3646,7 +3640,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san } else { // { Move the group to the right group_len = (min_group_width - group_len) * utf_char2len(fillchar); - memmove(t + group_len, t, (size_t)((char_u *)out_p - t)); + memmove(t + group_len, t, (size_t)(out_p - t)); if (out_p + group_len >= (out_end_p + 1)) { group_len = (long)(out_end_p - out_p); } @@ -3692,7 +3686,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // to denote the styling to use. if (*fmt_p == STL_USER_HL) { stl_items[curitem].type = Highlight; - stl_items[curitem].start = (char_u *)out_p; + stl_items[curitem].start = out_p; stl_items[curitem].minwid = minwid > 9 ? 1 : minwid; fmt_p++; curitem++; @@ -3738,7 +3732,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san } } stl_items[curitem].type = TabPage; - stl_items[curitem].start = (char_u *)out_p; + stl_items[curitem].start = out_p; stl_items[curitem].minwid = minwid; fmt_p++; curitem++; @@ -3755,7 +3749,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san break; } stl_items[curitem].type = ClickFunc; - stl_items[curitem].start = (char_u *)out_p; + stl_items[curitem].start = out_p; stl_items[curitem].cmd = xmemdupz(t, (size_t)(fmt_p - t)); stl_items[curitem].minwid = minwid; fmt_p++; @@ -3780,7 +3774,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san if (*fmt_p == '(') { stl_groupitems[groupdepth++] = curitem; stl_items[curitem].type = Group; - stl_items[curitem].start = (char_u *)out_p; + stl_items[curitem].start = out_p; stl_items[curitem].minwid = minwid; stl_items[curitem].maxwid = maxwid; fmt_p++; @@ -3821,9 +3815,9 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san if (buf_spname(wp->w_buffer) != NULL) { STRLCPY(NameBuff, buf_spname(wp->w_buffer), MAXPATHL); } else { - char_u *t = (opt == STL_FULLPATH) ? wp->w_buffer->b_ffname - : (char_u *)wp->w_buffer->b_fname; - home_replace(wp->w_buffer, t, NameBuff, MAXPATHL, true); + char *t = (opt == STL_FULLPATH) ? (char *)wp->w_buffer->b_ffname + : wp->w_buffer->b_fname; + home_replace(wp->w_buffer, t, (char *)NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); if (opt != STL_FILENAME) { @@ -3912,18 +3906,14 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san size_t parsed_usefmt = (size_t)(block_start - usefmt); size_t str_length = STRLEN(str); size_t fmt_length = STRLEN(fmt_p); - size_t new_fmt_len = parsed_usefmt - + str_length + fmt_length + 3; - char_u *new_fmt = (char_u *)xmalloc(new_fmt_len * sizeof(char_u)); - char_u *new_fmt_p = new_fmt; - - new_fmt_p = (char_u *)memcpy(new_fmt_p, usefmt, parsed_usefmt) - + parsed_usefmt; - new_fmt_p = (char_u *)memcpy(new_fmt_p, str, str_length) - + str_length; - new_fmt_p = (char_u *)memcpy(new_fmt_p, "%}", 2) + 2; - new_fmt_p = (char_u *)memcpy(new_fmt_p, fmt_p, fmt_length) - + fmt_length; + size_t new_fmt_len = parsed_usefmt + str_length + fmt_length + 3; + char *new_fmt = xmalloc(new_fmt_len * sizeof(char)); + char *new_fmt_p = new_fmt; + + new_fmt_p = (char *)memcpy(new_fmt_p, usefmt, parsed_usefmt) + parsed_usefmt; + new_fmt_p = (char *)memcpy(new_fmt_p, str, str_length) + str_length; + new_fmt_p = (char *)memcpy(new_fmt_p, "%}", 2) + 2; + new_fmt_p = (char *)memcpy(new_fmt_p, fmt_p, fmt_length) + fmt_length; *new_fmt_p = 0; new_fmt_p = NULL; @@ -3931,7 +3921,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san xfree(usefmt); } XFREE_CLEAR(str); - usefmt = (char *)new_fmt; + usefmt = new_fmt; fmt_p = usefmt + parsed_usefmt; evaldepth++; continue; @@ -3974,7 +3964,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Store the position percentage in our temporary buffer. // Note: We cannot store the value in `num` because // `get_rel_pos` can return a named position. Ex: "Top" - get_rel_pos(wp, (char_u *)buf_tmp, TMPLEN); + get_rel_pos(wp, buf_tmp, TMPLEN); str = buf_tmp; break; @@ -3989,14 +3979,14 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Note: The call will only return true if it actually // appended data to the `buf_tmp` buffer. - if (append_arg_number(wp, (char_u *)buf_tmp, (int)sizeof(buf_tmp), false)) { + if (append_arg_number(wp, buf_tmp, (int)sizeof(buf_tmp), false)) { str = buf_tmp; } break; case STL_KEYMAP: fillable = false; - if (get_keymap_str(wp, (char_u *)"<%s>", (char_u *)buf_tmp, TMPLEN)) { + if (get_keymap_str(wp, "<%s>", buf_tmp, TMPLEN)) { str = buf_tmp; } break; @@ -4066,11 +4056,10 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // (including the comma and null terminating character) if (*wp->w_buffer->b_p_ft != NUL && STRLEN(wp->w_buffer->b_p_ft) < TMPLEN - 2) { - vim_snprintf(buf_tmp, sizeof(buf_tmp), ",%s", - wp->w_buffer->b_p_ft); + vim_snprintf(buf_tmp, sizeof(buf_tmp), ",%s", wp->w_buffer->b_p_ft); // Uppercase the file extension - for (char_u *t = (char_u *)buf_tmp; *t != 0; t++) { - *t = (char_u)TOUPPER_LOC(*t); + for (char *t = buf_tmp; *t != 0; t++) { + *t = (char)TOUPPER_LOC(*t); } str = buf_tmp; } @@ -4121,8 +4110,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Create a highlight item based on the name if (*fmt_p == '#') { stl_items[curitem].type = Highlight; - stl_items[curitem].start = (char_u *)out_p; - stl_items[curitem].minwid = -syn_name2id_len((char_u *)t, (size_t)(fmt_p - t)); + stl_items[curitem].start = out_p; + stl_items[curitem].minwid = -syn_name2id_len(t, (size_t)(fmt_p - t)); curitem++; fmt_p++; } @@ -4133,7 +4122,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // If we made it this far, the item is normal and starts at // our current position in the output buffer. // Non-normal items would have `continued`. - stl_items[curitem].start = (char_u *)out_p; + stl_items[curitem].start = out_p; stl_items[curitem].type = Normal; // Copy the item string into the output buffer @@ -4151,7 +4140,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san } // } - long l = vim_strsize((char_u *)t); + long l = vim_strsize(t); // If this item is non-empty, record that the last thing // we put in the output buffer was an item @@ -4162,7 +4151,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // If the item is too wide, truncate it from the beginning if (l > maxwid) { while (l >= maxwid) { - l -= ptr2cells((char_u *)t); + l -= ptr2cells(t); t += utfc_ptr2len(t); } @@ -4219,8 +4208,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san prevchar_isitem = true; // { Build the formatting string - char_u nstr[20]; - char_u *t = nstr; + char nstr[20]; + char *t = nstr; if (opt == STL_VIRTCOL_ALT) { *t++ = '-'; minwid--; @@ -4232,7 +4221,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Note: The `*` means we take the width as one of the arguments *t++ = '*'; - *t++ = (char_u)(base == kNumBaseHexadecimal ? 'X' : 'd'); + *t++ = base == kNumBaseHexadecimal ? 'X' : 'd'; *t = 0; // } @@ -4279,9 +4268,9 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san *++t = 0; // } - vim_snprintf(out_p, remaining_buf_len, (char *)nstr, 0, num, n); + vim_snprintf(out_p, remaining_buf_len, nstr, 0, num, n); } else { - vim_snprintf(out_p, remaining_buf_len, (char *)nstr, minwid, num); + vim_snprintf(out_p, remaining_buf_len, nstr, minwid, num); } // Advance the output buffer position to the end of the @@ -4318,15 +4307,15 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // We have now processed the entire statusline format string. // What follows is post-processing to handle alignment and highlighting. - int width = vim_strsize((char_u *)out); + int width = vim_strsize(out); if (maxwidth > 0 && width > maxwidth) { // Result is too long, must truncate somewhere. int item_idx = 0; - char_u *trunc_p; + char *trunc_p; // If there are no items, truncate from beginning if (itemcnt == 0) { - trunc_p = (char_u *)out; + trunc_p = out; // Otherwise, look for the truncation item } else { @@ -4349,7 +4338,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san if (width - vim_strsize(trunc_p) >= maxwidth) { // Walk from the beginning of the // string to find the last character that will fit. - trunc_p = (char_u *)out; + trunc_p = out; width = 0; for (;;) { width += ptr2cells(trunc_p); @@ -4359,7 +4348,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Note: Only advance the pointer if the next // character will fit in the available output space - trunc_p += utfc_ptr2len((char *)trunc_p); + trunc_p += utfc_ptr2len(trunc_p); } // Ignore any items in the statusline that occur after @@ -4381,12 +4370,12 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san long trunc_len = 0; while (width >= maxwidth) { width -= ptr2cells(trunc_p + trunc_len); - trunc_len += utfc_ptr2len((char *)trunc_p + trunc_len); + trunc_len += utfc_ptr2len(trunc_p + trunc_len); } // } // { Truncate the string - char_u *trunc_end_p = trunc_p + trunc_len; + char *trunc_end_p = trunc_p + trunc_len; STRMOVE(trunc_p + 1, trunc_end_p); // Put a `<` to mark where we truncated at @@ -4452,10 +4441,10 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san for (int i = 0; i < num_separators; i++) { int dislocation = (i == (num_separators - 1)) ? final_spaces : standard_spaces; dislocation *= utf_char2len(fillchar); - char_u *start = stl_items[stl_separator_locations[i]].start; - char_u *seploc = start + dislocation; + char *start = stl_items[stl_separator_locations[i]].start; + char *seploc = start + dislocation; STRMOVE(seploc, start); - for (char_u *s = start; s < seploc;) { + for (char *s = start; s < seploc;) { MB_CHAR2BYTES(fillchar, s); } @@ -4491,7 +4480,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san StlClickRecord *cur_tab_rec = stl_tabtab; for (long l = 0; l < itemcnt; l++) { if (stl_items[l].type == TabPage) { - cur_tab_rec->start = (char *)stl_items[l].start; + cur_tab_rec->start = stl_items[l].start; if (stl_items[l].minwid == 0) { cur_tab_rec->def.type = kStlClickDisabled; cur_tab_rec->def.tabnr = 0; @@ -4508,7 +4497,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san cur_tab_rec->def.func = NULL; cur_tab_rec++; } else if (stl_items[l].type == ClickFunc) { - cur_tab_rec->start = (char *)stl_items[l].start; + cur_tab_rec->start = stl_items[l].start; cur_tab_rec->def.type = kStlClickFuncRun; cur_tab_rec->def.tabnr = stl_items[l].minwid; cur_tab_rec->def.func = stl_items[l].cmd; @@ -4533,7 +4522,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san /// Get relative cursor position in window into "buf[buflen]", in the form 99%, /// using "Top", "Bot" or "All" when appropriate. -void get_rel_pos(win_T *wp, char_u *buf, int buflen) +void get_rel_pos(win_T *wp, char *buf, int buflen) { // Need at least 3 chars for writing. if (buflen < 3) { @@ -4556,7 +4545,7 @@ void get_rel_pos(win_T *wp, char_u *buf, int buflen) } else if (above <= 0) { STRLCPY(buf, _("Top"), buflen); } else { - vim_snprintf((char *)buf, (size_t)buflen, "%2d%%", above > 1000000L + vim_snprintf(buf, (size_t)buflen, "%2d%%", above > 1000000L ? (int)(above / ((above + below) / 100L)) : (int)(above * 100L / (above + below))); } @@ -4570,7 +4559,7 @@ void get_rel_pos(win_T *wp, char_u *buf, int buflen) /// @param add_file if true, add "file" before the arg number /// /// @return true if it was appended. -static bool append_arg_number(win_T *wp, char_u *buf, int buflen, bool add_file) +static bool append_arg_number(win_T *wp, char *buf, int buflen, bool add_file) FUNC_ATTR_NONNULL_ALL { // Nothing to do @@ -4578,7 +4567,7 @@ static bool append_arg_number(win_T *wp, char_u *buf, int buflen, bool add_file) return false; } - char_u *p = buf + STRLEN(buf); // go to the end of the buffer + char *p = buf + STRLEN(buf); // go to the end of the buffer // Early out if the string is getting too long if (p - buf + 35 >= buflen) { @@ -4591,7 +4580,7 @@ static bool append_arg_number(win_T *wp, char_u *buf, int buflen, bool add_file) STRCPY(p, "file "); p += 5; } - vim_snprintf((char *)p, (size_t)(buflen - (p - buf)), + vim_snprintf(p, (size_t)(buflen - (p - buf)), wp->w_arg_idx_invalid ? "(%d) of %d)" : "%d of %d)", wp->w_arg_idx + 1, ARGCOUNT); @@ -4604,7 +4593,7 @@ static bool append_arg_number(win_T *wp, char_u *buf, int buflen, bool add_file) /// allocated memory. /// The "*ffname" and "*sfname" pointer values on call will not be freed. /// Note that the resulting "*ffname" pointer should be considered not allocated. -void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname) +void fname_expand(buf_T *buf, char **ffname, char **sfname) { if (*ffname == NULL) { // no file name given, nothing to do return; @@ -4612,7 +4601,7 @@ void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname) if (*sfname == NULL) { // no short file name given, use ffname *sfname = *ffname; } - *ffname = (char_u *)fix_fname((char *)(*ffname)); // expand to full path + *ffname = fix_fname((*ffname)); // expand to full path #ifdef WIN32 if (!buf->b_p_bin) { @@ -4620,24 +4609,24 @@ void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname) char *rfname = os_resolve_shortcut((const char *)(*ffname)); if (rfname != NULL) { xfree(*ffname); - *ffname = (char_u *)rfname; - *sfname = (char_u *)rfname; + *ffname = rfname; + *sfname = rfname; } } #endif } /// Get the file name for an argument list entry. -char_u *alist_name(aentry_T *aep) +char *alist_name(aentry_T *aep) { buf_T *bp; // Use the name from the associated buffer if it exists. bp = buflist_findnr(aep->ae_fnum); if (bp == NULL || bp->b_fname == NULL) { - return aep->ae_fname; + return (char *)aep->ae_fname; } - return (char_u *)bp->b_fname; + return bp->b_fname; } /// do_arg_all(): Open up to 'count' windows, one for each argument. @@ -4646,7 +4635,7 @@ char_u *alist_name(aentry_T *aep) /// @param keep_tabs keep current tabs, for ":tab drop file" void do_arg_all(int count, int forceit, int keep_tabs) { - char_u *opened; // Array of weight for which args are open: + uint8_t *opened; // Array of weight for which args are open: // 0: not opened // 1: opened in other tab // 2: opened in curtab @@ -4710,7 +4699,7 @@ void do_arg_all(int count, int forceit, int keep_tabs) if (i < alist->al_ga.ga_len && (AARGLIST(alist)[i].ae_fnum == buf->b_fnum || path_full_compare(alist_name(&AARGLIST(alist)[i]), - buf->b_ffname, + (char *)buf->b_ffname, true, true) & kEqualFiles)) { int weight = 1; @@ -4722,7 +4711,7 @@ void do_arg_all(int count, int forceit, int keep_tabs) } if (weight > (int)opened[i]) { - opened[i] = (char_u)weight; + opened[i] = (uint8_t)weight; if (i == 0) { if (new_curwin != NULL) { new_curwin->w_arg_idx = opened_len; @@ -4854,7 +4843,7 @@ void do_arg_all(int count, int forceit, int keep_tabs) new_curwin = curwin; new_curtab = curtab; } - (void)do_ecmd(0, (char *)alist_name(&AARGLIST(alist)[i]), NULL, NULL, ECMD_ONE, + (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL, ECMD_ONE, ((buf_hide(curwin->w_buffer) || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) + ECMD_OLDBUF, @@ -5131,18 +5120,18 @@ void do_modelines(int flags) /// @param flags Same as for do_modelines(). static int chk_modeline(linenr_T lnum, int flags) { - char_u *s; - char_u *e; - char_u *linecopy; // local copy of any modeline found + char *s; + char *e; + char *linecopy; // local copy of any modeline found int prev; intmax_t vers; int end; int retval = OK; - char_u *save_sourcing_name; + char *save_sourcing_name; linenr_T save_sourcing_lnum; prev = -1; - for (s = ml_get(lnum); *s != NUL; s++) { + for (s = (char *)ml_get(lnum); *s != NUL; s++) { if (prev == -1 || ascii_isspace(prev)) { if ((prev != -1 && STRNCMP(s, "ex:", (size_t)3) == 0) || STRNCMP(s, "vi:", (size_t)3) == 0) { @@ -5171,7 +5160,7 @@ static int chk_modeline(linenr_T lnum, int flags) } } } - prev = *s; + prev = (uint8_t)(*s); } if (!*s) { @@ -5182,16 +5171,16 @@ static int chk_modeline(linenr_T lnum, int flags) s++; } while (s[-1] != ':'); - s = linecopy = vim_strsave(s); // copy the line, it will change + s = linecopy = xstrdup(s); // copy the line, it will change save_sourcing_lnum = sourcing_lnum; - save_sourcing_name = (char_u *)sourcing_name; + save_sourcing_name = sourcing_name; sourcing_lnum = lnum; // prepare for emsg() sourcing_name = "modelines"; end = false; while (end == false) { - s = (char_u *)skipwhite((char *)s); + s = skipwhite(s); if (*s == NUL) { break; } @@ -5218,7 +5207,7 @@ static int chk_modeline(linenr_T lnum, int flags) break; } end = true; - s = (char_u *)vim_strchr((char *)s, ' ') + 1; + s = vim_strchr(s, ' ') + 1; } *e = NUL; // truncate the set command @@ -5243,7 +5232,7 @@ static int chk_modeline(linenr_T lnum, int flags) } sourcing_lnum = save_sourcing_lnum; - sourcing_name = (char *)save_sourcing_name; + sourcing_name = save_sourcing_name; xfree(linecopy); @@ -5328,26 +5317,26 @@ bool buf_hide(const buf_T *const buf) /// @return special buffer name or /// NULL when the buffer has a normal file name. -char_u *buf_spname(buf_T *buf) +char *buf_spname(buf_T *buf) { if (bt_quickfix(buf)) { // Differentiate between the quickfix and location list buffers using // the buffer number stored in the global quickfix stack. if (buf->b_fnum == qf_stack_get_bufnr()) { - return (char_u *)_(msg_qflist); + return _(msg_qflist); } - return (char_u *)_(msg_loclist); + return _(msg_loclist); } // There is no _file_ when 'buftype' is "nofile", b_sfname // contains the name as specified by the user. if (bt_nofile(buf)) { if (buf->b_fname != NULL) { - return (char_u *)buf->b_fname; + return buf->b_fname; } if (bt_prompt(buf)) { - return (char_u *)_("[Prompt]"); + return _("[Prompt]"); } - return (char_u *)_("[Scratch]"); + return _("[Scratch]"); } if (buf->b_fname == NULL) { return buf_get_fname(buf); @@ -5530,13 +5519,13 @@ int buf_signcols(buf_T *buf, int maximum) } /// Get "buf->b_fname", use "[No Name]" if it is NULL. -char_u *buf_get_fname(const buf_T *buf) +char *buf_get_fname(const buf_T *buf) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { if (buf->b_fname == NULL) { - return (char_u *)_("[No Name]"); + return _("[No Name]"); } - return (char_u *)buf->b_fname; + return buf->b_fname; } /// Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed. @@ -5632,7 +5621,7 @@ void wipe_buffer(buf_T *buf, bool aucmd) void buf_open_scratch(handle_T bufnr, char *bufname) { (void)do_ecmd((int)bufnr, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); - (void)setfname(curbuf, (char_u *)bufname, NULL, true); + (void)setfname(curbuf, bufname, NULL, true); set_option_value("bh", 0L, "hide", OPT_LOCAL); set_option_value("bt", 0L, "nofile", OPT_LOCAL); set_option_value("swf", 0L, NULL, OPT_LOCAL); diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index f1dd8aadeb..5d1135f91c 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -373,7 +373,7 @@ struct mapblock { /// Used for highlighting in the status line. typedef struct stl_hlrec stl_hlrec_t; struct stl_hlrec { - char_u *start; + char *start; int userhl; // 0: no HL, 1-9: User HL, < 0 for syn ID }; @@ -381,7 +381,7 @@ struct stl_hlrec { typedef struct stl_item stl_item_t; struct stl_item { // Where the item starts in the status line output buffer - char_u *start; + char *start; // Function to run for ClickFunc items. char *cmd; // The minimum width of the item diff --git a/src/nvim/change.c b/src/nvim/change.c index c0796386f1..a383fe6bb3 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -1393,7 +1393,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) while (old_size < repl_size && p > leader) { MB_PTR_BACK(leader, p); - old_size += ptr2cells(p); + old_size += ptr2cells((char *)p); } l = lead_repl_len - (int)(endp - p); if (l != 0) { @@ -1413,7 +1413,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) if (l > 1) { p -= l; - if (ptr2cells(p) > 1) { + if (ptr2cells((char *)p) > 1) { p[1] = ' '; l--; } @@ -1463,7 +1463,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) int l = utfc_ptr2len((char *)p); if (l > 1) { - if (ptr2cells(p) > 1) { + if (ptr2cells((char *)p) > 1) { // Replace a double-wide char with // two spaces l--; diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 9bc0bef446..885ebca214 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -687,11 +687,12 @@ int char2cells(int c) /// @param p /// /// @return number of display cells. -int ptr2cells(const char_u *p) +int ptr2cells(const char *p_in) { + uint8_t *p = (uint8_t *)p_in; // For UTF-8 we need to look at more bytes if the first byte is >= 0x80. if (*p >= 0x80) { - return utf_ptr2cells((char *)p); + return utf_ptr2cells(p_in); } // For DBCS we can tell the cell count from the first byte. @@ -706,9 +707,9 @@ int ptr2cells(const char_u *p) /// @param s /// /// @return number of character cells. -int vim_strsize(char_u *s) +int vim_strsize(char *s) { - return vim_strnsize(s, MAXCOL); + return vim_strnsize((char_u *)s, MAXCOL); } /// Return the number of character cells string "s[len]" will take on the @@ -726,7 +727,7 @@ int vim_strnsize(char_u *s, int len) int size = 0; while (*s != NUL && --len >= 0) { int l = utfc_ptr2len((char *)s); - size += ptr2cells(s); + size += ptr2cells((char *)s); s += l; len -= l - 1; } @@ -1332,10 +1333,10 @@ char_u *skip_to_newline(const char_u *const p) /// @param[out] nr Number read from the string. /// /// @return true on success, false on error/overflow -bool try_getdigits(char_u **pp, intmax_t *nr) +bool try_getdigits(char **pp, intmax_t *nr) { errno = 0; - *nr = strtoimax((char *)(*pp), (char **)pp, 10); + *nr = strtoimax(*pp, pp, 10); if (errno == ERANGE && (*nr == INTMAX_MIN || *nr == INTMAX_MAX)) { return false; } @@ -1353,7 +1354,7 @@ bool try_getdigits(char_u **pp, intmax_t *nr) intmax_t getdigits(char_u **pp, bool strict, intmax_t def) { intmax_t number; - int ok = try_getdigits(pp, &number); + int ok = try_getdigits((char **)pp, &number); if (strict && !ok) { abort(); } diff --git a/src/nvim/debugger.c b/src/nvim/debugger.c index 29dcddfc0d..803427dd17 100644 --- a/src/nvim/debugger.c +++ b/src/nvim/debugger.c @@ -687,7 +687,7 @@ void ex_breaklist(exarg_T *eap) for (int i = 0; i < dbg_breakp.ga_len; i++) { struct debuggy *bp = &BREAKP(i); if (bp->dbg_type == DBG_FILE) { - home_replace(NULL, bp->dbg_name, NameBuff, MAXPATHL, true); + home_replace(NULL, (char *)bp->dbg_name, (char *)NameBuff, MAXPATHL, true); } if (bp->dbg_type != DBG_EXPR) { smsg(_("%3d %s %s line %" PRId64), diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 700e79ac75..f22933ec3c 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1408,8 +1408,7 @@ void diff_win_options(win_T *wp, int addbuf) } wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm); } - set_string_option_direct("fdm", -1, (char_u *)"diff", - OPT_LOCAL | OPT_FREE, 0); + set_string_option_direct("fdm", -1, "diff", OPT_LOCAL | OPT_FREE, 0); curwin = old_curwin; curbuf = curwin->w_buffer; diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index 99e99a8a9e..cbff15c84a 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -1846,7 +1846,7 @@ static void printdigraph(const digr_T *dp, result_T *previous) *p++ = dp->char2; *p++ = ' '; *p = NUL; - msg_outtrans(buf); + msg_outtrans((char *)buf); p = buf; // add a space to draw a composing char on @@ -1863,7 +1863,7 @@ static void printdigraph(const digr_T *dp, result_T *previous) } assert(p >= buf); vim_snprintf((char *)p, sizeof(buf) - (size_t)(p - buf), " %3d", dp->result); - msg_outtrans(buf); + msg_outtrans((char *)buf); } } diff --git a/src/nvim/edit.c b/src/nvim/edit.c index e0717ef8bc..1223d98fbf 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -4223,7 +4223,7 @@ static int ins_compl_get_exp(pos_T *ini) msg_hist_off = true; // reset in msg_trunc_attr() vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"), ins_buf->b_fname == NULL - ? buf_spname(ins_buf) + ? (char_u *)buf_spname(ins_buf) : ins_buf->b_sfname == NULL ? (char_u *)ins_buf->b_fname : ins_buf->b_sfname); @@ -4831,15 +4831,15 @@ static int ins_compl_next(int allow_get_expansion, int count, int insert_match, */ if (compl_shown_match->cp_fname != NULL) { char *lead = _("match in file"); - int space = sc_col - vim_strsize((char_u *)lead) - 2; - char_u *s; - char_u *e; + int space = sc_col - vim_strsize(lead) - 2; + char *s; + char *e; if (space > 0) { // We need the tail that fits. With double-byte encoding going // back from the end is very slow, thus go from the start and keep // the text that fits in "space" between "s" and "e". - for (s = e = compl_shown_match->cp_fname; *e != NUL; MB_PTR_ADV(e)) { + for (s = e = (char *)compl_shown_match->cp_fname; *e != NUL; MB_PTR_ADV(e)) { space -= ptr2cells(e); while (space < 0) { space += ptr2cells(s); @@ -4848,7 +4848,7 @@ static int ins_compl_next(int allow_get_expansion, int count, int insert_match, } msg_hist_off = true; vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead, - s > compl_shown_match->cp_fname ? "<" : "", s); + (char_u *)s > compl_shown_match->cp_fname ? "<" : "", s); msg((char *)IObuff); msg_hist_off = false; redraw_cmdline = false; // don't overwrite! @@ -5263,12 +5263,13 @@ static int ins_complete(int c, bool enable_pum) return FAIL; } - /* Return value -2 means the user complete function wants to - * cancel the complete without an error. - * Return value -3 does the same as -2 and leaves CTRL-X mode.*/ - if (col == -2) { + // Return value -2 means the user complete function wants to cancel the + // complete without an error, do the same if the function did not execute + // successfully. + if (col == -2 || aborting()) { return FAIL; } + // Return value -3 does the same as -2 and leaves CTRL-X mode. if (col == -3) { ctrl_x_mode = CTRL_X_NORMAL; edit_submode = NULL; @@ -6806,15 +6807,15 @@ void beginline(int flags) int oneright(void) { - char_u *ptr; + char *ptr; int l; if (virtual_active()) { pos_T prevpos = curwin->w_cursor; // Adjust for multi-wide char (excluding TAB) - ptr = get_cursor_pos_ptr(); - coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(utf_ptr2char((char *)ptr))) ? + ptr = (char *)get_cursor_pos_ptr(); + coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(utf_ptr2char(ptr))) ? ptr2cells(ptr) : 1)); curwin->w_set_curswant = true; // Return OK if the cursor moved, FAIL otherwise (at window edge). @@ -6822,12 +6823,12 @@ int oneright(void) || prevpos.coladd != curwin->w_cursor.coladd) ? OK : FAIL; } - ptr = get_cursor_pos_ptr(); + ptr = (char *)get_cursor_pos_ptr(); if (*ptr == NUL) { return FAIL; // already at the very end } - l = utfc_ptr2len((char *)ptr); + l = utfc_ptr2len(ptr); // move "l" bytes right, but don't end up on the NUL, unless 'virtualedit' // contains "onemore". @@ -6864,12 +6865,9 @@ int oneleft(void) } if (curwin->w_cursor.coladd == 1) { - char_u *ptr; - // Adjust for multi-wide char (not a TAB) - ptr = get_cursor_pos_ptr(); - if (*ptr != TAB && vim_isprintc(utf_ptr2char((char *)ptr)) - && ptr2cells(ptr) > 1) { + char *ptr = (char *)get_cursor_pos_ptr(); + if (*ptr != TAB && vim_isprintc(utf_ptr2char(ptr)) && ptr2cells(ptr) > 1) { curwin->w_cursor.coladd = 0; } } diff --git a/src/nvim/eval.c b/src/nvim/eval.c index be2df9488e..bb2404750b 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -469,7 +469,9 @@ void eval_clear(void) hash_clear(&compat_hashtab); free_scriptnames(); +# ifdef HAVE_WORKING_LIBINTL free_locales(); +# endif // global variables vars_clear(&globvarht); @@ -8966,7 +8968,7 @@ static void list_one_var_a(const char *prefix, const char *name, const ptrdiff_t msg_putchar(' '); } - msg_outtrans((char_u *)string); + msg_outtrans((char *)string); if (type == VAR_FUNC || type == VAR_PARTIAL) { msg_puts("()"); @@ -10122,7 +10124,7 @@ repeat: os_dirname((char_u *)dirname, MAXPATHL); if (has_homerelative) { s = xstrdup(dirname); - home_replace(NULL, (char_u *)s, (char_u *)dirname, MAXPATHL, true); + home_replace(NULL, s, dirname, MAXPATHL, true); xfree(s); } size_t namelen = STRLEN(dirname); @@ -10145,7 +10147,7 @@ repeat: } } } else { - home_replace(NULL, (char_u *)p, (char_u *)dirname, MAXPATHL, true); + home_replace(NULL, p, dirname, MAXPATHL, true); // Only replace it when it starts with '~' if (*dirname == '~') { s = xstrdup(dirname); diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 4fc6c587dd..6f5c879e0a 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -10691,7 +10691,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) // "./…" => "/home/foo/…" vim_FullName(cwd, (char *)NameBuff, sizeof(NameBuff), false); // "/home/foo/…" => "~/…" - size_t len = home_replace(NULL, NameBuff, IObuff, sizeof(IObuff), true); + size_t len = home_replace(NULL, (char *)NameBuff, (char *)IObuff, sizeof(IObuff), true); // Trim slash. if (len != 1 && (IObuff[len - 1] == '\\' || IObuff[len - 1] == '/')) { IObuff[len - 1] = '\0'; @@ -10709,7 +10709,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) // at this point the buffer has no terminal instance associated yet, so unset // the 'swapfile' option to ensure no swap file will be created curbuf->b_p_swf = false; - (void)setfname(curbuf, NameBuff, NULL, true); + (void)setfname(curbuf, (char *)NameBuff, NULL, true); // Save the job id and pid in b:terminal_job_{id,pid} Error err = ERROR_INIT; // deprecated: use 'channel' buffer option diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index 9938dc5012..8646520ec3 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -1044,9 +1044,8 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett if (tofree != NULL) { char *s = tofree; char buf[MSG_BUF_LEN]; - if (vim_strsize((char_u *)s) > MSG_BUF_CLEN) { - trunc_string((char_u *)s, (char_u *)buf, MSG_BUF_CLEN, - sizeof(buf)); + if (vim_strsize(s) > MSG_BUF_CLEN) { + trunc_string((char_u *)s, (char_u *)buf, MSG_BUF_CLEN, sizeof(buf)); s = buf; } msg_puts(s); @@ -1159,7 +1158,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett char *tofree = s; emsg_off--; if (s != NULL) { - if (vim_strsize((char_u *)s) > MSG_BUF_CLEN) { + if (vim_strsize(s) > MSG_BUF_CLEN) { trunc_string((char_u *)s, (char_u *)buf, MSG_BUF_CLEN, MSG_BUF_LEN); s = buf; } diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c index 1722f0ee1f..9496a568b9 100644 --- a/src/nvim/event/socket.c +++ b/src/nvim/event/socket.c @@ -38,7 +38,7 @@ int socket_watcher_init(Loop *loop, SocketWatcher *watcher, const char *endpoint char *port = host_end + 1; intmax_t iport; - int ok = try_getdigits(&(char_u *){ (char_u *)port }, &iport); + int ok = try_getdigits(&(char *){ port }, &iport); if (!ok || iport < 0 || iport > UINT16_MAX) { ELOG("Invalid port: %s", port); return UV_EINVAL; diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index a1f0a123b1..8016c69bcb 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -144,17 +144,15 @@ void do_ascii(const exarg_T *const eap) dig = (char *)get_digraph_for_char(cval); if (dig != NULL) { - iobuff_len += ( - vim_snprintf((char *)IObuff + iobuff_len, - sizeof(IObuff) - iobuff_len, - _("<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"), - transchar(c), buf1, buf2, cval, cval, cval, dig)); + iobuff_len += (size_t)vim_snprintf((char *)IObuff + iobuff_len, + sizeof(IObuff) - iobuff_len, + _("<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"), + transchar(c), buf1, buf2, cval, cval, cval, dig); } else { - iobuff_len += ( - vim_snprintf((char *)IObuff + iobuff_len, - sizeof(IObuff) - iobuff_len, - _("<%s>%s%s %d, Hex %02x, Octal %03o"), - transchar(c), buf1, buf2, cval, cval, cval)); + iobuff_len += (size_t)vim_snprintf((char *)IObuff + iobuff_len, + sizeof(IObuff) - iobuff_len, + _("<%s>%s%s %d, Hex %02x, Octal %03o"), + transchar(c), buf1, buf2, cval, cval, cval); } c = cc[ci++]; @@ -190,25 +188,23 @@ void do_ascii(const exarg_T *const eap) if (utf_iscomposing(c)) { IObuff[iobuff_len++] = ' '; // Draw composing char on top of a space. } - iobuff_len += utf_char2bytes(c, (char *)IObuff + iobuff_len); + iobuff_len += (size_t)utf_char2bytes(c, (char *)IObuff + iobuff_len); dig = (char *)get_digraph_for_char(c); if (dig != NULL) { - iobuff_len += ( - vim_snprintf((char *)IObuff + iobuff_len, - sizeof(IObuff) - iobuff_len, - (c < 0x10000 - ? _("> %d, Hex %04x, Oct %o, Digr %s") - : _("> %d, Hex %08x, Oct %o, Digr %s")), - c, c, c, dig)); + iobuff_len += (size_t)vim_snprintf((char *)IObuff + iobuff_len, + sizeof(IObuff) - iobuff_len, + (c < 0x10000 + ? _("> %d, Hex %04x, Oct %o, Digr %s") + : _("> %d, Hex %08x, Oct %o, Digr %s")), + c, c, c, dig); } else { - iobuff_len += ( - vim_snprintf((char *)IObuff + iobuff_len, - sizeof(IObuff) - iobuff_len, - (c < 0x10000 - ? _("> %d, Hex %04x, Octal %o") - : _("> %d, Hex %08x, Octal %o")), - c, c, c)); + iobuff_len += (size_t)vim_snprintf((char *)IObuff + iobuff_len, + sizeof(IObuff) - iobuff_len, + (c < 0x10000 + ? _("> %d, Hex %04x, Octal %o") + : _("> %d, Hex %08x, Octal %o")), + c, c, c); } if (ci == MAX_MCO) { break; @@ -254,10 +250,10 @@ void ex_align(exarg_T *eap) * if invalid value, use 80 */ if (width <= 0) { - width = curbuf->b_p_tw; + width = (int)curbuf->b_p_tw; } if (width == 0 && curbuf->b_p_wm > 0) { - width = curwin->w_width_inner - curbuf->b_p_wm; + width = curwin->w_width_inner - (int)curbuf->b_p_wm; } if (width <= 0) { width = 80; @@ -325,7 +321,6 @@ static int linelen(int *has_tab) char *line; char *first; char *last; - int save; int len; // Get the line. If it's empty bail out early (could be the empty string @@ -340,7 +335,7 @@ static int linelen(int *has_tab) // find the character after the last non-blank character for (last = first + STRLEN(first); last > first && ascii_iswhite(last[-1]); last--) {} - save = (char_u)(*last); + char save = *last; *last = NUL; // Get line length. len = linetabsize((char_u *)line); @@ -428,10 +423,10 @@ static int sort_compare(const void *s1, const void *s2) // guarantee that the first pointer becomes invalid when obtaining the // second one. memcpy(sortbuf1, ml_get(l1.lnum) + l1.st_u.line.start_col_nr, - l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr + 1); + (size_t)(l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr + 1)); sortbuf1[l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr] = NUL; memcpy(sortbuf2, ml_get(l2.lnum) + l2.st_u.line.start_col_nr, - l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1); + (size_t)(l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1)); sortbuf2[l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr] = NUL; result = string_compare(sortbuf1, sortbuf2); @@ -451,7 +446,7 @@ void ex_sort(exarg_T *eap) int len; linenr_T lnum; long maxlen = 0; - size_t count = eap->line2 - eap->line1 + 1; + size_t count = (size_t)(eap->line2 - eap->line1) + 1; size_t i; char *p; char *s; @@ -635,8 +630,8 @@ void ex_sort(exarg_T *eap) } // Allocate a buffer that can hold the longest line. - sortbuf1 = xmalloc(maxlen + 1); - sortbuf2 = xmalloc(maxlen + 1); + sortbuf1 = xmalloc((size_t)maxlen + 1); + sortbuf2 = xmalloc((size_t)maxlen + 1); // Sort the array of line numbers. Note: can't be interrupted! qsort((void *)nrs, count, sizeof(sorti_T), sort_compare); @@ -660,7 +655,7 @@ void ex_sort(exarg_T *eap) s = (char *)ml_get(get_lnum); size_t bytelen = STRLEN(s) + 1; // include EOL in bytelen - old_count += bytelen; + old_count += (bcount_t)bytelen; if (!unique || i == 0 || string_compare(s, sortbuf1) != 0) { // Copy the line into a buffer, it may become invalid in // ml_append(). And it's needed for "unique". @@ -668,7 +663,7 @@ void ex_sort(exarg_T *eap) if (ml_append(lnum++, sortbuf1, (colnr_T)0, false) == FAIL) { break; } - new_count += bytelen; + new_count += (bcount_t)bytelen; } fast_breakcheck(); if (got_int) { @@ -686,21 +681,21 @@ void ex_sort(exarg_T *eap) } // Adjust marks for deleted (or added) lines and prepare for displaying. - deleted = (long)(count - (lnum - eap->line2)); + deleted = (long)count - (lnum - eap->line2); if (deleted > 0) { - mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted, + mark_adjust(eap->line2 - (linenr_T)deleted, eap->line2, (long)MAXLNUM, (linenr_T)(-deleted), kExtmarkNOOP); msgmore(-deleted); } else if (deleted < 0) { - mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, kExtmarkNOOP); + mark_adjust(eap->line2, MAXLNUM, (linenr_T)(-deleted), 0L, kExtmarkNOOP); } if (change_occurred || deleted != 0) { extmark_splice(curbuf, eap->line1 - 1, 0, - count, 0, old_count, + (int)count, 0, old_count, lnum - eap->line2, 0, new_count, kExtmarkUndo); - changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true); + changed_lines(eap->line1, 0, eap->line2 + 1, (linenr_T)(-deleted), true); } curwin->w_cursor.lnum = eap->line1; @@ -757,7 +752,7 @@ void ex_retab(exarg_T *eap) new_vts_array = curbuf->b_p_vts_array; new_ts_str = NULL; } else { - new_ts_str = xstrnsave(new_ts_str, eap->arg - new_ts_str); + new_ts_str = xstrnsave(new_ts_str, (size_t)(eap->arg - new_ts_str)); } for (lnum = eap->line1; !got_int && lnum <= eap->line2; lnum++) { ptr = (char *)ml_get(lnum); @@ -786,7 +781,7 @@ void ex_retab(exarg_T *eap) if (!curbuf->b_p_et) { int t, s; - tabstop_fromto(start_vcol, vcol, + tabstop_fromto((colnr_T)start_vcol, (colnr_T)vcol, curbuf->b_p_ts, new_vts_array, &t, &s); num_tabs = t; num_spaces = s; @@ -810,7 +805,7 @@ void ex_retab(exarg_T *eap) emsg(_(e_resulting_text_too_long)); break; } - new_line = xmalloc(new_len); + new_line = xmalloc((size_t)new_len); if (start_col > 0) { memmove(new_line, ptr, (size_t)start_col); @@ -881,8 +876,7 @@ void ex_retab(exarg_T *eap) long *old_vts_ary = curbuf->b_p_vts_array; if (tabstop_count(old_vts_ary) > 0 || tabstop_count(new_vts_array) > 1) { - set_string_option_direct("vts", -1, (char_u *)new_ts_str, - OPT_FREE | OPT_LOCAL, 0); + set_string_option_direct("vts", -1, new_ts_str, OPT_FREE | OPT_LOCAL, 0); curbuf->b_p_vts_array = new_vts_array; xfree(old_vts_ary); } else { @@ -1139,7 +1133,7 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out char *t; char *p; char *trailarg; - int len; + size_t len; int scroll_save = msg_scroll; // @@ -1163,9 +1157,9 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out bool ins_prevcmd = forceit; trailarg = arg; do { - len = (int)STRLEN(trailarg) + 1; + len = STRLEN(trailarg) + 1; if (newcmd != NULL) { - len += (int)STRLEN(newcmd); + len += STRLEN(newcmd); } if (ins_prevcmd) { if (prevcmd == NULL) { @@ -1173,7 +1167,7 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out xfree(newcmd); return; } - len += (int)STRLEN(prevcmd); + len += STRLEN(prevcmd); } t = xmalloc(len); *t = NUL; @@ -1237,7 +1231,7 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out msg_start(); msg_putchar(':'); msg_putchar('!'); - msg_outtrans((char_u *)newcmd); + msg_outtrans(newcmd); msg_clr_eos(); ui_cursor_goto(msg_row, msg_col); @@ -1374,7 +1368,7 @@ static void do_filter(linenr_T line1, linenr_T line2, exarg_T *eap, char *cmd, b read_linecount = curbuf->b_ml.ml_line_count; // Pass on the kShellOptDoOut flag when the output is being redirected. - call_shell((char_u *)cmd_buf, kShellOptFilter | shell_flags, NULL); + call_shell((char_u *)cmd_buf, (ShellOpts)(kShellOptFilter | shell_flags), NULL); xfree(cmd_buf); did_check_timestamps = FALSE; @@ -1526,7 +1520,7 @@ void do_shell(char *cmd, int flags) // This ui_cursor_goto is required for when the '\n' resulted in a "delete line // 1" command to the terminal. ui_cursor_goto(msg_row, msg_col); - (void)call_shell((char_u *)cmd, flags, NULL); + (void)call_shell((char_u *)cmd, (ShellOpts)flags, NULL); msg_didout = true; did_check_timestamps = false; need_check_timestamps = true; @@ -1573,14 +1567,18 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) #else false; #endif + bool is_pwsh = STRNCMP(invocation_path_tail(p_sh, NULL), "pwsh", 4) == 0 + || STRNCMP(invocation_path_tail(p_sh, NULL), "powershell", 10) == 0; size_t len = STRLEN(cmd) + 1; // At least enough space for cmd + NULL. len += is_fish_shell ? sizeof("begin; " "; end") - 1 - : sizeof("(" ")") - 1; + : is_pwsh ? sizeof("Start-Process ") + : sizeof("(" ")") - 1; if (itmp != NULL) { - len += STRLEN(itmp) + sizeof(" { " " < " " } ") - 1; + len += is_pwsh ? STRLEN(itmp) + sizeof(" -RedirectStandardInput ") + : STRLEN(itmp) + sizeof(" { " " < " " } ") - 1; } if (otmp != NULL) { len += STRLEN(otmp) + STRLEN(p_srr) + 2; // two extra spaces (" "), @@ -1590,7 +1588,10 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) #if defined(UNIX) // Put delimiters around the command (for concatenated commands) when // redirecting input and/or output. - if (itmp != NULL || otmp != NULL) { + if (is_pwsh) { + xstrlcpy(buf, "Start-Process ", len); + xstrlcat(buf, cmd, len); + } else if (itmp != NULL || otmp != NULL) { char *fmt = is_fish_shell ? "begin; %s; end" : "(%s)"; vim_snprintf(buf, len, fmt, cmd); @@ -1599,13 +1600,22 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) } if (itmp != NULL) { - xstrlcat(buf, " < ", len - 1); - xstrlcat(buf, (const char *)itmp, len - 1); + if (is_pwsh) { + xstrlcat(buf, " -RedirectStandardInput ", len - 1); + } else { + xstrlcat(buf, " < ", len - 1); + } + xstrlcat(buf, itmp, len - 1); } #else // For shells that don't understand braces around commands, at least allow // the use of commands in a pipe. - xstrlcpy(buf, (char *)cmd, len); + if (is_pwsh) { + xstrlcpy(buf, "Start-Process ", len); + xstrlcat(buf, cmd, len); + } else { + xstrlcpy(buf, cmd, len); + } if (itmp != NULL) { // If there is a pipe, we have to put the '<' in front of it. // Don't do this when 'shellquote' is not empty, otherwise the @@ -1616,10 +1626,14 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) *p = NUL; } } - xstrlcat(buf, " < ", len); - xstrlcat(buf, (const char *)itmp, len); + if (is_pwsh) { + xstrlcat(buf, " -RedirectStandardInput ", len); + } else { + xstrlcat(buf, " < ", len); + } + xstrlcat(buf, itmp, len); if (*p_shq == NUL) { - const char *const p = find_pipe((const char *)cmd); + const char *const p = find_pipe(cmd); if (p != NULL) { xstrlcat(buf, " ", len - 1); // Insert a space before the '|' for DOS xstrlcat(buf, p, len - 1); @@ -1657,9 +1671,9 @@ void append_redir(char *const buf, const size_t buflen, const char *const opt, } if (p != NULL) { *end = ' '; // not really needed? Not with sh, ksh or bash - vim_snprintf(end + 1, (size_t)(buflen - (end + 1 - buf)), opt, fname); + vim_snprintf(end + 1, (size_t)((ptrdiff_t)buflen - (end + 1 - buf)), opt, fname); } else { - vim_snprintf(end, (size_t)(buflen - (end - buf)), " %s %s", opt, fname); + vim_snprintf(end, (size_t)((ptrdiff_t)buflen - (end - buf)), " %s %s", opt, fname); } } @@ -1723,7 +1737,7 @@ int rename_buffer(char *new_fname) xfname = curbuf->b_fname; curbuf->b_ffname = NULL; curbuf->b_sfname = NULL; - if (setfname(curbuf, (char_u *)new_fname, NULL, true) == FAIL) { + if (setfname(curbuf, new_fname, NULL, true) == FAIL) { curbuf->b_ffname = (char_u *)fname; curbuf->b_sfname = (char_u *)sfname; return FAIL; @@ -2203,7 +2217,7 @@ int getfile(int fnum, char *ffname_arg, char *sfname_arg, int setpm, linenr_T ln if (fnum == 0) { // make ffname full path, set sfname - fname_expand(curbuf, (char_u **)&ffname, (char_u **)&sfname); + fname_expand(curbuf, &ffname, &sfname); other = otherfile((char_u *)ffname); free_me = ffname; // has been allocated, free() later } else { @@ -2419,7 +2433,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum linenr_T tlnum = 0; if (command != NULL) { - tlnum = atol(command); + tlnum = (linenr_T)atol(command); if (tlnum <= 0) { tlnum = 1L; } @@ -2961,7 +2975,7 @@ void ex_append(exarg_T *eap) if (p == NULL) { p = eap->nextcmd + STRLEN(eap->nextcmd); } - theline = xstrnsave(eap->nextcmd, p - eap->nextcmd); + theline = xstrnsave(eap->nextcmd, (size_t)(p - eap->nextcmd)); if (*p != NUL) { p++; } @@ -3135,38 +3149,38 @@ void ex_z(exarg_T *eap) switch (*kind) { case '-': - start = lnum - bigness * (linenr_T)(x - kind) + 1; - end = start + bigness - 1; + start = lnum - (linenr_T)bigness * (linenr_T)(x - kind) + 1; + end = start + (linenr_T)bigness - 1; curs = end; break; case '=': - start = lnum - (bigness + 1) / 2 + 1; - end = lnum + (bigness + 1) / 2 - 1; + start = lnum - ((linenr_T)bigness + 1) / 2 + 1; + end = lnum + ((linenr_T)bigness + 1) / 2 - 1; curs = lnum; minus = 1; break; case '^': - start = lnum - bigness * 2; - end = lnum - bigness; - curs = lnum - bigness; + start = lnum - (linenr_T)bigness * 2; + end = lnum - (linenr_T)bigness; + curs = lnum - (linenr_T)bigness; break; case '.': - start = lnum - (bigness + 1) / 2 + 1; - end = lnum + (bigness + 1) / 2 - 1; + start = lnum - ((linenr_T)bigness + 1) / 2 + 1; + end = lnum + ((linenr_T)bigness + 1) / 2 - 1; curs = end; break; default: // '+' start = lnum; if (*kind == '+') { - start += bigness * (linenr_T)(x - kind - 1) + 1; + start += (linenr_T)bigness * (linenr_T)(x - kind - 1) + 1; } else if (eap->addr_count == 0) { ++start; } - end = start + bigness - 1; + end = start + (linenr_T)bigness - 1; curs = end; break; } @@ -3300,7 +3314,7 @@ static bool sub_joining_lines(exarg_T *eap, char *pat, char *sub, char *cmd, boo // plus one extra line if not at the end of file. + (eap->line2 < curbuf->b_ml.ml_line_count ? 1 : 0); if (joined_lines_count > 1) { - do_join(joined_lines_count, FALSE, TRUE, FALSE, true); + do_join((size_t)joined_lines_count, false, true, false, true); sub_nsubs = joined_lines_count - 1; sub_nlines = 1; do_sub_msg(false); @@ -3339,7 +3353,7 @@ static char *sub_grow_buf(char **new_start, int needed_len) // substitution into (and some extra space to avoid // too many calls to xmalloc()/free()). new_start_len = needed_len + 50; - *new_start = xmalloc(new_start_len); + *new_start = xmalloc((size_t)new_start_len); **new_start = NUL; new_end = *new_start; } else { @@ -3347,10 +3361,10 @@ static char *sub_grow_buf(char **new_start, int needed_len) // substitution into. If not, make it larger (with a bit // extra to avoid too many calls to xmalloc()/free()). size_t len = STRLEN(*new_start); - needed_len += len; + needed_len += (int)len; if (needed_len > new_start_len) { new_start_len = needed_len + 50; - *new_start = xrealloc(*new_start, new_start_len); + *new_start = xrealloc(*new_start, (size_t)new_start_len); } new_end = *new_start + len; } @@ -3467,7 +3481,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T PreviewLines preview_lines = { KV_INITIAL_VALUE, 0 }; static int pre_hl_id = 0; pos_T old_cursor = curwin->w_cursor; - int start_nsubs; + long start_nsubs; bool did_save = false; @@ -3571,7 +3585,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T return 0; } eap->line1 = eap->line2; - eap->line2 += i - 1; + eap->line2 += (linenr_T)i - 1; if (eap->line2 > curbuf->b_ml.ml_line_count) { eap->line2 = curbuf->b_ml.ml_line_count; } @@ -3853,10 +3867,10 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T ec += numw; } - prompt = xmallocz(ec + 1); - memset(prompt, ' ', sc); - memset(prompt + sc, '^', ec - sc + 1); - resp = getcmdline_prompt(-1, prompt, 0, EXPAND_NOTHING, NULL, CALLBACK_NONE); + prompt = xmallocz((size_t)ec + 1); + memset(prompt, ' ', (size_t)sc); + memset(prompt + sc, '^', (size_t)(ec - sc) + 1); + resp = getcmdline_prompt((char)(-1), prompt, 0, EXPAND_NOTHING, NULL, CALLBACK_NONE); msg_putchar('\n'); xfree(prompt); if (resp != NULL) { @@ -3929,8 +3943,8 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T msg_ext_set_kind("confirm_sub"); smsg_attr(HL_ATTR(HLF_R), // Same highlight as wait_return(). _("replace with %s (y/n/a/q/l/^E/^Y)?"), sub); - msg_no_more = FALSE; - msg_scroll = i; + msg_no_more = false; + msg_scroll = (int)i; showruler(true); ui_cursor_goto(msg_row, msg_col); RedrawingDisabled = temp; @@ -4011,7 +4025,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T // go beyond the last line of the buffer. if (nmatch > curbuf->b_ml.ml_line_count - sub_firstlnum + 1) { nmatch = curbuf->b_ml.ml_line_count - sub_firstlnum + 1; - current_match.end.lnum = sub_firstlnum + nmatch; + current_match.end.lnum = sub_firstlnum + (linenr_T)nmatch; skip_match = true; } @@ -4020,7 +4034,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T /* For a multi-line match, make a copy of the last matched */ \ /* line and continue in that one. */ \ if (nmatch > 1) { \ - sub_firstlnum += nmatch - 1; \ + sub_firstlnum += (linenr_T)nmatch - 1; \ xfree(sub_firstline); \ sub_firstline = (char *)vim_strsave(ml_get(sub_firstlnum)); \ /* When going beyond the last line, stop substituting. */ \ @@ -4045,12 +4059,12 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T if (cmdpreview && !has_second_delim) { current_match.start.col = regmatch.startpos[0].col; if (current_match.end.lnum == 0) { - current_match.end.lnum = sub_firstlnum + nmatch - 1; + current_match.end.lnum = sub_firstlnum + (linenr_T)nmatch - 1; } current_match.end.col = regmatch.endpos[0].col; ADJUST_SUB_FIRSTLNUM(); - lnum += nmatch - 1; + lnum += (linenr_T)nmatch - 1; goto skip; } @@ -4098,13 +4112,13 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T if (nmatch == 1) { p1 = sub_firstline; } else { - p1 = (char *)ml_get(sub_firstlnum + nmatch - 1); + p1 = (char *)ml_get(sub_firstlnum + (linenr_T)nmatch - 1); nmatch_tl += nmatch - 1; } - size_t copy_len = regmatch.startpos[0].col - copycol; + size_t copy_len = (size_t)(regmatch.startpos[0].col - copycol); new_end = sub_grow_buf(&new_start, - (STRLEN(p1) - regmatch.endpos[0].col) - + copy_len + sublen + 1); + (colnr_T)STRLEN(p1) - regmatch.endpos[0].col + + (colnr_T)copy_len + sublen + 1); // copy the text up to the part that matched memmove(new_end, sub_firstline + copycol, copy_len); @@ -4112,7 +4126,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T // Finally, at this point we can know where the match actually will // start in the new text - int start_col = new_end - new_start; + int start_col = (int)(new_end - new_start); current_match.start.col = start_col; textlock++; @@ -4137,7 +4151,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T bcount_t replaced_bytes = 0; lpos_T start = regmatch.startpos[0], end = regmatch.endpos[0]; for (i = 0; i < nmatch - 1; i++) { - replaced_bytes += STRLEN(ml_get(lnum_start + i)) + 1; + replaced_bytes += (bcount_t)STRLEN(ml_get((linenr_T)(lnum_start + i))) + 1; } replaced_bytes += end.col - start.col; @@ -4180,7 +4194,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T p1 += utfc_ptr2len(p1) - 1; } } - size_t new_endcol = STRLEN(new_start); + colnr_T new_endcol = (colnr_T)STRLEN(new_start); current_match.end.col = new_endcol; current_match.end.lnum = lnum; @@ -4192,9 +4206,9 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T u_save_cursor(); did_save = true; } - extmark_splice(curbuf, lnum_start - 1, start_col, + extmark_splice(curbuf, (int)lnum_start - 1, start_col, end.lnum - start.lnum, matchcols, replaced_bytes, - lnum - lnum_start, subcols, sublen - 1, kExtmarkUndo); + lnum - (linenr_T)lnum_start, subcols, sublen - 1, kExtmarkUndo); } // 4. If subflags.do_all is set, find next match. @@ -4263,13 +4277,13 @@ skip: for (i = 0; i < nmatch_tl; i++) { ml_delete(lnum, false); } - mark_adjust(lnum, lnum + nmatch_tl - 1, - (long)MAXLNUM, -nmatch_tl, kExtmarkNOOP); + mark_adjust(lnum, lnum + (linenr_T)nmatch_tl - 1, + (long)MAXLNUM, (linenr_T)(-nmatch_tl), kExtmarkNOOP); if (subflags.do_ask) { - deleted_lines(lnum, nmatch_tl); + deleted_lines(lnum, (linenr_T)nmatch_tl); } lnum--; - line2 -= nmatch_tl; // nr of lines decreases + line2 -= (linenr_T)nmatch_tl; // nr of lines decreases nmatch_tl = 0; } @@ -4365,7 +4379,7 @@ skip: // the line number before the change (same as adding the number of // deleted lines). i = curbuf->b_ml.ml_line_count - old_line_count; - changed_lines(first_line, 0, last_line - i, i, false); + changed_lines(first_line, 0, last_line - (linenr_T)i, (linenr_T)i, false); int64_t num_added = last_line - first_line; int64_t num_removed = num_added - i; @@ -4438,8 +4452,7 @@ skip: // Show 'inccommand' preview if there are matched lines. if (cmdpreview && !aborting()) { if (got_quit || profile_passed_limit(timeout)) { // Too slow, disable. - set_string_option_direct("icm", -1, (char_u *)"", OPT_FREE, - SID_NONE); + set_string_option_direct("icm", -1, "", OPT_FREE, SID_NONE); } else if (*p_icm != NUL && pat != NULL) { if (pre_hl_id == 0) { pre_hl_id = syn_check_group(S_LEN("Substitute")); @@ -4598,8 +4611,7 @@ void ex_global(exarg_T *eap) if (global_busy) { lnum = curwin->w_cursor.lnum; - match = vim_regexec_multi(®match, curwin, curbuf, lnum, - (colnr_T)0, NULL, NULL); + match = (int)vim_regexec_multi(®match, curwin, curbuf, lnum, 0, NULL, NULL); if ((type == 'g' && match) || (type == 'v' && !match)) { global_exe_one(cmd, lnum); } @@ -4607,8 +4619,7 @@ void ex_global(exarg_T *eap) // pass 1: set marks for each (not) matching line for (lnum = eap->line1; lnum <= eap->line2 && !got_int; lnum++) { // a match on this line? - match = vim_regexec_multi(®match, curwin, curbuf, lnum, - (colnr_T)0, NULL, NULL); + match = (int)vim_regexec_multi(®match, curwin, curbuf, lnum, 0, NULL, NULL); if (regmatch.regprog == NULL) { break; // re-compiling regprog failed } @@ -4729,7 +4740,7 @@ bool prepare_tagpreview(bool undo_sync) and 'cursorbind' */ curwin->w_p_diff = false; // no 'diff' set_string_option_direct("fdc", -1, // no 'foldcolumn' - (char_u *)"0", OPT_FREE, SID_NONE); + "0", OPT_FREE, SID_NONE); return true; } } @@ -4984,7 +4995,7 @@ int help_heuristic(char *matched_string, int offset, int wrong_case) if (matched_string[0] == '+' && matched_string[1] != NUL) { offset += 100; } - return (int)(100 * num_letters + STRLEN(matched_string) + offset); + return 100 * num_letters + (int)STRLEN(matched_string) + offset; } /// Compare functions for qsort() below, that checks the help heuristics number @@ -5165,7 +5176,7 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep STRCPY(d, "CTRL-"); d += 5; if (*s < ' ') { - *d++ = *s + '@'; + *d++ = (char)(*s + '@'); if (d[-1] == '\\') { *d++ = '\\'; // double a backslash } @@ -5259,8 +5270,7 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep static void prepare_help_buffer(void) { curbuf->b_help = true; - set_string_option_direct("buftype", -1, (char_u *)"help", - OPT_FREE|OPT_LOCAL, 0); + set_string_option_direct("buftype", -1, "help", OPT_FREE|OPT_LOCAL, 0); // Always set these options after jumping to a help tag, because the // user may have an autocommand that gets in the way. @@ -5269,14 +5279,13 @@ static void prepare_help_buffer(void) // Only set it when needed, buf_init_chartab() is some work. char *p = "!-~,^*,^|,^\",192-255"; if (STRCMP(curbuf->b_p_isk, p) != 0) { - set_string_option_direct("isk", -1, (char_u *)p, OPT_FREE|OPT_LOCAL, 0); + set_string_option_direct("isk", -1, p, OPT_FREE|OPT_LOCAL, 0); check_buf_options(curbuf); (void)buf_init_chartab(curbuf, FALSE); } // Don't use the global foldmethod. - set_string_option_direct("fdm", -1, (char_u *)"manual", - OPT_FREE|OPT_LOCAL, 0); + set_string_option_direct("fdm", -1, "manual", OPT_FREE|OPT_LOCAL, 0); curbuf->b_p_ts = 8; // 'tabstop' is 8. curwin->w_p_list = FALSE; // No list mode. @@ -5362,7 +5371,7 @@ void fix_help_buffer(void) copy_option_part((char_u **)&p, NameBuff, MAXPATHL, ","); char *const rt = vim_getenv("VIMRUNTIME"); if (rt != NULL - && path_full_compare((char_u *)rt, NameBuff, false, true) != kEqualFiles) { + && path_full_compare(rt, (char *)NameBuff, false, true) != kEqualFiles) { int fcount; char **fnames; char *s; @@ -5569,8 +5578,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool // add the "help-tags" tag. ga_init(&ga, (int)sizeof(char_u *), 100); if (add_help_tags - || path_full_compare((char_u *)"$VIMRUNTIME/doc", - (char_u *)dir, false, true) == kEqualFiles) { + || path_full_compare("$VIMRUNTIME/doc", dir, false, true) == kEqualFiles) { size_t s_len = 18 + STRLEN(tagfname); s = xmalloc(s_len); snprintf(s, s_len, "help-tags\t%s\t1\n", tagfname); @@ -5635,7 +5643,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool || s[1] == '\0')) { *p2 = '\0'; p1++; - size_t s_len= (p2 - p1) + STRLEN(fname) + 2; + size_t s_len= (size_t)(p2 - p1) + STRLEN(fname) + 2; s = xmalloc(s_len); GA_APPEND(char *, &ga, s); snprintf(s, s_len, "%s\t%s", p1, fname); @@ -5756,8 +5764,8 @@ static void do_helptags(char *dirname, bool add_help_tags, bool ignore_writeerr) && ASCII_ISALPHA(files[i][len - 2]) && TOLOWER_ASC(files[i][len - 1]) == 'x') { // ".abx" -> language "ab" - lang[0] = TOLOWER_ASC(files[i][len - 3]); - lang[1] = TOLOWER_ASC(files[i][len - 2]); + lang[0] = (char)TOLOWER_ASC(files[i][len - 3]); + lang[1] = (char)TOLOWER_ASC(files[i][len - 2]); } else { continue; } @@ -5771,8 +5779,8 @@ static void do_helptags(char *dirname, bool add_help_tags, bool ignore_writeerr) if (j == ga.ga_len) { // New language, add it. ga_grow(&ga, 2); - ((char_u *)ga.ga_data)[ga.ga_len++] = lang[0]; - ((char_u *)ga.ga_data)[ga.ga_len++] = lang[1]; + ((char *)ga.ga_data)[ga.ga_len++] = lang[0]; + ((char *)ga.ga_data)[ga.ga_len++] = lang[1]; } } @@ -5781,8 +5789,8 @@ static void do_helptags(char *dirname, bool add_help_tags, bool ignore_writeerr) */ for (j = 0; j < ga.ga_len; j += 2) { STRCPY(fname, "tags-xx"); - fname[5] = ((char_u *)ga.ga_data)[j]; - fname[6] = ((char_u *)ga.ga_data)[j + 1]; + fname[5] = ((char *)ga.ga_data)[j]; + fname[6] = ((char *)ga.ga_data)[j + 1]; if (fname[5] == 'e' && fname[6] == 'n') { // English is an exception: use ".txt" and "tags". fname[4] = NUL; @@ -5861,8 +5869,7 @@ static int show_sub(exarg_T *eap, pos_T old_cusr, PreviewLines *preview_lines, i buf_T *cmdpreview_buf = NULL; // disable file info message - set_string_option_direct("shm", -1, (char_u *)"F", OPT_FREE, - SID_NONE); + set_string_option_direct("shm", -1, "F", OPT_FREE, SID_NONE); // Update the topline to ensure that main window is on the correct line update_topline(curwin); @@ -5889,7 +5896,7 @@ static int show_sub(exarg_T *eap, pos_T old_cusr, PreviewLines *preview_lines, i if (lines.subresults.size > 0) { highest_num_line = kv_last(lines.subresults).end.lnum; - col_width = log10(highest_num_line) + 1 + 3; + col_width = (int)log10(highest_num_line) + 1 + 3; } } @@ -5934,7 +5941,7 @@ static int show_sub(exarg_T *eap, pos_T old_cusr, PreviewLines *preview_lines, i line = ""; } else { line = (char *)ml_get_buf(orig_buf, next_linenr, false); - line_size = strlen(line) + col_width + 1; + line_size = strlen(line) + (size_t)col_width + 1; // Reallocate if line not long enough if (line_size > old_line_size) { @@ -5957,14 +5964,14 @@ static int show_sub(exarg_T *eap, pos_T old_cusr, PreviewLines *preview_lines, i } linenr_origbuf = match.end.lnum; - bufhl_add_hl_pos_offset(cmdpreview_buf, cmdpreview_ns, hl_id, p_start, p_end, col_width); + bufhl_add_hl_pos_offset(cmdpreview_buf, (int)cmdpreview_ns, hl_id, p_start, p_end, col_width); } - bufhl_add_hl_pos_offset(orig_buf, cmdpreview_ns, hl_id, match.start, match.end, 0); + bufhl_add_hl_pos_offset(orig_buf, (int)cmdpreview_ns, hl_id, match.start, match.end, 0); } xfree(str); - set_string_option_direct("shm", -1, (char_u *)save_shm_p, OPT_FREE, SID_NONE); + set_string_option_direct("shm", -1, save_shm_p, OPT_FREE, SID_NONE); xfree(save_shm_p); return preview ? 2 : 1; @@ -5974,7 +5981,6 @@ static int show_sub(exarg_T *eap, pos_T old_cusr, PreviewLines *preview_lines, i void ex_substitute(exarg_T *eap) { (void)do_sub(eap, profile_zero(), 0, 0); - return; } /// :substitute command preview callback. @@ -6065,7 +6071,7 @@ void ex_oldfiles(exarg_T *eap) if (!message_filtered((char_u *)fname)) { msg_outnum(nr); msg_puts(": "); - msg_outtrans((char_u *)tv_get_string(TV_LIST_ITEM_TV(li))); + msg_outtrans((char *)tv_get_string(TV_LIST_ITEM_TV(li))); msg_clr_eos(); msg_putchar('\n'); ui_flush(); // output one line at a time @@ -6082,7 +6088,7 @@ void ex_oldfiles(exarg_T *eap) nr = prompt_for_number(false); msg_starthere(); if (nr > 0 && nr <= tv_list_len(l)) { - const char *const p = tv_list_find_str(l, nr - 1); + const char *const p = tv_list_find_str(l, (int)nr - 1); if (p == NULL) { return; } diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 9b260f9091..621004103e 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -732,7 +732,7 @@ bool check_changed_any(bool hidden, bool unload) if ((buf->terminal && channel_job_running((uint64_t)buf->b_p_channel)) ? semsg(_("E947: Job still running in buffer \"%s\""), buf->b_fname) : semsg(_("E162: No write since last change for buffer \"%s\""), - buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname)) { + buf_spname(buf) != NULL ? buf_spname(buf) : buf->b_fname)) { save = no_wait_return; no_wait_return = false; wait_return(false); @@ -929,8 +929,7 @@ static int do_arglist(char *str, int what, int after, bool will_edit) didone = false; for (match = 0; match < ARGCOUNT; match++) { - if (vim_regexec(®match, alist_name(&ARGLIST[match]), - (colnr_T)0)) { + if (vim_regexec(®match, (char_u *)alist_name(&ARGLIST[match]), (colnr_T)0)) { didone = true; xfree(ARGLIST[match].ae_fname); memmove(ARGLIST + match, ARGLIST + match + 1, @@ -993,7 +992,8 @@ static bool editing_arg_idx(win_T *win) != WARGLIST(win)[win->w_arg_idx].ae_fnum && (win->w_buffer->b_ffname == NULL || !(path_full_compare(alist_name(&WARGLIST(win)[win->w_arg_idx]), - win->w_buffer->b_ffname, true, true) & kEqualFiles)))); + (char *)win->w_buffer->b_ffname, true, + true) & kEqualFiles)))); } /// Check if window "win" is editing the w_arg_idx file in its argument list. @@ -1011,7 +1011,7 @@ void check_arg_idx(win_T *win) && (win->w_buffer->b_fnum == GARGLIST[GARGCOUNT - 1].ae_fnum || (win->w_buffer->b_ffname != NULL && (path_full_compare(alist_name(&GARGLIST[GARGCOUNT - 1]), - win->w_buffer->b_ffname, true, true) + (char *)win->w_buffer->b_ffname, true, true) & kEqualFiles)))) { arg_had_last = true; } @@ -1050,7 +1050,7 @@ void ex_args(exarg_T *eap) // required and no wait_return(). gotocmdline(true); for (int i = 0; i < ARGCOUNT; i++) { - items[i] = (char *)alist_name(&ARGLIST[i]); + items[i] = alist_name(&ARGLIST[i]); } list_in_columns((char_u **)items, ARGCOUNT, curwin->w_arg_idx); xfree(items); @@ -1137,7 +1137,7 @@ void do_argfile(exarg_T *eap, int argn) // the same buffer other = true; if (buf_hide(curbuf)) { - p = fix_fname((char *)alist_name(&ARGLIST[argn])); + p = fix_fname(alist_name(&ARGLIST[argn])); other = otherfile((char_u *)p); xfree(p); } @@ -1159,7 +1159,7 @@ void do_argfile(exarg_T *eap, int argn) // Edit the file; always use the last known line number. // When it fails (e.g. Abort for already edited file) restore the // argument index. - if (do_ecmd(0, (char *)alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, + if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, eap, ECMD_LAST, (buf_hide(curwin->w_buffer) ? ECMD_HIDE : 0) + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL) { @@ -1568,7 +1568,7 @@ char *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx) if (idx >= ARGCOUNT) { return NULL; } - return (char *)alist_name(&ARGLIST[idx]); + return alist_name(&ARGLIST[idx]); } /// ":compiler[!] {name}" @@ -2206,11 +2206,11 @@ void ex_scriptnames(exarg_T *eap) for (int i = 1; i <= script_items.ga_len && !got_int; i++) { if (SCRIPT_ITEM(i).sn_name != NULL) { - home_replace(NULL, SCRIPT_ITEM(i).sn_name, NameBuff, MAXPATHL, true); + home_replace(NULL, (char *)SCRIPT_ITEM(i).sn_name, (char *)NameBuff, MAXPATHL, true); vim_snprintf((char *)IObuff, IOSIZE, "%3d: %s", i, NameBuff); if (!message_filtered(IObuff)) { msg_putchar('\n'); - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); line_breakcheck(); } } diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index 8280f99547..9350a9f60b 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -274,7 +274,7 @@ typedef struct { int cmod_verbose; ///< 0 if not set, > 0 to set 'verbose' to cmod_verbose - 1 // values for undo_cmdmod() - char_u *cmod_save_ei; ///< saved value of 'eventignore' + char *cmod_save_ei; ///< saved value of 'eventignore' int cmod_did_sandbox; ///< set when "sandbox" was incremented long cmod_verbose_save; ///< if 'verbose' was set: value of p_verbose plus one int cmod_save_msg_silent; ///< if non-zero: saved value of msg_silent + 1 diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 671e83def6..48e6dad720 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -82,8 +82,13 @@ #include "nvim/vim.h" #include "nvim/window.h" -static char *e_no_such_user_defined_command_str = N_("E184: No such user-defined command: %s"); -static char *e_no_such_user_defined_command_in_current_buffer_str +static char e_no_such_user_defined_command_str[] + = N_("E184: No such user-defined command: %s"); +static char e_ambiguous_use_of_user_defined_command[] + = N_("E464: Ambiguous use of user-defined command"); +static char e_not_an_editor_command[] + = N_("E492: Not an editor command"); +static char e_no_such_user_defined_command_in_current_buffer_str[] = N_("E1237: No such user-defined command in current buffer: %s"); static int quitmore = 0; @@ -1207,7 +1212,7 @@ static char *skip_colon_white(const char *p, bool skipleadingwhite) /// Set the addr type for command /// /// @param p pointer to character after command name in cmdline -void set_cmd_addr_type(exarg_T *eap, char_u *p) +void set_cmd_addr_type(exarg_T *eap, char *p) { // ea.addr_type for user commands is set by find_ucmd if (IS_USER_CMDIDX(eap->cmdidx)) { @@ -1220,7 +1225,7 @@ void set_cmd_addr_type(exarg_T *eap, char_u *p) } // :wincmd range depends on the argument if (eap->cmdidx == CMD_wincmd && p != NULL) { - get_wincmd_addr_type(skipwhite((char *)p), eap); + get_wincmd_addr_type(skipwhite(p), eap); } // :.cc in quickfix window uses line number if ((eap->cmdidx == CMD_cc || eap->cmdidx == CMD_ll) && bt_quickfix(curbuf)) { @@ -1400,6 +1405,8 @@ bool is_cmd_ni(cmdidx_T cmdidx) } /// Parse command line and return information about the first command. +/// If parsing is done successfully, need to free cmod_filter_regmatch.regprog after calling, +/// usually done using undo_cmdmod() or execute_cmd(). /// /// @param cmdline Command line string /// @param[out] eap Ex command arguments @@ -1427,6 +1434,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er // Parse command modifiers if (parse_command_modifiers(eap, errormsg, &cmdinfo->cmdmod, false) == FAIL) { + vim_regfree(cmdinfo->cmdmod.cmod_filter_regmatch.regprog); return false; } after_modifier = eap->cmd; @@ -1439,9 +1447,13 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er eap->cmd = skipwhite(eap->cmd + 1); } p = find_ex_command(eap, NULL); + if (p == NULL) { + *errormsg = _(e_ambiguous_use_of_user_defined_command); + return false; + } // Set command address type and parse command range - set_cmd_addr_type(eap, (char_u *)p); + set_cmd_addr_type(eap, p); eap->cmd = cmd; if (parse_cmd_address(eap, errormsg, false) == FAIL) { return false; @@ -1455,7 +1467,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er } // Fail if command is invalid if (eap->cmdidx == CMD_SIZE) { - STRCPY(IObuff, _("E492: Not an editor command")); + STRCPY(IObuff, _(e_not_an_editor_command)); // If the modifier was parsed OK the error must be in the following command char *cmdname = after_modifier ? after_modifier : cmdline; append_command(cmdname); @@ -1812,7 +1824,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter // The ea.cmd pointer is updated to point to the first character following the // range spec. If an initial address is found, but no second, the upper bound // is equal to the lower. - set_cmd_addr_type(&ea, (char_u *)p); + set_cmd_addr_type(&ea, p); ea.cmd = cmd; if (parse_cmd_address(&ea, &errormsg, false) == FAIL) { @@ -1886,14 +1898,14 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter if (p == NULL) { if (!ea.skip) { - errormsg = _("E464: Ambiguous use of user-defined command"); + errormsg = _(e_ambiguous_use_of_user_defined_command); } goto doend; } // Check for wrong commands. if (ea.cmdidx == CMD_SIZE) { if (!ea.skip) { - STRCPY(IObuff, _("E492: Not an editor command")); + STRCPY(IObuff, _(e_not_an_editor_command)); // If the modifier was parsed OK the error must be in the following // command char *cmdname = after_modifier ? after_modifier : *cmdlinep; @@ -2655,8 +2667,8 @@ static void apply_cmdmod(cmdmod_T *cmod) if ((cmod->cmod_flags & CMOD_NOAUTOCMD) && cmod->cmod_save_ei == NULL) { // Set 'eventignore' to "all". // First save the existing option value for restoring it later. - cmod->cmod_save_ei = vim_strsave(p_ei); - set_string_option_direct("ei", -1, (char_u *)"all", OPT_FREE, SID_NONE); + cmod->cmod_save_ei = (char *)vim_strsave(p_ei); + set_string_option_direct("ei", -1, "all", OPT_FREE, SID_NONE); } } @@ -2676,7 +2688,7 @@ static void undo_cmdmod(cmdmod_T *cmod) if (cmod->cmod_save_ei != NULL) { // Restore 'eventignore' to the value before ":noautocmd". - set_string_option_direct("ei", -1, (char_u *)cmod->cmod_save_ei, OPT_FREE, SID_NONE); + set_string_option_direct("ei", -1, cmod->cmod_save_ei, OPT_FREE, SID_NONE); free_string_option((char_u *)cmod->cmod_save_ei); cmod->cmod_save_ei = NULL; } @@ -5792,7 +5804,7 @@ static void uc_list(char *name, size_t name_len) } while (len < 25 - over); IObuff[len] = '\0'; - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); msg_outtrans_special(cmd->uc_rep, false, name_len == 0 ? Columns - 47 : 0); @@ -7562,7 +7574,7 @@ static void ex_recover(exarg_T *eap) | CCGD_EXCMD) && (*eap->arg == NUL - || setfname(curbuf, (char_u *)eap->arg, NULL, true) == OK)) { + || setfname(curbuf, eap->arg, NULL, true) == OK)) { ml_recover(true); } recoverymode = false; @@ -7750,9 +7762,9 @@ static void ex_tabs(exarg_T *eap) if (buf_spname(wp->w_buffer) != NULL) { STRLCPY(IObuff, buf_spname(wp->w_buffer), IOSIZE); } else { - home_replace(wp->w_buffer, (char_u *)wp->w_buffer->b_fname, IObuff, IOSIZE, true); + home_replace(wp->w_buffer, wp->w_buffer->b_fname, (char *)IObuff, IOSIZE, true); } - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); ui_flush(); // output one line at a time os_breakcheck(); } @@ -9634,7 +9646,7 @@ static char *arg_all(void) for (;;) { len = 0; for (idx = 0; idx < ARGCOUNT; idx++) { - p = (char *)alist_name(&ARGLIST[idx]); + p = alist_name(&ARGLIST[idx]); if (p == NULL) { continue; } @@ -10031,44 +10043,6 @@ static void ex_terminal(exarg_T *eap) do_cmdline_cmd(ex_cmd); } -/// Checks if `cmd` is "previewable" (i.e. supported by 'inccommand'). -/// -/// @param[in] cmd Commandline to check. May start with a range or modifier. -/// -/// @return true if `cmd` is previewable -bool cmd_can_preview(char *cmd) -{ - if (cmd == NULL) { - return false; - } - - // Ignore additional colons at the start... - cmd = skip_colon_white(cmd, true); - - // Ignore any leading modifiers (:keeppatterns, :verbose, etc.) - for (int len = modifier_len(cmd); len != 0; len = modifier_len(cmd)) { - cmd += len; - cmd = skip_colon_white(cmd, true); - } - - exarg_T ea; - memset(&ea, 0, sizeof(ea)); - // parse the command line - ea.cmd = skip_range(cmd, NULL); - if (*ea.cmd == '*') { - ea.cmd = skipwhite(ea.cmd + 1); - } - - if (find_ex_command(&ea, NULL) == NULL || ea.cmdidx == CMD_SIZE) { - return false; - } else if (!IS_USER_CMDIDX(ea.cmdidx)) { - // find_ex_command sets the flags for user commands automatically - ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt; - } - - return (ea.argt & EX_PREVIEW); -} - /// Gets a map of maps describing user-commands defined for buffer `buf` or /// defined globally if `buf` is NULL. /// diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index e442c907b3..93758b9ec9 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -952,8 +952,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init need_wait_return = false; } - set_string_option_direct("icm", -1, s->save_p_icm, OPT_FREE, - SID_NONE); + set_string_option_direct("icm", -1, (char *)s->save_p_icm, OPT_FREE, SID_NONE); State = s->save_State; if (cmdpreview != save_cmdpreview) { cmdpreview = save_cmdpreview; // restore preview state @@ -2372,7 +2371,7 @@ static void cmdpreview_close_win(void) } } -/// Show 'inccommand' preview. It works like this: +/// Show 'inccommand' preview if command is previewable. It works like this: /// 1. Store current undo information so we can revert to current state later. /// 2. Execute the preview callback with the parsed command, preview buffer number and preview /// namespace number as arguments. The preview callback sets the highlight and does the @@ -2385,12 +2384,15 @@ static void cmdpreview_close_win(void) /// 5. If the return value of the preview callback is not 0, update the screen while the effects /// of the preview are still in place. /// 6. Revert all changes made by the preview callback. -static void cmdpreview_show(CommandLineState *s) +/// +/// @return whether preview is shown or not. +static bool cmdpreview_may_show(CommandLineState *s) { // Parse the command line and return if it fails. exarg_T ea; CmdParseInfo cmdinfo; // Copy the command line so we can modify it. + int cmdpreview_type = 0; char *cmdline = xstrdup((char *)ccline.cmdbuff); char *errormsg = NULL; emsg_off++; // Block errors when parsing the command line, and don't update v:errmsg @@ -2400,6 +2402,12 @@ static void cmdpreview_show(CommandLineState *s) } emsg_off--; + // Check if command is previewable, if not, don't attempt to show preview + if (!(ea.argt & EX_PREVIEW)) { + vim_regfree(cmdinfo.cmdmod.cmod_filter_regmatch.regprog); + goto end; + } + // Swap invalid command range if needed if ((ea.argt & EX_RANGE) && ea.line1 > ea.line2) { linenr_T lnum = ea.line1; @@ -2454,7 +2462,7 @@ static void cmdpreview_show(CommandLineState *s) // the preview. Error err = ERROR_INIT; try_start(); - int cmdpreview_type = execute_cmd(&ea, &cmdinfo, true); + cmdpreview_type = execute_cmd(&ea, &cmdinfo, true); if (try_end(&err)) { api_clear_error(&err); cmdpreview_type = 0; @@ -2518,14 +2526,9 @@ static void cmdpreview_show(CommandLineState *s) update_topline(curwin); redrawcmdline(); - - // If preview callback returned 0, update screen to clear remnants of an earlier preview. - if (cmdpreview_type == 0) { - cmdpreview = false; - update_screen(SOME_VALID); - } end: xfree(cmdline); + return cmdpreview_type != 0; } static int command_line_changed(CommandLineState *s) @@ -2564,9 +2567,9 @@ static int command_line_changed(CommandLineState *s) && *p_icm != NUL // 'inccommand' is set && curbuf->b_p_ma // buffer is modifiable && cmdline_star == 0 // not typing a password - && cmd_can_preview((char *)ccline.cmdbuff) - && !vpeekc_any()) { - cmdpreview_show(s); + && !vpeekc_any() + && cmdpreview_may_show(s)) { + // 'inccommand' preview has been shown. } else if (cmdpreview) { cmdpreview = false; update_screen(SOME_VALID); // Clear 'inccommand' preview. @@ -2747,7 +2750,7 @@ static int cmdline_charsize(int idx) if (cmdline_star > 0) { // showing '*', always 1 position return 1; } - return ptr2cells(ccline.cmdbuff + idx); + return ptr2cells((char *)ccline.cmdbuff + idx); } /// Compute the offset of the cursor on the command line for the prompt and @@ -3550,7 +3553,7 @@ void put_on_cmdline(char_u *str, int len, int redraw) } if (i != 0) { // Also backup the cursor position. - i = ptr2cells(ccline.cmdbuff + ccline.cmdpos); + i = ptr2cells((char *)ccline.cmdbuff + ccline.cmdpos); ccline.cmdspos -= i; msg_col -= i; if (msg_col < 0) { @@ -4547,10 +4550,10 @@ static int showmatches(expand_T *xp, int wildmenu) if (!showtail && (xp->xp_context == EXPAND_FILES || xp->xp_context == EXPAND_SHELLCMD || xp->xp_context == EXPAND_BUFFERS)) { - home_replace(NULL, files_found[i], NameBuff, MAXPATHL, TRUE); - j = vim_strsize(NameBuff); + home_replace(NULL, (char *)files_found[i], (char *)NameBuff, MAXPATHL, true); + j = vim_strsize((char *)NameBuff); } else { - j = vim_strsize(L_SHOWFILE(i)); + j = vim_strsize((char *)L_SHOWFILE(i)); } if (j > maxlen) { maxlen = j; @@ -4617,8 +4620,7 @@ static int showmatches(expand_T *xp, int wildmenu) if (showtail) { p = L_SHOWFILE(k); } else { - home_replace(NULL, files_found[k], NameBuff, MAXPATHL, - TRUE); + home_replace(NULL, (char *)files_found[k], (char *)NameBuff, MAXPATHL, true); p = NameBuff; } } else { @@ -6532,13 +6534,13 @@ void ex_history(exarg_T *eap) msg_putchar('\n'); snprintf((char *)IObuff, IOSIZE, "%c%6d ", i == idx ? '>' : ' ', hist[i].hisnum); - if (vim_strsize(hist[i].hisstr) > Columns - 10) { + if (vim_strsize((char *)hist[i].hisstr) > Columns - 10) { trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff), Columns - 10, IOSIZE - (int)STRLEN(IObuff)); } else { STRCAT(IObuff, hist[i].hisstr); } - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); ui_flush(); } if (i == idx) { diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index e60be80923..08c232ea69 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -215,7 +215,7 @@ static int ses_arglist(FILE *fd, char *cmd, garray_T *gap, int fullname, unsigne } for (int i = 0; i < gap->ga_len; i++) { // NULL file names are skipped (only happens when out of memory). - s = alist_name(&((aentry_T *)gap->ga_data)[i]); + s = (char_u *)alist_name(&((aentry_T *)gap->ga_data)[i]); if (s != NULL) { if (fullname) { buf = xmalloc(MAXPATHL); diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 4c1dd63b8f..f53f70dcda 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -1697,7 +1697,7 @@ failed: save_file_ff(curbuf); // If editing a new file: set 'fenc' for the current buffer. // Also for ":read ++edit file". - set_string_option_direct("fenc", -1, (char_u *)fenc, OPT_FREE | OPT_LOCAL, 0); + set_string_option_direct("fenc", -1, fenc, OPT_FREE | OPT_LOCAL, 0); } if (fenc_alloced) { xfree(fenc); @@ -2057,7 +2057,7 @@ void set_forced_fenc(exarg_T *eap) { if (eap->force_enc != 0) { char_u *fenc = enc_canonize((char_u *)eap->cmd + eap->force_enc); - set_string_option_direct("fenc", -1, fenc, OPT_FREE|OPT_LOCAL, 0); + set_string_option_direct("fenc", -1, (char *)fenc, OPT_FREE|OPT_LOCAL, 0); xfree(fenc); } } @@ -3765,7 +3765,7 @@ static int set_rw_fname(char_u *fname, char_u *sfname) return FAIL; } - if (setfname(curbuf, fname, sfname, false) == OK) { + if (setfname(curbuf, (char *)fname, (char *)sfname, false) == OK) { curbuf->b_flags |= BF_NOTEDITED; } @@ -3805,8 +3805,7 @@ static void add_quoted_fname(char *const ret_buf, const size_t buf_len, const bu fname = "-stdin-"; } ret_buf[0] = '"'; - home_replace(buf, (const char_u *)fname, (char_u *)ret_buf + 1, - (int)buf_len - 4, true); + home_replace(buf, fname, ret_buf + 1, (int)buf_len - 4, true); xstrlcat(ret_buf, "\" ", buf_len); } diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 93ad2a6926..3c3aaa1031 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -1813,7 +1813,7 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume, foldinfo_T foldin p += len - 1; } else if (*p == TAB) { *p = ' '; - } else if (ptr2cells(p) > 1) { + } else if (ptr2cells((char *)p) > 1) { break; } } diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 4426f52353..6fdc10ae0b 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1822,7 +1822,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // - waiting for a char with --more-- // - in Ctrl-X mode, and we get a valid char for that mode tb_c1 = typebuf.tb_buf[typebuf.tb_off]; - if (no_mapping == 0 && is_maphash_valid() + if (no_mapping == 0 && (no_zero_mapping == 0 || tb_c1 != '0') && (typebuf.tb_maplen == 0 || is_plug_map || (!(typebuf.tb_noremap[typebuf.tb_off] & (RM_NONE|RM_ABBR)))) @@ -2501,7 +2501,7 @@ static int vgetorpeek(bool advance) && State != MODE_HITRETURN) { // this looks nice when typing a dead character map if (State & MODE_INSERT - && ptr2cells(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1) == 1) { + && ptr2cells((char *)typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1) == 1) { edit_putchar(typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len - 1], false); setcursor(); // put cursor back where it belongs c1 = 1; @@ -2524,9 +2524,9 @@ static int vgetorpeek(bool advance) // this looks nice when typing a dead character map if ((State & MODE_CMDLINE) && cmdline_star == 0) { - char_u *p = typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1; - if (ptr2cells(p) == 1 && *p < 128) { - putcmdline((char)(*p), false); + char *p = (char *)typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1; + if (ptr2cells(p) == 1 && (uint8_t)(*p) < 128) { + putcmdline(*p, false); c1 = 1; } } diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index aeccac060a..1dd0a5f3e8 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -658,7 +658,7 @@ void ex_hardcopy(exarg_T *eap) * PS.) */ if (mch_print_init(&settings, - curbuf->b_fname == NULL ? buf_spname(curbuf) : curbuf->b_sfname == + curbuf->b_fname == NULL ? (char_u *)buf_spname(curbuf) : curbuf->b_sfname == NULL ? (char_u *)curbuf->b_fname : curbuf->b_sfname, eap->forceit) == FAIL) { return; } diff --git a/src/nvim/highlight_group.c b/src/nvim/highlight_group.c index ac7f6c4317..e5d9a9269c 100644 --- a/src/nvim/highlight_group.c +++ b/src/nvim/highlight_group.c @@ -811,7 +811,7 @@ void do_highlight(const char *line, const bool forceit, const bool init) // ":highlight {group-name}": list highlighting for one group. if (!doclear && !dolink && ends_excmd((uint8_t)(*linep))) { - id = syn_name2id_len((const char_u *)line, (size_t)(name_end - line)); + id = syn_name2id_len(line, (size_t)(name_end - line)); if (id == 0) { semsg(_("E411: highlight group not found: %s"), line); } else { @@ -1389,7 +1389,7 @@ static void highlight_list_one(const int id) didh = true; msg_puts_attr("links to", HL_ATTR(HLF_D)); msg_putchar(' '); - msg_outtrans(hl_table[hl_table[id - 1].sg_link - 1].sg_name); + msg_outtrans((char *)hl_table[hl_table[id - 1].sg_link - 1].sg_name); } if (!didh) { @@ -1450,14 +1450,14 @@ static bool highlight_list_arg(const int id, bool didh, const int type, int iarg } } - (void)syn_list_header(didh, vim_strsize((char_u *)ts) + (int)STRLEN(name) + 1, id, false); + (void)syn_list_header(didh, vim_strsize((char *)ts) + (int)STRLEN(name) + 1, id, false); didh = true; if (!got_int) { if (*name != NUL) { msg_puts_attr(name, HL_ATTR(HLF_D)); msg_puts_attr("=", HL_ATTR(HLF_D)); } - msg_outtrans((char_u *)ts); + msg_outtrans((char *)ts); } } return didh; @@ -1581,7 +1581,7 @@ bool syn_list_header(const bool did_header, const int outlen, const int id, bool if (got_int) { return true; } - msg_outtrans(hl_table[id - 1].sg_name); + msg_outtrans((char *)hl_table[id - 1].sg_name); name_col = msg_col; endcol = 15; } else if ((ui_has(kUIMessages) || msg_silent) && !force_newline) { @@ -1650,14 +1650,14 @@ static void set_hl_attr(int idx) int syn_name2id(const char *name) FUNC_ATTR_NONNULL_ALL { - return syn_name2id_len((char_u *)name, STRLEN(name)); + return syn_name2id_len(name, STRLEN(name)); } /// Lookup a highlight group name and return its ID. /// /// @param highlight name e.g. 'Cursor', 'Normal' /// @return the highlight id, else 0 if \p name does not exist -int syn_name2id_len(const char_u *name, size_t len) +int syn_name2id_len(const char *name, size_t len) FUNC_ATTR_NONNULL_ALL { char name_u[MAX_SYN_NAME + 1]; @@ -1719,7 +1719,7 @@ int syn_check_group(const char *name, size_t len) emsg(_(e_highlight_group_name_too_long)); return 0; } - int id = syn_name2id_len((char_u *)name, len); + int id = syn_name2id_len(name, len); if (id == 0) { // doesn't exist yet return syn_add_group(name, len); } @@ -1735,7 +1735,7 @@ static int syn_add_group(const char *name, size_t len) { // Check that the name is ASCII letters, digits and underscore. for (size_t i = 0; i < len; i++) { - int c = (int8_t)name[i]; + int c = (uint8_t)name[i]; if (!vim_isprintc(c)) { emsg(_("E669: Unprintable character in group name")); return 0; diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c index f01f4fc771..8d08c2fc19 100644 --- a/src/nvim/if_cscope.c +++ b/src/nvim/if_cscope.c @@ -1078,7 +1078,7 @@ static int cs_help(exarg_T *eap) (void)msg_puts(_("cscope commands:\n")); while (cmdp->name != NULL) { char *help = _(cmdp->help); - int space_cnt = 30 - vim_strsize((char_u *)help); + int space_cnt = 30 - vim_strsize(help); // Use %*s rather than %30s to ensure proper alignment in utf-8 if (space_cnt < 0) { diff --git a/src/nvim/indent.c b/src/nvim/indent.c index d71b3adb5c..8a5b4cbf0f 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -75,7 +75,7 @@ int get_indent_str(const char_u *ptr, int ts, bool list) } else { // In list mode, when tab is not set, count screen char width // for Tab, displays: ^I - count += ptr2cells(ptr); + count += ptr2cells((char *)ptr); } } else if (*ptr == ' ') { // Count a space for one. @@ -101,7 +101,7 @@ int get_indent_str_vtab(const char_u *ptr, long ts, long *vts, bool list) } else { // In list mode, when tab is not set, count screen char width // for Tab, displays: ^I - count += ptr2cells(ptr); + count += ptr2cells((char *)ptr); } } else if (*ptr == ' ') { count++; // count a space for one @@ -481,7 +481,7 @@ int get_breakindent_win(win_T *wp, char_u *line) // indent minus the length of the showbreak string if (wp->w_briopt_sbr) { - bri -= vim_strsize(get_showbreak_value(wp)); + bri -= vim_strsize((char *)get_showbreak_value(wp)); } // never indent past left window margin diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c index 29d3c5f95b..cb807dec24 100644 --- a/src/nvim/indent_c.c +++ b/src/nvim/indent_c.c @@ -2049,9 +2049,9 @@ int get_c_indent(void) if (!cin_iscomment(theline) && comment_pos != NULL) { // XXX int lead_start_len = 2; int lead_middle_len = 1; - char_u lead_start[COM_MAX_LEN]; // start-comment string - char_u lead_middle[COM_MAX_LEN]; // middle-comment string - char_u lead_end[COM_MAX_LEN]; // end-comment string + char lead_start[COM_MAX_LEN]; // start-comment string + char lead_middle[COM_MAX_LEN]; // middle-comment string + char lead_end[COM_MAX_LEN]; // end-comment string char_u *p; int start_align = 0; int start_off = 0; @@ -2084,7 +2084,7 @@ int get_c_indent(void) if (*p == ':') { p++; } - (void)copy_option_part(&p, lead_end, COM_MAX_LEN, ","); + (void)copy_option_part(&p, (char_u *)lead_end, COM_MAX_LEN, ","); if (what == COM_START) { STRCPY(lead_start, lead_end); lead_start_len = (int)STRLEN(lead_start); @@ -2120,8 +2120,7 @@ int get_c_indent(void) if (start_off != 0) { amount += start_off; } else if (start_align == COM_RIGHT) { - amount += vim_strsize(lead_start) - - vim_strsize(lead_middle); + amount += vim_strsize(lead_start) - vim_strsize(lead_middle); } break; } diff --git a/src/nvim/keycodes.c b/src/nvim/keycodes.c index e0ada32ec2..dd78ebe722 100644 --- a/src/nvim/keycodes.c +++ b/src/nvim/keycodes.c @@ -861,6 +861,9 @@ int get_mouse_button(int code, bool *is_click, bool *is_drag) /// @param[in] from What characters to replace. /// @param[in] from_len Length of the "from" argument. /// @param[out] bufp Location where results were saved in case of success (allocated). +/// if *bufp is non-NULL, it will be used directly. it is +/// assumed to be 128 bytes long (enough for transcoding LHS +/// of mapping) /// Will be set to NULL in case of failure. /// @param[in] flags REPTERM_FROM_PART see above /// REPTERM_DO_LT also translate <lt> @@ -885,10 +888,12 @@ char *replace_termcodes(const char *const from, const size_t from_len, char **co const bool do_backslash = !(cpo_flags & FLAG_CPO_BSLASH); // backslash is a special character const bool do_special = !(flags & REPTERM_NO_SPECIAL); + bool allocated = (*bufp == NULL); + // Allocate space for the translation. Worst case a single character is // replaced by 6 bytes (shifted special key), plus a NUL at the end. - const size_t buf_len = from_len * 6 + 1; - result = xmalloc(buf_len); + const size_t buf_len = allocated ? from_len * 6 + 1 : 128; + result = allocated ? xmalloc(buf_len) : *bufp; src = (char_u *)from; @@ -907,6 +912,9 @@ char *replace_termcodes(const char *const from, const size_t from_len, char **co // Copy each byte from *from to result[dlen] while (src <= end) { + if (!allocated && dlen + 64 > buf_len) { + return NULL; + } // Check for special <> keycodes, like "<C-S-LeftMouse>" if (do_special && ((flags & REPTERM_DO_LT) || ((end - src) >= 3 && STRNCMP(src, "<lt>", 4) != 0))) { @@ -1000,7 +1008,9 @@ char *replace_termcodes(const char *const from, const size_t from_len, char **co } result[dlen] = NUL; - *bufp = xrealloc(result, dlen + 1); + if (allocated) { + *bufp = xrealloc(result, dlen + 1); + } return *bufp; } diff --git a/src/nvim/main.c b/src/nvim/main.c index 124248508e..2b5a5a9033 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -1357,9 +1357,8 @@ scripterror: char_u *p = vim_strsave((char_u *)argv[0]); if (parmp->diff_mode && os_isdir(p) && GARGCOUNT > 0 - && !os_isdir(alist_name(&GARGLIST[0]))) { - char_u *r = (char_u *)concat_fnames((char *)p, - path_tail((char *)alist_name(&GARGLIST[0])), true); + && !os_isdir((char_u *)alist_name(&GARGLIST[0]))) { + char_u *r = (char_u *)concat_fnames((char *)p, path_tail(alist_name(&GARGLIST[0])), true); xfree(p); p = r; } @@ -1477,7 +1476,7 @@ static void init_path(const char *exename) /// Get filename from command line, if any. static char_u *get_fname(mparm_T *parmp, char_u *cwd) { - return alist_name(&GARGLIST[0]); + return (char_u *)alist_name(&GARGLIST[0]); } /* @@ -1502,7 +1501,7 @@ static void handle_quickfix(mparm_T *paramp) { if (paramp->edit_type == EDIT_QF) { if (paramp->use_ef != NULL) { - set_string_option_direct("ef", -1, (char_u *)paramp->use_ef, OPT_FREE, SID_CARG); + set_string_option_direct("ef", -1, paramp->use_ef, OPT_FREE, SID_CARG); } vim_snprintf((char *)IObuff, IOSIZE, "cfile %s", p_ef); if (qf_init(NULL, (char *)p_ef, p_efm, true, (char *)IObuff, (char *)p_menc) < 0) { @@ -1743,7 +1742,7 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd) // at the ATTENTION prompt close the window. swap_exists_did_quit = false; (void)do_ecmd(0, arg_idx < GARGCOUNT - ? (char *)alist_name(&GARGLIST[arg_idx]) + ? alist_name(&GARGLIST[arg_idx]) : NULL, NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin); if (swap_exists_did_quit) { // abort or quit selected @@ -1946,9 +1945,7 @@ static bool do_user_initialization(void) if (do_source((char *)user_vimrc, true, DOSO_VIMRC) != FAIL) { do_exrc = p_exrc; if (do_exrc) { - do_exrc = (path_full_compare((char_u *)VIMRC_FILE, user_vimrc, - false, true) - != kEqualFiles); + do_exrc = (path_full_compare(VIMRC_FILE, (char *)user_vimrc, false, true) != kEqualFiles); } xfree(user_vimrc); return do_exrc; @@ -1974,8 +1971,7 @@ static bool do_user_initialization(void) if (do_source(vimrc, true, DOSO_VIMRC) != FAIL) { do_exrc = p_exrc; if (do_exrc) { - do_exrc = (path_full_compare((char_u *)VIMRC_FILE, (char_u *)vimrc, - false, true) != kEqualFiles); + do_exrc = (path_full_compare(VIMRC_FILE, vimrc, false, true) != kEqualFiles); } xfree(vimrc); xfree(config_dirs); diff --git a/src/nvim/mapping.c b/src/nvim/mapping.c index 481ac8213a..d4f7450af4 100644 --- a/src/nvim/mapping.c +++ b/src/nvim/mapping.c @@ -37,8 +37,7 @@ static mapblock_T *first_abbr = NULL; // first entry in abbrlist // Each mapping is put in one of the MAX_MAPHASH hash lists, // to speed up finding it. -static mapblock_T *(maphash[MAX_MAPHASH]); -static bool maphash_valid = false; +static mapblock_T *(maphash[MAX_MAPHASH]) = { 0 }; // Make a hash value for a mapping. // "mode" is the lower 4 bits of the State for the mapping. @@ -80,20 +79,6 @@ mapblock_T *get_maphash(int index, buf_T *buf) return (buf == NULL) ? maphash[index] : buf->b_maphash[index]; } -bool is_maphash_valid(void) -{ - return maphash_valid; -} - -/// Initialize maphash[] for first use. -static void validate_maphash(void) -{ - if (!maphash_valid) { - memset(maphash, 0, sizeof(maphash)); - maphash_valid = true; - } -} - /// Delete one entry from the abbrlist or maphash[]. /// "mpp" is a pointer to the m_next field of the PREVIOUS entry! static void mapblock_free(mapblock_T **mpp) @@ -104,10 +89,10 @@ static void mapblock_free(mapblock_T **mpp) xfree(mp->m_keys); if (!mp->m_simplified) { NLUA_CLEAR_REF(mp->m_luaref); + xfree(mp->m_str); + xfree(mp->m_orig_str); } - XFREE_CLEAR(mp->m_str); - XFREE_CLEAR(mp->m_orig_str); - XFREE_CLEAR(mp->m_desc); + xfree(mp->m_desc); *mpp = mp->m_next; xfree(mp); } @@ -254,14 +239,12 @@ static void showmap(mapblock_T *mp, bool local) /// @param[in] orig_rhs_len `strlen` of orig_rhs. /// @param[in] cpo_flags See param docs for @ref replace_termcodes. /// @param[out] mapargs MapArguments struct holding the replaced strings. -static void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs_len, +static bool set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs_len, const char *const orig_rhs, const size_t orig_rhs_len, const LuaRef rhs_lua, const int cpo_flags, MapArguments *const mapargs) { - char *lhs_buf = NULL; - char *alt_lhs_buf = NULL; - char *rhs_buf = NULL; + char lhs_buf[128]; // If mapping has been given as ^V<C_UP> say, then replace the term codes // with the appropriate two bytes. If it is a shifted special key, unshift @@ -273,13 +256,20 @@ static void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs // If something like <C-H> is simplified to 0x08 then mark it as simplified. bool did_simplify = false; const int flags = REPTERM_FROM_PART | REPTERM_DO_LT; - char *replaced = replace_termcodes(orig_lhs, orig_lhs_len, &lhs_buf, flags, &did_simplify, + char *bufarg = lhs_buf; + char *replaced = replace_termcodes(orig_lhs, orig_lhs_len, &bufarg, flags, &did_simplify, cpo_flags); + if (replaced == NULL) { + return false; + } mapargs->lhs_len = STRLEN(replaced); STRLCPY(mapargs->lhs, replaced, sizeof(mapargs->lhs)); if (did_simplify) { - replaced = replace_termcodes(orig_lhs, orig_lhs_len, &alt_lhs_buf, flags | REPTERM_NO_SIMPLIFY, + replaced = replace_termcodes(orig_lhs, orig_lhs_len, &bufarg, flags | REPTERM_NO_SIMPLIFY, NULL, cpo_flags); + if (replaced == NULL) { + return false; + } mapargs->alt_lhs_len = STRLEN(replaced); STRLCPY(mapargs->alt_lhs, replaced, sizeof(mapargs->alt_lhs)); } else { @@ -298,14 +288,14 @@ static void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs mapargs->rhs_len = 0; mapargs->rhs_is_noop = true; } else { + char *rhs_buf = NULL; replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, REPTERM_DO_LT, NULL, cpo_flags); mapargs->rhs_len = STRLEN(replaced); // XXX: replace_termcodes may produce an empty string even if orig_rhs is non-empty // (e.g. a single ^V, see :h map-empty-rhs) mapargs->rhs_is_noop = orig_rhs_len != 0 && mapargs->rhs_len == 0; - mapargs->rhs = xcalloc(mapargs->rhs_len + 1, sizeof(char_u)); - STRLCPY(mapargs->rhs, replaced, mapargs->rhs_len + 1); + mapargs->rhs = (char_u *)replaced; } } else { char tmp_buf[64]; @@ -317,10 +307,7 @@ static void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs (char_u)KS_EXTRA, KE_LUA, rhs_lua); mapargs->rhs = vim_strsave((char_u *)tmp_buf); } - - xfree(lhs_buf); - xfree(alt_lhs_buf); - xfree(rhs_buf); + return true; } /// Parse a string of |:map-arguments| into a @ref MapArguments struct. @@ -346,27 +333,26 @@ static int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *ma { const char_u *to_parse = strargs; to_parse = (char_u *)skipwhite((char *)to_parse); - MapArguments parsed_args; // copy these into mapargs "all at once" when done - memset(&parsed_args, 0, sizeof(parsed_args)); + memset(mapargs, 0, sizeof(*mapargs)); // Accept <buffer>, <nowait>, <silent>, <expr>, <script>, and <unique> in // any order. while (true) { if (STRNCMP(to_parse, "<buffer>", 8) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 8); - parsed_args.buffer = true; + mapargs->buffer = true; continue; } if (STRNCMP(to_parse, "<nowait>", 8) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 8); - parsed_args.nowait = true; + mapargs->nowait = true; continue; } if (STRNCMP(to_parse, "<silent>", 8) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 8); - parsed_args.silent = true; + mapargs->silent = true; continue; } @@ -378,19 +364,19 @@ static int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *ma if (STRNCMP(to_parse, "<script>", 8) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 8); - parsed_args.script = true; + mapargs->script = true; continue; } if (STRNCMP(to_parse, "<expr>", 6) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 6); - parsed_args.expr = true; + mapargs->expr = true; continue; } if (STRNCMP(to_parse, "<unique>", 8) == 0) { to_parse = (char_u *)skipwhite((char *)to_parse + 8); - parsed_args.unique = true; + mapargs->unique = true; continue; } break; @@ -423,19 +409,20 @@ static int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *ma // Given {lhs} might be larger than MAXMAPLEN before replace_termcodes // (e.g. "<Space>" is longer than ' '), so first copy into a buffer. size_t orig_lhs_len = (size_t)((char_u *)lhs_end - to_parse); - char_u *lhs_to_replace = xcalloc(orig_lhs_len + 1, sizeof(char_u)); + if (orig_lhs_len >= 256) { + return 1; + } + char_u lhs_to_replace[256]; STRLCPY(lhs_to_replace, to_parse, orig_lhs_len + 1); size_t orig_rhs_len = STRLEN(rhs_start); - set_maparg_lhs_rhs((char *)lhs_to_replace, orig_lhs_len, - (char *)rhs_start, orig_rhs_len, LUA_NOREF, - CPO_TO_CPO_FLAGS, &parsed_args); - - xfree(lhs_to_replace); - - *mapargs = parsed_args; + if (!set_maparg_lhs_rhs((char *)lhs_to_replace, orig_lhs_len, + (char *)rhs_start, orig_rhs_len, LUA_NOREF, + CPO_TO_CPO_FLAGS, mapargs)) { + return 1; + } - if (parsed_args.lhs_len > MAXMAPLEN) { + if (mapargs->lhs_len > MAXMAPLEN) { return 1; } return 0; @@ -481,8 +468,6 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, noremap = REMAP_SCRIPT; } - validate_maphash(); - const bool has_lhs = (args->lhs[0] != NUL); const bool has_rhs = args->rhs_lua != LUA_NOREF || (args->rhs[0] != NUL) || args->rhs_is_noop; const bool do_print = !has_lhs || (maptype != 1 && !has_rhs); @@ -494,8 +479,6 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, } const char_u *lhs = (char_u *)&args->lhs; - const char_u *const rhs = args->rhs; - const char_u *const orig_rhs = args->orig_rhs; const bool did_simplify = args->alt_lhs_len != 0; // The following is done twice if we have two versions of keys @@ -635,16 +618,18 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, // "bar" because of the abbreviation. for (int round = 0; (round == 0 || maptype == 1) && round <= 1 && !did_it && !got_int; round++) { - // need to loop over all hash lists - for (int hash = 0; hash < 256 && !got_int; hash++) { - if (is_abbrev) { - if (hash > 0) { // there is only one abbreviation list - break; - } - mpp = abbr_table; - } else { - mpp = &(map_table[hash]); - } + int hash_start, hash_end; + if (has_lhs || is_abbrev) { + // just use one hash + hash_start = is_abbrev ? 0 : MAP_HASH(mode, lhs[0]); + hash_end = hash_start + 1; + } else { + // need to loop over all hash lists + hash_start = 0; + hash_end = 256; + } + for (int hash = hash_start; hash < hash_end && !got_int; hash++) { + mpp = is_abbrev ? abbr_table : &(map_table[hash]); for (mp = *mpp; mp != NULL && !got_int; mp = *mpp) { if ((mp->m_mode & mode) == 0) { // skip entries with wrong mode @@ -710,16 +695,20 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, // new rhs for existing entry mp->m_mode &= ~mode; // remove mode bits if (mp->m_mode == 0 && !did_it) { // reuse entry - XFREE_CLEAR(mp->m_str); - XFREE_CLEAR(mp->m_orig_str); XFREE_CLEAR(mp->m_desc); if (!mp->m_simplified) { NLUA_CLEAR_REF(mp->m_luaref); + XFREE_CLEAR(mp->m_str); + XFREE_CLEAR(mp->m_orig_str); } - - mp->m_str = vim_strsave(rhs); - mp->m_orig_str = vim_strsave(orig_rhs); + mp->m_str = args->rhs; + mp->m_orig_str = args->orig_rhs; mp->m_luaref = args->rhs_lua; + if (!keyround1_simplified) { + args->rhs = NULL; + args->orig_rhs = NULL; + args->rhs_lua = LUA_NOREF; + } mp->m_noremap = noremap; mp->m_nowait = args->nowait; mp->m_silent = args->silent; @@ -802,9 +791,14 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, } mp->m_keys = vim_strsave(lhs); - mp->m_str = vim_strsave(rhs); - mp->m_orig_str = vim_strsave(orig_rhs); + mp->m_str = args->rhs; + mp->m_orig_str = args->orig_rhs; mp->m_luaref = args->rhs_lua; + if (!keyround1_simplified) { + args->rhs = NULL; + args->orig_rhs = NULL; + args->rhs_lua = LUA_NOREF; + } mp->m_keylen = (int)STRLEN(mp->m_keys); mp->m_noremap = noremap; mp->m_nowait = args->nowait; @@ -975,8 +969,6 @@ void map_clear_int(buf_T *buf, int mode, bool local, bool abbr) int hash; int new_hash; - validate_maphash(); - for (hash = 0; hash < 256; hash++) { if (abbr) { if (hash > 0) { // there is only one abbrlist @@ -1037,7 +1029,7 @@ bool map_to_exists(const char *const str, const char *const modechars, const boo int mode = 0; int retval; - char_u *buf; + char_u *buf = NULL; const char_u *const rhs = (char_u *)replace_termcodes(str, strlen(str), (char **)&buf, REPTERM_DO_LT, NULL, CPO_TO_CPO_FLAGS); @@ -1080,8 +1072,6 @@ int map_to_exists_mode(const char *const rhs, const int mode, const bool abbr) int hash; bool exp_buffer = false; - validate_maphash(); - // Do it twice: once for global maps and once for local maps. for (;;) { for (hash = 0; hash < 256; hash++) { @@ -1249,8 +1239,6 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file) char_u *p; int i; - validate_maphash(); - *num_file = 0; // return values in case of FAIL *file = NULL; @@ -1597,8 +1585,6 @@ int makemap(FILE *fd, buf_T *buf) int hash; bool did_cpo = false; - validate_maphash(); - // Do the loop twice: Once for mappings, once for abbreviations. // Then loop over all map hash lists. for (abbr = 0; abbr < 2; abbr++) { @@ -1911,8 +1897,6 @@ char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapb mapblock_T *mp; *rhs_lua = LUA_NOREF; - validate_maphash(); - len = (int)STRLEN(keys); for (int local = 1; local >= 0; local--) { // loop over all hash lists @@ -2340,7 +2324,7 @@ void ex_map(exarg_T *eap) // print the mappings for security reasons. if (secure) { secure = 2; - msg_outtrans((char_u *)eap->cmd); + msg_outtrans(eap->cmd); msg_putchar('\n'); } do_exmap(eap, false); @@ -2409,9 +2393,13 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod } parsed_args.buffer = !global; - set_maparg_lhs_rhs(lhs.data, lhs.size, - rhs.data, rhs.size, lua_funcref, - CPO_TO_CPO_FLAGS, &parsed_args); + if (!set_maparg_lhs_rhs(lhs.data, lhs.size, + rhs.data, rhs.size, lua_funcref, + CPO_TO_CPO_FLAGS, &parsed_args)) { + api_set_error(err, kErrorTypeValidation, "LHS exceeds maximum map length: %s", lhs.data); + goto fail_and_free; + } + if (opts != NULL && opts->desc.type == kObjectTypeString) { parsed_args.desc = string_to_cstr(opts->desc.data.string); } else { @@ -2491,13 +2479,12 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod goto fail_and_free; } // switch - parsed_args.rhs_lua = LUA_NOREF; // don't clear ref on success fail_and_free: current_sctx = save_current_sctx; NLUA_CLEAR_REF(parsed_args.rhs_lua); xfree(parsed_args.rhs); xfree(parsed_args.orig_rhs); - XFREE_CLEAR(parsed_args.desc); + xfree(parsed_args.desc); } /// Get an array containing dictionaries describing mappings diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 8d1a917600..a0fed19a98 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -637,7 +637,7 @@ static char_u *mark_line(pos_T *mp, int lead_len) // Truncate the line to fit it in the window len = 0; for (p = s; *p != NUL; MB_PTR_ADV(p)) { - len += ptr2cells(p); + len += ptr2cells((char *)p); if (len >= Columns - lead_len) { break; } @@ -733,7 +733,7 @@ static void show_one_mark(int c, char_u *arg, pos_T *p, char_u *name_arg, int cu msg_putchar('\n'); if (!got_int) { snprintf((char *)IObuff, IOSIZE, " %c %6" PRIdLINENR " %4d ", c, p->lnum, p->col); - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); if (name != NULL) { msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); } @@ -864,7 +864,7 @@ void ex_jumps(exarg_T *eap) i == curwin->w_jumplistidx ? '>' : ' ', i > curwin->w_jumplistidx ? i - curwin->w_jumplistidx : curwin->w_jumplistidx - i, curwin->w_jumplist[i].fmark.mark.lnum, curwin->w_jumplist[i].fmark.mark.col); - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); msg_outtrans_attr(name, curwin->w_jumplist[i].fmark.fnum == curbuf->b_fnum ? HL_ATTR(HLF_D) : 0); @@ -908,7 +908,7 @@ void ex_changes(exarg_T *eap) : curwin->w_changelistidx - i, (long)curbuf->b_changelist[i].mark.lnum, curbuf->b_changelist[i].mark.col); - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); name = mark_line(&curbuf->b_changelist[i].mark, 17); msg_outtrans_attr(name, HL_ATTR(HLF_D)); xfree(name); @@ -1578,7 +1578,7 @@ void mark_mb_adjustpos(buf_T *buf, pos_T *lp) if (lp->coladd == 1 && p[lp->col] != TAB && vim_isprintc(utf_ptr2char((char *)p + lp->col)) - && ptr2cells(p + lp->col) > 1) { + && ptr2cells((char *)p + lp->col) > 1) { lp->coladd = 0; } } diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 24d079ea2c..1032986a02 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -2012,7 +2012,7 @@ void mb_check_adjust_col(void *win_) // Column 0 is always valid. if (oldcol != 0) { - char_u *p = ml_get_buf(win->w_buffer, win->w_cursor.lnum, false); + char *p = (char *)ml_get_buf(win->w_buffer, win->w_cursor.lnum, false); colnr_T len = (colnr_T)STRLEN(p); // Empty line or invalid column? @@ -2024,13 +2024,13 @@ void mb_check_adjust_col(void *win_) win->w_cursor.col = len - 1; } // Move the cursor to the head byte. - win->w_cursor.col -= utf_head_off(p, p + win->w_cursor.col); + win->w_cursor.col -= utf_head_off((char_u *)p, (char_u *)p + win->w_cursor.col); } // Reset `coladd` when the cursor would be on the right half of a // double-wide character. if (win->w_cursor.coladd == 1 && p[win->w_cursor.col] != TAB - && vim_isprintc(utf_ptr2char((char *)p + win->w_cursor.col)) + && vim_isprintc(utf_ptr2char(p + win->w_cursor.col)) && ptr2cells(p + win->w_cursor.col) > 1) { win->w_cursor.coladd = 0; } diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 21b0ab89d7..9da5aa54c5 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -531,7 +531,7 @@ void ml_open_file(buf_T *buf) need_wait_return = true; // call wait_return later no_wait_return++; (void)semsg(_("E303: Unable to open swap file for \"%s\", recovery impossible"), - buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname); + buf_spname(buf) != NULL ? buf_spname(buf) : buf->b_fname); no_wait_return--; } @@ -665,8 +665,8 @@ static void set_b0_fname(ZERO_BL *b0p, buf_T *buf) * First replace home dir path with "~/" with home_replace(). * Then insert the user name to get "~user/". */ - home_replace(NULL, buf->b_ffname, b0p->b0_fname, - B0_FNAME_SIZE_CRYPT, TRUE); + home_replace(NULL, (char *)buf->b_ffname, (char *)b0p->b0_fname, + B0_FNAME_SIZE_CRYPT, true); if (b0p->b0_fname[0] == '~') { // If there is no user name or it is too long, don't use "~/" int retval = os_get_user_name(uname, B0_UNAME_SIZE); @@ -933,18 +933,18 @@ void ml_recover(bool checkext) */ if (directly) { expand_env(b0p->b0_fname, NameBuff, MAXPATHL); - if (setfname(curbuf, NameBuff, NULL, true) == FAIL) { + if (setfname(curbuf, (char *)NameBuff, NULL, true) == FAIL) { goto theend; } } - home_replace(NULL, mfp->mf_fname, NameBuff, MAXPATHL, TRUE); + home_replace(NULL, (char *)mfp->mf_fname, (char *)NameBuff, MAXPATHL, true); smsg(_("Using swap file \"%s\""), NameBuff); if (buf_spname(curbuf) != NULL) { STRLCPY(NameBuff, buf_spname(curbuf), MAXPATHL); } else { - home_replace(NULL, curbuf->b_ffname, NameBuff, MAXPATHL, TRUE); + home_replace(NULL, (char *)curbuf->b_ffname, (char *)NameBuff, MAXPATHL, true); } smsg(_("Original file \"%s\""), NameBuff); msg_putchar('\n'); @@ -1377,7 +1377,7 @@ int recover_names(char_u *fname, int list, int nr, char_u **fname_out) for (int i = 0; i < num_files; i++) { // Do not expand wildcards, on Windows would try to expand // "%tmp%" in "%tmp%file" - if (path_full_compare(p, files[i], true, false) & kEqualFiles) { + if (path_full_compare((char *)p, (char *)files[i], true, false) & kEqualFiles) { // Remove the name from files[i]. Move further entries // down. When the array becomes empty free it here, since // FreeWild() won't be called below. @@ -1520,7 +1520,7 @@ static time_t swapfile_info(char_u *fname) // print name of owner of the file if (os_get_uname(file_info.stat.st_uid, uname, B0_UNAME_SIZE) == OK) { msg_puts(_(" owned by: ")); - msg_outtrans((char_u *)uname); + msg_outtrans(uname); msg_puts(_(" dated: ")); } else #endif @@ -1547,7 +1547,7 @@ static time_t swapfile_info(char_u *fname) if (b0.b0_fname[0] == NUL) { msg_puts(_("[No Name]")); } else { - msg_outtrans(b0.b0_fname); + msg_outtrans((char *)b0.b0_fname); } msg_puts(_("\n modified: ")); @@ -1555,7 +1555,7 @@ static time_t swapfile_info(char_u *fname) if (*(b0.b0_uname) != NUL) { msg_puts(_("\n user name: ")); - msg_outtrans(b0.b0_uname); + msg_outtrans((char *)b0.b0_uname); } if (*(b0.b0_hname) != NUL) { @@ -1564,7 +1564,7 @@ static time_t swapfile_info(char_u *fname) } else { msg_puts(_("\n host name: ")); } - msg_outtrans(b0.b0_hname); + msg_outtrans((char *)b0.b0_hname); } if (char_to_long(b0.b0_pid) != 0L) { @@ -3317,7 +3317,7 @@ static void attention_message(buf_T *buf, char_u *fname) msg_puts("\"\n"); const time_t swap_mtime = swapfile_info(fname); msg_puts(_("While opening file \"")); - msg_outtrans((char_u *)buf->b_fname); + msg_outtrans(buf->b_fname); msg_puts("\"\n"); FileInfo file_info; if (!os_fileinfo(buf->b_fname, &file_info)) { @@ -3339,10 +3339,10 @@ static void attention_message(buf_T *buf, char_u *fname) " Quit, or continue with caution.\n")); msg_puts(_("(2) An edit session for this file crashed.\n")); msg_puts(_(" If this is the case, use \":recover\" or \"vim -r ")); - msg_outtrans((char_u *)buf->b_fname); + msg_outtrans(buf->b_fname); msg_puts(_("\"\n to recover the changes (see \":help recovery\").\n")); msg_puts(_(" If you did this already, delete the swap file \"")); - msg_outtrans(fname); + msg_outtrans((char *)fname); msg_puts(_("\"\n to avoid this message.\n")); cmdline_row = msg_row; --no_wait_return; @@ -3552,8 +3552,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ char *const name = xmalloc(name_len); memcpy(name, sw_msg_1, sw_msg_1_len + 1); - home_replace(NULL, (char_u *)fname, (char_u *)&name[sw_msg_1_len], - fname_len, true); + home_replace(NULL, fname, &name[sw_msg_1_len], fname_len, true); xstrlcat(name, sw_msg_2, name_len); choice = do_dialog(VIM_WARNING, (char_u *)_("VIM - ATTENTION"), (char_u *)name, diff --git a/src/nvim/memory.c b/src/nvim/memory.c index a615802b36..29a1191bd6 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -15,6 +15,7 @@ #include "nvim/highlight.h" #include "nvim/highlight_group.h" #include "nvim/lua/executor.h" +#include "nvim/mapping.h" #include "nvim/memfile.h" #include "nvim/memory.h" #include "nvim/message.h" @@ -689,11 +690,9 @@ void free_all_mem(void) do_cmdline_cmd("menutranslate clear"); // Clear mappings, abbreviations, breakpoints. - do_cmdline_cmd("lmapclear"); - do_cmdline_cmd("xmapclear"); - do_cmdline_cmd("mapclear"); - do_cmdline_cmd("mapclear!"); - do_cmdline_cmd("abclear"); + // NB: curbuf not used with local=false arg + map_clear_int(curbuf, MAP_ALL_MODES, false, false); + map_clear_int(curbuf, MAP_ALL_MODES, false, true); do_cmdline_cmd("breakdel *"); do_cmdline_cmd("profdel *"); do_cmdline_cmd("set keymap="); diff --git a/src/nvim/menu.c b/src/nvim/menu.c index f4943c4031..80f8406ab0 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -232,6 +232,7 @@ void ex_menu(exarg_T *eap) } else if (modes & MENU_TIP_MODE) { map_buf = NULL; // Menu tips are plain text. } else { + map_buf = NULL; map_to = replace_termcodes(map_to, STRLEN(map_to), &map_buf, REPTERM_DO_LT, NULL, CPO_TO_CPO_FLAGS); } diff --git a/src/nvim/message.c b/src/nvim/message.c index e192af6aad..733b4808fe 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -136,7 +136,7 @@ static int msg_grid_scroll_discount = 0; static void ui_ext_msg_set_pos(int row, bool scrolled) { char buf[MAX_MCO + 1]; - size_t size = utf_char2bytes(curwin->w_p_fcs_chars.msgsep, buf); + size_t size = (size_t)utf_char2bytes(curwin->w_p_fcs_chars.msgsep, buf); buf[size] = '\0'; ui_call_msg_set_pos(msg_grid.handle, row, scrolled, (String){ .data = buf, .size = size }); @@ -164,7 +164,7 @@ void msg_grid_validate(void) { grid_assign_handle(&msg_grid); bool should_alloc = msg_use_grid(); - int max_rows = Rows - p_ch; + int max_rows = Rows - (int)p_ch; if (should_alloc && (msg_grid.rows != Rows || msg_grid.cols != Columns || !msg_grid.chars)) { // TODO(bfredl): eventually should be set to "invalid". I e all callers @@ -173,7 +173,7 @@ void msg_grid_validate(void) msg_grid.zindex = kZIndexMessages; xfree(msg_grid.dirty_col); - msg_grid.dirty_col = xcalloc(Rows, sizeof(*msg_grid.dirty_col)); + msg_grid.dirty_col = xcalloc((size_t)Rows, sizeof(*msg_grid.dirty_col)); // Tricky: allow resize while pager is active int pos = msg_scrolled ? msg_grid_pos : max_rows; @@ -248,7 +248,7 @@ void msg_multiline_attr(const char *s, int attr, bool check_int, bool *need_clea if (next_spec != NULL) { // Printing all char that are before the char found by strpbrk - msg_outtrans_len_attr((const char_u *)s, next_spec - s, attr); + msg_outtrans_len_attr((const char_u *)s, (int)(next_spec - s), attr); if (*next_spec != TAB && *need_clear) { msg_clr_eos(); @@ -348,7 +348,7 @@ bool msg_attr_keep(const char *s, int attr, bool keep, bool multiline) } retval = msg_end(); - if (keep && retval && vim_strsize((char_u *)s) < (Rows - cmdline_row - 1) * Columns + sc_col) { + if (keep && retval && vim_strsize((char *)s) < (Rows - cmdline_row - 1) * Columns + sc_col) { set_keep_msg((char *)s, 0); } @@ -374,7 +374,7 @@ char_u *msg_strtrunc(char_u *s, int force) if ((!msg_scroll && !need_wait_return && shortmess(SHM_TRUNCALL) && !exmode_active && msg_silent == 0 && !ui_has(kUIMessages)) || force) { - len = vim_strsize(s); + len = vim_strsize((char *)s); if (msg_scrolled != 0) { // Use all the columns. room = (Rows - msg_row) * Columns - 1; @@ -386,7 +386,7 @@ char_u *msg_strtrunc(char_u *s, int force) // may have up to 18 bytes per cell (6 per char, up to two // composing chars) len = (room + 2) * 18; - buf = xmalloc(len); + buf = xmalloc((size_t)len); trunc_string(s, buf, room, len); } } @@ -397,9 +397,9 @@ char_u *msg_strtrunc(char_u *s, int force) /// "s" and "buf" may be equal. void trunc_string(char_u *s, char_u *buf, int room_in, int buflen) { - size_t room = room_in - 3; // "..." takes 3 chars - size_t half; - size_t len = 0; + int room = room_in - 3; // "..." takes 3 chars + int half; + int len = 0; int e; int i; int n; @@ -423,7 +423,7 @@ void trunc_string(char_u *s, char_u *buf, int room_in, int buflen) buf[e] = NUL; return; } - n = ptr2cells(s + e); + n = ptr2cells((char *)s + e); if (len + n > half) { break; } @@ -443,7 +443,7 @@ void trunc_string(char_u *s, char_u *buf, int room_in, int buflen) do { half = half - utf_head_off(s, s + half - 1) - 1; } while (half > 0 && utf_iscomposing(utf_ptr2char((char *)s + half))); - n = ptr2cells(s + half); + n = ptr2cells((char *)s + half); if (len + n > room || half == 0) { break; } @@ -454,25 +454,25 @@ void trunc_string(char_u *s, char_u *buf, int room_in, int buflen) if (i <= e + 3) { // text fits without truncating if (s != buf) { - len = STRLEN(s); - if (len >= (size_t)buflen) { + len = (int)STRLEN(s); + if (len >= buflen) { len = buflen - 1; } len = len - e + 1; if (len < 1) { buf[e - 1] = NUL; } else { - memmove(buf + e, s + e, len); + memmove(buf + e, s + e, (size_t)len); } } } else if (e + 3 < buflen) { // set the middle and copy the last part memmove(buf + e, "...", (size_t)3); - len = STRLEN(s + i) + 1; - if (len >= (size_t)buflen - e - 3) { + len = (int)STRLEN(s + i) + 1; + if (len >= buflen - e - 3) { len = buflen - e - 3 - 1; } - memmove(buf + e + 3, s + i, len); + memmove(buf + e + 3, s + i, (size_t)len); buf[e + 3 + len - 1] = NUL; } else { // can't fit in the "...", just truncate it @@ -671,17 +671,17 @@ static bool emsg_multiline(const char *s, bool multiline) if (p != NULL) { const size_t p_len = strlen(p); p[p_len] = '\n'; - redir_write(p, p_len + 1); + redir_write(p, (ptrdiff_t)p_len + 1); xfree(p); } p = get_emsg_lnum(); if (p != NULL) { const size_t p_len = strlen(p); p[p_len] = '\n'; - redir_write(p, p_len + 1); + redir_write(p, (ptrdiff_t)p_len + 1); xfree(p); } - redir_write(s, strlen(s)); + redir_write(s, (ptrdiff_t)strlen(s)); } // Log (silent) errors as debug messages. @@ -892,7 +892,7 @@ char_u *msg_may_trunc(bool force, char_u *s) room = (Rows - cmdline_row - 1) * Columns + sc_col - 1; if ((force || (shortmess(SHM_TRUNC) && !exmode_active)) && (int)STRLEN(s) - room > 0) { - int size = vim_strsize(s); + int size = vim_strsize((char *)s); // There may be room anyway when there are multibyte chars. if (size <= room) { @@ -1275,7 +1275,7 @@ void wait_return(int redraw) emsg_on_display = false; // can delete error message now lines_left = -1; // reset lines_left at next msg_start() reset_last_sourcing(); - if (keep_msg != NULL && vim_strsize(keep_msg) >= + if (keep_msg != NULL && vim_strsize((char *)keep_msg) >= (Rows - cmdline_row - 1) * Columns + sc_col) { XFREE_CLEAR(keep_msg); // don't redisplay message, it's too long } @@ -1444,7 +1444,7 @@ void msg_putchar(int c) void msg_putchar_attr(int c, int attr) { - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; if (IS_SPECIAL(c)) { buf[0] = (char)K_SPECIAL; @@ -1489,9 +1489,9 @@ static void msg_home_replace_attr(char_u *fname, int attr) /// Use attributes 'attr'. /// /// @return the number of characters it takes on the screen. -int msg_outtrans(char_u *str) +int msg_outtrans(char *str) { - return msg_outtrans_attr(str, 0); + return msg_outtrans_attr((char_u *)str, 0); } int msg_outtrans_attr(const char_u *str, int attr) @@ -1654,7 +1654,7 @@ int msg_outtrans_special(const char_u *strstart, bool from, int maxlen) // single-byte character or illegal byte text = (char *)transchar_byte((uint8_t)text[0]); } - const int len = vim_strsize((char_u *)text); + const int len = vim_strsize((char *)text); if (maxlen > 0 && retval + len >= maxlen) { break; } @@ -2025,7 +2025,7 @@ void msg_puts_attr(const char *const s, const int attr) void msg_puts_attr_len(const char *const str, const ptrdiff_t len, int attr) FUNC_ATTR_NONNULL_ALL { - assert(len < 0 || memchr(str, 0, len) == NULL); + assert(len < 0 || memchr(str, 0, (size_t)len) == NULL); // If redirection is on, also write to the redirection file. redir_write(str, len); @@ -2074,7 +2074,7 @@ void msg_puts_attr_len(const char *const str, const ptrdiff_t len, int attr) } } if (!msg_use_printf() || (headless_mode && default_grid.chars)) { - msg_puts_display((const char_u *)str, len, attr, false); + msg_puts_display((const char_u *)str, (int)len, attr, false); } need_fileinfo = false; @@ -2094,7 +2094,7 @@ void msg_printf_attr(const int attr, const char *const fmt, ...) va_list ap; va_start(ap, fmt); - const size_t len = vim_vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap); + const size_t len = (size_t)vim_vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap); va_end(ap); msg_scroll = true; @@ -2336,7 +2336,7 @@ bool message_filtered(char_u *msg) /// including horizontal separator int msg_scrollsize(void) { - return msg_scrolled + p_ch + 1; + return msg_scrolled + (int)p_ch + 1; } bool msg_use_msgsep(void) @@ -2364,7 +2364,7 @@ void msg_scroll_up(bool may_throttle) } else { grid_del_lines(&msg_grid, 0, 1, msg_grid.rows, 0, msg_grid.cols); memmove(msg_grid.dirty_col, msg_grid.dirty_col + 1, - (msg_grid.rows - 1) * sizeof(*msg_grid.dirty_col)); + (size_t)(msg_grid.rows - 1) * sizeof(*msg_grid.dirty_col)); msg_grid.dirty_col[msg_grid.rows - 1] = 0; } } else { @@ -2438,7 +2438,7 @@ void msg_reset_scroll(void) msg_grid.throttled = false; // TODO(bfredl): risk for extra flicker i e with // "nvim -o has_swap also_has_swap" - msg_grid_set_pos(Rows - p_ch, false); + msg_grid_set_pos(Rows - (int)p_ch, false); clear_cmdline = true; if (msg_grid.chars) { // non-displayed part of msg_grid is considered invalid. @@ -2509,11 +2509,11 @@ static void store_sb_text(char_u **sb_str, char_u *s, int attr, int *sb_col, int } if (s > *sb_str) { - mp = xmalloc((sizeof(msgchunk_T) + (s - *sb_str))); - mp->sb_eol = finish; + mp = xmalloc((sizeof(msgchunk_T) + (size_t)(s - *sb_str))); + mp->sb_eol = (char)finish; mp->sb_msg_col = *sb_col; mp->sb_attr = attr; - memcpy(mp->sb_text, *sb_str, s - *sb_str); + memcpy(mp->sb_text, *sb_str, (size_t)(s - *sb_str)); mp->sb_text[s - *sb_str] = NUL; if (last_msgchunk == NULL) { @@ -2691,7 +2691,7 @@ static void msg_puts_printf(const char *str, const ptrdiff_t maxlen) if (*s == '\n' && !info_message) { *p++ = '\r'; } - memcpy(p, s, len); + memcpy(p, s, (size_t)len); *(p + len) = '\0'; if (info_message) { mch_msg(buf); @@ -3027,7 +3027,7 @@ void msg_moremsg(int full) if (full) { grid_puts(&msg_grid_adj, (char_u *) _(" SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "), - Rows - 1, vim_strsize(s), attr); + Rows - 1, vim_strsize((char *)s), attr); } } @@ -3264,10 +3264,10 @@ static void redir_write(const char *const str, const ptrdiff_t maxlen) ga_concat_len(capture_ga, str, len); } if (redir_reg) { - write_reg_contents(redir_reg, s, len, true); + write_reg_contents(redir_reg, s, (ssize_t)len, true); } if (redir_vname) { - var_redir_str((char *)s, maxlen); + var_redir_str((char *)s, (int)maxlen); } // Write and adjust the current column. @@ -3376,7 +3376,8 @@ int verbose_open(void) /// Give a warning message (for searching). /// Use 'w' highlighting and may repeat the message after redrawing -void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1) +void give_warning(char *message, bool hl) + FUNC_ATTR_NONNULL_ARG(1) { // Don't do this for ":silent". if (msg_silent != 0) { @@ -3386,7 +3387,7 @@ void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1) // Don't want a hit-enter prompt here. no_wait_return++; - set_vim_var_string(VV_WARNINGMSG, (char *)message, -1); + set_vim_var_string(VV_WARNINGMSG, message, -1); XFREE_CLEAR(keep_msg); if (hl) { keep_msg_attr = HL_ATTR(HLF_W); @@ -3399,7 +3400,7 @@ void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1) } if (msg_attr((const char *)message, keep_msg_attr) && msg_scrolled == 0) { - set_keep_msg((char *)message, keep_msg_attr); + set_keep_msg(message, keep_msg_attr); } msg_didout = false; // Overwrite this message. msg_nowait = true; // Don't wait for this message. @@ -3411,7 +3412,7 @@ void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1) void give_warning2(char_u *const message, char_u *const a1, bool hl) { vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1); - give_warning(IObuff, hl); + give_warning((char *)IObuff, hl); } /// Advance msg cursor to column "col". @@ -3615,10 +3616,10 @@ static char_u *console_dialog_alloc(const char_u *message, char_u *buttons, bool // Now allocate space for the strings xfree(confirm_msg); - confirm_msg = xmalloc(len); + confirm_msg = xmalloc((size_t)len); *confirm_msg = NUL; - return xmalloc(lenhotkey); + return xmalloc((size_t)lenhotkey); } /// Format the dialog string, and display it at the bottom of diff --git a/src/nvim/move.c b/src/nvim/move.c index cc811fca18..99ca5060cd 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -802,7 +802,7 @@ void curs_columns(win_T *wp, int may_scroll) // column char *const sbr = (char *)get_showbreak_value(wp); if (*sbr && *get_cursor_pos_ptr() == NUL - && wp->w_wcol == vim_strsize((char_u *)sbr)) { + && wp->w_wcol == vim_strsize(sbr)) { wp->w_wcol = 0; } } diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 5ed1a61b54..9637fe85e2 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -3287,7 +3287,7 @@ static bool nv_screengo(oparg_T *oap, int dir, long dist) validate_virtcol(); colnr_T virtcol = curwin->w_virtcol; if (virtcol > (colnr_T)width1 && *get_showbreak_value(curwin) != NUL) { - virtcol -= vim_strsize(get_showbreak_value(curwin)); + virtcol -= vim_strsize((char *)get_showbreak_value(curwin)); } int c = utf_ptr2char((char *)get_cursor_pos_ptr()); diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 20bbc5b440..fcff2517ab 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -3847,7 +3847,7 @@ void ex_display(exarg_T *eap) n -= 2; } for (p = (char_u *)yb->y_array[j]; - *p != NUL && (n -= ptr2cells(p)) >= 0; p++) { // -V1019 + *p != NUL && (n -= ptr2cells((char *)p)) >= 0; p++) { // -V1019 clen = utfc_ptr2len((char *)p); msg_outtrans_len(p, clen); p += clen - 1; @@ -3925,7 +3925,7 @@ static void dis_msg(const char_u *p, bool skip_esc) n = Columns - 6; while (*p != NUL && !(*p == ESC && skip_esc && *(p + 1) == NUL) - && (n -= ptr2cells(p)) >= 0) { + && (n -= ptr2cells((char *)p)) >= 0) { if ((l = utfc_ptr2len((char *)p)) > 1) { msg_outtrans_len(p, l); p += l; diff --git a/src/nvim/option.c b/src/nvim/option.c index f870f07e15..09a597f7e2 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -621,7 +621,7 @@ static void set_option_default(int opt_idx, int opt_flags) // freeing and allocating the value. if (options[opt_idx].indir != PV_NONE) { set_string_option_direct(NULL, opt_idx, - options[opt_idx].def_val, opt_flags, 0); + (char *)options[opt_idx].def_val, opt_flags, 0); } else { if ((opt_flags & OPT_FREE) && (flags & P_ALLOCED)) { free_string_option(*(char_u **)(varp)); @@ -944,7 +944,7 @@ void ex_set(exarg_T *eap) if (eap->forceit) { flags |= OPT_ONECOLUMN; } - (void)do_set((char_u *)eap->arg, flags); + (void)do_set(eap->arg, flags); } /// Parse 'arg' for option settings. @@ -962,7 +962,7 @@ void ex_set(exarg_T *eap) /// @param arg option string (may be written to!) /// /// @return FAIL if an error is detected, OK otherwise -int do_set(char_u *arg, int opt_flags) +int do_set(char *arg, int opt_flags) { int opt_idx; char *errmsg; @@ -990,7 +990,7 @@ int do_set(char_u *arg, int opt_flags) while (*arg != NUL) { // loop to process all options errmsg = NULL; - startarg = arg; // remember for error message + startarg = (char_u *)arg; // remember for error message if (STRNCMP(arg, "all", 3) == 0 && !isalpha(arg[3]) && !(opt_flags & OPT_MODELINE)) { @@ -1043,7 +1043,7 @@ int do_set(char_u *arg, int opt_flags) } len++; if (opt_idx == -1) { - key = find_key_option(arg + 1, true); + key = find_key_option((char_u *)arg + 1, true); } } else { len = 0; @@ -1057,12 +1057,12 @@ int do_set(char_u *arg, int opt_flags) } opt_idx = findoption_len((const char *)arg, (size_t)len); if (opt_idx == -1) { - key = find_key_option(arg, false); + key = find_key_option((char_u *)arg, false); } } // remember character after option name - afterchar = arg[len]; + afterchar = (uint8_t)arg[len]; // skip white space, allow ":set ai ?" while (ascii_iswhite(arg[len])) { @@ -1084,7 +1084,7 @@ int do_set(char_u *arg, int opt_flags) len++; } } - nextchar = arg[len]; + nextchar = (uint8_t)arg[len]; if (opt_idx == -1 && key == 0) { // found a mismatch: skip errmsg = N_("E518: Unknown option"); @@ -1282,14 +1282,14 @@ int do_set(char_u *arg, int opt_flags) || *arg == '^' || (*arg != NUL && (!arg[1] || ascii_iswhite(arg[1])) && !ascii_isdigit(*arg)))) { - value = string_to_key(arg); + value = string_to_key((char_u *)arg); if (value == 0 && (long *)varp != &p_wcm) { errmsg = e_invarg; goto skip; } } else if (*arg == '-' || ascii_isdigit(*arg)) { // Allow negative, octal and hex numbers. - vim_str2nr(arg, NULL, &i, STR2NR_ALL, &value, NULL, 0, true); + vim_str2nr((char_u *)arg, NULL, &i, STR2NR_ALL, &value, NULL, 0, true); if (i == 0 || (arg[i] != NUL && !ascii_iswhite(arg[i]))) { errmsg = N_("E521: Number required after ="); goto skip; @@ -1391,8 +1391,8 @@ int do_set(char_u *arg, int opt_flags) if (varp == (char_u *)&p_kp && (*arg == NUL || *arg == ' ')) { STRCPY(errbuf, ":help"); - save_arg = arg; - arg = (char_u *)errbuf; + save_arg = (char_u *)arg; + arg = errbuf; } /* * Convert 'backspace' number to string, for @@ -1435,7 +1435,7 @@ int do_set(char_u *arg, int opt_flags) else if (varp == (char_u *)&p_ww && ascii_isdigit(*arg)) { *errbuf = NUL; - i = getdigits_int(&arg, true, 0); + i = getdigits_int((char_u **)&arg, true, 0); if (i & 1) { STRLCAT(errbuf, "b,", sizeof(errbuf)); } @@ -1451,8 +1451,8 @@ int do_set(char_u *arg, int opt_flags) if (i & 16) { STRLCAT(errbuf, "[,],", sizeof(errbuf)); } - save_arg = arg; - arg = (char_u *)errbuf; + save_arg = (char_u *)arg; + arg = errbuf; } /* * Remove '>' before 'dir' and 'bdir', for @@ -1498,14 +1498,14 @@ int do_set(char_u *arg, int opt_flags) ) { arg++; // remove backslash } - i = utfc_ptr2len((char *)arg); + i = utfc_ptr2len(arg); if (i > 1) { // copy multibyte char memmove(s, arg, (size_t)i); arg += i; s += i; } else { - *s++ = *arg++; + *s++ = (uint8_t)(*arg++); } } *s = NUL; @@ -1622,7 +1622,7 @@ int do_set(char_u *arg, int opt_flags) } if (save_arg != NULL) { // number for 'whichwrap' - arg = save_arg; + arg = (char *)save_arg; } new_value_alloced = true; } @@ -1710,7 +1710,7 @@ skip: arg++; } } - arg = (char_u *)skipwhite((char *)arg); + arg = skipwhite(arg); if (*arg != '=') { break; } @@ -1720,12 +1720,12 @@ skip: if (errmsg != NULL) { STRLCPY(IObuff, _(errmsg), IOSIZE); i = (int)STRLEN(IObuff) + 2; - if (i + (arg - startarg) < IOSIZE) { + if (i + ((char_u *)arg - startarg) < IOSIZE) { // append the argument with the error STRCAT(IObuff, ": "); - assert(arg >= startarg); - memmove(IObuff + i, startarg, (size_t)(arg - startarg)); - IObuff[i + (arg - startarg)] = NUL; + assert((char_u *)arg >= startarg); + memmove(IObuff + i, startarg, (size_t)((char_u *)arg - startarg)); + IObuff[i + ((char_u *)arg - startarg)] = NUL; } // make sure all characters are printable trans_characters(IObuff, IOSIZE); @@ -1737,7 +1737,7 @@ skip: return FAIL; } - arg = (char_u *)skipwhite((char *)arg); + arg = skipwhite(arg); } theend: @@ -2181,11 +2181,11 @@ static int shada_idx = -1; /// "set_sid". /// /// @param opt_flags OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL -void set_string_option_direct(const char *name, int opt_idx, const char_u *val, int opt_flags, +void set_string_option_direct(const char *name, int opt_idx, const char *val, int opt_flags, int set_sid) { - char_u *s; - char_u **varp; + char *s; + char **varp; int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0; int idx = opt_idx; @@ -2204,18 +2204,17 @@ void set_string_option_direct(const char *name, int opt_idx, const char_u *val, assert((void *)options[idx].var != (void *)&p_shada); - s = vim_strsave(val); + s = xstrdup(val); { - varp = (char_u **)get_varp_scope(&(options[idx]), - both ? OPT_LOCAL : opt_flags); + varp = (char **)get_varp_scope(&(options[idx]), both ? OPT_LOCAL : opt_flags); if ((opt_flags & OPT_FREE) && (options[idx].flags & P_ALLOCED)) { - free_string_option(*varp); + free_string_option((char_u *)(*varp)); } *varp = s; // For buffer/window local option may also set the global value. if (both) { - set_string_option_global(idx, varp); + set_string_option_global(idx, (char_u **)varp); } options[idx].flags |= P_ALLOCED; @@ -2223,8 +2222,8 @@ void set_string_option_direct(const char *name, int opt_idx, const char_u *val, /* When setting both values of a global option with a local value, * make the local value empty, so that the global value is used. */ if (((int)options[idx].indir & PV_BOTH) && both) { - free_string_option(*varp); - *varp = empty_option; + free_string_option((char_u *)(*varp)); + *varp = (char *)empty_option; } if (set_sid != SID_NONE) { sctx_T script_ctx; @@ -2596,6 +2595,8 @@ ambw_end: // only encoding=utf-8 allowed if (STRCMP(p_enc, "utf-8") != 0) { errmsg = e_unsupportedoption; + } else { + spell_reload(); } } } @@ -2812,7 +2813,7 @@ ambw_end: } } else if (gvarp == &p_sbr) { // 'showbreak' for (s = *varp; *s;) { - if (ptr2cells(s) != 1) { + if (ptr2cells((char *)s) != 1) { errmsg = N_("E595: 'showbreak' contains unprintable or wide character"); } MB_PTR_ADV(s); @@ -2832,7 +2833,7 @@ ambw_end: int flagval = (varp == &p_titlestring) ? STL_IN_TITLE : STL_IN_ICON; // NULL => statusline syntax - if (vim_strchr((char *)(*varp), '%') && check_stl_option(*varp) == NULL) { + if (vim_strchr((char *)(*varp), '%') && check_stl_option((char *)(*varp)) == NULL) { stl_syntax |= flagval; } else { stl_syntax &= ~flagval; @@ -2941,14 +2942,14 @@ ambw_end: s++; } wid = getdigits_int(&s, true, 0); - if (wid && *s == '(' && (errmsg = check_stl_option(p_ruf)) == NULL) { + if (wid && *s == '(' && (errmsg = check_stl_option((char *)p_ruf)) == NULL) { ru_wid = wid; } else { - errmsg = check_stl_option(p_ruf); + errmsg = check_stl_option((char *)p_ruf); } } else if (varp == &p_ruf || s[0] != '%' || s[1] != '!') { // check 'statusline', 'winbar' or 'tabline' only if it doesn't start with "%!" - errmsg = check_stl_option(s); + errmsg = check_stl_option((char *)s); } if (varp == &p_ruf && errmsg == NULL) { comp_col(); @@ -3025,6 +3026,7 @@ ambw_end: } else if (varp == &p_pt) { // 'pastetoggle': translate key codes like in a mapping if (*p_pt) { + p = NULL; (void)replace_termcodes((char *)p_pt, STRLEN(p_pt), (char **)&p, REPTERM_FROM_PART | REPTERM_DO_LT, NULL, @@ -3783,7 +3785,7 @@ static char *set_chars_option(win_T *wp, char_u **varp, bool set) /// Check validity of options with the 'statusline' format. /// Return an untranslated error message or NULL. -char *check_stl_option(char_u *s) +char *check_stl_option(char *s) { int groupdepth = 0; static char errbuf[80]; @@ -5322,7 +5324,7 @@ static void showoptions(int all, int opt_flags) len = 1; // a toggle option fits always } else { option_value2string(p, opt_flags); - len = (int)STRLEN(p->fullname) + vim_strsize(NameBuff) + 1; + len = (int)STRLEN(p->fullname) + vim_strsize((char *)NameBuff) + 1; } if ((len <= INC - GAP && run == 1) || (len > INC - GAP && run == 2)) { @@ -5435,7 +5437,7 @@ static void showoneopt(vimoption_T *p, int opt_flags) msg_putchar('='); // put value string in NameBuff option_value2string(p, opt_flags); - msg_outtrans(NameBuff); + msg_outtrans((char *)NameBuff); } silent_mode = save_silent; @@ -5628,7 +5630,7 @@ static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, uint6 // replace home directory in the whole option value into "buf" buf = xmalloc(size); - home_replace(NULL, *valuep, buf, size, false); + home_replace(NULL, (char *)(*valuep), (char *)buf, size, false); // If the option value is longer than MAXPATHL, we need to append // each comma separated part of the option separately, so that it @@ -7039,7 +7041,7 @@ static void option_value2string(vimoption_T *opp, int opt_flags) if (varp == NULL) { // Just in case. NameBuff[0] = NUL; } else if (opp->flags & P_EXPAND) { - home_replace(NULL, varp, NameBuff, MAXPATHL, false); + home_replace(NULL, (char *)varp, (char *)NameBuff, MAXPATHL, false); // Translate 'pastetoggle' into special key names. } else if ((char_u **)opp->var == &p_pt) { str2specialbuf((const char *)p_pt, (char *)NameBuff, MAXPATHL); @@ -7960,11 +7962,7 @@ void set_fileformat(int eol_style, int opt_flags) // p is NULL if "eol_style" is EOL_UNKNOWN. if (p != NULL) { - set_string_option_direct("ff", - -1, - (char_u *)p, - OPT_FREE | opt_flags, - 0); + set_string_option_direct("ff", -1, p, OPT_FREE | opt_flags, 0); } // This may cause the buffer to become (un)modified. diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 4bc003bc7f..3a213605dc 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -1033,7 +1033,7 @@ char *vim_getenv(const char *name) /// a list of them. /// /// @return length of the string put into dst, does not include NUL byte. -size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst, size_t dstlen, +size_t home_replace(const buf_T *const buf, const char *src, char *const dst, size_t dstlen, const bool one) FUNC_ATTR_NONNULL_ARG(3) { @@ -1085,9 +1085,9 @@ size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst } if (!one) { - src = (char_u *)skipwhite((char *)src); + src = skipwhite((char *)src); } - char *dst_p = (char *)dst; + char *dst_p = dst; while (*src && dstlen > 0) { // Here we are at the beginning of a file name. // First, check to see if the beginning of the file name matches @@ -1123,11 +1123,11 @@ size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst // if (!one) skip to separator: space or comma. while (*src && (one || (*src != ',' && *src != ' ')) && --dstlen > 0) { - *dst_p++ = (char)(*src++); + *dst_p++ = *src++; } // Skip separator. while ((*src == ' ' || *src == ',') && --dstlen > 0) { - *dst_p++ = (char)(*src++); + *dst_p++ = *src++; } } // If (dstlen == 0) out of space, what to do??? @@ -1137,7 +1137,7 @@ size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst if (must_free) { xfree(homedir_env_mod); } - return (size_t)(dst_p - (char *)dst); + return (size_t)(dst_p - dst); } /// Like home_replace, store the replaced string in allocated memory. @@ -1149,9 +1149,9 @@ char_u *home_replace_save(buf_T *buf, char_u *src) FUNC_ATTR_NONNULL_RET if (src != NULL) { // just in case len += STRLEN(src); } - char_u *dst = xmalloc(len); - home_replace(buf, src, dst, len, true); - return dst; + char *dst = xmalloc(len); + home_replace(buf, (char *)src, dst, len, true); + return (char_u *)dst; } /// Function given to ExpandGeneric() to obtain an environment variable name. diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index d331bd21a2..9283ea2e42 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -854,9 +854,9 @@ static int do_os_system(char **argv, const char *input, size_t len, char **outpu // Failed, probably 'shell' is not executable. if (!silent) { msg_puts(_("\nshell failed to start: ")); - msg_outtrans((char_u *)os_strerror(status)); + msg_outtrans((char *)os_strerror(status)); msg_puts(": "); - msg_outtrans((char_u *)prog); + msg_outtrans(prog); msg_putchar('\n'); } multiqueue_free(events); diff --git a/src/nvim/path.c b/src/nvim/path.c index 9859ca7daa..f5c662ca88 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -52,27 +52,27 @@ /// @param checkname When both files don't exist, only compare their names. /// @param expandenv Whether to expand environment variables in file names. /// @return Enum of type FileComparison. @see FileComparison. -FileComparison path_full_compare(char_u *const s1, char_u *const s2, const bool checkname, +FileComparison path_full_compare(char *const s1, char *const s2, const bool checkname, const bool expandenv) { assert(s1 && s2); - char_u exp1[MAXPATHL]; - char_u full1[MAXPATHL]; - char_u full2[MAXPATHL]; + char exp1[MAXPATHL]; + char full1[MAXPATHL]; + char full2[MAXPATHL]; FileID file_id_1, file_id_2; if (expandenv) { - expand_env(s1, exp1, MAXPATHL); + expand_env((char_u *)s1, (char_u *)exp1, MAXPATHL); } else { STRLCPY(exp1, s1, MAXPATHL); } - bool id_ok_1 = os_fileid((char *)exp1, &file_id_1); - bool id_ok_2 = os_fileid((char *)s2, &file_id_2); + bool id_ok_1 = os_fileid(exp1, &file_id_1); + bool id_ok_2 = os_fileid(s2, &file_id_2); if (!id_ok_1 && !id_ok_2) { // If os_fileid() doesn't work, may compare the names. if (checkname) { - vim_FullName((char *)exp1, (char *)full1, MAXPATHL, false); - vim_FullName((char *)s2, (char *)full2, MAXPATHL, false); + vim_FullName(exp1, full1, MAXPATHL, false); + vim_FullName(s2, full2, MAXPATHL, false); if (FNAMECMP(full1, full2) == 0) { return kEqualFileNames; } diff --git a/src/nvim/plines.c b/src/nvim/plines.c index 35f2512ee3..70bdbd8b1d 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -229,7 +229,7 @@ int win_chartabsize(win_T *wp, char_u *p, colnr_T col) if (*p == TAB && (!wp->w_p_list || wp->w_p_lcs_chars.tab1)) { return tabstop_padding(col, buf->b_p_ts, buf->b_p_vts_array); } else { - return ptr2cells(p); + return ptr2cells((char *)p); } } @@ -408,7 +408,7 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he // Set *headp to the size of what we add. added = 0; - char_u *const sbr = get_showbreak_value(wp); + char *const sbr = (char *)get_showbreak_value(wp); if ((*sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) { colnr_T sbrlen = 0; int numberwidth = win_col_off(wp); @@ -423,7 +423,7 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he col %= numberextra; } if (*sbr != NUL) { - sbrlen = (colnr_T)mb_charlen(sbr); + sbrlen = (colnr_T)mb_charlen((char_u *)sbr); if (col >= sbrlen) { col -= sbrlen; } @@ -494,7 +494,7 @@ static int win_nolbr_chartabsize(win_T *wp, char_u *s, colnr_T col, int *headp) wp->w_buffer->b_p_ts, wp->w_buffer->b_p_vts_array); } - n = ptr2cells(s); + n = ptr2cells((char *)s); // Add one cell for a double-width character in the last column of the // window, displayed with a ">". diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index db1054eb1f..ecaeca005d 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -66,19 +66,19 @@ static void pum_compute_size(void) for (int i = 0; i < pum_size; i++) { int w; if (pum_array[i].pum_text != NULL) { - w = vim_strsize(pum_array[i].pum_text); + w = vim_strsize((char *)pum_array[i].pum_text); if (pum_base_width < w) { pum_base_width = w; } } if (pum_array[i].pum_kind != NULL) { - w = vim_strsize(pum_array[i].pum_kind) + 1; + w = vim_strsize((char *)pum_array[i].pum_kind) + 1; if (pum_kind_width < w) { pum_kind_width = w; } } if (pum_array[i].pum_extra != NULL) { - w = vim_strsize(pum_array[i].pum_extra) + 1; + w = vim_strsize((char *)pum_array[i].pum_extra) + 1; if (pum_extra_width < w) { pum_extra_width = w; } @@ -504,7 +504,7 @@ void pum_redraw(void) if (s == NULL) { s = p; } - w = ptr2cells(p); + w = ptr2cells((char *)p); if ((*p == NUL) || (*p == TAB) || (totwidth + w > pum_width)) { // Display the text that fits or comes before a Tab. @@ -517,13 +517,13 @@ void pum_redraw(void) *p = saved; if (pum_rl) { - char_u *rt = reverse_text(st); - char_u *rt_start = rt; + char *rt = (char *)reverse_text(st); + char *rt_start = rt; int size = vim_strsize(rt); if (size > pum_width) { do { - size -= utf_ptr2cells((char *)rt); + size -= utf_ptr2cells(rt); MB_PTR_ADV(rt); } while (size > pum_width); @@ -535,7 +535,7 @@ void pum_redraw(void) size++; } } - grid_puts_len(&pum_grid, rt, (int)STRLEN(rt), row, + grid_puts_len(&pum_grid, (char_u *)rt, (int)STRLEN(rt), row, grid_col - size + 1, attr); xfree(rt_start); xfree(st); diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 868a68969c..22e72669ee 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -4343,7 +4343,7 @@ static char *make_get_fullcmd(const char *makecmd, const char *fname) } msg_start(); msg_puts(":!"); - msg_outtrans((char_u *)cmd); // show what we are doing + msg_outtrans(cmd); // show what we are doing return cmd; } @@ -5100,7 +5100,7 @@ void ex_cfile(exarg_T *eap) } } if (*eap->arg != NUL) { - set_string_option_direct("ef", -1, (char_u *)eap->arg, OPT_FREE, 0); + set_string_option_direct("ef", -1, eap->arg, OPT_FREE, 0); } char *enc = (*curbuf->b_p_menc != NUL) ? (char *)curbuf->b_p_menc : (char *)p_menc; @@ -5199,9 +5199,9 @@ static void vgr_display_fname(char *fname) msg_start(); char *p = (char *)msg_strtrunc((char_u *)fname, true); if (p == NULL) { - msg_outtrans((char_u *)fname); + msg_outtrans(fname); } else { - msg_outtrans((char_u *)p); + msg_outtrans(p); xfree(p); } msg_clr_eos(); @@ -5716,7 +5716,7 @@ static buf_T *load_dummy_buffer(char *fname, char *dirname_start, char *resultin aucmd_prepbuf(&aco, newbuf); // Need to set the filename for autocommands. - (void)setfname(curbuf, (char_u *)fname, NULL, false); + (void)setfname(curbuf, fname, NULL, false); // Create swap file now to avoid the ATTENTION message. check_need_swap(true); diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 98f8e30391..ea75900ded 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -4718,7 +4718,7 @@ static int status_match_len(expand_T *xp, char_u *s) while (*s != NUL) { s += skip_status_match_char(xp, s); - len += ptr2cells(s); + len += ptr2cells((char *)s); MB_PTR_ADV(s); } @@ -4856,7 +4856,7 @@ void win_redr_status_matches(expand_T *xp, int num_matches, char_u **matches, in } else { for (; *s != NUL; ++s) { s += skip_status_match_char(xp, s); - clen += ptr2cells(s); + clen += ptr2cells((char *)s); if ((l = utfc_ptr2len((char *)s)) > 1) { STRNCPY(buf + len, s, l); // NOLINT(runtime/printf) s += l - 1; @@ -5034,7 +5034,7 @@ static void win_redr_status(win_T *wp) grid_fill(&default_grid, row, row + 1, len + col, this_ru_col + col, fillchar, fillchar, attr); - if (get_keymap_str(wp, (char_u *)"<%s>", NameBuff, MAXPATHL) + if (get_keymap_str(wp, "<%s>", (char *)NameBuff, MAXPATHL) && this_ru_col - len > (int)(STRLEN(NameBuff) + 1)) { grid_puts(&default_grid, NameBuff, row, (int)(this_ru_col - STRLEN(NameBuff) - 1), attr); @@ -5079,7 +5079,7 @@ static void redraw_custom_statusline(win_T *wp) // When there is an error disable the statusline, otherwise the // display is messed up with errors and a redraw triggers the problem // again and again. - set_string_option_direct("statusline", -1, (char_u *)"", + set_string_option_direct("statusline", -1, "", OPT_FREE | (*wp->w_p_stl != NUL ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR); } @@ -5109,7 +5109,7 @@ static void win_redr_winbar(win_T *wp) // When there is an error disable the winbar, otherwise the // display is messed up with errors and a redraw triggers the problem // again and again. - set_string_option_direct("winbar", -1, (char_u *)"", + set_string_option_direct("winbar", -1, "", OPT_FREE | (*wp->w_p_stl != NUL ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR); } @@ -5218,9 +5218,9 @@ static bool vsep_connected(win_T *wp, WindowCorner corner) /// @param fmt format string containing one %s item /// @param buf buffer for the result /// @param len length of buffer -bool get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len) +bool get_keymap_str(win_T *wp, char *fmt, char *buf, int len) { - char_u *p; + char *p; if (wp->w_buffer->b_p_iminsert != B_IMODE_LMAP) { return false; @@ -5229,24 +5229,24 @@ bool get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len) { buf_T *old_curbuf = curbuf; win_T *old_curwin = curwin; - char_u *s; + char *s; curbuf = wp->w_buffer; curwin = wp; STRCPY(buf, "b:keymap_name"); // must be writable emsg_skip++; - s = p = (char_u *)eval_to_string((char *)buf, NULL, false); + s = p = eval_to_string(buf, NULL, false); emsg_skip--; curbuf = old_curbuf; curwin = old_curwin; if (p == NULL || *p == NUL) { if (wp->w_buffer->b_kmap_state & KEYMAP_LOADED) { - p = wp->w_buffer->b_p_keymap; + p = (char *)wp->w_buffer->b_p_keymap; } else { - p = (char_u *)"lang"; + p = "lang"; } } - if (vim_snprintf((char *)buf, len, (char *)fmt, p) > len - 1) { + if (vim_snprintf(buf, len, fmt, p) > len - 1) { buf[0] = NUL; } xfree(s); @@ -5268,9 +5268,9 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) int n; int len; int fillchar; - char_u buf[MAXPATHL]; + char buf[MAXPATHL]; char_u *stl; - char_u *p; + char *p; stl_hlrec_t *hltab; StlClickRecord *tabtab; int use_sandbox = false; @@ -5389,20 +5389,20 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) * might change the option value and free the memory. */ stl = vim_strsave(stl); width = - build_stl_str_hl(ewp, (char *)buf, sizeof(buf), (char *)stl, use_sandbox, + build_stl_str_hl(ewp, buf, sizeof(buf), (char *)stl, use_sandbox, fillchar, maxwidth, &hltab, &tabtab); xfree(stl); ewp->w_p_crb = p_crb_save; // Make all characters printable. - p = (char_u *)transstr((const char *)buf, true); + p = transstr(buf, true); len = STRLCPY(buf, p, sizeof(buf)); len = (size_t)len < sizeof(buf) ? len : (int)sizeof(buf) - 1; xfree(p); // fill up with "fillchar" while (width < maxwidth && len < (int)sizeof(buf) - 1) { - len += utf_char2bytes(fillchar, (char *)buf + len); + len += utf_char2bytes(fillchar, buf + len); width++; } buf[len] = NUL; @@ -5416,8 +5416,8 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) p = buf; for (n = 0; hltab[n].start != NULL; n++) { int textlen = (int)(hltab[n].start - p); - grid_puts_len(grid, p, textlen, row, col, curattr); - col += vim_strnsize(p, textlen); + grid_puts_len(grid, (char_u *)p, textlen, row, col, curattr); + col += vim_strnsize((char_u *)p, textlen); p = hltab[n].start; if (hltab[n].userhl == 0) { @@ -5431,7 +5431,7 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) } } // Make sure to use an empty string instead of p, if p is beyond buf + len. - grid_puts(grid, p >= buf + len ? (char_u *)"" : p, row, col, + grid_puts(grid, p >= buf + len ? (char_u *)"" : (char_u *)p, row, col, curattr); grid_puts_line_flush(false); @@ -5453,11 +5453,11 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) .type = kStlClickDisabled, }; for (n = 0; tabtab[n].start != NULL; n++) { - len += vim_strnsize(p, (int)(tabtab[n].start - (char *)p)); + len += vim_strnsize((char_u *)p, (int)(tabtab[n].start - p)); while (col < len) { click_defs[col++] = cur_click_def; } - p = (char_u *)tabtab[n].start; + p = (char *)tabtab[n].start; cur_click_def = tabtab[n].def; if ((wp != NULL) && !(cur_click_def.type == kStlClickDisabled || cur_click_def.type == kStlClickFuncRun)) { @@ -5980,13 +5980,13 @@ int showmode(void) length = (Rows - msg_row) * Columns - 3; } if (edit_submode_extra != NULL) { - length -= vim_strsize(edit_submode_extra); + length -= vim_strsize((char *)edit_submode_extra); } if (length > 0) { if (edit_submode_pre != NULL) { - length -= vim_strsize(edit_submode_pre); + length -= vim_strsize((char *)edit_submode_pre); } - if (length - vim_strsize(edit_submode) > 0) { + if (length - vim_strsize((char *)edit_submode) > 0) { if (edit_submode_pre != NULL) { msg_puts_attr((const char *)edit_submode_pre, attr); } @@ -6028,8 +6028,8 @@ int showmode(void) if (State & MODE_LANGMAP) { if (curwin->w_p_arab) { msg_puts_attr(_(" Arabic"), attr); - } else if (get_keymap_str(curwin, (char_u *)" (%s)", - NameBuff, MAXPATHL)) { + } else if (get_keymap_str(curwin, " (%s)", + (char *)NameBuff, MAXPATHL)) { msg_puts_attr((char *)NameBuff, attr); } } @@ -6211,8 +6211,7 @@ void draw_tabline(void) did_emsg = false; win_redr_custom(NULL, false, false); if (did_emsg) { - set_string_option_direct("tabline", -1, - (char_u *)"", OPT_FREE, SID_ERROR); + set_string_option_direct("tabline", -1, "", OPT_FREE, SID_ERROR); } did_emsg |= saved_did_emsg; } else { @@ -6289,10 +6288,10 @@ void draw_tabline(void) // Get buffer name in NameBuff[] get_trans_bufname(cwp->w_buffer); shorten_dir(NameBuff); - len = vim_strsize(NameBuff); + len = vim_strsize((char *)NameBuff); p = NameBuff; while (len > room) { - len -= ptr2cells(p); + len -= ptr2cells((char *)p); MB_PTR_ADV(p); } if (len > Columns - col - 1) { @@ -6395,7 +6394,7 @@ void get_trans_bufname(buf_T *buf) if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); + home_replace(buf, buf->b_fname, (char *)NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); } @@ -6521,8 +6520,7 @@ static void win_redr_ruler(win_T *wp, bool always) called_emsg = false; win_redr_custom(wp, false, true); if (called_emsg) { - set_string_option_direct("rulerformat", -1, (char_u *)"", - OPT_FREE, SID_ERROR); + set_string_option_direct("rulerformat", -1, "", OPT_FREE, SID_ERROR); } called_emsg |= save_called_emsg; return; @@ -6588,17 +6586,17 @@ static void win_redr_ruler(win_T *wp, bool always) } #define RULER_BUF_LEN 70 - char_u buffer[RULER_BUF_LEN]; + char buffer[RULER_BUF_LEN]; /* * Some sprintfs return the length, some return a pointer. * To avoid portability problems we use strlen() here. */ - vim_snprintf((char *)buffer, RULER_BUF_LEN, "%" PRId64 ",", + vim_snprintf(buffer, RULER_BUF_LEN, "%" PRId64 ",", (wp->w_buffer->b_ml.ml_flags & ML_EMPTY) ? (int64_t)0L : (int64_t)wp->w_cursor.lnum); size_t len = STRLEN(buffer); - col_print(buffer + len, RULER_BUF_LEN - len, + col_print((char_u *)buffer + len, RULER_BUF_LEN - len, empty_line ? 0 : (int)wp->w_cursor.col + 1, (int)virtcol + 1); @@ -6625,7 +6623,7 @@ static void win_redr_ruler(win_T *wp, bool always) if (this_ru_col + o < width) { // Need at least 3 chars left for get_rel_pos() + NUL. while (this_ru_col + o < width && RULER_BUF_LEN > i + 4) { - i += utf_char2bytes(fillchar, (char *)buffer + i); + i += utf_char2bytes(fillchar, buffer + i); o++; } get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i); @@ -6646,8 +6644,8 @@ static void win_redr_ruler(win_T *wp, bool always) } // Truncate at window boundary. o = 0; - for (i = 0; buffer[i] != NUL; i += utfc_ptr2len((char *)buffer + i)) { - o += utf_ptr2cells((char *)buffer + i); + for (i = 0; buffer[i] != NUL; i += utfc_ptr2len(buffer + i)) { + o += utf_ptr2cells(buffer + i); if (this_ru_col + o > width) { buffer[i] = NUL; break; @@ -6655,7 +6653,7 @@ static void win_redr_ruler(win_T *wp, bool always) } ScreenGrid *grid = part_of_status ? &default_grid : &msg_grid_adj; - grid_puts(grid, buffer, row, this_ru_col + off, attr); + grid_puts(grid, (char_u *)buffer, row, this_ru_col + off, attr); grid_fill(grid, row, row + 1, this_ru_col + off + (int)STRLEN(buffer), off + width, fillchar, fillchar, attr); diff --git a/src/nvim/search.c b/src/nvim/search.c index 1e862f10ec..a5c18bd03a 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -910,8 +910,7 @@ int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, Direction dir, lnum = 1; } if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG)) { - give_warning((char_u *)_(dir == BACKWARD - ? top_bot_msg : bot_top_msg), true); + give_warning(_(dir == BACKWARD ? top_bot_msg : bot_top_msg), true); } if (extra_arg != NULL) { extra_arg->sa_wrapped = true; @@ -1261,7 +1260,7 @@ int do_search(oparg_T *oap, int dirc, int search_delim, char_u *pat, long count, memset(msgbuf + pat_len, ' ', r - msgbuf); } } - msg_outtrans(msgbuf); + msg_outtrans((char *)msgbuf); msg_clr_eos(); msg_check(); @@ -1452,7 +1451,7 @@ int search_for_exact_line(buf_T *buf, pos_T *pos, Direction dir, char_u *pat) if (p_ws) { pos->lnum = buf->b_ml.ml_line_count; if (!shortmess(SHM_SEARCH)) { - give_warning((char_u *)_(top_bot_msg), true); + give_warning(_(top_bot_msg), true); } } else { pos->lnum = 1; @@ -1462,7 +1461,7 @@ int search_for_exact_line(buf_T *buf, pos_T *pos, Direction dir, char_u *pat) if (p_ws) { pos->lnum = 1; if (!shortmess(SHM_SEARCH)) { - give_warning((char_u *)_(bot_top_msg), true); + give_warning(_(bot_top_msg), true); } } else { pos->lnum = 1; @@ -4515,7 +4514,7 @@ static void cmdline_search_stat(int dirc, pos_T *pos, pos_T *cursor_pos, bool sh // keep the message even after redraw, but don't put in history msg_hist_off = true; msg_ext_set_kind("search_count"); - give_warning(msgbuf, false); + give_warning((char *)msgbuf, false); msg_hist_off = false; } } @@ -5414,8 +5413,8 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo if (i == max_path_depth) { break; } - if (path_full_compare(new_fname, files[i].name, - true, true) & kEqualFiles) { + if (path_full_compare((char *)new_fname, (char *)files[i].name, true, + true) & kEqualFiles) { if (type != CHECK_PATH && action == ACTION_SHOW_ALL && files[i].matched) { msg_putchar('\n'); // cursor below last one */ diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 5410740d9e..32a0f3902d 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -3977,7 +3977,7 @@ static bool shada_removable(const char *name) for (p = (char *)p_shada; *p;) { (void)copy_option_part((char_u **)&p, (char_u *)part, ARRAY_SIZE(part), ", "); if (part[0] == 'r') { - home_replace(NULL, (char_u *)(part + 1), (char_u *)NameBuff, MAXPATHL, true); + home_replace(NULL, part + 1, (char *)NameBuff, MAXPATHL, true); size_t n = STRLEN(NameBuff); if (mb_strnicmp((char_u *)NameBuff, (char_u *)new_name, n) == 0) { retval = true; diff --git a/src/nvim/sign.c b/src/nvim/sign.c index 0e4d092025..940cd1d274 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -1630,12 +1630,12 @@ static void sign_list_defined(sign_T *sp) smsg("sign %s", sp->sn_name); if (sp->sn_icon != NULL) { msg_puts(" icon="); - msg_outtrans(sp->sn_icon); + msg_outtrans((char *)sp->sn_icon); msg_puts(_(" (not supported)")); } if (sp->sn_text != NULL) { msg_puts(" text="); - msg_outtrans(sp->sn_text); + msg_outtrans((char *)sp->sn_text); } if (sp->sn_line_hl > 0) { msg_puts(" linehl="); diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 8f84204481..e4805f3c4a 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -1576,7 +1576,7 @@ size_t spell_move_to(win_T *wp, int dir, bool allwords, bool curline, hlf_T *att lnum = wp->w_buffer->b_ml.ml_line_count; wrapped = true; if (!shortmess(SHM_SEARCH)) { - give_warning((char_u *)_(top_bot_msg), true); + give_warning(_(top_bot_msg), true); } } capcol = -1; @@ -1591,7 +1591,7 @@ size_t spell_move_to(win_T *wp, int dir, bool allwords, bool curline, hlf_T *att lnum = 1; wrapped = true; if (!shortmess(SHM_SEARCH)) { - give_warning((char_u *)_(bot_top_msg), true); + give_warning(_(bot_top_msg), true); } } @@ -2115,7 +2115,7 @@ char *did_set_spelllang(win_T *wp) // Check if we loaded this language before. for (slang = first_lang; slang != NULL; slang = slang->sl_next) { - if (path_full_compare(lang, slang->sl_fname, false, true) + if (path_full_compare((char *)lang, (char *)slang->sl_fname, false, true) == kEqualFiles) { break; } @@ -2164,7 +2164,7 @@ char *did_set_spelllang(win_T *wp) // Loop over the languages, there can be several files for "lang". for (slang = first_lang; slang != NULL; slang = slang->sl_next) { if (filename - ? path_full_compare(lang, slang->sl_fname, false, true) == kEqualFiles + ? path_full_compare((char *)lang, (char *)slang->sl_fname, false, true) == kEqualFiles : STRICMP(lang, slang->sl_name) == 0) { region_mask = REGION_ALL; if (!filename && region != NULL) { @@ -2222,7 +2222,7 @@ char *did_set_spelllang(win_T *wp) for (c = 0; c < ga.ga_len; ++c) { p = LANGP_ENTRY(ga, c)->lp_slang->sl_fname; if (p != NULL - && path_full_compare(spf_name, p, false, true) == kEqualFiles) { + && path_full_compare((char *)spf_name, (char *)p, false, true) == kEqualFiles) { break; } } @@ -2233,7 +2233,7 @@ char *did_set_spelllang(win_T *wp) // Check if it was loaded already. for (slang = first_lang; slang != NULL; slang = slang->sl_next) { - if (path_full_compare(spf_name, slang->sl_fname, false, true) + if (path_full_compare((char *)spf_name, (char *)slang->sl_fname, false, true) == kEqualFiles) { break; } @@ -3663,6 +3663,12 @@ static void suggest_try_change(suginfo_T *su) p = su->su_badptr + su->su_badlen; (void)spell_casefold(curwin, p, (int)STRLEN(p), fword + n, MAXWLEN - n); + // Make sure the resulting text is not longer than the original text. + n = (int)STRLEN(su->su_badptr); + if (n < MAXWLEN) { + fword[n] = NUL; + } + for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len; ++lpi) { lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi); @@ -4375,7 +4381,9 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so #endif ++depth; sp = &stack[depth]; - ++sp->ts_fidx; + if (fword[sp->ts_fidx] != NUL) { + sp->ts_fidx++; + } tword[sp->ts_twordlen++] = c; sp->ts_arridx = idxs[arridx]; if (newscore == SCORE_SUBST) { @@ -4391,7 +4399,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so sp->ts_fcharstart = sp->ts_fidx - 1; sp->ts_isdiff = (newscore != 0) ? DIFF_YES : DIFF_NONE; - } else if (sp->ts_isdiff == DIFF_INSERT) { + } else if (sp->ts_isdiff == DIFF_INSERT && sp->ts_fidx > 0) { // When inserting trail bytes don't advance in the // bad word. sp->ts_fidx--; diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c index 2b6bb098d1..07f3d39886 100644 --- a/src/nvim/spellfile.c +++ b/src/nvim/spellfile.c @@ -1826,7 +1826,7 @@ static void spell_reload_one(char_u *fname, bool added_word) bool didit = false; for (slang = first_lang; slang != NULL; slang = slang->sl_next) { - if (path_full_compare(fname, slang->sl_fname, false, true) == kEqualFiles) { + if (path_full_compare((char *)fname, (char *)slang->sl_fname, false, true) == kEqualFiles) { slang_clear(slang); if (spell_load_file(fname, NULL, slang, false) == NULL) { // reloading failed, clear the language @@ -4903,7 +4903,7 @@ static void spell_make_sugfile(spellinfo_T *spin, char_u *wfname) // of the code for the soundfolding stuff. // It might have been done already by spell_reload_one(). for (slang = first_lang; slang != NULL; slang = slang->sl_next) { - if (path_full_compare(wfname, slang->sl_fname, false, true) + if (path_full_compare((char *)wfname, (char *)slang->sl_fname, false, true) == kEqualFiles) { break; } @@ -5598,9 +5598,8 @@ void spell_add_word(char_u *word, int len, SpellAddType what, int idx, bool undo if (fseek(fd, fpos, SEEK_SET) == 0) { fputc('#', fd); if (undo) { - home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE); - smsg(_("Word '%.*s' removed from %s"), - len, word, NameBuff); + home_replace(NULL, (char *)fname, (char *)NameBuff, MAXPATHL, true); + smsg(_("Word '%.*s' removed from %s"), len, word, NameBuff); } } if (fseek(fd, fpos_next, SEEK_SET) != 0) { @@ -5648,7 +5647,7 @@ void spell_add_word(char_u *word, int len, SpellAddType what, int idx, bool undo } fclose(fd); - home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE); + home_replace(NULL, (char *)fname, (char *)NameBuff, MAXPATHL, true); smsg(_("Word '%.*s' added to %s"), len, word, NameBuff); } } diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 0d43458b5b..9615423765 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -3171,9 +3171,9 @@ static void syn_cmd_iskeyword(exarg_T *eap, int syncing) msg_puts("\n"); if (curwin->w_s->b_syn_isk != empty_option) { msg_puts("syntax iskeyword "); - msg_outtrans(curwin->w_s->b_syn_isk); + msg_outtrans((char *)curwin->w_s->b_syn_isk); } else { - msg_outtrans((char_u *)_("syntax iskeyword not set")); + msg_outtrans(_("syntax iskeyword not set")); } } else { if (STRNICMP(arg, "clear", 5) == 0) { @@ -3382,7 +3382,7 @@ static void syn_cmd_clear(exarg_T *eap, int syncing) XFREE_CLEAR(SYN_CLSTR(curwin->w_s)[scl_id].scl_list); } } else { - id = syn_name2id_len(arg, (int)(arg_end - arg)); + id = syn_name2id_len((char *)arg, (int)(arg_end - arg)); if (id == 0) { semsg(_(e_nogroup), arg); break; @@ -3553,7 +3553,7 @@ static void syn_cmd_list(exarg_T *eap, int syncing) syn_list_cluster(id - SYNID_CLUSTER); } } else { - int id = syn_name2id_len(arg, (int)(arg_end - arg)); + int id = syn_name2id_len((char *)arg, (int)(arg_end - arg)); if (id == 0) { semsg(_(e_nogroup), arg); } else { @@ -3690,8 +3690,8 @@ static void syn_list_one(const int id, const bool syncing, const bool link_only) } msg_putchar(' '); if (spp->sp_sync_idx >= 0) { - msg_outtrans(highlight_group_name(SYN_ITEMS(curwin->w_s) - [spp->sp_sync_idx].sp_syn.id - 1)); + msg_outtrans((char *)highlight_group_name(SYN_ITEMS(curwin->w_s) + [spp->sp_sync_idx].sp_syn.id - 1)); } else { msg_puts("NONE"); } @@ -3704,7 +3704,7 @@ static void syn_list_one(const int id, const bool syncing, const bool link_only) (void)syn_list_header(did_header, 0, id, true); msg_puts_attr("links to", attr); msg_putchar(' '); - msg_outtrans(highlight_group_name(highlight_link_id(id - 1) - 1)); + msg_outtrans((char *)highlight_group_name(highlight_link_id(id - 1) - 1)); } } @@ -3729,7 +3729,7 @@ static void syn_list_cluster(int id) // slight hack: roughly duplicate the guts of syn_list_header() msg_putchar('\n'); - msg_outtrans(SYN_CLSTR(curwin->w_s)[id].scl_name); + msg_outtrans((char *)SYN_CLSTR(curwin->w_s)[id].scl_name); if (msg_col >= endcol) { // output at least one space endcol = msg_col + 1; @@ -3766,9 +3766,9 @@ static void put_id_list(const char *const name, const int16_t *const list, const int scl_id = *p - SYNID_CLUSTER; msg_putchar('@'); - msg_outtrans(SYN_CLSTR(curwin->w_s)[scl_id].scl_name); + msg_outtrans((char *)SYN_CLSTR(curwin->w_s)[scl_id].scl_name); } else { - msg_outtrans(highlight_group_name(*p - 1)); + msg_outtrans((char *)highlight_group_name(*p - 1)); } if (p[1]) { msg_putchar(','); @@ -3788,9 +3788,9 @@ static void put_pattern(const char *const s, const int c, const synpat_T *const msg_puts_attr("matchgroup", attr); msg_putchar('='); if (last_matchgroup == 0) { - msg_outtrans((char_u *)"NONE"); + msg_outtrans("NONE"); } else { - msg_outtrans(highlight_group_name(last_matchgroup - 1)); + msg_outtrans((char *)highlight_group_name(last_matchgroup - 1)); } msg_putchar(' '); } @@ -3807,7 +3807,7 @@ static void put_pattern(const char *const s, const int c, const synpat_T *const } } msg_putchar(sepchars[i]); - msg_outtrans(spp->sp_pattern); + msg_outtrans((char *)spp->sp_pattern); msg_putchar(sepchars[i]); // output any pattern options @@ -3917,7 +3917,7 @@ static bool syn_list_keywords(const int id, const hashtab_T *const ht, bool did_ prev_skipempty = (kp->flags & HL_SKIPEMPTY); } } - msg_outtrans(kp->keyword); + msg_outtrans((char *)kp->keyword); } } } @@ -6038,7 +6038,7 @@ static void syntime_report(void) msg_puts(profile_msg(p->average)); msg_puts(" "); msg_advance(50); - msg_outtrans(highlight_group_name(p->id - 1)); + msg_outtrans((char *)highlight_group_name(p->id - 1)); msg_puts(" "); msg_advance(69); diff --git a/src/nvim/tag.c b/src/nvim/tag.c index b9f6494459..796a2fa5f3 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -624,7 +624,7 @@ bool do_tag(char_u *tag, int type, int count, int forceit, int verbose) } msg_scroll = true; // Don't overwrite this message. } else { - give_warning(IObuff, ic); + give_warning((char *)IObuff, ic); } if (ic && !msg_scrolled && msg_silent == 0) { ui_flush(); @@ -784,7 +784,7 @@ static void print_tag_list(int new_tag, int use_tagstack, int num_matches, char_ // print all other extra fields attr = HL_ATTR(HLF_CM); while (*p && *p != '\r' && *p != '\n') { - if (msg_col + ptr2cells(p) >= Columns) { + if (msg_col + ptr2cells((char *)p) >= Columns) { msg_putchar('\n'); if (got_int) { break; @@ -830,7 +830,7 @@ static void print_tag_list(int new_tag, int use_tagstack, int num_matches, char_ } while (p != command_end) { - if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns) { + if (msg_col + (*p == TAB ? 1 : ptr2cells((char *)p)) > Columns) { msg_putchar('\n'); } if (got_int) { @@ -1050,7 +1050,7 @@ void do_tags(exarg_T *eap) tagstack[i].cur_match + 1, tagstack[i].tagname, tagstack[i].fmark.mark.lnum); - msg_outtrans(IObuff); + msg_outtrans((char *)IObuff); msg_outtrans_attr(name, tagstack[i].fmark.fnum == curbuf->b_fnum ? HL_ATTR(HLF_D) : 0); xfree(name); @@ -3032,8 +3032,7 @@ static int test_for_current(char_u *fname, char_u *fname_end, char_u *tag_fname, *fname_end = NUL; } fullname = expand_tag_fname(fname, tag_fname, true); - retval = (path_full_compare(fullname, buf_ffname, true, true) - & kEqualFiles); + retval = (path_full_compare((char *)fullname, (char *)buf_ffname, true, true) & kEqualFiles); xfree(fullname); *fname_end = (char_u)c; } diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 887c8e1593..8d1746be2f 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -305,7 +305,7 @@ func Test_getcompletion() call assert_equal([], l) let l = getcompletion('', 'dir') - call assert_true(index(l, expand('sautest/')) >= 0) + call assert_true(index(l, 'sautest/') >= 0) let l = getcompletion('NoMatch', 'dir') call assert_equal([], l) @@ -415,7 +415,7 @@ func Test_getcompletion() " Command line completion tests let l = getcompletion('cd ', 'cmdline') - call assert_true(index(l, expand('sautest/')) >= 0) + call assert_true(index(l, 'sautest/') >= 0) let l = getcompletion('cd NoMatch', 'cmdline') call assert_equal([], l) let l = getcompletion('let v:n', 'cmdline') @@ -539,7 +539,7 @@ func Test_expand_star_star() call mkdir('a/b', 'p') call writefile(['asdfasdf'], 'a/b/fileXname') call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt') - call assert_equal('find '.expand('a/b/fileXname'), getreg(':')) + call assert_equal('find a/b/fileXname', getreg(':')) bwipe! call delete('a', 'rf') endfunc diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim index 90b57323af..c8104c6b73 100644 --- a/src/nvim/testdir/test_ins_complete.vim +++ b/src/nvim/testdir/test_ins_complete.vim @@ -287,6 +287,30 @@ func Test_omni_dash() set omnifunc= endfunc +func Test_omni_throw() + let g:CallCount = 0 + func Omni(findstart, base) + let g:CallCount += 1 + if a:findstart + throw "he he he" + endif + endfunc + set omnifunc=Omni + new + try + exe "normal ifoo\<C-x>\<C-o>" + call assert_false(v:true, 'command should have failed') + catch + call assert_exception('he he he') + call assert_equal(1, g:CallCount) + endtry + + bwipe! + delfunc Omni + unlet g:CallCount + set omnifunc= +endfunc + func Test_completefunc_args() let s:args = [] func! CompleteFunc(findstart, base) diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index e43db4d692..5826666cbb 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -1060,17 +1060,17 @@ func s:dir_stack_tests(cchar) let qf = g:Xgetlist() - call assert_equal(expand('dir1/a/habits2.txt'), bufname(qf[1].bufnr)) + call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr)) call assert_equal(1, qf[1].lnum) - call assert_equal(expand('dir1/a/b/habits3.txt'), bufname(qf[3].bufnr)) + call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr)) call assert_equal(2, qf[3].lnum) - call assert_equal(expand('dir1/a/habits2.txt'), bufname(qf[4].bufnr)) + call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr)) call assert_equal(7, qf[4].lnum) - call assert_equal(expand('dir1/c/habits4.txt'), bufname(qf[6].bufnr)) + call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr)) call assert_equal(3, qf[6].lnum) call assert_equal('habits1.txt', bufname(qf[9].bufnr)) call assert_equal(4, qf[9].lnum) - call assert_equal(expand('dir2/habits5.txt'), bufname(qf[11].bufnr)) + call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr)) call assert_equal(5, qf[11].lnum) let &efm=save_efm @@ -1300,7 +1300,7 @@ func Test_efm2() call assert_equal(8, len(l)) call assert_equal(89, l[4].lnum) call assert_equal(1, l[4].valid) - call assert_equal(expand('unittests/dbfacadeTest.py'), bufname(l[4].bufnr)) + call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr)) call assert_equal('W', l[4].type) " Test for %o @@ -2074,11 +2074,11 @@ func Test_two_windows() laddexpr 'one.txt:3:one one one' let loc_one = getloclist(one_id) - call assert_equal(expand('Xone/a/one.txt'), bufname(loc_one[1].bufnr)) + call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr)) call assert_equal(3, loc_one[1].lnum) let loc_two = getloclist(two_id) - call assert_equal(expand('Xtwo/a/two.txt'), bufname(loc_two[1].bufnr)) + call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr)) call assert_equal(5, loc_two[1].lnum) call win_gotoid(one_id) diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim index ce21b8bdc9..215d4387d6 100644 --- a/src/nvim/testdir/test_spell.vim +++ b/src/nvim/testdir/test_spell.vim @@ -72,6 +72,16 @@ func Test_z_equal_on_invalid_utf8_word() bwipe! endfunc +func Test_z_equal_on_single_character() + " this was decrementing the index below zero + new + norm a0\Ê + norm zW + norm z= + + bwipe! +endfunc + " Test spellbadword() with argument func Test_spellbadword() set spell diff --git a/src/nvim/testdir/test_spell_utf8.vim b/src/nvim/testdir/test_spell_utf8.vim index 1d323df67e..3c07e0782b 100644 --- a/src/nvim/testdir/test_spell_utf8.vim +++ b/src/nvim/testdir/test_spell_utf8.vim @@ -576,7 +576,6 @@ endfunc "Compound words func Test_spell_compound() - throw 'skipped: TODO: ' call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3) call RunGoodBad("foo m\u00EF foobar foofoobar barfoo barbarfoo", \ "bad: bar la foom\u00EF barm\u00EF m\u00EFfoo m\u00EFbar m\u00EFm\u00EF lala m\u00EFla lam\u00EF foola labar", @@ -624,14 +623,14 @@ endfunc " Test affix flags with two characters func Test_spell_affix() - throw 'skipped: TODO: ' + CheckNotMSWindows " FIXME: Why does this fail with MSVC? call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5) call RunGoodBad("fooa1 fooa\u00E9 bar prebar barbork prebarbork startprebar start end startend startmiddleend nouend", \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend", \ ["bar", "barbork", "end", "fooa1", "fooa\u00E9", "nouend", "prebar", "prebarbork", "start"], \ [ \ ["bad", ["bar", "end", "fooa1"]], - \ ["foo", ["fooa1", "fooa\u00E9", "bar"]], + \ ["foo", ["fooa1", "bar", "end"]], \ ["fooa2", ["fooa1", "fooa\u00E9", "bar"]], \ ["prabar", ["prebar", "bar", "bar bar"]], \ ["probarbirk", ["prebarbork"]], @@ -649,7 +648,7 @@ func Test_spell_affix() \ ["bar", "barbork", "end", "lead", "meea1", "meea\u00E9", "prebar", "prebarbork"], \ [ \ ["bad", ["bar", "end", "lead"]], - \ ["mee", ["meea1", "meea\u00E9", "bar"]], + \ ["mee", ["meea1", "bar", "end"]], \ ["meea2", ["meea1", "meea\u00E9", "lead"]], \ ["prabar", ["prebar", "bar", "leadbar"]], \ ["probarbirk", ["prebarbork"]], @@ -666,7 +665,7 @@ func Test_spell_affix() \ ["bar", "barmeat", "lead", "meea1", "meea\u00E9", "meezero", "prebar", "prebarmeat", "tail"], \ [ \ ["bad", ["bar", "lead", "tail"]], - \ ["mee", ["meea1", "meea\u00E9", "bar"]], + \ ["mee", ["meea1", "bar", "lead"]], \ ["meea2", ["meea1", "meea\u00E9", "lead"]], \ ["prabar", ["prebar", "bar", "leadbar"]], \ ["probarmaat", ["prebarmeat"]], @@ -700,7 +699,6 @@ endfunc " Affix flags func Test_spell_affix_flags() - throw 'skipped: TODO: ' call LoadAffAndDic(g:test_data_aff10, g:test_data_dic10) call RunGoodBad("drink drinkable drinkables drinktable drinkabletable", \ "bad: drinks drinkstable drinkablestable", @@ -761,11 +759,30 @@ func Test_spell_sal_and_addition() set spl=Xtest_ca.utf-8.spl call assert_equal("elequint", FirstSpellWord()) call assert_equal("elekwint", SecondSpellWord()) + + set spellfile= + set spl& endfunc func Test_spellfile_value() set spellfile=Xdir/Xtest.utf-8.add set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add + set spellfile= +endfunc + +func Test_no_crash_with_weird_text() + new + let lines =<< trim END + r<sfile> + € + + + € + END + call setline(1, lines) + exe "%norm \<C-v>ez=>\<C-v>wzG" + + bwipe! endfunc " Invalid bytes may cause trouble when creating the word list. @@ -773,5 +790,18 @@ func Test_check_for_valid_word() call assert_fails("spellgood! 0\xac", 'E1280:') endfunc +" This was going over the end of the word +func Test_word_index() + new + norm R0 + spellgood! fl0 + sil norm z= + + bwipe! + " clear the word list + set enc=utf-8 + call delete('Xtmpfile') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 684a9cf99e..078cb6a210 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -1468,8 +1468,7 @@ void u_read_undo(char *name, const char_u *hash, const char_u *orig_name FUNC_AT if (name == NULL) { verbose_enter(); } - give_warning((char_u *) - _("File contents changed, cannot use undo info"), true); + give_warning(_("File contents changed, cannot use undo info"), true); if (name == NULL) { verbose_leave(); } diff --git a/src/nvim/version.c b/src/nvim/version.c index 1c8fdce1eb..a70778fdd9 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -2020,7 +2020,7 @@ void ex_version(exarg_T *eap) /// @param wrap static void version_msg_wrap(char *s, int wrap) { - int len = vim_strsize((char_u *)s) + (wrap ? 2 : 0); + int len = vim_strsize(s) + (wrap ? 2 : 0); if (!got_int && (len < Columns) @@ -2071,7 +2071,7 @@ void list_in_columns(char_u **items, int size, int current) // Find the length of the longest item, use that + 1 as the column width. int i; for (i = 0; size < 0 ? items[i] != NULL : i < size; i++) { - int l = vim_strsize(items[i]) + (i == current ? 2 : 0); + int l = vim_strsize((char *)items[i]) + (i == current ? 2 : 0); if (l > width) { width = l; @@ -2294,7 +2294,7 @@ static void do_intro_line(long row, char_u *mesg, int attr) int clen; // Center the message horizontally. - col = vim_strsize(mesg); + col = vim_strsize((char *)mesg); col = (Columns - col) / 2; @@ -2309,7 +2309,7 @@ static void do_intro_line(long row, char_u *mesg, int attr) for (l = 0; p[l] != NUL && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); l++) { - clen += ptr2cells(p + l); + clen += ptr2cells((char *)p + l); l += utfc_ptr2len((char *)p + l) - 1; } assert(row <= INT_MAX && col <= INT_MAX); |