diff options
Diffstat (limited to 'src/nvim')
128 files changed, 7755 insertions, 5128 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index e6f70033d0..38be5bfb1d 100755 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -185,30 +185,24 @@ if(NOT MSVC) set_source_files_properties( ${EXTERNAL_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion -Wno-missing-noreturn -Wno-missing-format-attribute -Wno-double-promotion") - # gperf generates ANSI-C with incorrect linkage, ignore it. - check_c_compiler_flag(-Wstatic-in-inline HAS_WSTATIC_IN_INLINE) - if(HAS_WSTATIC_IN_INLINE) - set_source_files_properties( - eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-static-in-inline -Wno-conversion") - else() - set_source_files_properties( - eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") - endif() + set_source_files_properties( + eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") endif() if(NOT "${MIN_LOG_LEVEL}" MATCHES "^$") add_definitions(-DMIN_LOG_LEVEL=${MIN_LOG_LEVEL}) endif() +if(DEBUG OR CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) + add_definitions(-DEXITFREE) +endif() + get_directory_property(gen_cdefs COMPILE_DEFINITIONS) foreach(gen_cdef ${gen_cdefs} DO_NOT_DEFINE_EMPTY_ATTRIBUTES) if(NOT ${gen_cdef} MATCHES "INCLUDE_GENERATED_DECLARATIONS") list(APPEND gen_cflags "-D${gen_cdef}") endif() endforeach() -if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) - list(APPEND gen_cflags "-DEXITFREE") -endif() get_directory_property(gen_includes INCLUDE_DIRECTORIES) foreach(gen_include ${gen_includes} ${LUA_PREFERRED_INCLUDE_DIRS}) @@ -408,14 +402,9 @@ add_custom_command(OUTPUT ${GENERATED_EX_CMDS_ENUM} ${GENERATED_EX_CMDS_DEFS} DEPENDS ${EX_CMDS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/ex_cmds.lua ) -if(NOT GPERF_PRG) - message(FATAL_ERROR "gperf was not found.") -endif() add_custom_command(OUTPUT ${GENERATED_FUNCS} ${FUNCS_DATA} COMMAND ${LUA_PRG} ${FUNCS_GENERATOR} - ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA} - COMMAND ${GPERF_PRG} - ${GENERATED_DIR}/funcs.generated.h.gperf --output-file=${GENERATED_FUNCS} + ${CMAKE_CURRENT_LIST_DIR} ${LUA_SHARED_MODULE_SOURCE} ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA} DEPENDS ${FUNCS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/eval.lua ${API_METADATA} ) list(APPEND NVIM_GENERATED_FOR_SOURCES @@ -701,17 +690,14 @@ if(CLANG_ASAN_UBSAN) set(SANITIZE_RECOVER -fno-sanitize-recover) # Clang 3.5- endif() endif() - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS ${SANITIZE_RECOVER} -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address -fsanitize=undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/src/.asan-blacklist) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=address -fsanitize=undefined ") elseif(CLANG_MSAN) message(STATUS "Enabling Clang memory sanitizer for nvim.") - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fno-optimize-sibling-calls) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins ") elseif(CLANG_TSAN) message(STATUS "Enabling Clang thread sanitizer for nvim.") - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fsanitize=thread) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fPIE) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=thread ") diff --git a/src/nvim/README.md b/src/nvim/README.md index c7cb233c73..9417629691 100644 --- a/src/nvim/README.md +++ b/src/nvim/README.md @@ -38,7 +38,7 @@ alternate file (e.g. stderr) use `LOG_CALLSTACK_TO_FILE(FILE*)`. Requires Many log messages have a shared prefix, such as "UI" or "RPC". Use the shell to filter the log, e.g. at DEBUG level you might want to exclude UI messages: - tail -F ~/.cache/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log + tail -F ~/.local/state/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log Build with ASAN --------------- diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c index 76e531e7aa..30a5d60c39 100644 --- a/src/nvim/api/autocmd.c +++ b/src/nvim/api/autocmd.c @@ -405,6 +405,7 @@ cleanup: /// - match: (string) the expanded value of |<amatch>| /// - buf: (number) the expanded value of |<abuf>| /// - file: (string) the expanded value of |<afile>| +/// - data: (any) arbitrary data passed to |nvim_exec_autocmds()| /// - command (string) optional: Vim command to execute on event. Cannot be used with /// {callback} /// - once (boolean) optional: defaults to false. Run the autocommand @@ -749,6 +750,8 @@ void nvim_del_augroup_by_name(String name, Error *err) /// {pattern}. /// - modeline (bool) optional: defaults to true. Process the /// modeline after the autocommands |<nomodeline>|. +/// - data (any): arbitrary data to send to the autocommand callback. See +/// |nvim_create_autocmd()| for details. /// @see |:doautocmd| void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) FUNC_API_SINCE(9) @@ -760,6 +763,7 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) bool set_buf = false; char *pattern = NULL; + Object *data = NULL; bool set_pattern = false; Array event_array = ARRAY_DICT_INIT; @@ -818,6 +822,10 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) set_pattern = true; } + if (opts->data.type != kObjectTypeNil) { + data = &opts->data; + } + modeline = api_object_to_bool(opts->modeline, "modeline", true, err); if (set_pattern && set_buf) { @@ -829,7 +837,7 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) 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); + did_aucmd |= apply_autocmds_group(event_nr, pattern, NULL, true, au_group, buf, NULL, data); }) if (did_aucmd && modeline) { diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 45dadae1dd..9842975d62 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -262,7 +262,7 @@ void nvim__buf_redraw_range(Buffer buffer, Integer first, Integer last, Error *e /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start First line index -/// @param end Last line index (exclusive) +/// @param end Last line index, exclusive /// @param strict_indexing Whether out-of-bounds should be an error. /// @param[out] err Error details, if any /// @return Array of lines, or empty array for unloaded buffer. @@ -358,7 +358,7 @@ static bool check_string_array(Array arr, bool disallow_nl, Error *err) /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start First line index -/// @param end Last line index (exclusive) +/// @param end Last line index, exclusive /// @param strict_indexing Whether out-of-bounds should be an error. /// @param replacement Array of lines to use as replacement /// @param[out] err Error details, if any @@ -514,24 +514,25 @@ end: /// Sets (replaces) a range in the buffer /// -/// This is recommended over nvim_buf_set_lines when only modifying parts of a -/// line, as extmarks will be preserved on non-modified parts of the touched +/// This is recommended over |nvim_buf_set_lines()| when only modifying parts of +/// a line, as extmarks will be preserved on non-modified parts of the touched /// lines. /// -/// Indexing is zero-based and end-exclusive. +/// Indexing is zero-based. Row indices are end-inclusive, and column indices +/// are end-exclusive. /// -/// To insert text at a given index, set `start` and `end` ranges to the same -/// index. To delete a range, set `replacement` to an array containing -/// an empty string, or simply an empty array. +/// To insert text at a given `(row, column)` location, use `start_row = end_row +/// = row` and `start_col = end_col = col`. To delete the text in a range, use +/// `replacement = {}`. /// -/// Prefer nvim_buf_set_lines when adding or deleting entire lines only. +/// Prefer |nvim_buf_set_lines()| if you are only adding or deleting entire lines. /// /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start_row First line index -/// @param start_col First column -/// @param end_row Last line index -/// @param end_col Last column +/// @param start_col Starting column (byte offset) on first line +/// @param end_row Last line index, inclusive +/// @param end_col Ending column (byte offset) on last line, exclusive /// @param replacement Array of lines to use as replacement /// @param[out] err Error details, if any void nvim_buf_set_text(uint64_t channel_id, Buffer buffer, Integer start_row, Integer start_col, @@ -760,16 +761,17 @@ end: /// This differs from |nvim_buf_get_lines()| in that it allows retrieving only /// portions of a line. /// -/// Indexing is zero-based. Column indices are end-exclusive. +/// Indexing is zero-based. Row indices are end-inclusive, and column indices +/// are end-exclusive. /// /// Prefer |nvim_buf_get_lines()| when retrieving entire lines. /// /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start_row First line index -/// @param start_col Starting byte offset of first line -/// @param end_row Last line index -/// @param end_col Ending byte offset of last line (exclusive) +/// @param start_col Starting column (byte offset) on first line +/// @param end_row Last line index, inclusive +/// @param end_col Ending column (byte offset) on last line, exclusive /// @param opts Optional parameters. Currently unused. /// @param[out] err Error details, if any /// @return Array of lines, or empty array for unloaded buffer. diff --git a/src/nvim/api/keysets.lua b/src/nvim/api/keysets.lua index 5baffaf505..6924e2ef8f 100644 --- a/src/nvim/api/keysets.lua +++ b/src/nvim/api/keysets.lua @@ -80,6 +80,7 @@ return { "maxwidth"; "fillchar"; "highlights"; + "use_winbar"; "use_tabline"; }; option = { @@ -145,6 +146,7 @@ return { "group"; "modeline"; "pattern"; + "data"; }; get_autocmds = { "event"; @@ -155,5 +157,44 @@ return { create_augroup = { "clear"; }; + cmd = { + "cmd"; + "range"; + "count"; + "reg"; + "bang"; + "args"; + "magic"; + "mods"; + "nargs"; + "addr"; + "nextcmd"; + }; + cmd_magic = { + "file"; + "bar"; + }; + cmd_mods = { + "silent"; + "emsg_silent"; + "sandbox"; + "noautocmd"; + "browse"; + "confirm"; + "hide"; + "keepalt"; + "keepjumps"; + "keepmarks"; + "keeppatterns"; + "lockmarks"; + "noswapfile"; + "tab"; + "verbose"; + "vertical"; + "split"; + }; + cmd_opts = { + "output"; + }; } diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index a2ee4f91bc..7bd68f277b 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -19,6 +19,7 @@ #include "nvim/decoration.h" #include "nvim/eval.h" #include "nvim/eval/typval.h" +#include "nvim/ex_cmds_defs.h" #include "nvim/extmark.h" #include "nvim/fileio.h" #include "nvim/getchar.h" @@ -657,8 +658,7 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod mode_val = get_map_mode(&p, true); // mapmode-ic } else { mode_val = get_map_mode(&p, false); - if ((mode_val == VISUAL + SELECTMODE + NORMAL + OP_PENDING) - && mode.size > 0) { + if (mode_val == (MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING) && mode.size > 0) { // get_map_mode() treats unrecognized mode shortnames as ":map". // This is an error unless the given shortname was empty string "". api_set_error(err, kErrorTypeValidation, "Invalid mode shortname: \"%s\"", p); @@ -1418,14 +1418,14 @@ bool set_mark(buf_T *buf, String name, Integer line, Integer col, Error *err) } /// Get default statusline highlight for window -const char *get_default_stl_hl(win_T *wp) +const char *get_default_stl_hl(win_T *wp, bool use_winbar) { if (wp == NULL) { return "TabLineFill"; - } else if (wp == curwin) { - return "StatusLine"; + } else if (use_winbar) { + return (wp == curwin) ? "WinBar" : "WinBarNC"; } else { - return "StatusLineNC"; + return (wp == curwin) ? "StatusLine" : "StatusLineNC"; } } @@ -1691,3 +1691,136 @@ int init_sign_text(char **sign_text, char *text) return OK; } + +/// Check if a string contains only whitespace characters. +bool string_iswhite(String str) +{ + for (size_t i = 0; i < str.size; i++) { + if (!ascii_iswhite(str.data[i])) { + // Found a non-whitespace character + return false; + } else if (str.data[i] == NUL) { + // Terminate at first occurence of a NUL character + break; + } + } + return true; +} + +/// Build cmdline string for command, used by `nvim_cmd()`. +/// +/// @return OK or FAIL. +void build_cmdline_str(char **cmdlinep, exarg_T *eap, CmdParseInfo *cmdinfo, char **args, + size_t argc) +{ + StringBuilder cmdline = KV_INITIAL_VALUE; + + // Add command modifiers + if (cmdinfo->cmdmod.tab != 0) { + kv_printf(cmdline, "%dtab ", cmdinfo->cmdmod.tab - 1); + } + if (cmdinfo->verbose != -1) { + kv_printf(cmdline, "%ldverbose ", cmdinfo->verbose); + } + + if (cmdinfo->emsg_silent) { + kv_concat(cmdline, "silent! "); + } else if (cmdinfo->silent) { + kv_concat(cmdline, "silent "); + } + + switch (cmdinfo->cmdmod.split & (WSP_ABOVE | WSP_BELOW | WSP_TOP | WSP_BOT)) { + case WSP_ABOVE: + kv_concat(cmdline, "aboveleft "); + break; + case WSP_BELOW: + kv_concat(cmdline, "belowright "); + break; + case WSP_TOP: + kv_concat(cmdline, "topleft "); + break; + case WSP_BOT: + kv_concat(cmdline, "botright "); + break; + default: + break; + } + +#define CMDLINE_APPEND_IF(cond, str) \ + do { \ + if (cond) { \ + kv_concat(cmdline, str); \ + } \ + } while (0) + + CMDLINE_APPEND_IF(cmdinfo->cmdmod.split & WSP_VERT, "vertical "); + CMDLINE_APPEND_IF(cmdinfo->sandbox, "sandbox "); + CMDLINE_APPEND_IF(cmdinfo->noautocmd, "noautocmd "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.browse, "browse "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.confirm, "confirm "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.hide, "hide "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepalt, "keepalt "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepjumps, "keepjumps "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepmarks, "keepmarks "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keeppatterns, "keeppatterns "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.lockmarks, "lockmarks "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.noswapfile, "noswapfile "); +#undef CMDLINE_APPEND_IF + + // Command range / count. + if (eap->argt & EX_RANGE) { + if (eap->addr_count == 1) { + kv_printf(cmdline, "%ld", eap->line2); + } else if (eap->addr_count > 1) { + kv_printf(cmdline, "%ld,%ld", eap->line1, eap->line2); + eap->addr_count = 2; // Make sure address count is not greater than 2 + } + } + + // Keep the index of the position where command name starts, so eap->cmd can point to it. + size_t cmdname_idx = cmdline.size; + kv_printf(cmdline, "%s", eap->cmd); + + // Command bang. + if (eap->argt & EX_BANG && eap->forceit) { + kv_printf(cmdline, "!"); + } + + // Command register. + if (eap->argt & EX_REGSTR && eap->regname) { + kv_printf(cmdline, " %c", eap->regname); + } + + // Iterate through each argument and store the starting index and length of each argument + size_t *argidx = xcalloc(argc, sizeof(size_t)); + eap->argc = argc; + eap->arglens = xcalloc(argc, sizeof(size_t)); + for (size_t i = 0; i < argc; i++) { + argidx[i] = cmdline.size + 1; // add 1 to account for the space. + eap->arglens[i] = STRLEN(args[i]); + kv_printf(cmdline, " %s", args[i]); + } + + // Now that all the arguments are appended, use the command index and argument indices to set the + // values of eap->cmd, eap->arg and eap->args. + eap->cmd = cmdline.items + cmdname_idx; + eap->args = xcalloc(argc, sizeof(char *)); + for (size_t i = 0; i < argc; i++) { + eap->args[i] = cmdline.items + argidx[i]; + } + // If there isn't an argument, make eap->arg point to end of cmdline. + eap->arg = argc > 0 ? eap->args[0] : cmdline.items + cmdline.size; + + // Finally, make cmdlinep point to the cmdline string. + *cmdlinep = cmdline.items; + xfree(argidx); + + // Replace, :make and :grep with 'makeprg' and 'grepprg'. + char *p = replace_makeprg(eap, eap->arg, cmdlinep); + if (p != eap->arg) { + // If replace_makeprg modified the cmdline string, correct the argument pointers. + assert(argc == 1); + eap->arg = p; + eap->args[0] = p; + } +} diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index b4d20ed975..52f76f4650 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -349,7 +349,11 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width, I return; } - ui_grid_resize((handle_T)grid, (int)width, (int)height, err); + if (grid == DEFAULT_GRID_HANDLE) { + nvim_ui_try_resize(channel_id, width, height, err); + } else { + ui_grid_resize((handle_T)grid, (int)width, (int)height, err); + } } /// Tells Nvim the number of elements displaying in the popumenu, to decide diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 5e7e51762a..15992a98be 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -126,22 +126,43 @@ Dictionary nvim__get_hl_defs(Integer ns_id, Error *err) /// Sets a highlight group. /// -/// Note: Unlike the `:highlight` command which can update a highlight group, -/// this function completely replaces the definition. For example: -/// ``nvim_set_hl(0, 'Visual', {})`` will clear the highlight group 'Visual'. +/// @note Unlike the `:highlight` command which can update a highlight group, +/// this function completely replaces the definition. For example: +/// ``nvim_set_hl(0, 'Visual', {})`` will clear the highlight group +/// 'Visual'. +/// +/// @note The fg and bg keys also accept the string values `"fg"` or `"bg"` +/// which act as aliases to the corresponding foreground and background +/// values of the Normal group. If the Normal group has not been defined, +/// using these values results in an error. /// /// @param ns_id Namespace id for this highlight |nvim_create_namespace()|. /// Use 0 to set a highlight group globally |:highlight|. /// @param name Highlight group name, e.g. "ErrorMsg" -/// @param val Highlight definition map, like |synIDattr()|. In -/// addition, the following keys are recognized: +/// @param val Highlight definition map, accepts the following keys: +/// - fg (or foreground): color name or "#RRGGBB", see note. +/// - bg (or background): color name or "#RRGGBB", see note. +/// - sp (or special): color name or "#RRGGBB" +/// - blend: integer between 0 and 100 +/// - bold: boolean +/// - standout: boolean +/// - underline: boolean +/// - underlineline: boolean +/// - undercurl: boolean +/// - underdot: boolean +/// - underdash: boolean +/// - strikethrough: boolean +/// - italic: boolean +/// - reverse: boolean +/// - nocombine: boolean +/// - link: name of another highlight group to link to, see |:hi-link|. +/// Additionally, the following keys are recognized: /// - default: Don't override existing definition |:hi-default| /// - ctermfg: Sets foreground of cterm color |highlight-ctermfg| /// - ctermbg: Sets background of cterm color |highlight-ctermbg| -/// - cterm: cterm attribute map, like -/// |highlight-args|. -/// Note: Attributes default to those set for `gui` -/// if not set. +/// - cterm: cterm attribute map, like |highlight-args|. If not set, +/// cterm attributes will match those from the attribute map +/// documented above. /// @param[out] err Error details, if any /// // TODO(bfredl): val should take update vs reset flag @@ -1327,14 +1348,14 @@ Boolean nvim_paste(String data, Boolean crlf, Integer phase, Error *err) draining = true; goto theend; } - if (!(State & (CMDLINE | INSERT)) && (phase == -1 || phase == 1)) { + if (!(State & (MODE_CMDLINE | MODE_INSERT)) && (phase == -1 || phase == 1)) { ResetRedobuff(); AppendCharToRedobuff('a'); // Dot-repeat. } // vim.paste() decides if client should cancel. Errors do NOT cancel: we // want to drain remaining chunks (rather than divert them to main input). cancel = (rv.type == kObjectTypeBoolean && !rv.data.boolean); - if (!cancel && !(State & CMDLINE)) { // Dot-repeat. + if (!cancel && !(State & MODE_CMDLINE)) { // Dot-repeat. for (size_t i = 0; i < lines.size; i++) { String s = lines.items[i].data.string; assert(s.size <= INT_MAX); @@ -1345,7 +1366,7 @@ Boolean nvim_paste(String data, Boolean crlf, Integer phase, Error *err) } } } - if (!(State & (CMDLINE | INSERT)) && (phase == -1 || phase == 3)) { + if (!(State & (MODE_CMDLINE | MODE_INSERT)) && (phase == -1 || phase == 3)) { AppendCharToRedobuff(ESC); // Dot-repeat. } theend: @@ -1601,12 +1622,13 @@ ArrayOf(Dictionary) nvim_get_keymap(uint64_t channel_id, String mode) /// or "!" for |:map!|, or empty string for |:map|. /// @param lhs Left-hand-side |{lhs}| of the mapping. /// @param rhs Right-hand-side |{rhs}| of the mapping. -/// @param opts Optional parameters map. Accepts all |:map-arguments| -/// as keys excluding |<buffer>| but including |noremap| and "desc". -/// "desc" can be used to give a description to keymap. -/// When called from Lua, also accepts a "callback" key that takes -/// a Lua function to call when the mapping is executed. -/// Values are Booleans. Unknown key is an error. +/// @param opts Optional parameters map: keys are |:map-arguments|, values +/// are booleans (default false). Accepts all |:map-arguments| as +/// keys excluding |<buffer>| but including |noremap| and "desc". +/// Unknown key is an error. "desc" can be used to give a +/// description to the mapping. When called from Lua, also accepts a +/// "callback" key that takes a Lua function to call when the +/// mapping is executed. /// @param[out] err Error details, if any. void nvim_set_keymap(uint64_t channel_id, String mode, String lhs, String rhs, Dict(keymap) *opts, Error *err) @@ -2118,8 +2140,8 @@ Array nvim__inspect_cell(Integer grid, Integer row, Integer col, Error *err) } } - if (row < 0 || row >= g->Rows - || col < 0 || col >= g->Columns) { + if (row < 0 || row >= g->rows + || col < 0 || col >= g->cols) { return ret; } size_t off = g->line_offset[(size_t)row] + (size_t)col; @@ -2252,8 +2274,9 @@ Array nvim_get_mark(String name, Dictionary opts, Error *err) /// - fillchar: (string) Character to fill blank spaces in the statusline (see /// 'fillchars'). Treated as single-width even if it isn't. /// - highlights: (boolean) Return highlight information. +/// - use_winbar: (boolean) Evaluate winbar instead of statusline. /// - use_tabline: (boolean) Evaluate tabline instead of statusline. When |TRUE|, {winid} -/// is ignored. +/// is ignored. Mutually exclusive with {use_winbar}. /// /// @param[out] err Error details, if any. /// @return Dictionary containing statusline information, with these keys: @@ -2272,9 +2295,18 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * int maxwidth; int fillchar = 0; Window window = 0; + bool use_winbar = false; bool use_tabline = false; bool highlights = false; + if (str.size < 2 || memcmp(str.data, "%!", 2)) { + const char *const errmsg = check_stl_option((char_u *)str.data); + if (errmsg) { + api_set_error(err, kErrorTypeValidation, "%s", errmsg); + return result; + } + } + if (HAS_KEY(opts->winid)) { if (opts->winid.type != kObjectTypeInteger) { api_set_error(err, kErrorTypeValidation, "winid must be an integer"); @@ -2283,7 +2315,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * window = (Window)opts->winid.data.integer; } - if (HAS_KEY(opts->fillchar)) { if (opts->fillchar.type != kObjectTypeString || opts->fillchar.data.string.size == 0 || ((size_t)utf_ptr2len(opts->fillchar.data.string.data) @@ -2293,7 +2324,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * } fillchar = utf_ptr2char(opts->fillchar.data.string.data); } - if (HAS_KEY(opts->highlights)) { highlights = api_object_to_bool(opts->highlights, "highlights", false, err); @@ -2301,7 +2331,13 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * return result; } } + if (HAS_KEY(opts->use_winbar)) { + use_winbar = api_object_to_bool(opts->use_winbar, "use_winbar", false, err); + if (ERROR_SET(err)) { + return result; + } + } if (HAS_KEY(opts->use_tabline)) { use_tabline = api_object_to_bool(opts->use_tabline, "use_tabline", false, err); @@ -2309,6 +2345,10 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * return result; } } + if (use_winbar && use_tabline) { + api_set_error(err, kErrorTypeValidation, "use_winbar and use_tabline are mutually exclusive"); + return result; + } win_T *wp, *ewp; @@ -2318,7 +2358,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * fillchar = ' '; } else { wp = find_window_by_handle(window, err); - if (wp == NULL) { api_set_error(err, kErrorTypeException, "unknown winid %d", window); return result; @@ -2326,8 +2365,12 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * ewp = wp; if (fillchar == 0) { - int attr; - fillchar = fillchar_status(&attr, wp); + if (use_winbar) { + fillchar = wp->w_p_fcs_chars.wbr; + } else { + int attr; + fillchar = fillchar_status(&attr, wp); + } } } @@ -2339,7 +2382,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * maxwidth = (int)opts->maxwidth.data.integer; } else { - maxwidth = (use_tabline || global_stl_height() > 0) ? Columns : wp->w_width; + maxwidth = (use_tabline || (!use_winbar && global_stl_height() > 0)) ? Columns : wp->w_width; } char buf[MAXPATHL]; @@ -2374,7 +2417,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * // add the default highlight at the beginning of the highlight list if (hltab->start == NULL || ((char *)hltab->start - buf) != 0) { Dictionary hl_info = ARRAY_DICT_INIT; - grpname = get_default_stl_hl(wp); + grpname = get_default_stl_hl(wp, use_winbar); PUT(hl_info, "start", INTEGER_OBJ(0)); PUT(hl_info, "group", CSTR_TO_OBJ(grpname)); @@ -2388,22 +2431,18 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * PUT(hl_info, "start", INTEGER_OBJ((char *)sp->start - buf)); if (sp->userhl == 0) { - grpname = get_default_stl_hl(wp); + grpname = get_default_stl_hl(wp, use_winbar); } else if (sp->userhl < 0) { grpname = (char *)syn_id2name(-sp->userhl); } else { snprintf(user_group, sizeof(user_group), "User%d", sp->userhl); grpname = user_group; } - PUT(hl_info, "group", CSTR_TO_OBJ(grpname)); - ADD(hl_values, DICTIONARY_OBJ(hl_info)); } - PUT(result, "highlights", ARRAY_OBJ(hl_values)); } - PUT(result, "str", CSTR_TO_OBJ((char *)buf)); return result; diff --git a/src/nvim/api/vimscript.c b/src/nvim/api/vimscript.c index c4a301839f..b8f7b33cd5 100644 --- a/src/nvim/api/vimscript.c +++ b/src/nvim/api/vimscript.c @@ -10,10 +10,14 @@ #include "nvim/api/private/helpers.h" #include "nvim/api/vimscript.h" #include "nvim/ascii.h" +#include "nvim/autocmd.h" #include "nvim/eval.h" #include "nvim/eval/typval.h" #include "nvim/eval/userfunc.h" #include "nvim/ex_cmds2.h" +#include "nvim/ops.h" +#include "nvim/strings.h" +#include "nvim/vim.h" #include "nvim/viml/parser/expressions.h" #include "nvim/viml/parser/parser.h" #include "nvim/window.h" @@ -22,16 +26,19 @@ # include "api/vimscript.c.generated.h" #endif -/// Executes Vimscript (multiline block of Ex-commands), like anonymous +#define IS_USER_CMDIDX(idx) ((int)(idx) < 0) + +/// Executes Vimscript (multiline block of Ex commands), like anonymous /// |:source|. /// /// Unlike |nvim_command()| this function supports heredocs, script-scope (s:), /// etc. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @see |execute()| /// @see |nvim_command()| +/// @see |nvim_cmd()| /// /// @param src Vimscript code /// @param output Capture and return all (non-error, non-shell |:!|) output @@ -89,13 +96,16 @@ theend: return (String)STRING_INIT; } -/// Executes an ex-command. +/// Executes an Ex command. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// -/// @see |nvim_exec()| +/// Prefer using |nvim_cmd()| or |nvim_exec()| over this. To evaluate multiple lines of Vim script +/// or an Ex command directly, use |nvim_exec()|. To construct an Ex command using a structured +/// format and then execute it, use |nvim_cmd()|. To modify an Ex command before evaluating it, use +/// |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. /// -/// @param command Ex-command string +/// @param command Ex command string /// @param[out] err Error details (Vim error), if any void nvim_command(String command, Error *err) FUNC_API_SINCE(1) @@ -108,7 +118,7 @@ void nvim_command(String command, Error *err) /// Evaluates a VimL |expression|. /// Dictionaries and Lists are recursively expanded. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param expr VimL expression string /// @param[out] err Error details, if any @@ -216,7 +226,7 @@ free_vim_args: /// Calls a VimL function with the given arguments. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param fn Function to call /// @param args Function arguments packed in an Array @@ -230,7 +240,7 @@ Object nvim_call_function(String fn, Array args, Error *err) /// Calls a VimL |Dictionary-function| with the given arguments. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param dict Dictionary, or String evaluating to a VimL |self| dict /// @param fn Name of the function defined on the VimL dict @@ -978,3 +988,370 @@ end: xfree(cmdline); return result; } + +/// Executes an Ex command. +/// +/// Unlike |nvim_command()| this command takes a structured Dictionary instead of a String. This +/// allows for easier construction and manipulation of an Ex command. This also allows for things +/// such as having spaces inside a command argument, expanding filenames in a command that otherwise +/// doesn't expand filenames, etc. +/// +/// On execution error: fails with VimL error, updates v:errmsg. +/// +/// @see |nvim_exec()| +/// @see |nvim_command()| +/// +/// @param cmd Command to execute. Must be a Dictionary that can contain the same values as +/// the return value of |nvim_parse_cmd()| except "addr", "nargs" and "nextcmd" +/// which are ignored if provided. All values except for "cmd" are optional. +/// @param opts Optional parameters. +/// - output: (boolean, default false) Whether to return command output. +/// @param[out] err Error details, if any. +/// @return Command output (non-error, non-shell |:!|) if `output` is true, else empty string. +String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Error *err) + FUNC_API_SINCE(10) +{ + exarg_T ea; + memset(&ea, 0, sizeof(ea)); + ea.verbose_save = -1; + ea.save_msg_silent = -1; + + CmdParseInfo cmdinfo; + memset(&cmdinfo, 0, sizeof(cmdinfo)); + cmdinfo.verbose = -1; + + char *cmdline = NULL; + char *cmdname = NULL; + char **args = NULL; + size_t argc = 0; + + String retv = (String)STRING_INIT; + +#define OBJ_TO_BOOL(var, value, default, varname) \ + do { \ + var = api_object_to_bool(value, varname, default, err); \ + if (ERROR_SET(err)) { \ + goto end; \ + } \ + } while (0) + +#define VALIDATION_ERROR(...) \ + do { \ + api_set_error(err, kErrorTypeValidation, __VA_ARGS__); \ + goto end; \ + } while (0) + + bool output; + OBJ_TO_BOOL(output, opts->output, false, "'output'"); + + // First, parse the command name and check if it exists and is valid. + if (!HAS_KEY(cmd->cmd) || cmd->cmd.type != kObjectTypeString + || cmd->cmd.data.string.data[0] == NUL) { + VALIDATION_ERROR("'cmd' must be a non-empty String"); + } + + cmdname = string_to_cstr(cmd->cmd.data.string); + ea.cmd = cmdname; + + char *p = find_ex_command(&ea, NULL); + + // If this looks like an undefined user command and there are CmdUndefined + // autocommands defined, trigger the matching autocommands. + if (p != NULL && ea.cmdidx == CMD_SIZE && ASCII_ISUPPER(*ea.cmd) + && has_event(EVENT_CMDUNDEFINED)) { + p = xstrdup(cmdname); + int ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, true, NULL); + xfree(p); + // If the autocommands did something and didn't cause an error, try + // finding the command again. + p = (ret && !aborting()) ? find_ex_command(&ea, NULL) : ea.cmd; + } + + if (p == NULL || ea.cmdidx == CMD_SIZE) { + VALIDATION_ERROR("Command not found: %s", cmdname); + } + if (is_cmd_ni(ea.cmdidx)) { + VALIDATION_ERROR("Command not implemented: %s", cmdname); + } + + // Get the command flags so that we can know what type of arguments the command uses. + // Not required for a user command since `find_ex_command` already deals with it in that case. + if (!IS_USER_CMDIDX(ea.cmdidx)) { + ea.argt = get_cmd_argt(ea.cmdidx); + } + + // Parse command arguments since it's needed to get the command address type. + if (HAS_KEY(cmd->args)) { + if (cmd->args.type != kObjectTypeArray) { + VALIDATION_ERROR("'args' must be an Array"); + } + // Check if every argument is valid + for (size_t i = 0; i < cmd->args.data.array.size; i++) { + Object elem = cmd->args.data.array.items[i]; + if (elem.type != kObjectTypeString) { + VALIDATION_ERROR("Command argument must be a String"); + } else if (string_iswhite(elem.data.string)) { + VALIDATION_ERROR("Command argument must have non-whitespace characters"); + } + } + + argc = cmd->args.data.array.size; + bool argc_valid; + + // Check if correct number of arguments is used. + switch (ea.argt & (EX_EXTRA | EX_NOSPC | EX_NEEDARG)) { + case EX_EXTRA | EX_NOSPC | EX_NEEDARG: + argc_valid = argc == 1; + break; + case EX_EXTRA | EX_NOSPC: + argc_valid = argc <= 1; + break; + case EX_EXTRA | EX_NEEDARG: + argc_valid = argc >= 1; + break; + case EX_EXTRA: + argc_valid = true; + break; + default: + argc_valid = argc == 0; + break; + } + + if (!argc_valid) { + argc = 0; // Ensure that args array isn't erroneously freed at the end. + VALIDATION_ERROR("Incorrect number of arguments supplied"); + } + + if (argc != 0) { + args = xcalloc(argc, sizeof(char *)); + + for (size_t i = 0; i < argc; i++) { + args[i] = string_to_cstr(cmd->args.data.array.items[i].data.string); + } + } + } + + // 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); + + if (HAS_KEY(cmd->range)) { + if (!(ea.argt & EX_RANGE)) { + VALIDATION_ERROR("Command cannot accept a range"); + } else if (cmd->range.type != kObjectTypeArray) { + VALIDATION_ERROR("'range' must be an Array"); + } else if (cmd->range.data.array.size > 2) { + VALIDATION_ERROR("'range' cannot contain more than two elements"); + } + + Array range = cmd->range.data.array; + ea.addr_count = (int)range.size; + + for (size_t i = 0; i < range.size; i++) { + Object elem = range.items[i]; + if (elem.type != kObjectTypeInteger || elem.data.integer < 0) { + VALIDATION_ERROR("'range' element must be a non-negative Integer"); + } + } + + if (range.size > 0) { + ea.line1 = range.items[0].data.integer; + ea.line2 = range.items[range.size - 1].data.integer; + } + + if (invalid_range(&ea) != NULL) { + VALIDATION_ERROR("Invalid range provided"); + } + } + if (ea.addr_count == 0) { + if (ea.argt & EX_DFLALL) { + set_cmd_dflall_range(&ea); // Default range for range=% + } else { + ea.line1 = ea.line2 = get_cmd_default_range(&ea); // Default range. + + if (ea.addr_type == ADDR_OTHER) { + // Default is 1, not cursor. + ea.line2 = 1; + } + } + } + + if (HAS_KEY(cmd->count)) { + if (!(ea.argt & EX_COUNT)) { + VALIDATION_ERROR("Command cannot accept a count"); + } else if (cmd->count.type != kObjectTypeInteger || cmd->count.data.integer < 0) { + VALIDATION_ERROR("'count' must be a non-negative Integer"); + } + set_cmd_count(&ea, cmd->count.data.integer, true); + } + + if (HAS_KEY(cmd->reg)) { + if (!(ea.argt & EX_REGSTR)) { + VALIDATION_ERROR("Command cannot accept a register"); + } else if (cmd->reg.type != kObjectTypeString || cmd->reg.data.string.size != 1) { + VALIDATION_ERROR("'reg' must be a single character"); + } + char regname = cmd->reg.data.string.data[0]; + if (regname == '=') { + VALIDATION_ERROR("Cannot use register \"="); + } else if (!valid_yank_reg(regname, ea.cmdidx != CMD_put && !IS_USER_CMDIDX(ea.cmdidx))) { + VALIDATION_ERROR("Invalid register: \"%c", regname); + } + ea.regname = (uint8_t)regname; + } + + OBJ_TO_BOOL(ea.forceit, cmd->bang, false, "'bang'"); + if (ea.forceit && !(ea.argt & EX_BANG)) { + VALIDATION_ERROR("Command cannot accept a bang"); + } + + if (HAS_KEY(cmd->magic)) { + if (cmd->magic.type != kObjectTypeDictionary) { + VALIDATION_ERROR("'magic' must be a Dictionary"); + } + + Dict(cmd_magic) magic = { 0 }; + if (!api_dict_to_keydict(&magic, KeyDict_cmd_magic_get_field, + cmd->magic.data.dictionary, err)) { + goto end; + } + + OBJ_TO_BOOL(cmdinfo.magic.file, magic.file, ea.argt & EX_XFILE, "'magic.file'"); + OBJ_TO_BOOL(cmdinfo.magic.bar, magic.bar, ea.argt & EX_TRLBAR, "'magic.bar'"); + } else { + cmdinfo.magic.file = ea.argt & EX_XFILE; + cmdinfo.magic.bar = ea.argt & EX_TRLBAR; + } + + if (HAS_KEY(cmd->mods)) { + if (cmd->mods.type != kObjectTypeDictionary) { + VALIDATION_ERROR("'mods' must be a Dictionary"); + } + + Dict(cmd_mods) mods = { 0 }; + if (!api_dict_to_keydict(&mods, KeyDict_cmd_mods_get_field, cmd->mods.data.dictionary, err)) { + goto end; + } + + if (HAS_KEY(mods.tab)) { + if (mods.tab.type != kObjectTypeInteger || mods.tab.data.integer < 0) { + VALIDATION_ERROR("'mods.tab' must be a non-negative Integer"); + } + cmdinfo.cmdmod.tab = (int)mods.tab.data.integer + 1; + } + + if (HAS_KEY(mods.verbose)) { + if (mods.verbose.type != kObjectTypeInteger || mods.verbose.data.integer <= 0) { + VALIDATION_ERROR("'mods.verbose' must be a non-negative Integer"); + } + cmdinfo.verbose = mods.verbose.data.integer; + } + + bool vertical; + OBJ_TO_BOOL(vertical, mods.vertical, false, "'mods.vertical'"); + cmdinfo.cmdmod.split |= (vertical ? WSP_VERT : 0); + + if (HAS_KEY(mods.split)) { + if (mods.split.type != kObjectTypeString) { + VALIDATION_ERROR("'mods.split' must be a String"); + } + + if (STRCMP(mods.split.data.string.data, "aboveleft") == 0 + || STRCMP(mods.split.data.string.data, "leftabove") == 0) { + cmdinfo.cmdmod.split |= WSP_ABOVE; + } else if (STRCMP(mods.split.data.string.data, "belowright") == 0 + || STRCMP(mods.split.data.string.data, "rightbelow") == 0) { + cmdinfo.cmdmod.split |= WSP_BELOW; + } else if (STRCMP(mods.split.data.string.data, "topleft") == 0) { + cmdinfo.cmdmod.split |= WSP_TOP; + } else if (STRCMP(mods.split.data.string.data, "botright") == 0) { + cmdinfo.cmdmod.split |= WSP_BOT; + } else { + VALIDATION_ERROR("Invalid value for 'mods.split'"); + } + } + + OBJ_TO_BOOL(cmdinfo.silent, mods.silent, false, "'mods.silent'"); + OBJ_TO_BOOL(cmdinfo.emsg_silent, mods.emsg_silent, false, "'mods.emsg_silent'"); + OBJ_TO_BOOL(cmdinfo.sandbox, mods.sandbox, false, "'mods.sandbox'"); + OBJ_TO_BOOL(cmdinfo.noautocmd, mods.noautocmd, false, "'mods.noautocmd'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.browse, mods.browse, false, "'mods.browse'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.confirm, mods.confirm, false, "'mods.confirm'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.hide, mods.hide, false, "'mods.hide'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepalt, mods.keepalt, false, "'mods.keepalt'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepjumps, mods.keepjumps, false, "'mods.keepjumps'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepmarks, mods.keepmarks, false, "'mods.keepmarks'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keeppatterns, mods.keeppatterns, false, "'mods.keeppatterns'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.lockmarks, mods.lockmarks, false, "'mods.lockmarks'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.noswapfile, mods.noswapfile, false, "'mods.noswapfile'"); + + if (cmdinfo.sandbox && !(ea.argt & EX_SBOXOK)) { + VALIDATION_ERROR("Command cannot be run in sandbox"); + } + } + + // Finally, build the command line string that will be stored inside ea.cmdlinep. + // This also sets the values of ea.cmd, ea.arg, ea.args and ea.arglens. + build_cmdline_str(&cmdline, &ea, &cmdinfo, args, argc); + ea.cmdlinep = &cmdline; + + garray_T capture_local; + const int save_msg_silent = msg_silent; + garray_T * const save_capture_ga = capture_ga; + + if (output) { + ga_init(&capture_local, 1, 80); + capture_ga = &capture_local; + } + + try_start(); + if (output) { + msg_silent++; + } + + WITH_SCRIPT_CONTEXT(channel_id, { + execute_cmd(&ea, &cmdinfo); + }); + + if (output) { + capture_ga = save_capture_ga; + msg_silent = save_msg_silent; + } + try_end(err); + + if (ERROR_SET(err)) { + goto clear_ga; + } + + if (output && capture_local.ga_len > 1) { + retv = (String){ + .data = capture_local.ga_data, + .size = (size_t)capture_local.ga_len, + }; + // redir usually (except :echon) prepends a newline. + if (retv.data[0] == '\n') { + memmove(retv.data, retv.data + 1, retv.size - 1); + retv.data[retv.size - 1] = '\0'; + retv.size = retv.size - 1; + } + goto end; + } +clear_ga: + if (output) { + ga_clear(&capture_local); + } +end: + xfree(cmdline); + xfree(cmdname); + xfree(ea.args); + xfree(ea.arglens); + for (size_t i = 0; i < argc; i++) { + xfree(args[i]); + } + xfree(args); + + return retv; + +#undef OBJ_TO_BOOL +#undef VALIDATION_ERROR +} diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua index 9e3eb06752..93a870fe04 100644 --- a/src/nvim/auevents.lua +++ b/src/nvim/auevents.lua @@ -70,6 +70,8 @@ return { 'InsertEnter', -- when entering Insert mode 'InsertLeave', -- just after leaving Insert mode 'InsertLeavePre', -- just before leaving Insert mode + 'LspAttach', -- after an LSP client attaches to a buffer + 'LspDetach', -- after an LSP client detaches from a buffer 'MenuPopup', -- just before popup menu is displayed 'ModeChanged', -- after changing the mode 'OptionSet', -- after setting any option @@ -133,6 +135,8 @@ return { nvim_specific = { BufModifiedSet=true, DiagnosticChanged=true, + LspAttach=true, + LspDetach=true, RecordingEnter=true, RecordingLeave=true, Signal=true, diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 1f8d6e6a1f..b87c7886e3 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -796,13 +796,13 @@ void do_autocmd(char *arg_in, int forceit) // Expand environment variables in the pattern. Set 'shellslash', we want // forward slashes here. - if (vim_strchr((char_u *)pat, '$') != NULL || vim_strchr((char_u *)pat, '~') != NULL) { + if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) { #ifdef BACKSLASH_IN_FILENAME int p_ssl_save = p_ssl; p_ssl = true; #endif - envpat = (char *)expand_env_save((char_u *)pat); + envpat = expand_env_save(pat); #ifdef BACKSLASH_IN_FILENAME p_ssl = p_ssl_save; #endif @@ -1070,10 +1070,9 @@ int autocmd_register(int64_t id, event_T event, char *pat, int patlen, int group char *reg_pat; ap->buflocal_nr = 0; - reg_pat = (char *)file_pat_to_reg_pat((char_u *)pat, (char_u *)pat + patlen, &ap->allow_dirs, - true); + reg_pat = file_pat_to_reg_pat(pat, pat + patlen, &ap->allow_dirs, true); if (reg_pat != NULL) { - ap->reg_prog = vim_regcomp((char_u *)reg_pat, RE_MAGIC); + ap->reg_prog = vim_regcomp(reg_pat, RE_MAGIC); } xfree(reg_pat); if (reg_pat == NULL || ap->reg_prog == NULL) { @@ -1153,7 +1152,7 @@ size_t aucmd_pattern_length(char *pat) char *endpat; - for (; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat)) { + for (; *pat; pat = endpat + 1) { // Find end of the pattern. // Watch out for a comma in braces, like "*.\{obj,o\}". endpat = pat; @@ -1221,7 +1220,7 @@ int do_doautocmd(char *arg_start, bool do_msg, bool *did_something) // Loop over the events. while (*arg && !ends_excmd(*arg) && !ascii_iswhite(*arg)) { if (apply_autocmds_group(event_name2nr(arg, &arg), fname, NULL, true, group, - curbuf, NULL)) { + curbuf, NULL, NULL)) { nothing_done = false; } } @@ -1241,8 +1240,8 @@ void ex_doautoall(exarg_T *eap) { int retval = OK; aco_save_T aco; - char_u *arg = (char_u *)eap->arg; - int call_do_modelines = check_nomodeline((char **)&arg); + char *arg = eap->arg; + int call_do_modelines = check_nomodeline(&arg); bufref_T bufref; bool did_aucmd; @@ -1261,7 +1260,7 @@ void ex_doautoall(exarg_T *eap) set_bufref(&bufref, buf); // execute the autocommands for this buffer - retval = do_doautocmd((char *)arg, false, &did_aucmd); + retval = do_doautocmd(arg, false, &did_aucmd); if (call_do_modelines && did_aucmd) { // Execute the modeline settings, but don't set window-local @@ -1282,7 +1281,7 @@ void ex_doautoall(exarg_T *eap) // Execute autocommands for the current buffer last. if (retval == OK) { - (void)do_doautocmd((char *)arg, false, &did_aucmd); + (void)do_doautocmd(arg, false, &did_aucmd); if (call_do_modelines && did_aucmd) { do_modelines(0); } @@ -1364,7 +1363,7 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) // Make sure w_localdir and globaldir are NULL to avoid a chdir() in // win_enter_ext(). XFREE_CLEAR(aucmd_win->w_localdir); - aco->globaldir = (char *)globaldir; + aco->globaldir = globaldir; globaldir = NULL; block_autocmds(); // We don't want BufEnter/WinEnter autocommands. @@ -1451,7 +1450,7 @@ win_found: hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab xfree(globaldir); - globaldir = (char_u *)aco->globaldir; + globaldir = aco->globaldir; // the buffer contents may have changed check_cursor(); @@ -1504,10 +1503,9 @@ win_found: /// @param buf Buffer for <abuf> /// /// @return true if some commands were executed. -bool apply_autocmds(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf) +bool apply_autocmds(event_T event, char *fname, char *fname_io, bool force, buf_T *buf) { - return apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, AUGROUP_ALL, buf, - NULL); + return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, NULL, NULL); } /// Like apply_autocmds(), but with extra "eap" argument. This takes care of @@ -1521,11 +1519,10 @@ bool apply_autocmds(event_T event, char_u *fname, char_u *fname_io, bool force, /// @param exarg Ex command arguments /// /// @return true if some commands were executed. -bool apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf, +bool apply_autocmds_exarg(event_T event, char *fname, char *fname_io, bool force, buf_T *buf, exarg_T *eap) { - return apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, AUGROUP_ALL, buf, - eap); + return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, eap, NULL); } /// Like apply_autocmds(), but handles the caller's retval. If the script @@ -1541,15 +1538,15 @@ bool apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, bool f /// @param[in,out] retval caller's retval /// /// @return true if some autocommands were executed -bool apply_autocmds_retval(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf, +bool apply_autocmds_retval(event_T event, char *fname, char *fname_io, bool force, buf_T *buf, int *retval) { if (should_abort(*retval)) { return false; } - bool did_cmd = apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, - AUGROUP_ALL, buf, NULL); + bool did_cmd = apply_autocmds_group(event, fname, fname_io, force, + AUGROUP_ALL, buf, NULL, NULL); if (did_cmd && aborting()) { *retval = FAIL; } @@ -1568,7 +1565,7 @@ bool has_event(event_T event) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// the current mode. bool has_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - return has_event((get_real_state() == NORMAL_BUSY ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)); + return has_event((get_real_state() == MODE_NORMAL_BUSY ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)); // return first_autopat[] != NULL; } @@ -1578,7 +1575,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT if (!did_cursorhold && has_cursorhold() && reg_recording == 0 && typebuf.tb_len == 0 && !ins_compl_active()) { int state = get_real_state(); - if (state == NORMAL_BUSY || (state & INSERT) != 0) { + if (state == MODE_NORMAL_BUSY || (state & MODE_INSERT) != 0) { return true; } } @@ -1598,7 +1595,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// /// @return true if some commands were executed. bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force, int group, - buf_T *buf, exarg_T *eap) + buf_T *buf, exarg_T *eap, Object *data) { char *sfname = NULL; // short file name bool retval = false; @@ -1659,9 +1656,9 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force } // Save the autocmd_* variables and info about the current buffer. - char *save_autocmd_fname = (char *)autocmd_fname; + char *save_autocmd_fname = autocmd_fname; int save_autocmd_bufnr = autocmd_bufnr; - char *save_autocmd_match = (char *)autocmd_match; + char *save_autocmd_match = autocmd_match; int save_autocmd_busy = autocmd_busy; int save_autocmd_nested = autocmd_nested; bool save_changed = curbuf->b_changed; @@ -1675,18 +1672,18 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force || event == EVENT_OPTIONSET || event == EVENT_MODECHANGED) { autocmd_fname = NULL; } else if (fname != NULL && !ends_excmd(*fname)) { - autocmd_fname = (char_u *)fname; + autocmd_fname = fname; } else if (buf != NULL) { - autocmd_fname = buf->b_ffname; + autocmd_fname = (char *)buf->b_ffname; } else { autocmd_fname = NULL; } } else { - autocmd_fname = (char_u *)fname_io; + autocmd_fname = fname_io; } if (autocmd_fname != NULL) { // Allocate MAXPATHL for when eval_vars() resolves the fullpath. - autocmd_fname = vim_strnsave(autocmd_fname, MAXPATHL); + autocmd_fname = xstrnsave(autocmd_fname, MAXPATHL); } // Set the buffer number to be used for <abuf>. @@ -1754,11 +1751,11 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force #endif // Set the name to be used for <amatch>. - autocmd_match = (char_u *)fname; + autocmd_match = fname; // Don't redraw while doing autocommands. RedrawingDisabled++; - char *save_sourcing_name = (char *)sourcing_name; + char *save_sourcing_name = sourcing_name; sourcing_name = NULL; // don't free this one linenr_T save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 0; // no line number here @@ -1793,7 +1790,7 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force did_filetype = true; } - char *tail = (char *)path_tail((char_u *)fname); + char *tail = path_tail(fname); // Find first autocommand that matches AutoPatCmd patcmd; @@ -1814,6 +1811,9 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force patcmd.next = active_apc_list; active_apc_list = &patcmd; + // Attach data to command + patcmd.data = data; + // set v:cmdarg (only when there is a matching pattern) save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG); if (eap != NULL) { @@ -1860,12 +1860,12 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force filechangeshell_busy = false; autocmd_nested = save_autocmd_nested; xfree(sourcing_name); - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; xfree(autocmd_fname); - autocmd_fname = (char_u *)save_autocmd_fname; + autocmd_fname = save_autocmd_fname; autocmd_bufnr = save_autocmd_bufnr; - autocmd_match = (char_u *)save_autocmd_match; + autocmd_match = save_autocmd_match; current_sctx = save_current_sctx; restore_funccal(); if (do_profiling == PROF_YES) { @@ -1933,7 +1933,7 @@ void block_autocmds(void) { // Remember the value of v:termresponse. if (!is_autocmd_blocked()) { - old_termresponse = (char *)get_vim_var_str(VV_TERMRESPONSE); + old_termresponse = get_vim_var_str(VV_TERMRESPONSE); } autocmd_blocked++; } @@ -1946,7 +1946,7 @@ void unblock_autocmds(void) // the autocommands now. Esp. useful when executing a shell command // during startup (nvim -d). if (!is_autocmd_blocked() - && get_vim_var_str(VV_TERMRESPONSE) != (char_u *)old_termresponse) { + && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse) { apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, false, curbuf); } } @@ -1979,9 +1979,9 @@ void auto_next_pat(AutoPatCmd *apc, int stop_at_last) if (ap->buflocal_nr == 0 ? match_file_pat(NULL, &ap->reg_prog, - (char_u *)apc->fname, - (char_u *)apc->sfname, - (char_u *)apc->tail, + apc->fname, + apc->sfname, + apc->tail, ap->allow_dirs) : ap->buflocal_nr == apc->arg_bufnr) { const char *const name = event_nr2name(apc->event); @@ -1991,7 +1991,7 @@ void auto_next_pat(AutoPatCmd *apc, int stop_at_last) = (STRLEN(s) + strlen(name) + (size_t)ap->patlen + 1); sourcing_name = xmalloc(sourcing_name_len); - snprintf((char *)sourcing_name, sourcing_name_len, s, name, ap->pat); + snprintf(sourcing_name, sourcing_name_len, s, name, ap->pat); if (p_verbose >= 8) { verbose_enter(); smsg(_("Executing %s"), sourcing_name); @@ -2029,6 +2029,10 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) PUT(data, "file", CSTR_TO_OBJ((char *)autocmd_fname)); PUT(data, "buf", INTEGER_OBJ(autocmd_bufnr)); + if (apc->data) { + PUT(data, "data", copy_object(*apc->data)); + } + int group = apc->curpat->group; switch (group) { case AUGROUP_ERROR: @@ -2064,7 +2068,7 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) /// Get next autocommand command. /// Called by do_cmdline() to get the next line for ":if". /// @return allocated string, or NULL for end of autocommands. -char_u *getnextac(int c, void *cookie, int indent, bool do_concat) +char *getnextac(int c, void *cookie, int indent, bool do_concat) { // These arguments are required for do_cmdline. (void)c; @@ -2155,7 +2159,7 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat) acp->nextcmd = ac->next; } - return (char_u *)retval; + return retval; } /// Return true if there is a matching autocommand for "fname". @@ -2165,12 +2169,13 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat) /// @param event event that occurred. /// @param sfname filename the event occurred in. /// @param buf buffer the file is open in -bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSED_RESULT +bool has_autocmd(event_T event, char *sfname, buf_T *buf) + FUNC_ATTR_WARN_UNUSED_RESULT { - char *tail = (char *)path_tail(sfname); + char *tail = path_tail(sfname); bool retval = false; - char *fname = FullName_save((char *)sfname, false); + char *fname = FullName_save(sfname, false); if (fname == NULL) { return false; } @@ -2188,9 +2193,9 @@ bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSE && (ap->buflocal_nr == 0 ? match_file_pat(NULL, &ap->reg_prog, - (char_u *)fname, + fname, sfname, - (char_u *)tail, + tail, ap->allow_dirs) : buf != NULL && ap->buflocal_nr == buf->b_fnum)) { retval = true; @@ -2208,12 +2213,12 @@ bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSE // Function given to ExpandGeneric() to obtain the list of autocommand group // names. -char_u *expand_get_augroup_name(expand_T *xp, int idx) +char *expand_get_augroup_name(expand_T *xp, int idx) { // Required for ExpandGeneric (void)xp; - return (char_u *)augroup_name(idx + 1); + return augroup_name(idx + 1); } /// @param doautocmd true for :doauto*, false for :autocmd @@ -2263,7 +2268,7 @@ char *set_context_in_autocmd(expand_T *xp, char *arg, int doautocmd) } // Function given to ExpandGeneric() to obtain the list of event names. -char_u *expand_get_event_name(expand_T *xp, int idx) +char *expand_get_event_name(expand_T *xp, int idx) { // xp is a required parameter to be used with ExpandGeneric (void)xp; @@ -2273,14 +2278,14 @@ char_u *expand_get_event_name(expand_T *xp, int idx) if (name != NULL) { // skip when not including groups or skip deleted entries if (!autocmd_include_groups || name == get_deleted_augroup()) { - return (char_u *)""; + return ""; } - return (char_u *)name; + return name; } // List event names - return (char_u *)event_names[idx - next_augroup_id].name; + return event_names[idx - next_augroup_id].name; } /// Check whether given autocommand is supported @@ -2373,7 +2378,7 @@ bool au_exists(const char *const arg) FUNC_ATTR_WARN_UNUSED_RESULT && (group == AUGROUP_ALL || ap->group == group) && (pattern == NULL || (buflocal_buf == NULL - ? FNAMECMP(ap->pat, (char_u *)pattern) == 0 + ? FNAMECMP(ap->pat, pattern) == 0 : ap->buflocal_nr == buflocal_buf->b_fnum))) { retval = true; break; @@ -2410,7 +2415,7 @@ int aupat_get_buflocal_nr(char *pat, int patlen) } // "<buffer=123>" - if (skipdigits((char_u *)pat + 8) == (char_u *)pat + patlen - 1) { + if (skipdigits(pat + 8) == pat + patlen - 1) { return atoi(pat + 8); } } @@ -2434,10 +2439,10 @@ void aupat_normalize_buflocal_pat(char *dest, char *pat, int patlen, int bufloca buflocal_nr); } -int autocmd_delete_event(int group, event_T event, char_u *pat) +int autocmd_delete_event(int group, event_T event, char *pat) FUNC_ATTR_NONNULL_ALL { - return do_autocmd_event(event, (char *)pat, false, false, "", true, group); + return do_autocmd_event(event, pat, false, false, "", true, group); } /// Deletes an autocmd by ID. @@ -2706,9 +2711,9 @@ static void do_autocmd_focusgained(bool gained) // belongs. need_wait_return = false; - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redrawcmdline(); - } else if ((State & NORMAL) || (State & INSERT)) { + } else if ((State & MODE_NORMAL) || (State & MODE_INSERT)) { if (must_redraw != 0) { update_screen(0); } diff --git a/src/nvim/autocmd.h b/src/nvim/autocmd.h index d3503672fd..47f583ae13 100644 --- a/src/nvim/autocmd.h +++ b/src/nvim/autocmd.h @@ -57,6 +57,7 @@ typedef struct AutoPatCmd { char *tail; // tail of fname event_T event; // current event int arg_bufnr; // initially equal to <abuf>, set to zero when buf is deleted + Object *data; // arbitrary data struct AutoPatCmd *next; // chain of active apc-s for auto-invalidation } AutoPatCmd; diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 107f61919a..4b1aea5720 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -111,7 +111,7 @@ static int read_buffer(int read_stdin, exarg_T *eap, int flags) // the end. This makes it possible to retry when 'fileformat' or // 'fileencoding' was guessed wrong. line_count = curbuf->b_ml.ml_line_count; - retval = readfile(read_stdin ? NULL : curbuf->b_ffname, + retval = readfile(read_stdin ? NULL : (char *)curbuf->b_ffname, read_stdin ? NULL : curbuf->b_fname, line_count, (linenr_T)0, (linenr_T)MAXLNUM, eap, flags | READ_BUFFER, silent); @@ -229,7 +229,7 @@ int open_buffer(int read_stdin, exarg_T *eap, int flags) } #endif - retval = readfile(curbuf->b_ffname, curbuf->b_fname, + retval = readfile((char *)curbuf->b_ffname, curbuf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, eap, flags | READ_NEW | (read_fifo ? READ_FIFO : 0), silent); #ifdef UNIX @@ -1219,8 +1219,7 @@ int do_buffer(int action, int start, int dir, int count, int forceit) return FAIL; } } else { - semsg(_("E89: %s will be killed (add ! to override)"), - (char *)buf->b_fname); + semsg(_("E89: %s will be killed (add ! to override)"), buf->b_fname); return FAIL; } } @@ -1476,7 +1475,7 @@ void set_curbuf(buf_T *buf, int action) // Do not sync when in Insert mode and the buffer is open in // another window, might be a timer doing something in another // window. - if (prevbuf == curbuf && ((State & INSERT) == 0 || curbuf->b_nwindows <= 1)) { + if (prevbuf == curbuf && ((State & MODE_INSERT) == 0 || curbuf->b_nwindows <= 1)) { u_sync(false); } close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, @@ -1803,7 +1802,7 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl hash_init(&buf->b_s.b_keywtab); hash_init(&buf->b_s.b_keywtab_ic); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; if (!file_id_valid) { buf->file_id_valid = false; } else { @@ -2113,10 +2112,10 @@ int buflist_findpat(const char_u *pattern, const char_u *pattern_end, bool unlis { int match = -1; int find_listed; - char_u *pat; - char_u *patend; + char *pat; + char *patend; int attempt; - char_u *p; + char *p; int toggledollar; if (pattern_end == pattern + 1 && (*pattern == '%' || *pattern == '#')) { @@ -2138,7 +2137,7 @@ int buflist_findpat(const char_u *pattern, const char_u *pattern_end, bool unlis // Repeat this for finding an unlisted buffer if there was no matching // listed buffer. - pat = file_pat_to_reg_pat(pattern, pattern_end, NULL, false); + pat = file_pat_to_reg_pat((char *)pattern, (char *)pattern_end, NULL, false); if (pat == NULL) { return -1; } @@ -2271,7 +2270,7 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) } regmatch_T regmatch; - regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)patc + attempt * 11, RE_MAGIC); if (regmatch.regprog == NULL) { if (patc != pat) { xfree(patc); @@ -2366,7 +2365,7 @@ static char_u *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); - if (match == NULL) { + if (match == NULL && rmp->regprog != NULL) { match = fname_match(rmp, buf->b_ffname, ignore_case); } return match; @@ -2387,7 +2386,7 @@ static char_u *fname_match(regmatch_T *rmp, char_u *name, bool ignore_case) rmp->rm_ic = p_fic || ignore_case; if (vim_regexec(rmp, name, (colnr_T)0)) { match = name; - } else { + } 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)) { @@ -2426,7 +2425,7 @@ char_u *buflist_nr2name(int n, int fullname, int helptail) return NULL; } return home_replace_save(helptail ? buf : NULL, - fullname ? buf->b_ffname : buf->b_fname); + fullname ? buf->b_ffname : (char_u *)buf->b_fname); } /// Set the line and column numbers for the given buffer and window @@ -2622,7 +2621,7 @@ void buflist_list(exarg_T *eap) garray_T buflist; buf_T **buflist_data = NULL; - if (vim_strchr((char_u *)eap->arg, 't')) { + if (vim_strchr(eap->arg, 't')) { ga_init(&buflist, sizeof(buf_T *), 50); for (buf = firstbuf; buf != NULL; buf = buf->b_next) { ga_grow(&buflist, 1); @@ -2645,28 +2644,28 @@ void buflist_list(exarg_T *eap) const bool job_running = buf->terminal && terminal_running(buf->terminal); // skip unspecified buffers - if ((!buf->b_p_bl && !eap->forceit && !vim_strchr((char_u *)eap->arg, 'u')) - || (vim_strchr((char_u *)eap->arg, 'u') && buf->b_p_bl) - || (vim_strchr((char_u *)eap->arg, '+') + if ((!buf->b_p_bl && !eap->forceit && !vim_strchr(eap->arg, 'u')) + || (vim_strchr(eap->arg, 'u') && buf->b_p_bl) + || (vim_strchr(eap->arg, '+') && ((buf->b_flags & BF_READERR) || !bufIsChanged(buf))) - || (vim_strchr((char_u *)eap->arg, 'a') + || (vim_strchr(eap->arg, 'a') && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0)) - || (vim_strchr((char_u *)eap->arg, 'h') + || (vim_strchr(eap->arg, 'h') && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0)) - || (vim_strchr((char_u *)eap->arg, 'R') && (!is_terminal || !job_running)) - || (vim_strchr((char_u *)eap->arg, 'F') && (!is_terminal || job_running)) - || (vim_strchr((char_u *)eap->arg, '-') && buf->b_p_ma) - || (vim_strchr((char_u *)eap->arg, '=') && !buf->b_p_ro) - || (vim_strchr((char_u *)eap->arg, 'x') && !(buf->b_flags & BF_READERR)) - || (vim_strchr((char_u *)eap->arg, '%') && buf != curbuf) - || (vim_strchr((char_u *)eap->arg, '#') + || (vim_strchr(eap->arg, 'R') && (!is_terminal || !job_running)) + || (vim_strchr(eap->arg, 'F') && (!is_terminal || job_running)) + || (vim_strchr(eap->arg, '-') && buf->b_p_ma) + || (vim_strchr(eap->arg, '=') && !buf->b_p_ro) + || (vim_strchr(eap->arg, 'x') && !(buf->b_flags & BF_READERR)) + || (vim_strchr(eap->arg, '%') && buf != curbuf) + || (vim_strchr(eap->arg, '#') && (buf == curbuf || curwin->w_alt_fnum != buf->b_fnum))) { continue; } if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, true); + home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); } if (message_filtered(NameBuff)) { @@ -2700,7 +2699,7 @@ void buflist_list(exarg_T *eap) do { IObuff[len++] = ' '; } while (--i > 0 && len < IOSIZE - 18); - if (vim_strchr((char_u *)eap->arg, 't') && buf->b_last_used) { + if (vim_strchr(eap->arg, 't') && buf->b_last_used) { undo_fmt_time(IObuff + len, (size_t)(IOSIZE - len), buf->b_last_used); } else { vim_snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), _("line %" PRId64), @@ -2730,7 +2729,7 @@ int buflist_name_nr(int fnum, char_u **fname, linenr_T *lnum) return FAIL; } - *fname = buf->b_fname; + *fname = (char_u *)buf->b_fname; *lnum = buflist_findlnum(buf); return OK; @@ -2794,7 +2793,7 @@ int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, bool message) buf->b_ffname = ffname; buf->b_sfname = sfname; } - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; if (!file_id_valid) { buf->file_id_valid = false; } else { @@ -2823,7 +2822,7 @@ void buf_set_name(int fnum, char_u *name) // Allocate ffname and expand into full path. Also resolves .lnk // files on Win32. fname_expand(buf, &buf->b_ffname, &buf->b_sfname); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; } } @@ -2980,7 +2979,7 @@ void buf_set_file_id(buf_T *buf) { FileID file_id; if (buf->b_fname != NULL - && os_fileid((char *)buf->b_fname, &file_id)) { + && os_fileid(buf->b_fname, &file_id)) { buf->file_id_valid = true; buf->file_id = file_id; } else { @@ -3023,7 +3022,7 @@ 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 = curbuf->b_fname; + name = (char_u *)curbuf->b_fname; } else { name = curbuf->b_ffname; } @@ -3285,7 +3284,7 @@ void maketitle(void) if (buf_spname(curbuf) != NULL) { buf_p = buf_spname(curbuf); } else { // use file name only in icon - buf_p = path_tail(curbuf->b_ffname); + buf_p = (char_u *)path_tail((char *)curbuf->b_ffname); } *icon_str = NUL; // Truncate name at 100 bytes. @@ -3635,7 +3634,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // correct the start of the items for the truncation for (int idx = stl_groupitems[groupdepth] + 1; idx < curitem; idx++) { // Shift everything back by the number of removed bytes - stl_items[idx].start -= n; + // Minus one for the leading '<' added above. + stl_items[idx].start -= n - 1; // If the item was partially or completely truncated, set its // start to the start of the group @@ -3833,14 +3833,14 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san STRLCPY(NameBuff, buf_spname(wp->w_buffer), MAXPATHL); } else { char_u *t = (opt == STL_FULLPATH) ? wp->w_buffer->b_ffname - : wp->w_buffer->b_fname; + : (char_u *)wp->w_buffer->b_fname; home_replace(wp->w_buffer, t, NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); if (opt != STL_FILENAME) { str = (char *)NameBuff; } else { - str = (char *)path_tail(NameBuff); + str = path_tail((char *)NameBuff); } break; case STL_VIM_EXPR: // '{' @@ -3908,7 +3908,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Check if the evaluated result is a number. // If so, convert the number to an int and free the string. if (str != NULL && *str != 0) { - if (*skipdigits((char_u *)str) == NUL) { + if (*skipdigits(str) == NUL) { num = atoi(str); XFREE_CLEAR(str); itemisflag = false; @@ -3961,8 +3961,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san break; case STL_COLUMN: - num = !(State & INSERT) && empty_line - ? 0 : (int)wp->w_cursor.col + 1; + num = (State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col + 1; break; case STL_VIRTCOL: @@ -3970,7 +3969,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san colnr_T virtcol = wp->w_virtcol + 1; // Don't display %V if it's the same as %c. if (opt == STL_VIRTCOL_ALT - && (virtcol == (colnr_T)(!(State & INSERT) && empty_line + && (virtcol == (colnr_T)((State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col + 1))) { break; } @@ -4028,7 +4027,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san long l = ml_find_line_or_offset(wp->w_buffer, wp->w_cursor.lnum, NULL, false); num = (wp->w_buffer->b_ml.ml_flags & ML_EMPTY) || l < 0 ? - 0L : l + 1 + (!(State & INSERT) && empty_line ? + 0L : l + 1 + ((State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col); break; } @@ -4650,7 +4649,7 @@ char_u *alist_name(aentry_T *aep) if (bp == NULL || bp->b_fname == NULL) { return aep->ae_fname; } - return bp->b_fname; + return (char_u *)bp->b_fname; } /// do_arg_all(): Open up to 'count' windows, one for each argument. @@ -5201,9 +5200,9 @@ static int chk_modeline(linenr_T lnum, int flags) s = linecopy = vim_strsave(s); // copy the line, it will change save_sourcing_lnum = sourcing_lnum; - save_sourcing_name = sourcing_name; + save_sourcing_name = (char_u *)sourcing_name; sourcing_lnum = lnum; // prepare for emsg() - sourcing_name = (char_u *)"modelines"; + sourcing_name = "modelines"; end = false; while (end == false) { @@ -5234,7 +5233,7 @@ static int chk_modeline(linenr_T lnum, int flags) break; } end = true; - s = vim_strchr(s, ' ') + 1; + s = (char_u *)vim_strchr((char *)s, ' ') + 1; } *e = NUL; // truncate the set command @@ -5259,7 +5258,7 @@ static int chk_modeline(linenr_T lnum, int flags) } sourcing_lnum = save_sourcing_lnum; - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; xfree(linecopy); @@ -5358,7 +5357,7 @@ char_u *buf_spname(buf_T *buf) // contains the name as specified by the user. if (bt_nofile(buf)) { if (buf->b_fname != NULL) { - return buf->b_fname; + return (char_u *)buf->b_fname; } if (bt_prompt(buf)) { return (char_u *)_("[Prompt]"); @@ -5552,7 +5551,7 @@ char_u *buf_get_fname(const buf_T *buf) if (buf->b_fname == NULL) { return (char_u *)_("[No Name]"); } - return buf->b_fname; + return (char_u *)buf->b_fname; } /// Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed. @@ -5594,7 +5593,7 @@ bool buf_contents_changed(buf_T *buf) aucmd_prepbuf(&aco, newbuf); if (ml_open(curbuf) == OK - && readfile(buf->b_ffname, buf->b_fname, + && readfile((char *)buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, &ea, READ_NEW | READ_DUMMY, false) == OK) { // compare the two files line by line diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 1d994a9ff0..9efa540210 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -233,6 +233,8 @@ typedef struct { #define w_p_sbr w_onebuf_opt.wo_sbr // 'showbreak' char_u *wo_stl; #define w_p_stl w_onebuf_opt.wo_stl // 'statusline' + char *wo_wbr; +#define w_p_wbr w_onebuf_opt.wo_wbr // 'winbar' int wo_scb; #define w_p_scb w_onebuf_opt.wo_scb // 'scrollbind' int wo_diff_saved; // options were saved for starting diff mode @@ -537,16 +539,14 @@ struct file_buffer { int b_ro_locked; // Non-zero when the buffer can't be changed. // Used for FileChangedRO - // // b_ffname has the full path of the file (NULL for no name). // b_sfname is the name as the user typed it (or NULL). // b_fname is the same as b_sfname, unless ":cd" has been done, // then it is the same as b_ffname (NULL for no name). - // char_u *b_ffname; // full path file name, allocated char_u *b_sfname; // short file name, allocated, may be equal to // b_ffname - char_u *b_fname; // current file name, points to b_ffname or + char *b_fname; // current file name, points to b_ffname or // b_sfname bool file_id_valid; @@ -1237,6 +1237,7 @@ struct window_S { struct { int stl; int stlnc; + int wbr; int horiz; int horizup; int horizdown; @@ -1284,14 +1285,20 @@ struct window_S { // int w_winrow; // first row of window in screen int w_height; // number of rows in window, excluding - // status/command/winbar line(s) + // status/command line(s) int w_status_height; // number of status lines (0 or 1) + int w_winbar_height; // number of window bars (0 or 1) int w_wincol; // Leftmost column of window in screen. int w_width; // Width of window, excluding separation. int w_hsep_height; // Number of horizontal separator rows (0 or 1) int w_vsep_width; // Number of vertical separator columns (0 or 1). pos_save_T w_save_cursor; // backup of cursor pos and topline + int w_winrow_off; ///< offset from winrow to the inner window area + int w_wincol_off; ///< offset from wincol to the inner window area + ///< this includes float border but excludes special columns + ///< implemented in win_line() (i.e. signs, folds, numbers) + // inner size of window, which can be overridden by external UI int w_height_inner; int w_width_inner; @@ -1381,6 +1388,7 @@ struct window_S { linenr_T w_redraw_top; // when != 0: first line needing redraw linenr_T w_redraw_bot; // when != 0: last line needing redraw bool w_redr_status; // if true status line must be redrawn + bool w_redr_winbar; // if true window bar must be redrawn bool w_redr_border; // if true border must be redrawn // remember what is shown in the ruler for this window (if 'ruler' set) @@ -1410,6 +1418,7 @@ struct window_S { // A few options have local flags for P_INSECURE. uint32_t w_p_stl_flags; // flags for 'statusline' + uint32_t w_p_wbr_flags; // flags for 'winbar' uint32_t w_p_fde_flags; // flags for 'foldexpr' uint32_t w_p_fdt_flags; // flags for 'foldtext' int *w_p_cc_cols; // array of columns to highlight or NULL diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c index 3e2d04b3a2..57f052ced0 100644 --- a/src/nvim/buffer_updates.c +++ b/src/nvim/buffer_updates.c @@ -254,7 +254,7 @@ void buf_updates_send_changes(buf_T *buf, linenr_T firstline, int64_t num_added, for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) { BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i); bool keep = true; - if (cb.on_lines != LUA_NOREF && (cb.preview || !(State & CMDPREVIEW))) { + if (cb.on_lines != LUA_NOREF && (cb.preview || !(State & MODE_CMDPREVIEW))) { Array args = ARRAY_DICT_INIT; Object items[8]; args.size = 6; // may be increased to 8 below @@ -313,7 +313,7 @@ void buf_updates_send_splice(buf_T *buf, int start_row, colnr_T start_col, bcoun for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) { BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i); bool keep = true; - if (cb.on_bytes != LUA_NOREF && (cb.preview || !(State & CMDPREVIEW))) { + if (cb.on_bytes != LUA_NOREF && (cb.preview || !(State & MODE_CMDPREVIEW))) { FIXED_TEMP_ARRAY(args, 11); // the first argument is always the buffer handle diff --git a/src/nvim/change.c b/src/nvim/change.c index abc000d236..94e5a19edc 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -209,6 +209,10 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra curwin->w_changelistidx = curbuf->b_changelistlen; } + if (VIsual_active) { + check_visual_pos(); + } + FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->w_buffer == curbuf) { // Mark this window to be redrawn later. @@ -543,7 +547,7 @@ void ins_bytes_len(char_u *p, size_t len) } /// Insert or replace a single character at the cursor position. -/// When in REPLACE or VREPLACE mode, replace any existing character. +/// When in MODE_REPLACE or MODE_VREPLACE state, replace any existing character. /// Caller must have prepared for undo. /// For multi-byte characters we get the whole character, the caller must /// convert bytes to a character. @@ -557,7 +561,7 @@ void ins_char(int c) if (buf[0] == 0) { buf[0] = '\n'; } - ins_char_bytes(buf, n); + ins_char_bytes((char_u *)buf, n); } void ins_char_bytes(char_u *buf, size_t charlen) @@ -652,7 +656,7 @@ void ins_char_bytes(char_u *buf, size_t charlen) // If we're in Insert or Replace mode and 'showmatch' is set, then briefly // show the match for right parens and braces. - if (p_sm && (State & INSERT) + if (p_sm && (State & MODE_INSERT) && msg_silent == 0 && !ins_compl_active()) { showmatch(utf_ptr2char((char *)buf)); @@ -923,10 +927,10 @@ int copy_indent(int size, char_u *src) /// open_line: Add a new line below or above the current line. /// -/// For VREPLACE mode, we only add a new line when we get to the end of the -/// file, otherwise we just start replacing the next line. +/// For MODE_VREPLACE state, we only add a new line when we get to the end of +/// the file, otherwise we just start replacing the next line. /// -/// Caller must take care of undo. Since VREPLACE may affect any number of +/// Caller must take care of undo. Since MODE_VREPLACE may affect any number of /// lines however, it may call u_save_cursor() again when starting to change a /// new line. /// "flags": OPENLINE_DELSPACES delete spaces after cursor @@ -963,8 +967,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) char_u *p; char_u saved_char = NUL; // init for GCC pos_T *pos; - bool do_si = (!p_paste && curbuf->b_p_si && !curbuf->b_p_cin - && *curbuf->b_p_inde == NUL); + bool do_si = may_do_si(); bool do_cindent; bool no_si = false; // reset did_si afterwards int first_char = NUL; // init for GCC @@ -979,7 +982,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) char_u *saved_line = vim_strsave(get_cursor_line_ptr()); if (State & VREPLACE_FLAG) { - // With VREPLACE we make a copy of the next line, which we will be + // With MODE_VREPLACE we make a copy of the next line, which we will be // starting to replace. First make the new line empty and let vim play // with the indenting and comment leader to its heart's content. Then // we grab what it ended up putting on the new line, put back the @@ -992,11 +995,11 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) next_line = vim_strsave((char_u *)""); } - // In VREPLACE mode, a NL replaces the rest of the line, and starts - // replacing the next line, so push all of the characters left on the - // line onto the replace stack. We'll push any other characters that - // might be replaced at the start of the next line (due to autoindent - // etc) a bit later. + // In MODE_VREPLACE state, a NL replaces the rest of the line, and + // starts replacing the next line, so push all of the characters left + // on the line onto the replace stack. We'll push any other characters + // that might be replaced at the start of the next line (due to + // autoindent etc) a bit later. replace_push(NUL); // Call twice because BS over NL expects it replace_push(NUL); p = saved_line + curwin->w_cursor.col; @@ -1006,8 +1009,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) saved_line[curwin->w_cursor.col] = NUL; } - if ((State & INSERT) - && !(State & VREPLACE_FLAG)) { + if ((State & MODE_INSERT) && (State & VREPLACE_FLAG) == 0) { p_extra = saved_line + curwin->w_cursor.col; if (do_si) { // need first char after new line break p = (char_u *)skipwhite((char *)p_extra); @@ -1500,7 +1502,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) while (off > 0 && lead_len > 0 && leader[lead_len - 1] == ' ') { // Don't do it when there is a tab before the space - if (vim_strchr((char_u *)skipwhite((char *)leader), '\t') != NULL) { + if (vim_strchr(skipwhite((char *)leader), '\t') != NULL) { break; } lead_len--; @@ -1552,15 +1554,16 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } } - // (State == INSERT || State == REPLACE), only when dir == FORWARD + // (State == MODE_INSERT || State == MODE_REPLACE), only when dir == FORWARD if (p_extra != NULL) { *p_extra = saved_char; // restore char that NUL replaced // When 'ai' set or "flags" has OPENLINE_DELSPACES, skip to the first // non-blank. // - // When in REPLACE mode, put the deleted blanks on the replace stack, - // preceded by a NUL, so they can be put back when a BS is entered. + // When in MODE_REPLACE state, put the deleted blanks on the replace + // stack, preceded by a NUL, so they can be put back when a BS is + // entered. if (REPLACE_NORMAL(State)) { replace_push(NUL); // end of extra blanks } @@ -1612,7 +1615,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) if (dir == BACKWARD) { curwin->w_cursor.lnum--; } - if (!(State & VREPLACE_FLAG) || old_cursor.lnum >= orig_line_count) { + if ((State & VREPLACE_FLAG) == 0 || old_cursor.lnum >= orig_line_count) { if (ml_append(curwin->w_cursor.lnum, (char *)p_extra, (colnr_T)0, false) == FAIL) { goto theend; } @@ -1627,7 +1630,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } did_append = true; } else { - // In VREPLACE mode we are starting to replace the next line. + // In MODE_VREPLACE state we are starting to replace the next line. curwin->w_cursor.lnum++; if (curwin->w_cursor.lnum >= Insstart.lnum + vr_lines_changed) { // In case we NL to a new line, BS to the previous one, and NL @@ -1669,8 +1672,8 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) ai_col = curwin->w_cursor.col; - // In REPLACE mode, for each character in the new indent, there must - // be a NUL on the replace stack, for when it is deleted with BS + // In MODE_REPLACE state, for each character in the new indent, there + // must be a NUL on the replace stack, for when it is deleted with BS if (REPLACE_NORMAL(State)) { for (colnr_T n = 0; n < curwin->w_cursor.col; n++) { replace_push(NUL); @@ -1683,8 +1686,8 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } inhibit_delete_count--; - // In REPLACE mode, for each character in the extra leader, there must be - // a NUL on the replace stack, for when it is deleted with BS. + // In MODE_REPLACE state, for each character in the extra leader, there + // must be a NUL on the replace stack, for when it is deleted with BS. if (REPLACE_NORMAL(State)) { while (lead_len-- > 0) { replace_push(NUL); @@ -1694,7 +1697,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) curwin->w_cursor = old_cursor; if (dir == FORWARD) { - if (trunc_line || (State & INSERT)) { + if (trunc_line || (State & MODE_INSERT)) { // truncate current line at cursor saved_line[curwin->w_cursor.col] = NUL; // Remove trailing white space, unless OPENLINE_KEEPTRAIL used. @@ -1752,12 +1755,12 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) curwin->w_cursor.col = newcol; curwin->w_cursor.coladd = 0; - // In VREPLACE mode, we are handling the replace stack ourselves, so stop - // fixthisline() from doing it (via change_indent()) by telling it we're in - // normal INSERT mode. + // In MODE_VREPLACE state, we are handling the replace stack ourselves, so + // stop fixthisline() from doing it (via change_indent()) by telling it + // we're in normal MODE_INSERT state. if (State & VREPLACE_FLAG) { vreplace_mode = State; // So we know to put things right later - State = INSERT; + State = MODE_INSERT; } else { vreplace_mode = 0; } @@ -1778,9 +1781,9 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) State = vreplace_mode; } - // Finally, VREPLACE gets the stuff on the new line, then puts back the - // original line, and inserts the new stuff char by char, pushing old stuff - // onto the replace stack (via ins_char()). + // Finally, MODE_VREPLACE gets the stuff on the new line, then puts back + // the original line, and inserts the new stuff char by char, pushing old + // stuff onto the replace stack (via ins_char()). if (State & VREPLACE_FLAG) { // Put new line in p_extra p_extra = vim_strsave(get_cursor_line_ptr()); @@ -1879,7 +1882,7 @@ int get_leader_len(char_u *line, char_u **flags, bool backward, bool include_spa { int j; int got_com = false; - char_u part_buf[COM_MAX_LEN]; // buffer for one option part + char part_buf[COM_MAX_LEN]; // buffer for one option part char_u *string; // pointer to comment string char_u *list; int middle_match_len = 0; @@ -1903,8 +1906,8 @@ int get_leader_len(char_u *line, char_u **flags, bool backward, bool include_spa *flags = list; // remember where flags started } prev_list = list; - (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); - string = vim_strchr(part_buf, ':'); + (void)copy_option_part(&list, (char_u *)part_buf, COM_MAX_LEN, ","); + string = (char_u *)vim_strchr(part_buf, ':'); if (string == NULL) { // missing ':', ignore this part continue; } @@ -2026,7 +2029,7 @@ int get_last_leader_offset(char_u *line, char_u **flags) char_u *com_leader; char_u *com_flags; char_u *list; - char_u part_buf[COM_MAX_LEN]; // buffer for one option part + char part_buf[COM_MAX_LEN]; // buffer for one option part // Repeat to match several nested comment strings. int i = (int)STRLEN(line); @@ -2038,8 +2041,8 @@ int get_last_leader_offset(char_u *line, char_u **flags) // Get one option part into part_buf[]. Advance list to next one. // put string at start of string. - (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); - string = vim_strchr(part_buf, ':'); + (void)copy_option_part(&list, (char_u *)part_buf, COM_MAX_LEN, ","); + string = (char_u *)vim_strchr(part_buf, ':'); if (string == NULL) { // If everything is fine, this cannot actually // happen. continue; @@ -2097,7 +2100,7 @@ int get_last_leader_offset(char_u *line, char_u **flags) } if (found_one) { - char_u part_buf2[COM_MAX_LEN]; // buffer for one option part + char part_buf2[COM_MAX_LEN]; // buffer for one option part int len1, len2, off; result = i; @@ -2121,11 +2124,11 @@ int get_last_leader_offset(char_u *line, char_u **flags) for (list = curbuf->b_p_com; *list;) { char_u *flags_save = list; - (void)copy_option_part(&list, part_buf2, COM_MAX_LEN, ","); + (void)copy_option_part(&list, (char_u *)part_buf2, COM_MAX_LEN, ","); if (flags_save == com_flags) { continue; } - string = vim_strchr(part_buf2, ':'); + string = (char_u *)vim_strchr(part_buf2, ':'); string++; while (ascii_iswhite(*string)) { string++; diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 466d943c3e..082791ffd1 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -1015,7 +1015,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *en if (cursor != NULL) { if ((*ptr == TAB) - && (State & NORMAL) + && (State & MODE_NORMAL) && !wp->w_p_list && !virtual_active() && !(VIsual_active && ((*p_sel == 'e') || ltoreq(*pos, VIsual)))) { @@ -1187,16 +1187,16 @@ intptr_t getwhitecols(const char_u *p) /// @param[in] q String to skip digits in. /// /// @return Pointer to the character after the skipped digits. -char_u *skipdigits(const char_u *q) +char *skipdigits(const char *q) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { - const char_u *p = q; + const char *p = q; while (ascii_isdigit(*p)) { // skip to next non-digit p++; } - return (char_u *)p; + return (char *)p; } /// skip over binary digits @@ -1541,6 +1541,7 @@ void vim_str2nr(const char_u *const start, int *const prep, int *const len, cons // Do the conversion manually to avoid sscanf() quirks. abort(); // Should’ve used goto earlier. + // -V:PARSE_NUMBER:560 #define PARSE_NUMBER(base, cond, conv) \ do { \ const char *const after_prefix = ptr; \ diff --git a/src/nvim/context.c b/src/nvim/context.c index 0e0d8fdfde..db26667009 100644 --- a/src/nvim/context.c +++ b/src/nvim/context.c @@ -129,8 +129,8 @@ bool ctx_restore(Context *ctx, const int flags) free_ctx = true; } - char_u *op_shada; - get_option_value("shada", NULL, (char **)&op_shada, OPT_GLOBAL); + char *op_shada; + get_option_value("shada", NULL, &op_shada, OPT_GLOBAL); set_option_value("shada", 0L, "!,'100,%", OPT_GLOBAL); if (flags & kCtxRegs) { @@ -157,7 +157,7 @@ bool ctx_restore(Context *ctx, const int flags) ctx_free(ctx); } - set_option_value("shada", 0L, (char *)op_shada, OPT_GLOBAL); + set_option_value("shada", 0L, op_shada, OPT_GLOBAL); xfree(op_shada); return true; diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c index 6208efc9c8..1446257f7e 100644 --- a/src/nvim/cursor.c +++ b/src/nvim/cursor.c @@ -95,8 +95,8 @@ static int coladvance2(pos_T *pos, bool addspaces, bool finetune, colnr_T wcol_a colnr_T col = 0; int head = 0; - int one_more = (State & INSERT) - || (State & TERM_FOCUS) + int one_more = (State & MODE_INSERT) + || (State & MODE_TERMINAL) || restart_edit != NUL || (VIsual_active && *p_sel != 'o') || ((get_ve_flags() & VE_ONEMORE) && wcol < MAXCOL); @@ -128,7 +128,7 @@ static int coladvance2(pos_T *pos, bool addspaces, bool finetune, colnr_T wcol_a } if (wcol / width > (colnr_T)csize / width - && ((State & INSERT) == 0 || (int)wcol > csize + 1)) { + && ((State & MODE_INSERT) == 0 || (int)wcol > csize + 1)) { // In case of line wrapping don't move the cursor beyond the // right screen edge. In Insert mode allow going just beyond // the last character (like what happens when typing and @@ -350,7 +350,7 @@ void check_cursor_col_win(win_T *win) // - in Insert mode or restarting Insert mode // - in Visual mode and 'selection' isn't "old" // - 'virtualedit' is set */ - if ((State & INSERT) || restart_edit + if ((State & MODE_INSERT) || restart_edit || (VIsual_active && *p_sel != 'o') || (cur_ve_flags & VE_ONEMORE) || virtual_active()) { @@ -399,6 +399,24 @@ void check_cursor(void) check_cursor_col(); } +/// Check if VIsual position is valid, correct it if not. +/// Can be called when in Visual mode and a change has been made. +void check_visual_pos(void) +{ + if (VIsual.lnum > curbuf->b_ml.ml_line_count) { + VIsual.lnum = curbuf->b_ml.ml_line_count; + VIsual.col = 0; + VIsual.coladd = 0; + } else { + int len = (int)STRLEN(ml_get(VIsual.lnum)); + + if (VIsual.col > len) { + VIsual.col = len; + VIsual.coladd = 0; + } + } +} + /// Make sure curwin->w_cursor is not on the NUL at the end of the line. /// Allow it when in Visual mode and 'selection' is not "old". void adjust_cursor_col(void) diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c index b092873a35..b69505d7c9 100644 --- a/src/nvim/cursor_shape.c +++ b/src/nvim/cursor_shape.c @@ -120,8 +120,8 @@ char *parse_shape_opt(int what) // Repeat for all comma separated parts. char *modep = (char *)p_guicursor; while (modep != NULL && *modep != NUL) { - colonp = (char *)vim_strchr((char_u *)modep, ':'); - commap = (char *)vim_strchr((char_u *)modep, ','); + colonp = vim_strchr(modep, ':'); + commap = vim_strchr(modep, ','); if (colonp == NULL || (commap != NULL && commap < colonp)) { return N_("E545: Missing colon"); @@ -215,7 +215,7 @@ char *parse_shape_opt(int what) } p += 5; } else { // must be a highlight group name then - endp = (char *)vim_strchr((char_u *)p, '-'); + endp = vim_strchr(p, '-'); if (commap == NULL) { // last part if (endp == NULL) { endp = p + STRLEN(p); // find end of part @@ -223,7 +223,7 @@ char *parse_shape_opt(int what) } else if (endp > commap || endp == NULL) { endp = commap; } - slashp = (char *)vim_strchr((char_u *)p, '/'); + slashp = vim_strchr(p, '/'); if (slashp != NULL && slashp < endp) { // "group/langmap_group" i = syn_check_group(p, (size_t)(slashp - p)); @@ -320,15 +320,15 @@ bool cursor_mode_uses_syn_id(int syn_id) int cursor_get_mode_idx(void) FUNC_ATTR_PURE { - if (State == SHOWMATCH) { + if (State == MODE_SHOWMATCH) { return SHAPE_IDX_SM; } else if (State & VREPLACE_FLAG) { return SHAPE_IDX_R; } else if (State & REPLACE_FLAG) { return SHAPE_IDX_R; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { return SHAPE_IDX_I; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { if (cmdline_at_end()) { return SHAPE_IDX_C; } else if (cmdline_overstrike()) { diff --git a/src/nvim/debugger.c b/src/nvim/debugger.c index 662b9bfb0a..b2ac28629c 100644 --- a/src/nvim/debugger.c +++ b/src/nvim/debugger.c @@ -60,7 +60,7 @@ void do_debug(char_u *cmd) int save_ignore_script = 0; int n; char_u *cmdline = NULL; - char_u *p; + char *p; char *tail = NULL; static int last_cmd = 0; #define CMD_CONT 1 @@ -83,7 +83,7 @@ void do_debug(char_u *cmd) emsg_silent = false; // display error messages redir_off = true; // don't redirect debug commands - State = NORMAL; + State = MODE_NORMAL; debug_mode = true; if (!debug_did_msg) { @@ -100,7 +100,7 @@ void do_debug(char_u *cmd) debug_newval = NULL; } if (sourcing_name != NULL) { - msg((char *)sourcing_name); + msg(sourcing_name); } if (sourcing_lnum != 0) { smsg(_("line %" PRId64 ": %s"), (int64_t)sourcing_lnum, cmd); @@ -141,7 +141,7 @@ void do_debug(char_u *cmd) // If this is a debug command, set "last_cmd". // If not, reset "last_cmd". // For a blank line use previous command. - p = (char_u *)skipwhite((char *)cmdline); + p = skipwhite((char *)cmdline); if (*p != NUL) { switch (*p) { case 'c': @@ -200,7 +200,7 @@ void do_debug(char_u *cmd) if (last_cmd != 0) { // Check that the tail matches. p++; - while (*p != NUL && *p == (char_u)(*tail)) { + while (*p != NUL && *p == *tail) { p++; tail++; } @@ -242,8 +242,8 @@ void do_debug(char_u *cmd) if (*p == NUL) { do_showbacktrace(cmd); } else { - p = (char_u *)skipwhite((char *)p); - do_setdebugtracelevel(p); + p = skipwhite(p); + do_setdebugtracelevel((char_u *)p); } continue; case CMD_UP: @@ -293,7 +293,7 @@ static int get_maxbacktrace_level(void) int maxbacktrace = 0; if (sourcing_name != NULL) { - char *p = (char *)sourcing_name; + char *p = sourcing_name; char *q; while ((q = strstr(p, "..")) != NULL) { p = q + 2; @@ -334,7 +334,7 @@ static void do_showbacktrace(char_u *cmd) if (sourcing_name != NULL) { int i = 0; int max = get_maxbacktrace_level(); - char *cur = (char *)sourcing_name; + char *cur = sourcing_name; while (!got_int) { char *next = strstr(cur, ".."); if (next != NULL) { @@ -475,8 +475,8 @@ static typval_T *eval_expr_no_emsg(struct debuggy *const bp) /// @param gap either &dbg_breakp or &prof_ga static int dbg_parsearg(char_u *arg, garray_T *gap) { - char_u *p = arg; - char_u *q; + char *p = (char *)arg; + char *q; bool here = false; ga_grow(gap, 1); @@ -501,14 +501,14 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) semsg(_(e_invarg2), p); return FAIL; } - p = (char_u *)skipwhite((char *)p + 4); + p = skipwhite(p + 4); // Find optional line number. if (here) { bp->dbg_lnum = curwin->w_cursor.lnum; } else if (gap != &prof_ga && ascii_isdigit(*p)) { - bp->dbg_lnum = getdigits_long(&p, true, 0); - p = (char_u *)skipwhite((char *)p); + bp->dbg_lnum = getdigits_long((char_u **)&p, true, 0); + p = skipwhite(p); } else { bp->dbg_lnum = 0; } @@ -516,17 +516,17 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) // Find the function or file name. Don't accept a function name with (). if ((!here && *p == NUL) || (here && *p != NUL) - || (bp->dbg_type == DBG_FUNC && strstr((char *)p, "()") != NULL)) { + || (bp->dbg_type == DBG_FUNC && strstr(p, "()") != NULL)) { semsg(_(e_invarg2), arg); return FAIL; } if (bp->dbg_type == DBG_FUNC) { - bp->dbg_name = vim_strsave(p); + bp->dbg_name = vim_strsave((char_u *)p); } else if (here) { bp->dbg_name = vim_strsave(curbuf->b_ffname); } else if (bp->dbg_type == DBG_EXPR) { - bp->dbg_name = vim_strsave(p); + bp->dbg_name = vim_strsave((char_u *)p); bp->dbg_val = eval_expr_no_emsg(bp); } else { // Expand the file name in the same way as do_source(). This means @@ -542,10 +542,10 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) return FAIL; } if (*p != '*') { - bp->dbg_name = (char_u *)fix_fname((char *)p); + bp->dbg_name = (char_u *)fix_fname(p); xfree(p); } else { - bp->dbg_name = p; + bp->dbg_name = (char_u *)p; } } @@ -568,7 +568,7 @@ void ex_breakadd(exarg_T *eap) bp->dbg_forceit = eap->forceit; if (bp->dbg_type != DBG_EXPR) { - char_u *pat = file_pat_to_reg_pat(bp->dbg_name, NULL, NULL, false); + char *pat = file_pat_to_reg_pat((char *)bp->dbg_name, NULL, NULL, false); if (pat != NULL) { bp->dbg_prog = vim_regcomp(pat, RE_MAGIC + RE_STRING); xfree(pat); diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 55992f3fae..e8d54d7030 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -744,7 +744,7 @@ static int diff_write_buffer(buf_T *buf, diffin_T *din) for (char_u *s = ml_get_buf(buf, lnum, false); *s != NUL;) { if (diff_flags & DIFF_ICASE) { int c; - char_u cbuf[MB_MAXBYTES + 1]; + char cbuf[MB_MAXBYTES + 1]; if (*s == NL) { c = NUL; @@ -794,7 +794,7 @@ static int diff_write(buf_T *buf, diffin_T *din) // Writing the buffer is an implementation detail of performing the diff, // so it shouldn't update the '[ and '] marks. cmdmod.lockmarks = true; - int r = buf_write(buf, din->din_fname, NULL, + int r = buf_write(buf, (char *)din->din_fname, NULL, (linenr_T)1, buf->b_ml.ml_line_count, NULL, false, false, false, true); cmdmod.lockmarks = save_lockmarks; @@ -1160,7 +1160,7 @@ void ex_diffpatch(exarg_T *eap) { char_u *buf = NULL; win_T *old_curwin = curwin; - char_u *newname = NULL; // name of patched file buffer + char *newname = NULL; // name of patched file buffer char_u *esc_name = NULL; #ifdef UNIX @@ -1178,7 +1178,7 @@ void ex_diffpatch(exarg_T *eap) } // Write the current buffer to "tmp_orig". - if (buf_write(curbuf, tmp_orig, NULL, + if (buf_write(curbuf, (char *)tmp_orig, NULL, (linenr_T)1, curbuf->b_ml.ml_line_count, NULL, false, false, false, true) == FAIL) { goto theend; @@ -1258,7 +1258,7 @@ void ex_diffpatch(exarg_T *eap) emsg(_("E816: Cannot read patch output")); } else { if (curbuf->b_fname != NULL) { - newname = vim_strnsave(curbuf->b_fname, STRLEN(curbuf->b_fname) + 4); + newname = xstrnsave(curbuf->b_fname, STRLEN(curbuf->b_fname) + 4); STRCAT(newname, ".new"); } @@ -1279,7 +1279,7 @@ void ex_diffpatch(exarg_T *eap) if (newname != NULL) { // do a ":file filename.new" on the patched buffer - eap->arg = (char *)newname; + eap->arg = newname; ex_file(eap); // Do filetype detection with the new name. @@ -1982,8 +1982,8 @@ static int diff_cmp(char_u *s1, char_u *s2) return mb_stricmp((const char *)s1, (const char *)s2); } - char_u *p1 = s1; - char_u *p2 = s2; + char *p1 = (char *)s1; + char *p2 = (char *)s2; // Ignore white space changes and possibly ignore case. while (*p1 != NUL && *p2 != NUL) { @@ -1991,11 +1991,11 @@ static int diff_cmp(char_u *s1, char_u *s2) && ascii_iswhite(*p1) && ascii_iswhite(*p2)) || ((diff_flags & DIFF_IWHITEALL) && (ascii_iswhite(*p1) || ascii_iswhite(*p2)))) { - p1 = (char_u *)skipwhite((char *)p1); - p2 = (char_u *)skipwhite((char *)p2); + p1 = skipwhite(p1); + p2 = skipwhite(p2); } else { int l; - if (!diff_equal_char(p1, p2, &l)) { + if (!diff_equal_char((char_u *)p1, (char_u *)p2, &l)) { break; } p1 += l; @@ -2004,8 +2004,8 @@ static int diff_cmp(char_u *s1, char_u *s2) } // Ignore trailing white space. - p1 = (char_u *)skipwhite((char *)p1); - p2 = (char_u *)skipwhite((char *)p2); + p1 = skipwhite(p1); + p2 = skipwhite(p2); if ((*p1 != NUL) || (*p2 != NUL)) { return 1; diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index 84073b352b..1b536bdde6 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -2069,7 +2069,7 @@ void ex_loadkeymap(exarg_T *eap) #define KMAP_LLEN 200 // max length of "to" and "from" together char_u buf[KMAP_LLEN + 11]; - char_u *save_cpo = p_cpo; + char *save_cpo = p_cpo; if (!getline_equal(eap->getline, eap->cookie, getsourceline)) { emsg(_("E105: Using :loadkeymap not in a sourced file")); @@ -2083,17 +2083,17 @@ void ex_loadkeymap(exarg_T *eap) ga_init(&curbuf->b_kmap_ga, (int)sizeof(kmap_T), 20); // Set 'cpoptions' to "C" to avoid line continuation. - p_cpo = (char_u *)"C"; + p_cpo = "C"; // Get each line of the sourced file, break at the end. for (;;) { - char_u *line = eap->getline(0, eap->cookie, 0, true); + char *line = eap->getline(0, eap->cookie, 0, true); if (line == NULL) { break; } - char_u *p = (char_u *)skipwhite((char *)line); + char_u *p = (char_u *)skipwhite(line); if ((*p != '"') && (*p != NUL)) { kmap_T *kp = GA_APPEND_VIA_PTR(kmap_T, &curbuf->b_kmap_ga); @@ -2122,7 +2122,7 @@ void ex_loadkeymap(exarg_T *eap) vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s", ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from, ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to); - (void)do_map(0, buf, LANGMAP, false); + (void)do_map(0, buf, MODE_LANGMAP, false); } p_cpo = save_cpo; @@ -2144,22 +2144,22 @@ void keymap_ga_clear(garray_T *kmap_ga) /// Stop using 'keymap'. static void keymap_unload(void) { - char_u buf[KMAP_MAXLEN + 10]; - char_u *save_cpo = p_cpo; + char buf[KMAP_MAXLEN + 10]; + char *save_cpo = p_cpo; if (!(curbuf->b_kmap_state & KEYMAP_LOADED)) { return; } // Set 'cpoptions' to "C" to avoid line continuation. - p_cpo = (char_u *)"C"; + p_cpo = "C"; // clear the ":lmap"s kmap_T *kp = (kmap_T *)curbuf->b_kmap_ga.ga_data; for (int i = 0; i < curbuf->b_kmap_ga.ga_len; i++) { - vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from); - (void)do_map(1, buf, LANGMAP, false); + vim_snprintf(buf, sizeof(buf), "<buffer> %s", kp[i].from); + (void)do_map(1, (char_u *)buf, MODE_LANGMAP, false); } keymap_ga_clear(&curbuf->b_kmap_ga); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 5002ef2710..d7e82729a9 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -29,7 +29,7 @@ #include "nvim/highlight_group.h" #include "nvim/indent.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mark.h" #include "nvim/mbyte.h" @@ -290,7 +290,7 @@ static void insert_enter(InsertState *s) { s->did_backspace = true; s->old_topfill = -1; - s->replaceState = REPLACE; + s->replaceState = MODE_REPLACE; s->cmdchar_todo = s->cmdchar; // Remember whether editing was restarted after CTRL-O did_restart_edit = restart_edit; @@ -335,7 +335,7 @@ static void insert_enter(InsertState *s) int save_state = State; curwin->w_cursor = save_cursor; - State = INSERT; + State = MODE_INSERT; check_cursor_col(); State = save_state; } @@ -377,14 +377,14 @@ static void insert_enter(InsertState *s) } if (s->cmdchar == 'R') { - State = REPLACE; + State = MODE_REPLACE; } else if (s->cmdchar == 'V' || s->cmdchar == 'v') { - State = VREPLACE; - s->replaceState = VREPLACE; + State = MODE_VREPLACE; + s->replaceState = MODE_VREPLACE; orig_line_count = curbuf->b_ml.ml_line_count; vr_lines_changed = 1; } else { - State = INSERT; + State = MODE_INSERT; } may_trigger_modechanged(); @@ -400,13 +400,13 @@ static void insert_enter(InsertState *s) // 'iminsert' value may not reflect what is actually used. It is updated // when hitting <Esc>. if (curbuf->b_p_iminsert == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } setmouse(); clear_showcmd(); // there is no reverse replace mode - revins_on = (State == INSERT && p_ri); + revins_on = (State == MODE_INSERT && p_ri); if (revins_on) { undisplay_dollar(); } @@ -1325,21 +1325,21 @@ normalchar: if (!p_paste) { // Trigger InsertCharPre. - char_u *str = do_insert_char_pre(s->c); - char_u *p; + char *str = (char *)do_insert_char_pre(s->c); + char *p; if (str != NULL) { if (*str != NUL && stop_arrow() != FAIL) { // Insert the new value of v:char literally. for (p = str; *p != NUL; MB_PTR_ADV(p)) { - s->c = utf_ptr2char((char *)p); + s->c = utf_ptr2char(p); if (s->c == CAR || s->c == K_KENTER || s->c == NL) { ins_eol(s->c); } else { ins_char(s->c); } } - AppendToRedobuffLit((char *)str, -1); + AppendToRedobuffLit(str, -1); } xfree(str); s->c = NUL; @@ -1396,7 +1396,7 @@ static void insert_do_complete(InsertState *s) compl_cont_status = 0; } compl_busy = false; - can_si = true; // allow smartindenting + can_si = may_do_si(); // allow smartindenting } static void insert_do_cindent(InsertState *s) @@ -1632,7 +1632,7 @@ void edit_putchar(int c, bool highlight) pc_col = 0; pc_status = PC_STATUS_UNSET; if (curwin->w_p_rl) { - pc_col += curwin->w_grid.Columns - 1 - curwin->w_wcol; + pc_col += curwin->w_grid.cols - 1 - curwin->w_wcol; const int fix_col = grid_fix_col(&curwin->w_grid, pc_col, pc_row); if (fix_col != pc_col) { @@ -1759,7 +1759,7 @@ void display_dollar(colnr_T col) char_u *p = get_cursor_line_ptr(); curwin->w_cursor.col -= utf_head_off(p, p + col); curs_columns(curwin, false); // Recompute w_wrow and w_wcol - if (curwin->w_wcol < curwin->w_grid.Columns) { + if (curwin->w_wcol < curwin->w_grid.cols) { edit_putchar('$', false); dollar_vcol = curwin->w_virtcol; } @@ -1800,7 +1800,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang colnr_T orig_col = 0; // init for GCC char_u *new_line, *orig_line = NULL; // init for GCC - // VREPLACE mode needs to know what the line was like before changing + // MODE_VREPLACE state needs to know what the line was like before changing if (State & VREPLACE_FLAG) { orig_line = vim_strsave(get_cursor_line_ptr()); // Deal with NULL below orig_col = curwin->w_cursor.col; @@ -1848,7 +1848,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang // Avoid being called recursively. if (State & VREPLACE_FLAG) { - State = INSERT; + State = MODE_INSERT; } shift_line(type == INDENT_DEC, round, 1, call_changed_bytes); State = save_State; @@ -1873,7 +1873,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang insstart_less = MAXCOL; } new_cursor_col += curwin->w_cursor.col; - } else if (!(State & INSERT)) { + } else if (!(State & MODE_INSERT)) { new_cursor_col = curwin->w_cursor.col; } else { /* @@ -1933,7 +1933,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang /* * May have to adjust the start of the insert. */ - if (State & INSERT) { + if (State & MODE_INSERT) { if (curwin->w_cursor.lnum == Insstart.lnum && Insstart.col != 0) { if ((int)Insstart.col <= insstart_less) { Insstart.col = 0; @@ -1948,13 +1948,11 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } - /* - * For REPLACE mode, may have to fix the replace stack, if it's possible. - * If the number of characters before the cursor decreased, need to pop a - * few characters from the replace stack. - * If the number of characters before the cursor increased, need to push a - * few NULs onto the replace stack. - */ + // For MODE_REPLACE state, may have to fix the replace stack, if it's + // possible. If the number of characters before the cursor decreased, need + // to pop a few characters from the replace stack. + // If the number of characters before the cursor increased, need to push a + // few NULs onto the replace stack. if (REPLACE_NORMAL(State) && start_col >= 0) { while (start_col > (int)curwin->w_cursor.col) { replace_join(0); // remove a NUL from the replace stack @@ -1970,11 +1968,9 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } - /* - * For VREPLACE mode, we also have to fix the replace stack. In this case - * it is always possible because we backspace over the whole line and then - * put it back again the way we wanted it. - */ + // For MODE_VREPLACE state, we also have to fix the replace stack. In this + // case it is always possible because we backspace over the whole line and + // then put it back again the way we wanted it. if (State & VREPLACE_FLAG) { // Save new line new_line = vim_strsave(get_cursor_line_ptr()); @@ -2009,11 +2005,9 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } -/* - * Truncate the space at the end of a line. This is to be used only in an - * insert mode. It handles fixing the replace stack for REPLACE and VREPLACE - * modes. - */ +/// Truncate the space at the end of a line. This is to be used only in an +/// insert mode. It handles fixing the replace stack for MODE_REPLACE and +/// MODE_VREPLACE modes. void truncate_spaces(char_u *line) { int i; @@ -2027,12 +2021,10 @@ void truncate_spaces(char_u *line) line[i + 1] = NUL; } -/* - * Backspace the cursor until the given column. Handles REPLACE and VREPLACE - * modes correctly. May also be used when not in insert mode at all. - * Will attempt not to go before "col" even when there is a composing - * character. - */ +/// Backspace the cursor until the given column. Handles MODE_REPLACE and +/// MODE_VREPLACE modes correctly. May also be used when not in insert mode at +/// all. Will attempt not to go before "col" even when there is a composing +/// character. void backspace_until_column(int col) { while ((int)curwin->w_cursor.col > col) { @@ -2743,7 +2735,7 @@ static bool pum_wanted(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { // "completeopt" must contain "menu" or "menuone" - return vim_strchr(p_cot, 'm') != NULL; + return vim_strchr((char *)p_cot, 'm') != NULL; } /// Check that there are two or more matches to be shown in the popup menu. @@ -2991,11 +2983,11 @@ static void ins_compl_dictionaries(char_u *dict_start, char_u *pat, int flags, i size_t len = STRLEN(pat_esc) + 10; ptr = xmalloc(len); vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc); - regmatch.regprog = vim_regcomp(ptr, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)ptr, RE_MAGIC); xfree(pat_esc); xfree(ptr); } else { - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp((char *)pat, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { goto theend; } @@ -3015,7 +3007,7 @@ static void ins_compl_dictionaries(char_u *dict_start, char_u *pat, int flags, i copy_option_part(&dict, buf, LSIZE, ","); if (!thesaurus && STRCMP(buf, "spell") == 0) { count = -1; - } else if (vim_strchr(buf, '`') != NULL + } else if (vim_strchr((char *)buf, '`') != NULL || expand_wildcards(1, &buf, &count, &files, EW_FILE|EW_SILENT) != OK) { count = 0; @@ -3513,11 +3505,11 @@ static void ins_compl_addleader(int c) return; } if ((cc = utf_char2len(c)) > 1) { - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; utf_char2bytes(c, (char *)buf); buf[cc] = NUL; - ins_char_bytes(buf, (size_t)cc); + ins_char_bytes((char_u *)buf, (size_t)cc); } else { ins_char(c); } @@ -4260,9 +4252,8 @@ static int ins_compl_get_exp(pos_T *ini) // Remember the first match so that the loop stops when we // wrap and come back there a second time. set_match_pos = true; - } else if (vim_strchr((char_u *)"buwU", *e_cpt) != NULL - && (ins_buf = - ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf) { + } else if (vim_strchr("buwU", *e_cpt) != NULL + && (ins_buf = ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf) { // Scan a buffer, but not the current one. if (ins_buf->b_ml.ml_mfp != NULL) { // loaded buffer compl_started = true; @@ -4276,7 +4267,7 @@ static int ins_compl_get_exp(pos_T *ini) continue; } type = CTRL_X_DICTIONARY; - dict = ins_buf->b_fname; + dict = (char_u *)ins_buf->b_fname; dict_f = DICT_EXACT; } msg_hist_off = true; // reset in msg_trunc_attr() @@ -4284,7 +4275,7 @@ static int ins_compl_get_exp(pos_T *ini) ins_buf->b_fname == NULL ? buf_spname(ins_buf) : ins_buf->b_sfname == NULL - ? ins_buf->b_fname + ? (char_u *)ins_buf->b_fname : ins_buf->b_sfname); (void)msg_trunc_attr((char *)IObuff, true, HL_ATTR(HLF_R)); } else if (*e_cpt == NUL) { @@ -5641,7 +5632,7 @@ int get_literal(bool no_simplify) // character for i_CTRL-V_digit. break; } - if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1) { + if ((State & MODE_CMDLINE) == 0 && MB_BYTE2LEN_CHECK(nc) == 1) { add_to_showcmd(nc); } if (nc == 'x' || nc == 'X') { @@ -5784,21 +5775,19 @@ void insertchar(int c, int flags, int second_indent) const int textwidth = comp_textwidth(force_format); const bool fo_ins_blank = has_format_option(FO_INS_BLANK); - /* - * Try to break the line in two or more pieces when: - * - Always do this if we have been called to do formatting only. - * - Always do this when 'formatoptions' has the 'a' flag and the line - * ends in white space. - * - Otherwise: - * - Don't do this if inserting a blank - * - Don't do this if an existing character is being replaced, unless - * we're in VREPLACE mode. - * - Do this if the cursor is not on the line where insert started - * or - 'formatoptions' doesn't have 'l' or the line was not too long - * before the insert. - * - 'formatoptions' doesn't have 'b' or a blank was inserted at or - * before 'textwidth' - */ + // Try to break the line in two or more pieces when: + // - Always do this if we have been called to do formatting only. + // - Always do this when 'formatoptions' has the 'a' flag and the line + // ends in white space. + // - Otherwise: + // - Don't do this if inserting a blank + // - Don't do this if an existing character is being replaced, unless + // we're in MODE_VREPLACE state. + // - Do this if the cursor is not on the line where insert started + // or - 'formatoptions' doesn't have 'l' or the line was not too long + // before the insert. + // - 'formatoptions' doesn't have 'b' or a blank was inserted at or + // before 'textwidth' if (textwidth > 0 && (force_format || (!ascii_iswhite(c) @@ -5843,7 +5832,7 @@ void insertchar(int c, int flags, int second_indent) * comment leader. First, check what comment leader we can find. */ i = get_leader_len(line = get_cursor_line_ptr(), &p, false, true); - if (i > 0 && vim_strchr(p, COM_MIDDLE) != NULL) { // Just checking + if (i > 0 && vim_strchr((char *)p, COM_MIDDLE) != NULL) { // Just checking // Skip middle-comment string while (*p && p[-1] != ':') { // find end of middle flags p++; @@ -5949,11 +5938,11 @@ void insertchar(int c, int flags, int second_indent) int cc; if ((cc = utf_char2len(c)) > 1) { - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; utf_char2bytes(c, (char *)buf); buf[cc] = NUL; - ins_char_bytes(buf, (size_t)cc); + ins_char_bytes((char_u *)buf, (size_t)cc); AppendCharToRedobuff(c); } else { ins_char(c); @@ -6248,11 +6237,9 @@ static void internal_format(int textwidth, int second_indent, int flags, int for // Going to break the line, remove any "$" now. undisplay_dollar(); - /* - * Offset between cursor position and line break is used by replace - * stack functions. VREPLACE does not use this, and backspaces - * over the text instead. - */ + // Offset between cursor position and line break is used by replace + // stack functions. MODE_VREPLACE does not use this, and backspaces + // over the text instead. if (State & VREPLACE_FLAG) { orig_col = startcol; // Will start backspacing from here } else { @@ -6274,10 +6261,8 @@ static void internal_format(int textwidth, int second_indent, int flags, int for } if (State & VREPLACE_FLAG) { - /* - * In VREPLACE mode, we will backspace over the text to be - * wrapped, so save a copy now to put on the next line. - */ + // In MODE_VREPLACE state, we will backspace over the text to be + // wrapped, so save a copy now to put on the next line. saved_text = vim_strsave(get_cursor_pos_ptr()); curwin->w_cursor.col = orig_col; saved_text[startcol] = NUL; @@ -6349,10 +6334,8 @@ static void internal_format(int textwidth, int second_indent, int flags, int for } if (State & VREPLACE_FLAG) { - /* - * In VREPLACE mode we have backspaced over the text to be - * moved, now we re-insert it into the new line. - */ + // In MODE_VREPLACE state we have backspaced over the text to be + // moved, now we re-insert it into the new line. ins_bytes(saved_text); xfree(saved_text); } else { @@ -6787,13 +6770,8 @@ static void stop_insert(pos_T *end_insert_pos, int esc, int nomove) // <C-S-Right> may have started Visual mode, adjust the position for // deleted characters. - if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum) { - int len = (int)STRLEN(get_cursor_line_ptr()); - - if (VIsual.col > len) { - VIsual.col = len; - VIsual.coladd = 0; - } + if (VIsual_active) { + check_visual_pos(); } } } @@ -6856,7 +6834,7 @@ char_u *add_char2buf(int c, char_u *s) char_u temp[MB_MAXBYTES + 1]; const int len = utf_char2bytes(c, (char *)temp); for (int i = 0; i < len; i++) { - c = temp[i]; + c = (uint8_t)temp[i]; // Need to escape K_SPECIAL like in the typeahead buffer. if (c == K_SPECIAL) { *s++ = K_SPECIAL; @@ -7021,7 +6999,7 @@ int cursor_up(long n, int upd_topline) // If we entered a fold, move to the beginning, unless in // Insert mode or when 'foldopen' contains "all": it will open // in a moment. - if (n > 0 || !((State & INSERT) || (fdo_flags & FDO_ALL))) { + if (n > 0 || !((State & MODE_INSERT) || (fdo_flags & FDO_ALL))) { (void)hasFolding(lnum, &lnum, NULL); } } @@ -7293,16 +7271,14 @@ static void replace_join(int off) } } -/* - * Pop bytes from the replace stack until a NUL is found, and insert them - * before the cursor. Can only be used in REPLACE or VREPLACE mode. - */ +/// Pop bytes from the replace stack until a NUL is found, and insert them +/// before the cursor. Can only be used in MODE_REPLACE or MODE_VREPLACE state. static void replace_pop_ins(void) { int cc; int oldState = State; - State = NORMAL; // don't want REPLACE here + State = MODE_NORMAL; // don't want MODE_REPLACE here while ((cc = replace_pop()) > 0) { mb_replace_pop_ins(cc); dec_cursor(); @@ -7598,7 +7574,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty) // make up some named keys <o>, <O>, <e>, <0>, <>>, <<>, <*>, // <:> and <!> so that people can re-indent on o, O, e, 0, <, // >, *, : and ! keys if they really really want to. - if (vim_strchr((char_u *)"<>!*oOe0:", look[1]) != NULL + if (vim_strchr("<>!*oOe0:", look[1]) != NULL && keytyped == look[1]) { return true; } @@ -7625,7 +7601,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty) } else { icase = false; } - p = vim_strchr(look, ','); + p = (char_u *)vim_strchr((char *)look, ','); if (p == NULL) { p = look + STRLEN(look); } @@ -7950,14 +7926,14 @@ static void ins_ctrl_g(void) */ static void ins_ctrl_hat(void) { - if (map_to_exists_mode("", LANGMAP, false)) { + if (map_to_exists_mode("", MODE_LANGMAP, false)) { // ":lmap" mappings exists, Toggle use of ":lmap" mappings. - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { curbuf->b_p_iminsert = B_IMODE_NONE; - State &= ~LANGMAP; + State &= ~MODE_LANGMAP; } else { curbuf->b_p_iminsert = B_IMODE_LMAP; - State |= LANGMAP; + State |= MODE_LANGMAP; } } set_iminsert_global(); @@ -8064,7 +8040,7 @@ static bool ins_esc(long *count, int cmdchar, bool nomove) } - State = NORMAL; + State = MODE_NORMAL; may_trigger_modechanged(); // need to position cursor again when on a TAB if (gchar_cursor() == TAB) { @@ -8097,7 +8073,7 @@ static void ins_ctrl_(void) } } p_ri = !p_ri; - revins_on = (State == INSERT && p_ri); + revins_on = (State == MODE_INSERT && p_ri); if (revins_on) { revins_scol = curwin->w_cursor.col; revins_legal++; @@ -8161,13 +8137,13 @@ static bool ins_start_select(int c) static void ins_insert(int replaceState) { set_vim_var_string(VV_INSERTMODE, ((State & REPLACE_FLAG) ? "i" : - replaceState == VREPLACE ? "v" : + replaceState == MODE_VREPLACE ? "v" : "r"), 1); ins_apply_autocmds(EVENT_INSERTCHANGE); if (State & REPLACE_FLAG) { - State = INSERT | (State & LANGMAP); + State = MODE_INSERT | (State & MODE_LANGMAP); } else { - State = replaceState | (State & LANGMAP); + State = replaceState | (State & MODE_LANGMAP); } may_trigger_modechanged(); AppendCharToRedobuff(K_INS); @@ -8405,23 +8381,17 @@ static bool ins_bs(int c, int mode, int *inserted_space_p) dec_cursor(); } - /* - * In REPLACE mode we have to put back the text that was replaced - * by the NL. On the replace stack is first a NUL-terminated - * sequence of characters that were deleted and then the - * characters that NL replaced. - */ + // In MODE_REPLACE mode we have to put back the text that was + // replaced by the NL. On the replace stack is first a + // NUL-terminated sequence of characters that were deleted and then + // the characters that NL replaced. if (State & REPLACE_FLAG) { - /* - * Do the next ins_char() in NORMAL state, to - * prevent ins_char() from replacing characters and - * avoiding showmatch(). - */ + // Do the next ins_char() in MODE_NORMAL state, to + // prevent ins_char() from replacing characters and + // avoiding showmatch(). oldState = State; - State = NORMAL; - /* - * restore characters (blanks) deleted after cursor - */ + State = MODE_NORMAL; + // restore characters (blanks) deleted after cursor while (cc > 0) { save_col = curwin->w_cursor.col; mb_replace_pop_ins(cc); @@ -8721,7 +8691,7 @@ static void ins_left(void) revins_legal++; } revins_chars++; - } else if (vim_strchr(p_ww, '[') != NULL && curwin->w_cursor.lnum > 1) { + } else if (vim_strchr((char *)p_ww, '[') != NULL && curwin->w_cursor.lnum > 1) { // if 'whichwrap' set for cursor in insert mode may go to previous line. // always break undo when moving upwards/downwards, else undo may break start_arrow(&tpos); @@ -8814,7 +8784,7 @@ static void ins_right(void) if (revins_chars) { revins_chars--; } - } else if (vim_strchr(p_ww, ']') != NULL + } else if (vim_strchr((char *)p_ww, ']') != NULL && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { // if 'whichwrap' set for cursor in insert mode, may move the // cursor to the next line @@ -9008,11 +8978,9 @@ static bool ins_tab(void) curbuf->b_p_vts_array); } - /* - * Insert the first space with ins_char(). It will delete one char in - * replace mode. Insert the rest with ins_str(); it will not delete any - * chars. For VREPLACE mode, we use ins_char() for all characters. - */ + // Insert the first space with ins_char(). It will delete one char in + // replace mode. Insert the rest with ins_str(); it will not delete any + // chars. For MODE_VREPLACE state, we use ins_char() for all characters. ins_char(' '); while (--temp > 0) { if (State & VREPLACE_FLAG) { @@ -9040,10 +9008,8 @@ static bool ins_tab(void) int change_col = -1; int save_list = curwin->w_p_list; - /* - * Get the current line. For VREPLACE mode, don't make real changes - * yet, just work on a copy of the line. - */ + // Get the current line. For MODE_VREPLACE state, don't make real + // changes yet, just work on a copy of the line. if (State & VREPLACE_FLAG) { pos = curwin->w_cursor; cursor = &pos; @@ -9136,11 +9102,9 @@ static bool ins_tab(void) } cursor->col -= i; - /* - * In VREPLACE mode, we haven't changed anything yet. Do it now by - * backspacing over the changed spacing and then inserting the new - * spacing. - */ + // In MODE_VREPLACE state, we haven't changed anything yet. Do it + // now by backspacing over the changed spacing and then inserting + // the new spacing. if (State & VREPLACE_FLAG) { // Backspace from real cursor to change_col backspace_until_column(change_col); @@ -9183,12 +9147,10 @@ static bool ins_eol(int c) replace_push(NUL); } - /* - * In VREPLACE mode, a NL replaces the rest of the line, and starts - * replacing the next line, so we push all of the characters left on the - * line onto the replace stack. This is not done here though, it is done - * in open_line(). - */ + // In MODE_VREPLACE state, a NL replaces the rest of the line, and starts + // replacing the next line, so we push all of the characters left on the + // line onto the replace stack. This is not done here though, it is done + // in open_line(). // Put cursor on NUL if on the last char and coladd is 1 (happens after // CTRL-O). @@ -9376,10 +9338,8 @@ static void ins_try_si(int c) /* * do some very smart indenting when entering '{' or '}' */ - if (((did_si || can_si_back) && c == '{') || (can_si && c == '}')) { - /* - * for '}' set indent equal to indent of line containing matching '{' - */ + if (((did_si || can_si_back) && c == '{') || (can_si && c == '}' && inindent(0))) { + // for '}' set indent equal to indent of line containing matching '{' if (c == '}' && (pos = findmatch(NULL, '{')) != NULL) { old_pos = curwin->w_cursor; /* @@ -9435,7 +9395,7 @@ static void ins_try_si(int c) /* * set indent of '#' always to 0 */ - if (curwin->w_cursor.col > 0 && can_si && c == '#') { + if (curwin->w_cursor.col > 0 && can_si && c == '#' && inindent(0)) { // remember current indent for next line old_indent = get_indent(); (void)set_indent(0, SIN_CHANGED); @@ -9492,7 +9452,7 @@ static char_u *do_insert_char_pre(int c) // character. Only use it when changed, otherwise continue with the // original character to avoid breaking autoindent. if (STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0) { - res = vim_strsave(get_vim_var_str(VV_CHAR)); + res = vim_strsave((char_u *)get_vim_var_str(VV_CHAR)); } } diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 01f913dd70..641dcae55e 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -1327,7 +1327,7 @@ static list_T *heredoc_get(exarg_T *eap, char *cmd) int mi = 0; int ti = 0; - char *theline = (char *)eap->getline(NUL, eap->cookie, 0, false); + char *theline = eap->getline(NUL, eap->cookie, 0, false); if (theline == NULL) { semsg(_("E990: Missing end marker '%s'"), marker); break; @@ -1407,7 +1407,7 @@ static void ex_let_const(exarg_T *eap, const bool is_const) argend--; } expr = skipwhite(argend); - if (*expr != '=' && !((vim_strchr((char_u *)"+-*/%.", *expr) != NULL + if (*expr != '=' && !((vim_strchr("+-*/%.", *expr) != NULL && expr[1] == '=') || STRNCMP(expr, "..=", 3) == 0)) { // ":let" without "=": list variables if (*arg == '[') { @@ -1443,7 +1443,7 @@ static void ex_let_const(exarg_T *eap, const bool is_const) op[0] = '='; op[1] = NUL; if (*expr != '=') { - if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL) { + if (vim_strchr("+-*/%.", *expr) != NULL) { op[0] = *expr; // +=, -=, *=, /=, %= or .= if (expr[0] == '.' && expr[1] == '.') { // ..= expr++; @@ -1809,10 +1809,10 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo if (len == 0) { semsg(_(e_invarg2), name - 1); } else { - if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (op != NULL && vim_strchr("+-*/%", *op) != NULL) { semsg(_(e_letwrong), op); } else if (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(arg)) == NULL) { + && vim_strchr(endchars, *skipwhite(arg)) == NULL) { emsg(_(e_letunexp)); } else if (!check_secure()) { const char c1 = name[len]; @@ -1855,7 +1855,7 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo char *const p = (char *)find_option_end((const char **)&arg, &opt_flags); if (p == NULL || (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(p)) == NULL)) { + && vim_strchr(endchars, *skipwhite(p)) == NULL)) { emsg(_(e_letunexp)); } else { int opt_type; @@ -1914,10 +1914,10 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo return NULL; } arg++; - if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (op != NULL && vim_strchr("+-*/%", *op) != NULL) { semsg(_(e_letwrong), op); } else if (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(arg + 1)) == NULL) { + && vim_strchr(endchars, *skipwhite(arg + 1)) == NULL) { emsg(_(e_letunexp)); } else { char *s; @@ -1949,7 +1949,7 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo char *const p = get_lval(arg, tv, &lv, false, false, 0, FNE_CHECK_START); if (p != NULL && lv.ll_name != NULL) { - if (endchars != NULL && vim_strchr((char_u *)endchars, *skipwhite(p)) == NULL) { + if (endchars != NULL && vim_strchr(endchars, *skipwhite(p)) == NULL) { emsg(_(e_letunexp)); } else { set_var_lval(&lv, p, tv, copy, is_const, op); @@ -2752,7 +2752,7 @@ void set_context_for_expression(expand_T *xp, char *arg, cmdidx_T cmdidx) break; } else if ((c == '<' || c == '#') && xp->xp_context == EXPAND_FUNCTIONS - && vim_strchr((char_u *)xp->xp_pattern, '(') == NULL) { + && vim_strchr(xp->xp_pattern, '(') == NULL) { // Function name can start with "<SNR>" and contain '#'. break; } else if (cmdidx != CMD_let || got_eq) { @@ -3170,7 +3170,7 @@ char *cat_prefix_varname(int prefix, const char *name) /// Function given to ExpandGeneric() to obtain the list of user defined /// (global/buffer/window/built-in) variable names. -char_u *get_user_var_name(expand_T *xp, int idx) +char *get_user_var_name(expand_T *xp, int idx) { static size_t gdone; static size_t bdone; @@ -3195,9 +3195,9 @@ char_u *get_user_var_name(expand_T *xp, int idx) ++hi; } if (STRNCMP("g:", xp->xp_pattern, 2) == 0) { - return (char_u *)cat_prefix_varname('g', (char *)hi->hi_key); + return cat_prefix_varname('g', (char *)hi->hi_key); } - return hi->hi_key; + return (char *)hi->hi_key; } // b: variables @@ -3211,7 +3211,7 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('b', (char *)hi->hi_key); + return cat_prefix_varname('b', (char *)hi->hi_key); } // w: variables @@ -3225,7 +3225,7 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('w', (char *)hi->hi_key); + return cat_prefix_varname('w', (char *)hi->hi_key); } // t: variables @@ -3239,12 +3239,12 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('t', (char *)hi->hi_key); + return cat_prefix_varname('t', (char *)hi->hi_key); } // v: variables if (vidx < ARRAY_SIZE(vimvars)) { - return (char_u *)cat_prefix_varname('v', vimvars[vidx++].vv_name); + return cat_prefix_varname('v', vimvars[vidx++].vv_name); } XFREE_CLEAR(varnamebuf); @@ -3263,15 +3263,15 @@ int pattern_match(char *pat, char *text, bool ic) regmatch_T regmatch; // avoid 'l' flag in 'cpoptions' - char *save_cpo = (char *)p_cpo; - p_cpo = (char_u *)""; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + char *save_cpo = p_cpo; + p_cpo = ""; + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { regmatch.rm_ic = ic; matches = vim_regexec_nl(®match, (char_u *)text, (colnr_T)0); vim_regfree(regmatch.regprog); } - p_cpo = (char_u *)save_cpo; + p_cpo = save_cpo; return matches; } @@ -4057,7 +4057,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) case '7': case '8': case '9': { - char *p = (char *)skipdigits((char_u *)(*arg) + 1); + char *p = skipdigits(*arg + 1); int get_float = false; // We accept a float when the format matches @@ -4067,7 +4067,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) // ":let vers = 1.2.3" doesn't fail. if (!want_string && p[0] == '.' && ascii_isdigit(p[1])) { get_float = true; - p = (char *)skipdigits((char_u *)p + 2); + p = skipdigits(p + 2); if (*p == 'e' || *p == 'E') { ++p; if (*p == '-' || *p == '+') { @@ -4076,7 +4076,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) if (!ascii_isdigit(*p)) { get_float = false; } else { - p = (char *)skipdigits((char_u *)p + 1); + p = skipdigits(p + 1); } } if (ASCII_ISALPHA(*p) || *p == '.') { @@ -5872,7 +5872,7 @@ static int get_env_tv(char **arg, typval_T *rettv, int evaluate) xfree(string); // Next try expanding things like $VIM and ${HOME}. - string = (char *)expand_env_save((char_u *)name - 1); + string = expand_env_save(name - 1); if (string != NULL && *string == '$') { XFREE_CLEAR(string); } @@ -6141,7 +6141,7 @@ void common_function(typval_T *argvars, typval_T *rettv, bool is_funcref, FunPtr use_string = true; } - if ((use_string && vim_strchr((char_u *)s, AUTOLOAD_CHAR) == NULL) || is_funcref) { + if ((use_string && vim_strchr(s, AUTOLOAD_CHAR) == NULL) || is_funcref) { name = s; trans_name = (char *)trans_function_name((char_u **)&name, false, TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD @@ -6405,7 +6405,7 @@ dict_T *get_win_info(win_T *wp, int16_t tpnr, int16_t winnr) tv_dict_add_nr(dict, S_LEN("winrow"), wp->w_winrow + 1); tv_dict_add_nr(dict, S_LEN("topline"), wp->w_topline); tv_dict_add_nr(dict, S_LEN("botline"), wp->w_botline - 1); - tv_dict_add_nr(dict, S_LEN("winbar"), 0); + tv_dict_add_nr(dict, S_LEN("winbar"), wp->w_winbar_height); tv_dict_add_nr(dict, S_LEN("width"), wp->w_width); tv_dict_add_nr(dict, S_LEN("bufnr"), wp->w_buffer->b_fnum); tv_dict_add_nr(dict, S_LEN("wincol"), wp->w_wincol + 1); @@ -6865,8 +6865,8 @@ void screenchar_adjust_grid(ScreenGrid **grid, int *row, int *col) // have its own buffer, this should just read from it instead. msg_scroll_flush(); if (msg_grid.chars && msg_grid.comp_index > 0 && *row >= msg_grid.comp_row - && *row < (msg_grid.Rows + msg_grid.comp_row) - && *col < msg_grid.Columns) { + && *row < (msg_grid.rows + msg_grid.comp_row) + && *col < msg_grid.cols) { *grid = &msg_grid; *row -= msg_grid.comp_row; } @@ -7958,7 +7958,7 @@ int get_id_len(const char **const arg) // slice "[n:]". Also "xx:" is not a namespace. len = (int)(p - *arg); if (len > 1 - || (len == 1 && vim_strchr((char_u *)namespace_char, **arg) == NULL)) { + || (len == 1 && vim_strchr(namespace_char, **arg) == NULL)) { break; } } @@ -8089,7 +8089,7 @@ const char *find_name_end(const char *arg, const char **expr_start, const char * // slice "[n:]". Also "xx:" is not a namespace. But {ns}: is. len = (int)(p - arg); if ((len > 1 && p[-1] != '}') - || (len == 1 && vim_strchr((char_u *)namespace_char, *arg) == NULL)) { + || (len == 1 && vim_strchr(namespace_char, *arg) == NULL)) { break; } } @@ -8206,9 +8206,10 @@ varnumber_T get_vim_var_nr(int idx) FUNC_ATTR_PURE /// Get string v: variable value. Uses a static buffer, can only be used once. /// If the String variable has never been set, return an empty string. /// Never returns NULL; -char_u *get_vim_var_str(int idx) FUNC_ATTR_PURE FUNC_ATTR_NONNULL_RET +char *get_vim_var_str(int idx) + FUNC_ATTR_PURE FUNC_ATTR_NONNULL_RET { - return (char_u *)tv_get_string(&vimvars[idx].vv_tv); + return (char *)tv_get_string(&vimvars[idx].vv_tv); } /// Get List v: variable value. Caller must take care of reference count when @@ -9278,7 +9279,7 @@ bool var_check_func_name(const char *const name, const bool new_var) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT { // Allow for w: b: s: and t:. - if (!(vim_strchr((char_u *)"wbst", name[0]) != NULL && name[1] == ':') + if (!(vim_strchr("wbst", name[0]) != NULL && name[1] == ':') && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') ? name[2] : name[0])) { semsg(_("E704: Funcref variable name must start with a capital: %s"), name); @@ -10109,7 +10110,7 @@ repeat: || (*fnamep)[1] == NUL) #endif && !(tilde_file && (*fnamep)[1] == NUL)) { - *fnamep = (char *)expand_env_save((char_u *)(*fnamep)); + *fnamep = expand_env_save(*fnamep); xfree(*bufp); // free any allocated file name *bufp = *fnamep; if (*fnamep == NULL) { @@ -10145,9 +10146,6 @@ repeat: *fnamep = xstrnsave(*fnamep, STRLEN(*fnamep) + 2); xfree(*bufp); // free any allocated file name *bufp = *fnamep; - if (*fnamep == NULL) { - return -1; - } add_pathsep(*fnamep); } } @@ -10165,7 +10163,7 @@ repeat: // Need full path first (use expand_env() to remove a "~/") if (!has_fullname && !has_homerelative) { if (**fnamep == '~') { - p = pbuf = (char *)expand_env_save((char_u *)(*fnamep)); + p = pbuf = expand_env_save(*fnamep); } else { p = pbuf = FullName_save(*fnamep, false); } @@ -10217,7 +10215,7 @@ repeat: } } - tail = (char *)path_tail((char_u *)(*fnamep)); + tail = path_tail(*fnamep); *fnamelen = STRLEN(*fnamep); // ":h" - head, remove "/file_name", can be repeated @@ -10327,12 +10325,12 @@ repeat: sep = (char_u)(*s++); if (sep) { // find end of pattern - p = (char *)vim_strchr((char_u *)s, sep); + p = vim_strchr(s, sep); if (p != NULL) { char *const pat = xstrnsave(s, p - s); s = p + 1; // find end of substitution - p = (char *)vim_strchr((char_u *)s, sep); + p = vim_strchr(s, sep); if (p != NULL) { char *const sub = xstrnsave(s, p - s); char *const str = xstrnsave(*fnamep, *fnamelen); @@ -10391,15 +10389,15 @@ char *do_string_sub(char *str, char *pat, char *sub, typval_T *expr, char *flags char *zero_width = NULL; // Make 'cpoptions' empty, so that the 'l' flag doesn't work here - save_cpo = (char *)p_cpo; - p_cpo = empty_option; + save_cpo = p_cpo; + p_cpo = (char *)empty_option; ga_init(&ga, 1, 200); do_all = (flags[0] == 'g'); regmatch.rm_ic = p_ic; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { tail = str; end = str + STRLEN(str); @@ -10451,8 +10449,8 @@ char *do_string_sub(char *str, char *pat, char *sub, typval_T *expr, char *flags char *ret = xstrdup(ga.ga_data == NULL ? str : ga.ga_data); ga_clear(&ga); - if (p_cpo == empty_option) { - p_cpo = (char_u *)save_cpo; + if ((char_u *)p_cpo == empty_option) { + p_cpo = save_cpo; } else { // Darn, evaluating {sub} expression or {expr} changed the value. free_string_option((char_u *)save_cpo); diff --git a/src/nvim/eval/executor.c b/src/nvim/eval/executor.c index c08b7b1b2d..3e66150180 100644 --- a/src/nvim/eval/executor.c +++ b/src/nvim/eval/executor.c @@ -63,7 +63,7 @@ int eexe_mod_op(typval_T *const tv1, const typval_T *const tv2, const char *cons if (tv2->v_type == VAR_LIST) { break; } - if (vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (vim_strchr("+-*/%", *op) != NULL) { // nr += nr or nr -= nr, nr *= nr, nr /= nr, nr %= nr varnumber_T n = tv_get_number(tv1); if (tv2->v_type == VAR_FLOAT) { diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index e2f456e399..62fe2033af 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -80,9 +80,6 @@ typedef enum { kSomeMatchStrPos, ///< Data for matchstrpos(). } SomeMatchType; -KHASH_MAP_INIT_STR(functions, VimLFuncDef) - - #ifdef INCLUDE_GENERATED_DECLARATIONS # include "eval/funcs.c.generated.h" @@ -116,7 +113,7 @@ static va_list dummy_ap; /// Function given to ExpandGeneric() to obtain the list of internal /// or user defined function names. -char_u *get_function_name(expand_T *xp, int idx) +char *get_function_name(expand_T *xp, int idx) { static int intidx = -1; char_u *name; @@ -125,23 +122,20 @@ char_u *get_function_name(expand_T *xp, int idx) intidx = -1; } if (intidx < 0) { - name = get_user_func_name(xp, idx); + name = (char_u *)get_user_func_name(xp, idx); if (name != NULL) { if (*name != NUL && *name != '<' && STRNCMP("g:", xp->xp_pattern, 2) == 0) { - return (char_u *)cat_prefix_varname('g', (char *)name); + return cat_prefix_varname('g', (char *)name); } - return name; + return (char *)name; } } - while ((size_t)++intidx < ARRAY_SIZE(functions) - && functions[intidx].name[0] == '\0') {} - if ((size_t)intidx >= ARRAY_SIZE(functions)) { + const char *const key = functions[++intidx].name; + if (!key) { return NULL; } - - const char *const key = functions[intidx].name; const size_t key_len = strlen(key); memcpy(IObuff, key, key_len); IObuff[key_len] = '('; @@ -151,12 +145,12 @@ char_u *get_function_name(expand_T *xp, int idx) } else { IObuff[key_len + 1] = NUL; } - return IObuff; + return (char *)IObuff; } /// Function given to ExpandGeneric() to obtain the list of internal or /// user defined variable or function names. -char_u *get_expr_name(expand_T *xp, int idx) +char *get_expr_name(expand_T *xp, int idx) { static int intidx = -1; char_u *name; @@ -165,9 +159,9 @@ char_u *get_expr_name(expand_T *xp, int idx) intidx = -1; } if (intidx < 0) { - name = get_function_name(xp, idx); + name = (char_u *)get_function_name(xp, idx); if (name != NULL) { - return name; + return (char *)name; } } return get_user_var_name(xp, ++intidx); @@ -178,18 +172,19 @@ char_u *get_expr_name(expand_T *xp, int idx) /// @param[in] name Name of the function. /// /// @return pointer to the function definition or NULL if not found. -const VimLFuncDef *find_internal_func(const char *const name) +const EvalFuncDef *find_internal_func(const char *const name) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE FUNC_ATTR_NONNULL_ALL { size_t len = strlen(name); - return find_internal_func_gperf(name, len); + int index = find_internal_func_hash(name, len); + return index >= 0 ? &functions[index] : NULL; } int call_internal_func(const char_u *const fname, const int argcount, typval_T *const argvars, typval_T *const rettv) FUNC_ATTR_NONNULL_ALL { - const VimLFuncDef *const fdef = find_internal_func((const char *)fname); + const EvalFuncDef *const fdef = find_internal_func((const char *)fname); if (fdef == NULL) { return ERROR_UNKNOWN; } else if (argcount < fdef->min_argc) { @@ -207,7 +202,7 @@ int call_internal_method(const char_u *const fname, const int argcount, typval_T typval_T *const rettv, typval_T *const basetv) FUNC_ATTR_NONNULL_ALL { - const VimLFuncDef *const fdef = find_internal_func((const char *)fname); + const EvalFuncDef *const fdef = find_internal_func((const char *)fname); if (fdef == NULL) { return ERROR_UNKNOWN; } else if (fdef->base_arg == BASE_NONE) { @@ -490,9 +485,7 @@ static buf_T *find_buffer(typval_T *avar) * buffer, these don't use the full path. */ FOR_ALL_BUFFERS(bp) { if (bp->b_fname != NULL - && (path_with_url((char *)bp->b_fname) - || bt_nofile(bp) - ) + && (path_with_url(bp->b_fname) || bt_nofile(bp)) && STRCMP(bp->b_fname, avar->vval.v_string) == 0) { buf = bp; break; @@ -562,7 +555,7 @@ static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr) buf = tv_get_buf_from_arg(&argvars[0]); } if (buf != NULL && buf->b_fname != NULL) { - rettv->vval.v_string = xstrdup((char *)buf->b_fname); + rettv->vval.v_string = xstrdup(buf->b_fname); } } @@ -643,7 +636,7 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only) { char_u *name = (char_u *)tv->vval.v_string; int save_magic; - char_u *save_cpo; + char *save_cpo; buf_T *buf; if (tv->v_type == VAR_NUMBER) { @@ -663,7 +656,7 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only) save_magic = p_magic; p_magic = TRUE; save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), true, false, curtab_only)); @@ -1064,7 +1057,7 @@ static void f_col(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "complete()" function static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { emsg(_("E785: complete() can only be used in Insert mode")); return; } @@ -1931,7 +1924,7 @@ typedef struct { const listitem_T *li; } GetListLineCookie; -static char_u *get_list_line(int c, void *cookie, int indent, bool do_concat) +static char *get_list_line(int c, void *cookie, int indent, bool do_concat) { GetListLineCookie *const p = (GetListLineCookie *)cookie; @@ -1942,7 +1935,7 @@ static char_u *get_list_line(int c, void *cookie, int indent, bool do_concat) char buf[NUMBUFLEN]; const char *const s = tv_get_string_buf_chk(TV_LIST_ITEM_TV(item), buf); p->li = TV_LIST_ITEM_NEXT(p->l, item); - return (char_u *)(s == NULL ? NULL : xstrdup(s)); + return s == NULL ? NULL : xstrdup(s); } static void execute_common(typval_T *argvars, typval_T *rettv, FunPtr fptr, int arg_off) @@ -2071,7 +2064,7 @@ static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr) n = true; } else { // Try expanding things like $VIM and ${HOME}. - char_u *const exp = expand_env_save((char_u *)p); + char *const exp = expand_env_save((char *)p); if (exp != NULL && *exp != '$') { n = true; } @@ -2562,7 +2555,7 @@ static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr) foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART); foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND); - dashes = get_vim_var_str(VV_FOLDDASHES); + dashes = (char_u *)get_vim_var_str(VV_FOLDDASHES); if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count) { // Find first non-empty line in the fold. for (lnum = foldstart; lnum < foldend; lnum++) { @@ -3082,7 +3075,7 @@ static void f_getcharstr(typval_T *argvars, typval_T *rettv, FunPtr fptr) getchar_common(argvars, rettv); if (rettv->v_type == VAR_NUMBER) { - char_u temp[7]; // mbyte-char: 6, NUL: 1 + char temp[7]; // mbyte-char: 6, NUL: 1 const varnumber_T n = rettv->vval.v_number; int i = 0; @@ -3092,7 +3085,7 @@ static void f_getcharstr(typval_T *argvars, typval_T *rettv, FunPtr fptr) assert(i < 7); temp[i++] = NUL; rettv->v_type = VAR_STRING; - rettv->vval.v_string = (char *)vim_strsave(temp); + rettv->vval.v_string = xstrdup(temp); } } @@ -3395,7 +3388,7 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv, FunPtr fptr) FALLTHROUGH; case kCdScopeGlobal: if (globaldir) { // `globaldir` is not always set. - from = globaldir; + from = (char_u *)globaldir; break; } FALLTHROUGH; // In global directory, just need to get OS CWD. @@ -3618,8 +3611,8 @@ static void f_getmousepos(typval_T *argvars, typval_T *rettv, FunPtr fptr) // necessary for a top border since `row` starts at -1 in that case. if (row < height + wp->w_border_adj[2]) { winid = wp->handle; - winrow = row + 1 + wp->w_border_adj[0]; // Adjust by 1 for top border - wincol = col + 1 + wp->w_border_adj[3]; // Adjust by 1 for left border + winrow = row + 1 + wp->w_winrow_off; // Adjust by 1 for top border + wincol = col + 1 + wp->w_wincol_off; // Adjust by 1 for left border if (row >= 0 && row < wp->w_height && col >= 0 && col < wp->w_width) { (void)mouse_comp_pos(wp, &row, &col, &lnum); col = vcol2col(wp, lnum, col); @@ -3677,7 +3670,7 @@ static int getreg_get_regname(typval_T *argvars) } } else { // Default to v:register - strregname = get_vim_var_str(VV_REG); + strregname = (char_u *)get_vim_var_str(VV_REG); } return *strregname == 0 ? '"' : *strregname; @@ -4152,8 +4145,7 @@ static void f_glob2regpat(typval_T *argvars, typval_T *rettv, FunPtr fptr) const char *const pat = tv_get_string_chk(&argvars[0]); // NULL on type error rettv->v_type = VAR_STRING; - rettv->vval.v_string = - (char *)((pat == NULL) ? NULL : file_pat_to_reg_pat((char_u *)pat, NULL, NULL, false)); + rettv->vval.v_string = (pat == NULL) ? NULL : file_pat_to_reg_pat(pat, NULL, NULL, false); } /// "has()" function @@ -5101,7 +5093,7 @@ static dict_T *create_environment(const dictitem_T *job_env, const bool clear_en } // Set $NVIM (in the child process) to v:servername. #3118 - char *nvim_addr = (char *)get_vim_var_str(VV_SEND_SERVER); + char *nvim_addr = get_vim_var_str(VV_SEND_SERVER); if (nvim_addr[0] != '\0') { dictitem_T *dv = tv_dict_find(env, S_LEN("NVIM")); if (dv) { @@ -5646,7 +5638,7 @@ static void f_list2str(typval_T *argvars, typval_T *rettv, FunPtr fptr) } ga_init(&ga, 1, 80); - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; TV_LIST_ITER_CONST(l, li, { buf[utf_char2bytes(tv_get_number(TV_LIST_ITEM_TV(li)), (char *)buf)] = NUL; @@ -5666,7 +5658,7 @@ static void f_localtime(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) { - char_u *keys_buf = NULL; + char *keys_buf = NULL; char_u *alt_keys_buf = NULL; bool did_simplify = false; char_u *rhs; @@ -5682,7 +5674,7 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; - char_u *keys = (char_u *)tv_get_string(&argvars[0]); + char *keys = (char *)tv_get_string(&argvars[0]); if (*keys == NUL) { return; } @@ -5707,14 +5699,14 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) mode = get_map_mode((char **)&which, 0); char_u *keys_simplified - = (char_u *)replace_termcodes((char *)keys, - STRLEN(keys), (char **)&keys_buf, flags, &did_simplify, + = (char_u *)replace_termcodes(keys, + STRLEN(keys), &keys_buf, flags, &did_simplify, CPO_TO_CPO_FLAGS); rhs = check_map(keys_simplified, mode, exact, false, abbr, &mp, &buffer_local, &rhs_lua); if (did_simplify) { // When the lhs is being simplified the not-simplified keys are // preferred for printing, like in do_map(). - (void)replace_termcodes((char *)keys, + (void)replace_termcodes(keys, STRLEN(keys), (char **)&alt_keys_buf, flags | REPTERM_NO_SIMPLIFY, NULL, CPO_TO_CPO_FLAGS); @@ -5785,7 +5777,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, long len = 0; char_u *expr = NULL; regmatch_T regmatch; - char_u *save_cpo; + char *save_cpo; long start = 0; long nth = 1; colnr_T startcol = 0; @@ -5797,7 +5789,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; rettv->vval.v_number = -1; switch (type) { @@ -5878,7 +5870,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, } } - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -6100,7 +6092,7 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - if (*path_tail((char_u *)dir) == NUL) { + if (*path_tail(dir) == NUL) { // Remove trailing slashes. *path_tail_with_sep((char_u *)dir) = NUL; } @@ -7402,11 +7394,11 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) q[-1] = NUL; } - q = (char *)path_tail((char_u *)p); + q = path_tail(p); if (q > p && *q == NUL) { // Ignore trailing path separator. q[-1] = NUL; - q = (char *)path_tail((char_u *)p); + q = path_tail(p); } if (q > p && !path_is_absolute((const char_u *)buf)) { // Symlink is relative to directory of argument. Replace the @@ -7414,7 +7406,7 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) const size_t p_len = strlen(p); const size_t buf_len = strlen(buf); p = xrealloc(p, p_len + buf_len + 1); - memcpy(path_tail((char_u *)p), buf, buf_len + 1); + memcpy(path_tail(p), buf, buf_len + 1); } else { xfree(p); p = xstrdup(buf); @@ -7524,15 +7516,15 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - const char_u *func_name; + const char *func_name; partial_T *partial = NULL; if (argvars[1].v_type == VAR_FUNC) { - func_name = (char_u *)argvars[1].vval.v_string; + func_name = argvars[1].vval.v_string; } else if (argvars[1].v_type == VAR_PARTIAL) { partial = argvars[1].vval.v_partial; - func_name = (char_u *)partial_name(partial); + func_name = partial_name(partial); } else { - func_name = (const char_u *)tv_get_string(&argvars[1]); + func_name = tv_get_string(&argvars[1]); } if (*func_name == NUL) { return; // type error or empty name @@ -7881,7 +7873,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr) } sctx_T save_current_sctx; - uint8_t *save_sourcing_name, *save_autocmd_fname, *save_autocmd_match; + char *save_sourcing_name, *save_autocmd_fname, *save_autocmd_match; linenr_T save_sourcing_lnum; int save_autocmd_bufnr; funccal_entry_T funccal_entry; @@ -8055,8 +8047,8 @@ static void f_screenattr(typval_T *argvars, typval_T *rettv, FunPtr fptr) int row = (int)tv_get_number_chk(&argvars[0], NULL) - 1; int col = (int)tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { c = -1; } else { ScreenGrid *grid = &default_grid; @@ -8073,8 +8065,8 @@ static void f_screenchar(typval_T *argvars, typval_T *rettv, FunPtr fptr) int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { c = -1; } else { ScreenGrid *grid = &default_grid; @@ -8089,8 +8081,8 @@ static void f_screenchars(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { tv_list_alloc_ret(rettv, 0); return; } @@ -8156,8 +8148,8 @@ static void f_screenstring(typval_T *argvars, typval_T *rettv, FunPtr fptr) rettv->v_type = VAR_STRING; int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { return; } ScreenGrid *grid = &default_grid; @@ -8311,7 +8303,7 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir long time_limit) FUNC_ATTR_NONNULL_ARG(1, 2, 3) { - char_u *save_cpo; + char *save_cpo; char_u *pat, *pat2 = NULL, *pat3 = NULL; long retval = 0; pos_T pos; @@ -8327,7 +8319,7 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = empty_option; + p_cpo = (char *)empty_option; // Set the time limit, if there is one. tm = profile_setlimit(time_limit); @@ -8451,11 +8443,11 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir xfree(pat2); xfree(pat3); - if (p_cpo == empty_option) { + if ((char_u *)p_cpo == empty_option) { p_cpo = save_cpo; } else { // Darn, evaluating the {skip} expression changed the value. - free_string_option(save_cpo); + free_string_option((char_u *)save_cpo); } return retval; @@ -9716,26 +9708,24 @@ static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - if (*curwin->w_s->b_p_spl != NUL) { - const char *const str = tv_get_string(&argvars[0]); - if (argvars[1].v_type != VAR_UNKNOWN) { - maxcount = tv_get_number_chk(&argvars[1], &typeerr); - if (maxcount <= 0) { + const char *const str = tv_get_string(&argvars[0]); + if (argvars[1].v_type != VAR_UNKNOWN) { + maxcount = tv_get_number_chk(&argvars[1], &typeerr); + if (maxcount <= 0) { + goto f_spellsuggest_return; + } + if (argvars[2].v_type != VAR_UNKNOWN) { + need_capital = tv_get_number_chk(&argvars[2], &typeerr); + if (typeerr) { goto f_spellsuggest_return; } - if (argvars[2].v_type != VAR_UNKNOWN) { - need_capital = tv_get_number_chk(&argvars[2], &typeerr); - if (typeerr) { - goto f_spellsuggest_return; - } - } - } else { - maxcount = 25; } - - spell_suggest_list(&ga, (char_u *)str, maxcount, need_capital, false); + } else { + maxcount = 25; } + spell_suggest_list(&ga, (char_u *)str, maxcount, need_capital, false); + f_spellsuggest_return: tv_list_alloc_ret(rettv, (ptrdiff_t)ga.ga_len); for (int i = 0; i < ga.ga_len; i++) { @@ -9748,7 +9738,7 @@ f_spellsuggest_return: static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - char_u *save_cpo; + char *save_cpo; int match; colnr_T col = 0; bool keepempty = false; @@ -9756,7 +9746,7 @@ static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; const char *str = tv_get_string(&argvars[0]); const char *pat = NULL; @@ -9781,7 +9771,7 @@ static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) } regmatch_T regmatch = { - .regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING), + .regprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING), .startp = { NULL }, .endp = { NULL }, .rm_ic = false, @@ -9842,6 +9832,10 @@ static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr) rettv->vval.v_string = get_xdg_home(kXDGDataHome); } else if (strequal(p, "cache")) { rettv->vval.v_string = get_xdg_home(kXDGCacheHome); + } else if (strequal(p, "state")) { + rettv->vval.v_string = get_xdg_home(kXDGStateHome); + } else if (strequal(p, "log")) { + rettv->vval.v_string = get_xdg_home(kXDGStateHome); } else if (strequal(p, "config_dirs")) { get_xdg_var_list(kXDGConfigDirs, rettv); } else if (strequal(p, "data_dirs")) { @@ -9854,13 +9848,13 @@ static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "str2float()" function static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - char_u *p = (char_u *)skipwhite(tv_get_string(&argvars[0])); + char *p = skipwhite(tv_get_string(&argvars[0])); bool isneg = (*p == '-'); if (*p == '+' || *p == '-') { - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); } - (void)string2float((char *)p, &rettv->vval.v_float); + (void)string2float(p, &rettv->vval.v_float); if (isneg) { rettv->vval.v_float *= -1; } @@ -10796,10 +10790,16 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) // "/home/foo/…" => "~/…" size_t len = home_replace(NULL, NameBuff, IObuff, sizeof(IObuff), true); // Trim slash. - if (IObuff[len - 1] == '\\' || IObuff[len - 1] == '/') { + if (len != 1 && (IObuff[len - 1] == '\\' || IObuff[len - 1] == '/')) { IObuff[len - 1] = '\0'; } + if (len == 1 && IObuff[0] == '/') { + // Avoid ambiguity in the URI when CWD is root directory. + IObuff[1] = '.'; + IObuff[2] = '\0'; + } + // Terminal URI: "term://$CWD//$PID:$CMD" snprintf((char *)NameBuff, sizeof(NameBuff), "term://%s//%d:%s", (char *)IObuff, pid, cmd); @@ -11211,7 +11211,7 @@ static void f_visualmode(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "wildmenumode()" function static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - if (wild_menu_showing || ((State & CMDLINE) && pum_visible())) { + if (wild_menu_showing || ((State & MODE_CMDLINE) && pum_visible())) { rettv->vval.v_number = 1; } } diff --git a/src/nvim/eval/funcs.h b/src/nvim/eval/funcs.h index c6a0cb959e..4ab4c8f800 100644 --- a/src/nvim/eval/funcs.h +++ b/src/nvim/eval/funcs.h @@ -9,19 +9,19 @@ typedef void (*FunPtr)(void); /// Prototype of C function that implements VimL function typedef void (*VimLFunc)(typval_T *args, typval_T *rvar, FunPtr data); -/// Special flags for base_arg @see VimLFuncDef +/// Special flags for base_arg @see EvalFuncDef #define BASE_NONE 0 ///< Not a method (no base argument). #define BASE_LAST UINT8_MAX ///< Use the last argument as the method base. /// Structure holding VimL function definition -typedef struct fst { +typedef struct { char *name; ///< Name of the function. uint8_t min_argc; ///< Minimal number of arguments. uint8_t max_argc; ///< Maximal number of arguments. uint8_t base_arg; ///< Method base arg # (1-indexed), BASE_NONE or BASE_LAST. VimLFunc func; ///< Function implementation. FunPtr data; ///< Userdata for function implementation. -} VimLFuncDef; +} EvalFuncDef; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "eval/funcs.h.generated.h" diff --git a/src/nvim/eval/typval_encode.c.h b/src/nvim/eval/typval_encode.c.h index bd23fb4154..8c952473a1 100644 --- a/src/nvim/eval/typval_encode.c.h +++ b/src/nvim/eval/typval_encode.c.h @@ -250,6 +250,8 @@ #include "nvim/func_attr.h" #include "nvim/lib/kvec.h" +// -V::1063 + /// Dummy variable used because some macros need lvalue /// /// Must not be written to, if needed one must check that address of the diff --git a/src/nvim/eval/typval_encode.h b/src/nvim/eval/typval_encode.h index d5cf431870..ed70ba87ec 100644 --- a/src/nvim/eval/typval_encode.h +++ b/src/nvim/eval/typval_encode.h @@ -85,9 +85,7 @@ static inline size_t tv_strlen(const typval_T *const tv) static inline size_t tv_strlen(const typval_T *const tv) { assert(tv->v_type == VAR_STRING); - return (tv->vval.v_string == NULL - ? 0 - : strlen((char *)tv->vval.v_string)); + return (tv->vval.v_string == NULL ? 0 : strlen(tv->vval.v_string)); } /// Code for checking whether container references itself diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index d6a63993c6..e5f48501f7 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -994,7 +994,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett // Don't redraw while executing the function. RedrawingDisabled++; - save_sourcing_name = sourcing_name; + save_sourcing_name = (char_u *)sourcing_name; save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 1; @@ -1014,7 +1014,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett { if (save_sourcing_name != NULL && STRNCMP(save_sourcing_name, "function ", 9) == 0) { - vim_snprintf((char *)sourcing_name, + vim_snprintf(sourcing_name, len, "%s[%" PRId64 "]..", save_sourcing_name, @@ -1022,7 +1022,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett } else { STRCPY(sourcing_name, "function "); } - cat_func_name(sourcing_name + STRLEN(sourcing_name), fp); + cat_func_name((char_u *)sourcing_name + STRLEN(sourcing_name), fp); if (p_verbose >= 12) { ++no_wait_return; @@ -1175,7 +1175,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett } xfree(sourcing_name); - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; current_sctx = save_current_sctx; if (do_profiling_yes) { @@ -1536,7 +1536,7 @@ int call_func(const char *funcname, int len, typval_T *rettv, int argcount_in, t // Trigger FuncUndefined event, may load the function. if (fp == NULL - && apply_autocmds(EVENT_FUNCUNDEFINED, rfname, rfname, true, NULL) + && apply_autocmds(EVENT_FUNCUNDEFINED, (char *)rfname, (char *)rfname, true, NULL) && !aborting()) { // executed an autocommand, search for the function again fp = find_func(rfname); @@ -1967,7 +1967,7 @@ void ex_function(exarg_T *eap) c = *p; *p = NUL; - regmatch.regprog = vim_regcomp((char_u *)eap->arg + 1, RE_MAGIC); + regmatch.regprog = vim_regcomp(eap->arg + 1, RE_MAGIC); *p = c; if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -2009,7 +2009,7 @@ void ex_function(exarg_T *eap) // g:func global function name, same as "func" p = (char_u *)eap->arg; name = trans_function_name(&p, eap->skip, TFN_NO_AUTOLOAD, &fudi, NULL); - paren = (vim_strchr(p, '(') != NULL); + paren = (vim_strchr((char *)p, '(') != NULL); if (name == NULL && (fudi.fd_dict == NULL || !paren) && !eap->skip) { /* * Return on an invalid expression in braces, unless the expression @@ -2090,8 +2090,8 @@ void ex_function(exarg_T *eap) goto ret_free; } // attempt to continue by skipping some text - if (vim_strchr(p, '(') != NULL) { - p = vim_strchr(p, '('); + if (vim_strchr((char *)p, '(') != NULL) { + p = (char_u *)vim_strchr((char *)p, '('); } } p = (char_u *)skipwhite((char *)p + 1); @@ -2207,7 +2207,7 @@ void ex_function(exarg_T *eap) if (line_arg != NULL) { // Use eap->arg, split up in parts by line breaks. theline = line_arg; - p = vim_strchr(theline, '\n'); + p = (char_u *)vim_strchr((char *)theline, '\n'); if (p == NULL) { line_arg += STRLEN(line_arg); } else { @@ -2219,7 +2219,7 @@ void ex_function(exarg_T *eap) if (eap->getline == NULL) { theline = getcmdline(':', 0L, indent, do_concat); } else { - theline = eap->getline(':', eap->cookie, indent, do_concat); + theline = (char_u *)eap->getline(':', eap->cookie, indent, do_concat); } line_to_free = theline; } @@ -2369,7 +2369,7 @@ void ex_function(exarg_T *eap) // and ":let [a, b] =<< [trim] EOF" arg = (char_u *)skipwhite((char *)skiptowhite(p)); if (*arg == '[') { - arg = vim_strchr(arg, ']'); + arg = (char_u *)vim_strchr((char *)arg, ']'); } if (arg != NULL) { arg = (char_u *)skipwhite((char *)skiptowhite(arg)); @@ -2490,7 +2490,7 @@ void ex_function(exarg_T *eap) } if (fp == NULL) { - if (fudi.fd_dict == NULL && vim_strchr(name, AUTOLOAD_CHAR) != NULL) { + if (fudi.fd_dict == NULL && vim_strchr((char *)name, AUTOLOAD_CHAR) != NULL) { int slen, plen; char_u *scriptname; @@ -2498,7 +2498,7 @@ void ex_function(exarg_T *eap) int j = FAIL; if (sourcing_name != NULL) { scriptname = (char_u *)autoload_name((const char *)name, STRLEN(name)); - p = vim_strchr(scriptname, '/'); + p = (char_u *)vim_strchr((char *)scriptname, '/'); plen = (int)STRLEN(p); slen = (int)STRLEN(sourcing_name); if (slen > plen && FNAMECMP(p, @@ -2644,7 +2644,7 @@ bool function_exists(const char *const name, bool no_deref) /// Function given to ExpandGeneric() to obtain the list of user defined /// function names. -char_u *get_user_func_name(expand_T *xp, int idx) +char *get_user_func_name(expand_T *xp, int idx) { static size_t done; static hashitem_T *hi; @@ -2666,11 +2666,11 @@ char_u *get_user_func_name(expand_T *xp, int idx) if ((fp->uf_flags & FC_DICT) || STRNCMP(fp->uf_name, "<lambda>", 8) == 0) { - return (char_u *)""; // don't show dict and lambda functions + return ""; // don't show dict and lambda functions } if (STRLEN(fp->uf_name) + 4 >= IOSIZE) { - return fp->uf_name; // Prevent overflow. + return (char *)fp->uf_name; // Prevent overflow. } cat_func_name(IObuff, fp); @@ -2680,7 +2680,7 @@ char_u *get_user_func_name(expand_T *xp, int idx) STRCAT(IObuff, ")"); } } - return IObuff; + return (char *)IObuff; } return NULL; } @@ -3137,7 +3137,7 @@ char_u *get_return_cmd(void *rettv) /// Called by do_cmdline() to get the next line. /// /// @return allocated string, or NULL for end of function. -char_u *get_func_line(int c, void *cookie, int indent, bool do_concat) +char *get_func_line(int c, void *cookie, int indent, bool do_concat) { funccall_T *fcp = (funccall_T *)cookie; ufunc_T *fp = fcp->func; @@ -3184,7 +3184,7 @@ char_u *get_func_line(int c, void *cookie, int indent, bool do_concat) fcp->dbg_tick = debug_tick; } - return retval; + return (char *)retval; } /// @return TRUE if the currently active function should be ended, because a diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c index 89fced59c5..d4e20e2f66 100644 --- a/src/nvim/event/loop.c +++ b/src/nvim/event/loop.c @@ -143,7 +143,7 @@ bool loop_close(Loop *loop, bool wait) while (true) { // Run the loop to tickle close-callbacks (which should then free memory). // Use UV_RUN_NOWAIT to avoid a hang. #11820 - uv_run(&loop->uv, didstop ? UV_RUN_DEFAULT : UV_RUN_NOWAIT); + uv_run(&loop->uv, didstop ? UV_RUN_DEFAULT : UV_RUN_NOWAIT); // -V547 if ((uv_loop_close(&loop->uv) != UV_EBUSY) || !wait) { break; } diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c index 060b432b18..1722f0ee1f 100644 --- a/src/nvim/event/socket.c +++ b/src/nvim/event/socket.c @@ -124,7 +124,7 @@ int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb) if (result == UV_EACCES) { // Libuv converts ENOENT to EACCES for Windows compatibility, but if // the parent directory does not exist, ENOENT would be more accurate. - *path_tail((char_u *)watcher->addr) = NUL; + *path_tail(watcher->addr) = NUL; if (!os_path_exists((char_u *)watcher->addr)) { result = UV_ENOENT; } diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 3be8deead1..8369db7de1 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -350,7 +350,7 @@ static int linelen(int *has_tab) len = linetabsize((char_u *)line); // Check for embedded TAB. if (has_tab != NULL) { - *has_tab = vim_strchr((char_u *)first, TAB) != NULL; + *has_tab = vim_strchr(first, TAB) != NULL; } *last = save; @@ -529,9 +529,9 @@ void ex_sort(exarg_T *eap) emsg(_(e_noprevre)); goto sortend; } - regmatch.regprog = vim_regcomp(last_search_pat(), RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)last_search_pat(), RE_MAGIC); } else { - regmatch.regprog = vim_regcomp((char_u *)p + 1, RE_MAGIC); + regmatch.regprog = vim_regcomp(p + 1, RE_MAGIC); } if (regmatch.regprog == NULL) { goto sortend; @@ -1341,7 +1341,7 @@ static void do_filter(linenr_T line1, linenr_T line2, exarg_T *eap, char *cmd, b * Vi also doesn't do this and the messages are not very informative. */ no_wait_return++; // don't call wait_return() while busy - if (itmp != NULL && buf_write(curbuf, (char_u *)itmp, NULL, line1, line2, eap, + if (itmp != NULL && buf_write(curbuf, itmp, NULL, line1, line2, eap, false, false, false, true) == FAIL) { msg_putchar('\n'); // Keep message from buf_write(). no_wait_return--; @@ -1386,7 +1386,7 @@ static void do_filter(linenr_T line1, linenr_T line2, exarg_T *eap, char *cmd, b if (do_out) { if (otmp != NULL) { - if (readfile((char_u *)otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, + if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, READ_FILTER, false) != OK) { if (!aborting()) { msg_putchar('\n'); @@ -1718,7 +1718,7 @@ int rename_buffer(char *new_fname) */ fname = (char *)curbuf->b_ffname; sfname = (char *)curbuf->b_sfname; - xfname = (char *)curbuf->b_fname; + xfname = curbuf->b_fname; curbuf->b_ffname = NULL; curbuf->b_sfname = NULL; if (setfname(curbuf, (char_u *)new_fname, NULL, true) == FAIL) { @@ -1858,7 +1858,7 @@ int do_write(exarg_T *eap) if (!other) { ffname = (char *)curbuf->b_ffname; - fname = (char *)curbuf->b_fname; + fname = curbuf->b_fname; // Not writing the whole file is only allowed with '!'. if ((eap->line1 != 1 || eap->line2 != curbuf->b_ml.ml_line_count) @@ -1894,9 +1894,9 @@ int do_write(exarg_T *eap) // under the new name. Must be done before buf_write(), because // if there is no file name and 'cpo' contains 'F', it will set // the file name. - fname = (char *)alt_buf->b_fname; + fname = alt_buf->b_fname; alt_buf->b_fname = curbuf->b_fname; - curbuf->b_fname = (char_u *)fname; + curbuf->b_fname = fname; fname = (char *)alt_buf->b_ffname; alt_buf->b_ffname = curbuf->b_ffname; curbuf->b_ffname = (char_u *)fname; @@ -1930,7 +1930,7 @@ int do_write(exarg_T *eap) } name_was_missing = curbuf->b_ffname == NULL; - retval = buf_write(curbuf, (char_u *)ffname, (char_u *)fname, eap->line1, eap->line2, + retval = buf_write(curbuf, ffname, fname, eap->line1, eap->line2, eap, eap->append, eap->forceit, true, false); // After ":saveas fname" reset 'readonly'. @@ -2096,8 +2096,7 @@ void do_wqall(exarg_T *eap) semsg(_("E141: No file name for buffer %" PRId64), (int64_t)buf->b_fnum); error++; } else if (check_readonly(&eap->forceit, buf) - || check_overwrite(eap, buf, (char *)buf->b_fname, (char *)buf->b_ffname, - false) == FAIL) { + || check_overwrite(eap, buf, buf->b_fname, (char *)buf->b_ffname, false) == FAIL) { error++; } else { bufref_T bufref; @@ -2148,12 +2147,12 @@ static int check_readonly(int *forceit, buf_T *buf) if (buf->b_p_ro) { dialog_msg((char *)buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"), - (char *)buf->b_fname); + buf->b_fname); } else { dialog_msg((char *)buff, _("File permissions of \"%s\" are read-only.\nIt may still be possible to " "write it.\nDo you wish to try?"), - (char *)buf->b_fname); + buf->b_fname); } if (vim_dialog_yesno(VIM_QUESTION, NULL, (char_u *)buff, 2) == VIM_YES) { @@ -2340,7 +2339,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum } else { if (*ffname == NUL) { // re-edit with same file name ffname = (char *)curbuf->b_ffname; - sfname = (char *)curbuf->b_fname; + sfname = curbuf->b_fname; } free_fname = fix_fname(ffname); // may expand to full path name if (free_fname != NULL) { @@ -2491,7 +2490,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum // - If we ended up in the new buffer already, need to skip a few // things, set auto_buf. if (buf->b_fname != NULL) { - new_name = (char *)vim_strsave(buf->b_fname); + new_name = xstrdup(buf->b_fname); } const bufref_T save_au_new_curbuf = au_new_curbuf; set_bufref(&au_new_curbuf, buf); @@ -2641,7 +2640,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum } buf = curbuf; if (buf->b_fname != NULL) { - new_name = (char *)vim_strsave(buf->b_fname); + new_name = (char *)vim_strsave((char_u *)buf->b_fname); } else { new_name = NULL; } @@ -2875,7 +2874,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum redraw_curbuf_later(NOT_VALID); // redraw this buffer later } - if (p_im && (State & INSERT) == 0) { + if (p_im && (State & MODE_INSERT) == 0) { need_start_insertmode = true; } @@ -2939,9 +2938,9 @@ void ex_append(exarg_T *eap) lnum = 0; } - State = INSERT; // behave like in Insert mode + State = MODE_INSERT; // behave like in Insert mode if (curbuf->b_p_iminsert == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } for (;;) { @@ -2961,7 +2960,7 @@ void ex_append(exarg_T *eap) if (eap->nextcmd == NULL || *eap->nextcmd == NUL) { break; } - p = (char *)vim_strchr((char_u *)eap->nextcmd, NL); + p = vim_strchr(eap->nextcmd, NL); if (p == NULL) { p = eap->nextcmd + STRLEN(eap->nextcmd); } @@ -2971,12 +2970,11 @@ void ex_append(exarg_T *eap) } eap->nextcmd = p; } else { - // Set State to avoid the cursor shape to be set to INSERT mode - // when getline() returns. int save_State = State; - State = CMDLINE; - theline = (char *)eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : - NUL, eap->cookie, indent, true); + // Set State to avoid the cursor shape to be set to MODE_INSERT + // state when getline() returns. + State = MODE_CMDLINE; + theline = eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : NUL, eap->cookie, indent, true); State = save_State; } lines_left = Rows - 1; @@ -3024,7 +3022,7 @@ void ex_append(exarg_T *eap) empty = 0; } } - State = NORMAL; + State = MODE_NORMAL; if (eap->forceit) { curbuf->b_p_ai = !curbuf->b_p_ai; @@ -3477,7 +3475,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle int start_nsubs; int save_ma = 0; int save_b_changed = curbuf->b_changed; - bool preview = (State & CMDPREVIEW); + bool preview = (State & MODE_CMDPREVIEW); bool did_save = false; @@ -3494,7 +3492,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle } // new pattern and substitution if (eap->cmd[0] == 's' && *cmd != NUL && !ascii_iswhite(*cmd) - && vim_strchr((char_u *)"0123456789cegriIp|\"", *cmd) == NULL) { + && vim_strchr("0123456789cegriIp|\"", *cmd) == NULL) { // don't accept alphanumeric for separator if (check_regexp_delim(*cmd) == FAIL) { return NULL; @@ -3504,8 +3502,8 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle // "\/sub/" and "\?sub?" use last used search pattern (almost like // //sub/r). "\&sub&" use last substitute pattern (like //sub/). if (*cmd == '\\') { - ++cmd; - if (vim_strchr((char_u *)"/?&", *cmd) == NULL) { + cmd++; + if (vim_strchr("/?&", *cmd) == NULL) { emsg(_(e_backslash)); return NULL; } @@ -3823,10 +3821,10 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle if (subflags.do_ask && !preview) { int typed = 0; - // change State to CONFIRM, so that the mouse works + // change State to MODE_CONFIRM, so that the mouse works // properly int save_State = State; - State = CONFIRM; + State = MODE_CONFIRM; setmouse(); // disable mouse in xterm curwin->w_cursor.col = regmatch.startpos[0].col; @@ -3837,7 +3835,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle // When 'cpoptions' contains "u" don't sync undo when // asking for confirmation. if (vim_strchr(p_cpo, CPO_UNDO) != NULL) { - ++no_u_sync; + no_u_sync++; } /* @@ -3993,7 +3991,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle State = save_State; setmouse(); if (vim_strchr(p_cpo, CPO_UNDO) != NULL) { - --no_u_sync; + no_u_sync--; } if (typed == 'n') { @@ -4579,8 +4577,8 @@ void ex_global(exarg_T *eap) * "\&": use previous substitute pattern. */ if (*cmd == '\\') { - ++cmd; - if (vim_strchr((char_u *)"/?&", *cmd) == NULL) { + cmd++; + if (vim_strchr("/?&", *cmd) == NULL) { emsg(_(e_backslash)); return; } @@ -5114,7 +5112,7 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep // And also "\_$" and "\_^". if (arg[0] == '\\' && ((arg[1] != NUL && arg[2] == NUL) - || (vim_strchr((char_u *)"%_z@", arg[1]) != NULL + || (vim_strchr("%_z@", arg[1]) != NULL && arg[2] != NUL))) { vim_snprintf(d, IOSIZE, "/\\\\%s", arg + 1); // Check for "/\\_$", should be "/\\_\$" @@ -5173,10 +5171,9 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep * ":help i_^_CTRL-D" work. * Insert '-' before and after "CTRL-X" when applicable. */ - if (*s < ' ' || (*s == '^' && s[1] && (ASCII_ISALPHA(s[1]) - || vim_strchr((char_u *) - "?@[\\]^", - s[1]) != NULL))) { + if (*s < ' ' + || (*s == '^' && s[1] + && (ASCII_ISALPHA(s[1]) || vim_strchr("?@[\\]^", s[1]) != NULL))) { if ((char_u *)d > IObuff && d[-1] != '_' && d[-1] != '\\') { *d++ = '_'; // prepend a '_' to make x_CTRL-x } @@ -5360,7 +5357,7 @@ void fix_help_buffer(void) * In the "help.txt" and "help.abx" file, add the locally added help * files. This uses the very first line in the help file. */ - char *const fname = (char *)path_tail(curbuf->b_fname); + char *const fname = path_tail(curbuf->b_fname); if (FNAMECMP(fname, "help.txt") == 0 || (FNAMENCMP(fname, "help.", 5) == 0 && ASCII_ISALPHA(fname[5]) @@ -5413,8 +5410,8 @@ void fix_help_buffer(void) } const char *const f1 = fnames[i1]; const char *const f2 = fnames[i2]; - const char *const t1 = (char *)path_tail((char_u *)f1); - const char *const t2 = (char *)path_tail((char_u *)f2); + const char *const t1 = path_tail(f1); + const char *const t2 = path_tail(f2); const char *const e1 = (char *)STRRCHR(t1, '.'); const char *const e2 = (char *)STRRCHR(t2, '.'); if (e1 == NULL || e2 == NULL) { @@ -5448,7 +5445,7 @@ void fix_help_buffer(void) } vim_fgets(IObuff, IOSIZE, fd); if (IObuff[0] == '*' - && (s = (char *)vim_strchr(IObuff + 1, '*')) + && (s = vim_strchr((char *)IObuff + 1, '*')) != NULL) { TriState this_utf = kNone; // Change tag definition to a @@ -5635,7 +5632,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool } firstline = false; } - p1 = (char *)vim_strchr(IObuff, '*'); // find first '*' + p1 = vim_strchr((char *)IObuff, '*'); // find first '*' while (p1 != NULL) { p2 = strchr((const char *)p1 + 1, '*'); // Find second '*'. if (p2 != NULL && p2 > p1 + 1) { // Skip "*" and "**". @@ -5650,7 +5647,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool // followed by a white character or end-of-line. if (s == p2 && ((char_u *)p1 == IObuff || p1[-1] == ' ' || p1[-1] == '\t') - && (vim_strchr((char_u *)" \t\n\r", s[1]) != NULL + && (vim_strchr(" \t\n\r", s[1]) != NULL || s[1] == '\0')) { *p2 = '\0'; p1++; @@ -5660,7 +5657,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool snprintf(s, s_len, "%s\t%s", p1, fname); // find next '*' - p2 = (char *)vim_strchr((char_u *)p2 + 1, '*'); + p2 = vim_strchr(p2 + 1, '*'); } } p1 = p2; @@ -6050,7 +6047,7 @@ void close_preview_windows(void) /// from undo history. void ex_substitute(exarg_T *eap) { - bool preview = (State & CMDPREVIEW); + bool preview = (State & MODE_CMDPREVIEW); if (*p_icm == NUL || !preview) { // 'inccommand' is disabled close_preview_windows(); (void)do_sub(eap, profile_zero(), true, preview_bufnr); @@ -6203,7 +6200,7 @@ void ex_oldfiles(exarg_T *eap) if (p == NULL) { return; } - char *const s = (char *)expand_env_save((char_u *)p); + char *const s = expand_env_save((char *)p); eap->arg = s; eap->cmdidx = CMD_edit; cmdmod.browse = false; diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index d1dcb28dbd..a6cafb2628 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -200,12 +200,12 @@ static char *pexpand_cmds[] = { /// Function given to ExpandGeneric() to obtain the profile command /// specific expansion. -char_u *get_profile_name(expand_T *xp, int idx) +char *get_profile_name(expand_T *xp, int idx) FUNC_ATTR_PURE { switch (pexpand_what) { case PEXP_SUBCMD: - return (char_u *)pexpand_cmds[idx]; + return pexpand_cmds[idx]; // case PEXP_FUNC: TODO default: return NULL; @@ -554,7 +554,7 @@ void dialog_changed(buf_T *buf, bool checkall) .forceit = false, }; - dialog_msg((char *)buff, _("Save changes to \"%s\"?"), (char *)buf->b_fname); + dialog_msg((char *)buff, _("Save changes to \"%s\"?"), buf->b_fname); if (checkall) { ret = vim_dialog_yesnoallcancel(VIM_QUESTION, NULL, (char_u *)buff, 1); } else { @@ -563,11 +563,7 @@ void dialog_changed(buf_T *buf, bool checkall) if (ret == VIM_YES) { if (buf->b_fname != NULL - && check_overwrite(&ea, - buf, - (char *)buf->b_fname, - (char *)buf->b_ffname, - false) == OK) { + && check_overwrite(&ea, buf, buf->b_fname, (char *)buf->b_ffname, false) == OK) { // didn't hit Cancel (void)buf_write_all(buf, false); } @@ -583,7 +579,7 @@ void dialog_changed(buf_T *buf, bool checkall) set_bufref(&bufref, buf2); if (buf2->b_fname != NULL - && check_overwrite(&ea, buf2, (char *)buf2->b_fname, + && check_overwrite(&ea, buf2, buf2->b_fname, (char *)buf2->b_ffname, false) == OK) { // didn't hit Cancel (void)buf_write_all(buf2, false); @@ -611,7 +607,7 @@ bool dialog_close_terminal(buf_T *buf) char buff[DIALOG_MSG_SIZE]; dialog_msg(buff, _("Close \"%s\"?"), - (buf->b_fname != NULL) ? (char *)buf->b_fname : "?"); + (buf->b_fname != NULL) ? buf->b_fname : "?"); int ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, (char_u *)buff, 1); @@ -738,7 +734,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) : buf->b_fname)) { + buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname)) { save = no_wait_return; no_wait_return = false; wait_return(false); @@ -792,7 +788,7 @@ int buf_write_all(buf_T *buf, int forceit) int retval; buf_T *old_curbuf = curbuf; - retval = (buf_write(buf, buf->b_ffname, buf->b_fname, + retval = (buf_write(buf, (char *)buf->b_ffname, buf->b_fname, (linenr_T)1, buf->b_ml.ml_line_count, NULL, false, forceit, true, false)); if (curbuf != old_curbuf) { @@ -908,7 +904,7 @@ static int do_arglist(char *str, int what, int after, bool will_edit) if (curbuf->b_ffname == NULL) { return FAIL; } - str = (char *)curbuf->b_fname; + str = curbuf->b_fname; arg_escaped = false; } @@ -924,11 +920,11 @@ static int do_arglist(char *str, int what, int after, bool will_edit) regmatch.rm_ic = p_fic; // ignore case when 'fileignorecase' is set for (int i = 0; i < new_ga.ga_len && !got_int; i++) { p = ((char **)new_ga.ga_data)[i]; - p = (char *)file_pat_to_reg_pat((char_u *)p, NULL, NULL, false); + p = file_pat_to_reg_pat(p, NULL, NULL, false); if (p == NULL) { break; } - regmatch.regprog = vim_regcomp((char_u *)p, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { xfree(p); break; @@ -1518,12 +1514,11 @@ void ex_listdo(exarg_T *eap) // buffer was opened while Syntax autocommands were disabled, // need to trigger them now. if (buf == curbuf) { - apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_SYNTAX, (char *)curbuf->b_p_syn, curbuf->b_fname, true, + curbuf); } else { aucmd_prepbuf(&aco, buf); - apply_autocmds(EVENT_SYNTAX, buf->b_p_syn, - buf->b_fname, true, buf); + apply_autocmds(EVENT_SYNTAX, (char *)buf->b_p_syn, buf->b_fname, true, buf); aucmd_restbuf(&aco); } @@ -1571,12 +1566,12 @@ static void alist_add_list(int count, char **files, int after, bool will_edit) // Function given to ExpandGeneric() to obtain the possible arguments of the // argedit and argdelete commands. -char_u *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx >= ARGCOUNT) { return NULL; } - return alist_name(&ARGLIST[idx]); + return (char *)alist_name(&ARGLIST[idx]); } /// ":compiler[!] {name}" @@ -1766,7 +1761,7 @@ typedef struct { /// /// @return pointer to allocated line, or NULL for end-of-file or /// some error. -static char_u *get_str_line(int c, void *cookie, int indent, bool do_concat) +static char *get_str_line(int c, void *cookie, int indent, bool do_concat) { GetStrLineCookie *p = cookie; if (STRLEN(p->buf) <= p->offset) { @@ -1818,16 +1813,16 @@ scriptitem_T *new_script_item(char *const name, scid_T *const sid_out) static int source_using_linegetter(void *cookie, LineGetter fgetline, const char *traceback_name) { - char *save_sourcing_name = (char *)sourcing_name; + char *save_sourcing_name = sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; char sourcing_name_buf[256]; if (save_sourcing_name == NULL) { - sourcing_name = (char_u *)traceback_name; + sourcing_name = (char *)traceback_name; } else { snprintf((char *)sourcing_name_buf, sizeof(sourcing_name_buf), "%s called at %s:%" PRIdLINENR, traceback_name, save_sourcing_name, save_sourcing_lnum); - sourcing_name = (char_u *)sourcing_name_buf; // -V507 reassigned below, before return. + sourcing_name = sourcing_name_buf; // -V507 reassigned below, before return. } sourcing_lnum = 0; @@ -1842,7 +1837,7 @@ static int source_using_linegetter(void *cookie, LineGetter fgetline, const char int retval = do_cmdline(NULL, fgetline, cookie, DOCMD_VERBOSE | DOCMD_NOWAIT | DOCMD_REPEAT); sourcing_lnum = save_sourcing_lnum; - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; current_sctx = save_current_sctx; restore_funccal(); return retval; @@ -1920,7 +1915,7 @@ int do_source(char *fname, int check_other, int is_vimrc) proftime_T wait_start; bool trigger_source_post = false; - p = (char *)expand_env_save((char_u *)fname); + p = expand_env_save(fname); if (p == NULL) { return retval; } @@ -1935,25 +1930,25 @@ int do_source(char *fname, int check_other, int is_vimrc) } // Apply SourceCmd autocommands, they should get the file and source it. - if (has_autocmd(EVENT_SOURCECMD, (char_u *)fname_exp, NULL) - && apply_autocmds(EVENT_SOURCECMD, (char_u *)fname_exp, (char_u *)fname_exp, + if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL) + && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp, false, curbuf)) { retval = aborting() ? FAIL : OK; if (retval == OK) { // Apply SourcePost autocommands. - apply_autocmds(EVENT_SOURCEPOST, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, false, curbuf); } goto theend; } // Apply SourcePre autocommands, they may get the file. - apply_autocmds(EVENT_SOURCEPRE, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, false, curbuf); cookie.fp = fopen_noinh_readbin(fname_exp); if (cookie.fp == NULL && check_other) { // Try again, replacing file name ".vimrc" by "_vimrc" or vice versa, // and ".exrc" by "_exrc" or vice versa. - p = (char *)path_tail((char_u *)fname_exp); + p = path_tail(fname_exp); if ((*p == '.' || *p == '_') && (STRICMP(p + 1, "nvimrc") == 0 || STRICMP(p + 1, "exrc") == 0)) { *p = (*p == '_') ? '.' : '_'; @@ -2014,8 +2009,8 @@ int do_source(char *fname, int check_other, int is_vimrc) cookie.level = ex_nesting_level; // Keep the sourcing name/lnum, for recursive calls. - save_sourcing_name = (char *)sourcing_name; - sourcing_name = (char_u *)fname_exp; + save_sourcing_name = sourcing_name; + sourcing_name = fname_exp; save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 0; @@ -2059,7 +2054,7 @@ int do_source(char *fname, int check_other, int is_vimrc) cookie.conv.vc_type = CONV_NONE; // no conversion // Read the first line so we can check for a UTF-8 BOM. - firstline = getsourceline(0, (void *)&cookie, 0, true); + firstline = (uint8_t *)getsourceline(0, (void *)&cookie, 0, true); if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef && firstline[1] == 0xbb && firstline[2] == 0xbf) { // Found BOM; setup conversion, skip over BOM and recode the line. @@ -2104,7 +2099,7 @@ int do_source(char *fname, int check_other, int is_vimrc) if (got_int) { emsg(_(e_interr)); } - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; if (p_verbose > 1) { verbose_enter(); @@ -2143,7 +2138,7 @@ int do_source(char *fname, int check_other, int is_vimrc) convert_setup(&cookie.conv, NULL, NULL); if (trigger_source_post) { - apply_autocmds(EVENT_SOURCEPOST, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, false, curbuf); } theend: @@ -2302,7 +2297,7 @@ linenr_T get_sourced_lnum(LineGetter fgetline, void *cookie) /// /// @return pointer to the line in allocated memory, or NULL for end-of-file or /// some error. -char_u *getsourceline(int c, void *cookie, int indent, bool do_concat) +char *getsourceline(int c, void *cookie, int indent, bool do_concat) { struct source_cookie *sp = (struct source_cookie *)cookie; char *line; @@ -2382,7 +2377,7 @@ char_u *getsourceline(int c, void *cookie, int indent, bool do_concat) sp->dbg_tick = debug_tick; } - return (char_u *)line; + return line; } static char *get_one_sourceline(struct source_cookie *sp) @@ -2942,36 +2937,36 @@ void free_locales(void) /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":language" command. -char_u *get_lang_arg(expand_T *xp, int idx) +char *get_lang_arg(expand_T *xp, int idx) { if (idx == 0) { - return (char_u *)"messages"; + return "messages"; } if (idx == 1) { - return (char_u *)"ctype"; + return "ctype"; } if (idx == 2) { - return (char_u *)"time"; + return "time"; } if (idx == 3) { - return (char_u *)"collate"; + return "collate"; } init_locales(); if (locales == NULL) { return NULL; } - return (char_u *)locales[idx - 4]; + return locales[idx - 4]; } /// Function given to ExpandGeneric() to obtain the available locales. -char_u *get_locales(expand_T *xp, int idx) +char *get_locales(expand_T *xp, int idx) { init_locales(); if (locales == NULL) { return NULL; } - return (char_u *)locales[idx]; + return locales[idx]; } #endif diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index e4c85fbc9b..d8dd3da9e6 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -121,7 +121,7 @@ struct aucmd_executable_t { #define AUCMD_EXECUTABLE_INIT { .type = CALLABLE_NONE } -typedef char_u *(*LineGetter)(int, void *, int, bool); +typedef char *(*LineGetter)(int, void *, int, bool); /// Structure for command definition. typedef struct cmdname { @@ -175,6 +175,9 @@ enum { /// Arguments used for Ex commands. struct exarg { char *arg; ///< argument of the command + char **args; ///< starting position of command arguments + size_t *arglens; ///< length of command arguments + size_t argc; ///< number of command arguments char *nextcmd; ///< next command (NULL if none) char *cmd; ///< the name of the command (except for :make) char **cmdlinep; ///< pointer to pointer of allocated cmdline diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 316006befd..7506c353dd 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -41,7 +41,7 @@ #include "nvim/highlight_group.h" #include "nvim/if_cscope.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/main.h" #include "nvim/mark.h" @@ -111,7 +111,7 @@ struct loop_cookie { int current_line; // last read line from growarray int repeating; // TRUE when looping a second time // When "repeating" is FALSE use "getline" and "cookie" to get lines - char_u *(*getline)(int, void *, int, bool); + char *(*getline)(int, void *, int, bool); void *cookie; }; @@ -187,7 +187,7 @@ void do_exmode(void) varnumber_T changedtick; exmode_active = true; - State = NORMAL; + State = MODE_NORMAL; may_trigger_modechanged(); // When using ":global /pat/ visual" and then "Q" we return to continue @@ -324,7 +324,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) struct msglist *private_msg_list; // "fgetline" and "cookie" passed to do_one_cmd() - char_u *(*cmd_getline)(int, void *, int, bool); + char *(*cmd_getline)(int, void *, int, bool); void *cmd_cookie; struct loop_cookie cmd_loop_cookie; void *real_cookie; @@ -345,7 +345,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) // here. The value of 200 allows nested function calls, ":source", etc. // Allow 200 or 'maxfuncdepth', whatever is larger. if (call_depth >= 200 && call_depth >= p_mfd) { - emsg(_("E169: Command too recursive")); + emsg(_(e_command_too_recursive)); // When converting to an exception, we do not include the command name // since this is not an error of the specific command. do_errthrow((cstack_T *)NULL, NULL); @@ -372,7 +372,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) breakpoint = func_breakpoint(real_cookie); dbg_tick = func_dbg_tick(real_cookie); } else if (getline_equal(fgetline, cookie, getsourceline)) { - fname = (char *)sourcing_name; + fname = sourcing_name; breakpoint = source_breakpoint(real_cookie); dbg_tick = source_dbg_tick(real_cookie); } @@ -518,10 +518,10 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) msg_didout = true; } if (fgetline == NULL - || (next_cmdline = (char *)fgetline(':', cookie, - cstack.cs_idx < - 0 ? 0 : (cstack.cs_idx + 1) * 2, - true)) == NULL) { + || (next_cmdline = fgetline(':', cookie, + cstack.cs_idx < + 0 ? 0 : (cstack.cs_idx + 1) * 2, + true)) == NULL) { // Don't call wait_return for aborted command line. The NULL // returned for the end of a sourced file or executed function // doesn't do this. @@ -595,7 +595,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) recursive--; // Ignore trailing '|'-separated commands in preview-mode ('inccommand'). - if ((State & CMDPREVIEW) && (flags & DOCMD_PREVIEW)) { + if ((State & MODE_CMDPREVIEW) && (flags & DOCMD_PREVIEW)) { next_cmdline = NULL; } @@ -832,9 +832,9 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) break; } - saved_sourcing_name = (char *)sourcing_name; + saved_sourcing_name = sourcing_name; saved_sourcing_lnum = sourcing_lnum; - sourcing_name = (char_u *)current_exception->throw_name; + sourcing_name = current_exception->throw_name; sourcing_lnum = current_exception->throw_lnum; current_exception->throw_name = NULL; @@ -856,7 +856,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) xfree(p); } xfree(sourcing_name); - sourcing_name = (char_u *)saved_sourcing_name; + sourcing_name = saved_sourcing_name; sourcing_lnum = saved_sourcing_lnum; } else if (got_int || (did_emsg && force_abort)) { // On an interrupt or an aborting error not converted to an exception, @@ -949,7 +949,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) } /// Obtain a line when inside a ":while" or ":for" loop. -static char_u *get_loop_line(int c, void *cookie, int indent, bool do_concat) +static char *get_loop_line(int c, void *cookie, int indent, bool do_concat) { struct loop_cookie *cp = (struct loop_cookie *)cookie; wcmd_T *wp; @@ -963,21 +963,21 @@ static char_u *get_loop_line(int c, void *cookie, int indent, bool do_concat) if (cp->getline == NULL) { line = (char *)getcmdline(c, 0L, indent, do_concat); } else { - line = (char *)cp->getline(c, cp->cookie, indent, do_concat); + line = cp->getline(c, cp->cookie, indent, do_concat); } if (line != NULL) { store_loop_line(cp->lines_gap, line); ++cp->current_line; } - return (char_u *)line; + return line; } KeyTyped = false; cp->current_line++; wp = (wcmd_T *)(cp->lines_gap->ga_data) + cp->current_line; sourcing_lnum = wp->lnum; - return vim_strsave((char_u *)wp->line); + return xstrdup(wp->line); } /// Store a line in "gap" so that a ":while" loop can execute it again. @@ -1218,7 +1218,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 -static void set_cmd_addr_type(exarg_T *eap, char_u *p) +void set_cmd_addr_type(exarg_T *eap, char_u *p) { // ea.addr_type for user commands is set by find_ucmd if (IS_USER_CMDIDX(eap->cmdidx)) { @@ -1239,8 +1239,48 @@ static void set_cmd_addr_type(exarg_T *eap, char_u *p) } } +/// Get default range number for command based on its address type +linenr_T get_cmd_default_range(exarg_T *eap) +{ + switch (eap->addr_type) { + case ADDR_LINES: + case ADDR_OTHER: + // Default is the cursor line number. Avoid using an invalid + // line number though. + return MIN(curwin->w_cursor.lnum, curbuf->b_ml.ml_line_count); + break; + case ADDR_WINDOWS: + return CURRENT_WIN_NR; + break; + case ADDR_ARGUMENTS: + return MIN(curwin->w_arg_idx + 1, ARGCOUNT); + break; + case ADDR_LOADED_BUFFERS: + case ADDR_BUFFERS: + return curbuf->b_fnum; + break; + case ADDR_TABS: + return CURRENT_TAB_NR; + break; + case ADDR_TABS_RELATIVE: + case ADDR_UNSIGNED: + return 1; + break; + case ADDR_QUICKFIX: + return (linenr_T)qf_get_cur_idx(eap); + break; + case ADDR_QUICKFIX_VALID: + return qf_get_cur_valid_idx(eap); + break; + default: + return 0; + // Will give an error later if a range is found. + break; + } +} + /// Set default command range for -range=% based on the addr type of the command -static void set_cmd_default_range(exarg_T *eap) +void set_cmd_dflall_range(exarg_T *eap) { buf_T *buf; @@ -1320,6 +1360,25 @@ static void parse_register(exarg_T *eap) } } +// Change line1 and line2 of Ex command to use count +void set_cmd_count(exarg_T *eap, long count, bool validate) +{ + if (eap->addr_type != ADDR_LINES) { // e.g. :buffer 2, :sleep 3 + eap->line2 = count; + if (eap->addr_count == 0) { + eap->addr_count = 1; + } + } else { + eap->line1 = eap->line2; + eap->line2 += count - 1; + eap->addr_count++; + // Be vi compatible: no error message for out of range. + if (validate && eap->line2 > curbuf->b_ml.ml_line_count) { + eap->line2 = curbuf->b_ml.ml_line_count; + } + } +} + static int parse_count(exarg_T *eap, char **errormsg, bool validate) { // Check for a count. When accepting a EX_BUFNAME, don't use "123foo" as a @@ -1328,7 +1387,7 @@ static int parse_count(exarg_T *eap, char **errormsg, bool validate) long n; if ((eap->argt & EX_COUNT) && ascii_isdigit(*eap->arg) - && (!(eap->argt & EX_BUFNAME) || *(p = (char *)skipdigits((char_u *)eap->arg + 1)) == NUL + && (!(eap->argt & EX_BUFNAME) || *(p = skipdigits(eap->arg + 1)) == NUL || ascii_iswhite(*p))) { n = getdigits_long((char_u **)&eap->arg, false, -1); eap->arg = skipwhite(eap->arg); @@ -1338,25 +1397,19 @@ static int parse_count(exarg_T *eap, char **errormsg, bool validate) } return FAIL; } - if (eap->addr_type != ADDR_LINES) { // e.g. :buffer 2, :sleep 3 - eap->line2 = n; - if (eap->addr_count == 0) { - eap->addr_count = 1; - } - } else { - eap->line1 = eap->line2; - eap->line2 += n - 1; - eap->addr_count++; - // Be vi compatible: no error message for out of range. - if (validate && eap->line2 > curbuf->b_ml.ml_line_count) { - eap->line2 = curbuf->b_ml.ml_line_count; - } - } + set_cmd_count(eap, n, validate); } return OK; } +/// Check if command is not implemented +bool is_cmd_ni(cmdidx_T cmdidx) +{ + return !IS_USER_CMDIDX(cmdidx) && (cmdnames[cmdidx].cmd_func == ex_ni + || cmdnames[cmdidx].cmd_func == ex_script_ni); +} + /// Parse command line and return information about the first command. /// /// @param cmdline Command line string @@ -1394,14 +1447,17 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (eap->save_msg_silent != -1) { cmdinfo->silent = !!msg_silent; msg_silent = eap->save_msg_silent; + eap->save_msg_silent = -1; } if (eap->did_esilent) { cmdinfo->emsg_silent = true; emsg_silent--; + eap->did_esilent = false; } if (eap->did_sandbox) { cmdinfo->sandbox = true; sandbox--; + eap->did_sandbox = false; } if (cmdmod.save_ei != NULL) { cmdinfo->noautocmd = true; @@ -1411,6 +1467,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (eap->verbose_save != -1) { cmdinfo->verbose = p_verbose; p_verbose = eap->verbose_save; + eap->verbose_save = -1; } else { cmdinfo->verbose = -1; } @@ -1424,7 +1481,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (*eap->cmd == '*') { eap->cmd = skipwhite(eap->cmd + 1); } - p = find_command(eap, NULL); + p = find_ex_command(eap, NULL); // Set command address type and parse command range set_cmd_addr_type(eap, (char_u *)p); @@ -1494,7 +1551,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er } // Set default range for command if required if ((eap->argt & EX_DFLALL) && eap->addr_count == 0) { - set_cmd_default_range(eap); + set_cmd_dflall_range(eap); } // Parse register and count @@ -1519,6 +1576,147 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er return true; } +/// Execute an Ex command using parsed command line information. +/// Does not do any validation of the Ex command arguments. +/// +/// @param eap Ex-command arguments +/// @param cmdinfo Command parse information +void execute_cmd(exarg_T *eap, CmdParseInfo *cmdinfo) +{ +#define ERROR(msg) \ + do { \ + emsg(msg); \ + goto end; \ + } while (0) + + char *errormsg = NULL; + cmdmod_T save_cmdmod = cmdmod; + cmdmod = cmdinfo->cmdmod; + + // Apply command modifiers + if (cmdinfo->silent) { + eap->save_msg_silent = msg_silent; + msg_silent++; + } + if (cmdinfo->emsg_silent) { + eap->did_esilent = true; + emsg_silent++; + } + if (cmdinfo->sandbox) { + eap->did_sandbox = true; + sandbox++; + } + if (cmdinfo->noautocmd) { + cmdmod.save_ei = (char *)vim_strsave(p_ei); + set_string_option_direct("ei", -1, (char_u *)"all", OPT_FREE, SID_NONE); + } + if (cmdinfo->verbose != -1) { + eap->verbose_save = p_verbose; + p_verbose = cmdinfo->verbose; + } + + if (!MODIFIABLE(curbuf) && (eap->argt & EX_MODIFY) + // allow :put in terminals + && !(curbuf->terminal && eap->cmdidx == CMD_put)) { + ERROR(_(e_modifiable)); + } + if (text_locked() && !(eap->argt & EX_CMDWIN) + && !IS_USER_CMDIDX(eap->cmdidx)) { + ERROR(_(get_text_locked_msg())); + } + // Disallow editing another buffer when "curbuf->b_ro_locked" is set. + // Do allow ":checktime" (it is postponed). + // Do allow ":edit" (check for an argument later). + // Do allow ":file" with no arguments + if (!(eap->argt & EX_CMDWIN) + && eap->cmdidx != CMD_checktime + && eap->cmdidx != CMD_edit + && !(eap->cmdidx == CMD_file && *eap->arg == NUL) + && !IS_USER_CMDIDX(eap->cmdidx) + && curbuf_locked()) { + ERROR(_(e_cannot_edit_other_buf)); + } + + if (((eap->argt & EX_WHOLEFOLD) || eap->addr_count >= 2) && !global_busy + && eap->addr_type == ADDR_LINES) { + // Put the first line at the start of a closed fold, put the last line + // at the end of a closed fold. + (void)hasFolding(eap->line1, &eap->line1, NULL); + (void)hasFolding(eap->line2, NULL, &eap->line2); + } + + // If filename expansion is enabled, expand filenames + if (cmdinfo->magic.file) { + if (expand_filename(eap, (char_u **)eap->cmdlinep, &errormsg) == FAIL) { + ERROR(errormsg); + } + } + + // Accept buffer name. Cannot be used at the same time with a buffer + // number. Don't do this for a user command. + if ((eap->argt & EX_BUFNAME) && *eap->arg != NUL && eap->addr_count == 0 + && !IS_USER_CMDIDX(eap->cmdidx)) { + if (eap->args == NULL) { + // If argument positions are not specified, search the argument for the buffer name. + // :bdelete, :bwipeout and :bunload take several arguments, separated by spaces: + // find next space (skipping over escaped characters). + // The others take one argument: ignore trailing spaces. + char *p; + + if (eap->cmdidx == CMD_bdelete || eap->cmdidx == CMD_bwipeout + || eap->cmdidx == CMD_bunload) { + p = (char *)skiptowhite_esc((char_u *)eap->arg); + } else { + p = eap->arg + STRLEN(eap->arg); + while (p > eap->arg && ascii_iswhite(p[-1])) { + p--; + } + } + eap->line2 = buflist_findpat((char_u *)eap->arg, (char_u *)p, (eap->argt & EX_BUFUNL) != 0, + false, false); + eap->addr_count = 1; + eap->arg = skipwhite(p); + } else { + // If argument positions are specified, just use the first argument + eap->line2 = buflist_findpat((char_u *)eap->args[0], + (char_u *)(eap->args[0] + eap->arglens[0]), + (eap->argt & EX_BUFUNL) != 0, false, false); + eap->addr_count = 1; + // Shift each argument by 1 + for (size_t i = 0; i < eap->argc - 1; i++) { + eap->args[i] = eap->args[i + 1]; + } + // Make the last argument point to the NUL terminator at the end of string + eap->args[eap->argc - 1] = eap->args[eap->argc - 1] + eap->arglens[eap->argc - 1]; + eap->argc -= 1; + + eap->arg = eap->args[0]; + } + if (eap->line2 < 0) { // failed + goto end; + } + } + + // Execute the command + if (IS_USER_CMDIDX(eap->cmdidx)) { + // Execute a user-defined command. + do_ucmd(eap); + } else { + // Call the function to execute the command. + eap->errmsg = NULL; + (cmdnames[eap->cmdidx].cmd_func)(eap); + if (eap->errmsg != NULL) { + ERROR(_(eap->errmsg)); + } + } +end: + // Undo command modifiers + undo_cmdmod(eap, msg_scroll); + cmdmod = save_cmdmod; + +#undef ERROR +} + /// Execute one Ex command. /// /// If 'sourcing' is TRUE, the command will be included in the error message. @@ -1606,7 +1804,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter if (*ea.cmd == '*') { ea.cmd = skipwhite(ea.cmd + 1); } - p = find_command(&ea, NULL); + p = find_ex_command(&ea, NULL); // Count this line for profiling if skip is TRUE. if (do_profiling == PROF_YES @@ -1728,11 +1926,11 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter ++p; } p = xstrnsave(ea.cmd, (size_t)(p - ea.cmd)); - int ret = apply_autocmds(EVENT_CMDUNDEFINED, (char_u *)p, (char_u *)p, true, NULL); + int ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, true, NULL); xfree(p); // If the autocommands did something and didn't cause an error, try // finding the command again. - p = (ret && !aborting()) ? find_command(&ea, NULL) : ea.cmd; + p = (ret && !aborting()) ? find_ex_command(&ea, NULL) : ea.cmd; } if (p == NULL) { @@ -1759,10 +1957,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter } // set when Not Implemented - const int ni = !IS_USER_CMDIDX(ea.cmdidx) - && (cmdnames[ea.cmdidx].cmd_func == ex_ni - || cmdnames[ea.cmdidx].cmd_func == ex_script_ni); - + const int ni = is_cmd_ni(ea.cmdidx); // Forced commands. if (*p == '!' && ea.cmdidx != CMD_substitute @@ -1976,7 +2171,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter } if ((ea.argt & EX_DFLALL) && ea.addr_count == 0) { - set_cmd_default_range(&ea); + set_cmd_dflall_range(&ea); } // Parse register and count @@ -2358,7 +2553,7 @@ int parse_command_modifiers(exarg_T *eap, char **errormsg, bool skip_only) break; } if (!skip_only) { - cmdmod.filter_regmatch.regprog = vim_regcomp((char_u *)reg_pat, RE_MAGIC); + cmdmod.filter_regmatch.regprog = vim_regcomp(reg_pat, RE_MAGIC); if (cmdmod.filter_regmatch.regprog == NULL) { break; } @@ -2543,7 +2738,6 @@ static void undo_cmdmod(const exarg_T *eap, int save_msg_scroll) } } - /// Parse the address range, if any, in "eap". /// May set the last search pattern, unless "silent" is true. /// @@ -2557,47 +2751,7 @@ int parse_cmd_address(exarg_T *eap, char **errormsg, bool silent) // Repeat for all ',' or ';' separated addresses. for (;;) { eap->line1 = eap->line2; - switch (eap->addr_type) { - case ADDR_LINES: - case ADDR_OTHER: - // Default is the cursor line number. Avoid using an invalid - // line number though. - if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) { - eap->line2 = curbuf->b_ml.ml_line_count; - } else { - eap->line2 = curwin->w_cursor.lnum; - } - break; - case ADDR_WINDOWS: - eap->line2 = CURRENT_WIN_NR; - break; - case ADDR_ARGUMENTS: - eap->line2 = curwin->w_arg_idx + 1; - if (eap->line2 > ARGCOUNT) { - eap->line2 = ARGCOUNT; - } - break; - case ADDR_LOADED_BUFFERS: - case ADDR_BUFFERS: - eap->line2 = curbuf->b_fnum; - break; - case ADDR_TABS: - eap->line2 = CURRENT_TAB_NR; - break; - case ADDR_TABS_RELATIVE: - case ADDR_UNSIGNED: - eap->line2 = 1; - break; - case ADDR_QUICKFIX: - eap->line2 = (linenr_T)qf_get_cur_idx(eap); - break; - case ADDR_QUICKFIX_VALID: - eap->line2 = qf_get_cur_valid_idx(eap); - break; - case ADDR_NONE: - // Will give an error later if a range is found. - break; - } + eap->line2 = get_cmd_default_range(eap); eap->cmd = skipwhite(eap->cmd); lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent, eap->addr_count == 0, address_count++); @@ -2772,7 +2926,7 @@ static void append_command(char *cmd) /// "full" is set to TRUE if the whole command name matched. /// /// @return NULL for an ambiguous user command. -static char *find_command(exarg_T *eap, int *full) +char *find_ex_command(exarg_T *eap, int *full) FUNC_ATTR_NONNULL_ARG(1) { int len; @@ -2816,7 +2970,7 @@ static char *find_command(exarg_T *eap, int *full) } // check for non-alpha command - if (p == eap->cmd && vim_strchr((char_u *)"@!=><&~#", *p) != NULL) { + if (p == eap->cmd && vim_strchr("@!=><&~#", *p) != NULL) { p++; } len = (int)(p - eap->cmd); @@ -2859,7 +3013,7 @@ static char *find_command(exarg_T *eap, int *full) for (; (int)eap->cmdidx < CMD_SIZE; eap->cmdidx = (cmdidx_T)((int)eap->cmdidx + 1)) { - if (STRNCMP(cmdnames[(int)eap->cmdidx].cmd_name, (char *)eap->cmd, + if (STRNCMP(cmdnames[(int)eap->cmdidx].cmd_name, eap->cmd, (size_t)len) == 0) { if (full != NULL && cmdnames[(int)eap->cmdidx].cmd_name[len] == NUL) { @@ -3032,7 +3186,7 @@ int modifier_len(char *cmd) char *p = cmd; if (ascii_isdigit(*cmd)) { - p = skipwhite((char *)skipdigits((char_u *)cmd + 1)); + p = skipwhite(skipdigits(cmd + 1)); } for (int i = 0; i < (int)ARRAY_SIZE(cmdmods); i++) { int j; @@ -3076,7 +3230,7 @@ int cmd_exists(const char *const name) ea.cmd = (char *)((*name == '2' || *name == '3') ? name + 1 : name); ea.cmdidx = (cmdidx_T)0; int full = false; - p = find_command(&ea, &full); + p = find_ex_command(&ea, &full); if (p == NULL) { return 3; } @@ -3108,7 +3262,7 @@ void f_fullcommand(typval_T *argvars, typval_T *rettv, FunPtr fptr) ea.cmd = (*name == '2' || *name == '3') ? name + 1 : name; ea.cmdidx = (cmdidx_T)0; - char *p = find_command(&ea, NULL); + char *p = find_ex_command(&ea, NULL); if (p == NULL || ea.cmdidx == CMD_SIZE) { return; } @@ -3142,7 +3296,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) // 2. skip comment lines and leading space, colons or bars const char *cmd; - for (cmd = buff; vim_strchr((const char_u *)" \t:|", *cmd) != NULL; cmd++) {} + for (cmd = buff; vim_strchr(" \t:|", *cmd) != NULL; cmd++) {} xp->xp_pattern = (char *)cmd; if (*cmd == NUL) { @@ -3203,7 +3357,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) } } // check for non-alpha command - if (p == cmd && vim_strchr((const char_u *)"@*!=><&~#", *p) != NULL) { + if (p == cmd && vim_strchr("@*!=><&~#", *p) != NULL) { p++; } len = (size_t)(p - cmd); @@ -3235,7 +3389,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) } if (ea.cmdidx == CMD_SIZE) { - if (*cmd == 's' && vim_strchr((const char_u *)"cgriI", cmd[1]) != NULL) { + if (*cmd == 's' && vim_strchr("cgriI", cmd[1]) != NULL) { ea.cmdidx = CMD_substitute; p = cmd + 1; } else if (cmd[0] >= 'A' && cmd[0] <= 'Z') { @@ -3431,7 +3585,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) xp->xp_shell = TRUE; #endif // When still after the command name expand executables. - if ((char_u *)xp->xp_pattern == (char_u *)skipwhite(arg)) { + if (xp->xp_pattern == skipwhite(arg)) { xp->xp_context = EXPAND_SHELLCMD; } } @@ -3660,7 +3814,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) case CMD_isplit: case CMD_dsplit: // Skip count. - arg = (const char *)skipwhite((char *)skipdigits((const char_u *)arg)); + arg = (const char *)skipwhite(skipdigits(arg)); if (*arg == '/') { // Match regexp, not just whole words. for (++arg; *arg && *arg != '/'; arg++) { if (*arg == '\\' && arg[1] != NUL) { @@ -3980,7 +4134,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) break; case CMD_argdelete: - while ((xp->xp_pattern = (char *)vim_strchr((const char_u *)arg, ' ')) != NULL) { + while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL) { arg = (const char *)(xp->xp_pattern + 1); } xp->xp_context = EXPAND_ARGLIST; @@ -4011,7 +4165,7 @@ char *skip_range(const char *cmd, int *ctx) { unsigned delim; - while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;\\", *cmd) != NULL) { + while (vim_strchr(" \t0123456789.$%'/?-+,;\\", *cmd) != NULL) { if (*cmd == '\\') { if (cmd[1] == '?' || cmd[1] == '/' || cmd[1] == '&') { cmd++; @@ -4381,7 +4535,7 @@ error: /// Get flags from an Ex command argument. static void get_flags(exarg_T *eap) { - while (vim_strchr((char_u *)"lp#", *eap->arg) != NULL) { + while (vim_strchr("lp#", *eap->arg) != NULL) { if (*eap->arg == 'l') { eap->flags |= EXFLAG_LIST; } else if (*eap->arg == 'p') { @@ -4416,7 +4570,7 @@ static void ex_script_ni(exarg_T *eap) /// Check range in Ex command for validity. /// /// @return NULL when valid, error message when invalid. -static char *invalid_range(exarg_T *eap) +char *invalid_range(exarg_T *eap) { buf_T *buf; if (eap->line1 < 0 || eap->line2 < 0 || eap->line1 > eap->line2) { @@ -4535,7 +4689,7 @@ static char *skip_grep_pat(exarg_T *eap) /// For the ":make" and ":grep" commands insert the 'makeprg'/'grepprg' option /// in the command line, so that things like % get expanded. -static char *replace_makeprg(exarg_T *eap, char *p, char **cmdlinep) +char *replace_makeprg(exarg_T *eap, char *p, char **cmdlinep) { char *new_cmdline; char *program; @@ -4637,8 +4791,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) * Quick check if this cannot be the start of a special string. * Also removes backslash before '%', '#' and '<'. */ - if (vim_strchr((char_u *)"%#<", *p) == NULL) { - ++p; + if (vim_strchr("%#<", *p) == NULL) { + p++; continue; } @@ -4657,10 +4811,10 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) // Wildcards won't be expanded below, the replacement is taken // literally. But do expand "~/file", "~user/file" and "$HOME/file". - if (vim_strchr((char_u *)repl, '$') != NULL || vim_strchr((char_u *)repl, '~') != NULL) { + if (vim_strchr(repl, '$') != NULL || vim_strchr(repl, '~') != NULL) { char *l = repl; - repl = (char *)expand_env_save((char_u *)repl); + repl = expand_env_save(repl); xfree(l); } @@ -4690,8 +4844,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) # define ESCAPE_CHARS escape_chars #endif - for (l = repl; *l; ++l) { - if (vim_strchr(ESCAPE_CHARS, *l) != NULL) { + for (l = repl; *l; l++) { + if (vim_strchr((char *)ESCAPE_CHARS, *l) != NULL) { l = (char *)vim_strsave_escaped((char_u *)repl, ESCAPE_CHARS); xfree(repl); repl = l; @@ -4730,8 +4884,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) * After expanding environment variables, check again * if there are still wildcards present. */ - if (vim_strchr((char_u *)eap->arg, '$') != NULL - || vim_strchr((char_u *)eap->arg, '~') != NULL) { + if (vim_strchr(eap->arg, '$') != NULL + || vim_strchr(eap->arg, '~') != NULL) { expand_env_esc((char_u *)eap->arg, NameBuff, MAXPATHL, true, true, NULL); has_wildcards = path_has_wildcard(NameBuff); p = (char *)NameBuff; @@ -4773,7 +4927,7 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) return OK; } -/// Replace part of the command line, keeping eap->cmd, eap->arg and +/// Replace part of the command line, keeping eap->cmd, eap->arg, eap->args and /// eap->nextcmd correct. /// "src" points to the part that is to be replaced, of length "srclen". /// "repl" is the replacement string. @@ -4792,6 +4946,7 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch i += STRLEN(eap->nextcmd); // add space for next command } char *new_cmdline = xmalloc(i); + size_t offset = (size_t)(src - *cmdlinep); /* * Copy the stuff before the expanded part. @@ -4799,7 +4954,7 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch * Copy what came after the expanded part. * Copy the next commands, if there are any. */ - i = (size_t)(src - *cmdlinep); // length of part before match + i = offset; // length of part before match memmove(new_cmdline, *cmdlinep, i); memmove(new_cmdline + i, repl, len); @@ -4814,6 +4969,19 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch } eap->cmd = new_cmdline + (eap->cmd - *cmdlinep); eap->arg = new_cmdline + (eap->arg - *cmdlinep); + + for (size_t j = 0; j < eap->argc; j++) { + if (offset >= (size_t)(eap->args[j] - *cmdlinep)) { + // If replaced text is after or in the same position as the argument, + // the argument's position relative to the beginning of the cmdline stays the same. + eap->args[j] = new_cmdline + (eap->args[j] - *cmdlinep); + } else { + // Otherwise, argument gets shifted alongside the replaced text. + // The amount of the shift is equal to the difference of the old and new string length. + eap->args[j] = new_cmdline + (eap->args[j] - *cmdlinep) + (len - srclen); + } + } + if (eap->do_ecmd_cmd != NULL && eap->do_ecmd_cmd != dollar_command) { eap->do_ecmd_cmd = new_cmdline + (eap->do_ecmd_cmd - *cmdlinep); } @@ -5077,7 +5245,9 @@ static int get_tabpage_arg(exarg_T *eap) tab_number = 0; } else { tab_number = (int)eap->line2; - if (!unaccept_arg0 && *skipwhite(*eap->cmdlinep) == '-') { + char *cmdp = eap->cmd; + while (--cmdp > *eap->cmdlinep && (*cmdp == ' ' || ascii_isdigit(*cmdp))) {} + if (!unaccept_arg0 && *cmdp == '-') { tab_number--; if (tab_number < unaccept_arg0) { eap->errmsg = e_invarg; @@ -5325,12 +5495,12 @@ static int check_more(int message, bool forceit) } /// Function given to ExpandGeneric() to obtain the list of command names. -char_u *get_command_name(expand_T *xp, int idx) +char *get_command_name(expand_T *xp, int idx) { if (idx >= CMD_SIZE) { - return (char_u *)expand_user_command_name(idx); + return expand_user_command_name(idx); } - return (char_u *)cmdnames[idx].cmd_name; + return cmdnames[idx].cmd_name; } /// Check for a valid user command name @@ -6002,7 +6172,7 @@ bool uc_split_args_iter(const char *arg, size_t arglen, size_t *end, char *buf, } /// split and quote args for <f-args> -static char *uc_split_args(char *arg, size_t *lenp) +static char *uc_split_args(char *arg, char **args, size_t *arglens, size_t argc, size_t *lenp) { char *buf; char *p; @@ -6010,61 +6180,107 @@ static char *uc_split_args(char *arg, size_t *lenp) int len; // Precalculate length - p = arg; len = 2; // Initial and final quotes + if (args == NULL) { + p = arg; - while (*p) { - if (p[0] == '\\' && p[1] == '\\') { - len += 2; - p += 2; - } else if (p[0] == '\\' && ascii_iswhite(p[1])) { - len += 1; - p += 2; - } else if (*p == '\\' || *p == '"') { - len += 2; - p += 1; - } else if (ascii_iswhite(*p)) { - p = skipwhite(p); - if (*p == NUL) { - break; + while (*p) { + if (p[0] == '\\' && p[1] == '\\') { + len += 2; + p += 2; + } else if (p[0] == '\\' && ascii_iswhite(p[1])) { + len += 1; + p += 2; + } else if (*p == '\\' || *p == '"') { + len += 2; + p += 1; + } else if (ascii_iswhite(*p)) { + p = skipwhite(p); + if (*p == NUL) { + break; + } + len += 3; // "," + } else { + const int charlen = utfc_ptr2len(p); + + len += charlen; + p += charlen; } - len += 3; // "," - } else { - const int charlen = utfc_ptr2len(p); + } + } else { + for (size_t i = 0; i < argc; i++) { + p = args[i]; + const char *arg_end = args[i] + arglens[i]; + + while (p < arg_end) { + if (*p == '\\' || *p == '"') { + len += 2; + p += 1; + } else { + const int charlen = utfc_ptr2len(p); - len += charlen; - p += charlen; + len += charlen; + p += charlen; + } + } + + if (i != argc - 1) { + len += 3; // "," + } } } buf = xmalloc((size_t)len + 1); - p = arg; q = buf; *q++ = '"'; - while (*p) { - if (p[0] == '\\' && p[1] == '\\') { - *q++ = '\\'; - *q++ = '\\'; - p += 2; - } else if (p[0] == '\\' && ascii_iswhite(p[1])) { - *q++ = p[1]; - p += 2; - } else if (*p == '\\' || *p == '"') { - *q++ = '\\'; - *q++ = *p++; - } else if (ascii_iswhite(*p)) { - p = skipwhite(p); - if (*p == NUL) { - break; + + if (args == NULL) { + p = arg; + while (*p) { + if (p[0] == '\\' && p[1] == '\\') { + *q++ = '\\'; + *q++ = '\\'; + p += 2; + } else if (p[0] == '\\' && ascii_iswhite(p[1])) { + *q++ = p[1]; + p += 2; + } else if (*p == '\\' || *p == '"') { + *q++ = '\\'; + *q++ = *p++; + } else if (ascii_iswhite(*p)) { + p = skipwhite(p); + if (*p == NUL) { + break; + } + *q++ = '"'; + *q++ = ','; + *q++ = '"'; + } else { + mb_copy_char((const char_u **)&p, (char_u **)&q); + } + } + } else { + for (size_t i = 0; i < argc; i++) { + p = args[i]; + const char *arg_end = args[i] + arglens[i]; + + while (p < arg_end) { + if (*p == '\\' || *p == '"') { + *q++ = '\\'; + *q++ = *p++; + } else { + mb_copy_char((const char_u **)&p, (char_u **)&q); + } + } + if (i != argc - 1) { + *q++ = '"'; + *q++ = ','; + *q++ = '"'; } - *q++ = '"'; - *q++ = ','; - *q++ = '"'; - } else { - mb_copy_char((const char_u **)&p, (char_u **)&q); } } + *q++ = '"'; *q = 0; @@ -6121,7 +6337,7 @@ static size_t uc_check_code(char *code, size_t len, char *buf, ucmd_T *cmd, exar ct_NONE, } type = ct_NONE; - if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-') { + if ((vim_strchr("qQfF", *p) != NULL) && p[1] == '-') { quote = (*p == 'q' || *p == 'Q') ? 1 : 2; p += 2; l -= 2; @@ -6201,7 +6417,7 @@ static size_t uc_check_code(char *code, size_t len, char *buf, ucmd_T *cmd, exar case 2: // Quote and split (<f-args>) // This is hard, so only do it once, and cache the result if (*split_buf == NULL) { - *split_buf = uc_split_args(eap->arg, split_len); + *split_buf = uc_split_args(eap->arg, eap->args, eap->arglens, eap->argc, split_len); } result = *split_len; @@ -6426,9 +6642,9 @@ static void do_ucmd(exarg_T *eap) totlen = 0; for (;;) { - start = (char *)vim_strchr((char_u *)p, '<'); + start = vim_strchr(p, '<'); if (start != NULL) { - end = (char *)vim_strchr((char_u *)start + 1, '>'); + end = vim_strchr(start + 1, '>'); } if (buf != NULL) { for (ksp = p; *ksp != NUL && (char_u)(*ksp) != K_SPECIAL; ksp++) {} @@ -6510,28 +6726,28 @@ static void do_ucmd(exarg_T *eap) static char *expand_user_command_name(int idx) { - return (char *)get_user_commands(NULL, idx - CMD_SIZE); + return get_user_commands(NULL, idx - CMD_SIZE); } /// Function given to ExpandGeneric() to obtain the list of user address type names. -char_u *get_user_cmd_addr_type(expand_T *xp, int idx) +char *get_user_cmd_addr_type(expand_T *xp, int idx) { - return (char_u *)addr_type_complete[idx].name; + return addr_type_complete[idx].name; } /// Function given to ExpandGeneric() to obtain the list of user command names. -char_u *get_user_commands(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_user_commands(expand_T *xp FUNC_ATTR_UNUSED, int idx) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { // In cmdwin, the alternative buffer should be used. const buf_T *const buf = prevwin_curwin()->w_buffer; if (idx < buf->b_ucmds.ga_len) { - return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; + return (char *)USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; } idx -= buf->b_ucmds.ga_len; if (idx < ucmds.ga_len) { - return USER_CMD(idx)->uc_name; + return (char *)USER_CMD(idx)->uc_name; } return NULL; } @@ -6558,7 +6774,7 @@ static char *get_user_command_name(int idx, int cmdidx) /// Function given to ExpandGeneric() to obtain the list of user command /// attributes. -char_u *get_user_cmd_flags(expand_T *xp, int idx) +char *get_user_cmd_flags(expand_T *xp, int idx) { static char *user_cmd_flags[] = { "addr", "bang", "bar", "buffer", "complete", "count", @@ -6567,31 +6783,31 @@ char_u *get_user_cmd_flags(expand_T *xp, int idx) if (idx >= (int)ARRAY_SIZE(user_cmd_flags)) { return NULL; } - return (char_u *)user_cmd_flags[idx]; + return user_cmd_flags[idx]; } /// Function given to ExpandGeneric() to obtain the list of values for -nargs. -char_u *get_user_cmd_nargs(expand_T *xp, int idx) +char *get_user_cmd_nargs(expand_T *xp, int idx) { static char *user_cmd_nargs[] = { "0", "1", "*", "?", "+" }; if (idx >= (int)ARRAY_SIZE(user_cmd_nargs)) { return NULL; } - return (char_u *)user_cmd_nargs[idx]; + return user_cmd_nargs[idx]; } /// Function given to ExpandGeneric() to obtain the list of values for -complete. -char_u *get_user_cmd_complete(expand_T *xp, int idx) +char *get_user_cmd_complete(expand_T *xp, int idx) { if (idx >= (int)ARRAY_SIZE(command_complete)) { return NULL; } char *cmd_compl = get_command_complete(idx); if (cmd_compl == NULL) { - return (char_u *)""; + return ""; } else { - return (char_u *)cmd_compl; + return cmd_compl; } } @@ -7564,7 +7780,7 @@ 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, wp->w_buffer->b_fname, IObuff, IOSIZE, true); + home_replace(wp->w_buffer, (char_u *)wp->w_buffer->b_fname, IObuff, IOSIZE, true); } msg_outtrans(IObuff); ui_flush(); // output one line at a time @@ -7879,13 +8095,13 @@ static void ex_read(exarg_T *eap) if (check_fname() == FAIL) { // check for no file name return; } - i = readfile(curbuf->b_ffname, curbuf->b_fname, + i = readfile((char *)curbuf->b_ffname, curbuf->b_fname, eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0, false); } else { if (vim_strchr(p_cpo, CPO_ALTREAD) != NULL) { (void)setaltfname((char_u *)eap->arg, (char_u *)eap->arg, (linenr_T)1); } - i = readfile((char_u *)eap->arg, NULL, + i = readfile(eap->arg, NULL, eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0, false); } if (i != OK) { @@ -7958,7 +8174,7 @@ static void post_chdir(CdScope scope, bool trigger_dirchanged) char *pdir = get_prevdir(scope); // If still in global directory, set CWD as the global directory. if (globaldir == NULL && pdir != NULL) { - globaldir = vim_strsave((char_u *)pdir); + globaldir = xstrdup(pdir); } } @@ -8376,8 +8592,7 @@ static void ex_at(exarg_T *eap) } // Put the register in the typeahead buffer with the "silent" flag. - if (do_execreg(c, TRUE, vim_strchr(p_cpo, CPO_EXECBUF) != NULL, TRUE) - == FAIL) { + if (do_execreg(c, true, vim_strchr(p_cpo, CPO_EXECBUF) != NULL, true) == FAIL) { beep_flush(); } else { bool save_efr = exec_from_reg; @@ -8520,7 +8735,7 @@ static void ex_redir(exarg_T *eap) close_redir(); // Expand environment variables and "~/". - fname = (char *)expand_env_save((char_u *)arg); + fname = expand_env_save(arg); if (fname == NULL) { return; } @@ -8584,7 +8799,7 @@ static void ex_redir(exarg_T *eap) /// ":redraw": force redraw static void ex_redraw(exarg_T *eap) { - if (State & CMDPREVIEW) { + if (State & MODE_CMDPREVIEW) { return; // Ignore :redraw during 'inccommand' preview. #9777 } int r = RedrawingDisabled; @@ -8615,10 +8830,10 @@ static void ex_redraw(exarg_T *eap) ui_flush(); } -/// ":redrawstatus": force redraw of status line(s) +/// ":redrawstatus": force redraw of status line(s) and window bar(s) static void ex_redrawstatus(exarg_T *eap) { - if (State & CMDPREVIEW) { + if (State & MODE_CMDPREVIEW) { return; // Ignore :redrawstatus during 'inccommand' preview. #9777 } int r = RedrawingDisabled; @@ -8631,8 +8846,7 @@ static void ex_redrawstatus(exarg_T *eap) } else { status_redraw_curbuf(); } - update_screen(VIsual_active ? INVERTED : - 0); + update_screen(VIsual_active ? INVERTED : 0); RedrawingDisabled = r; p_lz = p; ui_flush(); @@ -8802,7 +9016,7 @@ void restore_current_state(save_state_T *sst) /// ":normal[!] {commands}": Execute normal mode commands. static void ex_normal(exarg_T *eap) { - if (curbuf->terminal && State & TERM_FOCUS) { + if (curbuf->terminal && State & MODE_TERMINAL) { emsg("Can't re-enter normal mode from terminal mode"); return; } @@ -8893,7 +9107,7 @@ static void ex_startinsert(exarg_T *eap) // Ignore the command when already in Insert mode. Inserting an // expression register that invokes a function can do this. - if (State & INSERT) { + if (State & MODE_INSERT) { return; } @@ -9261,7 +9475,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum result = ""; valid = 0; // Must have ":p:h" to be valid } else { - result = (char *)curbuf->b_fname; + result = curbuf->b_fname; tilde_file = STRCMP(result, "~") == 0; } break; @@ -9315,7 +9529,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum result = ""; valid = 0; // Must have ":p:h" to be valid } else { - result = (char *)buf->b_fname; + result = buf->b_fname; tilde_file = STRCMP(result, "~") == 0; } } @@ -9332,17 +9546,17 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum case SPEC_AFILE: // file name for autocommand if (autocmd_fname != NULL - && !path_is_absolute(autocmd_fname) + && !path_is_absolute((char_u *)autocmd_fname) // For CmdlineEnter and related events, <afile> is not a path! #9348 - && !strequal("/", (char *)autocmd_fname)) { + && !strequal("/", autocmd_fname)) { // Still need to turn the fname into a full path. It was // postponed to avoid a delay when <afile> is not used. - result = FullName_save((char *)autocmd_fname, false); + result = FullName_save(autocmd_fname, false); // Copy into `autocmd_fname`, don't reassign it. #8165 STRLCPY(autocmd_fname, result, MAXPATHL); xfree(result); } - result = (char *)autocmd_fname; + result = autocmd_fname; if (result == NULL) { *errormsg = _("E495: no autocommand file name to substitute for \"<afile>\""); return NULL; @@ -9360,7 +9574,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum break; case SPEC_AMATCH: // match name for autocommand - result = (char *)autocmd_match; + result = autocmd_match; if (result == NULL) { *errormsg = _("E497: no autocommand match name to substitute for \"<amatch>\""); return NULL; @@ -9368,7 +9582,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum break; case SPEC_SFILE: // file name for ":so" command - result = (char *)sourcing_name; + result = sourcing_name; if (result == NULL) { *errormsg = _("E498: no :source file name to substitute for \"<sfile>\""); return NULL; @@ -9417,7 +9631,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum if (src[*usedlen] == '<') { (*usedlen)++; if ((s = (char *)STRRCHR(result, '.')) != NULL - && (char_u *)s >= path_tail((char_u *)result)) { + && s >= path_tail(result)) { resultlen = (size_t)(s - result); } } else if (!skip_mod) { @@ -9601,31 +9815,31 @@ static void ex_behave(exarg_T *eap) /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":behave {mswin,xterm}" command. -char_u *get_behave_arg(expand_T *xp, int idx) +char *get_behave_arg(expand_T *xp, int idx) { if (idx == 0) { - return (char_u *)"mswin"; + return "mswin"; } if (idx == 1) { - return (char_u *)"xterm"; + return "xterm"; } return NULL; } /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":messages {clear}" command. -char_u *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx == 0) { - return (char_u *)"clear"; + return "clear"; } return NULL; } -char_u *get_mapclear_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_mapclear_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx == 0) { - return (char_u *)"<buffer>"; + return "<buffer>"; } return NULL; } @@ -9651,8 +9865,8 @@ static void ex_filetype(exarg_T *eap) // Print current status. smsg("filetype detection:%s plugin:%s indent:%s", filetype_detect == kTrue ? "ON" : "OFF", - filetype_plugin == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF", // NOLINT(whitespace/line_length) - filetype_indent == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF"); // NOLINT(whitespace/line_length) + filetype_plugin == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF", + filetype_indent == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF"); return; } @@ -9887,7 +10101,7 @@ bool cmd_can_preview(char *cmd) if (*ea.cmd == '*') { ea.cmd = skipwhite(ea.cmd + 1); } - char *end = find_command(&ea, NULL); + char *end = find_ex_command(&ea, NULL); switch (ea.cmdidx) { case CMD_substitute: @@ -10278,3 +10492,9 @@ void verify_command(char *cmd) msg("` `.:.`.,:iii;;;;;;;;iii;;;:` `.`` " " `nW"); } + +/// Get argt of command with id +uint32_t get_cmd_argt(cmdidx_T cmdidx) +{ + return cmdnames[(int)cmdidx].cmd_argt; +} diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 976a19300b..fa70f762a2 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -479,7 +479,7 @@ static int throw_exception(void *value, except_type_T type, char *cmdname) } excp->type = type; - excp->throw_name = (char *)vim_strsave(sourcing_name == NULL ? (char_u *)"" : sourcing_name); + excp->throw_name = xstrdup(sourcing_name == NULL ? "" : sourcing_name); excp->throw_lnum = sourcing_lnum; if (p_verbose >= 13 || debug_break_level > 0) { @@ -1361,18 +1361,18 @@ void ex_catch(exarg_T *eap) save_char = *end; *end = NUL; } - save_cpo = (char *)p_cpo; - p_cpo = (char_u *)""; + save_cpo = p_cpo; + p_cpo = ""; // Disable error messages, it will make current exception // invalid emsg_off++; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); emsg_off--; regmatch.rm_ic = false; if (end != NULL) { *end = save_char; } - p_cpo = (char_u *)save_cpo; + p_cpo = save_cpo; if (regmatch.regprog == NULL) { semsg(_(e_invarg2), pat); } else { diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 8792e9673a..1d496cbf25 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -33,12 +33,13 @@ #include "nvim/func_attr.h" #include "nvim/garray.h" #include "nvim/getchar.h" +#include "nvim/globals.h" #include "nvim/highlight.h" #include "nvim/highlight_defs.h" #include "nvim/highlight_group.h" #include "nvim/if_cscope.h" #include "nvim/indent.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lib/kvec.h" #include "nvim/log.h" #include "nvim/lua/executor.h" @@ -292,7 +293,7 @@ static void init_incsearch_state(incsearch_state_T *s) /// Given to ExpandGeneric() to obtain all available heathcheck names. /// @param[in] idx Index of the healthcheck item. /// @param[in] xp Not used. -static char_u *get_healthcheck_names(expand_T *xp, int idx) +static char *get_healthcheck_names(expand_T *xp, int idx) { // Generate the first time or on new prompt. if (healthchecks.last_gen == 0 || healthchecks.last_gen != last_prompt_id) { @@ -310,8 +311,8 @@ static char_u *get_healthcheck_names(expand_T *xp, int idx) // Tracked to regenerate items on next prompt. healthchecks.last_gen = last_prompt_id; } - return idx < - healthchecks.names.ga_len ? ((char_u **)(healthchecks.names.ga_data))[idx] : NULL; + return idx < healthchecks.names.ga_len + ? ((char **)(healthchecks.names.ga_data))[idx] : NULL; } /// Transform healthcheck file path into it's name. @@ -325,7 +326,7 @@ static void get_healthcheck_cb(char *path, void *cookie) struct healthchecks_cookie *hcookie = (struct healthchecks_cookie *)cookie; char *pattern; char *sub = "\\1"; - char_u *res; + char *res; if (hcookie->is_lua) { // Lua: transform "../lua/vim/lsp/health.lua" into "vim.lsp" @@ -335,16 +336,16 @@ static void get_healthcheck_cb(char *path, void *cookie) pattern = ".*[\\/]\\([^\\/]*\\)\\.vim$"; } - res = (char_u *)do_string_sub(path, pattern, sub, NULL, "g"); + res = do_string_sub(path, pattern, sub, NULL, "g"); if (hcookie->is_lua && res != NULL) { // Replace slashes with dots as represented by the healthcheck plugin. - char_u *ares = (char_u *)do_string_sub((char *)res, "[\\/]", ".", NULL, "g"); + char *ares = do_string_sub(res, "[\\/]", ".", NULL, "g"); xfree(res); res = ares; } if (res != NULL) { - GA_APPEND(char_u *, hcookie->names, res); + GA_APPEND(char *, hcookie->names, res); } } } @@ -355,12 +356,12 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s int *skiplen, int *patlen) FUNC_ATTR_NONNULL_ALL { - char_u *cmd; + char *cmd; cmdmod_T save_cmdmod = cmdmod; - char_u *p; + char *p; bool delim_optional = false; int delim; - char_u *end; + char *end; char *dummy; exarg_T ea; pos_T save_cursor; @@ -396,14 +397,14 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s parse_command_modifiers(&ea, &dummy, true); cmdmod = save_cmdmod; - cmd = (char_u *)skip_range(ea.cmd, NULL); - if (vim_strchr((char_u *)"sgvl", *cmd) == NULL) { + cmd = skip_range(ea.cmd, NULL); + if (vim_strchr("sgvl", *cmd) == NULL) { goto theend; } // Skip over "substitute" to find the pattern separator. for (p = cmd; ASCII_ISALPHA(*p); p++) {} - if (*skipwhite((char *)p) == NUL) { + if (*skipwhite(p) == NUL) { goto theend; } @@ -419,9 +420,9 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s } else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) { // skip over ! and flags if (*p == '!') { - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); } - while (ASCII_ISALPHA(*(p = (char_u *)skipwhite((char *)p)))) { + while (ASCII_ISALPHA(*(p = skipwhite((char *)p)))) { p++; } if (*p == NUL) { @@ -435,7 +436,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s // skip over "!/". if (*p == '!') { p++; - if (*skipwhite((char *)p) == NUL) { + if (*skipwhite(p) == NUL) { goto theend; } } @@ -446,10 +447,10 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s goto theend; } - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; *search_delim = delim; - end = skip_regexp(p, delim, p_magic, NULL); + end = (char *)skip_regexp((char_u *)p, delim, p_magic, NULL); use_last_pat = end == p && *end == delim; if (end == p && !use_last_pat) { @@ -458,11 +459,11 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s // Don't do 'hlsearch' highlighting if the pattern matches everything. if (!use_last_pat) { - char_u c = *end; + char c = *end; int empty; *end = NUL; - empty = empty_pattern(p); + empty = empty_pattern((char_u *)p); *end = c; if (empty) { goto theend; @@ -470,7 +471,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s } // found a non-empty pattern or // - *skiplen = (int)(p - ccline.cmdbuff); + *skiplen = (int)((char_u *)p - ccline.cmdbuff); *patlen = (int)(end - p); // parse the address range @@ -686,8 +687,7 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s) *c = mb_tolower(*c); } if (*c == search_delim - || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), *c) - != NULL) { + || vim_strchr((p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) { // put a backslash before special characters stuffcharReadbuff(*c); *c = '\\'; @@ -804,6 +804,12 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init ccline.cmdlen = s->indent; } + if (cmdline_level == 50) { + // Somehow got into a loop recursively calling getcmdline(), bail out. + emsg(_(e_command_too_recursive)); + goto theend; + } + ExpandInit(&s->xpc); ccline.xpc = &s->xpc; @@ -841,7 +847,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init // doing ":@0" when register 0 doesn't contain a CR. msg_scroll = false; - State = CMDLINE; + State = MODE_CMDLINE; if (s->firstc == '/' || s->firstc == '?' || s->firstc == '@') { // Use ":lmap" mappings for search pattern and input(). @@ -852,7 +858,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init } if (*s->b_im_ptr == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } } @@ -907,8 +913,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init tv_dict_set_keys_readonly(dict); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINEENTER, (char_u *)firstcbuf, (char_u *)firstcbuf, - false, curbuf); + apply_autocmds(EVENT_CMDLINEENTER, firstcbuf, firstcbuf, false, curbuf); restore_v_event(dict, &save_v_event); @@ -933,8 +938,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init tv_dict_add_bool(dict, S_LEN("abort"), s->gotesc ? kBoolVarTrue : kBoolVarFalse); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINELEAVE, (char_u *)firstcbuf, (char_u *)firstcbuf, - false, curbuf); + apply_autocmds(EVENT_CMDLINELEAVE, firstcbuf, firstcbuf, false, curbuf); // error printed below, to avoid redraw issues tl_ret = try_leave(&tstate, &err); if (tv_dict_get_number(dict, "abort") != 0) { @@ -997,12 +1001,13 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init State = s->save_State; setmouse(); ui_cursor_shape(); // may show different cursor shape + sb_text_end_cmdline(); + +theend: xfree(s->save_p_icm); xfree(ccline.last_colors.cmdbuff); kv_destroy(ccline.last_colors.colors); - sb_text_end_cmdline(); - char_u *p = ccline.cmdbuff; if (ui_has(kUICmdline)) { @@ -1831,11 +1836,11 @@ static int command_line_handle_key(CommandLineState *s) return command_line_not_changed(s); case Ctrl_HAT: - if (map_to_exists_mode("", LANGMAP, false)) { + if (map_to_exists_mode("", MODE_LANGMAP, false)) { // ":lmap" mappings exists, toggle use of mappings. - State ^= LANGMAP; + State ^= MODE_LANGMAP; if (s->b_im_ptr != NULL) { - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { *s->b_im_ptr = B_IMODE_LMAP; } else { *s->b_im_ptr = B_IMODE_NONE; @@ -2305,7 +2310,7 @@ static int empty_pattern(char_u *p) // remove trailing \v and the like while (n >= 2 && p[n - 2] == '\\' - && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL) { + && vim_strchr("mMvVcCZ", p[n - 1]) != NULL) { n -= 2; } return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|'); @@ -2330,8 +2335,7 @@ static int command_line_changed(CommandLineState *s) tv_dict_set_keys_readonly(dict); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINECHANGED, (char_u *)firstcbuf, - (char_u *)firstcbuf, false, curbuf); + apply_autocmds(EVENT_CMDLINECHANGED, firstcbuf, firstcbuf, false, curbuf); restore_v_event(dict, &save_v_event); bool tl_ret = try_leave(&tstate, &err); @@ -2353,10 +2357,10 @@ static int command_line_changed(CommandLineState *s) && !vpeekc_any()) { // Show 'inccommand' preview. It works like this: // 1. Do the command. - // 2. Command implementation detects CMDPREVIEW state, then: + // 2. Command implementation detects MODE_CMDPREVIEW state, then: // - Update the screen while the effects are in place. // - Immediately undo the effects. - State |= CMDPREVIEW; + State |= MODE_CMDPREVIEW; emsg_silent++; // Block error reporting as the command may be incomplete msg_silent++; // Block messages, namely ones that prompt do_cmdline((char *)ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT|DOCMD_PREVIEW); @@ -2369,8 +2373,8 @@ static int command_line_changed(CommandLineState *s) update_topline(curwin); redrawcmdline(); - } else if (State & CMDPREVIEW) { - State = (State & ~CMDPREVIEW); + } else if (State & MODE_CMDPREVIEW) { + State = (State & ~MODE_CMDPREVIEW); close_preview_windows(); update_screen(SOME_VALID); // Clear 'inccommand' preview. } else { @@ -2522,7 +2526,7 @@ char *get_text_locked_msg(void) bool curbuf_locked(void) { if (curbuf->b_ro_locked > 0) { - emsg(_("E788: Not allowed to edit another buffer now")); + emsg(_(e_cannot_edit_other_buf)); return true; } return allbuf_locked(); @@ -2601,14 +2605,14 @@ static void correct_screencol(int idx, int cells, int *col) /// /// @param c normally ':', NUL for ":append" /// @param indent indent for inside conditionals -char_u *getexline(int c, void *cookie, int indent, bool do_concat) +char *getexline(int c, void *cookie, int indent, bool do_concat) { // When executing a register, remove ':' that's in front of each line. if (exec_from_reg && vpeekc() == ':') { (void)vgetc(); } - return getcmdline(c, 1L, indent, do_concat); + return (char *)getcmdline(c, 1L, indent, do_concat); } bool cmdline_overstrike(void) @@ -2675,7 +2679,7 @@ static void realloc_cmdbuff(int len) } } -static char_u *arshape_buf = NULL; +static char *arshape_buf = NULL; #if defined(EXITFREE) void free_arshape_buf(void) @@ -3073,11 +3077,11 @@ static void draw_cmdline(int start, int len) u8c = arabic_shape(u8c, NULL, &u8cc[0], pc, pc1, nc); - newlen += utf_char2bytes(u8c, (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8c, arshape_buf + newlen); if (u8cc[0] != 0) { - newlen += utf_char2bytes(u8cc[0], (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8cc[0], arshape_buf + newlen); if (u8cc[1] != 0) { - newlen += utf_char2bytes(u8cc[1], (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8cc[1], arshape_buf + newlen); } } } else { @@ -3087,7 +3091,7 @@ static void draw_cmdline(int start, int len) } } - msg_outtrans_len(arshape_buf, newlen); + msg_outtrans_len((char_u *)arshape_buf, newlen); } else { draw_cmdline_no_arabicshape: if (kv_size(ccline.last_colors.colors)) { @@ -4490,7 +4494,7 @@ static int expand_showtail(expand_T *xp) return FALSE; } - end = path_tail((char_u *)xp->xp_pattern); + end = (char_u *)path_tail(xp->xp_pattern); if (end == (char_u *)xp->xp_pattern) { // there is no path separator return false; } @@ -4499,9 +4503,9 @@ static int expand_showtail(expand_T *xp) // Skip escaped wildcards. Only when the backslash is not a path // separator, on DOS the '*' "path\*\file" must not be skipped. if (rem_backslash(s)) { - ++s; - } else if (vim_strchr((char_u *)"*?[", *s) != NULL) { - return FALSE; + s++; + } else if (vim_strchr("*?[", *s) != NULL) { + return false; } } return TRUE; @@ -4617,7 +4621,7 @@ char_u *addstar(char_u *fname, size_t len, int context) * ` could be anywhere in the file name. * When the name ends in '$' don't add a star, remove the '$'. */ - tail = path_tail(retval); + tail = (char_u *)path_tail((char *)retval); ends_in_star = (len > 0 && retval[len - 1] == '*'); #ifndef BACKSLASH_IN_FILENAME for (ssize_t k = (ssize_t)len - 2; k >= 0; k--) { @@ -4629,8 +4633,8 @@ char_u *addstar(char_u *fname, size_t len, int context) #endif if ((*retval != '~' || tail != retval) && !ends_in_star - && vim_strchr(tail, '$') == NULL - && vim_strchr(retval, '`') == NULL) { + && vim_strchr((char *)tail, '$') == NULL + && vim_strchr((char *)retval, '`') == NULL) { retval[len++] = '*'; } else if (len > 0 && retval[len - 1] == '$') { --len; @@ -4833,7 +4837,7 @@ static void cleanup_help_tags(int num_file, char_u **file) } } -typedef char_u *(*ExpandFunc)(expand_T *, int); +typedef char *(*ExpandFunc)(expand_T *, int); /// Do the expansion based on xp->xp_context and "pat". /// @@ -5002,7 +5006,7 @@ static int ExpandFromContext(expand_T *xp, char_u *pat, int *num_file, char_u ** return nlua_expand_pat(xp, pat, num_file, file); } - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp((char *)pat, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { return FAIL; } @@ -5098,8 +5102,8 @@ static void ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, cha char_u *str; // count the number of matching names - for (i = 0;; ++i) { - str = (*func)(xp, i); + for (i = 0;; i++) { + str = (char_u *)(*func)(xp, i); if (str == NULL) { // end of list break; } @@ -5120,7 +5124,7 @@ static void ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, cha // copy the matching names into allocated memory count = 0; for (i = 0;; i++) { - str = (*func)(xp, i); + str = (char_u *)(*func)(xp, i); if (str == NULL) { // End of list. break; } @@ -5219,7 +5223,7 @@ static void expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int hashtab_T found_ht; hash_init(&found_ht); for (s = path;; s = e) { - e = vim_strchr(s, ENV_SEPCHAR); + e = (char_u *)vim_strchr((char *)s, ENV_SEPCHAR); if (e == NULL) { e = s + STRLEN(s); } @@ -5351,7 +5355,7 @@ static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, ga_init(&ga, (int)sizeof(char *), 3); for (char_u *s = retstr; *s != NUL; s = e) { - e = vim_strchr(s, '\n'); + e = (char_u *)vim_strchr((char *)s, '\n'); if (e == NULL) { e = s + STRLEN(s); } @@ -5570,7 +5574,7 @@ static int ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file) for (int i = 0; i < ga.ga_len; i++) { char_u *match = ((char_u **)ga.ga_data)[i]; - s = path_tail(match); + s = (char_u *)path_tail((char *)match); memmove(match, s, STRLEN(s) + 1); } @@ -5677,7 +5681,7 @@ static char *(history_names[]) = * Function given to ExpandGeneric() to obtain the possible first * arguments of the ":history command. */ -static char_u *get_history_arg(expand_T *xp, int idx) +static char *get_history_arg(expand_T *xp, int idx) { static char_u compl[2] = { NUL, NUL }; char *short_names = ":=@>?/"; @@ -5686,13 +5690,13 @@ static char_u *get_history_arg(expand_T *xp, int idx) if (idx < short_names_count) { compl[0] = (char_u)short_names[idx]; - return compl; + return (char *)compl; } if (idx < short_names_count + history_name_count) { - return (char_u *)history_names[idx - short_names_count]; + return history_names[idx - short_names_count]; } if (idx == short_names_count + history_name_count) { - return (char_u *)"all"; + return "all"; } return NULL; } @@ -5852,7 +5856,7 @@ HistoryType get_histtype(const char *const name, const size_t len, const bool re } } - if (vim_strchr((char_u *)":=@>?/", name[0]) != NULL && len == 1) { + if (vim_strchr(":=@>?/", name[0]) != NULL && len == 1) { return hist_char2type(name[0]); } @@ -5938,7 +5942,7 @@ int get_history_idx(int histype) /// ccline and put the previous value in ccline.prev_ccline. static struct cmdline_info *get_ccline_ptr(void) { - if ((State & CMDLINE) == 0) { + if ((State & MODE_CMDLINE) == 0) { return NULL; } else if (ccline.cmdbuff != NULL) { return &ccline; @@ -5959,9 +5963,9 @@ char_u *get_cmdline_completion(void) if (p != NULL && p->xpc != NULL) { set_expand_context(p->xpc); - char_u *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context); + char *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context); if (cmd_compl != NULL) { - return vim_strsave(cmd_compl); + return vim_strsave((char_u *)cmd_compl); } } @@ -6152,7 +6156,7 @@ int del_history_entry(int histype, char_u *str) && histype < HIST_COUNT && *str != NUL && (idx = hisidx[histype]) >= 0 - && (regmatch.regprog = vim_regcomp(str, RE_MAGIC + RE_STRING)) + && (regmatch.regprog = vim_regcomp((char *)str, RE_MAGIC + RE_STRING)) != NULL) { i = last = idx; do { @@ -6279,7 +6283,7 @@ void ex_history(exarg_T *eap) if (!(ascii_isdigit(*arg) || *arg == '-' || *arg == ',')) { end = arg; while (ASCII_ISALPHA(*end) - || vim_strchr((char_u *)":=@>/?", *end) != NULL) { + || vim_strchr(":=@>/?", *end) != NULL) { end++; } histype1 = get_histtype((const char *)arg, (size_t)(end - arg), false); @@ -6385,7 +6389,7 @@ static int open_cmdwin(void) int i; linenr_T lnum; garray_T winsizes; - char_u typestr[2]; + char typestr[2]; int save_restart_edit = restart_edit; int save_State = State; bool save_exmode = exmode_active; @@ -6438,8 +6442,8 @@ static int open_cmdwin(void) const int histtype = hist_char2type(cmdwin_type); if (histtype == HIST_CMD || histtype == HIST_DEBUG) { if (p_wc == TAB) { - add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT, false); - add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL, false); + add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", MODE_INSERT, false); + add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", MODE_NORMAL, false); } set_option_value("ft", 0L, "vim", OPT_LOCAL); } @@ -6482,14 +6486,14 @@ static int open_cmdwin(void) // No Ex mode here! exmode_active = false; - State = NORMAL; + State = MODE_NORMAL; setmouse(); // Reset here so it can be set by a CmdWinEnter autocommand. cmdwin_result = 0; // Trigger CmdwinEnter autocommands. - typestr[0] = (char_u)cmdwin_type; + typestr[0] = (char)cmdwin_type; typestr[1] = NUL; apply_autocmds(EVENT_CMDWINENTER, typestr, typestr, false, curbuf); if (restart_edit != 0) { // autocmd with ":startinsert" @@ -6641,8 +6645,8 @@ char *script_get(exarg_T *const eap, size_t *const lenp) const char *const end_pattern = (cmd[2] != NUL ? (const char *)skipwhite(cmd + 2) : "."); for (;;) { - char *const theline = (char *)eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : - NUL, eap->cookie, 0, true); + char *const theline = eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : NUL, eap->cookie, 0, + true); if (theline == NULL || strcmp(end_pattern, theline) == 0) { xfree(theline); diff --git a/src/nvim/ex_getln.h b/src/nvim/ex_getln.h index fe2bf958b5..5da9febe71 100644 --- a/src/nvim/ex_getln.h +++ b/src/nvim/ex_getln.h @@ -48,7 +48,7 @@ typedef enum { /// Number of history tables #define HIST_COUNT (HIST_DEBUG + 1) -typedef char_u *(*CompleteListItemGetter)(expand_T *, int); +typedef char *(*CompleteListItemGetter)(expand_T *, int); /// History entry definition typedef struct hist_entry { diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index 1235087500..7eef6707dd 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -27,7 +27,7 @@ #include "nvim/fold.h" #include "nvim/getchar.h" #include "nvim/globals.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/move.h" #include "nvim/option.h" #include "nvim/os/input.h" @@ -571,7 +571,7 @@ static int makeopens(FILE *fd, char_u *dirnow) if (ssop_flags & SSOP_SESDIR) { PUTLINE_FAIL("exe \"cd \" . escape(expand(\"<sfile>:p:h\"), ' ')"); } else if (ssop_flags & SSOP_CURDIR) { - sname = home_replace_save(NULL, globaldir != NULL ? globaldir : dirnow); + sname = home_replace_save(NULL, globaldir != NULL ? (char_u *)globaldir : dirnow); char *fname_esc = ses_escape_fname((char *)sname, &ssop_flags); if (fprintf(fd, "cd %s\n", fname_esc) < 0) { xfree(fname_esc); @@ -930,7 +930,7 @@ void ex_mkrc(exarg_T *eap) viewFile = fname; using_vdir = true; } else if (*eap->arg != NUL) { - fname = (char *)eap->arg; + fname = eap->arg; } else if (eap->cmdidx == CMD_mkvimrc) { fname = VIMRC_FILE; } else if (eap->cmdidx == CMD_mksession) { @@ -997,7 +997,7 @@ void ex_mkrc(exarg_T *eap) } } else if (*dirnow != NUL && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) { - if (os_chdir((char *)globaldir) == 0) { + if (os_chdir(globaldir) == 0) { shorten_fnames(true); } } @@ -1012,15 +1012,6 @@ void ex_mkrc(exarg_T *eap) emsg(_(e_prev_dir)); } shorten_fnames(true); - // restore original dir - if (*dirnow != NUL && ((ssop_flags & SSOP_SESDIR) - || ((ssop_flags & SSOP_CURDIR) && globaldir != - NULL))) { - if (os_chdir((char *)dirnow) != 0) { - emsg(_(e_prev_dir)); - } - shorten_fnames(true); - } } xfree(dirnow); } else { diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c index 6a3acef91d..47e20d58a3 100644 --- a/src/nvim/file_search.c +++ b/src/nvim/file_search.c @@ -298,7 +298,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le && (vim_ispathsep(path[1]) || path[1] == NUL) && (!tagfile || vim_strchr(p_cpo, CPO_DOTTAG) == NULL) && rel_fname != NULL) { - size_t len = (size_t)(path_tail(rel_fname) - rel_fname); + size_t len = (size_t)((char_u *)path_tail((char *)rel_fname) - rel_fname); if (!vim_isAbsName(rel_fname) && len + 1 < MAXPATHL) { // Make the start dir an absolute path name. @@ -371,7 +371,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le ptr = xrealloc(search_ctx->ffsc_stopdirs_v, (dircount + 1) * sizeof(char_u *)); search_ctx->ffsc_stopdirs_v = ptr; - walker = vim_strchr(walker, ';'); + walker = (char_u *)vim_strchr((char *)walker, ';'); if (walker) { assert(walker - helper >= 0); search_ctx->ffsc_stopdirs_v[dircount - 1] = @@ -396,7 +396,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le * -fix path * -wildcard_stuff (might be NULL) */ - wc_part = vim_strchr(path, '*'); + wc_part = (char_u *)vim_strchr((char *)path, '*'); if (wc_part != NULL) { int64_t llevel; int len; @@ -477,7 +477,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le STRCAT(ff_expand_buffer, search_ctx->ffsc_fix_path); add_pathsep((char *)ff_expand_buffer); } else { - char_u *p = path_tail(search_ctx->ffsc_fix_path); + char_u *p = (char_u *)path_tail((char *)search_ctx->ffsc_fix_path); char_u *wc_path = NULL; char_u *temp = NULL; int len = 0; @@ -1481,7 +1481,7 @@ char_u *find_file_in_path_option(char_u *ptr, size_t len, int options, int first && rel_fname != NULL && STRLEN(rel_fname) + l < MAXPATHL) { STRCPY(NameBuff, rel_fname); - STRCPY(path_tail(NameBuff), ff_file_to_find); + STRCPY(path_tail((char *)NameBuff), ff_file_to_find); l = STRLEN(NameBuff); } else { STRCPY(NameBuff, ff_file_to_find); @@ -1643,7 +1643,7 @@ void do_autocmd_dirchanged(char *new_dir, CdScope scope, CdCause cause, bool pre abort(); } - apply_autocmds(event, (char_u *)buf, (char_u *)new_dir, false, curbuf); + apply_autocmds(event, buf, new_dir, false, curbuf); restore_v_event(dict, &save_v_event); diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index a132c2db43..06d72f3395 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -173,7 +173,7 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr) /// @param eap can be NULL! /// /// @return FAIL for failure, NOTDONE for directory (failure), or OK -int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, +int readfile(char *fname, char *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags, bool silent) { int fd = stdin_fd >= 0 ? stdin_fd : 0; @@ -189,10 +189,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski colnr_T read_buf_col = 0; // next char to read from this line char_u c; linenr_T lnum = from; - char_u *ptr = NULL; // pointer into read buffer - char_u *buffer = NULL; // read buffer - char_u *new_buffer = NULL; // init to shut up gcc - char_u *line_start = NULL; // init to shut up gcc + char *ptr = NULL; // pointer into read buffer + char *buffer = NULL; // read buffer + char *new_buffer = NULL; // init to shut up gcc + char *line_start = NULL; // init to shut up gcc int wasempty; // buffer was empty before reading colnr_T len; long size = 0; @@ -227,11 +227,11 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski int bad_char_behavior = BAD_REPLACE; // BAD_KEEP, BAD_DROP or character to // replace with - char_u *tmpname = NULL; // name of 'charconvert' output file + char *tmpname = NULL; // name of 'charconvert' output file int fio_flags = 0; - char_u *fenc; // fileencoding to use + char *fenc; // fileencoding to use bool fenc_alloced; // fenc_next is in allocated memory - char_u *fenc_next = NULL; // next item in 'fencs' or NULL + char *fenc_next = NULL; // next item in 'fencs' or NULL bool advance_fenc = false; long real_size = 0; #ifdef HAVE_ICONV @@ -241,12 +241,12 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski #endif bool converted = false; // true if conversion done bool notconverted = false; // true if conversion wanted but it wasn't possible - char_u conv_rest[CONV_RESTLEN]; + char conv_rest[CONV_RESTLEN]; int conv_restlen = 0; // nr of bytes in conv_rest[] pos_T orig_start; buf_T *old_curbuf; - char_u *old_b_ffname; - char_u *old_b_fname; + char *old_b_ffname; + char *old_b_fname; int using_b_ffname; int using_b_fname; static char *msg_is_a_directory = N_("is a directory"); @@ -266,7 +266,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski && fname != NULL && vim_strchr(p_cpo, CPO_FNAMER) != NULL && !(flags & READ_DUMMY)) { - if (set_rw_fname(fname, sfname) == FAIL) { + if (set_rw_fname((char_u *)fname, (char_u *)sfname) == FAIL) { return FAIL; } } @@ -276,10 +276,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // executing nasty autocommands. Also check if "fname" and "sfname" // point to one of these values. old_curbuf = curbuf; - old_b_ffname = curbuf->b_ffname; + old_b_ffname = (char *)curbuf->b_ffname; old_b_fname = curbuf->b_fname; - using_b_ffname = (fname == curbuf->b_ffname) - || (sfname == curbuf->b_ffname); + using_b_ffname = ((char_u *)fname == curbuf->b_ffname) + || ((char_u *)sfname == curbuf->b_ffname); using_b_fname = (fname == curbuf->b_fname) || (sfname == curbuf->b_fname); // After reading a file the cursor line changes but we don't want to @@ -347,7 +347,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // If the name is too long we might crash further on, quit here. if (namelen >= MAXPATHL) { - filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_("Illegal file name"), 0); msg_end(); msg_scroll = msg_save; return FAIL; @@ -356,9 +356,9 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // If the name ends in a path separator, we can't open it. Check here, // because reading the file may actually work, but then creating the // swap file may destroy it! Reported on MS-DOS and Win 95. - if (after_pathsep((const char *)fname, (const char *)(fname + namelen))) { + if (after_pathsep(fname, fname + namelen)) { if (!silent) { - filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_(msg_is_a_directory), 0); } msg_end(); msg_scroll = msg_save; @@ -367,23 +367,23 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } if (!read_buffer && !read_stdin && !read_fifo) { - perm = os_getperm((const char *)fname); + perm = os_getperm(fname); // On Unix it is possible to read a directory, so we have to // check for it before os_open(). if (perm >= 0 && !S_ISREG(perm) // not a regular file ... && !S_ISFIFO(perm) // ... or fifo && !S_ISSOCK(perm) // ... or socket #ifdef OPEN_CHR_FILES - && !(S_ISCHR(perm) && is_dev_fd_file(fname)) + && !(S_ISCHR(perm) && is_dev_fd_file((char_u *)fname)) // ... or a character special file named /dev/fd/<n> #endif ) { if (S_ISDIR(perm)) { if (!silent) { - filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_(msg_is_a_directory), 0); } } else { - filemess(curbuf, fname, (char_u *)_("is not a file"), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_("is not a file"), 0); } msg_end(); msg_scroll = msg_save; @@ -407,7 +407,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski if (newfile && !read_stdin && !read_buffer && !read_fifo) { // Remember time of file. - if (os_fileinfo((char *)fname, &file_info)) { + if (os_fileinfo(fname, &file_info)) { buf_store_file_info(curbuf, &file_info); curbuf->b_mtime_read = curbuf->b_mtime; curbuf->b_mtime_read_ns = curbuf->b_mtime_ns; @@ -443,10 +443,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski bool file_readonly = false; if (!read_buffer && !read_stdin) { if (!newfile || readonlymode || !(perm & 0222) - || !os_file_is_writable((char *)fname)) { + || !os_file_is_writable(fname)) { file_readonly = true; } - fd = os_open((char *)fname, O_RDONLY, 0); + fd = os_open(fname, O_RDONLY, 0); } if (fd < 0) { // cannot open at all @@ -467,7 +467,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // SwapExists autocommand may mess things up if (curbuf != old_curbuf || (using_b_ffname - && (old_b_ffname != curbuf->b_ffname)) + && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname))) { emsg(_(e_auchangedbuf)); @@ -475,10 +475,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } } if (!silent) { - if (dir_of_file_exists(fname)) { - filemess(curbuf, sfname, (char_u *)new_file_message(), 0); + if (dir_of_file_exists((char_u *)fname)) { + filemess(curbuf, (char_u *)sfname, (char_u *)new_file_message(), 0); } else { - filemess(curbuf, sfname, (char_u *)_("[New DIRECTORY]"), 0); + filemess(curbuf, (char_u *)sfname, (char_u *)_("[New DIRECTORY]"), 0); } } // Even though this is a new file, it might have been @@ -498,15 +498,16 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } return OK; // a new file is not an error } else { - filemess(curbuf, sfname, (char_u *)( - (fd == UV_EFBIG) ? _("[File too big]") : + filemess(curbuf, (char_u *)sfname, (char_u *)((fd == UV_EFBIG) ? _("[File too big]") : #if defined(UNIX) && defined(EOVERFLOW) - // libuv only returns -errno in Unix and in Windows open() does not - // set EOVERFLOW - (fd == -EOVERFLOW) ? _("[File too big]") : + // libuv only returns -errno + // in Unix and in Windows + // open() does not set + // EOVERFLOW + (fd == -EOVERFLOW) ? _("[File too big]") : #endif - _("[Permission Denied]")), 0); - curbuf->b_p_ro = TRUE; // must use "w!" now + _("[Permission Denied]")), 0); + curbuf->b_p_ro = true; // must use "w!" now } return FAIL; @@ -538,7 +539,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski check_need_swap(newfile); if (!read_stdin && (curbuf != old_curbuf - || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) + || (using_b_ffname && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname)))) { emsg(_(e_auchangedbuf)); if (!read_buffer) { @@ -644,10 +645,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski * (cd for example) if it invalidates fname or sfname. */ if (!read_stdin && (curbuf != old_curbuf - || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) + || (using_b_ffname && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname)) - || (fd = os_open((char *)fname, O_RDONLY, 0)) < 0)) { - --no_wait_return; + || (fd = os_open(fname, O_RDONLY, 0)) < 0)) { + no_wait_return--; msg_scroll = msg_save; if (fd < 0) { emsg(_("E200: *ReadPre autocommands made the file unreadable")); @@ -664,7 +665,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski if (!recoverymode && !filtering && !(flags & READ_DUMMY) && !silent) { if (!read_stdin && !read_buffer) { - filemess(curbuf, sfname, (char_u *)"", 0); + filemess(curbuf, (char_u *)sfname, (char_u *)"", 0); } } @@ -690,27 +691,27 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski * Decide which 'encoding' to use or use first. */ if (eap != NULL && eap->force_enc != 0) { - fenc = enc_canonize((char_u *)eap->cmd + eap->force_enc); + fenc = (char *)enc_canonize((char_u *)eap->cmd + eap->force_enc); fenc_alloced = true; keep_dest_enc = true; } else if (curbuf->b_p_bin) { - fenc = (char_u *)""; // binary: don't convert + fenc = ""; // binary: don't convert fenc_alloced = false; } else if (curbuf->b_help) { // Help files are either utf-8 or latin1. Try utf-8 first, if this // fails it must be latin1. // It is needed when the first line contains non-ASCII characters. // That is only in *.??x files. - fenc_next = (char_u *)"latin1"; - fenc = (char_u *)"utf-8"; + fenc_next = "latin1"; + fenc = "utf-8"; fenc_alloced = false; } else if (*p_fencs == NUL) { - fenc = curbuf->b_p_fenc; // use format from buffer + fenc = (char *)curbuf->b_p_fenc; // use format from buffer fenc_alloced = false; } else { - fenc_next = p_fencs; // try items in 'fileencodings' - fenc = next_fenc(&fenc_next, &fenc_alloced); + fenc_next = (char *)p_fencs; // try items in 'fileencodings' + fenc = (char *)next_fenc((char_u **)&fenc_next, &fenc_alloced); } /* @@ -797,21 +798,21 @@ retry: if (fenc_alloced) { xfree(fenc); } - fenc = (char_u *)""; + fenc = ""; fenc_alloced = false; } else { if (fenc_alloced) { xfree(fenc); } if (fenc_next != NULL) { - fenc = next_fenc(&fenc_next, &fenc_alloced); + fenc = (char *)next_fenc((char_u **)&fenc_next, &fenc_alloced); } else { - fenc = (char_u *)""; + fenc = ""; fenc_alloced = false; } } if (tmpname != NULL) { - os_remove((char *)tmpname); // delete converted file + os_remove(tmpname); // delete converted file XFREE_CLEAR(tmpname); } } @@ -821,7 +822,7 @@ retry: * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4. */ fio_flags = 0; - converted = need_conversion(fenc); + converted = need_conversion((char_u *)fenc); if (converted) { // "ucs-bom" means we need to check the first bytes of the file // for a BOM. @@ -835,7 +836,7 @@ retry: // appears not to handle this correctly. This works just like // conversion to UTF-8 except how the resulting character is put in // the buffer. - fio_flags = get_fio_flags(fenc); + fio_flags = get_fio_flags((char_u *)fenc); } @@ -843,7 +844,7 @@ retry: // Try using iconv() if we can't convert internally. if (fio_flags == 0 && !did_iconv) { - iconv_fd = (iconv_t)my_iconv_open((char_u *)"utf-8", fenc); + iconv_fd = (iconv_t)my_iconv_open((char_u *)"utf-8", (char_u *)fenc); } #endif @@ -863,7 +864,7 @@ retry: // Skip conversion when it's already done (retry for wrong // "fileformat"). if (tmpname == NULL) { - tmpname = readfile_charconvert(fname, fenc, &fd); + tmpname = (char *)readfile_charconvert((char_u *)fname, (char_u *)fenc, &fd); if (tmpname == NULL) { // Conversion failed. Try another one. advance_fenc = true; @@ -1128,8 +1129,8 @@ retry: if (size < 2 || curbuf->b_p_bin) { ccname = NULL; } else { - ccname = check_for_bom(ptr, size, &blen, - fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc)); + ccname = check_for_bom((char_u *)ptr, size, &blen, + fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags((char_u *)fenc)); } if (ccname != NULL) { // Remove BOM from the text @@ -1151,7 +1152,7 @@ retry: if (fenc_alloced) { xfree(fenc); } - fenc = ccname; + fenc = (char *)ccname; fenc_alloced = false; } // retry reading without getting new bytes or rewinding @@ -1182,10 +1183,10 @@ retry: size_t from_size; size_t to_size; - fromp = (char *)ptr; + fromp = ptr; from_size = size; ptr += size; - top = (char *)ptr; + top = ptr; to_size = real_size - size; /* @@ -1201,8 +1202,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, (char_u *)top); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, (char_u *)top); } // Deal with a bad byte and continue with the next. @@ -1227,14 +1227,14 @@ retry: // move the linerest to before the converted characters line_start = ptr - linerest; memmove(line_start, buffer, (size_t)linerest); - size = ((char_u *)top - ptr); + size = (top - ptr); } #endif if (fio_flags != 0) { unsigned int u8c; - char_u *dest; - char_u *tail = NULL; + char *dest; + char *tail = NULL; // Convert Unicode or Latin1 to UTF-8. // Go from end to start through the buffer, because the number @@ -1243,7 +1243,7 @@ retry: // to after the next character to convert. dest = ptr + real_size; if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8) { - p = ptr + size; + p = (uint8_t *)ptr + size; if (fio_flags == FIO_UTF8) { // Check for a trailing incomplete UTF-8 sequence tail = ptr + size - 1; @@ -1253,16 +1253,16 @@ retry: if (tail + utf_byte2len(*tail) <= ptr + size) { tail = NULL; } else { - p = tail; + p = (uint8_t *)tail; } } } else if (fio_flags & (FIO_UCS2 | FIO_UTF16)) { // Check for a trailing byte - p = ptr + (size & ~1); + p = (uint8_t *)ptr + (size & ~1); if (size & 1) { - tail = p; + tail = (char *)p; } - if ((fio_flags & FIO_UTF16) && p > ptr) { + if ((fio_flags & FIO_UTF16) && p > (uint8_t *)ptr) { // Check for a trailing leading word if (fio_flags & FIO_ENDIAN_L) { u8c = (*--p << 8); @@ -1272,16 +1272,16 @@ retry: u8c += (*--p << 8); } if (u8c >= 0xd800 && u8c <= 0xdbff) { - tail = p; + tail = (char *)p; } else { p += 2; } } } else { // FIO_UCS4 // Check for trailing 1, 2 or 3 bytes - p = ptr + (size & ~3); + p = (uint8_t *)ptr + (size & ~3); if (size & 3) { - tail = p; + tail = (char *)p; } } @@ -1294,7 +1294,7 @@ retry: } - while (p > ptr) { + while (p > (uint8_t *)ptr) { if (fio_flags & FIO_LATIN1) { u8c = *--p; } else if (fio_flags & (FIO_UCS2 | FIO_UTF16)) { @@ -1309,14 +1309,13 @@ retry: && u8c >= 0xdc00 && u8c <= 0xdfff) { int u16c; - if (p == ptr) { + if (p == (uint8_t *)ptr) { // Missing leading word. if (can_retry) { goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1344,8 +1343,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1375,7 +1373,7 @@ retry: if (*--p < 0x80) { u8c = *p; } else { - len = utf_head_off(ptr, p); + len = utf_head_off((char_u *)ptr, p); p -= len; u8c = utf_ptr2char((char *)p); if (len == 0) { @@ -1386,8 +1384,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1401,7 +1398,7 @@ retry: assert(u8c <= INT_MAX); // produce UTF-8 dest -= utf_char2len((int)u8c); - (void)utf_char2bytes((int)u8c, (char *)dest); + (void)utf_char2bytes((int)u8c, dest); } // move the linerest to before the converted characters @@ -1413,8 +1410,8 @@ retry: bool incomplete_tail = false; // Reading UTF-8: Check if the bytes are valid UTF-8. - for (p = ptr;; p++) { - int todo = (int)((ptr + size) - p); + for (p = (uint8_t *)ptr;; p++) { + int todo = (int)(((uint8_t *)ptr + size) - p); int l; if (todo <= 0) { @@ -1431,13 +1428,13 @@ retry: // a truncated file is more likely, or attempting // to read the rest of an incomplete sequence when // we have already done so. - if (p > ptr || filesize > 0) { + if (p > (uint8_t *)ptr || filesize > 0) { incomplete_tail = true; } // Incomplete byte sequence, move it to conv_rest[] // and try to read the rest of it, unless we've // already done so. - if (p > ptr) { + if (p > (uint8_t *)ptr) { conv_restlen = todo; memmove(conv_rest, p, conv_restlen); size -= conv_restlen; @@ -1454,12 +1451,12 @@ retry: #ifdef HAVE_ICONV // When we did a conversion report an error. if (iconv_fd != (iconv_t)-1 && conv_error == 0) { - conv_error = readfile_linenr(linecnt, ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } #endif // Remember the first linenr with an illegal byte if (conv_error == 0 && illegal_byte == 0) { - illegal_byte = readfile_linenr(linecnt, ptr, p); + illegal_byte = readfile_linenr(linecnt, (char_u *)ptr, p); } // Drop, keep or replace the bad byte. @@ -1475,7 +1472,7 @@ retry: } } } - if (p < ptr + size && !incomplete_tail) { + if (p < (uint8_t *)ptr + size && !incomplete_tail) { // Detected a UTF-8 error. rewind_retry: // Retry reading with another conversion. @@ -1509,10 +1506,10 @@ rewind_retry: try_mac = 1; } - for (p = ptr; p < ptr + size; ++p) { + for (p = (uint8_t *)ptr; p < (uint8_t *)ptr + size; p++) { if (*p == NL) { if (!try_unix - || (try_dos && p > ptr && p[-1] == CAR)) { + || (try_dos && p > (uint8_t *)ptr && p[-1] == CAR)) { fileformat = EOL_DOS; } else { fileformat = EOL_UNIX; @@ -1528,9 +1525,9 @@ rewind_retry: // Need to reset the counters when retrying fenc. try_mac = 1; try_unix = 1; - for (; p >= ptr && *p != CAR; p--) {} - if (p >= ptr) { - for (p = ptr; p < ptr + size; ++p) { + for (; p >= (uint8_t *)ptr && *p != CAR; p--) {} + if (p >= (uint8_t *)ptr) { + for (p = (uint8_t *)ptr; p < (uint8_t *)ptr + size; p++) { if (*p == NL) { try_unix++; } else if (*p == CAR) { @@ -1584,12 +1581,12 @@ rewind_retry: if (skip_count == 0) { *ptr = NUL; // end of line len = (colnr_T)(ptr - line_start + 1); - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; break; } if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } ++lnum; if (--read_count == 0) { @@ -1640,12 +1637,12 @@ rewind_retry: ff_error = EOL_DOS; } } - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; break; } if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } ++lnum; if (--read_count == 0) { @@ -1688,11 +1685,11 @@ failed: } *ptr = NUL; len = (colnr_T)(ptr - line_start + 1); - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; } else { if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } read_no_eol_lnum = ++lnum; } @@ -1703,7 +1700,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, fenc, OPT_FREE | OPT_LOCAL, 0); + set_string_option_direct("fenc", -1, (char_u *)fenc, OPT_FREE | OPT_LOCAL, 0); } if (fenc_alloced) { xfree(fenc); @@ -1738,7 +1735,7 @@ failed: } if (tmpname != NULL) { - os_remove((char *)tmpname); // delete converted file + os_remove(tmpname); // delete converted file xfree(tmpname); } --no_wait_return; // may wait for return now @@ -1783,7 +1780,7 @@ failed: if (got_int) { if (!(flags & READ_DUMMY)) { - filemess(curbuf, sfname, (char_u *)_(e_interr), 0); + filemess(curbuf, (char_u *)sfname, (char_u *)_(e_interr), 0); if (newfile) { curbuf->b_p_ro = TRUE; // must use "w!" now } @@ -1932,7 +1929,7 @@ failed: char_u hash[UNDO_HASH_SIZE]; sha256_finish(&sha_ctx, hash); - u_read_undo(NULL, hash, fname); + u_read_undo(NULL, hash, (char_u *)fname); } if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL)) { @@ -1960,8 +1957,7 @@ failed: if (!au_did_filetype && *curbuf->b_p_ft != NUL) { // EVENT_FILETYPE was not triggered but the buffer already has a // filetype. Trigger EVENT_FILETYPE using the existing filetype. - apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname, - true, curbuf); + apply_autocmds(EVENT_FILETYPE, (char *)curbuf->b_p_ft, curbuf->b_fname, true, curbuf); } } else { apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname, @@ -1993,7 +1989,7 @@ bool is_dev_fd_file(char_u *fname) { return STRNCMP(fname, "/dev/fd/", 8) == 0 && ascii_isdigit(fname[8]) - && *skipdigits(fname + 9) == NUL + && *skipdigits((char *)fname + 9) == NUL && (fname[9] != NUL || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')); } @@ -2087,7 +2083,7 @@ static char_u *next_fenc(char_u **pp, bool *alloced) *pp = NULL; return (char_u *)""; } - p = vim_strchr(*pp, ','); + p = (char_u *)vim_strchr((char *)(*pp), ','); if (p == NULL) { r = enc_canonize(*pp); *pp += STRLEN(*pp); @@ -2188,18 +2184,18 @@ char *new_file_message(void) /// @param append append to the file /// /// @return FAIL for failure, OK otherwise -int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, +int buf_write(buf_T *buf, char *fname, char *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering) { int fd; - char_u *backup = NULL; - int backup_copy = FALSE; // copy the original file? + char *backup = NULL; + int backup_copy = false; // copy the original file? int dobackup; - char_u *ffname; - char_u *wfname = NULL; // name of file to write to - char_u *s; - char_u *ptr; - char_u c; + char *ffname; + char *wfname = NULL; // name of file to write to + char *s; + char *ptr; + char c; int len; linenr_T lnum; long nchars; @@ -2213,9 +2209,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ char *errmsg = NULL; int errmsgarg = 0; bool errmsg_allocated = false; - char_u *buffer; - char_u smallbuf[SMBUFSIZE]; - char_u *backup_ext; + char *buffer; + char smallbuf[SMBUFSIZE]; + char *backup_ext; int bufsize; long perm; // file permissions int retval = OK; @@ -2238,10 +2234,10 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ int fileformat; int write_bin; struct bw_info write_info; // info for buf_write_bytes() - int converted = FALSE; - int notconverted = FALSE; - char_u *fenc; // effective 'fileencoding' - char_u *fenc_tofree = NULL; // allocated "fenc" + int converted = false; + int notconverted = false; + char *fenc; // effective 'fileencoding' + char *fenc_tofree = NULL; // allocated "fenc" #ifdef HAS_BW_FLAGS int wb_flags = 0; #endif @@ -2307,7 +2303,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ && !filtering && (!append || vim_strchr(p_cpo, CPO_FNAMEAPP) != NULL) && vim_strchr(p_cpo, CPO_FNAMEW) != NULL) { - if (set_rw_fname(fname, sfname) == FAIL) { + if (set_rw_fname((char_u *)fname, (char_u *)sfname) == FAIL) { return FAIL; } buf = curbuf; // just in case autocmds made "buf" invalid @@ -2358,17 +2354,17 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * Set curbuf to the buffer to be written. * Careful: The autocommands may call buf_write() recursively! */ - if (ffname == buf->b_ffname) { - buf_ffname = TRUE; + if ((char_u *)ffname == buf->b_ffname) { + buf_ffname = true; } - if (sfname == buf->b_sfname) { - buf_sfname = TRUE; + if ((char_u *)sfname == buf->b_sfname) { + buf_sfname = true; } - if (fname == buf->b_ffname) { - buf_fname_f = TRUE; + if ((char_u *)fname == buf->b_ffname) { + buf_fname_f = true; } - if (fname == buf->b_sfname) { - buf_fname_s = TRUE; + if ((char_u *)fname == buf->b_sfname) { + buf_fname_s = true; } // Set curwin/curbuf to buf and save a few things. @@ -2469,8 +2465,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ } if (reset_changed && buf->b_changed && !append && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)) { - /* Buffer still changed, the autocommands didn't work - * properly. */ + // Buffer still changed, the autocommands didn't work properly. return FAIL; } return OK; @@ -2508,16 +2503,16 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * be kept in fname, ffname and sfname. */ if (buf_ffname) { - ffname = buf->b_ffname; + ffname = (char *)buf->b_ffname; } if (buf_sfname) { - sfname = buf->b_sfname; + sfname = (char *)buf->b_sfname; } if (buf_fname_f) { - fname = buf->b_ffname; + fname = (char *)buf->b_ffname; } if (buf_fname_s) { - fname = buf->b_sfname; + fname = (char *)buf->b_sfname; } } @@ -2535,9 +2530,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ if (!filtering) { filemess(buf, #ifndef UNIX - sfname, + (char_u *)sfname, #else - fname, + (char_u *)fname, #endif (char_u *)"", 0); // show that we are busy } @@ -2559,8 +2554,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ FileInfo file_info_old; #if defined(UNIX) perm = -1; - if (!os_fileinfo((char *)fname, &file_info_old)) { - newfile = TRUE; + if (!os_fileinfo(fname, &file_info_old)) { + newfile = true; } else { perm = file_info_old.stat.st_mode; if (!S_ISREG(file_info_old.stat.st_mode)) { // not a file @@ -2568,7 +2563,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ SET_ERRMSG_NUM("E502", _("is a directory")); goto fail; } - if (os_nodetype((char *)fname) != NODE_WRITABLE) { + if (os_nodetype(fname) != NODE_WRITABLE) { SET_ERRMSG_NUM("E503", _("is not a file or writable device")); goto fail; } @@ -2609,7 +2604,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * Check if the file is really writable (when renaming the file to * make a backup we won't discover it later). */ - file_readonly = !os_file_is_writable((char *)fname); + file_readonly = !os_file_is_writable(fname); if (!forceit && file_readonly) { if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) { @@ -2636,7 +2631,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * For systems that support ACL: get the ACL from the original file. */ if (!newfile) { - acl = mch_get_acl(fname); + acl = mch_get_acl((char_u *)fname); } #endif @@ -2644,8 +2639,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * If 'backupskip' is not empty, don't make a backup for some files. */ dobackup = (p_wb || p_bk || *p_pm != NUL); - if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname)) { - dobackup = FALSE; + if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, (char_u *)sfname, (char_u *)ffname)) { + dobackup = false; } /* @@ -2683,7 +2678,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * - we don't have write permission in the directory */ if (os_fileinfo_hardlinks(&file_info_old) > 1 - || !os_fileinfo_link((char *)fname, &file_info) + || !os_fileinfo_link(fname, &file_info) || !os_fileinfo_id_equal(&file_info, &file_info_old)) { backup_copy = TRUE; } else { @@ -2695,7 +2690,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ STRCPY(IObuff, fname); for (i = 4913;; i += 123) { - sprintf((char *)path_tail(IObuff), "%d", i); + char *tail = path_tail((char *)IObuff); + size_t size = (char_u *)tail - IObuff; + snprintf(tail, IOSIZE - size, "%d", i); if (!os_fileinfo_link((char *)IObuff, &file_info)) { break; } @@ -2727,7 +2724,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ if ((bkc & BKC_BREAKSYMLINK) || (bkc & BKC_BREAKHARDLINK)) { #ifdef UNIX - bool file_info_link_ok = os_fileinfo_link((char *)fname, &file_info); + bool file_info_link_ok = os_fileinfo_link(fname, &file_info); // Symlinks. if ((bkc & BKC_BREAKSYMLINK) @@ -2748,17 +2745,17 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // make sure we have a valid backup extension to use if (*p_bex == NUL) { - backup_ext = (char_u *)".bak"; + backup_ext = ".bak"; } else { - backup_ext = p_bex; + backup_ext = (char *)p_bex; } if (backup_copy) { - char_u *wp; + char *wp; int some_error = false; - char_u *dirp; - char_u *rootname; - char_u *p; + char *dirp; + char *rootname; + char *p; /* * Try to make the backup in each directory in the 'bdir' option. @@ -2772,14 +2769,14 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * For these reasons, the existing writable file must be truncated * and reused. Creation of a backup COPY will be attempted. */ - dirp = p_bdir; + dirp = (char *)p_bdir; while (*dirp) { /* * Isolate one directory name, using an entry in 'bdir'. */ - size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); - p = IObuff + dir_len; - bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + size_t dir_len = copy_option_part((char_u **)&dirp, IObuff, IOSIZE, ","); + p = (char *)IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, p) && p[-1] == p[-2]; if (trailing_pathseps) { IObuff[dir_len - 2] = NUL; } @@ -2794,15 +2791,14 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ } if (trailing_pathseps) { // Ends with '//', Use Full path - if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) + if ((p = make_percent_swname((char *)IObuff, fname)) != NULL) { - backup = (char_u *)modname((char *)p, (char *)backup_ext, - no_prepend_dot); + backup = modname(p, backup_ext, no_prepend_dot); xfree(p); } } - rootname = get_file_in_dir(fname, IObuff); + rootname = (char *)get_file_in_dir((char_u *)fname, IObuff); if (rootname == NULL) { some_error = TRUE; // out of memory goto nobackup; @@ -2814,8 +2810,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // Make the backup file name. // if (backup == NULL) { - backup = (char_u *)modname((char *)rootname, (char *)backup_ext, - no_prepend_dot); + backup = modname(rootname, backup_ext, no_prepend_dot); } if (backup == NULL) { @@ -2827,7 +2822,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ /* * Check if backup file already exists. */ - if (os_fileinfo((char *)backup, &file_info_new)) { + if (os_fileinfo(backup, &file_info_new)) { if (os_fileinfo_id_equal(&file_info_new, &file_info_old)) { // // Backup file is same as original file. @@ -2846,9 +2841,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ wp = backup; } *wp = 'z'; - while (*wp > 'a' - && os_fileinfo((char *)backup, &file_info_new)) { - --*wp; + while (*wp > 'a' && os_fileinfo(backup, &file_info_new)) { + (*wp)--; } // They all exist??? Must be something wrong. if (*wp == 'a') { @@ -2864,7 +2858,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ if (backup != NULL) { // remove old backup, if present - os_remove((char *)backup); + os_remove(backup); // set file protection same as original file, but // strip s-bit. @@ -2877,26 +2871,26 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // protection bits for others. // if (file_info_new.stat.st_gid != file_info_old.stat.st_gid - && os_chown((char *)backup, -1, file_info_old.stat.st_gid) != 0) { + && os_chown(backup, -1, file_info_old.stat.st_gid) != 0) { os_setperm((const char *)backup, (perm & 0707) | ((perm & 07) << 3)); } #endif // copy the file - if (os_copy((char *)fname, (char *)backup, UV_FS_COPYFILE_FICLONE) + if (os_copy(fname, backup, UV_FS_COPYFILE_FICLONE) != 0) { SET_ERRMSG(_("E506: Can't write to backup file " "(add ! to override)")); } #ifdef UNIX - os_file_settime((char *)backup, + os_file_settime(backup, file_info_old.stat.st_atim.tv_sec, file_info_old.stat.st_mtim.tv_sec); #endif #ifdef HAVE_ACL - mch_set_acl(backup, acl); + mch_set_acl((char_u *)backup, acl); #endif break; } @@ -2913,9 +2907,9 @@ nobackup: } SET_ERRMSG(NULL); } else { - char_u *dirp; - char_u *p; - char_u *rootname; + char *dirp; + char *p; + char *rootname; /* * Make a backup by renaming the original file. @@ -2936,14 +2930,14 @@ nobackup: * path/fo.o.h.bak Try all directories in 'backupdir', first one * that works is used. */ - dirp = p_bdir; + dirp = (char *)p_bdir; while (*dirp) { /* * Isolate one directory name and make the backup file name. */ - size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); - p = IObuff + dir_len; - bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + size_t dir_len = copy_option_part((char_u **)&dirp, IObuff, IOSIZE, ","); + p = (char *)IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, p) && p[-1] == p[-2]; if (trailing_pathseps) { IObuff[dir_len - 2] = NUL; } @@ -2958,21 +2952,19 @@ nobackup: } if (trailing_pathseps) { // path ends with '//', use full path - if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) + if ((p = make_percent_swname((char *)IObuff, fname)) != NULL) { - backup = (char_u *)modname((char *)p, (char *)backup_ext, - no_prepend_dot); + backup = modname(p, backup_ext, no_prepend_dot); xfree(p); } } if (backup == NULL) { - rootname = get_file_in_dir(fname, IObuff); + rootname = (char *)get_file_in_dir((char_u *)fname, IObuff); if (rootname == NULL) { backup = NULL; } else { - backup = (char_u *)modname((char *)rootname, (char *)backup_ext, - no_prepend_dot); + backup = modname(rootname, backup_ext, no_prepend_dot); xfree(rootname); } } @@ -2983,13 +2975,13 @@ nobackup: * delete an existing one, try to use another name. * Change one character, just before the extension. */ - if (!p_bk && os_path_exists(backup)) { + if (!p_bk && os_path_exists((char_u *)backup)) { p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext); if (p < backup) { // empty file name ??? p = backup; } *p = 'z'; - while (*p > 'a' && os_path_exists(backup)) { + while (*p > 'a' && os_path_exists((char_u *)backup)) { (*p)--; } // They all exist??? Must be something wrong! @@ -3007,7 +2999,7 @@ nobackup: // If the renaming of the original file to the backup file // works, quit here. /// - if (vim_rename(fname, backup) == 0) { + if (vim_rename((char_u *)fname, (char_u *)backup) == 0) { break; } @@ -3068,21 +3060,21 @@ nobackup: // Check for forced 'fileencoding' from "++opt=val" argument. if (eap != NULL && eap->force_enc != 0) { - fenc = (char_u *)eap->cmd + eap->force_enc; - fenc = enc_canonize(fenc); + fenc = eap->cmd + eap->force_enc; + fenc = (char *)enc_canonize((char_u *)fenc); fenc_tofree = fenc; } else { - fenc = buf->b_p_fenc; + fenc = (char *)buf->b_p_fenc; } // Check if the file needs to be converted. - converted = need_conversion(fenc); + converted = need_conversion((char_u *)fenc); // Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done. Or // Latin1 to Unicode conversion. This is handled in buf_write_bytes(). // Prepare the flags for it and allocate bw_conv_buf when needed. if (converted) { - wb_flags = get_fio_flags(fenc); + wb_flags = get_fio_flags((char_u *)fenc); if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8)) { // Need to allocate a buffer to translate into. if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8)) { @@ -3102,7 +3094,7 @@ nobackup: #ifdef HAVE_ICONV // Use iconv() conversion when conversion is needed and it's not done // internally. - write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc, (char_u *)"utf-8"); + write_info.bw_iconv_fd = (iconv_t)my_iconv_open((char_u *)fenc, (char_u *)"utf-8"); if (write_info.bw_iconv_fd != (iconv_t)-1) { // We're going to use iconv(), allocate a buffer to convert in. write_info.bw_conv_buflen = bufsize * ICONV_MULT; @@ -3120,7 +3112,7 @@ nobackup: * overwrite the original file. */ if (*p_ccv != NUL) { - wfname = vim_tempname(); + wfname = (char *)vim_tempname(); if (wfname == NULL) { // Can't write without a tempfile! SET_ERRMSG(_("E214: Can't find temp file for writing")); goto restore_backup; @@ -3164,7 +3156,7 @@ nobackup: // quotum for number of files). // Appending will fail if the file does not exist and forceit is // FALSE. - while ((fd = os_open((char *)wfname, + while ((fd = os_open(wfname, O_WRONLY | (append ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND) @@ -3179,7 +3171,7 @@ nobackup: // Don't delete the file when it's a hard or symbolic link. if ((!newfile && os_fileinfo_hardlinks(&file_info_old) > 1) - || (os_fileinfo_link((char *)fname, &file_info) + || (os_fileinfo_link(fname, &file_info) && !os_fileinfo_id_equal(&file_info, &file_info_old))) { SET_ERRMSG(_("E166: Can't open linked file for writing")); } else { @@ -3200,7 +3192,7 @@ nobackup: } #endif if (!append) { // don't remove when appending - os_remove((char *)wfname); + os_remove(wfname); } continue; } @@ -3221,21 +3213,21 @@ restore_backup: // This may not work if the vim_rename() fails. // In that case we leave the copy around. // If file does not exist, put the copy in its place - if (!os_path_exists(fname)) { - vim_rename(backup, fname); + if (!os_path_exists((char_u *)fname)) { + vim_rename((char_u *)backup, (char_u *)fname); } // if original file does exist throw away the copy - if (os_path_exists(fname)) { - os_remove((char *)backup); + if (os_path_exists((char_u *)fname)) { + os_remove(backup); } } else { // try to put the original file back - vim_rename(backup, fname); + vim_rename((char_u *)backup, (char_u *)fname); } } // if original file no longer exists give an extra warning - if (!newfile && !os_path_exists(fname)) { + if (!newfile && !os_path_exists((char_u *)fname)) { end = 0; } } @@ -3249,7 +3241,7 @@ restore_backup: } SET_ERRMSG(NULL); - write_info.bw_buf = buffer; + write_info.bw_buf = (char_u *)buffer; nchars = 0; // use "++bin", "++nobin" or 'binary' @@ -3262,7 +3254,7 @@ restore_backup: // Skip the BOM when appending and the file already existed, the BOM // only makes sense at the start of the file. if (buf->b_p_bomb && !write_bin && (!append || perm < 0)) { - write_info.bw_len = make_bom(buffer, fenc); + write_info.bw_len = make_bom((char_u *)buffer, (char_u *)fenc); if (write_info.bw_len > 0) { // don't convert write_info.bw_flags = FIO_NOCONVERT | wb_flags; @@ -3292,9 +3284,9 @@ restore_backup: for (lnum = start; lnum <= end; lnum++) { // The next while loop is done once for each character written. // Keep it fast! - ptr = ml_get_buf(buf, lnum, false) - 1; + ptr = (char *)ml_get_buf(buf, lnum, false) - 1; if (write_undo_file) { - sha256_update(&sha_ctx, ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1)); + sha256_update(&sha_ctx, (char_u *)ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1)); } while ((c = *++ptr) != NUL) { if (c == NL) { @@ -3403,7 +3395,7 @@ restore_backup: // don't change the owner when it's already OK, some systems remove // permission or ACL stuff FileInfo file_info; - if (!os_fileinfo((char *)wfname, &file_info) + if (!os_fileinfo(wfname, &file_info) || file_info.stat.st_uid != file_info_old.stat.st_uid || file_info.stat.st_gid != file_info_old.stat.st_gid) { os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid); @@ -3435,7 +3427,7 @@ restore_backup: // Probably need to set the ACL before changing the user (can't set the // ACL on a file the user doesn't own). if (!backup_copy) { - mch_set_acl(wfname, acl); + mch_set_acl((char_u *)wfname, acl); } #endif @@ -3443,13 +3435,12 @@ restore_backup: // The file was written to a temp file, now it needs to be converted // with 'charconvert' to (overwrite) the output file. if (end != 0) { - if (eval_charconvert("utf-8", (char *)fenc, - (char *)wfname, (char *)fname) == FAIL) { + if (eval_charconvert("utf-8", fenc, wfname, fname) == FAIL) { write_info.bw_conv_error = true; end = 0; } } - os_remove((char *)wfname); + os_remove(wfname); xfree(wfname); } } @@ -3493,12 +3484,12 @@ restore_backup: } // copy the file. - if (os_copy((char *)backup, (char *)fname, UV_FS_COPYFILE_FICLONE) + if (os_copy(backup, fname, UV_FS_COPYFILE_FICLONE) == 0) { end = 1; // success } } else { - if (vim_rename(backup, fname) == 0) { + if (vim_rename((char_u *)backup, (char_u *)fname) == 0) { end = 1; } } @@ -3590,7 +3581,7 @@ restore_backup: * the backup file our 'original' file. */ if (*p_pm && dobackup) { - char *const org = modname((char *)fname, (char *)p_pm, false); + char *const org = modname(fname, (char *)p_pm, false); if (backup != NULL) { /* @@ -3600,7 +3591,7 @@ restore_backup: if (org == NULL) { emsg(_("E205: Patchmode: can't save original file")); } else if (!os_path_exists((char_u *)org)) { - vim_rename(backup, (char_u *)org); + vim_rename((char_u *)backup, (char_u *)org); XFREE_CLEAR(backup); // don't delete the file #ifdef UNIX os_file_settime(org, @@ -3636,7 +3627,7 @@ restore_backup: */ if (!p_bk && backup != NULL && !write_info.bw_conv_error - && os_remove((char *)backup) != 0) { + && os_remove(backup) != 0) { emsg(_("E207: Can't delete backup file")); } @@ -3700,7 +3691,7 @@ nofail: // Update the timestamp to avoid an "overwrite changed file" // prompt when writing again. - if (os_fileinfo((char *)fname, &file_info_old)) { + if (os_fileinfo(fname, &file_info_old)) { buf_store_file_info(buf, &file_info_old); buf->b_mtime_read = buf->b_mtime; buf->b_mtime_read_ns = buf->b_mtime_ns; @@ -3714,10 +3705,10 @@ nofail: * file. */ if (retval == OK && write_undo_file) { - char_u hash[UNDO_HASH_SIZE]; + char hash[UNDO_HASH_SIZE]; - sha256_finish(&sha_ctx, hash); - u_write_undo(NULL, FALSE, buf, hash); + sha256_finish(&sha_ctx, (char_u *)hash); + u_write_undo(NULL, false, buf, (char_u *)hash); } if (!should_abort(retval)) { @@ -4334,7 +4325,7 @@ void shorten_buf_fname(buf_T *buf, char_u *dirname, int force) if (buf->b_fname != NULL && !bt_nofile(buf) - && !path_with_url((char *)buf->b_fname) + && !path_with_url(buf->b_fname) && (force || buf->b_sfname == NULL || path_is_absolute(buf->b_sfname))) { @@ -4344,10 +4335,10 @@ void shorten_buf_fname(buf_T *buf, char_u *dirname, int force) p = path_shorten_fname(buf->b_ffname, dirname); if (p != NULL) { buf->b_sfname = vim_strsave(p); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; } if (p == NULL) { - buf->b_fname = buf->b_ffname; + buf->b_fname = (char *)buf->b_ffname; } } } @@ -4442,7 +4433,7 @@ char *modname(const char *fname, const char *ext, bool prepend_dot) char *e; // Prepend the dot if needed. - if (prepend_dot && *(e = (char *)path_tail((char_u *)retval)) != '.') { + if (prepend_dot && *(e = path_tail(retval)) != '.') { STRMOVE(e + 1, e); *e = '.'; } @@ -4653,7 +4644,7 @@ int vim_rename(const char_u *from, const char_u *to) * the file name differs we need to go through a temp file. */ if (FNAMECMP(from, to) == 0) { - if (p_fic && (STRCMP(path_tail((char_u *)from), path_tail((char_u *)to)) + if (p_fic && (STRCMP(path_tail((char *)from), path_tail((char *)to)) != 0)) { use_tmp_file = true; } else { @@ -4688,7 +4679,7 @@ int vim_rename(const char_u *from, const char_u *to) } STRCPY(tempname, from); for (n = 123; n < 99999; n++) { - char *tail = (char *)path_tail(tempname); + char *tail = path_tail((char *)tempname); snprintf(tail, (MAXPATHL + 1) - (tail - (char *)tempname - 1), "%d", n); if (!os_path_exists(tempname)) { @@ -4964,7 +4955,7 @@ int buf_check_timestamp(buf_T *buf) buf_store_file_info(buf, &file_info); } - if (os_isdir(buf->b_fname)) { + if (os_isdir((char_u *)buf->b_fname)) { // Don't do anything for a directory. Might contain the file explorer. } else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar) && !bufIsChanged(buf) && file_info_ok) { @@ -4992,15 +4983,14 @@ int buf_check_timestamp(buf_T *buf) set_vim_var_string(VV_FCS_REASON, reason, -1); set_vim_var_string(VV_FCS_CHOICE, "", -1); allbuf_lock++; - bool n = apply_autocmds(EVENT_FILECHANGEDSHELL, - buf->b_fname, buf->b_fname, false, buf); + bool n = apply_autocmds(EVENT_FILECHANGEDSHELL, buf->b_fname, buf->b_fname, false, buf); allbuf_lock--; busy = false; if (n) { if (!bufref_valid(&bufref)) { emsg(_("E246: FileChangedShell autocommand deleted buffer")); } - s = get_vim_var_str(VV_FCS_CHOICE); + s = (char_u *)get_vim_var_str(VV_FCS_CHOICE); if (STRCMP(s, "reload") == 0 && *reason != 'd') { reload = RELOAD_NORMAL; } else if (STRCMP(s, "edit") == 0) { @@ -5053,7 +5043,7 @@ int buf_check_timestamp(buf_T *buf) } if (mesg != NULL) { - path = home_replace_save(buf, buf->b_fname); + path = home_replace_save(buf, (char_u *)buf->b_fname); if (!helpmesg) { mesg2 = ""; } @@ -5078,7 +5068,7 @@ int buf_check_timestamp(buf_T *buf) reload = RELOAD_DETECT; break; } - } else if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned) { + } else if (State > MODE_NORMAL_BUSY || (State & MODE_CMDLINE) || already_warned) { if (*mesg2 != NUL) { xstrlcat(tbuf, "; ", tbuf_len - 1); xstrlcat(tbuf, mesg2, tbuf_len - 1); @@ -5124,8 +5114,7 @@ int buf_check_timestamp(buf_T *buf) // Trigger FileChangedShell when the file was changed in any way. if (bufref_valid(&bufref) && retval != 0) { - (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST, buf->b_fname, buf->b_fname, - false, buf); + (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST, buf->b_fname, buf->b_fname, false, buf); } return retval; } @@ -5199,7 +5188,7 @@ void buf_reload(buf_T *buf, int orig_mode, bool reload_options) if (saved == OK) { curbuf->b_flags |= BF_CHECK_RO; // check for RO again keep_filetype = true; // don't detect 'filetype' - if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, + if (readfile((char *)buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, &ea, flags, false) != OK) { if (!aborting()) { semsg(_("E321: Could not reload \"%s\""), buf->b_fname); @@ -5443,7 +5432,7 @@ void vim_deltempdir(void) { if (vim_tempdir != NULL) { // remove the trailing path separator - path_tail(vim_tempdir)[-1] = NUL; + path_tail((char *)vim_tempdir)[-1] = NUL; delete_recursive((const char *)vim_tempdir); XFREE_CLEAR(vim_tempdir); } @@ -5519,7 +5508,7 @@ char_u *vim_tempname(void) /// @param allow_dirs Allow matching with dir /// /// @return true if there is a match, false otherwise -bool match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sfname, char_u *tail, +bool match_file_pat(char *pattern, regprog_T **prog, char *fname, char *sfname, char *tail, int allow_dirs) { regmatch_T regmatch; @@ -5542,10 +5531,10 @@ bool match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sf */ if (regmatch.regprog != NULL && ((allow_dirs - && (vim_regexec(®match, fname, (colnr_T)0) + && (vim_regexec(®match, (char_u *)fname, (colnr_T)0) || (sfname != NULL - && vim_regexec(®match, sfname, (colnr_T)0)))) - || (!allow_dirs && vim_regexec(®match, tail, (colnr_T)0)))) { + && vim_regexec(®match, (char_u *)sfname, (colnr_T)0)))) + || (!allow_dirs && vim_regexec(®match, (char_u *)tail, (colnr_T)0)))) { result = true; } @@ -5576,17 +5565,18 @@ bool match_file_list(char_u *list, char_u *sfname, char_u *ffname) bool match; char_u *p; - tail = path_tail(sfname); + tail = (char_u *)path_tail((char *)sfname); // try all patterns in 'wildignore' p = list; while (*p) { copy_option_part(&p, buf, ARRAY_SIZE(buf), ","); - regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, false); + regpat = (char_u *)file_pat_to_reg_pat((char *)buf, NULL, &allow_dirs, false); if (regpat == NULL) { break; } - match = match_file_pat(regpat, NULL, ffname, sfname, tail, (int)allow_dirs); + match = match_file_pat((char *)regpat, NULL, (char *)ffname, (char *)sfname, (char *)tail, + (int)allow_dirs); xfree(regpat); if (match) { return true; @@ -5606,13 +5596,12 @@ bool match_file_list(char_u *list, char_u *sfname, char_u *ffname) /// @param no_bslash Don't use a backward slash as pathsep /// /// @return NULL on failure. -char_u *file_pat_to_reg_pat(const char_u *pat, const char_u *pat_end, char *allow_dirs, - int no_bslash) +char *file_pat_to_reg_pat(const char *pat, const char *pat_end, char *allow_dirs, int no_bslash) FUNC_ATTR_NONNULL_ARG(1) { - const char_u *endp; - char_u *reg_pat; - const char_u *p; + const char *endp; + char *reg_pat; + const char *p; int nested = 0; bool add_dollar = true; @@ -5624,7 +5613,7 @@ char_u *file_pat_to_reg_pat(const char_u *pat, const char_u *pat_end, char *allo } if (pat_end == pat) { - return (char_u *)xstrdup("^$"); + return xstrdup("^$"); } size_t size = 2; // '^' at start, '$' at end. diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 3e1b66fde3..090f754e93 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -775,7 +775,7 @@ void clearFolding(win_T *win) /// The changes in lines from top to bot (inclusive). void foldUpdate(win_T *wp, linenr_T top, linenr_T bot) { - if (compl_busy || State & INSERT) { + if (compl_busy || State & MODE_INSERT) { return; } @@ -1374,7 +1374,7 @@ void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long } // If appending a line in Insert mode, it should be included in the fold // just above the line. - if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { + if ((State & MODE_INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { line1--; } foldMarkAdjustRecurse(wp, &wp->w_folds, line1, line2, amount, amount_after); @@ -1394,7 +1394,7 @@ static void foldMarkAdjustRecurse(win_T *wp, garray_T *gap, linenr_T line1, line // In Insert mode an inserted line at the top of a fold is considered part // of the fold, otherwise it isn't. - if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { + if ((State & MODE_INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { top = line1 + 1; } else { top = line1; @@ -2911,7 +2911,7 @@ static void foldlevelIndent(fline_T *flp) // empty line or lines starting with a character in 'foldignore': level // depends on surrounding lines - if (*s == NUL || vim_strchr(flp->wp->w_p_fdi, *s) != NULL) { + if (*s == NUL || vim_strchr((char *)flp->wp->w_p_fdi, *s) != NULL) { // first and last line can't be undefined, use level 0 if (lnum == 1 || lnum == buf->b_ml.ml_line_count) { flp->lvl = 0; @@ -3042,7 +3042,7 @@ static void foldlevelExpr(fline_T *flp) /// Relies on the option value to have been checked for correctness already. static void parseMarker(win_T *wp) { - foldendmarker = vim_strchr(wp->w_p_fmr, ','); + foldendmarker = (char_u *)vim_strchr((char *)wp->w_p_fmr, ','); foldstartmarkerlen = (size_t)(foldendmarker++ - wp->w_p_fmr); foldendmarkerlen = STRLEN(foldendmarker); } diff --git a/src/nvim/generators/gen_eval.lua b/src/nvim/generators/gen_eval.lua index 945fa5099f..f094a04c07 100644 --- a/src/nvim/generators/gen_eval.lua +++ b/src/nvim/generators/gen_eval.lua @@ -1,9 +1,12 @@ local mpack = require('mpack') local nvimsrcdir = arg[1] -local autodir = arg[2] -local metadata_file = arg[3] -local funcs_file = arg[4] +local shared_file = arg[2] +local autodir = arg[3] +local metadata_file = arg[4] +local funcs_file = arg[5] + +_G.vim = loadfile(shared_file)() if nvimsrcdir == '--help' then print([[ @@ -20,7 +23,9 @@ package.path = nvimsrcdir .. '/?.lua;' .. package.path local funcsfname = autodir .. '/funcs.generated.h' -local gperfpipe = io.open(funcsfname .. '.gperf', 'wb') +local hashy = require'generators.hashy' + +local hashpipe = io.open(funcsfname, 'wb') local funcs = require('eval').funcs local metadata = mpack.unpack(io.open(metadata_file, 'rb'):read("*all")) @@ -38,21 +43,15 @@ local funcsdata = io.open(funcs_file, 'w') funcsdata:write(mpack.pack(funcs)) funcsdata:close() -gperfpipe:write([[ -%language=ANSI-C -%global-table -%readonly-tables -%define initializer-suffix ,0,0,BASE_NONE,NULL,NULL -%define word-array-name functions -%define hash-function-name hash_internal_func_gperf -%define lookup-function-name find_internal_func_gperf -%omit-struct-type -%struct-type -VimLFuncDef; -%% -]]) -for name, def in pairs(funcs) do +local names = vim.tbl_keys(funcs) + +local neworder, hashfun = hashy.hashy_hash("find_internal_func", names, function (idx) + return "functions["..idx.."].name" +end) +hashpipe:write("static const EvalFuncDef functions[] = {\n") +for _, name in ipairs(neworder) do + local def = funcs[name] local args = def.args or 0 if type(args) == 'number' then args = {args, args} @@ -62,7 +61,10 @@ for name, def in pairs(funcs) do local base = def.base or "BASE_NONE" local func = def.func or ('f_' .. name) local data = def.data or "NULL" - gperfpipe:write(('%s, %s, %s, %s, &%s, (FunPtr)%s\n') + hashpipe:write((' { "%s", %s, %s, %s, &%s, (FunPtr)%s },\n') :format(name, args[1], args[2], base, func, data)) end -gperfpipe:close() +hashpipe:write(' { NULL, 0, 0, BASE_NONE, NULL, NULL },\n') +hashpipe:write("};\n\n") +hashpipe:write(hashfun) +hashpipe:close() diff --git a/src/nvim/generators/hashy.lua b/src/nvim/generators/hashy.lua index fac24c810a..b10bafb9f9 100644 --- a/src/nvim/generators/hashy.lua +++ b/src/nvim/generators/hashy.lua @@ -77,7 +77,7 @@ function M.switcher(put, tab, maxlen, worst_buck_size) put "break;\n" end put " default: break;\n" - put " }\n " + put " }\n " else local startidx = #neworder table.insert(neworder, posbuck[keys[1]][1]) @@ -85,7 +85,7 @@ function M.switcher(put, tab, maxlen, worst_buck_size) put("low = "..startidx.."; ") if bucky then put("high = "..endidx.."; ") end end - put " break;\n" + put "break;\n" end end put " default: break;\n" @@ -105,17 +105,23 @@ function M.hashy_hash(name, strings, access) end local neworder = M.switcher(put, len_pos_buckets, maxlen, worst_buck_size) if worst_buck_size > 1 then - error [[ not implemented yet ]] -- TODO(bfredl) + put ([[ + for (int i = low; i < high; i++) { + if (!memcmp(str, ]]..access("i")..[[, len)) { + return i; + } + } + return -1; +]]) else - put [[ - if (low < 0) { + put ([[ + if (low < 0 || memcmp(str, ]]..access("low")..[[, len)) { return -1; } - ]] - put("if(memcmp(str, "..access("low")..", len)) {\n return -1;\n }\n") - put " return low;\n" - put "}\n\n" + return low; +]]) end + put "}\n\n" return neworder, table.concat(stats) end diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 05ee4cbafd..8881263d1c 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -31,7 +31,7 @@ #include "nvim/garray.h" #include "nvim/getchar.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/main.h" #include "nvim/mbyte.h" @@ -99,8 +99,8 @@ static int block_redo = FALSE; // Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode. #define MAP_HASH(mode, \ c1) (((mode) & \ - (NORMAL + VISUAL + SELECTMODE + \ - OP_PENDING + TERM_FOCUS)) ? (c1) : ((c1) ^ 0x80)) + (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | \ + MODE_OP_PENDING | MODE_TERMINAL)) ? (c1) : ((c1) ^ 0x80)) // Each mapping is put in one of the MAX_MAPHASH hash lists, // to speed up finding it. @@ -802,7 +802,7 @@ int start_redo_ins(void) // skip the count and the command character while ((c = read_redo(false, false)) != NUL) { - if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL) { + if (vim_strchr("AaIiRrOo", c) != NULL) { if (c == 'O' || c == 'o') { add_buff(&readbuf2, NL_STR, -1L); } @@ -840,13 +840,16 @@ static void init_typebuf(void) void init_default_mappings(void) { - add_map((char_u *)"Y y$", NORMAL, true); + add_map((char_u *)"Y y$", MODE_NORMAL, true); // Use normal! <C-L> to prevent inserting raw <C-L> when using i_<C-O> // See https://github.com/neovim/neovim/issues/17473 - add_map((char_u *)"<C-L> <Cmd>nohlsearch<Bar>diffupdate<Bar>normal! <C-L><CR>", NORMAL, true); - add_map((char_u *)"<C-U> <C-G>u<C-U>", INSERT, true); - add_map((char_u *)"<C-W> <C-G>u<C-W>", INSERT, true); + add_map((char_u *)"<C-L> <Cmd>nohlsearch<Bar>diffupdate<Bar>normal! <C-L><CR>", + MODE_NORMAL, true); + add_map((char_u *)"<C-U> <C-G>u<C-U>", MODE_INSERT, true); + add_map((char_u *)"<C-W> <C-G>u<C-W>", MODE_INSERT, true); + add_map((char_u *)"* y/\\\\V<C-R>\"<CR>", MODE_VISUAL, true); + add_map((char_u *)"# y?\\\\V<C-R>\"<CR>", MODE_VISUAL, true); } // Insert a string in position 'offset' in the typeahead buffer (for "@r" @@ -1195,7 +1198,7 @@ void ungetchars(int len) */ void may_sync_undo(void) { - if ((!(State & (INSERT + CMDLINE)) || arrow_used) + if ((!(State & (MODE_INSERT | MODE_CMDLINE)) || arrow_used) && scriptin[curscript] == NULL) { u_sync(false); } @@ -1353,7 +1356,7 @@ void openscript(char_u *name, bool directly) int save_finish_op = finish_op; int save_msg_scroll = msg_scroll; - State = NORMAL; + State = MODE_NORMAL; msg_scroll = false; // no msg scrolling in Normal mode restart_edit = 0; // don't go to Insert mode p_im = false; // don't use 'insertmode' @@ -1636,7 +1639,7 @@ int vgetc(void) // something with a meta- or alt- modifier that was not mapped, interpret // <M-x> as <Esc>x rather than as an unbound meta keypress. #8213 // In Terminal mode, however, this is not desirable. #16220 - if (!no_mapping && KeyTyped && !(State & TERM_FOCUS) + if (!no_mapping && KeyTyped && !(State & MODE_TERMINAL) && (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META)) { mod_mask = 0; int len = ins_char_typebuf(c, 0); @@ -1878,17 +1881,17 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) if (no_mapping == 0 && maphash_valid && (no_zero_mapping == 0 || tb_c1 != '0') && (typebuf.tb_maplen == 0 || is_plug_map - || (p_remap - && !(typebuf.tb_noremap[typebuf.tb_off] & (RM_NONE|RM_ABBR)))) - && !(p_paste && (State & (INSERT + CMDLINE))) - && !(State == HITRETURN && (tb_c1 == CAR || tb_c1 == ' ')) - && State != ASKMORE - && State != CONFIRM + || (!(typebuf.tb_noremap[typebuf.tb_off] & (RM_NONE|RM_ABBR)))) + && !(p_paste && (State & (MODE_INSERT | MODE_CMDLINE))) + && !(State == MODE_HITRETURN && (tb_c1 == CAR || tb_c1 == ' ')) + && State != MODE_ASKMORE + && State != MODE_CONFIRM && !at_ins_compl_key()) { if (tb_c1 == K_SPECIAL) { nolmaplen = 2; } else { - LANGMAP_ADJUST(tb_c1, !(State & (CMDLINE | INSERT)) && get_real_state() != SELECTMODE); + LANGMAP_ADJUST(tb_c1, ((State & (MODE_CMDLINE | MODE_INSERT)) == 0 + && get_real_state() != MODE_SELECT)); nolmaplen = 0; } // First try buffer-local mappings. @@ -1911,7 +1914,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // for the current state. // Skip ":lmap" mappings if keys were mapped. if (mp->m_keys[0] == tb_c1 && (mp->m_mode & local_State) - && ((mp->m_mode & LANGMAP) == 0 || typebuf.tb_maplen == 0)) { + && ((mp->m_mode & MODE_LANGMAP) == 0 || typebuf.tb_maplen == 0)) { int nomap = nolmaplen; int c2; // find the match length of this mapping @@ -1976,8 +1979,8 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) } else if (keylen > mp_match_len || (keylen == mp_match_len && mp_match != NULL - && (mp_match->m_mode & LANGMAP) == 0 - && (mp->m_mode & LANGMAP) != 0)) { + && (mp_match->m_mode & MODE_LANGMAP) == 0 + && (mp->m_mode & MODE_LANGMAP) != 0)) { // found a longer match mp_match = mp; mp_match_len = keylen; @@ -1999,7 +2002,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) } // Check for match with 'pastetoggle' - if (*p_pt != NUL && mp == NULL && (State & (INSERT|NORMAL))) { + if (*p_pt != NUL && mp == NULL && (State & (MODE_INSERT | MODE_NORMAL))) { bool match = typebuf_match_len(p_pt, &mlen); if (match) { // write chars to script file(s) @@ -2010,7 +2013,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) del_typebuf(mlen, 0); // remove the chars set_option_value("paste", !p_paste, NULL, 0); - if (!(State & INSERT)) { + if (!(State & MODE_INSERT)) { msg_col = 0; msg_row = Rows - 1; msg_clr_eos(); // clear ruler @@ -2089,7 +2092,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // Write chars to script file(s). // Note: :lmap mappings are written *after* being applied. #5658 - if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) == 0) { + if (keylen > typebuf.tb_maplen && (mp->m_mode & MODE_LANGMAP) == 0) { gotchars(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_maplen, (size_t)(keylen - typebuf.tb_maplen)); } @@ -2101,7 +2104,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // The depth check catches ":map x y" and ":map y x". if (++*mapdepth >= p_mmd) { emsg(_("E223: recursive mapping")); - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redrawcmdline(); } else { setcursor(); @@ -2114,7 +2117,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // In Select mode and a Visual mode mapping is used: Switch to Visual // mode temporarily. Append K_SELECT to switch back to Select mode. - if (VIsual_active && VIsual_select && (mp->m_mode & VISUAL)) { + if (VIsual_active && VIsual_select && (mp->m_mode & MODE_VISUAL)) { VIsual_select = false; (void)ins_typebuf((char *)K_SELECT_STRING, REMAP_NONE, 0, true, false); } @@ -2163,7 +2166,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) buf[2] = KE_IGNORE; buf[3] = NUL; map_str = vim_strsave(buf); - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { // redraw the command below the error msg_didout = true; if (msg_row < cmdline_row) { @@ -2190,7 +2193,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // If this is a LANGMAP mapping, then we didn't record the keys // at the start of the function and have to record them now. - if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) != 0) { + if (keylen > typebuf.tb_maplen && (mp->m_mode & MODE_LANGMAP) != 0) { gotchars(map_str, STRLEN(map_str)); } @@ -2353,7 +2356,7 @@ static int vgetorpeek(bool advance) // As a result typing CTRL-C in insert mode will // really insert a CTRL-C. if ((c || typebuf.tb_maplen) - && (State & (INSERT + CMDLINE))) { + && (State & (MODE_INSERT | MODE_CMDLINE))) { c = ESC; } else { c = Ctrl_C; @@ -2422,7 +2425,7 @@ static int vgetorpeek(bool advance) && !no_mapping && ex_normal_busy == 0 && typebuf.tb_maplen == 0 - && (State & INSERT) + && (State & MODE_INSERT) && (p_timeout || (keylen == KEYLEN_PART_KEY && p_ttimeout)) && (c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len, 3, 25L)) == 0) { colnr_T col = 0, vcol; @@ -2517,9 +2520,9 @@ static int vgetorpeek(bool advance) // For the cmdline window: Alternate between ESC and // CTRL-C: ESC for most situations and CTRL-C to close the // cmdline window. - if (p_im && (State & INSERT)) { + if (p_im && (State & MODE_INSERT)) { c = Ctrl_L; - } else if ((State & CMDLINE) || (cmdwin_type > 0 && tc == ESC)) { + } else if ((State & MODE_CMDLINE) || (cmdwin_type > 0 && tc == ESC)) { c = Ctrl_C; } else { c = ESC; @@ -2541,7 +2544,7 @@ static int vgetorpeek(bool advance) // changed text so far. Also for when 'lazyredraw' is set and // redrawing was postponed because there was something in the // input buffer (e.g., termresponse). - if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0 + if (((State & MODE_INSERT) != 0 || p_lz) && (State & MODE_CMDLINE) == 0 && advance && must_redraw != 0 && !need_wait_return) { update_screen(0); setcursor(); // put cursor back where it belongs @@ -2553,9 +2556,10 @@ static int vgetorpeek(bool advance) int showcmd_idx = 0; c1 = 0; if (typebuf.tb_len > 0 && advance && !exmode_active) { - if (((State & (NORMAL | INSERT)) || State == LANGMAP) && State != HITRETURN) { + if (((State & (MODE_NORMAL | MODE_INSERT)) || State == MODE_LANGMAP) + && State != MODE_HITRETURN) { // this looks nice when typing a dead character map - if (State & INSERT + if (State & MODE_INSERT && ptr2cells(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 @@ -2578,7 +2582,7 @@ static int vgetorpeek(bool advance) } // this looks nice when typing a dead character map - if ((State & CMDLINE) && cmdline_star == 0) { + 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); @@ -2616,10 +2620,10 @@ static int vgetorpeek(bool advance) pop_showcmd(); } if (c1 == 1) { - if (State & INSERT) { + if (State & MODE_INSERT) { edit_unputchar(); } - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { unputcmdline(); } else { setcursor(); // put cursor back where it belongs @@ -2651,7 +2655,7 @@ static int vgetorpeek(bool advance) // The "INSERT" message is taken care of here: // if we return an ESC to exit insert mode, the message is deleted // if we don't return an ESC but deleted the message before, redisplay it - if (advance && p_smd && msg_silent == 0 && (State & INSERT)) { + if (advance && p_smd && msg_silent == 0 && (State & MODE_INSERT)) { if (c == ESC && !mode_deleted && !no_mapping && mode_displayed) { if (typebuf.tb_len && !KeyTyped) { redraw_cmdline = true; // delete mode later @@ -2722,7 +2726,7 @@ int inchar(char_u *buf, int maxlen, long wait_time) * recursive loop may result (write error in swapfile, hit-return, timeout * on char wait, flush swapfile, write error....). */ - if (State != HITRETURN) { + if (State != MODE_HITRETURN) { did_outofmem_msg = false; // display out of memory message (again) did_swapwrite_msg = false; // display swap file write error again } @@ -2899,8 +2903,8 @@ void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs_len, mapargs->rhs_len = 0; mapargs->rhs_is_noop = true; } else { - replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, - REPTERM_DO_LT | REPTERM_NO_SIMPLIFY, NULL, cpo_flags); + replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, REPTERM_DO_LT, NULL, + cpo_flags); mapargs->rhs_len = STRLEN(replaced); // XXX: even when orig_rhs is non-empty, replace_termcodes may produce an empty string. mapargs->rhs_is_noop = orig_rhs[0] != NUL && mapargs->rhs_len == 0; @@ -3006,7 +3010,7 @@ int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *mapargs) // // With :unmap, literal white space is included in the {lhs}; there is no // separate {rhs}. - const char_u *lhs_end = to_parse; + const char *lhs_end = (char *)to_parse; bool do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL); while (*lhs_end && (is_unmap || !ascii_iswhite(*lhs_end))) { if ((lhs_end[0] == Ctrl_V || (do_backslash && lhs_end[0] == '\\')) @@ -3022,7 +3026,7 @@ int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *mapargs) // 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)(lhs_end - to_parse); + 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)); STRLCPY(lhs_to_replace, to_parse, orig_lhs_len + 1); @@ -3452,21 +3456,21 @@ theend: /// noreabbr {lhs} {rhs} " same, but no remapping for {rhs} /// unabbr {lhs} " remove abbreviation for {lhs} /// -/// for :map mode is NORMAL + VISUAL + SELECTMODE + OP_PENDING -/// for :map! mode is INSERT + CMDLINE -/// for :cmap mode is CMDLINE -/// for :imap mode is INSERT -/// for :lmap mode is LANGMAP -/// for :nmap mode is NORMAL -/// for :vmap mode is VISUAL + SELECTMODE -/// for :xmap mode is VISUAL -/// for :smap mode is SELECTMODE -/// for :omap mode is OP_PENDING -/// for :tmap mode is TERM_FOCUS +/// for :map mode is MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING +/// for :map! mode is MODE_INSERT | MODE_CMDLINE +/// for :cmap mode is MODE_CMDLINE +/// for :imap mode is MODE_INSERT +/// for :lmap mode is MODE_LANGMAP +/// for :nmap mode is MODE_NORMAL +/// for :vmap mode is MODE_VISUAL | MODE_SELECT +/// for :xmap mode is MODE_VISUAL +/// for :smap mode is MODE_SELECT +/// for :omap mode is MODE_OP_PENDING +/// for :tmap mode is MODE_TERMINAL /// -/// for :abbr mode is INSERT + CMDLINE -/// for :iabbr mode is INSERT -/// for :cabbr mode is CMDLINE +/// for :abbr mode is MODE_INSERT | MODE_CMDLINE +/// for :iabbr mode is MODE_INSERT +/// for :cabbr mode is MODE_CMDLINE /// ``` /// /// @param maptype 0 for |:map|, 1 for |:unmap|, 2 for |noremap|. @@ -3550,29 +3554,29 @@ int get_map_mode(char **cmdp, bool forceit) p = *cmdp; modec = (uint8_t)(*p++); if (modec == 'i') { - mode = INSERT; // :imap + mode = MODE_INSERT; // :imap } else if (modec == 'l') { - mode = LANGMAP; // :lmap + mode = MODE_LANGMAP; // :lmap } else if (modec == 'c') { - mode = CMDLINE; // :cmap + mode = MODE_CMDLINE; // :cmap } else if (modec == 'n' && *p != 'o') { // avoid :noremap - mode = NORMAL; // :nmap + mode = MODE_NORMAL; // :nmap } else if (modec == 'v') { - mode = VISUAL + SELECTMODE; // :vmap + mode = MODE_VISUAL | MODE_SELECT; // :vmap } else if (modec == 'x') { - mode = VISUAL; // :xmap + mode = MODE_VISUAL; // :xmap } else if (modec == 's') { - mode = SELECTMODE; // :smap + mode = MODE_SELECT; // :smap } else if (modec == 'o') { - mode = OP_PENDING; // :omap + mode = MODE_OP_PENDING; // :omap } else if (modec == 't') { - mode = TERM_FOCUS; // :tmap + mode = MODE_TERMINAL; // :tmap } else { p--; if (forceit) { - mode = INSERT + CMDLINE; // :map ! + mode = MODE_INSERT | MODE_CMDLINE; // :map ! } else { - mode = VISUAL + SELECTMODE + NORMAL + OP_PENDING; // :map + mode = MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING; // :map } } @@ -3671,34 +3675,34 @@ char *map_mode_to_chars(int mode) ga_init(&mapmode, 1, 7); - if ((mode & (INSERT + CMDLINE)) == INSERT + CMDLINE) { + if ((mode & (MODE_INSERT | MODE_CMDLINE)) == (MODE_INSERT | MODE_CMDLINE)) { ga_append(&mapmode, '!'); // :map! - } else if (mode & INSERT) { + } else if (mode & MODE_INSERT) { ga_append(&mapmode, 'i'); // :imap - } else if (mode & LANGMAP) { + } else if (mode & MODE_LANGMAP) { ga_append(&mapmode, 'l'); // :lmap - } else if (mode & CMDLINE) { + } else if (mode & MODE_CMDLINE) { ga_append(&mapmode, 'c'); // :cmap - } else if ((mode & (NORMAL + VISUAL + SELECTMODE + OP_PENDING)) - == NORMAL + VISUAL + SELECTMODE + OP_PENDING) { + } else if ((mode & (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING)) + == (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING)) { ga_append(&mapmode, ' '); // :map } else { - if (mode & NORMAL) { + if (mode & MODE_NORMAL) { ga_append(&mapmode, 'n'); // :nmap } - if (mode & OP_PENDING) { + if (mode & MODE_OP_PENDING) { ga_append(&mapmode, 'o'); // :omap } - if (mode & TERM_FOCUS) { + if (mode & MODE_TERMINAL) { ga_append(&mapmode, 't'); // :tmap } - if ((mode & (VISUAL + SELECTMODE)) == VISUAL + SELECTMODE) { + if ((mode & (MODE_VISUAL | MODE_SELECT)) == (MODE_VISUAL | MODE_SELECT)) { ga_append(&mapmode, 'v'); // :vmap } else { - if (mode & VISUAL) { + if (mode & MODE_VISUAL) { ga_append(&mapmode, 'x'); // :xmap } - if (mode & SELECTMODE) { + if (mode & MODE_SELECT) { ga_append(&mapmode, 's'); // :smap } } @@ -3807,17 +3811,17 @@ bool map_to_exists(const char *const str, const char *const modechars, const boo mode |= modeflags; \ } \ } while (0) - MAPMODE(mode, modechars, 'n', NORMAL); - MAPMODE(mode, modechars, 'v', VISUAL|SELECTMODE); - MAPMODE(mode, modechars, 'x', VISUAL); - MAPMODE(mode, modechars, 's', SELECTMODE); - MAPMODE(mode, modechars, 'o', OP_PENDING); - MAPMODE(mode, modechars, 'i', INSERT); - MAPMODE(mode, modechars, 'l', LANGMAP); - MAPMODE(mode, modechars, 'c', CMDLINE); + MAPMODE(mode, modechars, 'n', MODE_NORMAL); + MAPMODE(mode, modechars, 'v', MODE_VISUAL | MODE_SELECT); + MAPMODE(mode, modechars, 'x', MODE_VISUAL); + MAPMODE(mode, modechars, 's', MODE_SELECT); + MAPMODE(mode, modechars, 'o', MODE_OP_PENDING); + MAPMODE(mode, modechars, 'i', MODE_INSERT); + MAPMODE(mode, modechars, 'l', MODE_LANGMAP); + MAPMODE(mode, modechars, 'c', MODE_CMDLINE); #undef MAPMODE - retval = map_to_exists_mode((const char *)rhs, mode, abbr); + retval = map_to_exists_mode((char *)rhs, mode, abbr); xfree(buf); return retval; @@ -3895,9 +3899,9 @@ char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, bool forc if (isunmap) { expand_mapmodes = get_map_mode((char **)&cmd, forceit || isabbrev); } else { - expand_mapmodes = INSERT + CMDLINE; + expand_mapmodes = MODE_INSERT | MODE_CMDLINE; if (!isabbrev) { - expand_mapmodes += VISUAL + SELECTMODE + NORMAL + OP_PENDING; + expand_mapmodes |= MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING; } } expand_isabbrev = isabbrev; @@ -4405,76 +4409,76 @@ int makemap(FILE *fd, buf_T *buf) cmd = "map"; } switch (mp->m_mode) { - case NORMAL + VISUAL + SELECTMODE + OP_PENDING: + case MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING: break; - case NORMAL: + case MODE_NORMAL: c1 = 'n'; break; - case VISUAL: + case MODE_VISUAL: c1 = 'x'; break; - case SELECTMODE: + case MODE_SELECT: c1 = 's'; break; - case OP_PENDING: + case MODE_OP_PENDING: c1 = 'o'; break; - case NORMAL + VISUAL: + case MODE_NORMAL | MODE_VISUAL: c1 = 'n'; c2 = 'x'; break; - case NORMAL + SELECTMODE: + case MODE_NORMAL | MODE_SELECT: c1 = 'n'; c2 = 's'; break; - case NORMAL + OP_PENDING: + case MODE_NORMAL | MODE_OP_PENDING: c1 = 'n'; c2 = 'o'; break; - case VISUAL + SELECTMODE: + case MODE_VISUAL | MODE_SELECT: c1 = 'v'; break; - case VISUAL + OP_PENDING: + case MODE_VISUAL | MODE_OP_PENDING: c1 = 'x'; c2 = 'o'; break; - case SELECTMODE + OP_PENDING: + case MODE_SELECT | MODE_OP_PENDING: c1 = 's'; c2 = 'o'; break; - case NORMAL + VISUAL + SELECTMODE: + case MODE_NORMAL | MODE_VISUAL | MODE_SELECT: c1 = 'n'; c2 = 'v'; break; - case NORMAL + VISUAL + OP_PENDING: + case MODE_NORMAL | MODE_VISUAL | MODE_OP_PENDING: c1 = 'n'; c2 = 'x'; c3 = 'o'; break; - case NORMAL + SELECTMODE + OP_PENDING: + case MODE_NORMAL | MODE_SELECT | MODE_OP_PENDING: c1 = 'n'; c2 = 's'; c3 = 'o'; break; - case VISUAL + SELECTMODE + OP_PENDING: + case MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING: c1 = 'v'; c2 = 'o'; break; - case CMDLINE + INSERT: + case MODE_CMDLINE | MODE_INSERT: if (!abbr) { cmd = "map!"; } break; - case CMDLINE: + case MODE_CMDLINE: c1 = 'c'; break; - case INSERT: + case MODE_INSERT: c1 = 'i'; break; - case LANGMAP: + case MODE_LANGMAP: c1 = 'l'; break; - case TERM_FOCUS: + case MODE_TERMINAL: c1 = 't'; break; default: @@ -4731,9 +4735,9 @@ char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapb void add_map(char_u *map, int mode, bool nore) { char_u *s; - char_u *cpo_save = p_cpo; + char *cpo_save = p_cpo; - p_cpo = (char_u *)""; // Allow <> notation + p_cpo = ""; // Allow <> notation // Need to put string in allocated memory, because do_map() will modify it. s = vim_strsave(map); (void)do_map(nore ? 2 : 0, s, mode, false); @@ -4825,7 +4829,7 @@ mapblock_T *get_maphash(int index, buf_T *buf) } /// Get command argument for <Cmd> key -char_u *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) +char *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) { garray_T line_ga; int c1 = -1, c2; @@ -4898,7 +4902,7 @@ char_u *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) ga_clear(&line_ga); } - return (char_u *)line_ga.ga_data; + return line_ga.ga_data; } bool map_execute_lua(void) diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 620af9444c..1819af7ee4 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -84,7 +84,7 @@ EXTERN struct nvim_stats_s { // 0 not starting anymore // Number of Rows and Columns in the screen. -// Note: Use default_grid.Rows and default_grid.Columns to access items in +// Note: Use default_grid.rows and default_grid.cols to access items in // default_grid.chars[]. They may have different values when the screen // wasn't (re)allocated yet after setting Rows or Columns (e.g., when starting // up). @@ -253,7 +253,7 @@ EXTERN int lines_left INIT(= -1); // lines left for listing EXTERN int msg_no_more INIT(= false); // don't use more prompt, truncate // messages -EXTERN char_u *sourcing_name INIT(= NULL); // name of error message source +EXTERN char *sourcing_name INIT(= NULL); // name of error message source EXTERN linenr_T sourcing_lnum INIT(= 0); // line number of the source file EXTERN int ex_nesting_level INIT(= 0); // nesting level @@ -354,7 +354,7 @@ EXTERN bool did_source_packages INIT(= false); // provider function call EXTERN struct caller_scope { sctx_T script_ctx; - uint8_t *sourcing_name, *autocmd_fname, *autocmd_match; + char *sourcing_name, *autocmd_fname, *autocmd_match; linenr_T sourcing_lnum; int autocmd_bufnr; void *funccalp; @@ -421,10 +421,6 @@ EXTERN vimmenu_T *root_menu INIT(= NULL); // overruling of menus that the user already defined. EXTERN int sys_menu INIT(= false); -// While redrawing the screen this flag is set. It means the screen size -// ('lines' and 'rows') must not be changed. -EXTERN int updating_screen INIT(= 0); - // All windows are linked in a list. firstwin points to the first entry, // lastwin to the last entry (can be the same as firstwin) and curwin to the // currently active window. @@ -605,7 +601,7 @@ EXTERN pos_T Insstart; // This is where the latest // op_insert(), to detect correctly where inserting by the user started. EXTERN pos_T Insstart_orig; -// Stuff for VREPLACE mode. +// Stuff for MODE_VREPLACE state. EXTERN linenr_T orig_line_count INIT(= 0); // Line count when "gR" started EXTERN int vr_lines_changed INIT(= 0); // #Lines changed by "gR" so far @@ -631,13 +627,13 @@ EXTERN char_u *fenc_default INIT(= NULL); /// "State" is the main state of Vim. /// There are other variables that modify the state: -/// Visual_mode: When State is NORMAL or INSERT. -/// finish_op : When State is NORMAL, after typing the operator and +/// Visual_mode: When State is MODE_NORMAL or MODE_INSERT. +/// finish_op : When State is MODE_NORMAL, after typing the operator and /// before typing the motion command. /// motion_force: Last motion_force from do_pending_operator() /// debug_mode: Debug mode -EXTERN int State INIT(= NORMAL); // This is the current state of the - // command interpreter. +EXTERN int State INIT(= MODE_NORMAL); + EXTERN bool debug_mode INIT(= false); EXTERN bool finish_op INIT(= false); // true while an operator is pending EXTERN long opcount INIT(= 0); // count for pending operator @@ -748,16 +744,16 @@ EXTERN int global_busy INIT(= 0); ///< set when :global is executing EXTERN bool listcmd_busy INIT(= false); ///< set when :argdo, :windo or :bufdo is executing EXTERN bool need_start_insertmode INIT(= false); ///< start insert mode soon -#define MODE_MAX_LENGTH 4 // max mode length returned in get_mode() - // including the final NUL character +#define MODE_MAX_LENGTH 4 // max mode length returned in get_mode(), + // including the terminating NUL EXTERN char last_mode[MODE_MAX_LENGTH] INIT(= "n"); EXTERN char_u *last_cmdline INIT(= NULL); // last command line (for ":) EXTERN char_u *repeat_cmdline INIT(= NULL); // command line for "." EXTERN char_u *new_last_cmdline INIT(= NULL); // new value for last_cmdline -EXTERN char_u *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline +EXTERN char *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline EXTERN int autocmd_bufnr INIT(= 0); // fnum for <abuf> on cmdline -EXTERN char_u *autocmd_match INIT(= NULL); // name for <amatch> on cmdline +EXTERN char *autocmd_match INIT(= NULL); // name for <amatch> on cmdline EXTERN bool did_cursorhold INIT(= false); // set when CursorHold t'gerd EXTERN int postponed_split INIT(= 0); // for CTRL-W CTRL-] command @@ -811,7 +807,7 @@ extern char_u *compiled_sys; // When a window has a local directory, the absolute path of the global // current directory is stored here (in allocated memory). If the current // directory is not a local directory, globaldir is NULL. -EXTERN char_u *globaldir INIT(= NULL); +EXTERN char *globaldir INIT(= NULL); EXTERN char *last_chdir_reason INIT(= NULL); @@ -877,7 +873,8 @@ EXTERN char e_api_spawn_failed[] INIT(= N_("E903: Could not spawn API job")); EXTERN char e_argreq[] INIT(= N_("E471: Argument required")); EXTERN char e_backslash[] INIT(= N_("E10: \\ should be followed by /, ? or &")); EXTERN char e_cmdwin[] INIT(= N_("E11: Invalid in command-line window; <CR> executes, CTRL-C quits")); -EXTERN char e_curdir[] INIT(= N_( "E12: Command not allowed from exrc/vimrc in current dir or tag search")); +EXTERN char e_curdir[] INIT(= N_("E12: Command not allowed from exrc/vimrc in current dir or tag search")); +EXTERN char e_command_too_recursive[] INIT(= N_("E169: Command too recursive")); EXTERN char e_endif[] INIT(= N_("E171: Missing :endif")); EXTERN char e_endtry[] INIT(= N_("E600: Missing :endtry")); EXTERN char e_endwhile[] INIT(= N_("E170: Missing :endwhile")); @@ -997,6 +994,7 @@ EXTERN char e_listarg[] INIT(= N_("E686: Argument of %s must be a List")); EXTERN char e_unsupportedoption[] INIT(= N_("E519: Option not supported")); EXTERN char e_fnametoolong[] INIT(= N_("E856: Filename too long")); EXTERN char e_float_as_string[] INIT(= N_("E806: using Float as a String")); +EXTERN char e_cannot_edit_other_buf[] INIT(= N_("E788: Not allowed to edit another buffer now")); EXTERN char e_autocmd_err[] INIT(= N_("E5500: autocmd has thrown an exception: %s")); EXTERN char e_cmdmap_err[] INIT(= N_("E5520: <Cmd> mapping must end with <CR>")); diff --git a/src/nvim/grid.c b/src/nvim/grid.c index 8a5d8081c0..fa5c193fe0 100644 --- a/src/nvim/grid.c +++ b/src/nvim/grid.c @@ -6,6 +6,7 @@ #include "nvim/highlight.h" #include "nvim/ui.h" #include "nvim/vim.h" +#include "nvim/screen.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "grid.c.generated.h" @@ -63,7 +64,7 @@ void grid_clear_line(ScreenGrid *grid, size_t off, int width, bool valid) void grid_invalidate(ScreenGrid *grid) { - (void)memset(grid->attrs, -1, sizeof(sattr_T) * (size_t)(grid->Rows * grid->Columns)); + (void)memset(grid->attrs, -1, sizeof(sattr_T) * (size_t)grid->rows * (size_t)grid->cols); } bool grid_invalid_row(ScreenGrid *grid, int row) @@ -92,7 +93,7 @@ bool grid_lefthalve(ScreenGrid *grid, int row, int col) grid_adjust(&grid, &row, &col); return grid_off2cells(grid, grid->line_offset[row] + (size_t)col, - grid->line_offset[row] + (size_t)grid->Columns) > 1; + grid->line_offset[row] + (size_t)grid->cols) > 1; } /// Correct a position on the screen, if it's the right half of a double-wide @@ -128,7 +129,7 @@ void grid_getbytes(ScreenGrid *grid, int row, int col, char_u *bytes, int *attrp grid_adjust(&grid, &row, &col); // safety check - if (grid->chars != NULL && row < grid->Rows && col < grid->Columns) { + if (grid->chars != NULL && row < grid->rows && col < grid->cols) { off = grid->line_offset[row] + (size_t)col; *attrp = grid->attrs[off]; schar_copy(bytes, grid->chars[off]); @@ -202,8 +203,8 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col // Safety check. The check for negative row and column is to fix issue // vim/vim#4102. TODO(neovim): find out why row/col could be negative. if (grid->chars == NULL - || row >= grid->Rows || row < 0 - || col >= grid->Columns || col < 0) { + || row >= grid->rows || row < 0 + || col >= grid->cols || col < 0) { return; } @@ -225,8 +226,8 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col put_dirty_last = MAX(put_dirty_last, 1); } - max_off = grid->line_offset[row] + (size_t)grid->Columns; - while (col < grid->Columns + max_off = grid->line_offset[row] + (size_t)grid->cols; + while (col < grid->cols && (len < 0 || (int)(ptr - text) < len) && *ptr != NUL) { c = *ptr; @@ -259,7 +260,7 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col } else { prev_c = u8c; } - if (col + mbyte_cells > grid->Columns) { + if (col + mbyte_cells > grid->cols) { // Only 1 cell left, but character requires 2 cells: // display a '>' in the last column to avoid wrapping. */ c = '>'; @@ -338,7 +339,7 @@ void grid_puts_line_flush(bool set_cursor) if (put_dirty_first < put_dirty_last) { if (set_cursor) { ui_grid_cursor_goto(put_dirty_grid->handle, put_dirty_row, - MIN(put_dirty_last, put_dirty_grid->Columns - 1)); + MIN(put_dirty_last, put_dirty_grid->cols - 1)); } if (!put_dirty_grid->throttled) { ui_line(put_dirty_grid, put_dirty_row, put_dirty_first, put_dirty_last, @@ -371,11 +372,11 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int end_col += col_off; // safety check - if (end_row > grid->Rows) { - end_row = grid->Rows; + if (end_row > grid->rows) { + end_row = grid->rows; } - if (end_col > grid->Columns) { - end_col = grid->Columns; + if (end_col > grid->cols) { + end_col = grid->cols; } // nothing to do @@ -391,7 +392,7 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int if (start_col > 0 && grid_fix_col(grid, start_col, row) != start_col) { grid_puts_len(grid, (char_u *)" ", 1, row, start_col - 1, 0); } - if (end_col < grid->Columns + if (end_col < grid->cols && grid_fix_col(grid, end_col, row) != end_col) { grid_puts_len(grid, (char_u *)" ", 1, row, end_col, 0); } @@ -443,7 +444,7 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int } } - if (end_col == grid->Columns) { + if (end_col == grid->cols) { grid->line_wraps[row] = false; } } @@ -491,17 +492,17 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle // TODO(bfredl): check all callsites and eliminate // Check for illegal row and col, just in case - if (row >= grid->Rows) { - row = grid->Rows - 1; + if (row >= grid->rows) { + row = grid->rows - 1; } - if (endcol > grid->Columns) { - endcol = grid->Columns; + if (endcol > grid->cols) { + endcol = grid->cols; } grid_adjust(&grid, &row, &coloff); // Safety check. Avoids clang warnings down the call stack. - if (grid->chars == NULL || row >= grid->Rows || coloff >= grid->Columns) { + if (grid->chars == NULL || row >= grid->rows || coloff >= grid->cols) { DLOG("invalid state, skipped"); return; } @@ -509,7 +510,7 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle size_t off_from = 0; size_t off_to = grid->line_offset[row] + (size_t)coloff; max_off_from = linebuf_size; - max_off_to = grid->line_offset[row] + (size_t)grid->Columns; + max_off_to = grid->line_offset[row] + (size_t)grid->cols; if (rlflag) { // Clear rest first, because it's left of the text. @@ -617,7 +618,7 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle } } - if (clear_width > 0 || wp->w_width != grid->Columns) { + if (clear_width > 0 || wp->w_width != grid->cols) { // If we cleared after the end of the line, it did not wrap. // For vsplit, line wrapping is not possible. grid->line_wraps[row] = false; @@ -646,11 +647,11 @@ void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid) new.line_offset = xmalloc((size_t)rows * sizeof(*new.line_offset)); new.line_wraps = xmalloc((size_t)rows * sizeof(*new.line_wraps)); - new.Rows = rows; - new.Columns = columns; + new.rows = rows; + new.cols = columns; - for (new_row = 0; new_row < new.Rows; new_row++) { - new.line_offset[new_row] = (size_t)new_row * (size_t)new.Columns; + for (new_row = 0; new_row < new.rows; new_row++) { + new.line_offset[new_row] = (size_t)new_row * (size_t)new.cols; new.line_wraps[new_row] = false; grid_clear_line(&new, new.line_offset[new_row], columns, valid); @@ -660,8 +661,8 @@ void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid) // possible from the old screen to the new one and clear the rest // (used when resizing the window at the "--more--" prompt or when // executing an external command, for the GUI). - if (new_row < grid->Rows && grid->chars != NULL) { - int len = MIN(grid->Columns, new.Columns); + if (new_row < grid->rows && grid->chars != NULL) { + int len = MIN(grid->cols, new.cols); memmove(new.chars + new.line_offset[new_row], grid->chars + grid->line_offset[new_row], (size_t)len * sizeof(schar_T)); @@ -705,3 +706,83 @@ void grid_free_all_mem(void) xfree(linebuf_char); xfree(linebuf_attr); } + +/// (Re)allocates a window grid if size changed while in ext_multigrid mode. +/// Updates size, offsets and handle for the grid regardless. +/// +/// If "doclear" is true, don't try to copy from the old grid rather clear the +/// resized grid. +void win_grid_alloc(win_T *wp) +{ + ScreenGrid *grid = &wp->w_grid; + ScreenGrid *grid_allocated = &wp->w_grid_alloc; + + int rows = wp->w_height_inner; + int cols = wp->w_width_inner; + int total_rows = wp->w_height_outer; + int total_cols = wp->w_width_outer; + + bool want_allocation = ui_has(kUIMultigrid) || wp->w_floating; + bool has_allocation = (grid_allocated->chars != NULL); + + if (grid->rows != rows) { + wp->w_lines_valid = 0; + xfree(wp->w_lines); + wp->w_lines = xcalloc((size_t)rows + 1, sizeof(wline_T)); + } + + int was_resized = false; + if (want_allocation && (!has_allocation + || grid_allocated->rows != total_rows + || grid_allocated->cols != total_cols)) { + grid_alloc(grid_allocated, total_rows, total_cols, + wp->w_grid_alloc.valid, false); + grid_allocated->valid = true; + if (wp->w_floating && wp->w_float_config.border) { + wp->w_redr_border = true; + } + was_resized = true; + } else if (!want_allocation && has_allocation) { + // Single grid mode, all rendering will be redirected to default_grid. + // Only keep track of the size and offset of the window. + grid_free(grid_allocated); + grid_allocated->valid = false; + was_resized = true; + } else if (want_allocation && has_allocation && !wp->w_grid_alloc.valid) { + grid_invalidate(grid_allocated); + grid_allocated->valid = true; + } + + grid->rows = rows; + grid->cols = cols; + + if (want_allocation) { + grid->target = grid_allocated; + grid->row_offset = wp->w_winrow_off; + grid->col_offset = wp->w_wincol_off; + } else { + grid->target = &default_grid; + grid->row_offset = wp->w_winrow + wp->w_winrow_off; + grid->col_offset = wp->w_wincol + wp->w_wincol_off; + } + + // send grid resize event if: + // - a grid was just resized + // - screen_resize was called and all grid sizes must be sent + // - the UI wants multigrid event (necessary) + if ((resizing_screen || was_resized) && want_allocation) { + ui_call_grid_resize(grid_allocated->handle, + grid_allocated->cols, grid_allocated->rows); + } +} + +/// assign a handle to the grid. The grid need not be allocated. +void grid_assign_handle(ScreenGrid *grid) +{ + static int last_grid_handle = DEFAULT_GRID_HANDLE; + + // only assign a grid handle if not already + if (grid->handle == 0) { + grid->handle = ++last_grid_handle; + } +} diff --git a/src/nvim/grid_defs.h b/src/nvim/grid_defs.h index 2516ea52a7..a97a1c2c39 100644 --- a/src/nvim/grid_defs.h +++ b/src/nvim/grid_defs.h @@ -58,8 +58,8 @@ struct ScreenGrid { int *dirty_col; // the size of the allocated grid. - int Rows; - int Columns; + int rows; + int cols; // The state of the grid is valid. Otherwise it needs to be redrawn. bool valid; diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index f75f304bc1..fb174baef8 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -311,12 +311,12 @@ static char *parse_list_options(char_u *option_str, option_table_T *table, size_ */ stringp = option_str; while (*stringp) { - colonp = vim_strchr(stringp, ':'); + colonp = (char_u *)vim_strchr((char *)stringp, ':'); if (colonp == NULL) { ret = N_("E550: Missing colon"); break; } - commap = vim_strchr(stringp, ','); + commap = (char_u *)vim_strchr((char *)stringp, ','); if (commap == NULL) { commap = option_str + STRLEN(option_str); } @@ -661,7 +661,7 @@ void ex_hardcopy(exarg_T *eap) */ if (mch_print_init(&settings, curbuf->b_fname == NULL ? buf_spname(curbuf) : curbuf->b_sfname == - NULL ? curbuf->b_fname : curbuf->b_sfname, eap->forceit) == FAIL) { + NULL ? (char_u *)curbuf->b_fname : curbuf->b_sfname, eap->forceit) == FAIL) { return; } @@ -1576,7 +1576,7 @@ static void prt_resource_name(char *filename, void *cookie) static int prt_find_resource(char *name, struct prt_ps_resource_S *resource) { - char_u *buffer; + char *buffer; int retval; buffer = xmallocz(MAXPATHL); @@ -1584,11 +1584,11 @@ static int prt_find_resource(char *name, struct prt_ps_resource_S *resource) STRLCPY(resource->name, name, 64); // Look for named resource file in runtimepath STRCPY(buffer, "print"); - add_pathsep((char *)buffer); + add_pathsep(buffer); STRLCAT(buffer, name, MAXPATHL); STRLCAT(buffer, ".ps", MAXPATHL); resource->filename[0] = NUL; - retval = (do_in_runtimepath((char *)buffer, 0, prt_resource_name, resource->filename) + retval = (do_in_runtimepath(buffer, 0, prt_resource_name, resource->filename) && resource->filename[0] != NUL); xfree(buffer); return retval; @@ -2344,7 +2344,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) * Set up the font size. */ fontsize = PRT_PS_DEFAULT_FONTSIZE; - for (p = p_pfn; (p = vim_strchr(p, ':')) != NULL; ++p) { + for (p = p_pfn; (p = (char_u *)vim_strchr((char *)p, ':')) != NULL; p++) { if (p[1] == 'h' && ascii_isdigit(p[2])) { fontsize = atoi((char *)p + 2); } @@ -2413,7 +2413,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) } prt_ps_fd = os_fopen((char *)prt_ps_file_name, WRITEBIN); } else { - p = expand_env_save(psettings->outfile); + p = (char_u *)expand_env_save((char *)psettings->outfile); if (p != NULL) { prt_ps_fd = os_fopen((char *)p, WRITEBIN); xfree(p); @@ -2525,7 +2525,7 @@ bool mch_print_begin(prt_settings_T *psettings) char ctime_buf[50]; char *p_time = os_ctime(ctime_buf, sizeof(ctime_buf)); // Note: os_ctime() adds a \n so we have to remove it :-( - p = vim_strchr((char_u *)p_time, '\n'); + p = (char_u *)vim_strchr(p_time, '\n'); if (p != NULL) { *p = NUL; } diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h index 0515842b61..d293865efd 100644 --- a/src/nvim/highlight_defs.h +++ b/src/nvim/highlight_defs.h @@ -111,7 +111,9 @@ typedef enum { HLF_NFLOAT, // Floating window HLF_MSG, // Message area HLF_BORDER, // Floating window border - HLF_COUNT, // MUST be the last one + HLF_WBR, // Window bars + HLF_WBRNC, // Window bars of not-current windows + HLF_COUNT, // MUST be the last one } hlf_T; EXTERN const char *hlf_names[] INIT(= { @@ -172,6 +174,8 @@ EXTERN const char *hlf_names[] INIT(= { [HLF_NFLOAT] = "NormalFloat", [HLF_MSG] = "MsgArea", [HLF_BORDER] = "FloatBorder", + [HLF_WBR] = "WinBar", + [HLF_WBRNC] = "WinBarNC", }); diff --git a/src/nvim/highlight_group.c b/src/nvim/highlight_group.c index c4b826c3fd..0047cb02d6 100644 --- a/src/nvim/highlight_group.c +++ b/src/nvim/highlight_group.c @@ -103,9 +103,11 @@ static const char *highlight_init_both[] = { "TabLineFill cterm=reverse gui=reverse", "TabLineSel cterm=bold gui=bold", "TermCursor cterm=reverse gui=reverse", - "VertSplit cterm=reverse gui=reverse", + "WinBar cterm=bold gui=bold", "WildMenu ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black", + "default link VertSplit Normal", "default link WinSeparator VertSplit", + "default link WinBarNC WinBar", "default link EndOfBuffer NonText", "default link LineNrAbove LineNr", "default link LineNrBelow LineNr", @@ -560,7 +562,7 @@ int load_colors(char_u *name) recursive = true; size_t buflen = STRLEN(name) + 12; buf = xmalloc(buflen); - apply_autocmds(EVENT_COLORSCHEMEPRE, name, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_COLORSCHEMEPRE, (char *)name, curbuf->b_fname, false, curbuf); snprintf((char *)buf, buflen, "colors/%s.vim", name); retval = source_runtime((char *)buf, DIP_START + DIP_OPT); if (retval == FAIL) { @@ -568,7 +570,7 @@ int load_colors(char_u *name) retval = source_runtime((char *)buf, DIP_START + DIP_OPT); } xfree(buf); - apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_COLORSCHEME, (char *)name, curbuf->b_fname, false, curbuf); recursive = false; diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c index d9cc643e53..7174e58986 100644 --- a/src/nvim/if_cscope.c +++ b/src/nvim/if_cscope.c @@ -80,7 +80,7 @@ static enum { * Function given to ExpandGeneric() to obtain the cscope command * expansion. */ -char_u *get_cscope_name(expand_T *xp, int idx) +char *get_cscope_name(expand_T *xp, int idx) { int current_idx; @@ -88,7 +88,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) case EXP_CSCOPE_SUBCMD: // Complete with sub-commands of ":cscope": // add, find, help, kill, reset, show - return (char_u *)cs_cmds[idx].name; + return cs_cmds[idx].name; case EXP_SCSCOPE_SUBCMD: { // Complete with sub-commands of ":scscope": same sub-commands as // ":cscope" but skip commands which don't support split windows @@ -100,7 +100,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) } } } - return (char_u *)cs_cmds[i].name; + return cs_cmds[i].name; } case EXP_CSCOPE_FIND: { const char *query_type[] = @@ -112,7 +112,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) // {query_type} can be letters (c, d, ... a) or numbers (0, 1, // ..., 9) but only complete with letters, since numbers are // redundant. - return (char_u *)query_type[idx]; + return (char *)query_type[idx]; } case EXP_CSCOPE_KILL: { static char connection[5]; @@ -128,10 +128,10 @@ char_u *get_cscope_name(expand_T *xp, int idx) } if (current_idx++ == idx) { vim_snprintf(connection, sizeof(connection), "%zu", i); - return (char_u *)connection; + return connection; } } - return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL; + return (current_idx == idx && idx > 0) ? "-1" : NULL; } default: return NULL; @@ -962,7 +962,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool cmdletter = opt[0]; } - qfpos = (char *)vim_strchr(p_csqf, cmdletter); + qfpos = vim_strchr((char *)p_csqf, cmdletter); if (qfpos != NULL) { qfpos++; // next symbol must be + or - @@ -972,8 +972,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool } if (*qfpos != '0' - && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)"cscope", - curbuf->b_fname, true, curbuf)) { + && apply_autocmds(EVENT_QUICKFIXCMDPRE, "cscope", curbuf->b_fname, true, curbuf)) { if (aborting()) { return false; } @@ -1049,8 +1048,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool postponed_split = 0; } - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)"cscope", - curbuf->b_fname, TRUE, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, "cscope", curbuf->b_fname, true, curbuf); if (use_ll) { /* * In the location list window, use the displayed location @@ -2008,8 +2006,8 @@ static char *cs_resolve_file(size_t i, char *name) // path in path resolution. csdir = xmalloc(MAXPATHL); STRLCPY(csdir, csinfo[i].fname, - path_tail((char_u *)csinfo[i].fname) - - (char_u *)csinfo[i].fname + 1); + path_tail(csinfo[i].fname) + - csinfo[i].fname + 1); len += STRLEN(csdir); } diff --git a/src/nvim/indent.c b/src/nvim/indent.c index b7eb6f27f5..882a10e1e8 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -404,10 +404,10 @@ int get_number_indent(linenr_T lnum) pos.lnum = 0; // In format_lines() (i.e. not insert mode), fo+=q is needed too... - if ((State & INSERT) || has_format_option(FO_Q_COMS)) { + if ((State & MODE_INSERT) || has_format_option(FO_Q_COMS)) { lead_len = get_leader_len(ml_get(lnum), NULL, false, true); } - regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)curbuf->b_p_flp, RE_MAGIC); if (regmatch.regprog != NULL) { regmatch.rm_ic = false; @@ -467,7 +467,7 @@ int get_breakindent_win(win_T *wp, char_u *line) // add additional indent for numbered lists if (wp->w_briopt_list != 0) { regmatch_T regmatch = { - .regprog = vim_regcomp(curbuf->b_p_flp, + .regprog = vim_regcomp((char *)curbuf->b_p_flp, RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT), }; @@ -522,6 +522,11 @@ int inindent(int extra) } } +/// @return true if the conditions are OK for smart indenting. +bool may_do_si(void) +{ + return curbuf->b_p_si && !curbuf->b_p_cin && *curbuf->b_p_inde == NUL && !p_paste; +} // Get indent level from 'indentexpr'. int get_expr_indent(void) @@ -560,7 +565,7 @@ int get_expr_indent(void) // Pretend to be in Insert mode, allow cursor past end of line for "o" // command. save_State = State; - State = INSERT; + State = MODE_INSERT; curwin->w_cursor = save_pos; curwin->w_curswant = save_curswant; curwin->w_set_curswant = save_set_curswant; diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c index 54e7d72adc..e6dc985726 100644 --- a/src/nvim/indent_c.c +++ b/src/nvim/indent_c.c @@ -1,12 +1,9 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - #include <assert.h> #include <inttypes.h> -#include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/charset.h" #include "nvim/cursor.h" @@ -19,11 +16,12 @@ #include "nvim/option.h" #include "nvim/search.h" #include "nvim/strings.h" +#include "nvim/vim.h" // Find result cache for cpp_baseclass typedef struct { - int found; - lpos_T lpos; + int found; + lpos_T lpos; } cpp_baseclass_cache_T; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -44,10 +42,11 @@ pos_T *find_start_comment(int ind_maxcomment) // XXX pos_T *pos; int64_t cur_maxcomment = ind_maxcomment; - for (;; ) { + for (;;) { pos = findmatchlimit(NULL, '*', FM_BACKWARD, cur_maxcomment); - if (pos == NULL) + if (pos == NULL) { break; + } /* * Check if the comment start we found is inside a string. @@ -105,30 +104,27 @@ static pos_T *ind_find_start_CORS(linenr_T *is_raw) */ static pos_T *find_start_rawstring(int ind_maxcomment) // XXX { - pos_T *pos; - long cur_maxcomment = ind_maxcomment; + pos_T *pos; + long cur_maxcomment = ind_maxcomment; - for (;;) - { - pos = findmatchlimit(NULL, 'R', FM_BACKWARD, cur_maxcomment); - if (pos == NULL) - break; + for (;;) { + pos = findmatchlimit(NULL, 'R', FM_BACKWARD, cur_maxcomment); + if (pos == NULL) { + break; + } - /* - * Check if the raw string start we found is inside a string. - * If it is then restrict the search to below this line and try again. - */ - if (!is_pos_in_string(ml_get(pos->lnum), pos->col)) { - break; - } - cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1; - if (cur_maxcomment <= 0) - { - pos = NULL; - break; - } + // Check if the raw string start we found is inside a string. + // If it is then restrict the search to below this line and try again. + if (!is_pos_in_string(ml_get(pos->lnum), pos->col)) { + break; } - return pos; + cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1; + if (cur_maxcomment <= 0) { + pos = NULL; + break; + } + } + return pos; } /* @@ -154,7 +150,7 @@ static const char_u *skip_string(const char_u *p) i++; } } - if (p[i] == '\'') { // check for trailing ' + if (p[i - 1] != NUL && p[i] == '\'') { // check for trailing ' p += i; continue; } @@ -171,8 +167,8 @@ static const char_u *skip_string(const char_u *p) } } else if (p[0] == 'R' && p[1] == '"') { // Raw string: R"[delim](...)[delim]" - const char_u *delim = p + 2; - const char_u *paren = vim_strchr(delim, '('); + const char *delim = (char *)p + 2; + const char *paren = vim_strchr((char *)delim, '('); if (paren != NULL) { const ptrdiff_t delim_len = paren - delim; @@ -228,7 +224,7 @@ bool cin_is_cinword(const char_u *line) char_u *cinw_buf = xmalloc(cinw_len); line = (char_u *)skipwhite((char *)line); - for (char_u *cinw = curbuf->b_p_cinw; *cinw; ) { + for (char_u *cinw = curbuf->b_p_cinw; *cinw;) { size_t len = copy_option_part(&cinw, cinw_buf, cinw_len, ","); if (STRNCMP(line, cinw_buf, len) == 0 && (!vim_iswordc(line[len]) || !vim_iswordc(line[len - 1]))) { @@ -243,7 +239,6 @@ bool cin_is_cinword(const char_u *line) } - /* * Skip over white space and C comments within the line. * Also skip over Perl/shell comments if desired. @@ -269,8 +264,9 @@ static const char_u *cin_skipcomment(const char_u *s) s += STRLEN(s); break; } - if (*s != '*') + if (*s != '*') { break; + } for (++s; *s; s++) { // skip slash-star comment if (s[0] == '*' && s[1] == '/') { s += 2; @@ -296,8 +292,8 @@ static int cin_nocode(const char_u *s) static pos_T *find_line_comment(void) // XXX { static pos_T pos; - char_u *line; - char_u *p; + char_u *line; + char_u *p; pos = curwin->w_cursor; while (--pos.lnum > 0) { @@ -307,8 +303,9 @@ static pos_T *find_line_comment(void) // XXX pos.col = (int)(p - line); return &pos; } - if (*p != NUL) + if (*p != NUL) { break; + } } return NULL; } @@ -324,8 +321,8 @@ static bool cin_has_js_key(const char_u *text) quote = *s; ++s; } - if (!vim_isIDc(*s)) { // need at least one ID character - return FALSE; + if (!vim_isIDc(*s)) { // need at least one ID character + return false; } while (vim_isIDc(*s)) { @@ -350,8 +347,9 @@ static bool cin_islabel_skip(const char_u **s) return false; } - while (vim_isIDc(**s)) + while (vim_isIDc(**s)) { (*s)++; + } *s = cin_skipcomment(*s); @@ -431,10 +429,11 @@ static int cin_isinit(void) s = cin_skipcomment(get_cursor_line_ptr()); - if (cin_starts_with(s, "typedef")) + if (cin_starts_with(s, "typedef")) { s = cin_skipcomment(s + 7); + } - for (;; ) { + for (;;) { int i, l; for (i = 0; i < (int)ARRAY_SIZE(skip); ++i) { @@ -445,26 +444,26 @@ static int cin_isinit(void) break; } } - if (l != 0) + if (l != 0) { break; + } } - if (cin_starts_with(s, "enum")) - return TRUE; + if (cin_starts_with(s, "enum")) { + return true; + } - if (cin_ends_in(s, (char_u *)"=", (char_u *)"{")) - return TRUE; + if (cin_ends_in(s, (char_u *)"=", (char_u *)"{")) { + return true; + } return FALSE; } -/* - * Recognize a switch label: "case .*:" or "default:". - */ -bool cin_iscase( - const char_u *s, - bool strict // Allow relaxed check of case statement for JS -) +/// Recognize a switch label: "case .*:" or "default:". +/// +/// @param strict Allow relaxed check of case statement for JS +bool cin_iscase(const char_u *s, bool strict) { s = cin_skipcomment(s); if (cin_starts_with(s, "case")) { @@ -522,7 +521,7 @@ bool cin_isscopedecl(const char_u *p) bool found = false; - for (char_u *cinsd = curbuf->b_p_cinsd; *cinsd; ) { + for (char_u *cinsd = curbuf->b_p_cinsd; *cinsd;) { const size_t len = copy_option_part(&cinsd, cinsd_buf, cinsd_len, ","); if (STRNCMP(s, cinsd_buf, len) == 0) { const char_u *skip = cin_skipcomment(s + len); @@ -586,8 +585,8 @@ static bool cin_is_cpp_namespace(const char_u *s) /* * Return a pointer to the first non-empty non-comment character after a ':'. * Return NULL if not found. - * case 234: a = b; - * ^ + * case 234: a = b; + * ^ */ static const char_u *after_label(const char_u *l) { @@ -602,11 +601,13 @@ static const char_u *after_label(const char_u *l) l += 2; // skip over 'x' } } - if (*l == NUL) + if (*l == NUL) { return NULL; + } l = cin_skipcomment(l + 1); - if (*l == NUL) + if (*l == NUL) { return NULL; + } return l; } @@ -623,8 +624,9 @@ static int get_indent_nolabel(linenr_T lnum) // XXX l = ml_get(lnum); p = after_label(l); - if (p == NULL) + if (p == NULL) { return 0; + } fp.col = (colnr_T)(p - l); fp.lnum = lnum; @@ -635,8 +637,8 @@ static int get_indent_nolabel(linenr_T lnum) // XXX /* * Find indent for line "lnum", ignoring any case or jump label. * Also return a pointer to the text (after the label) in "pp". - * label: if (asdf && asdfasdf) - * ^ + * label: if (asdf && asdfasdf) + * ^ */ static int skip_label(linenr_T lnum, const char_u **pp) { @@ -666,14 +668,14 @@ static int skip_label(linenr_T lnum, const char_u **pp) /* * Return the indent of the first variable name after a type in a declaration. - * int a, indent of "a" - * static struct foo b, indent of "b" - * enum bla c, indent of "c" + * int a, indent of "a" + * static struct foo b, indent of "b" + * enum bla c, indent of "c" * Returns zero when it doesn't look like a declaration. */ static int cin_first_id_amount(void) { - char_u *line, *p, *s; + char_u *line, *p, *s; int len; pos_T fp; colnr_T col; @@ -699,10 +701,10 @@ static int cin_first_id_amount(void) p = s; } } - for (len = 0; vim_isIDc(p[len]); ++len) - ; - if (len == 0 || !ascii_iswhite(p[len]) || cin_nocode(p)) + for (len = 0; vim_isIDc(p[len]); len++) {} + if (len == 0 || !ascii_iswhite(p[len]) || cin_nocode(p)) { return 0; + } p = (char_u *)skipwhite((char *)p + len); fp.lnum = curwin->w_cursor.lnum; @@ -717,8 +719,8 @@ static int cin_first_id_amount(void) * Return zero if no (useful) equal sign found. * Return -1 if the line above "lnum" ends in a backslash. * foo = "asdf\ - * asdf\ - * here"; + * asdf\ + * here"; */ static int cin_get_equal_amount(linenr_T lnum) { @@ -729,20 +731,22 @@ static int cin_get_equal_amount(linenr_T lnum) if (lnum > 1) { line = ml_get(lnum - 1); - if (*line != NUL && line[STRLEN(line) - 1] == '\\') + if (*line != NUL && line[STRLEN(line) - 1] == '\\') { return -1; + } } line = s = ml_get(lnum); - while (*s != NUL && vim_strchr((char_u *)"=;{}\"'", *s) == NULL) { + while (*s != NUL && vim_strchr("=;{}\"'", *s) == NULL) { if (cin_iscomment(s)) { // ignore comments s = cin_skipcomment(s); } else { s++; } } - if (*s != '=') + if (*s != '=') { return 0; + } s = (char_u *)skipwhite((char *)s + 1); if (cin_nocode(s)) { @@ -785,17 +789,19 @@ static int cin_ispreproc_cont(const char_u **pp, linenr_T *lnump, int *amount) candidate_amount = get_indent_lnum(lnum); } - for (;; ) { + for (;;) { if (cin_ispreproc(line)) { retval = TRUE; *lnump = lnum; break; } - if (lnum == 1) + if (lnum == 1) { break; + } line = ml_get(--lnum); - if (*line == NUL || line[STRLEN(line) - 1] != '\\') + if (*line == NUL || line[STRLEN(line) - 1] != '\\') { break; + } } if (lnum != *lnump) { @@ -823,21 +829,18 @@ static int cin_islinecomment(const char_u *p) return p[0] == '/' && p[1] == '/'; } -/* - * Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or - * '}'. - * Don't consider "} else" a terminated line. - * If a line begins with an "else", only consider it terminated if no unmatched - * opening braces follow (handle "else { foo();" correctly). - * Return the character terminating the line (ending char's have precedence if - * both apply in order to determine initializations). - */ -static char_u -cin_isterminated( - const char_u *s, - int incl_open, // include '{' at the end as terminator - int incl_comma // recognize a trailing comma -) +/// Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or +/// '}'. +/// Don't consider "} else" a terminated line. +/// If a line begins with an "else", only consider it terminated if no unmatched +/// opening braces follow (handle "else { foo();" correctly). +/// +/// @param incl_open include '{' at the end as terminator +/// @param incl_comma recognize a trailing comma +/// +/// @return the character terminating the line (ending char's have precedence if +/// both apply in order to determine initializations). +static char_u cin_isterminated(const char_u *s, int incl_open, int incl_comma) { char_u found_start = 0; unsigned n_open = 0; @@ -845,30 +848,35 @@ cin_isterminated( s = cin_skipcomment(s); - if (*s == '{' || (*s == '}' && !cin_iselse(s))) + if (*s == '{' || (*s == '}' && !cin_iselse(s))) { found_start = *s; + } - if (!found_start) + if (!found_start) { is_else = cin_iselse(s); + } while (*s) { // skip over comments, "" strings and 'c'haracters s = skip_string(cin_skipcomment(s)); - if (*s == '}' && n_open > 0) - --n_open; + if (*s == '}' && n_open > 0) { + n_open--; + } if ((!is_else || n_open == 0) && (*s == ';' || *s == '}' || (incl_comma && *s == ',')) - && cin_nocode(s + 1)) + && cin_nocode(s + 1)) { return *s; - else if (*s == '{') { - if (incl_open && cin_nocode(s + 1)) + } else if (*s == '{') { + if (incl_open && cin_nocode(s + 1)) { return *s; - else - ++n_open; + } else { + n_open++; + } } - if (*s) + if (*s) { s++; + } } return found_start; } @@ -889,13 +897,14 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l linenr_T lnum = first_lnum; linenr_T save_lnum = curwin->w_cursor.lnum; int retval = false; - pos_T *trypos; - int just_started = TRUE; + pos_T *trypos; + int just_started = true; - if (sp == NULL) + if (sp == NULL) { s = ml_get(lnum); - else + } else { s = *sp; + } curwin->w_cursor.lnum = lnum; if (find_last_paren(s, '(', ')') @@ -945,8 +954,9 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l // defined(y) lnum = first_lnum - 1; s = ml_get(lnum); - if (*s == NUL || s[STRLEN(s) - 1] != '\\') - retval = TRUE; + if (*s == NUL || s[STRLEN(s) - 1] != '\\') { + retval = true; + } goto done; } if ((*s == ',' && cin_nocode(s + 1)) || s[1] == NUL || cin_nocode(s)) { @@ -956,17 +966,20 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l * At the end: check for ',' in the next line, for this style: * func(arg1 * , arg2) */ - for (;; ) { - if (lnum >= curbuf->b_ml.ml_line_count) + for (;;) { + if (lnum >= curbuf->b_ml.ml_line_count) { break; + } s = ml_get(++lnum); - if (!cin_ispreproc(s)) + if (!cin_ispreproc(s)) { break; + } } - if (lnum >= curbuf->b_ml.ml_line_count) + if (lnum >= curbuf->b_ml.ml_line_count) { break; - /* Require a comma at end of the line or a comma or ')' at the - * start of next line. */ + } + // Require a comma at end of the line or a comma or ')' at the + // start of next line. s = (char_u *)skipwhite((char *)s); if (!just_started && (!comma && *s != ',' && *s != ')')) { break; @@ -981,8 +994,9 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l } done: - if (lnum != first_lnum && sp != NULL) + if (lnum != first_lnum && sp != NULL) { *sp = ml_get(first_lnum); + } return retval; } @@ -1013,8 +1027,8 @@ static int cin_isdo(const char_u *p) static int cin_iswhileofdo(const char_u *p, linenr_T lnum) // XXX { pos_T cursor_save; - pos_T *trypos; - int retval = FALSE; + pos_T *trypos; + int retval = false; p = cin_skipcomment(p); if (*p == '}') { // accept "} while (cond);" @@ -1029,10 +1043,10 @@ static int cin_iswhileofdo(const char_u *p, linenr_T lnum) // XXX p++; curwin->w_cursor.col++; } - if ((trypos = findmatchlimit(NULL, 0, 0, - curbuf->b_ind_maxparen)) != NULL - && *cin_skipcomment(ml_get_pos(trypos) + 1) == ';') - retval = TRUE; + if ((trypos = findmatchlimit(NULL, 0, 0, curbuf->b_ind_maxparen)) != NULL + && *cin_skipcomment(ml_get_pos(trypos) + 1) == ';') { + retval = true; + } curwin->w_cursor = cursor_save; } return retval; @@ -1048,24 +1062,29 @@ static int cin_is_if_for_while_before_offset(const char_u *line, int *poffset) { int offset = *poffset; - if (offset-- < 2) + if (offset-- < 2) { return 0; - while (offset > 2 && ascii_iswhite(line[offset])) - --offset; + } + while (offset > 2 && ascii_iswhite(line[offset])) { + offset--; + } offset -= 1; - if (!STRNCMP(line + offset, "if", 2)) + if (!STRNCMP(line + offset, "if", 2)) { goto probablyFound; + } if (offset >= 1) { offset -= 1; - if (!STRNCMP(line + offset, "for", 3)) + if (!STRNCMP(line + offset, "for", 3)) { goto probablyFound; + } if (offset >= 2) { offset -= 2; - if (!STRNCMP(line + offset, "while", 5)) + if (!STRNCMP(line + offset, "while", 5)) { goto probablyFound; + } } } return 0; @@ -1083,7 +1102,7 @@ probablyFound: * do * nothing; * while (foo - * && bar); <-- here + * && bar); <-- here * Adjust the cursor to the line with "while". */ static int cin_iswhileofdo_end(int terminated) @@ -1125,8 +1144,9 @@ static int cin_iswhileofdo_end(int terminated) p = line + i; } } - if (*p != NUL) - ++p; + if (*p != NUL) { + p++; + } } return FALSE; } @@ -1141,15 +1161,16 @@ static int cin_isbreak(const char_u *p) * constructor-initialization. eg: * * class MyClass : - * baseClass <-- here + * baseClass <-- here * class MyClass : public baseClass, - * anotherBaseClass <-- here (should probably lineup ??) + * anotherBaseClass <-- here (should probably lineup ??) * MyClass::MyClass(...) : - * baseClass(...) <-- here (constructor-initialization) + * baseClass(...) <-- here (constructor-initialization) * * This is a lot of guessing. Watch out for "cond ? func() : foo". */ -static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { +static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) +{ lpos_T *pos = &cached->lpos; // find position const char_u *s; int class_or_struct, lookfor_ctor_init, cpp_base_class; @@ -1167,23 +1188,24 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { return false; } s = cin_skipcomment(s); - if (*s == NUL) - return FALSE; + if (*s == NUL) { + return false; + } cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; /* Search for a line starting with '#', empty, ending in ';' or containing * '{' or '}' and start below it. This handles the following situations: - * a = cond ? - * func() : - * asdf; - * func::foo() - * : something - * {} - * Foo::Foo (int one, int two) - * : something(4), - * somethingelse(3) - * {} + * a = cond ? + * func() : + * asdf; + * func::foo() + * : something + * {} + * Foo::Foo (int one, int two) + * : something(4), + * somethingelse(3) + * {} */ while (lnum > 1) { line = ml_get(lnum - 1); @@ -1194,20 +1216,23 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { while (*s != NUL) { s = cin_skipcomment(s); if (*s == '{' || *s == '}' - || (*s == ';' && cin_nocode(s + 1))) + || (*s == ';' && cin_nocode(s + 1))) { break; - if (*s != NUL) - ++s; + } + if (*s != NUL) { + s++; + } } - if (*s != NUL) + if (*s != NUL) { break; - --lnum; + } + lnum--; } pos->lnum = lnum; line = ml_get(lnum); s = line; - for (;; ) { + for (;;) { if (*s == NUL) { if (lnum == curwin->w_cursor.lnum) { break; @@ -1222,13 +1247,14 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { break; } s = cin_skipcomment(line); - if (*s == NUL) + if (*s == NUL) { continue; + } } - if (s[0] == '"' || (s[0] == 'R' && s[1] == '"')) + if (s[0] == '"' || (s[0] == 'R' && s[1] == '"')) { s = skip_string(s) + 1; - else if (s[0] == ':') { + } else if (s[0] == ':') { if (s[1] == ':') { /* skip double colon. It can't be a constructor * initialization any more */ @@ -1241,17 +1267,19 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { lookfor_ctor_init = class_or_struct = false; pos->col = 0; s = cin_skipcomment(s + 1); - } else + } else { s = cin_skipcomment(s + 1); + } } else if ((STRNCMP(s, "class", 5) == 0 && !vim_isIDc(s[5])) || (STRNCMP(s, "struct", 6) == 0 && !vim_isIDc(s[6]))) { class_or_struct = TRUE; lookfor_ctor_init = FALSE; - if (*s == 'c') + if (*s == 'c') { s = cin_skipcomment(s + 5); - else + } else { s = cin_skipcomment(s + 6); + } } else { if (s[0] == '{' || s[0] == '}' || s[0] == ';') { cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; @@ -1297,7 +1325,7 @@ static int get_baseclass_amount(int col) { int amount; colnr_T vcol; - pos_T *trypos; + pos_T *trypos; if (col == 0) { amount = get_indent(); @@ -1313,8 +1341,9 @@ static int get_baseclass_amount(int col) getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); amount = (int)vcol; } - if (amount < curbuf->b_ind_cpp_baseclass) + if (amount < curbuf->b_ind_cpp_baseclass) { amount = curbuf->b_ind_cpp_baseclass; + } return amount; } @@ -1340,8 +1369,9 @@ static int cin_ends_in(const char_u *s, const char_u *find, const char_u *ignore return true; } } - if (*p != NUL) - ++p; + if (*p != NUL) { + p++; + } } return FALSE; } @@ -1461,10 +1491,10 @@ static pos_T *find_match_paren(int ind_maxparen) return find_match_char('(', ind_maxparen); } -static pos_T * find_match_char(char_u c, int ind_maxparen) +static pos_T *find_match_char(char_u c, int ind_maxparen) { pos_T cursor_save; - pos_T *trypos; + pos_T *trypos; static pos_T pos_copy; int ind_maxp_wk; @@ -1488,8 +1518,7 @@ retry: trypos = &pos_copy; curwin->w_cursor = *trypos; if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) { // XXX - ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - - trypos_wk->lnum); + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - trypos_wk->lnum); if (ind_maxp_wk > 0) { curwin->w_cursor = *trypos_wk; goto retry; @@ -1535,8 +1564,9 @@ static int corr_ind_maxparen(pos_T *startpos) { long n = (long)startpos->lnum - (long)curwin->w_cursor.lnum; - if (n > 0 && n < curbuf->b_ind_maxparen / 2) + if (n > 0 && n < curbuf->b_ind_maxparen / 2) { return curbuf->b_ind_maxparen - (int)n; + } return curbuf->b_ind_maxparen; } @@ -1575,8 +1605,8 @@ static int find_last_paren(const char_u *l, int start, int end) */ void parse_cino(buf_T *buf) { - char_u *p; - char_u *l; + char_u *p; + char_u *l; int divider; int fraction = 0; int sw = get_sw_value(buf); @@ -1714,7 +1744,7 @@ void parse_cino(buf_T *buf) // Handle C #pragma directives buf->b_ind_pragma = 0; - for (p = buf->b_p_cino; *p; ) { + for (p = buf->b_p_cino; *p;) { l = p++; if (*p == '-') { p++; @@ -1738,57 +1768,134 @@ void parse_cino(buf_T *buf) n = sw; // just "s" is one 'shiftwidth'. } else { n *= sw; - if (divider) + if (divider) { n += (sw * fraction + divider / 2) / divider; + } } ++p; } - if (l[1] == '-') + if (l[1] == '-') { n = -n; + } /* When adding an entry here, also update the default 'cinoptions' in * doc/indent.txt, and add explanation for it! */ switch (*l) { - case '>': buf->b_ind_level = n; break; - case 'e': buf->b_ind_open_imag = n; break; - case 'n': buf->b_ind_no_brace = n; break; - case 'f': buf->b_ind_first_open = n; break; - case '{': buf->b_ind_open_extra = n; break; - case '}': buf->b_ind_close_extra = n; break; - case '^': buf->b_ind_open_left_imag = n; break; - case 'L': buf->b_ind_jump_label = n; break; - case ':': buf->b_ind_case = n; break; - case '=': buf->b_ind_case_code = n; break; - case 'b': buf->b_ind_case_break = n; break; - case 'p': buf->b_ind_param = n; break; - case 't': buf->b_ind_func_type = n; break; - case '/': buf->b_ind_comment = n; break; - case 'c': buf->b_ind_in_comment = n; break; - case 'C': buf->b_ind_in_comment2 = n; break; - case 'i': buf->b_ind_cpp_baseclass = n; break; - case '+': buf->b_ind_continuation = n; break; - case '(': buf->b_ind_unclosed = n; break; - case 'u': buf->b_ind_unclosed2 = n; break; - case 'U': buf->b_ind_unclosed_noignore = n; break; - case 'W': buf->b_ind_unclosed_wrapped = n; break; - case 'w': buf->b_ind_unclosed_whiteok = n; break; - case 'm': buf->b_ind_matching_paren = n; break; - case 'M': buf->b_ind_paren_prev = n; break; - case ')': buf->b_ind_maxparen = n; break; - case '*': buf->b_ind_maxcomment = n; break; - case 'g': buf->b_ind_scopedecl = n; break; - case 'h': buf->b_ind_scopedecl_code = n; break; - case 'j': buf->b_ind_java = n; break; - case 'J': buf->b_ind_js = n; break; - case 'l': buf->b_ind_keep_case_label = n; break; - case '#': buf->b_ind_hash_comment = n; break; - case 'N': buf->b_ind_cpp_namespace = n; break; - case 'k': buf->b_ind_if_for_while = n; break; - case 'E': buf->b_ind_cpp_extern_c = n; break; - case 'P': buf->b_ind_pragma = n; break; - } - if (*p == ',') - ++p; + case '>': + buf->b_ind_level = n; + break; + case 'e': + buf->b_ind_open_imag = n; + break; + case 'n': + buf->b_ind_no_brace = n; + break; + case 'f': + buf->b_ind_first_open = n; + break; + case '{': + buf->b_ind_open_extra = n; + break; + case '}': + buf->b_ind_close_extra = n; + break; + case '^': + buf->b_ind_open_left_imag = n; + break; + case 'L': + buf->b_ind_jump_label = n; + break; + case ':': + buf->b_ind_case = n; + break; + case '=': + buf->b_ind_case_code = n; + break; + case 'b': + buf->b_ind_case_break = n; + break; + case 'p': + buf->b_ind_param = n; + break; + case 't': + buf->b_ind_func_type = n; + break; + case '/': + buf->b_ind_comment = n; + break; + case 'c': + buf->b_ind_in_comment = n; + break; + case 'C': + buf->b_ind_in_comment2 = n; + break; + case 'i': + buf->b_ind_cpp_baseclass = n; + break; + case '+': + buf->b_ind_continuation = n; + break; + case '(': + buf->b_ind_unclosed = n; + break; + case 'u': + buf->b_ind_unclosed2 = n; + break; + case 'U': + buf->b_ind_unclosed_noignore = n; + break; + case 'W': + buf->b_ind_unclosed_wrapped = n; + break; + case 'w': + buf->b_ind_unclosed_whiteok = n; + break; + case 'm': + buf->b_ind_matching_paren = n; + break; + case 'M': + buf->b_ind_paren_prev = n; + break; + case ')': + buf->b_ind_maxparen = n; + break; + case '*': + buf->b_ind_maxcomment = n; + break; + case 'g': + buf->b_ind_scopedecl = n; + break; + case 'h': + buf->b_ind_scopedecl_code = n; + break; + case 'j': + buf->b_ind_java = n; + break; + case 'J': + buf->b_ind_js = n; + break; + case 'l': + buf->b_ind_keep_case_label = n; + break; + case '#': + buf->b_ind_hash_comment = n; + break; + case 'N': + buf->b_ind_cpp_namespace = n; + break; + case 'k': + buf->b_ind_if_for_while = n; + break; + case 'E': + buf->b_ind_cpp_extern_c = n; + break; + case 'P': + buf->b_ind_pragma = n; + break; + } + if (*p == ',') { + p++; + } } } @@ -1803,14 +1910,14 @@ int get_c_indent(void) int scope_amount; int cur_amount = MAXCOL; colnr_T col; - char_u *theline; - char_u *linecopy; - pos_T *trypos; - pos_T *comment_pos; - pos_T *tryposBrace = NULL; - pos_T tryposCopy; + char_u *theline; + char_u *linecopy; + pos_T *trypos; + pos_T *comment_pos; + pos_T *tryposBrace = NULL; + pos_T tryposCopy; pos_T our_paren_pos; - char_u *start; + char_u *start; int start_brace; #define BRACE_IN_COL0 1 // '{' is in column 0 #define BRACE_AT_START 2 // '{' is at start of line @@ -1868,10 +1975,11 @@ int get_c_indent(void) * For unknown reasons the cursor might be past the end of the line, thus * check for that. */ - if ((State & INSERT) + if ((State & MODE_INSERT) && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy) - && linecopy[curwin->w_cursor.col] == ')') + && linecopy[curwin->w_cursor.col] == ')') { linecopy[curwin->w_cursor.col] = NUL; + } theline = (char_u *)skipwhite((char *)linecopy); @@ -1907,13 +2015,10 @@ int get_c_indent(void) } } - /* - * Is it a non-case label? Then that goes at the left margin too unless: - * - JS flag is set. - * - 'L' item has a positive value. - */ - if (original_line_islabel && !curbuf->b_ind_js - && curbuf->b_ind_jump_label < 0) { + // Is it a non-case label? Then that goes at the left margin too unless: + // - JS flag is set. + // - 'L' item has a positive value. + if (original_line_islabel && !curbuf->b_ind_js && curbuf->b_ind_jump_label < 0) { amount = 0; goto theend; } @@ -1951,7 +2056,7 @@ int get_c_indent(void) 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_u *p; + char_u *p; int start_align = 0; int start_off = 0; int done = FALSE; @@ -1980,8 +2085,9 @@ int get_c_indent(void) } } - if (*p == ':') - ++p; + if (*p == ':') { + p++; + } (void)copy_option_part(&p, lead_end, COM_MAX_LEN, ","); if (what == COM_START) { STRCPY(lead_start, lead_end); @@ -2009,17 +2115,18 @@ int get_c_indent(void) amount = get_indent_lnum(curwin->w_cursor.lnum - 1); break; } else if (STRNCMP(ml_get(comment_pos->lnum) + comment_pos->col, - lead_start, lead_start_len) != 0) { - /* If the start comment string doesn't match with the - * start of the comment, skip this entry. XXX */ + lead_start, lead_start_len) != 0) { + // If the start comment string doesn't match with the + // start of the comment, skip this entry. XXX continue; } } - if (start_off != 0) + if (start_off != 0) { amount += start_off; - else if (start_align == COM_RIGHT) + } else if (start_align == COM_RIGHT) { amount += vim_strsize(lead_start) - vim_strsize(lead_middle); + } break; } @@ -2044,18 +2151,16 @@ int get_c_indent(void) * asterisk in the comment opener; otherwise, line up * with the first character of the comment text. */ - if (done) - ; - else if (theline[0] == '*') + if (done) { + // skip + } else if (theline[0] == '*') { amount += 1; - else { - /* - * If we are more than one line away from the comment opener, take - * the indent of the previous non-empty line. If 'cino' has "CO" - * and we are just below the comment opener and there are any - * white characters after it line up with the text after it; - * otherwise, add the amount specified by "c" in 'cino' - */ + } else { + // If we are more than one line away from the comment opener, take + // the indent of the previous non-empty line. If 'cino' has "CO" + // and we are just below the comment opener and there are any + // white characters after it line up with the text after it; + // otherwise, add the amount specified by "c" in 'cino' amount = -1; for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; lnum--) { if (linewhite(lnum)) { // skip blank lines @@ -2074,11 +2179,12 @@ int get_c_indent(void) } getvcol(curwin, comment_pos, &col, NULL, NULL); amount = col; - if (curbuf->b_ind_in_comment2 || *look == NUL) + if (curbuf->b_ind_in_comment2 || *look == NUL) { amount += curbuf->b_ind_in_comment; + } } } - goto theend; + goto theend; } // Are we looking at a ']' that has a match? if (*skipwhite((char *)theline) == ']' @@ -2090,18 +2196,19 @@ int get_c_indent(void) // Are we inside parentheses or braces? // XXX if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL - && curbuf->b_ind_java == 0) - || (tryposBrace = find_start_brace()) != NULL - || trypos != NULL) { + && curbuf->b_ind_java == 0) + || (tryposBrace = find_start_brace()) != NULL + || trypos != NULL) { if (trypos != NULL && tryposBrace != NULL) { /* Both an unmatched '(' and '{' is found. Use the one which is * closer to the current cursor position, set the other to NULL. */ if (trypos->lnum != tryposBrace->lnum ? trypos->lnum < tryposBrace->lnum - : trypos->col < tryposBrace->col) + : trypos->col < tryposBrace->col) { trypos = NULL; - else + } else { tryposBrace = NULL; + } } if (trypos != NULL) { @@ -2132,16 +2239,16 @@ int get_c_indent(void) } // XXX - if ((trypos = find_match_paren( - corr_ind_maxparen(&cur_curpos))) != NULL + if ((trypos = find_match_paren(corr_ind_maxparen(&cur_curpos))) != NULL && trypos->lnum == our_paren_pos.lnum && trypos->col == our_paren_pos.col) { amount = get_indent_lnum(lnum); // XXX if (theline[0] == ')') { if (our_paren_pos.lnum != lnum - && cur_amount > amount) + && cur_amount > amount) { cur_amount = amount; + } amount = -1; } break; @@ -2164,7 +2271,7 @@ int get_c_indent(void) pos_T cursor_save = curwin->w_cursor; pos_T outermost; - char_u *line; + char_u *line; trypos = &our_paren_pos; do { @@ -2187,7 +2294,7 @@ int get_c_indent(void) look = (char_u *)skipwhite((char *)look); if (*look == '(') { linenr_T save_lnum = curwin->w_cursor.lnum; - char_u *line; + char_u *line; int look_col; /* Ignore a '(' in front of the line that has a match before @@ -2197,11 +2304,12 @@ int get_c_indent(void) look_col = (int)(look - line); curwin->w_cursor.col = look_col + 1; if ((trypos = findmatchlimit(NULL, ')', 0, - curbuf->b_ind_maxparen)) + curbuf->b_ind_maxparen)) != NULL && trypos->lnum == our_paren_pos.lnum - && trypos->col < our_paren_pos.col) + && trypos->col < our_paren_pos.col) { ignore_paren_col = trypos->col + 1; + } curwin->w_cursor.lnum = save_lnum; look = ml_get(our_paren_pos.lnum) + look_col; @@ -2230,24 +2338,28 @@ int get_c_indent(void) for (col = 0; col < our_paren_pos.col; ++col) { switch (l[col]) { case '(': - case '{': ++n; + case '{': + n++; break; case ')': - case '}': if (n > 1) - --n; + case '}': + if (n > 1) { + n--; + } break; } } our_paren_pos.col = 0; amount += n * curbuf->b_ind_unclosed_wrapped; - } else if (curbuf->b_ind_unclosed_whiteok) + } else if (curbuf->b_ind_unclosed_whiteok) { our_paren_pos.col++; - else { + } else { col = our_paren_pos.col + 1; - while (ascii_iswhite(l[col])) + while (ascii_iswhite(l[col])) { col++; + } if (l[col] != NUL) { // In case of trailing space our_paren_pos.col = col; } else { @@ -2262,8 +2374,9 @@ int get_c_indent(void) */ if (our_paren_pos.col > 0) { getvcol(curwin, &our_paren_pos, &col, NULL, NULL); - if (cur_amount > (int)col) + if (cur_amount > (int)col) { cur_amount = col; + } } } @@ -2272,8 +2385,9 @@ int get_c_indent(void) } else if ((curbuf->b_ind_unclosed == 0 && is_if_for_while == 0) || (!curbuf->b_ind_unclosed_noignore && *look == '(' && ignore_paren_col == 0)) { - if (cur_amount != MAXCOL) + if (cur_amount != MAXCOL) { amount = cur_amount; + } } else { /* Add b_ind_unclosed2 for each '(' before our matching one, * but ignore (void) before the line (ignore_paren_col). */ @@ -2281,10 +2395,12 @@ int get_c_indent(void) while ((int)our_paren_pos.col > ignore_paren_col) { --our_paren_pos.col; switch (*ml_get_pos(&our_paren_pos)) { - case '(': amount += curbuf->b_ind_unclosed2; + case '(': + amount += curbuf->b_ind_unclosed2; col = our_paren_pos.col; break; - case ')': amount -= curbuf->b_ind_unclosed2; + case ')': + amount -= curbuf->b_ind_unclosed2; col = MAXCOL; break; } @@ -2292,9 +2408,9 @@ int get_c_indent(void) /* Use b_ind_unclosed once, when the first '(' is not inside * braces */ - if (col == MAXCOL) + if (col == MAXCOL) { amount += curbuf->b_ind_unclosed; - else { + } else { curwin->w_cursor.lnum = our_paren_pos.lnum; curwin->w_cursor.col = col; if (find_match_paren_after_brace(curbuf->b_ind_maxparen)) { @@ -2311,12 +2427,13 @@ int get_c_indent(void) * For a line starting with ')' use the minimum of the two * positions, to avoid giving it more indent than the previous * lines: - * func_long_name( if (x - * arg && yy - * ) ^ not here ) ^ not here + * func_long_name( if (x + * arg && yy + * ) ^ not here ) ^ not here */ - if (cur_amount < amount) + if (cur_amount < amount) { amount = cur_amount; + } } } @@ -2345,10 +2462,11 @@ int get_c_indent(void) if (*look == '{') { getvcol(curwin, trypos, &col, NULL, NULL); amount = col; - if (*start == '{') + if (*start == '{') { start_brace = BRACE_IN_COL0; - else + } else { start_brace = BRACE_AT_START; + } } else { // That opening brace might have been on a continuation // line. If so, find the start of the line. @@ -2363,9 +2481,9 @@ int get_c_indent(void) } // It could have been something like - // case 1: if (asdf && - // ldfd) { - // } + // case 1: if (asdf && + // ldfd) { + // } if ((curbuf->b_ind_js || curbuf->b_ind_keep_case_label) && cin_iscase((char_u *)skipwhite((char *)get_cursor_line_ptr()), false)) { amount = get_indent(); @@ -2443,8 +2561,9 @@ int get_c_indent(void) } else { // Compensate for adding b_ind_open_extra later. amount -= curbuf->b_ind_open_extra; - if (amount < 0) + if (amount < 0) { amount = 0; + } } } @@ -2476,7 +2595,7 @@ int get_c_indent(void) // the usual amount relative to the conditional // that opens the block. curwin->w_cursor = cur_curpos; - for (;; ) { + for (;;) { curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; @@ -2500,10 +2619,11 @@ int get_c_indent(void) /* nothing found (abuse curbuf->b_ind_maxparen as * limit) assume terminated line (i.e. a variable * initialization) */ - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else if (!curbuf->b_ind_js) + } else if (!curbuf->b_ind_js) { amount += ind_continuation; + } break; } @@ -2527,8 +2647,9 @@ int get_c_indent(void) continue; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } terminated = cin_isterminated(l, FALSE, TRUE); @@ -2546,14 +2667,16 @@ int get_c_indent(void) * declaration is split over multiple lines: * cin_isfuncdecl returns FALSE then. */ - if (terminated == ',') + if (terminated == ',') { break; + } /* if it is an enum declaration or an assignment, * we are done. */ - if (terminated != ';' && cin_isinit()) + if (terminated != ';' && cin_isinit()) { break; + } // nothing useful found if (terminated == 0 || terminated == '{') { @@ -2567,12 +2690,13 @@ int get_c_indent(void) // will take us back to the start of the line. // XXX trypos = NULL; - if (find_last_paren(l, '(', ')')) - trypos = find_match_paren( - curbuf->b_ind_maxparen); + if (find_last_paren(l, '(', ')')) { + trypos = find_match_paren(curbuf->b_ind_maxparen); + } - if (trypos == NULL && find_last_paren(l, '{', '}')) + if (trypos == NULL && find_last_paren(l, '{', '}')) { trypos = find_start_brace(); + } if (trypos != NULL) { curwin->w_cursor.lnum = trypos->lnum + 1; @@ -2586,15 +2710,17 @@ int get_c_indent(void) * int a, * b; */ - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else if (lookfor == LOOKFOR_UNTERM) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else { if (lookfor != LOOKFOR_TERM && lookfor != LOOKFOR_CPP_BASECLASS @@ -2611,13 +2737,15 @@ int get_c_indent(void) * Looking for C++ namespace, need to look further * back. */ - if (curwin->w_cursor.lnum == ourscope) + if (curwin->w_cursor.lnum == ourscope) { continue; + } if (curwin->w_cursor.lnum == 0 || curwin->w_cursor.lnum - < ourscope - FIND_NAMESPACE_LIM) + < ourscope - FIND_NAMESPACE_LIM) { break; + } l = get_cursor_line_ptr(); @@ -2645,8 +2773,9 @@ int get_c_indent(void) break; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } } } break; @@ -2671,25 +2800,25 @@ int get_c_indent(void) if (iscase || cin_isscopedecl(l)) { /* we are only looking for cpp base class * declaration/initialization any longer */ - if (lookfor == LOOKFOR_CPP_BASECLASS) + if (lookfor == LOOKFOR_CPP_BASECLASS) { break; + } /* When looking for a "do" we are not interested in * labels. */ - if (whilelevel > 0) + if (whilelevel > 0) { continue; + } - /* - * case xx: - * c = 99 + <- this indent plus continuation - **-> here; - */ - if (lookfor == LOOKFOR_UNTERM - || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + // case xx: + // c = 99 + <- this indent plus continuation + // -> here; + if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } @@ -2712,40 +2841,39 @@ int get_c_indent(void) n = get_indent_nolabel(curwin->w_cursor.lnum); // XXX - /* - * case xx: if (cond) <- line up with this if - * y = y + 1; - * -> s = 99; - * - * case xx: - * if (cond) <- line up with this line - * y = y + 1; - * -> s = 99; - */ + // case xx: if (cond) <- line up with this if + // y = y + 1; + // -> s = 99; + // + // case xx: + // if (cond) <- line up with this line + // y = y + 1; + // -> s = 99; if (lookfor == LOOKFOR_TERM) { - if (n) + if (n) { amount = n; + } - if (!lookfor_break) + if (!lookfor_break) { break; + } } - /* - * case xx: x = x + 1; <- line up with this x - * -> y = y + 1; - * - * case xx: if (cond) <- line up with this if - * -> y = y + 1; - */ + // case xx: x = x + 1; <- line up with this x + // -> y = y + 1; + // + // case xx: if (cond) <- line up with this if + // -> y = y + 1; if (n) { amount = n; l = after_label(get_cursor_line_ptr()); if (l != NULL && cin_is_cinword(l)) { - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; - else + } else { amount += curbuf->b_ind_level + curbuf->b_ind_no_brace; + } } break; } @@ -2754,8 +2882,8 @@ int get_c_indent(void) * Try to get the indent of a statement before the switch * label. If nothing is found, line up relative to the * switch label. - * break; <- may line up with this line - * case xx: + * break; <- may line up with this line + * case xx: * -> y = 1; */ scope_amount = get_indent() + (iscase // XXX @@ -2784,8 +2912,9 @@ int get_c_indent(void) */ if (!curbuf->b_ind_js && cin_islabel()) { l = after_label(get_cursor_line_ptr()); - if (l == NULL || cin_nocode(l)) + if (l == NULL || cin_nocode(l)) { continue; + } } /* @@ -2810,10 +2939,11 @@ int get_c_indent(void) } if (n) { if (lookfor == LOOKFOR_UNTERM) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else if (theline[0] == '{') { // Need to find start of the declaration. lookfor = LOOKFOR_UNTERM; @@ -2828,10 +2958,11 @@ int get_c_indent(void) /* only look, whether there is a cpp base class * declaration or initialization before the opening brace. */ - if (cin_isterminated(l, TRUE, FALSE)) + if (cin_isterminated(l, true, false)) { break; - else + } else { continue; + } } /* @@ -2840,7 +2971,7 @@ int get_c_indent(void) * there is another unterminated statement behind, eg: * 123, * sizeof - * here + * here * Otherwise check whether it is an enumeration or structure * initialisation (not indented) or a variable declaration * (indented). @@ -2848,7 +2979,7 @@ int get_c_indent(void) terminated = cin_isterminated(l, FALSE, TRUE); if (js_cur_has_key) { - js_cur_has_key = false; // only check the first line + js_cur_has_key = false; // only check the first line if (curbuf->b_ind_js && terminated == ',') { // For Javascript we might be inside an object: // key: something, <- align with this @@ -2892,8 +3023,8 @@ int get_c_indent(void) } // If we're in the middle of a paren thing, Go back to the line // that starts it so we can get the right prevailing indent - // if ( foo && - // bar ) + // if ( foo && + // bar ) // Position the cursor over the rightmost paren, so that // matching it will take us back to the start of the line. @@ -2909,15 +3040,16 @@ int get_c_indent(void) // If we are looking for ',', we also look for matching // braces. if (trypos == NULL && terminated == ',' - && find_last_paren(l, '{', '}')) + && find_last_paren(l, '{', '}')) { trypos = find_start_brace(); + } if (trypos != NULL) { /* * Check if we are on a case label now. This is * handled above. * case xx: if ( asdf && - * asdf) + * asdf) */ curwin->w_cursor = *trypos; l = get_cursor_line_ptr(); @@ -2932,22 +3064,23 @@ int get_c_indent(void) * Skip over continuation lines to find the one to get the * indent from * char *usethis = "bla\ - * bla", + * bla", * here; */ if (terminated == ',') { while (curwin->w_cursor.lnum > 1) { l = ml_get(curwin->w_cursor.lnum - 1); - if (*l == NUL || l[STRLEN(l) - 1] != '\\') + if (*l == NUL || l[STRLEN(l) - 1] != '\\') { break; - --curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; } } /* * Get indent and pointer to text for current line, - * ignoring any jump label. XXX + * ignoring any jump label. XXX */ if (curbuf->b_ind_js) { cur_amount = get_indent(); @@ -2957,9 +3090,9 @@ int get_c_indent(void) /* * If this is just above the line we are indenting, and it * starts with a '{', line it up with this line. - * while (not) - * -> { - * } + * while (not) + * -> { + * } */ if (terminated != ',' && lookfor != LOOKFOR_TERM && theline[0] == '{') { @@ -2968,8 +3101,8 @@ int get_c_indent(void) * Only add b_ind_open_extra when the current line * doesn't start with a '{', which must have a match * in the same line (scope is the same). Probably: - * { 1, 2 }, - * -> { 3, 4 } + * { 1, 2 }, + * -> { 3, 4 } */ if (*skipwhite((char *)l) != '{') { amount += curbuf->b_ind_open_extra; @@ -2996,29 +3129,31 @@ int get_c_indent(void) // -> here; if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } /* * If this is just above the line we are indenting, we * are finished. - * while (not) - * -> here; + * while (not) + * -> here; * Otherwise this indent can be used when the line * before this is terminated. - * yyy; - * if (stat) - * while (not) - * xxx; - * -> here; + * yyy; + * if (stat) + * while (not) + * xxx; + * -> here; */ amount = cur_amount; - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; + } if (lookfor != LOOKFOR_TERM) { amount += curbuf->b_ind_level + curbuf->b_ind_no_brace; @@ -3029,14 +3164,15 @@ int get_c_indent(void) * Special trick: when expecting the while () after a * do, line up with the while() * do - * x = 1; + * x = 1; * -> here */ l = (char_u *)skipwhite((char *)get_cursor_line_ptr()); if (cin_isdo(l)) { - if (whilelevel == 0) + if (whilelevel == 0) { break; - --whilelevel; + } + whilelevel--; } /* @@ -3049,14 +3185,16 @@ int get_c_indent(void) /* If we're looking at "} else", let's make sure we * find the opening brace of the enclosing scope, * not the one from "if () {". */ - if (*l == '}') + if (*l == '}') { curwin->w_cursor.col = (colnr_T)(l - get_cursor_line_ptr()) + 1; + } if ((trypos = find_start_brace()) == NULL || find_match(LOOKFOR_IF, trypos->lnum) - == FAIL) + == FAIL) { break; + } } } /* @@ -3070,8 +3208,8 @@ int get_c_indent(void) * Found two unterminated lines on a row, line up with * the last one. * c = 99 + - * 100 + - * -> here; + * 100 + + * -> here; */ if (lookfor == LOOKFOR_UNTERM) { // When line ends in a comma add extra indent @@ -3088,8 +3226,9 @@ int get_c_indent(void) * opening brace or we are looking just for * enumerations/initializations. */ if (terminated == ',') { - if (curbuf->b_ind_cpp_baseclass == 0) + if (curbuf->b_ind_cpp_baseclass == 0) { break; + } lookfor = LOOKFOR_CPP_BASECLASS; continue; @@ -3103,15 +3242,15 @@ int get_c_indent(void) } else { // Found first unterminated line on a row, may // line up with this line, remember its indent - // 100 + // NOLINT(whitespace/tab) - // -> here; // NOLINT(whitespace/tab) + // 100 + // NOLINT(whitespace/tab) + // -> here; // NOLINT(whitespace/tab) l = get_cursor_line_ptr(); amount = cur_amount; n = (int)STRLEN(l); if (terminated == ',' && (*skipwhite((char *)l) == ']' - || (n >=2 && l[n - 2] == ']'))) { + || (n >= 2 && l[n - 2] == ']'))) { break; } @@ -3159,7 +3298,7 @@ int get_c_indent(void) && *l != NUL && l[STRLEN(l) - 1] == '\\') { // XXX - cont_amount = cin_get_equal_amount( curwin->w_cursor.lnum); + cont_amount = cin_get_equal_amount(curwin->w_cursor.lnum); } if (lookfor != LOOKFOR_TERM && lookfor != LOOKFOR_JS_KEY @@ -3179,16 +3318,17 @@ int get_c_indent(void) /* * Found an unterminated line after a while ();, line up * with the last one. - * while (cond); - * 100 + <- line up with this one - * -> here; + * while (cond); + * 100 + <- line up with this one + * -> here; */ if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } @@ -3234,35 +3374,37 @@ int get_c_indent(void) /* * Found a terminated line above an unterminated line. Add * the amount for a continuation line. - * x = 1; - * y = foo + - * -> here; + * x = 1; + * y = foo + + * -> here; * or - * int x = 1; - * int foo, - * -> here; + * int x = 1; + * int foo, + * -> here; */ if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } /* * Found a terminated line above a terminated line or "if" * etc. line. Use the amount of the line below us. - * x = 1; x = 1; - * if (asdf) y = 2; - * while (asdf) ->here; - * here; + * x = 1; x = 1; + * if (asdf) y = 2; + * while (asdf) ->here; + * here; * ->foo; */ if (lookfor == LOOKFOR_TERM) { - if (!lookfor_break && whilelevel == 0) + if (!lookfor_break && whilelevel == 0) { break; + } } /* * First line above the one we're indenting is terminated. @@ -3275,20 +3417,17 @@ int get_c_indent(void) * that matching it will take us back to the start of * the line. Helps for: * func(asdr, - * asdfasdf); + * asdfasdf); * here; */ term_again: l = get_cursor_line_ptr(); if (find_last_paren(l, '(', ')') - && (trypos = find_match_paren( - curbuf->b_ind_maxparen)) != NULL) { - /* - * Check if we are on a case label now. This is - * handled above. - * case xx: if ( asdf && - * asdf) - */ + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) { + // Check if we are on a case label now. This is + // handled above. + // case xx: if ( asdf && + // asdf) curwin->w_cursor = *trypos; l = get_cursor_line_ptr(); if (cin_iscase(l, false) || cin_isscopedecl(l)) { @@ -3301,10 +3440,10 @@ term_again: /* When aligning with the case statement, don't align * with a statement after it. * case 1: { <-- don't use this { position - * stat; + * stat; * } * case 2: - * stat; + * stat; * } */ iscase = curbuf->b_ind_keep_case_label && cin_iscase(l, false); @@ -3315,8 +3454,9 @@ term_again: */ amount = skip_label(curwin->w_cursor.lnum, &l); - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; + } // See remark above: "Only add b_ind_open_extra.." l = (char_u *)skipwhite((char *)l); if (*l == '{') { @@ -3328,7 +3468,7 @@ term_again: * When a terminated line starts with "else" skip to * the matching "if": * else 3; - * indent this; + * indent this; * Need to use the scope of this "else". XXX * If whilelevel != 0 continue looking for a "do {". */ @@ -3338,8 +3478,9 @@ term_again: && whilelevel == 0) { if ((trypos = find_start_brace()) == NULL || find_match(LOOKFOR_IF, trypos->lnum) - == FAIL) + == FAIL) { break; + } continue; } @@ -3354,9 +3495,10 @@ term_again: // if not "else {" check for terminated again // but skip block for "} else {" l = cin_skipcomment(get_cursor_line_ptr()); - if (*l == '}' || !cin_iselse(l)) + if (*l == '}' || !cin_iselse(l)) { goto term_again; - ++curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum++; curwin->w_cursor.col = 0; } } @@ -3389,8 +3531,8 @@ term_again: // of a function if (theline[0] == '{') { - amount = curbuf->b_ind_first_open; - goto theend; + amount = curbuf->b_ind_first_open; + goto theend; } /* * If the NEXT line is a function declaration, the current @@ -3400,14 +3542,13 @@ term_again: * contains { or }: "void f() {\n if (1)" */ if (cur_curpos.lnum < curbuf->b_ml.ml_line_count - && !cin_nocode(theline) - && vim_strchr(theline, '{') == NULL - && vim_strchr(theline, '}') == NULL - && !cin_ends_in(theline, (char_u *)":", NULL) - && !cin_ends_in(theline, (char_u *)",", NULL) - && cin_isfuncdecl(NULL, cur_curpos.lnum + 1, - cur_curpos.lnum + 1) - && !cin_isterminated(theline, false, true)) { + && !cin_nocode(theline) + && vim_strchr((char *)theline, '{') == NULL + && vim_strchr((char *)theline, '}') == NULL + && !cin_ends_in(theline, (char_u *)":", NULL) + && !cin_ends_in(theline, (char_u *)",", NULL) + && cin_isfuncdecl(NULL, cur_curpos.lnum + 1, cur_curpos.lnum + 1) + && !cin_isterminated(theline, false, true)) { amount = curbuf->b_ind_func_type; goto theend; } @@ -3450,8 +3591,9 @@ term_again: continue; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } /* * If the previous line ends in ',', use one level of @@ -3476,23 +3618,26 @@ term_again: /* For a line ending in ',' that is a continuation line go * back to the first line with a backslash: * char *foo = "bla\ - * bla", + * bla", * here; */ while (n == 0 && curwin->w_cursor.lnum > 1) { l = ml_get(curwin->w_cursor.lnum - 1); - if (*l == NUL || l[STRLEN(l) - 1] != '\\') + if (*l == NUL || l[STRLEN(l) - 1] != '\\') { break; - --curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; } amount = get_indent(); // XXX - if (amount == 0) + if (amount == 0) { amount = cin_first_id_amount(); - if (amount == 0) + } + if (amount == 0) { amount = ind_continuation; + } break; } @@ -3513,14 +3658,14 @@ term_again: break; } - /* (matching {) - * If the previous line ends on '};' (maybe followed by - * comments) align at column 0. For example: - * char *string_array[] = { "foo", - * / * x * / "b};ar" }; / * foobar * / - */ - if (cin_ends_in(l, (char_u *)"};", NULL)) + // (matching {) + // If the previous line ends on '};' (maybe followed by + // comments) align at column 0. For example: + // char *string_array[] = { "foo", + // / * x * / "b};ar" }; / * foobar * / + if (cin_ends_in(l, (char_u *)"};", NULL)) { break; + } // If the previous line ends on '[' we are probably in an // array constant: @@ -3547,8 +3692,9 @@ term_again: } } if (curwin->w_cursor.lnum > 0 - && cin_ends_in(look, (char_u *)"}", NULL)) + && cin_ends_in(look, (char_u *)"}", NULL)) { break; + } curwin->w_cursor = curpos_save; } @@ -3573,8 +3719,9 @@ term_again: if (cin_ends_in(l, (char_u *)";", NULL)) { l = ml_get(curwin->w_cursor.lnum - 1); if (cin_ends_in(l, (char_u *)",", NULL) - || (*l != NUL && l[STRLEN(l) - 1] == '\\')) + || (*l != NUL && l[STRLEN(l) - 1] == '\\')) { break; + } l = get_cursor_line_ptr(); } @@ -3587,8 +3734,9 @@ term_again: */ (void)find_last_paren(l, '(', ')'); - if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) + if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) { curwin->w_cursor = *trypos; + } amount = get_indent(); // XXX break; } @@ -3598,26 +3746,28 @@ term_again: amount += curbuf->b_ind_comment; } - /* add extra indent if the previous line ended in a backslash: - * "asdfasdf\ - * here"; - * char *foo = "asdf\ - * here"; - */ + + // add extra indent if the previous line ended in a backslash: + // "asdfasdf{backslash} + // here"; + // char *foo = "asdf{backslash} + // here"; if (cur_curpos.lnum > 1) { l = ml_get(cur_curpos.lnum - 1); if (*l != NUL && l[STRLEN(l) - 1] == '\\') { cur_amount = cin_get_equal_amount(cur_curpos.lnum - 1); - if (cur_amount > 0) + if (cur_amount > 0) { amount = cur_amount; - else if (cur_amount == 0) + } else if (cur_amount == 0) { amount += ind_continuation; + } } } theend: - if (amount < 0) + if (amount < 0) { amount = 0; + } laterend: // put the cursor back where it belongs @@ -3672,16 +3822,18 @@ static int find_match(int lookfor, linenr_T ourscope) * back than the one enclosing the else, we're * out of luck too. */ - if (theirscope->lnum < ourscope) + if (theirscope->lnum < ourscope) { break; + } /* * and if they're enclosed in a *deeper* brace, * then we can ignore it because it's in a * different scope... */ - if (theirscope->lnum > ourscope) + if (theirscope->lnum > ourscope) { continue; + } /* * if it was an "else" (that's not an "else if") @@ -3691,8 +3843,9 @@ static int find_match(int lookfor, linenr_T ourscope) look = cin_skipcomment(get_cursor_line_ptr()); if (cin_iselse(look)) { mightbeif = cin_skipcomment(look + 4); - if (!cin_isif(mightbeif)) - ++elselevel; + if (!cin_isif(mightbeif)) { + elselevel++; // NOLINT(readability/braces) + } continue; } @@ -3713,8 +3866,9 @@ static int find_match(int lookfor, linenr_T ourscope) * When looking for an "if" ignore "while"s that * get in the way. */ - if (elselevel == 0 && lookfor == LOOKFOR_IF) + if (elselevel == 0 && lookfor == LOOKFOR_IF) { whilelevel = 0; + } } // If it's a "do" decrement whilelevel @@ -3739,8 +3893,9 @@ static int find_match(int lookfor, linenr_T ourscope) */ void do_c_expr_indent(void) { - if (*curbuf->b_p_inde != NUL) + if (*curbuf->b_p_inde != NUL) { fixthisline(get_expr_indent); - else + } else { fixthisline(get_c_indent); + } } diff --git a/src/nvim/input.c b/src/nvim/input.c index 0dfd564e1f..37c2903cfd 100644 --- a/src/nvim/input.c +++ b/src/nvim/input.c @@ -39,7 +39,7 @@ int ask_yesno(const char *const str, const bool direct) const int save_State = State; no_wait_return++; - State = CONFIRM; // Mouse behaves like with :confirm. + State = MODE_CONFIRM; // Mouse behaves like with :confirm. setmouse(); // Disable mouse in xterm. no_mapping++; allow_keys++; // no mapping here, but recognize keys @@ -235,7 +235,7 @@ int prompt_for_number(int *mouse_used) save_cmdline_row = cmdline_row; cmdline_row = 0; save_State = State; - State = ASKMORE; // prevents a screen update when using a timer + State = MODE_ASKMORE; // prevents a screen update when using a timer // May show different mouse shape. setmouse(); diff --git a/src/nvim/keymap.c b/src/nvim/keycodes.c index b184b42354..676ddcf8d4 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keycodes.c @@ -9,7 +9,7 @@ #include "nvim/charset.h" #include "nvim/edit.h" #include "nvim/eval.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/mouse.h" @@ -17,12 +17,10 @@ #include "nvim/vim.h" #ifdef INCLUDE_GENERATED_DECLARATIONS -# include "keymap.c.generated.h" +# include "keycodes.c.generated.h" #endif -/* - * Some useful tables. - */ +// Some useful tables. static const struct modmasktable { uint16_t mod_mask; ///< Bit-mask for particular key modifier. @@ -43,10 +41,9 @@ static const struct modmasktable { // NOTE: when adding an entry, update MAX_KEY_NAME_LEN! }; -/* - * Shifted key terminal codes and their unshifted equivalent. - * Don't add mouse codes here, they are handled separately! - */ +// Shifted key terminal codes and their unshifted equivalent. +// Don't add mouse codes here, they are handled separately! + #define MOD_KEYS_ENTRY_SIZE 5 static char_u modifier_keys_table[] = @@ -461,10 +458,7 @@ int handle_x_keys(const int key) return key; } -/* - * Return a string which contains the name of the given key when the given - * modifiers are down. - */ +/// @return a string which contains the name of the given key when the given modifiers are down. char_u *get_special_key_name(int c, int modifiers) { static char_u string[MAX_KEY_NAME_LEN + 1]; @@ -481,10 +475,8 @@ char_u *get_special_key_name(int c, int modifiers) c = KEY2TERMCAP1(c); } - /* - * Translate shifted special keys into unshifted keys and set modifier. - * Same for CTRL and ALT modifiers. - */ + // Translate shifted special keys into unshifted keys and set modifier. + // Same for CTRL and ALT modifiers. if (IS_SPECIAL(c)) { for (i = 0; modifier_keys_table[i] != 0; i += MOD_KEYS_ENTRY_SIZE) { if (KEY2TERMCAP0(c) == (int)modifier_keys_table[i + 1] @@ -500,10 +492,8 @@ char_u *get_special_key_name(int c, int modifiers) // try to find the key in the special key table table_idx = find_special_key_in_table(c); - /* - * When not a known special key, and not a printable character, try to - * extract modifiers. - */ + // When not a known special key, and not a printable character, try to + // extract modifiers. if (c > 0 && utf_char2len(c) == 1) { if (table_idx < 0 @@ -798,10 +788,8 @@ static int extract_modifiers(int key, int *modp, const bool simplify, bool *cons return key; } -/* - * Try to find key "c" in the special key table. - * Return the index when found, -1 when not found. - */ +/// Try to find key "c" in the special key table. +/// @return the index when found, -1 when not found. int find_special_key_in_table(int c) { int i; @@ -844,10 +832,8 @@ int get_special_key_code(const char_u *name) return 0; } -/* - * Look up the given mouse code to return the relevant information in the other - * arguments. Return which button is down or was released. - */ +/// Look up the given mouse code to return the relevant information in the other arguments. +/// @return which button is down or was released. int get_mouse_button(int code, bool *is_click, bool *is_drag) { int i; @@ -1009,7 +995,7 @@ char *replace_termcodes(const char *const from, const size_t from_len, char **co } else { result[dlen++] = *src; } - ++src; + src++; } } result[dlen] = NUL; diff --git a/src/nvim/keymap.h b/src/nvim/keycodes.h index 9febd472f9..f6c576f6ee 100644 --- a/src/nvim/keymap.h +++ b/src/nvim/keycodes.h @@ -1,13 +1,11 @@ -#ifndef NVIM_KEYMAP_H -#define NVIM_KEYMAP_H +#ifndef NVIM_KEYCODES_H +#define NVIM_KEYCODES_H #include "nvim/strings.h" -/* - * Keycode definitions for special keys. - * - * Any special key code sequences are replaced by these codes. - */ +// Keycode definitions for special keys. +// +// Any special key code sequences are replaced by these codes. // // For MS-DOS some keys produce codes larger than 0xff. They are split into two @@ -15,66 +13,49 @@ // #define K_NUL (0xce) // for MS-DOS: special key follows -/* - * K_SPECIAL is the first byte of a special key code and is always followed by - * two bytes. - * The second byte can have any value. ASCII is used for normal termcap - * entries, 0x80 and higher for special keys, see below. - * The third byte is guaranteed to be between 0x02 and 0x7f. - */ - +/// K_SPECIAL is the first byte of a special key code and is always followed by +/// two bytes. +/// The second byte can have any value. ASCII is used for normal termcap +/// entries, 0x80 and higher for special keys, see below. +/// The third byte is guaranteed to be between 0x02 and 0x7f. #define K_SPECIAL (0x80) -/* - * Positive characters are "normal" characters. - * Negative characters are special key codes. Only characters below -0x200 - * are used to so that the absolute value can't be mistaken for a single-byte - * character. - */ +/// Positive characters are "normal" characters. +/// Negative characters are special key codes. Only characters below -0x200 +/// are used to so that the absolute value can't be mistaken for a single-byte +/// character. #define IS_SPECIAL(c) ((c) < 0) -/* - * Characters 0x0100 - 0x01ff have a special meaning for abbreviations. - * Multi-byte characters also have ABBR_OFF added, thus are above 0x0200. - */ +/// Characters 0x0100 - 0x01ff have a special meaning for abbreviations. +/// Multi-byte characters also have ABBR_OFF added, thus are above 0x0200. #define ABBR_OFF 0x100 -/* - * NUL cannot be in the input string, therefore it is replaced by - * K_SPECIAL KS_ZERO KE_FILLER - */ +/// NUL cannot be in the input string, therefore it is replaced by +/// K_SPECIAL KS_ZERO KE_FILLER #define KS_ZERO 255 -/* - * K_SPECIAL cannot be in the input string, therefore it is replaced by - * K_SPECIAL KS_SPECIAL KE_FILLER - */ +/// K_SPECIAL cannot be in the input string, therefore it is replaced by +/// K_SPECIAL KS_SPECIAL KE_FILLER #define KS_SPECIAL 254 -/* - * KS_EXTRA is used for keys that have no termcap name - * K_SPECIAL KS_EXTRA KE_xxx - */ +/// KS_EXTRA is used for keys that have no termcap name +/// K_SPECIAL KS_EXTRA KE_xxx #define KS_EXTRA 253 -/* - * KS_MODIFIER is used when a modifier is given for a (special) key - * K_SPECIAL KS_MODIFIER bitmask - */ +/// KS_MODIFIER is used when a modifier is given for a (special) key +/// K_SPECIAL KS_MODIFIER bitmask #define KS_MODIFIER 252 -/* - * These are used for the GUI - * K_SPECIAL KS_xxx KE_FILLER - */ +// These are used for the GUI +// K_SPECIAL KS_xxx KE_FILLER + #define KS_MOUSE 251 #define KS_MENU 250 #define KS_VER_SCROLLBAR 249 #define KS_HOR_SCROLLBAR 248 -/* - * Used for switching Select mode back on after a mapping or menu. - */ +// Used for switching Select mode back on after a mapping or menu. + #define KS_SELECT 245 #define K_SELECT_STRING (char_u *)"\200\365X" @@ -87,30 +68,24 @@ // Used for menu in a tab pages line. #define KS_TABMENU 239 -/* - * Filler used after KS_SPECIAL and others - */ +/// Filler used after KS_SPECIAL and others #define KE_FILLER ('X') -/* - * translation of three byte code "K_SPECIAL a b" into int "K_xxx" and back - */ +// translation of three byte code "K_SPECIAL a b" into int "K_xxx" and back + #define TERMCAP2KEY(a, b) (-((a) + ((int)(b) << 8))) #define KEY2TERMCAP0(x) ((-(x)) & 0xff) #define KEY2TERMCAP1(x) (((unsigned)(-(x)) >> 8) & 0xff) -/* - * get second or third byte when translating special key code into three bytes - */ +// get second or third byte when translating special key code into three bytes + #define K_SECOND(c) ((c) == K_SPECIAL ? KS_SPECIAL : (c) == \ NUL ? KS_ZERO : KEY2TERMCAP0(c)) #define K_THIRD(c) (((c) == K_SPECIAL || (c) == \ NUL) ? KE_FILLER : KEY2TERMCAP1(c)) -/* - * get single int code from second byte after K_SPECIAL - */ +/// get single int code from second byte after K_SPECIAL #define TO_SPECIAL(a, b) ((a) == KS_SPECIAL ? K_SPECIAL : (a) == \ KS_ZERO ? K_ZERO : TERMCAP2KEY(a, b)) @@ -247,9 +222,8 @@ enum key_extra { KE_COMMAND = 104, // <Cmd> special key }; -/* - * the three byte codes are replaced with the following int when using vgetc() - */ +// the three byte codes are replaced with the following int when using vgetc() + #define K_ZERO TERMCAP2KEY(KS_ZERO, KE_FILLER) #define K_UP TERMCAP2KEY('k', 'u') @@ -430,10 +404,9 @@ enum key_extra { #define K_TABLINE TERMCAP2KEY(KS_TABLINE, KE_FILLER) #define K_TABMENU TERMCAP2KEY(KS_TABMENU, KE_FILLER) -/* - * Symbols for pseudo keys which are translated from the real key symbols - * above. - */ +// Symbols for pseudo keys which are translated from the real key symbols +// above. + #define K_LEFTMOUSE TERMCAP2KEY(KS_EXTRA, KE_LEFTMOUSE) #define K_LEFTMOUSE_NM TERMCAP2KEY(KS_EXTRA, KE_LEFTMOUSE_NM) #define K_LEFTDRAG TERMCAP2KEY(KS_EXTRA, KE_LEFTDRAG) @@ -486,11 +459,8 @@ enum key_extra { #define MOD_MASK_MULTI_CLICK (MOD_MASK_2CLICK|MOD_MASK_3CLICK| \ MOD_MASK_4CLICK) -/* - * The length of the longest special key name, including modifiers. - * Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and - * '>'). - */ +/// The length of the longest special key name, including modifiers. +/// Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and '>'). #define MAX_KEY_NAME_LEN 32 // Maximum length of a special key event as tokens. This includes modifiers. @@ -503,7 +473,7 @@ enum key_extra { #define MAX_KEY_CODE_LEN 6 #define FLAG_CPO_BSLASH 0x01 -#define CPO_TO_CPO_FLAGS ((vim_strchr(p_cpo, CPO_BSLASH) == NULL) \ +#define CPO_TO_CPO_FLAGS ((vim_strchr((char *)p_cpo, CPO_BSLASH) == NULL) \ ? 0 \ : FLAG_CPO_BSLASH) @@ -524,6 +494,6 @@ enum { }; #ifdef INCLUDE_GENERATED_DECLARATIONS -# include "keymap.h.generated.h" +# include "keycodes.h.generated.h" #endif -#endif // NVIM_KEYMAP_H +#endif // NVIM_KEYCODES_H diff --git a/src/nvim/lib/kvec.h b/src/nvim/lib/kvec.h index 34332ba34b..68841e0af8 100644 --- a/src/nvim/lib/kvec.h +++ b/src/nvim/lib/kvec.h @@ -94,17 +94,26 @@ memcpy((v1).items, (v0).items, sizeof((v1).items[0]) * (v0).size); \ } while (0) -#define kv_splice(v1, v0) \ +/// fit at least "len" more items +#define kv_ensure_space(v, len) \ do { \ - if ((v1).capacity < (v1).size + (v0).size) { \ - (v1).capacity = (v1).size + (v0).size; \ - kv_roundup32((v1).capacity); \ - kv_resize((v1), (v1).capacity); \ + if ((v).capacity < (v).size + len) { \ + (v).capacity = (v).size + len; \ + kv_roundup32((v).capacity); \ + kv_resize((v), (v).capacity); \ } \ - memcpy((v1).items + (v1).size, (v0).items, sizeof((v1).items[0]) * (v0).size); \ - (v1).size = (v1).size + (v0).size; \ } while (0) +#define kv_concat_len(v, data, len) \ + do { \ + kv_ensure_space(v, len); \ + memcpy((v).items + (v).size, data, sizeof((v).items[0]) * len); \ + (v).size = (v).size + len; \ + } while (0) + +#define kv_concat(v, str) kv_concat_len(v, str, STRLEN(str)) +#define kv_splice(v1, v0) kv_concat_len(v1, (v0).items, (v0).size) + #define kv_pushp(v) \ ((((v).size == (v).capacity) ? (kv_resize_full(v), 0) : 0), \ ((v).items + ((v).size++))) @@ -123,6 +132,8 @@ : 0UL)), \ &(v).items[(i)])) +#define kv_printf(v, ...) kv_do_printf(&(v), __VA_ARGS__) + /// Type of a vector with a few first members allocated on stack /// /// Is compatible with #kv_A, #kv_pop, #kv_size, #kv_max, #kv_last. diff --git a/src/nvim/log.c b/src/nvim/log.c index 7d50ecf69e..815d53b570 100644 --- a/src/nvim/log.c +++ b/src/nvim/log.c @@ -51,7 +51,7 @@ static bool log_try_create(char *fname) /// Initializes path to log file. Sets $NVIM_LOG_FILE if empty. /// -/// Tries $NVIM_LOG_FILE, or falls back to $XDG_CACHE_HOME/nvim/log. Path to log +/// Tries $NVIM_LOG_FILE, or falls back to $XDG_STATE_HOME/nvim/log. Path to log /// file is cached, so only the first call has effect, unless first call was not /// successful. Failed initialization indicates either a bug in expand_env() /// or both $NVIM_LOG_FILE and $HOME environment variables are undefined. @@ -69,16 +69,16 @@ static bool log_path_init(void) || log_file_path[0] == '\0' || os_isdir((char_u *)log_file_path) || !log_try_create(log_file_path)) { - // Make kXDGCacheHome if it does not exist. - char *cachehome = get_xdg_home(kXDGCacheHome); + // Make kXDGStateHome if it does not exist. + char *loghome = get_xdg_home(kXDGStateHome); char *failed_dir = NULL; bool log_dir_failure = false; - if (!os_isdir((char_u *)cachehome)) { - log_dir_failure = (os_mkdir_recurse(cachehome, 0700, &failed_dir) != 0); + if (!os_isdir((char_u *)loghome)) { + log_dir_failure = (os_mkdir_recurse(loghome, 0700, &failed_dir) != 0); } - XFREE_CLEAR(cachehome); + XFREE_CLEAR(loghome); // Invalid $NVIM_LOG_FILE or failed to expand; fall back to default. - char *defaultpath = stdpaths_user_cache_subpath("log"); + char *defaultpath = stdpaths_user_state_subpath("log", 0, true); size_t len = xstrlcpy(log_file_path, defaultpath, size); xfree(defaultpath); // Fall back to .nvimlog diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 1da868c137..9758cee0a5 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -920,7 +920,7 @@ int nlua_call(lua_State *lstate) { Error err = ERROR_INIT; size_t name_len; - const char_u *name = (const char_u *)luaL_checklstring(lstate, 1, &name_len); + const char *name = luaL_checklstring(lstate, 1, &name_len); if (!nlua_is_deferred_safe()) { return luaL_error(lstate, e_luv_api_disabled, "vimL function"); } @@ -1249,7 +1249,7 @@ int nlua_source_using_linegetter(LineGetter fgetline, void *cookie, char *name) char_u *line = NULL; ga_init(&ga, (int)sizeof(char_u *), 10); - while ((line = fgetline(0, cookie, 0, false)) != NULL) { + while ((line = (char_u *)fgetline(0, cookie, 0, false)) != NULL) { GA_APPEND(char_u *, &ga, line); } char *code = ga_concat_strings_sep(&ga, "\n"); @@ -1863,8 +1863,8 @@ void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap) if (cmd->uc_argt & EX_NOSPC) { // Commands where nargs = 1 or "?" fargs is the same as args lua_rawseti(lstate, -2, 1); - } else { - // Commands with more than one possible argument we split + } else if (eap->args == NULL) { + // For commands with more than one possible argument, split if argument list isn't available. lua_pop(lstate, 1); // Pop the reference of opts.args size_t length = STRLEN(eap->arg); size_t end = 0; @@ -1881,6 +1881,13 @@ void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap) } } xfree(buf); + } else { + // If argument list is available, just use it. + lua_pop(lstate, 1); + for (size_t i = 0; i < eap->argc; i++) { + lua_pushlstring(lstate, eap->args[i], eap->arglens[i]); + lua_rawseti(lstate, -2, (int)i + 1); + } } lua_setfield(lstate, -2, "fargs"); diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c index 52a9a1a84f..79e21e518c 100644 --- a/src/nvim/lua/stdlib.c +++ b/src/nvim/lua/stdlib.c @@ -295,7 +295,7 @@ int nlua_regex(lua_State *lstate) TRY_WRAP({ try_start(); - prog = vim_regcomp((char_u *)text, RE_AUTO | RE_MAGIC | RE_STRICT); + prog = vim_regcomp((char *)text, RE_AUTO | RE_MAGIC | RE_STRICT); try_end(&err); }); diff --git a/src/nvim/macros.h b/src/nvim/macros.h index d57ab65d45..c9c424568d 100644 --- a/src/nvim/macros.h +++ b/src/nvim/macros.h @@ -56,12 +56,14 @@ // Returns empty string if it is NULL. #define EMPTY_IF_NULL(x) (char *)((x) ? (x) : (char_u *)"") -// Adjust chars in a language according to 'langmap' option. -// NOTE that there is no noticeable overhead if 'langmap' is not set. -// When set the overhead for characters < 256 is small. -// Don't apply 'langmap' if the character comes from the Stuff buffer or from a -// mapping and the langnoremap option was set. -// The do-while is just to ignore a ';' after the macro. +/// Adjust chars in a language according to 'langmap' option. +/// NOTE that there is no noticeable overhead if 'langmap' is not set. +/// When set the overhead for characters < 256 is small. +/// Don't apply 'langmap' if the character comes from the Stuff buffer or from a +/// mapping and the langnoremap option was set. +/// The do-while is just to ignore a ';' after the macro. +/// +/// -V:LANGMAP_ADJUST:560 #define LANGMAP_ADJUST(c, condition) \ do { \ if (*p_langmap \ diff --git a/src/nvim/main.c b/src/nvim/main.c index 9beaa0686f..80a856e91a 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -643,8 +643,7 @@ void getout(int exitval) bufref_T bufref; set_bufref(&bufref, buf); - apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, - buf->b_fname, false, buf); + apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname, false, buf); if (bufref_valid(&bufref)) { buf_set_changedtick(buf, -1); // note that we did it already } @@ -807,7 +806,7 @@ static void init_locale(void) snprintf(localepath, sizeof(localepath), "%s", get_vim_var_str(VV_PROGPATH)); char *tail = (char *)path_tail_with_sep((char_u *)localepath); *tail = NUL; - tail = (char *)path_tail((char_u *)localepath); + tail = path_tail(localepath); xstrlcpy(tail, "share/locale", sizeof(localepath) - (size_t)(tail - localepath)); bindtextdomain(PROJECT_NAME, localepath); @@ -1364,7 +1363,7 @@ scripterror: if (parmp->diff_mode && os_isdir(p) && GARGCOUNT > 0 && !os_isdir(alist_name(&GARGLIST[0]))) { char_u *r = (char_u *)concat_fnames((char *)p, - (char *)path_tail(alist_name(&GARGLIST[0])), true); + path_tail((char *)alist_name(&GARGLIST[0])), true); xfree(p); p = r; } @@ -1470,7 +1469,7 @@ static void init_path(const char *exename) path_guess_exepath(exename, exepath, sizeof(exepath)); } set_vim_var_string(VV_PROGPATH, exepath, -1); - set_vim_var_string(VV_PROGNAME, (char *)path_tail((char_u *)exename), -1); + set_vim_var_string(VV_PROGNAME, path_tail(exename), -1); #ifdef WIN32 // Append the process start directory to $PATH, so that ":!foo" finds tools @@ -1813,7 +1812,7 @@ static void exe_pre_commands(mparm_T *parmp) if (cnt > 0) { curwin->w_cursor.lnum = 0; // just in case.. - sourcing_name = (char_u *)_("pre-vimrc command line"); + sourcing_name = _("pre-vimrc command line"); current_sctx.sc_sid = SID_CMDARG; for (i = 0; i < cnt; i++) { do_cmdline_cmd(cmds[i]); @@ -1840,7 +1839,7 @@ static void exe_commands(mparm_T *parmp) if (parmp->tagname == NULL && curwin->w_cursor.lnum <= 1) { curwin->w_cursor.lnum = 0; } - sourcing_name = (char_u *)"command line"; + sourcing_name = "command line"; current_sctx.sc_sid = SID_CARG; current_sctx.sc_seq = 0; for (i = 0; i < parmp->n_commands; i++) { @@ -2061,16 +2060,16 @@ static int execute_env(char *env) { const char *initstr = os_getenv(env); if (initstr != NULL) { - char_u *save_sourcing_name = sourcing_name; + char_u *save_sourcing_name = (char_u *)sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; - sourcing_name = (char_u *)env; + sourcing_name = env; sourcing_lnum = 0; const sctx_T save_current_sctx = current_sctx; current_sctx.sc_sid = SID_ENV; current_sctx.sc_seq = 0; current_sctx.sc_lnum = 0; do_cmdline_cmd((char *)initstr); - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; current_sctx = save_current_sctx; return OK; @@ -2104,7 +2103,7 @@ static bool file_owned(const char *fname) static void mainerr(const char *errstr, const char *str) FUNC_ATTR_NORETURN { - char *prgname = (char *)path_tail((char_u *)argv0); + char *prgname = path_tail(argv0); signal_stop(); // kill us with CTRL-C here, if you like diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 222b2a3cf3..6de8d5dfd5 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -717,7 +717,7 @@ static void show_one_mark(int c, char_u *arg, pos_T *p, char_u *name_arg, int cu } } } else if (!got_int - && (arg == NULL || vim_strchr(arg, c) != NULL) + && (arg == NULL || vim_strchr((char *)arg, c) != NULL) && p->lnum != 0) { // don't output anything if 'q' typed at --more-- prompt if (name == NULL && current) { diff --git a/src/nvim/match.c b/src/nvim/match.c index f10d63dd34..54f3bff472 100644 --- a/src/nvim/match.c +++ b/src/nvim/match.c @@ -65,7 +65,7 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in if ((hlg_id = syn_check_group(grp, strlen(grp))) == 0) { return -1; } - if (pat != NULL && (regprog = vim_regcomp((char_u *)pat, RE_MAGIC)) == NULL) { + if (pat != NULL && (regprog = vim_regcomp((char *)pat, RE_MAGIC)) == NULL) { semsg(_(e_invarg2), pat); return -1; } diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 1d65529b75..3868d65ab9 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -1332,7 +1332,7 @@ bool mb_isalpha(int a) static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1, size_t n2) { int c1, c2, cdiff; - char_u buffer[6]; + char buffer[6]; for (;;) { c1 = utf_safe_read_char_adv(&s1, &n1); @@ -1371,10 +1371,10 @@ static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1, size_t n2 if (c1 != -1 && c2 == -1) { n1 = utf_char2bytes(utf_fold(c1), (char *)buffer); - s1 = buffer; + s1 = (char_u *)buffer; } else if (c2 != -1 && c1 == -1) { n2 = utf_char2bytes(utf_fold(c2), (char *)buffer); - s2 = buffer; + s2 = (char_u *)buffer; } while (n1 > 0 && n2 > 0 && *s1 != NUL && *s2 != NUL) { @@ -1992,6 +1992,31 @@ theend: convert_setup(&vimconv, NULL, NULL); } +/// @return true if string "s" is a valid utf-8 string. +/// When "end" is NULL stop at the first NUL. +/// When "end" is positive stop there. +bool utf_valid_string(const char_u *s, const char_u *end) +{ + const char_u *p = s; + + while (end == NULL ? *p != NUL : p < end) { + int l = utf8len_tab_zero[*p]; + if (l == 0) { + return false; // invalid lead byte + } + if (end != NULL && p + l > end) { + return false; // incomplete byte sequence + } + p++; + while (--l > 0) { + if ((*p++ & 0xc0) != 0x80) { + return false; // invalid trail byte + } + } + } + return true; +} + /* * If the cursor moves on an trail byte, set the cursor on the lead byte. * Thus it moves left if necessary. @@ -2264,7 +2289,7 @@ char_u *enc_locale(void) // Make the name lowercase and replace '_' with '-'. // Exception: "ja_JP.EUC" == "euc-jp", "zh_CN.EUC" = "euc-cn", // "ko_KR.EUC" == "euc-kr" - const char *p = (char *)vim_strchr((char_u *)s, '.'); + const char *p = vim_strchr(s, '.'); if (p != NULL) { if (p > s + 2 && !STRNICMP(p + 1, "EUC", 3) && !isalnum((int)p[4]) && p[4] != '-' && p[-3] == '_') { diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 081045ab18..ac6bdfa1a4 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -531,8 +531,8 @@ 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) : buf->b_fname); - --no_wait_return; + buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname); + no_wait_return--; } // don't try to open a swap file again @@ -777,15 +777,14 @@ void ml_recover(bool checkext) // If the file name ends in ".s[a-w][a-z]" we assume this is the swap file. // Otherwise a search is done to find the swap file(s). - fname = curbuf->b_fname; + fname = (char_u *)curbuf->b_fname; if (fname == NULL) { // When there is no file name fname = (char_u *)""; } len = (int)STRLEN(fname); if (checkext && len >= 4 && STRNICMP(fname + len - 4, ".s", 2) == 0 - && vim_strchr((char_u *)"abcdefghijklmnopqrstuvw", - TOLOWER_ASC(fname[len - 2])) != NULL + && vim_strchr("abcdefghijklmnopqrstuvw", TOLOWER_ASC(fname[len - 2])) != NULL && ASCII_ISALPHA(fname[len - 1])) { directly = true; fname_used = vim_strsave(fname); // make a copy for mf_open() @@ -992,7 +991,7 @@ void ml_recover(bool checkext) * 'fileencoding', etc. Ignore errors. The text itself is not used. */ if (curbuf->b_ffname != NULL) { - orig_file_status = readfile(curbuf->b_ffname, NULL, (linenr_T)0, + orig_file_status = readfile((char *)curbuf->b_ffname, NULL, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, NULL, READ_NEW, false); } @@ -1066,7 +1065,7 @@ void ml_recover(bool checkext) */ if (!cannot_open) { line_count = pp->pb_pointer[idx].pe_line_count; - if (readfile(curbuf->b_ffname, NULL, lnum, + if (readfile((char *)curbuf->b_ffname, NULL, lnum, pp->pb_pointer[idx].pe_old_lnum - 1, line_count, NULL, 0, false) != OK) { cannot_open = true; @@ -1248,8 +1247,8 @@ theend: if (serious_error && called_from_main) { ml_close(curbuf, TRUE); } else { - apply_autocmds(EVENT_BUFREADPOST, NULL, curbuf->b_fname, FALSE, curbuf); - apply_autocmds(EVENT_BUFWINENTER, NULL, curbuf->b_fname, FALSE, curbuf); + apply_autocmds(EVENT_BUFREADPOST, NULL, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_BUFWINENTER, NULL, curbuf->b_fname, false, curbuf); } } @@ -1338,8 +1337,8 @@ int recover_names(char_u *fname, int list, int nr, char_u **fname_out) tail = (char_u *)make_percent_swname((char *)dir_name, (char *)fname_res); } else { - tail = path_tail(fname_res); - tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, TRUE); + tail = (char_u *)path_tail((char *)fname_res); + tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, true); } num_names = recov_file_names(names, tail, FALSE); xfree(tail); @@ -1418,7 +1417,7 @@ int recover_names(char_u *fname, int list, int nr, char_u **fname_out) // print the swap file name msg_outnum((long)++file_count); msg_puts(". "); - msg_puts((const char *)path_tail(files[i])); + msg_puts((const char *)path_tail((char *)files[i])); msg_putchar('\n'); (void)swapfile_info(files[i]); } @@ -3204,7 +3203,7 @@ int resolve_symlink(const char_u *fname, char_u *buf) if (path_is_absolute(buf)) { STRCPY(tmp, buf); } else { - char_u *tail = path_tail(tmp); + char_u *tail = (char_u *)path_tail((char *)tmp); if (STRLEN(tail) + STRLEN(buf) >= MAXPATHL) { return FAIL; } @@ -3283,7 +3282,7 @@ char_u *get_file_in_dir(char_u *fname, char_u *dname) char_u *retval; int save_char; - tail = path_tail(fname); + tail = (char_u *)path_tail((char *)fname); if (dname[0] == '.' && dname[1] == NUL) { retval = vim_strsave(fname); @@ -3321,10 +3320,10 @@ 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(buf->b_fname); + msg_outtrans((char_u *)buf->b_fname); msg_puts("\"\n"); FileInfo file_info; - if (!os_fileinfo((char *)buf->b_fname, &file_info)) { + if (!os_fileinfo(buf->b_fname, &file_info)) { msg_puts(_(" CANNOT BE FOUND")); } else { msg_puts(_(" dated: ")); @@ -3343,7 +3342,7 @@ 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(buf->b_fname); + msg_outtrans((char_u *)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); @@ -3423,7 +3422,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ char *fname; size_t n; char *dir_name; - char *buf_fname = (char *)buf->b_fname; + char *buf_fname = buf->b_fname; /* * Isolate a directory name from *dirp and put it in dir_name. @@ -3482,8 +3481,8 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // buffer don't compare the directory names, they can // have a different mountpoint. if (b0.b0_flags & B0_SAME_DIR) { - if (FNAMECMP(path_tail(buf->b_ffname), - path_tail(b0.b0_fname)) != 0 + if (FNAMECMP(path_tail((char *)buf->b_ffname), + path_tail((char *)b0.b0_fname)) != 0 || !same_directory((char_u *)fname, buf->b_ffname)) { // Symlinks may point to the same file even // when the name differs, need to check the @@ -3510,14 +3509,14 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // give the ATTENTION message when there is an old swap file // for the current file, and the buffer was not recovered. if (differ == false && !(curbuf->b_flags & BF_RECOVERED) - && vim_strchr(p_shm, SHM_ATTENTION) == NULL) { + && vim_strchr((char *)p_shm, SHM_ATTENTION) == NULL) { int choice = 0; process_still_running = false; // It's safe to delete the swap file if all these are true: // - the edited file exists // - the swap file has no changes and looks OK - if (os_path_exists(buf->b_fname) && swapfile_unchanged(fname)) { + if (os_path_exists((char_u *)buf->b_fname) && swapfile_unchanged(fname)) { choice = 4; if (p_verbose > 0) { verb_msg(_("Found a swap file that is not useful, deleting it")); @@ -3528,7 +3527,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // response, trigger it. It may return 0 to ask the user anyway. if (choice == 0 && swap_exists_action != SEA_NONE - && has_autocmd(EVENT_SWAPEXISTS, (char_u *)buf_fname, buf)) { + && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf)) { choice = do_swapexists(buf, (char_u *)fname); } diff --git a/src/nvim/menu.c b/src/nvim/menu.c index 192bed76ef..c1ce2eefe3 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -18,7 +18,7 @@ #include "nvim/ex_docmd.h" #include "nvim/garray.h" #include "nvim/getchar.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/memory.h" #include "nvim/menu.h" #include "nvim/message.h" @@ -1034,7 +1034,7 @@ char *set_context_in_menu_cmd(expand_T *xp, const char *cmd, char *arg, bool for * Function given to ExpandGeneric() to obtain the list of (sub)menus (not * entries). */ -char_u *get_menu_name(expand_T *xp, int idx) +char *get_menu_name(expand_T *xp, int idx) { static vimmenu_T *menu = NULL; char *str; @@ -1076,14 +1076,14 @@ char_u *get_menu_name(expand_T *xp, int idx) should_advance = !should_advance; - return (char_u *)str; + return str; } /* * Function given to ExpandGeneric() to obtain the list of menus and menu * entries. */ -char_u *get_menu_names(expand_T *xp, int idx) +char *get_menu_names(expand_T *xp, int idx) { static vimmenu_T *menu = NULL; #define TBUFFER_LEN 256 @@ -1143,7 +1143,7 @@ char_u *get_menu_names(expand_T *xp, int idx) should_advance = !should_advance; - return (char_u *)str; + return str; } @@ -1301,7 +1301,7 @@ static char *menu_text(const char *str, int *mnemonic, char **actext) char *text; // Locate accelerator text, after the first TAB - p = (char *)vim_strchr((char_u *)str, TAB); + p = vim_strchr(str, TAB); if (p != NULL) { if (actext != NULL) { *actext = xstrdup(p + 1); @@ -1314,7 +1314,7 @@ static char *menu_text(const char *str, int *mnemonic, char **actext) // Find mnemonic characters "&a" and reduce "&&" to "&". for (p = text; p != NULL;) { - p = (char *)vim_strchr((char_u *)p, '&'); + p = vim_strchr(p, '&'); if (p != NULL) { if (p[1] == NUL) { // trailing "&" break; @@ -1382,16 +1382,16 @@ static void execute_menu(const exarg_T *eap, vimmenu_T *menu) char *mode; // Use the Insert mode entry when returning to Insert mode. - if (((State & INSERT) || restart_edit) && !current_sctx.sc_sid) { + if (((State & MODE_INSERT) || restart_edit) && !current_sctx.sc_sid) { mode = "Insert"; idx = MENU_INDEX_INSERT; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { mode = "Command"; idx = MENU_INDEX_CMDLINE; - } else if (get_real_state() & VISUAL) { - /* Detect real visual mode -- if we are really in visual mode we - * don't need to do any guesswork to figure out what the selection - * is. Just execute the visual binding for the menu. */ + } else if (get_real_state() & MODE_VISUAL) { + // Detect real visual mode -- if we are really in visual mode we + // don't need to do any guesswork to figure out what the selection + // is. Just execute the visual binding for the menu. mode = "Visual"; idx = MENU_INDEX_VISUAL; } else if (eap != NULL && eap->addr_count) { diff --git a/src/nvim/message.c b/src/nvim/message.c index f4ef91d1b7..49549bcc26 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -24,7 +24,7 @@ #include "nvim/getchar.h" #include "nvim/highlight.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mbyte.h" #include "nvim/memory.h" @@ -162,7 +162,7 @@ void msg_grid_validate(void) { grid_assign_handle(&msg_grid); bool should_alloc = msg_use_grid(); - if (should_alloc && (msg_grid.Rows != Rows || msg_grid.Columns != Columns + 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 // will use the grid including clear to EOS if necessary. @@ -174,9 +174,9 @@ void msg_grid_validate(void) // Tricky: allow resize while pager is active int pos = msg_scrolled ? msg_grid_pos : Rows - p_ch; - ui_comp_put_grid(&msg_grid, pos, 0, msg_grid.Rows, msg_grid.Columns, + ui_comp_put_grid(&msg_grid, pos, 0, msg_grid.rows, msg_grid.cols, false, true); - ui_call_grid_resize(msg_grid.handle, msg_grid.Columns, msg_grid.Rows); + ui_call_grid_resize(msg_grid.handle, msg_grid.cols, msg_grid.rows); msg_grid.throttled = false; // don't throttle in 'cmdheight' area msg_scrolled_at_flush = msg_scrolled; @@ -586,7 +586,7 @@ void msg_source(int attr) if (sourcing_name == NULL) { last_sourcing_name = NULL; } else { - last_sourcing_name = vim_strsave(sourcing_name); + last_sourcing_name = vim_strsave((char_u *)sourcing_name); } } --no_wait_return; @@ -598,8 +598,8 @@ void msg_source(int attr) /// If "emsg_skip" is set: never do error messages. int emsg_not_now(void) { - if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL - && vim_strchr(p_debug, 't') == NULL) + if ((emsg_off > 0 && vim_strchr((char *)p_debug, 'm') == NULL + && vim_strchr((char *)p_debug, 't') == NULL) || emsg_skip > 0) { return TRUE; } @@ -623,14 +623,12 @@ static bool emsg_multiline(const char *s, bool multiline) bool severe = emsg_severe; emsg_severe = false; - if (!emsg_off || vim_strchr(p_debug, 't') != NULL) { - /* - * Cause a throw of an error exception if appropriate. Don't display - * the error message in this case. (If no matching catch clause will - * be found, the message will be displayed later on.) "ignore" is set - * when the message should be ignored completely (used for the - * interrupt message). - */ + if (!emsg_off || vim_strchr((char *)p_debug, 't') != NULL) { + // Cause a throw of an error exception if appropriate. Don't display + // the error message in this case. (If no matching catch clause will + // be found, the message will be displayed later on.) "ignore" is set + // when the message should be ignored completely (used for the + // interrupt message). if (cause_errthrow(s, severe, &ignore)) { if (!ignore) { did_emsg++; @@ -1125,7 +1123,7 @@ void wait_return(int redraw) // just changed. screenalloc(); - State = HITRETURN; + State = MODE_HITRETURN; setmouse(); cmdline_row = msg_row; // Avoid the sequence that the user types ":" at the hit-return prompt @@ -1212,7 +1210,7 @@ void wait_return(int redraw) if (c == K_LEFTMOUSE || c == K_MIDDLEMOUSE || c == K_RIGHTMOUSE || c == K_X1MOUSE || c == K_X2MOUSE) { (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0); - } else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C) { + } else if (vim_strchr("\r\n ", c) == NULL && c != Ctrl_C) { // Put the character back in the typeahead buffer. Don't use the // stuff buffer, because lmaps wouldn't work. ins_char_typebuf(vgetc_char, vgetc_mod_mask); @@ -1250,7 +1248,7 @@ void wait_return(int redraw) XFREE_CLEAR(keep_msg); // don't redisplay message, it's too long } - if (tmpState == SETWSIZE) { // got resize event while in vgetc() + if (tmpState == MODE_SETWSIZE) { // got resize event while in vgetc() ui_refresh(); } else if (!skip_redraw) { if (redraw == true || (msg_scrolled != 0 && redraw != -1)) { @@ -2186,7 +2184,7 @@ static void msg_puts_display(const char_u *str, int maxlen, int attr, int recurs if (lines_left > 0) { --lines_left; } - if (p_more && lines_left == 0 && State != HITRETURN + if (p_more && lines_left == 0 && State != MODE_HITRETURN && !msg_no_more && !exmode_active) { if (do_more_prompt(NUL)) { s = confirm_msg_tail; @@ -2322,10 +2320,10 @@ void msg_scroll_up(bool may_throttle) if (msg_grid_pos > 0) { msg_grid_set_pos(msg_grid_pos - 1, true); } else { - grid_del_lines(&msg_grid, 0, 1, msg_grid.Rows, 0, msg_grid.Columns); + 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)); - msg_grid.dirty_col[msg_grid.Rows - 1] = 0; + (msg_grid.rows - 1) * sizeof(*msg_grid.dirty_col)); + msg_grid.dirty_col[msg_grid.rows - 1] = 0; } } else { grid_del_lines(&msg_grid_adj, 0, 1, Rows, 0, Columns); @@ -2358,7 +2356,7 @@ void msg_scroll_flush(void) msg_grid.throttled = false; int pos_delta = msg_grid_pos_at_flush - msg_grid_pos; assert(pos_delta >= 0); - int delta = MIN(msg_scrolled - msg_scrolled_at_flush, msg_grid.Rows); + int delta = MIN(msg_scrolled - msg_scrolled_at_flush, msg_grid.rows); if (pos_delta > 0) { ui_ext_msg_set_pos(msg_grid_pos, true); @@ -2376,7 +2374,7 @@ void msg_scroll_flush(void) for (int i = MAX(Rows - MAX(delta, 1), 0); i < Rows; i++) { int row = i - msg_grid_pos; assert(row >= 0); - ui_line(&msg_grid, row, 0, msg_grid.dirty_col[row], msg_grid.Columns, + ui_line(&msg_grid, row, 0, msg_grid.dirty_col[row], msg_grid.cols, HL_ATTR(HLF_MSG), false); msg_grid.dirty_col[row] = 0; } @@ -2402,9 +2400,9 @@ void msg_reset_scroll(void) clear_cmdline = true; if (msg_grid.chars) { // non-displayed part of msg_grid is considered invalid. - for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.Rows); i++) { + for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.rows); i++) { grid_clear_line(&msg_grid, msg_grid.line_offset[i], - msg_grid.Columns, false); + msg_grid.cols, false); } } } else { @@ -2418,7 +2416,7 @@ void msg_reset_scroll(void) static void inc_msg_scrolled(void) { if (*get_vim_var_str(VV_SCROLLSTART) == NUL) { - char *p = (char *)sourcing_name; + char *p = sourcing_name; char *tofree = NULL; // v:scrollstart is empty, set it to the script/function name and line @@ -2707,7 +2705,7 @@ static int do_more_prompt(int typed_char) // We get called recursively when a timer callback outputs a message. In // that case don't show another prompt. Also when at the hit-Enter prompt // and nothing was typed. - if (no_need_more || entered || (State == HITRETURN && typed_char == 0)) { + if (no_need_more || entered || (State == MODE_HITRETURN && typed_char == 0)) { return false; } entered = true; @@ -2721,7 +2719,7 @@ static int do_more_prompt(int typed_char) } } - State = ASKMORE; + State = MODE_ASKMORE; setmouse(); if (typed_char == NUL) { msg_moremsg(FALSE); @@ -2992,19 +2990,19 @@ void msg_moremsg(int full) } } -/// Repeat the message for the current mode: ASKMORE, EXTERNCMD, CONFIRM or -/// exmode_active. +/// Repeat the message for the current mode: MODE_ASKMORE, MODE_EXTERNCMD, +/// MODE_CONFIRM or exmode_active. void repeat_message(void) { - if (State == ASKMORE) { - msg_moremsg(TRUE); // display --more-- message again + if (State == MODE_ASKMORE) { + msg_moremsg(true); // display --more-- message again msg_row = Rows - 1; - } else if (State == CONFIRM) { + } else if (State == MODE_CONFIRM) { display_confirm_msg(); // display ":confirm" message again msg_row = Rows - 1; - } else if (State == EXTERNCMD) { + } else if (State == MODE_EXTERNCMD) { ui_cursor_goto(msg_row, msg_col); // put cursor back - } else if (State == HITRETURN || State == SETWSIZE) { + } else if (State == MODE_HITRETURN || State == MODE_SETWSIZE) { if (msg_row == Rows - 1) { // Avoid drawing the "hit-enter" prompt below the previous one, // overwrite it. Esp. useful when regaining focus and a @@ -3076,9 +3074,9 @@ int msg_end(void) * we have to redraw the window. * Do not do this if we are abandoning the file or editing the command line. */ - if (!exiting && need_wait_return && !(State & CMDLINE)) { - wait_return(FALSE); - return FALSE; + if (!exiting && need_wait_return && !(State & MODE_CMDLINE)) { + wait_return(false); + return false; } // NOTE: ui_flush() used to be called here. This had to be removed, as it @@ -3436,7 +3434,7 @@ int do_dialog(int type, char_u *title, char_u *message, char_u *buttons, int dfl int oldState = State; msg_silent = 0; // If dialog prompts for input, user needs to see it! #8788 - State = CONFIRM; + State = MODE_CONFIRM; setmouse(); /* diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 8038ba2cad..fe21279ef7 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -68,12 +68,12 @@ bool is_mouse_key(int c) /// mouse was previously on a status line, then the status line may be dragged. /// /// If flags has MOUSE_MAY_VIS, then VIsual mode will be started before the -/// cursor is moved unless the cursor was on a status line. +/// cursor is moved unless the cursor was on a status line or window bar. /// This function returns one of IN_UNKNOWN, IN_BUFFER, IN_STATUS_LINE or /// IN_SEP_LINE depending on where the cursor was clicked. /// /// If flags has MOUSE_MAY_STOP_VIS, then Visual mode will be stopped, unless -/// the mouse is on the status line of the same window. +/// the mouse is on the status line or window bar of the same window. /// /// If flags has MOUSE_DID_MOVE, nothing is done if the mouse didn't move since /// the last call. @@ -87,6 +87,7 @@ int jump_to_mouse(int flags, bool *inclusive, int which_button) { static int on_status_line = 0; // #lines below bottom of window static int on_sep_line = 0; // on separator right of window + static bool on_winbar = false; static int prev_row = -1; static int prev_col = -1; static win_T *dragwin = NULL; // window being dragged @@ -126,6 +127,9 @@ retnomove: if (on_sep_line) { return IN_SEP_LINE; } + if (on_winbar) { + return IN_OTHER_WIN | MOUSE_WINBAR; + } if (flags & MOUSE_MAY_STOP_VIS) { end_visual_mode(); redraw_curbuf_later(INVERTED); // delete the inversion @@ -155,9 +159,11 @@ retnomove: fdc = win_fdccol_count(wp); dragwin = NULL; - if (row == -1) { - return IN_OTHER_WIN; + if (row == -1 + wp->w_winbar_height) { + on_winbar = !!wp->w_winbar_height; + return IN_OTHER_WIN | (on_winbar ? MOUSE_WINBAR : 0); } + on_winbar = false; // winpos and height may change in win_enter()! if (grid == DEFAULT_GRID_HANDLE && row >= wp->w_height) { @@ -253,6 +259,9 @@ retnomove: did_drag |= count; } return IN_SEP_LINE; // Cursor didn't move + } else if (on_winbar) { + // After a click on the window bar don't start Visual mode. + return IN_OTHER_WIN | MOUSE_WINBAR; } else { // keep_window_focus must be true // before moving the cursor for a left click, stop Visual mode @@ -397,6 +406,9 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump) if (win->w_p_rl) { col = win->w_width_inner - 1 - col; } + if (win->w_winbar_height) { + row -= win->w_winbar_height; + } lnum = win->w_topline; @@ -497,6 +509,7 @@ win_T *mouse_find_win(int *gridp, int *rowp, int *colp) // exist. FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { if (wp == fp->fr_win) { + *rowp -= wp->w_winrow_off - wp->w_winbar_height; return wp; } } @@ -512,8 +525,8 @@ static win_T *mouse_find_grid_win(int *gridp, int *rowp, int *colp) win_T *wp = get_win_by_grid_handle(*gridp); if (wp && wp->w_grid_alloc.chars && !(wp->w_floating && !wp->w_float_config.focusable)) { - *rowp = MIN(*rowp - wp->w_grid.row_offset, wp->w_grid.Rows - 1); - *colp = MIN(*colp - wp->w_grid.col_offset, wp->w_grid.Columns - 1); + *rowp = MIN(*rowp - wp->w_grid.row_offset, wp->w_grid.rows - 1); + *colp = MIN(*colp - wp->w_grid.col_offset, wp->w_grid.cols - 1); return wp; } } else if (*gridp == 0) { @@ -784,8 +797,8 @@ int mouse_check_fold(void) wp = mouse_find_win(&click_grid, &click_row, &click_col); if (wp && multigrid) { - max_row = wp->w_grid_alloc.Rows; - max_col = wp->w_grid_alloc.Columns; + max_row = wp->w_grid_alloc.rows; + max_col = wp->w_grid_alloc.cols; } if (wp && mouse_row >= 0 && mouse_row < max_row diff --git a/src/nvim/move.c b/src/nvim/move.c index 11feb497ea..97ce92f6a9 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -1016,7 +1016,7 @@ void textpos2screenpos(win_T *wp, pos_T *pos, int *rowp, int *scolp, int *ccolp, col -= wp->w_leftcol; if (col >= 0 && col < wp->w_width) { - coloff = col - scol + (local ? 0 : wp->w_wincol + wp->w_border_adj[3]) + 1; + coloff = col - scol + (local ? 0 : wp->w_wincol + wp->w_wincol_off) + 1; } else { scol = ccol = ecol = 0; // character is left or right of the window @@ -1027,7 +1027,7 @@ void textpos2screenpos(win_T *wp, pos_T *pos, int *rowp, int *scolp, int *ccolp, } } } - *rowp = (local ? 0 : wp->w_winrow + wp->w_border_adj[0]) + row + rowoff; + *rowp = (local ? 0 : wp->w_winrow + wp->w_winrow_off) + row + rowoff; *scolp = scol + coloff; *ccolp = ccol + coloff; *ecolp = ecol + coloff; diff --git a/src/nvim/normal.c b/src/nvim/normal.c index fd974d9c05..1692970a97 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -33,7 +33,7 @@ #include "nvim/getchar.h" #include "nvim/globals.h" #include "nvim/indent.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/log.h" #include "nvim/main.h" #include "nvim/mark.h" @@ -487,7 +487,7 @@ static void normal_prepare(NormalState *s) } s->mapped_len = typebuf_maplen(); - State = NORMAL_BUSY; + State = MODE_NORMAL_BUSY; // Set v:count here, when called from main() and not a stuffed command, so // that v:count can be used in an expression mapping when there is no count. @@ -594,7 +594,7 @@ static void normal_redraw_mode_message(NormalState *s) // Draw the cursor with the right shape here if (restart_edit != 0) { - State = INSERT; + State = MODE_INSERT; } // If need to redraw, and there is a "keep_msg", redraw before the @@ -671,7 +671,7 @@ static void normal_get_additional_char(NormalState *s) // Get a second or third character. if (cp != NULL) { if (repl) { - State = REPLACE; // pretend Replace mode + State = MODE_REPLACE; // pretend Replace mode ui_cursor_shape(); // show different cursor shape } if (lang && curbuf->b_p_iminsert == B_IMODE_LMAP) { @@ -679,9 +679,9 @@ static void normal_get_additional_char(NormalState *s) no_mapping--; allow_keys--; if (repl) { - State = LREPLACE; + State = MODE_LREPLACE; } else { - State = LANGMAP; + State = MODE_LANGMAP; } langmap_active = true; } @@ -693,7 +693,7 @@ static void normal_get_additional_char(NormalState *s) no_mapping++; allow_keys++; } - State = NORMAL_BUSY; + State = MODE_NORMAL_BUSY; s->need_flushbuf |= add_to_showcmd(*cp); if (!lit) { @@ -979,7 +979,7 @@ static int normal_execute(VimState *state, int key) s->old_col = curwin->w_curswant; s->c = key; - LANGMAP_ADJUST(s->c, get_real_state() != SELECTMODE); + LANGMAP_ADJUST(s->c, get_real_state() != MODE_SELECT); // If a mapping was started in Visual or Select mode, remember the length // of the mapping. This is used below to not return to Insert mode for as @@ -1122,7 +1122,7 @@ static int normal_execute(VimState *state, int key) did_cursorhold = false; } - State = NORMAL; + State = MODE_NORMAL; if (s->ca.nchar == ESC) { clearop(&s->oa); @@ -1202,7 +1202,7 @@ static void normal_check_interrupt(NormalState *s) // Typed two CTRL-C in a row: go back to ex mode as if "Q" was // used and keep "got_int" set, so that it aborts ":g". exmode_active = true; - State = NORMAL; + State = MODE_NORMAL; } else if (!global_busy || !exmode_active) { if (!quit_more) { // flush all buffers @@ -1280,7 +1280,8 @@ static void normal_redraw(NormalState *s) validate_cursor(); if (VIsual_active) { - update_curbuf(INVERTED); // update inverted part + redraw_curbuf_later(INVERTED); // update inverted part + update_screen(INVERTED); } else if (must_redraw) { update_screen(0); } else if (redraw_cmdline || clear_cmdline) { @@ -1559,7 +1560,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // CTRL right mouse button does CTRL-T if (is_click && (mod_mask & MOD_MASK_CTRL) && which_button == MOUSE_RIGHT) { - if (State & INSERT) { + if (State & MODE_INSERT) { stuffcharReadbuff(Ctrl_O); } if (count > 1) { @@ -1607,7 +1608,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // Middle mouse button does a 'put' of the selected text if (which_button == MOUSE_MIDDLE) { - if (State == NORMAL) { + if (State == MODE_NORMAL) { // If an operator was pending, we don't know what the user wanted to do. // Go back to normal mode: Clear the operator and beep(). if (oap != NULL && oap->op_type != OP_NOP) { @@ -1629,7 +1630,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) return false; } // The rest is below jump_to_mouse() - } else if ((State & INSERT) == 0) { + } else if ((State & MODE_INSERT) == 0) { return false; } @@ -1638,7 +1639,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // with do_put(). // Also paste at the cursor if the current mode isn't in 'mouse' (only // happens for the GUI). - if ((State & INSERT)) { + if ((State & MODE_INSERT)) { if (regname == '.') { insert_reg(regname, true); } else { @@ -1807,7 +1808,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } } - if ((State & (NORMAL | INSERT)) + if ((State & (MODE_NORMAL | MODE_INSERT)) && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))) { if (which_button == MOUSE_LEFT) { if (is_click) { @@ -1850,6 +1851,11 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) oap == NULL ? NULL : &(oap->inclusive), which_button); + // A click in the window bar has no side effects. + if (jump_flags & MOUSE_WINBAR) { + return false; + } + moved = (jump_flags & CURSOR_MOVED); in_status_line = (jump_flags & IN_STATUS_LINE); in_sep_line = (jump_flags & IN_SEP_LINE); @@ -1958,7 +1964,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } } } - } else if ((State & INSERT) && VIsual_active) { + } else if ((State & MODE_INSERT) && VIsual_active) { // If Visual mode started in insert mode, execute "CTRL-O" stuffcharReadbuff(Ctrl_O); } @@ -2005,7 +2011,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) || (curbuf->b_help && (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)) { // Ctrl-Mouse click (or double click in a help window) jumps to the tag // under the mouse pointer. - if (State & INSERT) { + if (State & MODE_INSERT) { stuffcharReadbuff(Ctrl_O); } stuffcharReadbuff(Ctrl_RSB); @@ -2013,7 +2019,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } else if ((mod_mask & MOD_MASK_SHIFT)) { // Shift-Mouse click searches for the next occurrence of the word under // the mouse pointer - if (State & INSERT + if (State & MODE_INSERT || (VIsual_active && VIsual_select)) { stuffcharReadbuff(Ctrl_O); } @@ -2025,7 +2031,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } else if (in_status_line || in_sep_line) { // Do nothing if on status line or vertical separator // Handle double clicks otherwise - } else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))) { + } else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (MODE_NORMAL | MODE_INSERT))) { if (is_click || !VIsual_active) { if (VIsual_active) { orig_cursor = VIsual; @@ -2191,7 +2197,7 @@ static int get_mouse_class(char_u *p) // characters to be considered as a single word. These are things like // "->", "/ *", "*=", "+=", "&=", "<=", ">=", "!=" etc. Otherwise, each // character is in its own class. - if (c != NUL && vim_strchr((char_u *)"-+*/%<>&|^!=", c) != NULL) { + if (c != NUL && vim_strchr("-+*/%<>&|^!=", c) != NULL) { return 1; } return c; @@ -3447,7 +3453,7 @@ dozet: // and "zC" only in Visual mode. "zj" and "zk" are motion // commands. if (cap->nchar != 'f' && cap->nchar != 'F' - && !(VIsual_active && vim_strchr((char_u *)"dcCoO", cap->nchar)) + && !(VIsual_active && vim_strchr("dcCoO", cap->nchar)) && cap->nchar != 'j' && cap->nchar != 'k' && checkclearop(cap->oap)) { return; @@ -3455,7 +3461,7 @@ dozet: // For "z+", "z<CR>", "zt", "z.", "zz", "z^", "z-", "zb": // If line number given, set cursor. - if ((vim_strchr((char_u *)"+\r\nt.z^-b", nchar) != NULL) + if ((vim_strchr("+\r\nt.z^-b", nchar) != NULL) && cap->count0 && cap->count0 != curwin->w_cursor.lnum) { setpcmark(); @@ -3800,7 +3806,7 @@ dozet: no_mapping--; allow_keys--; (void)add_to_showcmd(nchar); - if (vim_strchr((char_u *)"gGwW", nchar) == NULL) { + if (vim_strchr("gGwW", nchar) == NULL) { clearopbeep(cap->oap); break; } @@ -4234,7 +4240,7 @@ static void nv_ident(cmdarg_T *cap) p = (char_u *)buf + STRLEN(buf); while (n-- > 0) { // put a backslash before \ and some others - if (vim_strchr(aux_ptr, *ptr) != NULL) { + if (vim_strchr((char *)aux_ptr, *ptr) != NULL) { *p++ = '\\'; } // When current byte is a part of multibyte character, copy all @@ -4268,7 +4274,7 @@ static void nv_ident(cmdarg_T *cap) // Start insert mode in terminal buffer restart_edit = 'i'; - add_map((char_u *)"<buffer> <esc> <Cmd>bdelete!<CR>", TERM_FOCUS, true); + add_map((char_u *)"<buffer> <esc> <Cmd>bdelete!<CR>", MODE_TERMINAL, true); } } @@ -4434,9 +4440,9 @@ static void nv_right(cmdarg_T *cap) // <Space> wraps to next line if 'whichwrap' has 's'. // 'l' wraps to next line if 'whichwrap' has 'l'. // CURS_RIGHT wraps to next line if 'whichwrap' has '>'. - if (((cap->cmdchar == ' ' && vim_strchr(p_ww, 's') != NULL) - || (cap->cmdchar == 'l' && vim_strchr(p_ww, 'l') != NULL) - || (cap->cmdchar == K_RIGHT && vim_strchr(p_ww, '>') != NULL)) + if (((cap->cmdchar == ' ' && vim_strchr((char *)p_ww, 's') != NULL) + || (cap->cmdchar == 'l' && vim_strchr((char *)p_ww, 'l') != NULL) + || (cap->cmdchar == K_RIGHT && vim_strchr((char *)p_ww, '>') != NULL)) && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { // When deleting we also count the NL as a character. // Set cap->oap->inclusive when last char in the line is @@ -4504,9 +4510,9 @@ static void nv_left(cmdarg_T *cap) // 'h' wraps to previous line if 'whichwrap' has 'h'. // CURS_LEFT wraps to previous line if 'whichwrap' has '<'. if ((((cap->cmdchar == K_BS || cap->cmdchar == Ctrl_H) - && vim_strchr(p_ww, 'b') != NULL) - || (cap->cmdchar == 'h' && vim_strchr(p_ww, 'h') != NULL) - || (cap->cmdchar == K_LEFT && vim_strchr(p_ww, '<') != NULL)) + && vim_strchr((char *)p_ww, 'b') != NULL) + || (cap->cmdchar == 'h' && vim_strchr((char *)p_ww, 'h') != NULL) + || (cap->cmdchar == K_LEFT && vim_strchr((char *)p_ww, '<') != NULL)) && curwin->w_cursor.lnum > 1) { curwin->w_cursor.lnum--; coladvance(MAXCOL); @@ -4802,7 +4808,7 @@ static void nv_brackets(cmdarg_T *cap) // "[f" or "]f" : Edit file under the cursor (same as "gf") if (cap->nchar == 'f') { nv_gotofile(cap); - } else if (vim_strchr((char_u *)"iI\011dD\004", cap->nchar) != NULL) { + } else if (vim_strchr("iI\011dD\004", cap->nchar) != NULL) { // Find the occurrence(s) of the identifier or define under cursor // in current and included files or jump to the first occurrence. // @@ -4831,8 +4837,8 @@ static void nv_brackets(cmdarg_T *cap) MAXLNUM); curwin->w_set_curswant = true; } - } else if ((cap->cmdchar == '[' && vim_strchr((char_u *)"{(*/#mM", cap->nchar) != NULL) - || (cap->cmdchar == ']' && vim_strchr((char_u *)"})*/#mM", cap->nchar) != NULL)) { + } else if ((cap->cmdchar == '[' && vim_strchr("{(*/#mM", cap->nchar) != NULL) + || (cap->cmdchar == ']' && vim_strchr("})*/#mM", cap->nchar) != NULL)) { // "[{", "[(", "]}" or "])": go to Nth unclosed '{', '(', '}' or ')' // "[#", "]#": go to start/end of Nth innermost #if..#endif construct. // "[/", "[*", "]/", "]*": go to Nth comment start/end. @@ -5269,7 +5275,7 @@ static void nv_replace(cmdarg_T *cap) // multi-byte and the other way around. Also handles adding // composing characters for utf-8. for (long n = cap->count1; n > 0; n--) { - State = REPLACE; + State = MODE_REPLACE; if (cap->nchar == Ctrl_E || cap->nchar == Ctrl_Y) { int c = ins_copychar(curwin->w_cursor.lnum + (cap->nchar == Ctrl_Y ? -1 : 1)); @@ -5403,7 +5409,7 @@ static void n_swapchar(cmdarg_T *cap) return; } - if (LINEEMPTY(curwin->w_cursor.lnum) && vim_strchr(p_ww, '~') == NULL) { + if (LINEEMPTY(curwin->w_cursor.lnum) && vim_strchr((char *)p_ww, '~') == NULL) { clearopbeep(cap->oap); return; } @@ -5419,7 +5425,7 @@ static void n_swapchar(cmdarg_T *cap) did_change |= swapchar(cap->oap->op_type, &curwin->w_cursor); inc_cursor(); if (gchar_cursor() == NUL) { - if (vim_strchr(p_ww, '~') != NULL + if (vim_strchr((char *)p_ww, '~') != NULL && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { curwin->w_cursor.lnum++; curwin->w_cursor.col = 0; @@ -5491,7 +5497,7 @@ static void v_visop(cmdarg_T *cap) curwin->w_curswant = MAXCOL; } } - cap->cmdchar = *(vim_strchr(trans, cap->cmdchar) + 1); + cap->cmdchar = (uint8_t)(*(vim_strchr((char *)trans, cap->cmdchar) + 1)); nv_operator(cap); } @@ -5754,7 +5760,8 @@ void start_selection(void) /// When "c" is 'o' (checking for "mouse") then also when mapped. void may_start_select(int c) { - VIsual_select = (c == 'o' || (stuff_empty() && typebuf_typed())) && vim_strchr(p_slm, c) != NULL; + VIsual_select = (c == 'o' || (stuff_empty() && typebuf_typed())) + && vim_strchr((char *)p_slm, c) != NULL; } /// Start Visual mode "c". @@ -6807,7 +6814,7 @@ void set_cursor_for_append_to_line(void) // Pretend Insert mode here to allow the cursor on the // character past the end of the line - State = INSERT; + State = MODE_INSERT; coladvance(MAXCOL); State = save_State; } else { @@ -6863,7 +6870,7 @@ static void nv_edit(cmdarg_T *cap) // Pretend Insert mode here to allow the cursor on the // character past the end of the line - State = INSERT; + State = MODE_INSERT; coladvance(getviscol()); State = save_State; } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 9d6e516d6e..c3d7742307 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -354,7 +354,7 @@ static void shift_block(oparg_T *oap, int amount) p_ri = 0; // don't want revins in indent - State = INSERT; // don't want REPLACE for State + State = MODE_INSERT; // don't want MODE_REPLACE for State block_prep(oap, &bd, curwin->w_cursor.lnum, true); if (bd.is_short) { return; @@ -532,7 +532,7 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def char_u *newp, *oldp; // new, old lines linenr_T lnum; // loop var int oldstate = State; - State = INSERT; // don't want REPLACE for State + State = MODE_INSERT; // don't want MODE_REPLACE for State for (lnum = oap->start.lnum + 1; lnum <= oap->end.lnum; lnum++) { block_prep(oap, bdp, lnum, true); @@ -800,7 +800,7 @@ char_u *get_expr_line_src(void) bool valid_yank_reg(int regname, bool writing) { if ((regname > 0 && ASCII_ISALNUM(regname)) - || (!writing && vim_strchr((char_u *)"/.%:=", regname) != NULL) + || (!writing && vim_strchr("/.%:=", regname) != NULL) || regname == '#' || regname == '"' || regname == '-' @@ -884,7 +884,7 @@ yankreg_T *copy_register(int name) if (copy->y_size == 0) { copy->y_array = NULL; } else { - copy->y_array = xcalloc(copy->y_size, sizeof(char_u *)); + copy->y_array = xcalloc(copy->y_size, sizeof(char *)); for (size_t i = 0; i < copy->y_size; i++) { copy->y_array[i] = xstrdup(reg->y_array[i]); } @@ -1161,7 +1161,7 @@ int do_execreg(int regname, int colon, int addcr, int silent) * Insert lines into typeahead buffer, from last one to first one. */ put_reedit_in_typebuf(silent); - char_u *escaped; + char *escaped; for (size_t i = reg->y_size; i-- > 0;) { // from y_size - 1 to 0 included // insert NL between lines and after last line if type is kMTLineWise if (reg->y_type == kMTLineWise || i < reg->y_size - 1 || addcr) { @@ -1180,11 +1180,11 @@ int do_execreg(int regname, int colon, int addcr, int silent) free_str = true; } } - escaped = (char_u *)vim_strsave_escape_ks((char *)str); + escaped = vim_strsave_escape_ks((char *)str); if (free_str) { xfree(str); } - retval = ins_typebuf((char *)escaped, remap, 0, true, silent); + retval = ins_typebuf(escaped, remap, 0, true, silent); xfree(escaped); if (retval == FAIL) { return FAIL; @@ -1237,17 +1237,17 @@ static int put_in_typebuf(char_u *s, bool esc, bool colon, int silent) retval = ins_typebuf("\n", REMAP_NONE, 0, true, silent); } if (retval == OK) { - char_u *p; + char *p; if (esc) { - p = (char_u *)vim_strsave_escape_ks((char *)s); + p = vim_strsave_escape_ks((char *)s); } else { - p = s; + p = (char *)s; } if (p == NULL) { retval = FAIL; } else { - retval = ins_typebuf((char *)p, esc ? REMAP_NONE : REMAP_YES, 0, true, silent); + retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES, 0, true, silent); } if (esc) { xfree(p); @@ -1368,7 +1368,7 @@ bool get_spec_reg(int regname, char_u **argp, bool *allocated, bool errmsg) if (errmsg) { check_fname(); // will give emsg if not set } - *argp = curbuf->b_fname; + *argp = (char_u *)curbuf->b_fname; return true; case '#': // alternate file name @@ -1865,7 +1865,7 @@ static void replace_character(int c) { const int n = State; - State = REPLACE; + State = MODE_REPLACE; ins_char(c); State = n; // Backup to the replaced character. @@ -2507,10 +2507,7 @@ int op_change(oparg_T *oap) l = oap->start.col; if (oap->motion_type == kMTLineWise) { l = 0; - if (!p_paste && curbuf->b_p_si - && !curbuf->b_p_cin) { - can_si = true; // It's like opening a new line, do si - } + can_si = may_do_si(); // Like opening a new line, do smart indent } // First delete the text in the region. In an empty buffer only need to @@ -2679,7 +2676,7 @@ bool op_yank(oparg_T *oap, bool message) static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) { yankreg_T newreg; // new yank register when appending - char_u **new_ptr; + char **new_ptr; linenr_T lnum; // current line number size_t j; MotionType yank_type = oap->motion_type; @@ -2713,7 +2710,7 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) reg->y_size = yanklines; reg->y_type = yank_type; // set the yank register type reg->y_width = 0; - reg->y_array = xcalloc(yanklines, sizeof(char_u *)); + reg->y_array = xcalloc(yanklines, sizeof(char *)); reg->additional_data = NULL; reg->timestamp = os_time(); @@ -2808,10 +2805,10 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) if (curr != reg) { // append the new block to the old block new_ptr = xmalloc(sizeof(char_u *) * (curr->y_size + reg->y_size)); for (j = 0; j < curr->y_size; j++) { - new_ptr[j] = (char_u *)curr->y_array[j]; + new_ptr[j] = curr->y_array[j]; } xfree(curr->y_array); - curr->y_array = (char **)new_ptr; + curr->y_array = new_ptr; if (yank_type == kMTLineWise) { // kMTLineWise overrides kMTCharWise and kMTBlockWise @@ -3131,8 +3128,8 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) if (y_array != NULL) { y_array[y_size] = ptr; } - ++y_size; - ptr = vim_strchr(ptr, '\n'); + y_size++; + ptr = (char_u *)vim_strchr((char *)ptr, '\n'); if (ptr != NULL) { if (y_array != NULL) { *ptr = NUL; @@ -3774,7 +3771,7 @@ void adjust_cursor_eol(void) if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL && (cur_ve_flags & VE_ONEMORE) == 0 - && !(restart_edit || (State & INSERT))) { + && !(restart_edit || (State & MODE_INSERT))) { // Put the cursor on the last character in the line. dec_cursor(); @@ -3852,7 +3849,7 @@ void ex_display(exarg_T *eap) type = 'b'; break; } - if (arg != NULL && vim_strchr(arg, name) == NULL) { + if (arg != NULL && vim_strchr((char *)arg, name) == NULL) { continue; // did not ask for this register } @@ -3915,14 +3912,14 @@ void ex_display(exarg_T *eap) // display last inserted text if ((p = get_last_insert()) != NULL - && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int + && (arg == NULL || vim_strchr((char *)arg, '.') != NULL) && !got_int && !message_filtered(p)) { msg_puts("\n c \". "); dis_msg(p, true); } // display last command line - if (last_cmdline != NULL && (arg == NULL || vim_strchr(arg, ':') != NULL) + if (last_cmdline != NULL && (arg == NULL || vim_strchr((char *)arg, ':') != NULL) && !got_int && !message_filtered(last_cmdline)) { msg_puts("\n c \": "); dis_msg(last_cmdline, false); @@ -3930,14 +3927,14 @@ void ex_display(exarg_T *eap) // display current file name if (curbuf->b_fname != NULL - && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int - && !message_filtered(curbuf->b_fname)) { + && (arg == NULL || vim_strchr((char *)arg, '%') != NULL) && !got_int + && !message_filtered((char_u *)curbuf->b_fname)) { msg_puts("\n c \"% "); - dis_msg(curbuf->b_fname, false); + dis_msg((char_u *)curbuf->b_fname, false); } // display alternate file name - if ((arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int) { + if ((arg == NULL || vim_strchr((char *)arg, '%') != NULL) && !got_int) { char_u *fname; linenr_T dummy; @@ -3949,14 +3946,14 @@ void ex_display(exarg_T *eap) // display last search pattern if (last_search_pat() != NULL - && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int + && (arg == NULL || vim_strchr((char *)arg, '/') != NULL) && !got_int && !message_filtered(last_search_pat())) { msg_puts("\n c \"/ "); dis_msg(last_search_pat(), false); } // display last used expression - if (expr_line != NULL && (arg == NULL || vim_strchr(arg, '=') != NULL) + if (expr_line != NULL && (arg == NULL || vim_strchr((char *)arg, '=') != NULL) && !got_int && !message_filtered(expr_line)) { msg_puts("\n c \"= "); dis_msg(expr_line, false); @@ -4608,14 +4605,14 @@ void format_lines(linenr_T line_count, int avoid_fex) } // put cursor on last non-space - State = NORMAL; // don't go past end-of-line + State = MODE_NORMAL; // don't go past end-of-line coladvance(MAXCOL); while (curwin->w_cursor.col && ascii_isspace(gchar_cursor())) { dec_cursor(); } // do the formatting, without 'showmode' - State = INSERT; // for open_line() + State = MODE_INSERT; // for open_line() smd_save = p_smd; p_smd = FALSE; insertchar(NUL, INSCHAR_FORMAT @@ -5030,12 +5027,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) pos_T endpos; colnr_T save_coladd = 0; - const bool do_hex = vim_strchr(curbuf->b_p_nf, 'x') != NULL; // "heX" - const bool do_oct = vim_strchr(curbuf->b_p_nf, 'o') != NULL; // "Octal" - const bool do_bin = vim_strchr(curbuf->b_p_nf, 'b') != NULL; // "Bin" - const bool do_alpha = vim_strchr(curbuf->b_p_nf, 'p') != NULL; // "alPha" + const bool do_hex = vim_strchr((char *)curbuf->b_p_nf, 'x') != NULL; // "heX" + const bool do_oct = vim_strchr((char *)curbuf->b_p_nf, 'o') != NULL; // "Octal" + const bool do_bin = vim_strchr((char *)curbuf->b_p_nf, 'b') != NULL; // "Bin" + const bool do_alpha = vim_strchr((char *)curbuf->b_p_nf, 'p') != NULL; // "alPha" // "Unsigned" - const bool do_unsigned = vim_strchr(curbuf->b_p_nf, 'u') != NULL; + const bool do_unsigned = vim_strchr((char *)curbuf->b_p_nf, 'u') != NULL; if (virtual_active()) { save_coladd = pos->coladd; @@ -5777,7 +5774,7 @@ static void str_to_reg(yankreg_T *y_ptr, MotionType yank_type, const char_u *str // When appending, copy the previous line and free it after. size_t extra = append ? STRLEN(pp[--lnum]) : 0; - char_u *s = xmallocz(line_len + extra); + char *s = xmallocz(line_len + extra); if (extra > 0) { memcpy(s, pp[lnum], extra); } @@ -5788,7 +5785,7 @@ static void str_to_reg(yankreg_T *y_ptr, MotionType yank_type, const char_u *str xfree(pp[lnum]); append = false; // only first line is appended } - pp[lnum] = s; + pp[lnum] = (char_u *)s; // Convert NULs to '\n' to prevent truncation. memchrsub(pp[lnum], NUL, '\n', s_len); @@ -7120,7 +7117,7 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet) reg->y_type = kMTUnknown; } - reg->y_array = xcalloc((size_t)tv_list_len(lines), sizeof(char_u *)); + reg->y_array = xcalloc((size_t)tv_list_len(lines), sizeof(char *)); reg->y_size = (size_t)tv_list_len(lines); reg->additional_data = NULL; reg->timestamp = 0; diff --git a/src/nvim/option.c b/src/nvim/option.c index e738c6c3b9..61ac542fcf 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -49,7 +49,7 @@ #include "nvim/highlight.h" #include "nvim/highlight_group.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/macros.h" #include "nvim/mbyte.h" #include "nvim/memfile.h" @@ -363,7 +363,7 @@ void set_init_1(bool clean_arg) { const char *shell = os_getenv("SHELL"); if (shell != NULL) { - if (vim_strchr((const char_u *)shell, ' ') != NULL) { + if (vim_strchr(shell, ' ') != NULL) { const size_t len = strlen(shell) + 3; // two quotes and a trailing NUL char *const cmd = xmalloc(len); snprintf(cmd, len, "\"%s\"", shell); @@ -491,17 +491,17 @@ void set_init_1(bool clean_arg) #endif false); - char *backupdir = stdpaths_user_data_subpath("backup", 2, true); + char *backupdir = stdpaths_user_state_subpath("backup", 2, true); const size_t backupdir_len = strlen(backupdir); backupdir = xrealloc(backupdir, backupdir_len + 3); memmove(backupdir + 2, backupdir, backupdir_len + 1); memmove(backupdir, ".,", 2); set_string_default("backupdir", backupdir, true); - set_string_default("viewdir", stdpaths_user_data_subpath("view", 2, true), + set_string_default("viewdir", stdpaths_user_state_subpath("view", 2, true), true); - set_string_default("directory", stdpaths_user_data_subpath("swap", 2, true), + set_string_default("directory", stdpaths_user_state_subpath("swap", 2, true), true); - set_string_default("undodir", stdpaths_user_data_subpath("undo", 2, true), + set_string_default("undodir", stdpaths_user_state_subpath("undo", 2, true), true); // Set default for &runtimepath. All necessary expansions are performed in // this function. @@ -1099,7 +1099,7 @@ int do_set(char_u *arg, int opt_flags) if (options[opt_idx].var == NULL) { // hidden option: skip // Only give an error message when requesting the value of // a hidden option, ignore setting it. - if (vim_strchr((char_u *)"=:!&<", nextchar) == NULL + if (vim_strchr("=:!&<", nextchar) == NULL && (!(options[opt_idx].flags & P_BOOL) || nextchar == '?')) { errmsg = _(e_unsupportedoption); @@ -1153,7 +1153,7 @@ int do_set(char_u *arg, int opt_flags) goto skip; } - if (vim_strchr((char_u *)"?=:!&<", nextchar) != NULL) { + if (vim_strchr("?=:!&<", nextchar) != NULL) { arg += len; if (nextchar == '&' && arg[1] == 'v' && arg[2] == 'i') { if (arg[3] == 'm') { // "opt&vim": set to Vim default @@ -1162,7 +1162,7 @@ int do_set(char_u *arg, int opt_flags) arg += 2; } } - if (vim_strchr((char_u *)"?!&<", nextchar) != NULL + if (vim_strchr("?!&<", nextchar) != NULL && arg[1] != NUL && !ascii_iswhite(arg[1])) { errmsg = e_trailing; goto skip; @@ -1175,7 +1175,7 @@ int do_set(char_u *arg, int opt_flags) // if (nextchar == '?' || (prefix == 1 - && vim_strchr((char_u *)"=:&<", nextchar) == NULL + && vim_strchr("=:&<", nextchar) == NULL && !(flags & P_BOOL))) { /* * print value @@ -1255,7 +1255,7 @@ int do_set(char_u *arg, int opt_flags) errmsg = set_bool_option(opt_idx, varp, (int)value, opt_flags); } else { // Numeric or string. - if (vim_strchr((const char_u *)"=:&<", nextchar) == NULL + if (vim_strchr("=:&<", nextchar) == NULL || prefix != 1) { errmsg = e_invarg; goto skip; @@ -1609,14 +1609,14 @@ int do_set(char_u *arg, int opt_flags) // 'whichwrap' if (flags & P_ONECOMMA) { if (*s != ',' && *(s + 1) == ',' - && vim_strchr(s + 2, *s) != NULL) { + && vim_strchr((char *)s + 2, *s) != NULL) { // Remove the duplicated value and the next comma. STRMOVE(s, s + 2); continue; } } else { if ((!(flags & P_COMMA) || *s != ',') - && vim_strchr(s + 1, *s) != NULL) { + && vim_strchr((char *)s + 1, *s) != NULL) { STRMOVE(s, s + 1); continue; } @@ -1917,7 +1917,7 @@ char_u *find_shada_parameter(int type) if (*p == 'n') { // 'n' is always the last one break; } - p = vim_strchr(p, ','); // skip until next ',' + p = (char_u *)vim_strchr((char *)p, ','); // skip until next ',' if (p == NULL) { // hit the end without finding parameter break; } @@ -1963,13 +1963,10 @@ static char_u *option_expand(int opt_idx, char_u *val) return NameBuff; } -// After setting various option values: recompute variables that depend on -// option values. -static void didset_options(void) +/// After setting various option values: recompute variables that depend on +/// option values. +static void didset_string_options(void) { - // initialize the table for 'iskeyword' et.al. - (void)init_chartab(); - (void)opt_strings_flags(p_cmp, p_cmp_values, &cmp_flags, true); (void)opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, true); (void)opt_strings_flags(p_bo, p_bo_values, &bo_flags, true); @@ -1981,8 +1978,20 @@ static void didset_options(void) (void)opt_strings_flags(p_tc, p_tc_values, &tc_flags, false); (void)opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true); (void)opt_strings_flags(p_ve, p_ve_values, &ve_flags, true); + (void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, true); (void)opt_strings_flags(p_wop, p_wop_values, &wop_flags, true); (void)opt_strings_flags(p_jop, p_jop_values, &jop_flags, true); +} + +/// After setting various option values: recompute variables that depend on +/// option values. +static void didset_options(void) +{ + // initialize the table for 'iskeyword' et.al. + (void)init_chartab(); + + didset_string_options(); + (void)spell_check_msm(); (void)spell_check_sps(); (void)compile_cap_prog(curwin->w_s); @@ -2140,6 +2149,8 @@ static uint32_t *insecure_flag(win_T *const wp, int opt_idx, int opt_flags) switch ((int)options[opt_idx].indir) { case PV_STL: return &wp->w_p_stl_flags; + case PV_WBR: + return &wp->w_p_wbr_flags; case PV_FDE: return &wp->w_p_fde_flags; case PV_FDT: @@ -2327,7 +2338,7 @@ static bool valid_name(const char_u *val, const char *allowed) { for (const char_u *s = val; *s != NUL; s++) { if (!ASCII_ISALNUM(*s) - && vim_strchr((const char_u *)allowed, *s) == NULL) { + && vim_strchr(allowed, *s) == NULL) { return false; } } @@ -2505,8 +2516,8 @@ static char *did_set_string_option(int opt_idx, char_u **varp, bool new_value_al if (opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true) != OK) { errmsg = e_invarg; } - } else if (varp == &p_sbo) { // 'scrollopt' - if (check_opt_strings(p_sbo, p_scbopt_values, true) != OK) { + } else if (varp == (char_u **)&p_sbo) { // 'scrollopt' + if (check_opt_strings((char_u *)p_sbo, p_scbopt_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_ambw || (int *)varp == &p_emoji) { @@ -2569,7 +2580,7 @@ ambw_end: if (gvarp == &p_fenc) { if (!MODIFIABLE(curbuf) && opt_flags != OPT_GLOBAL) { errmsg = e_modifiable; - } else if (vim_strchr(*varp, ',') != NULL) { + } else if (vim_strchr((char *)(*varp), ',') != NULL) { // No comma allowed in 'fileencoding'; catches confusing it // with 'fileencodings'. errmsg = e_invarg; @@ -2655,8 +2666,8 @@ ambw_end: redraw_curbuf_later(NOT_VALID); } } - } else if (varp == &p_ffs) { // 'fileformats' - if (check_opt_strings(p_ffs, p_ff_values, true) != OK) { + } else if (varp == (char_u **)&p_ffs) { // 'fileformats' + if (check_opt_strings((char_u *)p_ffs, p_ff_values, true) != OK) { errmsg = e_invarg; } } else if (gvarp == &p_mps) { // 'matchpairs' @@ -2683,7 +2694,7 @@ ambw_end: } else if (gvarp == &p_com) { // 'comments' for (s = *varp; *s;) { while (*s && *s != ':') { - if (vim_strchr((char_u *)COM_ALL, *s) == NULL + if (vim_strchr(COM_ALL, *s) == NULL && !ascii_isdigit(*s) && *s != '-') { errmsg = illegal_char(errbuf, errbuflen, *s); break; @@ -2762,7 +2773,7 @@ ambw_end: free_oldval = (options[opt_idx].flags & P_ALLOCED); for (s = p_shada; *s;) { // Check it's a valid character - if (vim_strchr((char_u *)"!\"%'/:<@cfhnrs", *s) == NULL) { + if (vim_strchr("!\"%'/:<@cfhnrs", *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -2826,7 +2837,7 @@ ambw_end: int flagval = (varp == &p_titlestring) ? STL_IN_TITLE : STL_IN_ICON; // NULL => statusline syntax - if (vim_strchr(*varp, '%') && check_stl_option(*varp) == NULL) { + if (vim_strchr((char *)(*varp), '%') && check_stl_option(*varp) == NULL) { stl_syntax |= flagval; } else { stl_syntax &= ~flagval; @@ -2845,8 +2856,8 @@ ambw_end: if (check_opt_strings(p_km, p_km_values, true) != OK) { errmsg = e_invarg; } else { - km_stopsel = (vim_strchr(p_km, 'o') != NULL); - km_startsel = (vim_strchr(p_km, 'a') != NULL); + km_stopsel = (vim_strchr((char *)p_km, 'o') != NULL); + km_startsel = (vim_strchr((char *)p_km, 'a') != NULL); } } else if (varp == &p_mousem) { // 'mousemodel' if (check_opt_strings(p_mousem, p_mousem_values, false) != OK) { @@ -2921,8 +2932,8 @@ ambw_end: curbuf->b_help = (curbuf->b_p_bt[0] == 'h'); redraw_titles(); } - } else if (gvarp == &p_stl || varp == &p_tal || varp == &p_ruf) { - // 'statusline', 'tabline' or 'rulerformat' + } else if (gvarp == &p_stl || gvarp == (char_u **)&p_wbr || varp == &p_tal || varp == &p_ruf) { + // 'statusline', 'winbar', 'tabline' or 'rulerformat' int wid; if (varp == &p_ruf) { // reset ru_wid first @@ -2941,12 +2952,16 @@ ambw_end: errmsg = check_stl_option(p_ruf); } } else if (varp == &p_ruf || s[0] != '%' || s[1] != '!') { - // check 'statusline' or 'tabline' only if it doesn't start with "%!" + // check 'statusline', 'winbar' or 'tabline' only if it doesn't start with "%!" errmsg = check_stl_option(s); } if (varp == &p_ruf && errmsg == NULL) { comp_col(); } + // add / remove window bars for 'winbar' + if (gvarp == (char_u **)&p_wbr) { + set_winbar(); + } } else if (gvarp == &p_cpt) { // check if it is a valid value for 'complete' -- Acevedo for (s = *varp; *s;) { @@ -2956,7 +2971,7 @@ ambw_end: if (!*s) { break; } - if (vim_strchr((char_u *)".wbuksid]tU", *s) == NULL) { + if (vim_strchr(".wbuksid]tU", *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -3080,7 +3095,7 @@ ambw_end: foldUpdateAll(curwin); } } else if (gvarp == &curwin->w_allbuf_opt.wo_fmr) { // 'foldmarker' - p = vim_strchr(*varp, ','); + p = (char_u *)vim_strchr((char *)(*varp), ','); if (p == NULL) { errmsg = N_("E536: comma required"); } else if (p == *varp || p[1] == NUL) { @@ -3130,9 +3145,9 @@ ambw_end: if (p_csqf != NULL) { p = p_csqf; while (*p != NUL) { - if (vim_strchr((char_u *)CSQF_CMDS, *p) == NULL + if (vim_strchr(CSQF_CMDS, *p) == NULL || p[1] == NUL - || vim_strchr((char_u *)CSQF_FLAGS, p[1]) == NULL + || vim_strchr(CSQF_FLAGS, p[1]) == NULL || (p[2] != NUL && p[2] != ',')) { errmsg = e_invarg; break; @@ -3244,7 +3259,7 @@ ambw_end: } if (varp == &p_shm) { // 'shortmess' p = (char_u *)SHM_ALL; - } else if (varp == &(p_cpo)) { // 'cpoptions' + } else if (varp == (char_u **)&(p_cpo)) { // 'cpoptions' p = (char_u *)CPO_VI; } else if (varp == &(curbuf->b_p_fo)) { // 'formatoptions' p = (char_u *)FO_ALL; @@ -3255,7 +3270,7 @@ ambw_end: } if (p != NULL) { for (s = *varp; *s; s++) { - if (vim_strchr(p, *s) == NULL) { + if (vim_strchr((char *)p, *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -3314,7 +3329,7 @@ ambw_end: syn_recursive++; // Only pass true for "force" when the value changed or not used // recursively, to avoid endless recurrence. - apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname, + apply_autocmds(EVENT_SYNTAX, (char *)curbuf->b_p_syn, curbuf->b_fname, value_changed || syn_recursive == 1, curbuf); curbuf->b_flags |= BF_SYN_SET; syn_recursive--; @@ -3334,7 +3349,7 @@ ambw_end: did_filetype = true; // Only pass true for "force" when the value changed or not // used recursively, to avoid endless recurrence. - apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname, + apply_autocmds(EVENT_FILETYPE, (char *)curbuf->b_p_ft, curbuf->b_fname, value_changed || ft_recursive == 1, curbuf); ft_recursive--; // Just in case the old "curbuf" is now invalid @@ -3561,6 +3576,7 @@ static char *set_chars_option(win_T *wp, char_u **varp, bool set) struct chars_tab fcs_tab[] = { { &wp->w_p_fcs_chars.stl, "stl", ' ' }, { &wp->w_p_fcs_chars.stlnc, "stlnc", ' ' }, + { &wp->w_p_fcs_chars.wbr, "wbr", ' ' }, { &wp->w_p_fcs_chars.horiz, "horiz", 9472 }, // ─ { &wp->w_p_fcs_chars.horizup, "horizup", 9524 }, // â”´ { &wp->w_p_fcs_chars.horizdown, "horizdown", 9516 }, // ┬ @@ -3603,15 +3619,15 @@ static char *set_chars_option(win_T *wp, char_u **varp, bool set) if (*p_ambw == 'd') { // XXX: If ambiwidth=double then some characters take 2 columns, // which is forbidden (TUI limitation?). Set old defaults. - fcs_tab[2].def = '-'; fcs_tab[3].def = '-'; fcs_tab[4].def = '-'; - fcs_tab[5].def = '|'; + fcs_tab[5].def = '-'; fcs_tab[6].def = '|'; fcs_tab[7].def = '|'; - fcs_tab[8].def = '+'; - fcs_tab[9].def = '-'; - fcs_tab[12].def = '|'; + fcs_tab[8].def = '|'; + fcs_tab[9].def = '+'; + fcs_tab[10].def = '-'; + fcs_tab[13].def = '|'; } } @@ -3835,7 +3851,7 @@ static char *compile_cap_prog(synblock_T *synblock) } else { // Prepend a ^ so that we only match at one column re = concat_str((char_u *)"^", synblock->b_p_spc); - synblock->b_cap_prog = vim_regcomp(re, RE_MAGIC); + synblock->b_cap_prog = vim_regcomp((char *)re, RE_MAGIC); xfree(re); if (synblock->b_cap_prog == NULL) { synblock->b_cap_prog = rp; // restore the previous program @@ -3988,7 +4004,7 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va || (opt_flags & OPT_GLOBAL) || opt_flags == 0) && !bufIsChanged(bp) && bp->b_ml.ml_mfp != NULL) { u_compute_hash(bp, hash); - u_read_undo(NULL, hash, bp->b_fname); + u_read_undo(NULL, hash, (char_u *)bp->b_fname); } } } @@ -4033,27 +4049,13 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va // buf->b_p_swf mf_close_file(curbuf, true); // remove the swap file } - } else if ((int *)varp == &p_terse) { - // when 'terse' is set change 'shortmess' - char_u *p; - - p = vim_strchr(p_shm, SHM_SEARCH); - - // insert 's' in p_shm - if (p_terse && p == NULL) { - STRCPY(IObuff, p_shm); - STRCAT(IObuff, "s"); - set_string_option_direct("shm", -1, IObuff, OPT_FREE, 0); - } else if (!p_terse && p != NULL) { // remove 's' from p_shm - STRMOVE(p, p + 1); - } } else if ((int *)varp == &p_paste) { // when 'paste' is set or reset also change other options paste_option_changed(); } else if ((int *)varp == &p_im) { // when 'insertmode' is set from an autocommand need to do work here if (p_im) { - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { need_start_insertmode = true; } stop_insert_mode = false; @@ -4248,7 +4250,7 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } @@ -4690,7 +4692,7 @@ static char *set_num_option(int opt_idx, char_u *varp, long value, char *errbuf, set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } @@ -4747,7 +4749,7 @@ static void trigger_optionsset_string(int opt_idx, int opt_flags, char *oldval, set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, oldval, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } } @@ -4759,7 +4761,7 @@ static void check_redraw(uint32_t flags) bool doclear = (flags & P_RCLR) == P_RCLR; bool all = ((flags & P_RALL) == P_RALL || doclear); - if ((flags & P_RSTAT) || all) { // mark all status lines dirty + if ((flags & P_RSTAT) || all) { // mark all status lines and window bars dirty status_redraw_all(); } @@ -5613,7 +5615,7 @@ static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, uint6 // each comma separated part of the option separately, so that it // can be expanded when read back. if (size >= MAXPATHL && (flags & P_COMMA) != 0 - && vim_strchr(*valuep, ',') != NULL) { + && vim_strchr((char *)(*valuep), ',') != NULL) { part = xmalloc(size); // write line break to clear the option, e.g. ':set rtp=' @@ -5807,6 +5809,9 @@ void unset_global_local_option(char *name, void *from) case PV_STL: clear_string_option(&((win_T *)from)->w_p_stl); break; + case PV_WBR: + clear_string_option((char_u **)&((win_T *)from)->w_p_wbr); + break; case PV_UL: buf->b_p_ul = NO_LOCAL_UNDOLEVEL; break; @@ -5884,6 +5889,8 @@ static char_u *get_varp_scope(vimoption_T *p, int opt_flags) return (char_u *)&(curwin->w_p_sbr); case PV_STL: return (char_u *)&(curwin->w_p_stl); + case PV_WBR: + return (char_u *)&(curwin->w_p_wbr); case PV_UL: return (char_u *)&(curbuf->b_p_ul); case PV_LW: @@ -5977,6 +5984,9 @@ static char_u *get_varp(vimoption_T *p) case PV_STL: return *curwin->w_p_stl != NUL ? (char_u *)&(curwin->w_p_stl) : p->var; + case PV_WBR: + return *curwin->w_p_wbr != NUL + ? (char_u *)&(curwin->w_p_wbr) : p->var; case PV_UL: return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL ? (char_u *)&(curbuf->b_p_ul) : p->var; @@ -6245,6 +6255,7 @@ void copy_winopt(winopt_T *from, winopt_T *to) to->wo_rlc = vim_strsave(from->wo_rlc); to->wo_sbr = vim_strsave(from->wo_sbr); to->wo_stl = vim_strsave(from->wo_stl); + to->wo_wbr = xstrdup(from->wo_wbr); to->wo_wrap = from->wo_wrap; to->wo_wrap_save = from->wo_wrap_save; to->wo_lbr = from->wo_lbr; @@ -6320,6 +6331,7 @@ static void check_winopt(winopt_T *wop) check_string_option(&wop->wo_fcs); check_string_option(&wop->wo_lcs); check_string_option(&wop->wo_ve); + check_string_option((char_u **)&wop->wo_wbr); } /// Free the allocated memory inside a winopt_T. @@ -6345,6 +6357,7 @@ void clear_winopt(winopt_T *wop) clear_string_option(&wop->wo_fcs); clear_string_option(&wop->wo_lcs); clear_string_option(&wop->wo_ve); + clear_string_option((char_u **)&wop->wo_wbr); } void didset_window_options(win_T *wp) @@ -7206,7 +7219,7 @@ bool has_format_option(int x) if (p_paste) { return false; } - return vim_strchr(curbuf->b_p_fo, x) != NULL; + return vim_strchr((char *)curbuf->b_p_fo, x) != NULL; } /// @returns true if "x" is present in 'shortmess' option, or @@ -7214,9 +7227,9 @@ bool has_format_option(int x) bool shortmess(int x) { return (p_shm != NULL - && (vim_strchr(p_shm, x) != NULL - || (vim_strchr(p_shm, 'a') != NULL - && vim_strchr((char_u *)SHM_ALL_ABBREVIATIONS, x) != NULL))); + && (vim_strchr((char *)p_shm, x) != NULL + || (vim_strchr((char *)p_shm, 'a') != NULL + && vim_strchr((char *)SHM_ALL_ABBREVIATIONS, x) != NULL))); } /// paste_option_changed() - Called after p_paste was set or reset. @@ -7578,7 +7591,7 @@ bool can_bs(int what) case '0': return false; } - return vim_strchr(p_bs, what) != NULL; + return vim_strchr((char *)p_bs, what) != NULL; } /// Save the current values of 'fileformat' and 'fileencoding', so that we know @@ -8137,9 +8150,9 @@ size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_c if (*p == '.') { buf[len++] = *p++; } - while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) { + while (*p != NUL && vim_strchr(sep_chars, *p) == NULL) { // Skip backslash before a separator character and space. - if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) { + if (p[0] == '\\' && vim_strchr(sep_chars, p[1]) != NULL) { p++; } if (len < maxlen - 1) { @@ -8161,13 +8174,13 @@ size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_c /// Return true when 'shell' has "csh" in the tail. int csh_like_shell(void) { - return strstr((char *)path_tail(p_sh), "csh") != NULL; + return strstr(path_tail((char *)p_sh), "csh") != NULL; } /// Return true when 'shell' has "fish" in the tail. bool fish_like_shell(void) { - return strstr((char *)path_tail(p_sh), "fish") != NULL; + return strstr(path_tail((char *)p_sh), "fish") != NULL; } /// Return the number of requested sign columns, based on current @@ -8260,7 +8273,7 @@ dict_T *get_winbuf_options(const int bufopt) long get_scrolloff_value(win_T *wp) { // Disallow scrolloff in terminal-mode. #11915 - if (State & TERM_FOCUS) { + if (State & MODE_TERMINAL) { return 0; } return wp->w_p_so < 0 ? p_so : wp->w_p_so; diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index d90ed6812c..876acf2f87 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -266,7 +266,7 @@ enum { STL_CLICK_FUNC = '@', ///< Click region start. }; /// C string containing all 'statusline' option flags -#define STL_ALL ((char_u[]) { \ +#define STL_ALL ((char[]) { \ STL_FILEPATH, STL_FULLPATH, STL_FILENAME, STL_COLUMN, STL_VIRTCOL, \ STL_VIRTCOL_ALT, STL_LINE, STL_NUMLINES, STL_BUFNO, STL_KEYMAP, STL_OFFSET, \ STL_OFFSET_X, STL_BYTEVAL, STL_BYTEVAL_X, STL_ROFLAG, STL_ROFLAG_ALT, \ @@ -392,7 +392,7 @@ EXTERN char_u *p_csl; // 'completeslash' EXTERN long p_pb; // 'pumblend' EXTERN long p_ph; // 'pumheight' EXTERN long p_pw; // 'pumwidth' -EXTERN char_u *p_cpo; // 'cpoptions' +EXTERN char *p_cpo; // 'cpoptions' EXTERN char_u *p_csprg; // 'cscopeprg' EXTERN int p_csre; // 'cscoperelative' EXTERN char_u *p_csqf; // 'cscopequickfix' @@ -434,7 +434,7 @@ EXTERN char_u *p_gp; // 'grepprg' EXTERN char_u *p_ei; // 'eventignore' EXTERN int p_exrc; // 'exrc' EXTERN char_u *p_fencs; // 'fileencodings' -EXTERN char_u *p_ffs; // 'fileformats' +EXTERN char *p_ffs; // 'fileformats' EXTERN int p_fic; // 'fileignorecase' EXTERN char_u *p_fcl; // 'foldclose' EXTERN long p_fdls; // 'foldlevelstart' @@ -557,7 +557,6 @@ static char *(p_rdb_values[]) = { #define RDB_NODELTA 0x008 EXTERN long p_rdt; // 'redrawtime' -EXTERN int p_remap; // 'remap' EXTERN long p_re; // 'regexpengine' EXTERN long p_report; // 'report' EXTERN long p_pvh; // 'previewheight' @@ -571,7 +570,7 @@ EXTERN char_u *p_rtp; // 'runtimepath' EXTERN long p_scbk; // 'scrollback' EXTERN long p_sj; // 'scrolljump' EXTERN long p_so; // 'scrolloff' -EXTERN char_u *p_sbo; // 'scrollopt' +EXTERN char *p_sbo; // 'scrollopt' EXTERN char_u *p_sections; // 'sections' EXTERN int p_secure; // 'secure' EXTERN char_u *p_sel; // 'selection' @@ -618,6 +617,7 @@ EXTERN int p_stmp; // 'shelltemp' EXTERN int p_ssl; // 'shellslash' #endif EXTERN char_u *p_stl; // 'statusline' +EXTERN char *p_wbr; // 'winbar' EXTERN int p_sr; // 'shiftround' EXTERN char_u *p_shm; // 'shortmess' EXTERN char_u *p_sbr; // 'showbreak' @@ -678,7 +678,6 @@ EXTERN int p_tr; ///< 'tagrelative' EXTERN char_u *p_tags; ///< 'tags' EXTERN int p_tgst; ///< 'tagstack' EXTERN int p_tbidi; ///< 'termbidi' -EXTERN int p_terse; ///< 'terse' EXTERN int p_to; ///< 'tildeop' EXTERN int p_timeout; ///< 'timeout' EXTERN long p_tm; ///< 'timeoutlen' @@ -897,6 +896,7 @@ enum { WV_FCS, WV_LCS, WV_WINBL, + WV_WBR, WV_COUNT, // must be the last one }; diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 313cace4b2..809d4ab48b 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -1911,9 +1911,9 @@ return { }, { full_name='remap', - short_desc=N_("mappings to work recursively"), + short_desc=N_("No description"), type='bool', scope={'global'}, - varname='p_remap', + varname='p_force_on', defaults={if_true=true} }, { @@ -2529,9 +2529,9 @@ return { }, { full_name='terse', - short_desc=N_("hides notification of search wrap"), + short_desc=N_("No description"), type='bool', scope={'global'}, - varname='p_terse', + varname='p_force_off', defaults={if_true=false} }, { @@ -2832,6 +2832,16 @@ return { defaults={if_true="menu"} }, { + full_name='winbar', abbreviation='wbr', + short_desc=N_("custom format for the window bar"), + type='string', scope={'global', 'window'}, + alloced=true, + modelineexpr=true, + redraw={'statuslines'}, + varname='p_wbr', + defaults={if_true=""} + }, + { full_name='winblend', abbreviation='winbl', short_desc=N_("Controls transparency level for floating windows"), type='number', scope={'window'}, diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 4e6a52a78e..c03fd60f03 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -529,9 +529,9 @@ void free_homedir(void) /// again soon. /// @param src String containing environment variables to expand /// @see {expand_env} -char_u *expand_env_save(char_u *src) +char *expand_env_save(char *src) { - return expand_env_save_opt(src, false); + return (char *)expand_env_save_opt((char_u *)src, false); } /// Similar to expand_env_save() but when "one" is `true` handle the string as @@ -644,7 +644,7 @@ void expand_env_esc(char_u *restrict srcp, char_u *restrict dst, int dstlen, boo #endif } else if (src[1] == NUL // home directory || vim_ispathsep(src[1]) - || vim_strchr((char_u *)" ,\t\n", src[1]) != NULL) { + || vim_strchr(" ,\t\n", src[1]) != NULL) { var = (char_u *)homedir; tail = src + 1; } else { // user directory @@ -884,11 +884,10 @@ void vim_get_prefix_from_exepath(char *exe_name) { // TODO(bfredl): param could have been written as "char exe_name[MAXPATHL]" // but c_grammar.lua does not recognize it (yet). - xstrlcpy(exe_name, (char *)get_vim_var_str(VV_PROGPATH), - MAXPATHL * sizeof(*exe_name)); + xstrlcpy(exe_name, get_vim_var_str(VV_PROGPATH), MAXPATHL * sizeof(*exe_name)); char *path_end = (char *)path_tail_with_sep((char_u *)exe_name); *path_end = '\0'; // remove the trailing "nvim.exe" - path_end = (char *)path_tail((char_u *)exe_name); + path_end = path_tail(exe_name); *path_end = '\0'; // remove the trailing "bin/" } @@ -940,7 +939,7 @@ char *vim_getenv(const char *name) // - the directory name from 'helpfile' (unless it contains '$') // - the executable name from argv[0] if (vim_path == NULL) { - if (p_hf != NULL && vim_strchr(p_hf, '$') == NULL) { + if (p_hf != NULL && vim_strchr((char *)p_hf, '$') == NULL) { vim_path = (char *)p_hf; } @@ -957,7 +956,7 @@ char *vim_getenv(const char *name) if (vim_path != NULL) { // remove the file name - char *vim_path_end = (char *)path_tail((char_u *)vim_path); + char *vim_path_end = path_tail(vim_path); // remove "doc/" from 'helpfile', if present if (vim_path == (char *)p_hf) { @@ -1048,7 +1047,7 @@ size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst } if (buf != NULL && buf->b_help) { - const size_t dlen = STRLCPY(dst, path_tail(src), dstlen); + const size_t dlen = STRLCPY(dst, path_tail((char *)src), dstlen); return MIN(dlen, dstlen - 1); } @@ -1158,7 +1157,7 @@ char_u *home_replace_save(buf_T *buf, char_u *src) FUNC_ATTR_NONNULL_RET /// Function given to ExpandGeneric() to obtain an environment variable name. -char_u *get_env_name(expand_T *xp, int idx) +char *get_env_name(expand_T *xp, int idx) { #define ENVNAMELEN 100 // this static buffer is needed to avoid a memory leak in ExpandGeneric @@ -1168,7 +1167,7 @@ char_u *get_env_name(expand_T *xp, int idx) if (envname) { STRLCPY(name, envname, ENVNAMELEN); xfree(envname); - return name; + return (char *)name; } return NULL; } @@ -1226,10 +1225,10 @@ bool os_shell_is_cmdexe(const char *sh) } if (striequal(sh, "$COMSPEC")) { const char *comspec = os_getenv("COMSPEC"); - return striequal("cmd.exe", (char *)path_tail((char_u *)comspec)); + return striequal("cmd.exe", path_tail(comspec)); } if (striequal(sh, "cmd.exe") || striequal(sh, "cmd")) { return true; } - return striequal("cmd.exe", (char *)path_tail((char_u *)sh)); + return striequal("cmd.exe", path_tail(sh)); } diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 437baf0e08..ac21b32a3e 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -13,12 +13,13 @@ #include "nvim/ex_cmds2.h" #include "nvim/fileio.h" #include "nvim/getchar.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mbyte.h" #include "nvim/memory.h" #include "nvim/msgpack_rpc/channel.h" #include "nvim/os/input.h" +#include "nvim/screen.h" #include "nvim/state.h" #include "nvim/ui.h" #include "nvim/vim.h" @@ -81,7 +82,7 @@ void input_stop(void) static void cursorhold_event(void **argv) { - event_T event = State & INSERT ? EVENT_CURSORHOLDI : EVENT_CURSORHOLD; + event_T event = State & MODE_INSERT ? EVENT_CURSORHOLDI : EVENT_CURSORHOLD; apply_autocmds(event, NULL, NULL, false, curbuf); did_cursorhold = true; } @@ -178,15 +179,7 @@ void os_breakcheck(void) return; } - int save_us = updating_screen; - // We do not want screen_resize() to redraw here. - // TODO(bfredl): we are already special casing redraw events, is this - // hack still needed? - updating_screen++; - loop_poll_events(&main_loop, 0); - - updating_screen = save_us; } #define BREAKCHECK_SKIP 1000 diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 0d86dcb480..d331bd21a2 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -36,7 +36,7 @@ #define NS_1_SECOND 1000000000U // 1 second, in nanoseconds #define OUT_DATA_THRESHOLD 1024 * 10U // 10KB, "a few screenfuls" of data. -#define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|" +#define SHELL_SPECIAL "\t \"&'$;<>()\\|" typedef struct { char *data; @@ -73,7 +73,7 @@ static bool have_wildcard(int num, char_u **file) static bool have_dollars(int num, char_u **file) { for (int i = 0; i < num; i++) { - if (vim_strchr(file[i], '$') != NULL) { + if (vim_strchr((char *)file[i], '$') != NULL) { return true; } } @@ -151,7 +151,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file // Don't allow the use of backticks in secure. if (secure) { for (i = 0; i < num_pat; i++) { - if (vim_strchr(pat[i], '`') != NULL + if (vim_strchr((char *)pat[i], '`') != NULL && (check_secure())) { return FAIL; } @@ -188,7 +188,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file } } if (shell_style == STYLE_ECHO - && strstr((char *)path_tail(p_sh), "sh") != NULL) { + && strstr(path_tail((char *)p_sh), "sh") != NULL) { shell_style = STYLE_VIMGLOB; } @@ -644,7 +644,7 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args) if (opts & (kShellOptHideMess | kShellOptExpand)) { forward_output = false; } else { - State = EXTERNCMD; + State = MODE_EXTERNCMD; if (opts & kShellOptWrite) { read_input(&input); @@ -1213,7 +1213,7 @@ static void read_input(DynamicBuffer *buf) dynamic_buffer_ensure(buf, buf->len + len); buf->data[buf->len++] = NUL; } else { - char_u *s = vim_strchr(lp + written, NL); + char_u *s = (char_u *)vim_strchr((char *)lp + written, NL); len = s == NULL ? l : (size_t)(s - (lp + written)); dynamic_buffer_ensure(buf, buf->len + len); memcpy(buf->data + buf->len, lp + written, len); diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 79e042b8a5..cd591801ed 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -210,14 +210,12 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) break; #ifdef SIGUSR1 case SIGUSR1: - apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGUSR1", curbuf->b_fname, true, - curbuf); + apply_autocmds(EVENT_SIGNAL, "SIGUSR1", curbuf->b_fname, true, curbuf); break; #endif #ifdef SIGWINCH case SIGWINCH: - apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGWINCH", curbuf->b_fname, true, - curbuf); + apply_autocmds(EVENT_SIGNAL, "SIGWINCH", curbuf->b_fname, true, curbuf); break; #endif default: diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c index 5b824d23f4..a382392bd3 100644 --- a/src/nvim/os/stdpaths.c +++ b/src/nvim/os/stdpaths.c @@ -14,6 +14,7 @@ static const char *xdg_env_vars[] = { [kXDGConfigHome] = "XDG_CONFIG_HOME", [kXDGDataHome] = "XDG_DATA_HOME", [kXDGCacheHome] = "XDG_CACHE_HOME", + [kXDGStateHome] = "XDG_STATE_HOME", [kXDGRuntimeDir] = "XDG_RUNTIME_DIR", [kXDGConfigDirs] = "XDG_CONFIG_DIRS", [kXDGDataDirs] = "XDG_DATA_DIRS", @@ -24,6 +25,7 @@ static const char *const xdg_defaults_env_vars[] = { [kXDGConfigHome] = "LOCALAPPDATA", [kXDGDataHome] = "LOCALAPPDATA", [kXDGCacheHome] = "TEMP", + [kXDGStateHome] = "LOCALAPPDATA", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = NULL, [kXDGDataDirs] = NULL, @@ -38,6 +40,7 @@ static const char *const xdg_defaults[] = { [kXDGConfigHome] = "~\\AppData\\Local", [kXDGDataHome] = "~\\AppData\\Local", [kXDGCacheHome] = "~\\AppData\\Local\\Temp", + [kXDGStateHome] = "~\\AppData\\Local", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = NULL, [kXDGDataDirs] = NULL, @@ -45,6 +48,7 @@ static const char *const xdg_defaults[] = { [kXDGConfigHome] = "~/.config", [kXDGDataHome] = "~/.local/share", [kXDGCacheHome] = "~/.cache", + [kXDGStateHome] = "~/.local/state", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = "/etc/xdg/", [kXDGDataDirs] = "/usr/local/share/:/usr/share/", @@ -78,7 +82,7 @@ char *stdpaths_get_xdg_var(const XDGVarType idx) if (env_val != NULL) { ret = xstrdup(env_val); } else if (fallback) { - ret = (char *)expand_env_save((char_u *)fallback); + ret = expand_env_save((char *)fallback); } return ret; @@ -99,7 +103,8 @@ char *get_xdg_home(const XDGVarType idx) if (dir) { #if defined(WIN32) dir = concat_fnames_realloc(dir, - (idx == kXDGDataHome ? "nvim-data" : "nvim"), + ((idx == kXDGDataHome + || idx == kXDGStateHome) ? "nvim-data" : "nvim"), true); #else dir = concat_fnames_realloc(dir, "nvim", true); @@ -133,15 +138,26 @@ char *stdpaths_user_conf_subpath(const char *fname) /// Return subpath of $XDG_DATA_HOME /// /// @param[in] fname New component of the path. +/// +/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}` +char *stdpaths_user_data_subpath(const char *fname) + FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET +{ + return concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true); +} + +/// Return subpath of $XDG_STATE_HOME +/// +/// @param[in] fname New component of the path. /// @param[in] trailing_pathseps Amount of trailing path separators to add. /// @param[in] escape_commas If true, all commas will be escaped. /// -/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}`. -char *stdpaths_user_data_subpath(const char *fname, const size_t trailing_pathseps, - const bool escape_commas) +/// @return [allocated] `$XDG_STATE_HOME/nvim/{fname}`. +char *stdpaths_user_state_subpath(const char *fname, const size_t trailing_pathseps, + const bool escape_commas) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { - char *ret = concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true); + char *ret = concat_fnames_realloc(get_xdg_home(kXDGStateHome), fname, true); const size_t len = strlen(ret); const size_t numcommas = (escape_commas ? memcnt(ret, ',', len) : 0); if (numcommas || trailing_pathseps) { diff --git a/src/nvim/os/stdpaths_defs.h b/src/nvim/os/stdpaths_defs.h index 44c30df373..f94c511fe7 100644 --- a/src/nvim/os/stdpaths_defs.h +++ b/src/nvim/os/stdpaths_defs.h @@ -7,6 +7,7 @@ typedef enum { kXDGConfigHome, ///< XDG_CONFIG_HOME kXDGDataHome, ///< XDG_DATA_HOME kXDGCacheHome, ///< XDG_CACHE_HOME + kXDGStateHome, ///< XDG_STATE_HOME kXDGRuntimeDir, ///< XDG_RUNTIME_DIR kXDGConfigDirs, ///< XDG_CONFIG_DIRS kXDGDataDirs, ///< XDG_DATA_DIRS diff --git a/src/nvim/os/users.c b/src/nvim/os/users.c index e0ce3fec31..4803be20c3 100644 --- a/src/nvim/os/users.c +++ b/src/nvim/os/users.c @@ -187,11 +187,11 @@ static void init_users(void) } /// Given to ExpandGeneric() to obtain an user names. -char_u *get_users(expand_T *xp, int idx) +char *get_users(expand_T *xp, int idx) { init_users(); if (idx < ga_users.ga_len) { - return ((char_u **)ga_users.ga_data)[idx]; + return ((char **)ga_users.ga_data)[idx]; } return NULL; } diff --git a/src/nvim/path.c b/src/nvim/path.c index 0bb364184a..fcb91a2783 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -92,15 +92,15 @@ FileComparison path_full_compare(char_u *const s1, char_u *const s2, const bool /// /// @return pointer just past the last path separator (empty string, if fname /// ends in a slash), or empty string if fname is NULL. -char_u *path_tail(const char_u *fname) +char *path_tail(const char *fname) FUNC_ATTR_NONNULL_RET { if (fname == NULL) { - return (char_u *)""; + return ""; } - const char_u *tail = get_past_head(fname); - const char_u *p = tail; + const char *tail = (char *)get_past_head((char_u *)fname); + const char *p = tail; // Find last part of path. while (*p != NUL) { if (vim_ispathsep_nocolon(*p)) { @@ -108,7 +108,7 @@ char_u *path_tail(const char_u *fname) } MB_PTR_ADV(p); } - return (char_u *)tail; + return (char *)tail; } /// Get pointer to tail of "fname", including path separators. @@ -126,7 +126,7 @@ char_u *path_tail_with_sep(char_u *fname) // Don't remove the '/' from "c:/file". char_u *past_head = get_past_head(fname); - char_u *tail = path_tail(fname); + char_u *tail = (char_u *)path_tail((char *)fname); while (tail > past_head && after_pathsep((char *)fname, (char *)tail)) { tail--; } @@ -275,7 +275,7 @@ int vim_ispathlistsep(int c) /// It's done in-place. void shorten_dir_len(char_u *str, int trim_len) { - char_u *tail = path_tail(str); + char_u *tail = (char_u *)path_tail((char *)str); char_u *d = str; bool skip = false; int dirchunk_len = 0; @@ -525,7 +525,7 @@ bool path_has_wildcard(const char_u *p) // Windows: const char *wildcards = "?*$[`"; #endif - if (vim_strchr((char_u *)wildcards, *p) != NULL + if (vim_strchr(wildcards, *p) != NULL || (p[0] == '~' && p[1] != NUL)) { return true; } @@ -559,7 +559,7 @@ bool path_has_exp_wildcard(const char_u *p) #else const char *wildcards = "*?["; // Windows. #endif - if (vim_strchr((char_u *)wildcards, *p) != NULL) { + if (vim_strchr(wildcards, *p) != NULL) { return true; } } @@ -640,7 +640,7 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, size_t wildoff, } s = p + 1; } else if (path_end >= path + wildoff - && (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL + && (vim_strchr("*?[{~$", *path_end) != NULL #ifndef WIN32 || (!p_fic && (flags & EW_ICASE) && mb_isalpha(utf_ptr2char((char *)path_end))) #endif @@ -675,7 +675,7 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, size_t wildoff, // convert the file pattern to a regexp pattern int starts_with_dot = *s == '.'; - char_u *pat = file_pat_to_reg_pat(s, e, NULL, false); + char *pat = file_pat_to_reg_pat((char *)s, (char *)e, NULL, false); if (pat == NULL) { xfree(buf); return 0; @@ -849,7 +849,7 @@ static void expand_path_option(char_u *curdir, garray_T *gap) if (curbuf->b_ffname == NULL) { continue; } - char_u *p = path_tail(curbuf->b_ffname); + char_u *p = (char_u *)path_tail((char *)curbuf->b_ffname); size_t len = (size_t)(p - curbuf->b_ffname); if (len + STRLEN(buf) >= MAXPATHL) { continue; @@ -949,13 +949,13 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern) file_pattern[0] = '*'; file_pattern[1] = NUL; STRCAT(file_pattern, pattern); - char_u *pat = file_pat_to_reg_pat(file_pattern, NULL, NULL, true); + char *pat = file_pat_to_reg_pat((char *)file_pattern, NULL, NULL, true); xfree(file_pattern); if (pat == NULL) { return; } - regmatch.rm_ic = TRUE; // always ignore case + regmatch.rm_ic = true; // always ignore case regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); xfree(pat); if (regmatch.regprog == NULL) { @@ -1153,7 +1153,7 @@ static bool has_env_var(char_u *p) for (; *p; MB_PTR_ADV(p)) { if (*p == '\\' && p[1] != NUL) { p++; - } else if (vim_strchr((char_u *)"$", *p) != NULL) { + } else if (vim_strchr("$", *p) != NULL) { return true; } } @@ -1174,13 +1174,13 @@ static bool has_special_wildchar(char_u *p) // Allow for escaping. if (*p == '\\' && p[1] != NUL && p[1] != '\r' && p[1] != '\n') { p++; - } else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL) { + } else if (vim_strchr(SPECIAL_WILDCHAR, *p) != NULL) { // A { must be followed by a matching }. - if (*p == '{' && vim_strchr(p, '}') == NULL) { + if (*p == '{' && vim_strchr((char *)p, '}') == NULL) { continue; } // A quote and backtick must be followed by another one. - if ((*p == '`' || *p == '\'') && vim_strchr(p, *p) == NULL) { + if ((*p == '`' || *p == '\'') && vim_strchr((char *)p, *p) == NULL) { continue; } return true; @@ -1375,17 +1375,18 @@ static int vim_backtick(char_u *p) /// @param flags EW_* flags static int expand_backtick(garray_T *gap, char_u *pat, int flags) { - char_u *p; - char_u *buffer; + char *p; + char *buffer; int cnt = 0; // Create the command: lop off the backticks. - char_u *cmd = vim_strnsave(pat + 1, STRLEN(pat) - 2); + char *cmd = (char *)vim_strnsave(pat + 1, STRLEN(pat) - 2); if (*cmd == '=') { // `={expr}`: Expand expression - buffer = (char_u *)eval_to_string((char *)cmd + 1, (char **)&p, true); + buffer = eval_to_string(cmd + 1, &p, true); } else { - buffer = get_cmd_output(cmd, NULL, (flags & EW_SILENT) ? kShellOptSilent : 0, NULL); + buffer = (char *)get_cmd_output((char_u *)cmd, NULL, (flags & EW_SILENT) ? kShellOptSilent : 0, + NULL); } xfree(cmd); if (buffer == NULL) { @@ -1394,16 +1395,16 @@ static int expand_backtick(garray_T *gap, char_u *pat, int flags) cmd = buffer; while (*cmd != NUL) { - cmd = (char_u *)skipwhite((char *)cmd); // skip over white space + cmd = skipwhite(cmd); // skip over white space p = cmd; while (*p != NUL && *p != '\r' && *p != '\n') { // skip over entry ++p; } // add an entry if it is not empty if (p > cmd) { - char_u i = *p; + char i = *p; *p = NUL; - addfile(gap, cmd, flags); + addfile(gap, (char_u *)cmd, flags); *p = i; ++cnt; } @@ -2244,10 +2245,10 @@ int match_suffix(char_u *fname) for (char_u *setsuf = p_su; *setsuf;) { setsuflen = copy_option_part(&setsuf, suf_buf, MAXSUFLEN, ".,"); if (setsuflen == 0) { - char_u *tail = path_tail(fname); + char_u *tail = (char_u *)path_tail((char *)fname); // empty entry: match name without a '.' - if (vim_strchr(tail, '.') == NULL) { + if (vim_strchr((char *)tail, '.') == NULL) { setsuflen = 1; break; } diff --git a/src/nvim/plines.c b/src/nvim/plines.c index bbe1a41b00..f940598bf8 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -155,11 +155,11 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column) } // If *s is a TAB, and the TAB is not displayed as ^I, and we're not in - // INSERT mode, then col must be adjusted so that it represents the last - // screen position of the TAB. This only fixes an error when the TAB wraps - // from one screen line to the next (when 'columns' is not a multiple of - // 'ts') -- webb. - if (*s == TAB && (State & NORMAL) + // MODE_INSERT state, then col must be adjusted so that it represents the + // last screen position of the TAB. This only fixes an error when the TAB + // wraps from one screen line to the next (when 'columns' is not a multiple + // of 'ts') -- webb. + if (*s == TAB && (State & MODE_NORMAL) && (!wp->w_p_list || wp->w_p_lcs_chars.tab1)) { col += win_lbr_chartabsize(wp, line, s, col, NULL) - 1; } diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 78b3ceaacf..9525a84e62 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -111,10 +111,10 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, i // To keep the code simple, we only allow changing the // draw mode when the popup menu is not being displayed pum_external = ui_has(kUIPopupmenu) - || (State == CMDLINE && ui_has(kUIWildmenu)); + || (State == MODE_CMDLINE && ui_has(kUIWildmenu)); } - pum_rl = (curwin->w_p_rl && State != CMDLINE); + pum_rl = (curwin->w_p_rl && State != MODE_CMDLINE); do { // Mark the pum as visible already here, @@ -126,7 +126,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, i below_row = cmdline_row; // wildoptions=pum - if (State == CMDLINE) { + if (State == MODE_CMDLINE) { pum_win_row = ui_has(kUICmdline) ? 0 : cmdline_row; cursor_col = cmd_startcol; pum_anchor_grid = ui_has(kUICmdline) ? -1 : DEFAULT_GRID_HANDLE; @@ -419,7 +419,7 @@ void pum_redraw(void) grid_assign_handle(&pum_grid); - pum_grid.zindex = ((State == CMDLINE) + pum_grid.zindex = ((State == MODE_CMDLINE) ? kZIndexCmdlinePopupMenu : kZIndexPopupMenu); bool moved = ui_comp_put_grid(&pum_grid, pum_row, pum_col - col_off, @@ -429,9 +429,9 @@ void pum_redraw(void) must_redraw_pum = false; if (!pum_grid.chars - || pum_grid.Rows != pum_height || pum_grid.Columns != grid_width) { + || pum_grid.rows != pum_height || pum_grid.cols != grid_width) { grid_alloc(&pum_grid, pum_height, grid_width, !invalid_grid, false); - ui_call_grid_resize(pum_grid.handle, pum_grid.Columns, pum_grid.Rows); + ui_call_grid_resize(pum_grid.handle, pum_grid.cols, pum_grid.rows); } else if (invalid_grid) { grid_invalidate(&pum_grid); } @@ -694,7 +694,7 @@ static int pum_set_selected(int n, int repeat) if ((pum_array[pum_selected].pum_info != NULL) && (Rows > 10) && (repeat <= 1) - && (vim_strchr(p_cot, 'p') != NULL)) { + && (vim_strchr((char *)p_cot, 'p') != NULL)) { win_T *curwin_save = curwin; tabpage_T *curtab_save = curtab; int res = OK; @@ -748,7 +748,7 @@ static int pum_set_selected(int n, int repeat) linenr_T lnum = 0; for (p = pum_array[pum_selected].pum_info; *p != NUL;) { - e = vim_strchr(p, '\n'); + e = (char_u *)vim_strchr((char *)p, '\n'); if (e == NULL) { ml_append(lnum++, (char *)p, 0, false); break; diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 394f819f13..883de85aee 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -369,9 +369,9 @@ static char *efmpat_to_regpat(const char *efmpat, char *regpat, efm_T *efminfo, return NULL; } if ((idx && idx < FMT_PATTERN_R - && vim_strchr((char_u *)"DXOPQ", efminfo->prefix) != NULL) + && vim_strchr("DXOPQ", efminfo->prefix) != NULL) || (idx == FMT_PATTERN_R - && vim_strchr((char_u *)"OPQ", efminfo->prefix) == NULL)) { + && vim_strchr("OPQ", efminfo->prefix) == NULL)) { semsg(_("E373: Unexpected %%%c in format string"), *efmpat); return NULL; } @@ -453,10 +453,10 @@ static char *scanf_fmt_to_regpat(const char **pefmp, const char *efm, int len, c static const char *efm_analyze_prefix(const char *efmp, efm_T *efminfo) FUNC_ATTR_NONNULL_ALL { - if (vim_strchr((char_u *)"+-", *efmp) != NULL) { + if (vim_strchr("+-", *efmp) != NULL) { efminfo->flags = *efmp++; } - if (vim_strchr((char_u *)"DXAEWINCZGOPQ", *efmp) != NULL) { + if (vim_strchr("DXAEWINCZGOPQ", *efmp) != NULL) { efminfo->prefix = *efmp; } else { semsg(_("E376: Invalid %%%c in format string prefix"), *efmp); @@ -496,7 +496,7 @@ static int efm_to_regpat(const char *efm, int len, efm_T *fmt_ptr, char *regpat) if (ptr == NULL) { return FAIL; } - } else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL) { + } else if (vim_strchr("%\\.^$~[", *efmp) != NULL) { *ptr++ = *efmp; // regexp magic characters } else if (*efmp == '#') { *ptr++ = '*'; @@ -516,7 +516,7 @@ static int efm_to_regpat(const char *efm, int len, efm_T *fmt_ptr, char *regpat) } else { // copy normal character if (*efmp == '\\' && efmp + 1 < efm + len) { efmp++; - } else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL) { + } else if (vim_strchr(".*^$~[", *efmp) != NULL) { *ptr++ = '\\'; // escape regexp atoms } if (*efmp) { @@ -609,7 +609,7 @@ static efm_T *parse_efm_option(char *efm) if (efm_to_regpat(efm, len, fmt_ptr, fmtstr) == FAIL) { goto parse_efm_error; } - if ((fmt_ptr->prog = vim_regcomp((char_u *)fmtstr, RE_MAGIC + RE_STRING)) == NULL) { + if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL) { goto parse_efm_error; } // Advance to next part @@ -659,7 +659,7 @@ static int qf_get_next_str_line(qfstate_T *state) return QF_END_OF_INPUT; } - p = (char *)vim_strchr((char_u *)p_str, '\n'); + p = vim_strchr(p_str, '\n'); if (p != NULL) { len = (size_t)(p - p_str) + 1; } else { @@ -961,16 +961,16 @@ restofline: fmt_start = fmt_ptr; } - if (vim_strchr((char_u *)"AEWIN", idx) != NULL) { + if (vim_strchr("AEWIN", idx) != NULL) { qfl->qf_multiline = true; // start of a multi-line message qfl->qf_multiignore = false; // reset continuation - } else if (vim_strchr((char_u *)"CZ", idx) != NULL) { + } else if (vim_strchr("CZ", idx) != NULL) { // continuation of multi-line msg status = qf_parse_multiline_pfx(idx, qfl, fields); if (status != QF_OK) { return status; } - } else if (vim_strchr((char_u *)"OPQ", idx) != NULL) { + } else if (vim_strchr("OPQ", idx) != NULL) { // global file names status = qf_parse_file_pfx(idx, fields, qfl, tail); if (status == QF_MULTISCAN) { @@ -1273,7 +1273,7 @@ static int qf_parse_fmt_f(regmatch_T *rmp, int midx, qffields_T *fields, int pre // For separate filename patterns (%O, %P and %Q), the specified file // should exist. - if (vim_strchr((char_u *)"OPQ", prefix) != NULL + if (vim_strchr("OPQ", prefix) != NULL && !os_path_exists((char_u *)fields->namebuf)) { return QF_FAIL; } @@ -1500,7 +1500,7 @@ static int qf_parse_match(char *linebuf, size_t linelen, efm_T *fmt_ptr, regmatc if ((idx == 'C' || idx == 'Z') && !qf_multiline) { return QF_FAIL; } - if (vim_strchr((char_u *)"EWIN", idx) != NULL) { + if (vim_strchr("EWIN", idx) != NULL) { fields->type = idx; } else { fields->type = 0; @@ -1545,7 +1545,7 @@ static int qf_parse_get_fields(char *linebuf, size_t linelen, efm_T *fmt_ptr, qf int status = QF_FAIL; int r; - if (qf_multiscan && vim_strchr((char_u *)"OPQ", fmt_ptr->prefix) == NULL) { + if (qf_multiscan && vim_strchr("OPQ", fmt_ptr->prefix) == NULL) { return QF_FAIL; } @@ -2170,7 +2170,7 @@ static char *qf_push_dir(char *dirbuf, struct dir_stack_T **stackptr, bool is_fi // store directory on the stack if (vim_isAbsName((char_u *)dirbuf) || (*stackptr)->next == NULL - || (*stackptr && is_file_stack)) { + || is_file_stack) { (*stackptr)->dirname = xstrdup(dirbuf); } else { // Okay we don't have an absolute path. @@ -3102,9 +3102,9 @@ static void qf_list_entry(qfline_T *qfp, int qf_idx, bool cursel) } else { if (qfp->qf_fnum != 0 && (buf = buflist_findnr(qfp->qf_fnum)) != NULL) { - fname = (char *)buf->b_fname; + fname = buf->b_fname; if (qfp->qf_type == 1) { // :helpgrep - fname = (char *)path_tail((char_u *)fname); + fname = path_tail(fname); } } if (fname == NULL) { @@ -4230,10 +4230,8 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, int q curbuf->b_p_ma = false; keep_filetype = true; // don't detect 'filetype' - apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL, - false, curbuf); - apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL, - false, curbuf); + apply_autocmds(EVENT_BUFREADPOST, "quickfix", NULL, false, curbuf); + apply_autocmds(EVENT_BUFWINENTER, "quickfix", NULL, false, curbuf); keep_filetype = false; curbuf->b_ro_locked--; @@ -4374,7 +4372,7 @@ void ex_make(exarg_T *eap) } char *const au_name = make_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -4415,7 +4413,7 @@ void ex_make(exarg_T *eap) // check for autocommands changing the current quickfix list. unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, curbuf->b_fname, true, + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } if (res > 0 && !eap->forceit && qflist_valid(wp, save_qfid)) { @@ -5106,7 +5104,7 @@ void ex_cfile(exarg_T *eap) au_name = cfile_get_auname(eap->cmdidx); if (au_name != NULL - && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, NULL, false, curbuf)) { + && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, false, curbuf)) { if (aborting()) { return; } @@ -5146,7 +5144,7 @@ void ex_cfile(exarg_T *eap) } unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, NULL, false, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, false, curbuf); } // Jump to the first error for a new list and if autocmds didn't free the // list. @@ -5196,9 +5194,9 @@ static void vgr_init_regmatch(regmmatch_T *regmatch, char *s) emsg(_(e_noprevre)); return; } - regmatch->regprog = vim_regcomp(last_search_pat(), RE_MAGIC); + regmatch->regprog = vim_regcomp((char *)last_search_pat(), RE_MAGIC); } else { - regmatch->regprog = vim_regcomp((char_u *)s, RE_MAGIC); + regmatch->regprog = vim_regcomp(s, RE_MAGIC); } regmatch->rmm_ic = p_ic; @@ -5565,7 +5563,7 @@ static int vgr_process_files(win_T *wp, qf_info_T *qi, vgr_args_T *cmd_args, boo // options! aco_save_T aco; aucmd_prepbuf(&aco, buf); - apply_autocmds(EVENT_FILETYPE, buf->b_p_ft, buf->b_fname, true, buf); + apply_autocmds(EVENT_FILETYPE, (char *)buf->b_p_ft, buf->b_fname, true, buf); do_modelines(OPT_NOWIN); aucmd_restbuf(&aco); } @@ -5588,7 +5586,7 @@ theend: void ex_vimgrep(exarg_T *eap) { char *au_name = vgr_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -5637,7 +5635,7 @@ void ex_vimgrep(exarg_T *eap) unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } // The QuickFixCmdPost autocmd may free the quickfix list. Check the list @@ -5740,7 +5738,7 @@ static buf_T *load_dummy_buffer(char *fname, char *dirname_start, char *resultin curbuf->b_flags &= ~BF_DUMMY; newbuf_to_wipe.br_buf = NULL; - readfile_result = readfile((char_u *)fname, NULL, (linenr_T)0, (linenr_T)0, + readfile_result = readfile(fname, NULL, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, NULL, READ_NEW | READ_DUMMY, false); newbuf->b_locked--; @@ -6887,7 +6885,7 @@ static int cbuffer_process_args(exarg_T *eap, buf_T **bufp, linenr_T *line1, lin if (*eap->arg == NUL) { buf = curbuf; - } else if (*skipwhite((char *)skipdigits((char_u *)eap->arg)) == NUL) { + } else if (*skipwhite(skipdigits(eap->arg)) == NUL) { buf = buflist_findnr(atoi(eap->arg)); } @@ -6935,7 +6933,7 @@ void ex_cbuffer(exarg_T *eap) linenr_T line2; au_name = cbuffer_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -6975,8 +6973,7 @@ void ex_cbuffer(exarg_T *eap) unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { const buf_T *const curbuf_old = curbuf; - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); if (curbuf != curbuf_old) { // Autocommands changed buffer, don't jump now, "qi" may // be invalid. @@ -7023,7 +7020,7 @@ void ex_cexpr(exarg_T *eap) win_T *wp = NULL; au_name = cexpr_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -7055,8 +7052,7 @@ void ex_cexpr(exarg_T *eap) // check for autocommands changing the current quickfix list. unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } // Jump to the first error for a new list and if autocmds didn't // free the list. @@ -7220,7 +7216,7 @@ void ex_helpgrep(exarg_T *eap) default: break; } - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -7228,8 +7224,8 @@ void ex_helpgrep(exarg_T *eap) } // Make 'cpoptions' empty, the 'l' flag should not be used here. - char *const save_cpo = (char *)p_cpo; - p_cpo = empty_option; + char *const save_cpo = p_cpo; + p_cpo = (char *)empty_option; if (is_loclist_cmd(eap->cmdidx)) { qi = hgr_get_ll(&new_qi); @@ -7240,7 +7236,7 @@ void ex_helpgrep(exarg_T *eap) // Check for a specified language char *const lang = check_help_lang(eap->arg); regmatch_T regmatch = { - .regprog = vim_regcomp((char_u *)eap->arg, RE_MAGIC + RE_STRING), + .regprog = vim_regcomp(eap->arg, RE_MAGIC + RE_STRING), .rm_ic = false, }; if (regmatch.regprog != NULL) { @@ -7259,16 +7255,15 @@ void ex_helpgrep(exarg_T *eap) qf_update_buffer(qi, NULL); } - if (p_cpo == empty_option) { - p_cpo = (char_u *)save_cpo; + if ((char_u *)p_cpo == empty_option) { + p_cpo = save_cpo; } else { // Darn, some plugin changed the value. free_string_option((char_u *)save_cpo); } if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); // When adding a location list to an existing location list stack, // if the autocmd made the stack invalid, then just return. if (!new_qi && IS_LL_STACK(qi) && qf_find_win_with_loclist(qi) == NULL) { diff --git a/src/nvim/rbuffer.h b/src/nvim/rbuffer.h index e86765a4ad..09d6ba3d34 100644 --- a/src/nvim/rbuffer.h +++ b/src/nvim/rbuffer.h @@ -36,6 +36,8 @@ // // Note that the rbuffer_{produced,consumed} calls are necessary or these macros // create infinite loops +// +// -V:RBUFFER_UNTIL_EMPTY:1044 #define RBUFFER_UNTIL_EMPTY(buf, rptr, rcnt) \ for (size_t rcnt = 0, _r = 1; _r; _r = 0) /* NOLINT(readability/braces) */ \ for (char *rptr = rbuffer_read_ptr(buf, &rcnt); /* NOLINT(readability/braces) */ \ diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 2052493e3f..f0ccd19478 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * Handling of regular expressions: vim_regcomp(), vim_regexec(), vim_regsub() */ @@ -18,21 +16,21 @@ #include <stdbool.h> #include <string.h> -#include "nvim/vim.h" #include "nvim/ascii.h" -#include "nvim/regexp.h" #include "nvim/charset.h" #include "nvim/eval.h" #include "nvim/eval/userfunc.h" #include "nvim/ex_cmds2.h" +#include "nvim/garray.h" #include "nvim/mark.h" #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/os/input.h" #include "nvim/plines.h" -#include "nvim/garray.h" +#include "nvim/regexp.h" #include "nvim/strings.h" +#include "nvim/vim.h" #ifdef REGEXP_DEBUG // show/save debugging data when BT engine is used @@ -62,15 +60,17 @@ typedef void (*(*fptr_T)(int *, int))(void); static int no_Magic(int x) { - if (is_Magic(x)) + if (is_Magic(x)) { return un_Magic(x); + } return x; } static int toggle_Magic(int x) { - if (is_Magic(x)) + if (is_Magic(x)) { return un_Magic(x); + } return Magic(x); } @@ -88,13 +88,12 @@ static int toggle_Magic(int x) #define IEMSG_RET_NULL(m) return (iemsg(m), rc_did_emsg = true, (void *)NULL) #define EMSG_RET_FAIL(m) return (emsg(m), rc_did_emsg = true, FAIL) #define EMSG2_RET_NULL(m, c) \ - return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, (void *)NULL) + return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, (void *)NULL) #define EMSG3_RET_NULL(m, c, a) \ - return (semsg((const char *)(m), (c) ? "" : "\\", (a)), rc_did_emsg = true, (void *)NULL) + return (semsg((const char *)(m), (c) ? "" : "\\", (a)), rc_did_emsg = true, (void *)NULL) #define EMSG2_RET_FAIL(m, c) \ - return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, FAIL) -#define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_( \ - "E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL) + return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, FAIL) +#define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_("E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL) #define MAX_LIMIT (32767L << 16L) @@ -128,33 +127,35 @@ static char_u e_regexp_number_after_dot_pos_search[] /// Return MULTI_MULT if c is a multi "multi" operator. static int re_multi_type(int c) { - if (c == Magic('@') || c == Magic('=') || c == Magic('?')) + if (c == Magic('@') || c == Magic('=') || c == Magic('?')) { return MULTI_ONE; - if (c == Magic('*') || c == Magic('+') || c == Magic('{')) + } + if (c == Magic('*') || c == Magic('+') || c == Magic('{')) { return MULTI_MULT; + } return NOT_MULTI; } -static char_u *reg_prev_sub = NULL; +static char_u *reg_prev_sub = NULL; /* * REGEXP_INRANGE contains all characters which are always special in a [] * range after '\'. * REGEXP_ABBR contains all characters which act as abbreviations after '\'. * These are: - * \n - New line (NL). - * \r - Carriage Return (CR). - * \t - Tab (TAB). - * \e - Escape (ESC). - * \b - Backspace (Ctrl_H). + * \n - New line (NL). + * \r - Carriage Return (CR). + * \t - Tab (TAB). + * \e - Escape (ESC). + * \b - Backspace (Ctrl_H). * \d - Character code in decimal, eg \d123 - * \o - Character code in octal, eg \o80 - * \x - Character code in hex, eg \x4a - * \u - Multibyte character code, eg \u20ac - * \U - Long multibyte character code, eg \U12345678 + * \o - Character code in octal, eg \o80 + * \x - Character code in hex, eg \x4a + * \u - Multibyte character code, eg \u20ac + * \U - Long multibyte character code, eg \U12345678 */ -static char_u REGEXP_INRANGE[] = "]^-n\\"; -static char_u REGEXP_ABBR[] = "nrtebdoxuU"; +static char REGEXP_INRANGE[] = "]^-n\\"; +static char REGEXP_ABBR[] = "nrtebdoxuU"; /* @@ -163,10 +164,14 @@ static char_u REGEXP_ABBR[] = "nrtebdoxuU"; static int backslash_trans(int c) { switch (c) { - case 'r': return CAR; - case 't': return TAB; - case 'e': return ESC; - case 'b': return BS; + case 'r': + return CAR; + case 't': + return TAB; + case 'e': + return ESC; + case 'b': + return BS; } return c; } @@ -223,11 +228,12 @@ static int get_char_class(char_u **pp) int i; if ((*pp)[1] == ':') { - for (i = 0; i < (int)ARRAY_SIZE(class_names); ++i) + for (i = 0; i < (int)ARRAY_SIZE(class_names); i++) { if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0) { *pp += STRLEN(class_names[i]) + 2; return i; } + } } return CLASS_NONE; } @@ -253,41 +259,43 @@ static void init_class_tab(void) int i; static int done = false; - if (done) + if (done) { return; + } - for (i = 0; i < 256; ++i) { - if (i >= '0' && i <= '7') + for (i = 0; i < 256; i++) { + if (i >= '0' && i <= '7') { class_tab[i] = RI_DIGIT + RI_HEX + RI_OCTAL + RI_WORD; - else if (i >= '8' && i <= '9') + } else if (i >= '8' && i <= '9') { class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD; - else if (i >= 'a' && i <= 'f') + } else if (i >= 'a' && i <= 'f') { class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; - else if (i >= 'g' && i <= 'z') + } else if (i >= 'g' && i <= 'z') { class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; - else if (i >= 'A' && i <= 'F') + } else if (i >= 'A' && i <= 'F') { class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; - else if (i >= 'G' && i <= 'Z') + } else if (i >= 'G' && i <= 'Z') { class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; - else if (i == '_') + } else if (i == '_') { class_tab[i] = RI_WORD + RI_HEAD; - else + } else { class_tab[i] = 0; + } } class_tab[' '] |= RI_WHITE; class_tab['\t'] |= RI_WHITE; done = true; } -# define ri_digit(c) ((c) < 0x100 && (class_tab[c] & RI_DIGIT)) -# define ri_hex(c) ((c) < 0x100 && (class_tab[c] & RI_HEX)) -# define ri_octal(c) ((c) < 0x100 && (class_tab[c] & RI_OCTAL)) -# define ri_word(c) ((c) < 0x100 && (class_tab[c] & RI_WORD)) -# define ri_head(c) ((c) < 0x100 && (class_tab[c] & RI_HEAD)) -# define ri_alpha(c) ((c) < 0x100 && (class_tab[c] & RI_ALPHA)) -# define ri_lower(c) ((c) < 0x100 && (class_tab[c] & RI_LOWER)) -# define ri_upper(c) ((c) < 0x100 && (class_tab[c] & RI_UPPER)) -# define ri_white(c) ((c) < 0x100 && (class_tab[c] & RI_WHITE)) +#define ri_digit(c) ((c) < 0x100 && (class_tab[c] & RI_DIGIT)) +#define ri_hex(c) ((c) < 0x100 && (class_tab[c] & RI_HEX)) +#define ri_octal(c) ((c) < 0x100 && (class_tab[c] & RI_OCTAL)) +#define ri_word(c) ((c) < 0x100 && (class_tab[c] & RI_WORD)) +#define ri_head(c) ((c) < 0x100 && (class_tab[c] & RI_HEAD)) +#define ri_alpha(c) ((c) < 0x100 && (class_tab[c] & RI_ALPHA)) +#define ri_lower(c) ((c) < 0x100 && (class_tab[c] & RI_LOWER)) +#define ri_upper(c) ((c) < 0x100 && (class_tab[c] & RI_UPPER)) +#define ri_white(c) ((c) < 0x100 && (class_tab[c] & RI_WHITE)) // flags for regflags #define RF_ICASE 1 // ignore case @@ -320,6 +328,8 @@ static int reg_strict; // "[abc" is illegal * META contains all characters that may be magic, except '^' and '$'. */ +// uncrustify:off + // META[] is used often enough to justify turning it into a table. static char_u META_flags[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -338,6 +348,8 @@ static char_u META_flags[] = { 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 }; +// uncrustify:on + static int curchr; // currently parsed character // Previous character. Note: prevchr is sometimes -1 when we are not at the // start, eg in /[ ^I]^ the pattern was never found even if it existed, @@ -389,7 +401,7 @@ static int get_equi_class(char_u **pp) { int c; int l = 1; - char_u *p = *pp; + char_u *p = *pp; if (p[1] == '=' && p[2] != NUL) { l = utfc_ptr2len((char *)p + 2); @@ -413,7 +425,7 @@ static int get_coll_element(char_u **pp) { int c; int l = 1; - char_u *p = *pp; + char_u *p = *pp; if (p[0] != NUL && p[1] == '.' && p[2] != NUL) { l = utfc_ptr2len((char *)p + 2); @@ -451,7 +463,7 @@ static char_u *skip_anyof(char_u *p) while (*p != NUL && *p != ']') { if ((l = utfc_ptr2len((char *)p)) > 1) { p += l; - } else if (*p == '-') { + } else if (*p == '-') { p++; if (*p != ']' && *p != NUL) { MB_PTR_ADV(p); @@ -488,12 +500,13 @@ static char_u *skip_anyof(char_u *p) char_u *skip_regexp(char_u *startp, int dirc, int magic, char_u **newp) { int mymagic; - char_u *p = startp; + char_u *p = startp; - if (magic) + if (magic) { mymagic = MAGIC_ON; - else + } else { mymagic = MAGIC_OFF; + } get_cpo_flags(); for (; p[0] != NUL; MB_PTR_ADV(p)) { @@ -503,9 +516,10 @@ char_u *skip_regexp(char_u *startp, int dirc, int magic, char_u **newp) if ((p[0] == '[' && mymagic >= MAGIC_ON) || (p[0] == '\\' && p[1] == '[' && mymagic <= MAGIC_OFF)) { p = skip_anyof(p + 1); - if (p[0] == NUL) + if (p[0] == NUL) { break; - } else if (p[0] == '\\' && p[1] != NUL) { + } + } else if (p[0] == '\\' && p[1] != NUL) { if (dirc == '?' && newp != NULL && p[1] == '?') { // change "\?" to "?", make a copy first. if (*newp == NULL) { @@ -686,8 +700,7 @@ static int peekchr(void) } } break; - case '\\': - { + case '\\': { int c = regparse[1]; if (c == NUL) { @@ -712,13 +725,11 @@ static int peekchr(void) * Handle abbreviations, like "\t" for TAB -- webb */ curchr = backslash_trans(c); - } else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^')) + } else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^')) { curchr = toggle_Magic(c); - else { - /* - * Next character can never be (made) magic? - * Then backslashing it won't do anything. - */ + } else { + // Next character can never be (made) magic? + // Then backslashing it won't do anything. curchr = utf_ptr2char((char *)regparse + 1); } break; @@ -804,7 +815,7 @@ static void ungetchr(void) * Return -1 if there is no valid hex number. * The position is updated: * blahblah\%x20asdf - * before-^ ^-after + * before-^ ^-after * The parameter controls the maximum number of input characters. This will be * 2 when reading a \%x20 sequence and 4 when reading a \%u20AC sequence. */ @@ -816,15 +827,17 @@ static int64_t gethexchrs(int maxinputlen) for (i = 0; i < maxinputlen; ++i) { c = regparse[0]; - if (!ascii_isxdigit(c)) + if (!ascii_isxdigit(c)) { break; + } nr <<= 4; nr |= hex2nr(c); ++regparse; } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -840,16 +853,18 @@ static int64_t getdecchrs(void) for (i = 0;; ++i) { c = regparse[0]; - if (c < '0' || c > '9') + if (c < '0' || c > '9') { break; + } nr *= 10; nr += c - '0'; regparse++; curchr = -1; // no longer valid } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -859,7 +874,7 @@ static int64_t getdecchrs(void) * numbers > 377 correctly (for example, 400 is treated as 40) and doesn't * treat 8 or 9 as recognised characters. Position is updated: * blahblah\%o210asdf - * before-^ ^-after + * before-^ ^-after */ static int64_t getoctchrs(void) { @@ -869,15 +884,17 @@ static int64_t getoctchrs(void) for (i = 0; i < 3 && nr < 040; i++) { // -V536 c = regparse[0]; - if (c < '0' || c > '7') + if (c < '0' || c > '7') { break; + } nr <<= 3; nr |= hex2nr(c); ++regparse; } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -891,7 +908,7 @@ static int64_t getoctchrs(void) static int read_limits(long *minval, long *maxval) { int reverse = false; - char_u *first_char; + char_u *first_char; long tmp; if (*regparse == '-') { @@ -943,7 +960,7 @@ static int read_limits(long *minval, long *maxval) // Sometimes need to save a copy of a line. Since alloc()/free() is very // slow, we keep one allocated piece of memory and only re-allocate it when // it's too small. It's freed in bt_regexec_both() when finished. -static char_u *reg_tofree = NULL; +static char_u *reg_tofree = NULL; static unsigned reg_tofreelen; // Structure used to store the execution state of the regex engine. @@ -1039,8 +1056,8 @@ static char_u *reg_getline(linenr_T lnum) return ml_get_buf(rex.reg_buf, rex.reg_firstlnum + lnum, false); } -static char_u *reg_startzp[NSUBEXP]; // Workspace to mark beginning -static char_u *reg_endzp[NSUBEXP]; // and end of \z(...\) matches +static char_u *reg_startzp[NSUBEXP]; // Workspace to mark beginning +static char_u *reg_endzp[NSUBEXP]; // and end of \z(...\) matches static lpos_T reg_startzpos[NSUBEXP]; // idem, beginning pos static lpos_T reg_endzpos[NSUBEXP]; // idem, end pos @@ -1063,8 +1080,9 @@ static reg_extmatch_T *make_extmatch(void) */ reg_extmatch_T *ref_extmatch(reg_extmatch_T *em) { - if (em != NULL) + if (em != NULL) { em->refcnt++; + } return em; } @@ -1077,8 +1095,9 @@ void unref_extmatch(reg_extmatch_T *em) int i; if (em != NULL && --em->refcnt <= 0) { - for (i = 0; i < NSUBEXP; ++i) + for (i = 0; i < NSUBEXP; i++) { xfree(em->matches[i]); + } xfree(em); } } @@ -1087,9 +1106,8 @@ void unref_extmatch(reg_extmatch_T *em) static int reg_prev_class(void) { if (rex.input > rex.line) { - return mb_get_class_tab( - rex.input - 1 - utf_head_off(rex.line, rex.input - 1), - rex.reg_buf->b_chartab); + return mb_get_class_tab(rex.input - 1 - utf_head_off(rex.line, rex.input - 1), + rex.reg_buf->b_chartab); } return -1; } @@ -1147,10 +1165,12 @@ static bool reg_match_visual(void) } else if (mode == Ctrl_V) { getvvcol(wp, &top, &start, NULL, &end); getvvcol(wp, &bot, &start2, NULL, &end2); - if (start2 < start) + if (start2 < start) { start = start2; - if (end2 > end) + } + if (end2 > end) { end = end2; + } if (top.col == MAXCOL || bot.col == MAXCOL || curswant == MAXCOL) { end = MAXCOL; } @@ -1175,7 +1195,7 @@ static bool reg_match_visual(void) */ static int prog_magic_wrong(void) { - regprog_T *prog; + regprog_T *prog; prog = REG_MULTI ? rex.reg_mmatch->regprog : rex.reg_match->regprog; if (prog->engine == &nfa_regengine) { @@ -1241,21 +1261,18 @@ static void reg_nextline(void) * If "bytelen" is not NULL, it is set to the byte length of the match in the * last line. */ -static int match_with_backref( - linenr_T start_lnum, - colnr_T start_col, - linenr_T end_lnum, - colnr_T end_col, - int *bytelen) +static int match_with_backref(linenr_T start_lnum, colnr_T start_col, linenr_T end_lnum, + colnr_T end_col, int *bytelen) { linenr_T clnum = start_lnum; colnr_T ccol = start_col; int len; - char_u *p; + char_u *p; - if (bytelen != NULL) + if (bytelen != NULL) { *bytelen = 0; - for (;; ) { + } + for (;;) { // Since getting one line may invalidate the other, need to make copy. // Slow! if (rex.line != reg_tofree) { @@ -1275,10 +1292,11 @@ static int match_with_backref( p = reg_getline(clnum); assert(p); - if (clnum == end_lnum) + if (clnum == end_lnum) { len = end_col - ccol; - else + } else { len = (int)STRLEN(p + ccol); + } if (cstrncmp(p + ccol, rex.input, &len) != 0) { return RA_NOMATCH; // doesn't match @@ -1295,12 +1313,14 @@ static int match_with_backref( // Advance to next line. reg_nextline(); - if (bytelen != NULL) + if (bytelen != NULL) { *bytelen = 0; - ++clnum; + } + clnum++; ccol = 0; - if (got_int) + if (got_int) { return RA_FAIL; + } } // found a match! Note that rex.line may now point to a copy of the line, @@ -1324,7 +1344,7 @@ typedef struct { } decomp_T; // 0xfb20 - 0xfb4f -static decomp_T decomp_table[0xfb4f-0xfb20+1] = +static decomp_T decomp_table[0xfb4f - 0xfb20 + 1] = { { 0x5e2, 0, 0 }, // 0xfb20 alt ayin { 0x5d0, 0, 0 }, // 0xfb21 alt alef @@ -1407,7 +1427,7 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n) // if it failed and it's utf8 and we want to combineignore: if (result != 0 && rex.reg_icombine) { - char_u *str1, *str2; + char_u *str1, *str2; int c1, c2, c11, c12; int junk; @@ -1435,8 +1455,9 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n) } } result = c2 - c1; - if (result == 0) + if (result == 0) { *n = (int)(str2 - s2); + } } return result; @@ -1456,7 +1477,7 @@ static inline char_u *cstrchr(const char_u *const s, const int c) FUNC_ATTR_ALWAYS_INLINE { if (!rex.reg_ic) { - return vim_strchr(s, c); + return (char_u *)vim_strchr((char *)s, c); } // Use folded case for UTF-8, slow! For ASCII use libc strpbrk which is @@ -1477,7 +1498,7 @@ static inline char_u *cstrchr(const char_u *const s, const int c) } else if (ASCII_ISLOWER(c)) { cc = TOUPPER_ASC(c); } else { - return vim_strchr(s, c); + return (char_u *)vim_strchr((char *)s, c); } char tofind[] = { (char)c, (char)cc, NUL }; @@ -1533,9 +1554,9 @@ static fptr_T do_Lower(int *d, int c) */ char_u *regtilde(char_u *source, int magic, bool preview) { - char_u *newsub = source; - char_u *tmpsub; - char_u *p; + char_u *newsub = source; + char_u *tmpsub; + char_u *p; int len; int prevlen; @@ -1605,8 +1626,7 @@ static regsubmatch_T rsm; // can only be used when can_f_submatch is true /// Put the submatches in "argv[argskip]" which is a list passed into /// call_func() by vim_regsub_both(). -static int fill_submatch_list(int argc FUNC_ATTR_UNUSED, typval_T *argv, - int argskip, int argcount) +static int fill_submatch_list(int argc FUNC_ATTR_UNUSED, typval_T *argv, int argskip, int argcount) FUNC_ATTR_NONNULL_ALL { typval_T *listarg = argv + argskip; @@ -1658,8 +1678,8 @@ static void clear_submatch_list(staticList10_T *sl) /// references invalid! /// /// Returns the size of the replacement, including terminating NUL. -int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, - int copy, int magic, int backslash) +int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, int copy, int magic, + int backslash) { regexec_T rex_save; bool rex_in_use_save = rex_in_use; @@ -1685,8 +1705,8 @@ int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, return result; } -int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *dest, - int copy, int magic, int backslash) +int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *dest, int copy, + int magic, int backslash) { regexec_T rex_save; bool rex_in_use_save = rex_in_use; @@ -1713,12 +1733,12 @@ int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *de return result; } -static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, - int copy, int magic, int backslash) +static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, int copy, int magic, + int backslash) { - char_u *src; - char_u *dst; - char_u *s; + char_u *src; + char_u *dst; + char_u *s; int c; int cc; int no = -1; @@ -1737,8 +1757,9 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, emsg(_(e_null)); return 0; } - if (prog_magic_wrong()) + if (prog_magic_wrong()) { return 0; + } src = source; dst = dest; @@ -1851,28 +1872,33 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, rsm = rsm_save; } } - } else + } else { while ((c = *src++) != NUL) { - if (c == '&' && magic) + if (c == '&' && magic) { no = 0; - else if (c == '\\' && *src != NUL) { + } else if (c == '\\' && *src != NUL) { if (*src == '&' && !magic) { ++src; no = 0; } else if ('0' <= *src && *src <= '9') { no = *src++ - '0'; - } else if (vim_strchr((char_u *)"uUlLeE", *src)) { + } else if (vim_strchr("uUlLeE", *src)) { switch (*src++) { - case 'u': func_one = (fptr_T)do_upper; + case 'u': + func_one = (fptr_T)do_upper; continue; - case 'U': func_all = (fptr_T)do_Upper; + case 'U': + func_all = (fptr_T)do_Upper; continue; - case 'l': func_one = (fptr_T)do_lower; + case 'l': + func_one = (fptr_T)do_lower; continue; - case 'L': func_all = (fptr_T)do_Lower; + case 'L': + func_all = (fptr_T)do_Lower; continue; case 'e': - case 'E': func_one = func_all = (fptr_T)NULL; + case 'E': + func_one = func_all = (fptr_T)NULL; continue; } } @@ -1894,12 +1920,16 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, if (c == '\\' && *src != NUL) { // Check for abbreviations -- webb switch (*src) { - case 'r': c = CAR; ++src; break; - case 'n': c = NL; ++src; break; - case 't': c = TAB; ++src; break; + case 'r': + c = CAR; ++src; break; + case 'n': + c = NL; ++src; break; + case 't': + c = TAB; ++src; break; // Oh no! \e already has meaning in subst pat :-( // case 'e': c = ESC; ++src; break; - case 'b': c = Ctrl_H; ++src; break; + case 'b': + c = Ctrl_H; ++src; break; // If "backslash" is true the backslash will be removed // later. Used to insert a literal CR. @@ -1967,7 +1997,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, } } if (s != NULL) { - for (;; ) { + for (;;) { if (len == 0) { if (REG_MULTI) { if (rex.reg_mmatch->endpos[no].lnum == clnum) { @@ -2042,8 +2072,10 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, no = -1; } } - if (copy) + } + if (copy) { *dst = NUL; + } exit: return (int)((dst - dest) + 1 - num_escaped); @@ -2078,13 +2110,14 @@ static char_u *reg_getline_submatch(linenr_T lnum) */ char_u *reg_submatch(int no) { - char_u *retval = NULL; - char_u *s; + char_u *retval = NULL; + char_u *s; int round; linenr_T lnum; - if (!can_f_submatch || no < 0) + if (!can_f_submatch || no < 0) { return NULL; + } if (rsm.sm_match == NULL) { ssize_t len; @@ -2123,12 +2156,14 @@ char_u *reg_submatch(int no) lnum++; while (lnum < rsm.sm_mmatch->endpos[no].lnum) { s = reg_getline_submatch(lnum++); - if (round == 2) + if (round == 2) { STRCPY(retval + len, s); + } len += STRLEN(s); - if (round == 2) + if (round == 2) { retval[len] = '\n'; - ++len; + } + len++; } if (round == 2) { STRNCPY(retval + len, reg_getline_submatch(lnum), @@ -2250,11 +2285,11 @@ static char_u regname[][30] = { * Use vim_regfree() to free the memory. * Returns NULL for an error. */ -regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) +regprog_T *vim_regcomp(char *expr_arg, int re_flags) { - regprog_T *prog = NULL; - char_u *expr = expr_arg; - int save_called_emsg; + regprog_T *prog = NULL; + char_u *expr = (char_u *)expr_arg; + int save_called_emsg; regexp_engine = p_re; @@ -2273,8 +2308,7 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) regname[newengine]); #endif } else { - emsg(_( - "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be used ")); + emsg(_("E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be used ")); regexp_engine = AUTOMATIC_ENGINE; } } @@ -2292,7 +2326,7 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) called_emsg = false; if (regexp_engine != BACKTRACKING_ENGINE) { prog = nfa_regengine.regcomp(expr, - re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); + re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); } else { prog = bt_regengine.regcomp(expr, re_flags); } @@ -2339,8 +2373,9 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) */ void vim_regfree(regprog_T *prog) { - if (prog != NULL) + if (prog != NULL) { prog->engine->regfree(prog); + } } @@ -2413,7 +2448,7 @@ static bool vim_regexec_string(regmatch_T *rmp, char_u *line, colnr_T col, bool p_re = BACKTRACKING_ENGINE; vim_regfree(rmp->regprog); report_re_switch(pat); - rmp->regprog = vim_regcomp(pat, re_flags); + rmp->regprog = vim_regcomp((char *)pat, re_flags); if (rmp->regprog != NULL) { rmp->regprog->re_in_use = true; result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl); @@ -2462,16 +2497,17 @@ bool vim_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col) /// Note: "rmp->regprog" may be freed and changed, even set to NULL. /// Uses curbuf for line count and 'iskeyword'. /// -/// Return zero if there is no match. Return number of lines contained in the -/// match otherwise. -long vim_regexec_multi( - regmmatch_T *rmp, - win_T *win, // window in which to search or NULL - buf_T *buf, // buffer in which to search - linenr_T lnum, // nr of line to start looking for match - colnr_T col, // column to start looking for match - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag is set when timeout limit reached +/// @param win window in which to search or NULL +/// @param buf buffer in which to search +/// @param lnum nr of line to start looking for match +/// @param col column to start looking for match +/// @param tm timeout limit or NULL +/// @param timed_out flag is set when timeout limit reached +/// +/// @return zero if there is no match. Return number of lines contained in the +/// match otherwise. +long vim_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, + proftime_T *tm, int *timed_out) FUNC_ATTR_NONNULL_ARG(1) { regexec_T rex_save; @@ -2508,7 +2544,7 @@ long vim_regexec_multi( // checking for \z misuse was already done when compiling for NFA, // allow all here reg_do_extmatch = REX_ALL; - rmp->regprog = vim_regcomp(pat, re_flags); + rmp->regprog = vim_regcomp((char *)pat, re_flags); reg_do_extmatch = 0; if (rmp->regprog == NULL) { diff --git a/src/nvim/regexp_bt.c b/src/nvim/regexp_bt.c index ed03bb6172..c13c2c6832 100644 --- a/src/nvim/regexp_bt.c +++ b/src/nvim/regexp_bt.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * * Backtracking regular expression implementation. @@ -19,22 +17,22 @@ * * END NOTICE * - * Copyright (c) 1986 by University of Toronto. - * Written by Henry Spencer. Not derived from licensed software. + * Copyright (c) 1986 by University of Toronto. + * Written by Henry Spencer. Not derived from licensed software. * - * Permission is granted to anyone to use this software for any - * purpose on any computer system, and to redistribute it freely, - * subject to the following restrictions: + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: * - * 1. The author is not responsible for the consequences of use of - * this software, no matter how awful, even if they arise - * from defects in it. + * 1. The author is not responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. * - * 2. The origin of this software must not be misrepresented, either - * by explicit claim or by omission. + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. * - * 3. Altered versions must be plainly marked as such, and must not - * be misrepresented as being the original software. + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in @@ -51,12 +49,12 @@ * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * - * regstart char that must begin a match; NUL if none obvious; Can be a - * multi-byte character. - * reganch is the match anchored (at beginning-of-line only)? - * regmust string (pointer into program) that match must include, or NULL - * regmlen length of regmust string - * regflags RF_ values or'ed together + * regstart char that must begin a match; NUL if none obvious; Can be a + * multi-byte character. + * reganch is the match anchored (at beginning-of-line only)? + * regmust string (pointer into program) that match must include, or NULL + * regmlen length of regmust string + * regflags RF_ values or'ed together * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection @@ -75,7 +73,7 @@ * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next" * pointer with a BRANCH on both ends of it is connecting two alternatives. - * (Here we have one of the subtle syntax dependencies: an individual BRANCH + * (Here we have one of the subtle syntax dependencies: an individual BRANCH * (as opposed to a collection of them) is never concatenated with anything * because of operator precedence). The "next" pointer of a BRACES_COMPLEX * node points to the node after the stuff to be repeated. @@ -85,52 +83,52 @@ * (NB this is *not* a tree structure: the tail of the branch connects to the * thing following the set of BRANCHes.) * - * pattern is coded like: + * pattern is coded like: * - * +-----------------+ - * | V - * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END - * | ^ | ^ - * +------+ +----------+ + * +-----------------+ + * | V + * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END + * | ^ | ^ + * +------+ +----------+ * * - * +------------------+ - * V | - * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END - * | | ^ ^ - * | +---------------+ | - * +---------------------------------------------+ + * +------------------+ + * V | + * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END + * | | ^ ^ + * | +---------------+ | + * +---------------------------------------------+ * * - * +----------------------+ - * V | - * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END - * | | ^ ^ - * | +-----------+ | - * +--------------------------------------------------+ + * +----------------------+ + * V | + * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END + * | | ^ ^ + * | +-----------+ | + * +--------------------------------------------------+ * * - * +-------------------------+ - * V | - * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END - * | | ^ - * | +----------------+ - * +-----------------------------------------------+ + * +-------------------------+ + * V | + * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END + * | | ^ + * | +----------------+ + * +-----------------------------------------------+ * * - * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END - * | | ^ ^ - * | +----------------+ | - * +--------------------------------+ + * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END + * | | ^ ^ + * | +----------------+ | + * +--------------------------------+ * - * +---------+ - * | V - * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END - * | | | | ^ ^ - * | | | +-----+ | - * | | +----------------+ | - * | +---------------------------+ | - * +------------------------------------------------------+ + * +---------+ + * | V + * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END + * | | | | ^ ^ + * | | | +-----+ | + * | | +----------------+ | + * | +---------------------------+ | + * +------------------------------------------------------+ * * They all start with a BRANCH for "\|" alternatives, even when there is only * one alternative. @@ -141,8 +139,8 @@ #include <stdbool.h> #include <string.h> -#include "nvim/regexp.h" #include "nvim/garray.h" +#include "nvim/regexp.h" /* * The opcodes are: @@ -220,10 +218,10 @@ // end of match. #define BACKREF 100 // -109 node Match same string again \1-\9. -# define ZOPEN 110 // -119 Mark this point in input as start of - // \z( … \) subexpr. -# define ZCLOSE 120 // -129 Analogous to ZOPEN. -# define ZREF 130 // -139 node Match external submatch \z1-\z9 +#define ZOPEN 110 // -119 Mark this point in input as start of + // \z( … \) subexpr. +#define ZCLOSE 120 // -129 Analogous to ZOPEN. +#define ZREF 130 // -139 node Match external submatch \z1-\z9 #define BRACE_COMPLEX 140 // -149 node Match nodes between m & n times @@ -267,8 +265,8 @@ static int brace_count[10]; ///< Current counts for complex brace repeats static int one_exactly = false; ///< only do one char for EXACTLY // When making changes to classchars also change nfa_classcodes. -static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU"; -static int classcodes[] = { +static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU"; +static int classcodes[] = { ANY, IDENT, SIDENT, KWORD, SKWORD, FNAME, SFNAME, PRINT, SPRINT, WHITE, NWHITE, DIGIT, NDIGIT, @@ -282,7 +280,7 @@ static int classcodes[] = { * When regcode is set to this value, code is not emitted and size is computed * instead. */ -#define JUST_CALC_SIZE ((char_u *) -1) +#define JUST_CALC_SIZE ((char_u *)-1) // Values for rs_state in regitem_T. typedef enum regstate_E { @@ -299,7 +297,7 @@ typedef enum regstate_E { RS_BEHIND1, // BEHIND / NOBEHIND matching rest RS_BEHIND2, // BEHIND / NOBEHIND matching behind part RS_STAR_LONG, // STAR/PLUS/BRACE_SIMPLE longest match - RS_STAR_SHORT // STAR/PLUS/BRACE_SIMPLE shortest match + RS_STAR_SHORT, // STAR/PLUS/BRACE_SIMPLE shortest match } regstate_T; /* @@ -307,34 +305,29 @@ typedef enum regstate_E { * restored after trying a match. Used by reg_save() and reg_restore(). * Also stores the length of "backpos". */ -typedef struct -{ - union - { - char_u *ptr; // rex.input pointer, for single-line regexp - lpos_T pos; // rex.input pos, for multi-line regexp +typedef struct { + union { + char_u *ptr; // rex.input pointer, for single-line regexp + lpos_T pos; // rex.input pos, for multi-line regexp } rs_u; - int rs_len; + int rs_len; } regsave_T; // struct to save start/end pointer/position in for \(\) -typedef struct -{ - union - { - char_u *ptr; - lpos_T pos; - } se_u; +typedef struct { + union { + char_u *ptr; + lpos_T pos; + } se_u; } save_se_T; // used for BEHIND and NOBEHIND matching -typedef struct regbehind_S -{ - regsave_T save_after; - regsave_T save_behind; - int save_need_clear_subexpr; - save_se_T save_start[NSUBEXP]; - save_se_T save_end[NSUBEXP]; +typedef struct regbehind_S { + regsave_T save_after; + regsave_T save_behind; + int save_need_clear_subexpr; + save_se_T save_start[NSUBEXP]; + save_se_T save_end[NSUBEXP]; } regbehind_T; /* @@ -343,35 +336,31 @@ typedef struct regbehind_S * Before it may be another type of item, depending on rs_state, to remember * more things. */ -typedef struct regitem_S -{ - regstate_T rs_state; // what we are doing, one of RS_ above - short rs_no; // submatch nr or BEHIND/NOBEHIND - char_u *rs_scan; // current node in program - union - { - save_se_T sesave; - regsave_T regsave; +typedef struct regitem_S { + regstate_T rs_state; // what we are doing, one of RS_ above + int16_t rs_no; // submatch nr or BEHIND/NOBEHIND + char_u *rs_scan; // current node in program + union { + save_se_T sesave; + regsave_T regsave; } rs_un; // room for saving rex.input } regitem_T; // used for STAR, PLUS and BRACE_SIMPLE matching -typedef struct regstar_S -{ - int nextb; // next byte - int nextb_ic; // next byte reverse case - long count; - long minval; - long maxval; +typedef struct regstar_S { + int nextb; // next byte + int nextb_ic; // next byte reverse case + long count; + long minval; + long maxval; } regstar_T; // used to store input position when a BACK was encountered, so that we now if // we made any progress since the last time. -typedef struct backpos_S -{ - char_u *bp_scan; // "scan" where BACK was encountered - regsave_T bp_pos; // last input position +typedef struct backpos_S { + char_u *bp_scan; // "scan" where BACK was encountered + regsave_T bp_pos; // last input position } backpos_T; /* @@ -397,34 +386,34 @@ static regsave_T behind_pos; * This makes it fast while not keeping a lot of memory allocated. * A three times speed increase was observed when using many simple patterns. */ -#define REGSTACK_INITIAL 2048 -#define BACKPOS_INITIAL 64 +#define REGSTACK_INITIAL 2048 +#define BACKPOS_INITIAL 64 /* * Opcode notes: * - * BRANCH The set of branches constituting a single choice are hooked - * together with their "next" pointers, since precedence prevents - * anything being concatenated to any individual branch. The - * "next" pointer of the last BRANCH in a choice points to the - * thing following the whole choice. This is also where the - * final "next" pointer of each individual branch points; each - * branch starts with the operand node of a BRANCH node. + * BRANCH The set of branches constituting a single choice are hooked + * together with their "next" pointers, since precedence prevents + * anything being concatenated to any individual branch. The + * "next" pointer of the last BRANCH in a choice points to the + * thing following the whole choice. This is also where the + * final "next" pointer of each individual branch points; each + * branch starts with the operand node of a BRANCH node. * - * BACK Normal "next" pointers all implicitly point forward; BACK - * exists to make loop structures possible. + * BACK Normal "next" pointers all implicitly point forward; BACK + * exists to make loop structures possible. * - * STAR,PLUS '=', and complex '*' and '+', are implemented as circular - * BRANCH structures using BACK. Simple cases (one character - * per match) are implemented with STAR and PLUS for speed - * and to minimize recursive plunges. + * STAR,PLUS '=', and complex '*' and '+', are implemented as circular + * BRANCH structures using BACK. Simple cases (one character + * per match) are implemented with STAR and PLUS for speed + * and to minimize recursive plunges. * - * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX - * node, and defines the min and max limits to be used for that - * node. + * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX + * node, and defines the min and max limits to be used for that + * node. * - * MOPEN,MCLOSE ...are numbered at compile time. - * ZOPEN,ZCLOSE ...ditto + * MOPEN,MCLOSE ...are numbered at compile time. + * ZOPEN,ZCLOSE ...ditto */ /* @@ -442,7 +431,7 @@ static regsave_T behind_pos; #define OPERAND(p) ((p) + 3) // Obtain an operand that was stored as four bytes, MSB first. #define OPERAND_MIN(p) (((long)(p)[3] << 24) + ((long)(p)[4] << 16) \ - + ((long)(p)[5] << 8) + (long)(p)[6]) + + ((long)(p)[5] << 8) + (long)(p)[6]) // Obtain a second operand stored as four bytes. #define OPERAND_MAX(p) OPERAND_MIN((p) + 4) // Obtain a second single-byte operand stored after a four bytes operand. @@ -451,14 +440,14 @@ static regsave_T behind_pos; static char_u *reg(int paren, int *flagp); #ifdef BT_REGEXP_DUMP -static void regdump(char_u *, bt_regprog_T *); +static void regdump(char_u *, bt_regprog_T *); #endif #ifdef REGEXP_DEBUG -static char_u *regprop(char_u *); +static char_u *regprop(char_u *); -static int regnarrate = 0; +static int regnarrate = 0; #endif #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -469,15 +458,14 @@ static int regnarrate = 0; /* * Setup to parse the regexp. Used once to get the length and once to do it. */ -static void regcomp_start( - char_u *expr, - int re_flags) // see vim_regcomp() +static void regcomp_start(char_u *expr, int re_flags) // see vim_regcomp() { initchr(expr); - if (re_flags & RE_MAGIC) + if (re_flags & RE_MAGIC) { reg_magic = MAGIC_ON; - else + } else { reg_magic = MAGIC_OFF; + } reg_string = (re_flags & RE_STRING); reg_strict = (re_flags & RE_STRICT); get_cpo_flags(); @@ -508,10 +496,11 @@ static bool use_multibytecode(int c) */ static void regc(int b) { - if (regcode == JUST_CALC_SIZE) + if (regcode == JUST_CALC_SIZE) { regsize++; - else + } else { *regcode++ = b; + } } /* @@ -537,12 +526,36 @@ static void reg_equi_class(int c) { switch (c) { // Do not use '\300' style, it results in a negative number. - case 'A': case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: - case 0xc5: case 0x100: case 0x102: case 0x104: case 0x1cd: - case 0x1de: case 0x1e0: case 0x1fa: case 0x202: case 0x226: - case 0x23a: case 0x1e00: case 0x1ea0: case 0x1ea2: case 0x1ea4: - case 0x1ea6: case 0x1ea8: case 0x1eaa: case 0x1eac: case 0x1eae: - case 0x1eb0: case 0x1eb2: case 0x1eb4: case 0x1eb6: + case 'A': + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc4: + case 0xc5: + case 0x100: + case 0x102: + case 0x104: + case 0x1cd: + case 0x1de: + case 0x1e0: + case 0x1fa: + case 0x202: + case 0x226: + case 0x23a: + case 0x1e00: + case 0x1ea0: + case 0x1ea2: + case 0x1ea4: + case 0x1ea6: + case 0x1ea8: + case 0x1eaa: + case 0x1eac: + case 0x1eae: + case 0x1eb0: + case 0x1eb2: + case 0x1eb4: + case 0x1eb6: regmbc('A'); regmbc(0xc0); regmbc(0xc1); regmbc(0xc2); regmbc(0xc3); regmbc(0xc4); regmbc(0xc5); regmbc(0x100); regmbc(0x102); regmbc(0x104); @@ -554,33 +567,71 @@ static void reg_equi_class(int c) regmbc(0x1eae); regmbc(0x1eb0); regmbc(0x1eb2); regmbc(0x1eb4); regmbc(0x1eb6); return; - case 'B': case 0x181: case 0x243: case 0x1e02: - case 0x1e04: case 0x1e06: + case 'B': + case 0x181: + case 0x243: + case 0x1e02: + case 0x1e04: + case 0x1e06: regmbc('B'); regmbc(0x181); regmbc(0x243); regmbc(0x1e02); regmbc(0x1e04); regmbc(0x1e06); return; - case 'C': case 0xc7: - case 0x106: case 0x108: case 0x10a: case 0x10c: case 0x187: - case 0x23b: case 0x1e08: case 0xa792: + case 'C': + case 0xc7: + case 0x106: + case 0x108: + case 0x10a: + case 0x10c: + case 0x187: + case 0x23b: + case 0x1e08: + case 0xa792: regmbc('C'); regmbc(0xc7); regmbc(0x106); regmbc(0x108); regmbc(0x10a); regmbc(0x10c); regmbc(0x187); regmbc(0x23b); regmbc(0x1e08); regmbc(0xa792); return; - case 'D': case 0x10e: case 0x110: case 0x18a: - case 0x1e0a: case 0x1e0c: case 0x1e0e: case 0x1e10: + case 'D': + case 0x10e: + case 0x110: + case 0x18a: + case 0x1e0a: + case 0x1e0c: + case 0x1e0e: + case 0x1e10: case 0x1e12: regmbc('D'); regmbc(0x10e); regmbc(0x110); regmbc(0x18a); regmbc(0x1e0a); regmbc(0x1e0c); regmbc(0x1e0e); regmbc(0x1e10); regmbc(0x1e12); return; - case 'E': case 0xc8: case 0xc9: case 0xca: case 0xcb: - case 0x112: case 0x114: case 0x116: case 0x118: case 0x11a: - case 0x204: case 0x206: case 0x228: case 0x246: case 0x1e14: - case 0x1e16: case 0x1e18: case 0x1e1a: case 0x1e1c: - case 0x1eb8: case 0x1eba: case 0x1ebc: case 0x1ebe: - case 0x1ec0: case 0x1ec2: case 0x1ec4: case 0x1ec6: + case 'E': + case 0xc8: + case 0xc9: + case 0xca: + case 0xcb: + case 0x112: + case 0x114: + case 0x116: + case 0x118: + case 0x11a: + case 0x204: + case 0x206: + case 0x228: + case 0x246: + case 0x1e14: + case 0x1e16: + case 0x1e18: + case 0x1e1a: + case 0x1e1c: + case 0x1eb8: + case 0x1eba: + case 0x1ebc: + case 0x1ebe: + case 0x1ec0: + case 0x1ec2: + case 0x1ec4: + case 0x1ec6: regmbc('E'); regmbc(0xc8); regmbc(0xc9); regmbc(0xca); regmbc(0xcb); regmbc(0x112); regmbc(0x114); regmbc(0x116); regmbc(0x118); @@ -591,30 +642,61 @@ static void reg_equi_class(int c) regmbc(0x1ebc); regmbc(0x1ebe); regmbc(0x1ec0); regmbc(0x1ec2); regmbc(0x1ec4); regmbc(0x1ec6); return; - case 'F': case 0x191: case 0x1e1e: case 0xa798: + case 'F': + case 0x191: + case 0x1e1e: + case 0xa798: regmbc('F'); regmbc(0x191); regmbc(0x1e1e); regmbc(0xa798); return; - case 'G': case 0x11c: case 0x11e: case 0x120: - case 0x122: case 0x193: case 0x1e4: case 0x1e6: - case 0x1f4: case 0x1e20: case 0xa7a0: + case 'G': + case 0x11c: + case 0x11e: + case 0x120: + case 0x122: + case 0x193: + case 0x1e4: + case 0x1e6: + case 0x1f4: + case 0x1e20: + case 0xa7a0: regmbc('G'); regmbc(0x11c); regmbc(0x11e); regmbc(0x120); regmbc(0x122); regmbc(0x193); regmbc(0x1e4); regmbc(0x1e6); regmbc(0x1f4); regmbc(0x1e20); regmbc(0xa7a0); return; - case 'H': case 0x124: case 0x126: case 0x21e: - case 0x1e22: case 0x1e24: case 0x1e26: - case 0x1e28: case 0x1e2a: case 0x2c67: + case 'H': + case 0x124: + case 0x126: + case 0x21e: + case 0x1e22: + case 0x1e24: + case 0x1e26: + case 0x1e28: + case 0x1e2a: + case 0x2c67: regmbc('H'); regmbc(0x124); regmbc(0x126); regmbc(0x21e); regmbc(0x1e22); regmbc(0x1e24); regmbc(0x1e26); regmbc(0x1e28); regmbc(0x1e2a); regmbc(0x2c67); return; - case 'I': case 0xcc: case 0xcd: case 0xce: case 0xcf: - case 0x128: case 0x12a: case 0x12c: case 0x12e: - case 0x130: case 0x197: case 0x1cf: case 0x208: - case 0x20a: case 0x1e2c: case 0x1e2e: case 0x1ec8: + case 'I': + case 0xcc: + case 0xcd: + case 0xce: + case 0xcf: + case 0x128: + case 0x12a: + case 0x12c: + case 0x12e: + case 0x130: + case 0x197: + case 0x1cf: + case 0x208: + case 0x20a: + case 0x1e2c: + case 0x1e2e: + case 0x1ec8: case 0x1eca: regmbc('I'); regmbc(0xcc); regmbc(0xcd); regmbc(0xce); regmbc(0xcf); regmbc(0x128); @@ -623,44 +705,102 @@ static void reg_equi_class(int c) regmbc(0x208); regmbc(0x20a); regmbc(0x1e2c); regmbc(0x1e2e); regmbc(0x1ec8); regmbc(0x1eca); return; - case 'J': case 0x134: case 0x248: + case 'J': + case 0x134: + case 0x248: regmbc('J'); regmbc(0x134); regmbc(0x248); return; - case 'K': case 0x136: case 0x198: case 0x1e8: case 0x1e30: - case 0x1e32: case 0x1e34: case 0x2c69: case 0xa740: + case 'K': + case 0x136: + case 0x198: + case 0x1e8: + case 0x1e30: + case 0x1e32: + case 0x1e34: + case 0x2c69: + case 0xa740: regmbc('K'); regmbc(0x136); regmbc(0x198); regmbc(0x1e8); regmbc(0x1e30); regmbc(0x1e32); regmbc(0x1e34); regmbc(0x2c69); regmbc(0xa740); return; - case 'L': case 0x139: case 0x13b: case 0x13d: case 0x13f: - case 0x141: case 0x23d: case 0x1e36: case 0x1e38: - case 0x1e3a: case 0x1e3c: case 0x2c60: + case 'L': + case 0x139: + case 0x13b: + case 0x13d: + case 0x13f: + case 0x141: + case 0x23d: + case 0x1e36: + case 0x1e38: + case 0x1e3a: + case 0x1e3c: + case 0x2c60: regmbc('L'); regmbc(0x139); regmbc(0x13b); regmbc(0x13d); regmbc(0x13f); regmbc(0x141); regmbc(0x23d); regmbc(0x1e36); regmbc(0x1e38); regmbc(0x1e3a); regmbc(0x1e3c); regmbc(0x2c60); return; - case 'M': case 0x1e3e: case 0x1e40: case 0x1e42: + case 'M': + case 0x1e3e: + case 0x1e40: + case 0x1e42: regmbc('M'); regmbc(0x1e3e); regmbc(0x1e40); regmbc(0x1e42); return; - case 'N': case 0xd1: - case 0x143: case 0x145: case 0x147: case 0x1f8: - case 0x1e44: case 0x1e46: case 0x1e48: case 0x1e4a: + case 'N': + case 0xd1: + case 0x143: + case 0x145: + case 0x147: + case 0x1f8: + case 0x1e44: + case 0x1e46: + case 0x1e48: + case 0x1e4a: case 0xa7a4: regmbc('N'); regmbc(0xd1); regmbc(0x143); regmbc(0x145); regmbc(0x147); regmbc(0x1f8); regmbc(0x1e44); regmbc(0x1e46); regmbc(0x1e48); regmbc(0x1e4a); regmbc(0xa7a4); return; - case 'O': case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: - case 0xd8: case 0x14c: case 0x14e: case 0x150: case 0x19f: - case 0x1a0: case 0x1d1: case 0x1ea: case 0x1ec: case 0x1fe: - case 0x20c: case 0x20e: case 0x22a: case 0x22c: case 0x22e: - case 0x230: case 0x1e4c: case 0x1e4e: case 0x1e50: case 0x1e52: - case 0x1ecc: case 0x1ece: case 0x1ed0: case 0x1ed2: case 0x1ed4: - case 0x1ed6: case 0x1ed8: case 0x1eda: case 0x1edc: case 0x1ede: - case 0x1ee0: case 0x1ee2: + case 'O': + case 0xd2: + case 0xd3: + case 0xd4: + case 0xd5: + case 0xd6: + case 0xd8: + case 0x14c: + case 0x14e: + case 0x150: + case 0x19f: + case 0x1a0: + case 0x1d1: + case 0x1ea: + case 0x1ec: + case 0x1fe: + case 0x20c: + case 0x20e: + case 0x22a: + case 0x22c: + case 0x22e: + case 0x230: + case 0x1e4c: + case 0x1e4e: + case 0x1e50: + case 0x1e52: + case 0x1ecc: + case 0x1ece: + case 0x1ed0: + case 0x1ed2: + case 0x1ed4: + case 0x1ed6: + case 0x1ed8: + case 0x1eda: + case 0x1edc: + case 0x1ede: + case 0x1ee0: + case 0x1ee2: regmbc('O'); regmbc(0xd2); regmbc(0xd3); regmbc(0xd4); regmbc(0xd5); regmbc(0xd6); regmbc(0xd8); regmbc(0x14c); regmbc(0x14e); regmbc(0x150); @@ -675,47 +815,105 @@ static void reg_equi_class(int c) regmbc(0x1edc); regmbc(0x1ede); regmbc(0x1ee0); regmbc(0x1ee2); return; - case 'P': case 0x1a4: case 0x1e54: case 0x1e56: case 0x2c63: + case 'P': + case 0x1a4: + case 0x1e54: + case 0x1e56: + case 0x2c63: regmbc('P'); regmbc(0x1a4); regmbc(0x1e54); regmbc(0x1e56); regmbc(0x2c63); return; - case 'Q': case 0x24a: + case 'Q': + case 0x24a: regmbc('Q'); regmbc(0x24a); return; - case 'R': case 0x154: case 0x156: case 0x158: case 0x210: - case 0x212: case 0x24c: case 0x1e58: case 0x1e5a: - case 0x1e5c: case 0x1e5e: case 0x2c64: case 0xa7a6: + case 'R': + case 0x154: + case 0x156: + case 0x158: + case 0x210: + case 0x212: + case 0x24c: + case 0x1e58: + case 0x1e5a: + case 0x1e5c: + case 0x1e5e: + case 0x2c64: + case 0xa7a6: regmbc('R'); regmbc(0x154); regmbc(0x156); regmbc(0x210); regmbc(0x212); regmbc(0x158); regmbc(0x24c); regmbc(0x1e58); regmbc(0x1e5a); regmbc(0x1e5c); regmbc(0x1e5e); regmbc(0x2c64); regmbc(0xa7a6); return; - case 'S': case 0x15a: case 0x15c: case 0x15e: case 0x160: - case 0x218: case 0x1e60: case 0x1e62: case 0x1e64: - case 0x1e66: case 0x1e68: case 0x2c7e: case 0xa7a8: + case 'S': + case 0x15a: + case 0x15c: + case 0x15e: + case 0x160: + case 0x218: + case 0x1e60: + case 0x1e62: + case 0x1e64: + case 0x1e66: + case 0x1e68: + case 0x2c7e: + case 0xa7a8: regmbc('S'); regmbc(0x15a); regmbc(0x15c); regmbc(0x15e); regmbc(0x160); regmbc(0x218); regmbc(0x1e60); regmbc(0x1e62); regmbc(0x1e64); regmbc(0x1e66); regmbc(0x1e68); regmbc(0x2c7e); regmbc(0xa7a8); return; - case 'T': case 0x162: case 0x164: case 0x166: case 0x1ac: - case 0x1ae: case 0x21a: case 0x23e: case 0x1e6a: case 0x1e6c: - case 0x1e6e: case 0x1e70: + case 'T': + case 0x162: + case 0x164: + case 0x166: + case 0x1ac: + case 0x1ae: + case 0x21a: + case 0x23e: + case 0x1e6a: + case 0x1e6c: + case 0x1e6e: + case 0x1e70: regmbc('T'); regmbc(0x162); regmbc(0x164); regmbc(0x166); regmbc(0x1ac); regmbc(0x23e); regmbc(0x1ae); regmbc(0x21a); regmbc(0x1e6a); regmbc(0x1e6c); regmbc(0x1e6e); regmbc(0x1e70); return; - case 'U': case 0xd9: case 0xda: case 0xdb: case 0xdc: - case 0x168: case 0x16a: case 0x16c: case 0x16e: - case 0x170: case 0x172: case 0x1af: case 0x1d3: - case 0x1d5: case 0x1d7: case 0x1d9: case 0x1db: - case 0x214: case 0x216: case 0x244: case 0x1e72: - case 0x1e74: case 0x1e76: case 0x1e78: case 0x1e7a: - case 0x1ee4: case 0x1ee6: case 0x1ee8: case 0x1eea: - case 0x1eec: case 0x1eee: case 0x1ef0: + case 'U': + case 0xd9: + case 0xda: + case 0xdb: + case 0xdc: + case 0x168: + case 0x16a: + case 0x16c: + case 0x16e: + case 0x170: + case 0x172: + case 0x1af: + case 0x1d3: + case 0x1d5: + case 0x1d7: + case 0x1d9: + case 0x1db: + case 0x214: + case 0x216: + case 0x244: + case 0x1e72: + case 0x1e74: + case 0x1e76: + case 0x1e78: + case 0x1e7a: + case 0x1ee4: + case 0x1ee6: + case 0x1ee8: + case 0x1eea: + case 0x1eec: + case 0x1eee: + case 0x1ef0: regmbc('U'); regmbc(0xd9); regmbc(0xda); regmbc(0xdb); regmbc(0xdc); regmbc(0x168); regmbc(0x16a); regmbc(0x16c); regmbc(0x16e); @@ -728,41 +926,92 @@ static void reg_equi_class(int c) regmbc(0x1ee8); regmbc(0x1eea); regmbc(0x1eec); regmbc(0x1eee); regmbc(0x1ef0); return; - case 'V': case 0x1b2: case 0x1e7c: case 0x1e7e: + case 'V': + case 0x1b2: + case 0x1e7c: + case 0x1e7e: regmbc('V'); regmbc(0x1b2); regmbc(0x1e7c); regmbc(0x1e7e); return; - case 'W': case 0x174: case 0x1e80: case 0x1e82: - case 0x1e84: case 0x1e86: case 0x1e88: + case 'W': + case 0x174: + case 0x1e80: + case 0x1e82: + case 0x1e84: + case 0x1e86: + case 0x1e88: regmbc('W'); regmbc(0x174); regmbc(0x1e80); regmbc(0x1e82); regmbc(0x1e84); regmbc(0x1e86); regmbc(0x1e88); return; - case 'X': case 0x1e8a: case 0x1e8c: + case 'X': + case 0x1e8a: + case 0x1e8c: regmbc('X'); regmbc(0x1e8a); regmbc(0x1e8c); return; - case 'Y': case 0xdd: - case 0x176: case 0x178: case 0x1b3: case 0x232: case 0x24e: - case 0x1e8e: case 0x1ef2: case 0x1ef6: case 0x1ef4: case 0x1ef8: + case 'Y': + case 0xdd: + case 0x176: + case 0x178: + case 0x1b3: + case 0x232: + case 0x24e: + case 0x1e8e: + case 0x1ef2: + case 0x1ef6: + case 0x1ef4: + case 0x1ef8: regmbc('Y'); regmbc(0xdd); regmbc(0x176); regmbc(0x178); regmbc(0x1b3); regmbc(0x232); regmbc(0x24e); regmbc(0x1e8e); regmbc(0x1ef2); regmbc(0x1ef4); regmbc(0x1ef6); regmbc(0x1ef8); return; - case 'Z': case 0x179: case 0x17b: case 0x17d: case 0x1b5: - case 0x1e90: case 0x1e92: case 0x1e94: case 0x2c6b: + case 'Z': + case 0x179: + case 0x17b: + case 0x17d: + case 0x1b5: + case 0x1e90: + case 0x1e92: + case 0x1e94: + case 0x2c6b: regmbc('Z'); regmbc(0x179); regmbc(0x17b); regmbc(0x17d); regmbc(0x1b5); regmbc(0x1e90); regmbc(0x1e92); regmbc(0x1e94); regmbc(0x2c6b); return; - case 'a': case 0xe0: case 0xe1: case 0xe2: - case 0xe3: case 0xe4: case 0xe5: case 0x101: case 0x103: - case 0x105: case 0x1ce: case 0x1df: case 0x1e1: case 0x1fb: - case 0x201: case 0x203: case 0x227: case 0x1d8f: case 0x1e01: - case 0x1e9a: case 0x1ea1: case 0x1ea3: case 0x1ea5: - case 0x1ea7: case 0x1ea9: case 0x1eab: case 0x1ead: - case 0x1eaf: case 0x1eb1: case 0x1eb3: case 0x1eb5: - case 0x1eb7: case 0x2c65: + case 'a': + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0x101: + case 0x103: + case 0x105: + case 0x1ce: + case 0x1df: + case 0x1e1: + case 0x1fb: + case 0x201: + case 0x203: + case 0x227: + case 0x1d8f: + case 0x1e01: + case 0x1e9a: + case 0x1ea1: + case 0x1ea3: + case 0x1ea5: + case 0x1ea7: + case 0x1ea9: + case 0x1eab: + case 0x1ead: + case 0x1eaf: + case 0x1eb1: + case 0x1eb3: + case 0x1eb5: + case 0x1eb7: + case 0x2c65: regmbc('a'); regmbc(0xe0); regmbc(0xe1); regmbc(0xe2); regmbc(0xe3); regmbc(0xe4); regmbc(0xe5); regmbc(0x101); regmbc(0x103); @@ -775,36 +1024,80 @@ static void reg_equi_class(int c) regmbc(0x1eaf); regmbc(0x1eb1); regmbc(0x1eb3); regmbc(0x1eb5); regmbc(0x1eb7); regmbc(0x2c65); return; - case 'b': case 0x180: case 0x253: case 0x1d6c: case 0x1d80: - case 0x1e03: case 0x1e05: case 0x1e07: + case 'b': + case 0x180: + case 0x253: + case 0x1d6c: + case 0x1d80: + case 0x1e03: + case 0x1e05: + case 0x1e07: regmbc('b'); regmbc(0x180); regmbc(0x253); regmbc(0x1d6c); regmbc(0x1d80); regmbc(0x1e03); regmbc(0x1e05); regmbc(0x1e07); return; - case 'c': case 0xe7: - case 0x107: case 0x109: case 0x10b: case 0x10d: case 0x188: - case 0x23c: case 0x1e09: case 0xa793: case 0xa794: + case 'c': + case 0xe7: + case 0x107: + case 0x109: + case 0x10b: + case 0x10d: + case 0x188: + case 0x23c: + case 0x1e09: + case 0xa793: + case 0xa794: regmbc('c'); regmbc(0xe7); regmbc(0x107); regmbc(0x109); regmbc(0x10b); regmbc(0x10d); regmbc(0x188); regmbc(0x23c); regmbc(0x1e09); regmbc(0xa793); regmbc(0xa794); return; - case 'd': case 0x10f: case 0x111: case 0x257: case 0x1d6d: - case 0x1d81: case 0x1d91: case 0x1e0b: case 0x1e0d: - case 0x1e0f: case 0x1e11: case 0x1e13: + case 'd': + case 0x10f: + case 0x111: + case 0x257: + case 0x1d6d: + case 0x1d81: + case 0x1d91: + case 0x1e0b: + case 0x1e0d: + case 0x1e0f: + case 0x1e11: + case 0x1e13: regmbc('d'); regmbc(0x10f); regmbc(0x111); regmbc(0x257); regmbc(0x1d6d); regmbc(0x1d81); regmbc(0x1d91); regmbc(0x1e0b); regmbc(0x1e0d); regmbc(0x1e0f); regmbc(0x1e11); regmbc(0x1e13); return; - case 'e': case 0xe8: case 0xe9: case 0xea: case 0xeb: - case 0x113: case 0x115: case 0x117: case 0x119: - case 0x11b: case 0x205: case 0x207: case 0x229: - case 0x247: case 0x1d92: case 0x1e15: case 0x1e17: - case 0x1e19: case 0x1e1b: case 0x1eb9: case 0x1ebb: - case 0x1e1d: case 0x1ebd: case 0x1ebf: case 0x1ec1: - case 0x1ec3: case 0x1ec5: case 0x1ec7: + case 'e': + case 0xe8: + case 0xe9: + case 0xea: + case 0xeb: + case 0x113: + case 0x115: + case 0x117: + case 0x119: + case 0x11b: + case 0x205: + case 0x207: + case 0x229: + case 0x247: + case 0x1d92: + case 0x1e15: + case 0x1e17: + case 0x1e19: + case 0x1e1b: + case 0x1eb9: + case 0x1ebb: + case 0x1e1d: + case 0x1ebd: + case 0x1ebf: + case 0x1ec1: + case 0x1ec3: + case 0x1ec5: + case 0x1ec7: regmbc('e'); regmbc(0xe8); regmbc(0xe9); regmbc(0xea); regmbc(0xeb); regmbc(0x113); regmbc(0x115); regmbc(0x117); regmbc(0x119); @@ -816,31 +1109,66 @@ static void reg_equi_class(int c) regmbc(0x1ec1); regmbc(0x1ec3); regmbc(0x1ec5); regmbc(0x1ec7); return; - case 'f': case 0x192: case 0x1d6e: case 0x1d82: - case 0x1e1f: case 0xa799: + case 'f': + case 0x192: + case 0x1d6e: + case 0x1d82: + case 0x1e1f: + case 0xa799: regmbc('f'); regmbc(0x192); regmbc(0x1d6e); regmbc(0x1d82); regmbc(0x1e1f); regmbc(0xa799); return; - case 'g': case 0x11d: case 0x11f: case 0x121: case 0x123: - case 0x1e5: case 0x1e7: case 0x260: case 0x1f5: case 0x1d83: - case 0x1e21: case 0xa7a1: + case 'g': + case 0x11d: + case 0x11f: + case 0x121: + case 0x123: + case 0x1e5: + case 0x1e7: + case 0x260: + case 0x1f5: + case 0x1d83: + case 0x1e21: + case 0xa7a1: regmbc('g'); regmbc(0x11d); regmbc(0x11f); regmbc(0x121); regmbc(0x123); regmbc(0x1e5); regmbc(0x1e7); regmbc(0x1f5); regmbc(0x260); regmbc(0x1d83); regmbc(0x1e21); regmbc(0xa7a1); return; - case 'h': case 0x125: case 0x127: case 0x21f: case 0x1e23: - case 0x1e25: case 0x1e27: case 0x1e29: case 0x1e2b: - case 0x1e96: case 0x2c68: case 0xa795: + case 'h': + case 0x125: + case 0x127: + case 0x21f: + case 0x1e23: + case 0x1e25: + case 0x1e27: + case 0x1e29: + case 0x1e2b: + case 0x1e96: + case 0x2c68: + case 0xa795: regmbc('h'); regmbc(0x125); regmbc(0x127); regmbc(0x21f); regmbc(0x1e23); regmbc(0x1e25); regmbc(0x1e27); regmbc(0x1e29); regmbc(0x1e2b); regmbc(0x1e96); regmbc(0x2c68); regmbc(0xa795); return; - case 'i': case 0xec: case 0xed: case 0xee: case 0xef: - case 0x129: case 0x12b: case 0x12d: case 0x12f: - case 0x1d0: case 0x209: case 0x20b: case 0x268: - case 0x1d96: case 0x1e2d: case 0x1e2f: case 0x1ec9: + case 'i': + case 0xec: + case 0xed: + case 0xee: + case 0xef: + case 0x129: + case 0x12b: + case 0x12d: + case 0x12f: + case 0x1d0: + case 0x209: + case 0x20b: + case 0x268: + case 0x1d96: + case 0x1e2d: + case 0x1e2f: + case 0x1ec9: case 0x1ecb: regmbc('i'); regmbc(0xec); regmbc(0xed); regmbc(0xee); regmbc(0xef); regmbc(0x129); @@ -849,33 +1177,66 @@ static void reg_equi_class(int c) regmbc(0x268); regmbc(0x1d96); regmbc(0x1e2d); regmbc(0x1e2f); regmbc(0x1ec9); regmbc(0x1ecb); return; - case 'j': case 0x135: case 0x1f0: case 0x249: + case 'j': + case 0x135: + case 0x1f0: + case 0x249: regmbc('j'); regmbc(0x135); regmbc(0x1f0); regmbc(0x249); return; - case 'k': case 0x137: case 0x199: case 0x1e9: - case 0x1d84: case 0x1e31: case 0x1e33: case 0x1e35: - case 0x2c6a: case 0xa741: + case 'k': + case 0x137: + case 0x199: + case 0x1e9: + case 0x1d84: + case 0x1e31: + case 0x1e33: + case 0x1e35: + case 0x2c6a: + case 0xa741: regmbc('k'); regmbc(0x137); regmbc(0x199); regmbc(0x1e9); regmbc(0x1d84); regmbc(0x1e31); regmbc(0x1e33); regmbc(0x1e35); regmbc(0x2c6a); regmbc(0xa741); return; - case 'l': case 0x13a: case 0x13c: case 0x13e: - case 0x140: case 0x142: case 0x19a: case 0x1e37: - case 0x1e39: case 0x1e3b: case 0x1e3d: case 0x2c61: + case 'l': + case 0x13a: + case 0x13c: + case 0x13e: + case 0x140: + case 0x142: + case 0x19a: + case 0x1e37: + case 0x1e39: + case 0x1e3b: + case 0x1e3d: + case 0x2c61: regmbc('l'); regmbc(0x13a); regmbc(0x13c); regmbc(0x13e); regmbc(0x140); regmbc(0x142); regmbc(0x19a); regmbc(0x1e37); regmbc(0x1e39); regmbc(0x1e3b); regmbc(0x1e3d); regmbc(0x2c61); return; - case 'm': case 0x1d6f: case 0x1e3f: case 0x1e41: case 0x1e43: + case 'm': + case 0x1d6f: + case 0x1e3f: + case 0x1e41: + case 0x1e43: regmbc('m'); regmbc(0x1d6f); regmbc(0x1e3f); regmbc(0x1e41); regmbc(0x1e43); return; - case 'n': case 0xf1: case 0x144: case 0x146: case 0x148: - case 0x149: case 0x1f9: case 0x1d70: case 0x1d87: - case 0x1e45: case 0x1e47: case 0x1e49: case 0x1e4b: + case 'n': + case 0xf1: + case 0x144: + case 0x146: + case 0x148: + case 0x149: + case 0x1f9: + case 0x1d70: + case 0x1d87: + case 0x1e45: + case 0x1e47: + case 0x1e49: + case 0x1e4b: case 0xa7a5: regmbc('n'); regmbc(0xf1); regmbc(0x144); regmbc(0x146); regmbc(0x148); regmbc(0x149); @@ -883,15 +1244,44 @@ static void reg_equi_class(int c) regmbc(0x1e45); regmbc(0x1e47); regmbc(0x1e49); regmbc(0x1e4b); regmbc(0xa7a5); return; - case 'o': case 0xf2: case 0xf3: case 0xf4: case 0xf5: - case 0xf6: case 0xf8: case 0x14d: case 0x14f: case 0x151: - case 0x1a1: case 0x1d2: case 0x1eb: case 0x1ed: case 0x1ff: - case 0x20d: case 0x20f: case 0x22b: case 0x22d: case 0x22f: - case 0x231: case 0x275: case 0x1e4d: case 0x1e4f: - case 0x1e51: case 0x1e53: case 0x1ecd: case 0x1ecf: - case 0x1ed1: case 0x1ed3: case 0x1ed5: case 0x1ed7: - case 0x1ed9: case 0x1edb: case 0x1edd: case 0x1edf: - case 0x1ee1: case 0x1ee3: + case 'o': + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf8: + case 0x14d: + case 0x14f: + case 0x151: + case 0x1a1: + case 0x1d2: + case 0x1eb: + case 0x1ed: + case 0x1ff: + case 0x20d: + case 0x20f: + case 0x22b: + case 0x22d: + case 0x22f: + case 0x231: + case 0x275: + case 0x1e4d: + case 0x1e4f: + case 0x1e51: + case 0x1e53: + case 0x1ecd: + case 0x1ecf: + case 0x1ed1: + case 0x1ed3: + case 0x1ed5: + case 0x1ed7: + case 0x1ed9: + case 0x1edb: + case 0x1edd: + case 0x1edf: + case 0x1ee1: + case 0x1ee3: regmbc('o'); regmbc(0xf2); regmbc(0xf3); regmbc(0xf4); regmbc(0xf5); regmbc(0xf6); regmbc(0xf8); regmbc(0x14d); regmbc(0x14f); @@ -906,18 +1296,37 @@ static void reg_equi_class(int c) regmbc(0x1edb); regmbc(0x1edd); regmbc(0x1edf); regmbc(0x1ee1); regmbc(0x1ee3); return; - case 'p': case 0x1a5: case 0x1d71: case 0x1d88: case 0x1d7d: - case 0x1e55: case 0x1e57: + case 'p': + case 0x1a5: + case 0x1d71: + case 0x1d88: + case 0x1d7d: + case 0x1e55: + case 0x1e57: regmbc('p'); regmbc(0x1a5); regmbc(0x1d71); regmbc(0x1d7d); regmbc(0x1d88); regmbc(0x1e55); regmbc(0x1e57); return; - case 'q': case 0x24b: case 0x2a0: + case 'q': + case 0x24b: + case 0x2a0: regmbc('q'); regmbc(0x24b); regmbc(0x2a0); return; - case 'r': case 0x155: case 0x157: case 0x159: case 0x211: - case 0x213: case 0x24d: case 0x27d: case 0x1d72: case 0x1d73: - case 0x1d89: case 0x1e59: case 0x1e5b: case 0x1e5d: case 0x1e5f: + case 'r': + case 0x155: + case 0x157: + case 0x159: + case 0x211: + case 0x213: + case 0x24d: + case 0x27d: + case 0x1d72: + case 0x1d73: + case 0x1d89: + case 0x1e59: + case 0x1e5b: + case 0x1e5d: + case 0x1e5f: case 0xa7a7: regmbc('r'); regmbc(0x155); regmbc(0x157); regmbc(0x159); regmbc(0x211); regmbc(0x213); @@ -926,32 +1335,81 @@ static void reg_equi_class(int c) regmbc(0x1e5b); regmbc(0x1e5d); regmbc(0x1e5f); regmbc(0xa7a7); return; - case 's': case 0x15b: case 0x15d: case 0x15f: case 0x161: - case 0x1e61: case 0x219: case 0x23f: case 0x1d74: case 0x1d8a: - case 0x1e63: case 0x1e65: case 0x1e67: case 0x1e69: case 0xa7a9: + case 's': + case 0x15b: + case 0x15d: + case 0x15f: + case 0x161: + case 0x1e61: + case 0x219: + case 0x23f: + case 0x1d74: + case 0x1d8a: + case 0x1e63: + case 0x1e65: + case 0x1e67: + case 0x1e69: + case 0xa7a9: regmbc('s'); regmbc(0x15b); regmbc(0x15d); regmbc(0x15f); regmbc(0x161); regmbc(0x23f); regmbc(0x219); regmbc(0x1d74); regmbc(0x1d8a); regmbc(0x1e61); regmbc(0x1e63); regmbc(0x1e65); regmbc(0x1e67); regmbc(0x1e69); regmbc(0xa7a9); return; - case 't': case 0x163: case 0x165: case 0x167: case 0x1ab: - case 0x1ad: case 0x21b: case 0x288: case 0x1d75: case 0x1e6b: - case 0x1e6d: case 0x1e6f: case 0x1e71: case 0x1e97: case 0x2c66: + case 't': + case 0x163: + case 0x165: + case 0x167: + case 0x1ab: + case 0x1ad: + case 0x21b: + case 0x288: + case 0x1d75: + case 0x1e6b: + case 0x1e6d: + case 0x1e6f: + case 0x1e71: + case 0x1e97: + case 0x2c66: regmbc('t'); regmbc(0x163); regmbc(0x165); regmbc(0x167); regmbc(0x1ab); regmbc(0x21b); regmbc(0x1ad); regmbc(0x288); regmbc(0x1d75); regmbc(0x1e6b); regmbc(0x1e6d); regmbc(0x1e6f); regmbc(0x1e71); regmbc(0x1e97); regmbc(0x2c66); return; - case 'u': case 0xf9: case 0xfa: case 0xfb: case 0xfc: - case 0x169: case 0x16b: case 0x16d: case 0x16f: - case 0x171: case 0x173: case 0x1b0: case 0x1d4: - case 0x1d6: case 0x1d8: case 0x1da: case 0x1dc: - case 0x215: case 0x217: case 0x289: case 0x1e73: - case 0x1d7e: case 0x1d99: case 0x1e75: case 0x1e77: - case 0x1e79: case 0x1e7b: case 0x1ee5: case 0x1ee7: - case 0x1ee9: case 0x1eeb: case 0x1eed: case 0x1eef: + case 'u': + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0x169: + case 0x16b: + case 0x16d: + case 0x16f: + case 0x171: + case 0x173: + case 0x1b0: + case 0x1d4: + case 0x1d6: + case 0x1d8: + case 0x1da: + case 0x1dc: + case 0x215: + case 0x217: + case 0x289: + case 0x1e73: + case 0x1d7e: + case 0x1d99: + case 0x1e75: + case 0x1e77: + case 0x1e79: + case 0x1e7b: + case 0x1ee5: + case 0x1ee7: + case 0x1ee9: + case 0x1eeb: + case 0x1eed: + case 0x1eef: case 0x1ef1: regmbc('u'); regmbc(0xf9); regmbc(0xfa); regmbc(0xfb); regmbc(0xfc); regmbc(0x169); @@ -966,31 +1424,61 @@ static void reg_equi_class(int c) regmbc(0x1eeb); regmbc(0x1eed); regmbc(0x1eef); regmbc(0x1ef1); return; - case 'v': case 0x28b: case 0x1d8c: case 0x1e7d: case 0x1e7f: + case 'v': + case 0x28b: + case 0x1d8c: + case 0x1e7d: + case 0x1e7f: regmbc('v'); regmbc(0x28b); regmbc(0x1d8c); regmbc(0x1e7d); regmbc(0x1e7f); return; - case 'w': case 0x175: case 0x1e81: case 0x1e83: - case 0x1e85: case 0x1e87: case 0x1e89: case 0x1e98: + case 'w': + case 0x175: + case 0x1e81: + case 0x1e83: + case 0x1e85: + case 0x1e87: + case 0x1e89: + case 0x1e98: regmbc('w'); regmbc(0x175); regmbc(0x1e81); regmbc(0x1e83); regmbc(0x1e85); regmbc(0x1e87); regmbc(0x1e89); regmbc(0x1e98); return; - case 'x': case 0x1e8b: case 0x1e8d: + case 'x': + case 0x1e8b: + case 0x1e8d: regmbc('x'); regmbc(0x1e8b); regmbc(0x1e8d); return; - case 'y': case 0xfd: case 0xff: case 0x177: case 0x1b4: - case 0x233: case 0x24f: case 0x1e8f: case 0x1e99: case 0x1ef3: - case 0x1ef5: case 0x1ef7: case 0x1ef9: + case 'y': + case 0xfd: + case 0xff: + case 0x177: + case 0x1b4: + case 0x233: + case 0x24f: + case 0x1e8f: + case 0x1e99: + case 0x1ef3: + case 0x1ef5: + case 0x1ef7: + case 0x1ef9: regmbc('y'); regmbc(0xfd); regmbc(0xff); regmbc(0x177); regmbc(0x1b4); regmbc(0x233); regmbc(0x24f); regmbc(0x1e8f); regmbc(0x1e99); regmbc(0x1ef3); regmbc(0x1ef5); regmbc(0x1ef7); regmbc(0x1ef9); return; - case 'z': case 0x17a: case 0x17c: case 0x17e: case 0x1b6: - case 0x1d76: case 0x1d8e: case 0x1e91: case 0x1e93: - case 0x1e95: case 0x2c6c: + case 'z': + case 0x17a: + case 0x17c: + case 0x17e: + case 0x1b6: + case 0x1d76: + case 0x1d8e: + case 0x1e91: + case 0x1e93: + case 0x1e95: + case 0x2c6c: regmbc('z'); regmbc(0x17a); regmbc(0x17c); regmbc(0x17e); regmbc(0x1b6); regmbc(0x1d76); regmbc(0x1d8e); regmbc(0x1e91); regmbc(0x1e93); @@ -1002,19 +1490,18 @@ static void reg_equi_class(int c) } - /* * Emit a node. * Return pointer to generated code. */ static char_u *regnode(int op) { - char_u *ret; + char_u *ret; ret = regcode; - if (ret == JUST_CALC_SIZE) + if (ret == JUST_CALC_SIZE) { regsize += 3; - else { + } else { *regcode++ = op; *regcode++ = NUL; // Null "next" pointer. *regcode++ = NUL; @@ -1044,17 +1531,20 @@ static char_u *regnext(char_u *p) { int offset; - if (p == JUST_CALC_SIZE || reg_toolong) + if (p == JUST_CALC_SIZE || reg_toolong) { return NULL; + } offset = NEXT(p); - if (offset == 0) + if (offset == 0) { return NULL; + } - if (OP(p) == BACK) + if (OP(p) == BACK) { return p - offset; - else + } else { return p + offset; + } } // Set the next-pointer at the end of a node chain. @@ -1068,7 +1558,7 @@ static void regtail(char_u *p, char_u *val) // Find last node. char_u *scan = p; - for (;; ) { + for (;;) { char_u *temp = regnext(scan); if (temp == NULL) { break; @@ -1100,8 +1590,9 @@ static void regoptail(char_u *p, char_u *val) // When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" if (p == NULL || p == JUST_CALC_SIZE || (OP(p) != BRANCH - && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9))) + && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9))) { return; + } regtail(OPERAND(p), val); } @@ -1113,9 +1604,9 @@ static void regoptail(char_u *p, char_u *val) */ static void reginsert(int op, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 3; @@ -1124,8 +1615,9 @@ static void reginsert(int op, char_u *opnd) src = regcode; regcode += 3; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1139,9 +1631,9 @@ static void reginsert(int op, char_u *opnd) */ static void reginsert_nr(int op, long val, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 7; @@ -1150,8 +1642,9 @@ static void reginsert_nr(int op, long val, char_u *opnd) src = regcode; regcode += 7; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1169,9 +1662,9 @@ static void reginsert_nr(int op, long val, char_u *opnd) */ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 11; @@ -1180,8 +1673,9 @@ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) src = regcode; regcode += 11; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1201,15 +1695,15 @@ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) static int seen_endbrace(int refnum) { if (!had_endbrace[refnum]) { - char_u *p; + char_u *p; - // Trick: check if "@<=" or "@<!" follows, in which case - // the \1 can appear before the referenced match. - for (p = regparse; *p != NUL; p++) { - if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '=')) { - break; - } + // Trick: check if "@<=" or "@<!" follows, in which case + // the \1 can appear before the referenced match. + for (p = regparse; *p != NUL; p++) { + if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '=')) { + break; } + } if (*p == NUL) { emsg(_("E65: Illegal back reference")); @@ -1229,10 +1723,10 @@ static int seen_endbrace(int refnum) */ static char_u *regatom(int *flagp) { - char_u *ret; + char_u *ret; int flags; int c; - char_u *p; + char_u *p; int extra = 0; int save_prev_at_start = prev_at_start; @@ -1273,10 +1767,11 @@ static char_u *regatom(int *flagp) *flagp |= HASNL; // "\_[" is character range plus newline - if (c == '[') + if (c == '[') { goto collection; + } - // "\_x" is character class plus newline + // "\_x" is character class plus newline FALLTHROUGH; // Character classes. @@ -1307,9 +1802,10 @@ static char_u *regatom(int *flagp) case Magic('L'): case Magic('u'): case Magic('U'): - p = vim_strchr(classchars, no_Magic(c)); - if (p == NULL) + p = (char_u *)vim_strchr((char *)classchars, no_Magic(c)); + if (p == NULL) { EMSG_RET_NULL(_("E63: invalid use of \\_")); + } // When '.' is followed by a composing char ignore the dot, so that // the composing char is matched here. if (c == Magic('.') && utf_iscomposing(peekchr())) { @@ -1335,11 +1831,13 @@ static char_u *regatom(int *flagp) break; case Magic('('): - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_PAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH); break; @@ -1347,8 +1845,9 @@ static char_u *regatom(int *flagp) case Magic('|'): case Magic('&'): case Magic(')'): - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } IEMSG_RET_NULL(_(e_internal)); // Supposed to be caught earlier. // NOTREACHED @@ -1365,20 +1864,23 @@ static char_u *regatom(int *flagp) case Magic('~'): // previous substitute pattern if (reg_prev_sub != NULL) { - char_u *lp; + char_u *lp; ret = regnode(EXACTLY); lp = reg_prev_sub; - while (*lp != NUL) + while (*lp != NUL) { regc(*lp++); + } regc(NUL); if (*reg_prev_sub != NUL) { *flagp |= HASWIDTH; - if ((lp - reg_prev_sub) == 1) + if ((lp - reg_prev_sub) == 1) { *flagp |= SIMPLE; + } } - } else + } else { EMSG_RET_NULL(_(e_nopresub)); + } break; case Magic('1'): @@ -1389,8 +1891,7 @@ static char_u *regatom(int *flagp) case Magic('6'): case Magic('7'): case Magic('8'): - case Magic('9'): - { + case Magic('9'): { int refnum; refnum = c - Magic('0'); @@ -1402,16 +1903,19 @@ static char_u *regatom(int *flagp) break; case Magic('z'): - { c = no_Magic(getchr()); switch (c) { - case '(': if ((reg_do_extmatch & REX_SET) == 0) + case '(': + if ((reg_do_extmatch & REX_SET) == 0) { EMSG_RET_NULL(_(e_z_not_allowed)); - if (one_exactly) + } + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_ZPAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH|SPSTART|HASNL|HASLOOKBH); re_has_z = REX_SET; break; @@ -1424,40 +1928,45 @@ static char_u *regatom(int *flagp) case '6': case '7': case '8': - case '9': if ((reg_do_extmatch & REX_USE) == 0) + case '9': + if ((reg_do_extmatch & REX_USE) == 0) { EMSG_RET_NULL(_(e_z1_not_allowed)); + } ret = regnode(ZREF + c - '0'); re_has_z = REX_USE; break; - case 's': ret = regnode(MOPEN + 0); + case 's': + ret = regnode(MOPEN + 0); if (!re_mult_next("\\zs")) { return NULL; } break; - case 'e': ret = regnode(MCLOSE + 0); + case 'e': + ret = regnode(MCLOSE + 0); if (!re_mult_next("\\ze")) { return NULL; } break; - default: EMSG_RET_NULL(_("E68: Invalid character after \\z")); + default: + EMSG_RET_NULL(_("E68: Invalid character after \\z")); } - } - break; + break; case Magic('%'): - { c = no_Magic(getchr()); switch (c) { // () without a back reference case '(': - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_NPAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH); break; @@ -1486,18 +1995,20 @@ static char_u *regatom(int *flagp) // \%[abc]: Emit as a list of branches, all ending at the last // branch which matches nothing. case '[': - if (one_exactly) // doesn't nest + if (one_exactly) { // doesn't nest EMSG_ONE_RET_NULL; + } { - char_u *lastbranch; - char_u *lastnode = NULL; - char_u *br; + char_u *lastbranch; + char_u *lastnode = NULL; + char_u *br; ret = NULL; while ((c = getchr()) != ']') { - if (c == NUL) + if (c == NUL) { EMSG2_RET_NULL(_(e_missing_sb), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } br = regnode(BRANCH); if (ret == NULL) { ret = br; @@ -1516,9 +2027,10 @@ static char_u *regatom(int *flagp) return NULL; } } - if (ret == NULL) + if (ret == NULL) { EMSG2_RET_NULL(_(e_empty_sb), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } lastbranch = regnode(BRANCH); br = regnode(NOTHING); if (ret != JUST_CALC_SIZE) { @@ -1526,15 +2038,16 @@ static char_u *regatom(int *flagp) regtail(lastbranch, br); // connect all branches to the NOTHING // branch at the end - for (br = ret; br != lastnode; ) { + for (br = ret; br != lastnode;) { if (OP(br) == BRANCH) { regtail(br, lastbranch); if (reg_toolong) { return NULL; } br = OPERAND(br); - } else + } else { br = regnext(br); + } } } *flagp &= ~(HASWIDTH | SIMPLE); @@ -1550,12 +2063,18 @@ static char_u *regatom(int *flagp) int64_t i; switch (c) { - case 'd': i = getdecchrs(); break; - case 'o': i = getoctchrs(); break; - case 'x': i = gethexchrs(2); break; - case 'u': i = gethexchrs(4); break; - case 'U': i = gethexchrs(8); break; - default: i = -1; break; + case 'd': + i = getdecchrs(); break; + case 'o': + i = getoctchrs(); break; + case 'x': + i = gethexchrs(2); break; + case 'u': + i = gethexchrs(4); break; + case 'U': + i = gethexchrs(8); break; + default: + i = -1; break; } if (i < 0 || i > INT_MAX) { @@ -1599,9 +2118,9 @@ static char_u *regatom(int *flagp) // "\%'m", "\%<'m" and "\%>'m": Mark c = getchr(); ret = regnode(RE_MARK); - if (ret == JUST_CALC_SIZE) + if (ret == JUST_CALC_SIZE) { regsize += 2; - else { + } else { *regcode++ = c; *regcode++ = cmp; } @@ -1647,15 +2166,14 @@ static char_u *regatom(int *flagp) } EMSG2_RET_NULL(_("E71: Invalid character after %s%%"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); } - } - break; + break; case Magic('['): collection: { - char_u *lp; + char_u *lp; // If there is no matching ']', we assume the '[' is a normal // character. This makes 'incsearch' and ":help [" work. @@ -1669,8 +2187,9 @@ collection: if (*regparse == '^') { // Complement of range. ret = regnode(ANYBUT + extra); regparse++; - } else + } else { ret = regnode(ANYOF + extra); + } // At the start ']' and '-' mean the literal character. if (*regparse == ']' || *regparse == '-') { @@ -1691,15 +2210,17 @@ collection: } else { // Also accept "a-[.z.]" endc = 0; - if (*regparse == '[') + if (*regparse == '[') { endc = get_coll_element(®parse); + } if (endc == 0) { endc = mb_ptr2char_adv((const char_u **)®parse); } // Handle \o40, \x20 and \u20AC style sequences - if (endc == '\\' && !reg_cpo_lit) + if (endc == '\\' && !reg_cpo_lit) { endc = coll_get_char(); + } if (startc > endc) { EMSG_RET_NULL(_(e_reverse_range)); @@ -1714,8 +2235,9 @@ collection: regmbc(startc); } } else { - while (++startc <= endc) + while (++startc <= endc) { regc(startc); + } } startc = -1; } @@ -1727,7 +2249,7 @@ collection: && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, - regparse[1]) != NULL))) { + regparse[1]) != NULL))) { regparse++; if (*regparse == 'n') { // '\n' in range: also match NL @@ -1748,10 +2270,11 @@ collection: || *regparse == 'u' || *regparse == 'U') { startc = coll_get_char(); - if (startc == 0) + if (startc == 0) { regc(0x0a); - else + } else { regmbc(startc); + } } else { startc = backslash_trans(*regparse++); regc(startc); @@ -1840,8 +2363,9 @@ collection: } break; case CLASS_SPACE: - for (cu = 9; cu <= 13; cu++) + for (cu = 9; cu <= 13; cu++) { regc(cu); + } regc(' '); break; case CLASS_UPPER: @@ -1908,18 +2432,19 @@ collection: } regc(NUL); prevchr_len = 1; // last char was the ']' - if (*regparse != ']') + if (*regparse != ']') { EMSG_RET_NULL(_(e_toomsbra)); // Cannot happen? + } skipchr(); // let's be friends with the lexer again *flagp |= HASWIDTH | SIMPLE; break; - } else if (reg_strict) + } else if (reg_strict) { EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF); + } } FALLTHROUGH; - default: - { + default: { int len; // A multi-byte character is handled as a separate atom if it's @@ -1952,7 +2477,7 @@ do_multibyte: int l; // Need to get composing character too. - for (;; ) { + for (;;) { l = utf_ptr2len((char *)regparse); if (!utf_composinglike(regparse, regparse + l)) { break; @@ -1968,8 +2493,9 @@ do_multibyte: regc(NUL); *flagp |= HASWIDTH; - if (len == 1) + if (len == 1) { *flagp |= SIMPLE; + } } break; } @@ -1996,8 +2522,9 @@ static char_u *regpiece(int *flagp) long maxval; ret = regatom(&flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } op = peekchr(); if (re_multi_type(op) == NOT_MULTI) { @@ -2010,9 +2537,9 @@ static char_u *regpiece(int *flagp) skipchr(); switch (op) { case Magic('*'): - if (flags & SIMPLE) + if (flags & SIMPLE) { reginsert(STAR, ret); - else { + } else { // Emit x* as (x&|), where & means "self". reginsert(BRANCH, ret); // Either x regoptail(ret, regnode(BACK)); // and loop @@ -2023,9 +2550,9 @@ static char_u *regpiece(int *flagp) break; case Magic('+'): - if (flags & SIMPLE) + if (flags & SIMPLE) { reginsert(PLUS, ret); - else { + } else { // Emit x+ as x(&|), where & means "self". next = regnode(BRANCH); // Either regtail(ret, next); @@ -2036,23 +2563,29 @@ static char_u *regpiece(int *flagp) *flagp = (WORST | HASWIDTH | (flags & (HASNL | HASLOOKBH))); break; - case Magic('@'): - { + case Magic('@'): { int lop = END; int64_t nr = getdecchrs(); switch (no_Magic(getchr())) { - case '=': lop = MATCH; break; // \@= - case '!': lop = NOMATCH; break; // \@! - case '>': lop = SUBPAT; break; // \@> - case '<': switch (no_Magic(getchr())) { - case '=': lop = BEHIND; break; // \@<= - case '!': lop = NOBEHIND; break; // \@<! - } + case '=': + lop = MATCH; break; // \@= + case '!': + lop = NOMATCH; break; // \@! + case '>': + lop = SUBPAT; break; // \@> + case '<': + switch (no_Magic(getchr())) { + case '=': + lop = BEHIND; break; // \@<= + case '!': + lop = NOBEHIND; break; // \@<! + } } - if (lop == END) + if (lop == END) { EMSG2_RET_NULL(_("E59: invalid character after %s@"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } // Look behind must match with behind_pos. if (lop == BEHIND || lop == NOBEHIND) { regtail(ret, regnode(BHPOS)); @@ -2060,11 +2593,13 @@ static char_u *regpiece(int *flagp) } regtail(ret, regnode(END)); // operand ends if (lop == BEHIND || lop == NOBEHIND) { - if (nr < 0) + if (nr < 0) { nr = 0; // no limit is same as zero limit + } reginsert_nr(lop, (uint32_t)nr, ret); - } else + } else { reginsert(lop, ret); + } break; } @@ -2079,23 +2614,26 @@ static char_u *regpiece(int *flagp) break; case Magic('{'): - if (!read_limits(&minval, &maxval)) + if (!read_limits(&minval, &maxval)) { return NULL; + } if (flags & SIMPLE) { reginsert(BRACE_SIMPLE, ret); reginsert_limits(BRACE_LIMITS, minval, maxval, ret); } else { - if (num_complex_braces >= 10) + if (num_complex_braces >= 10) { EMSG2_RET_NULL(_("E60: Too many complex %s{...}s"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } reginsert(BRACE_COMPLEX + num_complex_braces, ret); regoptail(ret, regnode(BACK)); regoptail(ret, ret); reginsert_limits(BRACE_LIMITS, minval, maxval, ret); ++num_complex_braces; } - if (minval > 0 && maxval > 0) + if (minval > 0 && maxval > 0) { *flagp = (HASWIDTH | (flags & (HASNL | HASLOOKBH))); + } break; } if (re_multi_type(peekchr()) != NOT_MULTI) { @@ -2115,9 +2653,9 @@ static char_u *regpiece(int *flagp) */ static char_u *regconcat(int *flagp) { - char_u *first = NULL; - char_u *chain = NULL; - char_u *latest; + char_u *first = NULL; + char_u *chain = NULL; + char_u *latest; int flags; int cont = true; @@ -2165,21 +2703,25 @@ static char_u *regconcat(int *flagp) break; default: latest = regpiece(&flags); - if (latest == NULL || reg_toolong) + if (latest == NULL || reg_toolong) { return NULL; + } *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH); - if (chain == NULL) // First piece. + if (chain == NULL) { // First piece. *flagp |= flags & SPSTART; - else + } else { regtail(chain, latest); + } chain = latest; - if (first == NULL) + if (first == NULL) { first = latest; + } break; } } - if (first == NULL) // Loop ran zero times. + if (first == NULL) { // Loop ran zero times. first = regnode(NOTHING); + } return first; } @@ -2189,18 +2731,19 @@ static char_u *regconcat(int *flagp) */ static char_u *regbranch(int *flagp) { - char_u *ret; - char_u *chain = NULL; - char_u *latest; + char_u *ret; + char_u *chain = NULL; + char_u *latest; int flags; *flagp = WORST | HASNL; // Tentatively. ret = regnode(BRANCH); - for (;; ) { + for (;;) { latest = regconcat(&flags); - if (latest == NULL) + if (latest == NULL) { return NULL; + } // If one of the branches has width, the whole thing has. If one of // the branches anchors at start-of-line, the whole thing does. // If one of the branches uses look-behind, the whole thing does. @@ -2208,14 +2751,17 @@ static char_u *regbranch(int *flagp) // If one of the branches doesn't match a line-break, the whole thing // doesn't. *flagp &= ~HASNL | (flags & HASNL); - if (chain != NULL) + if (chain != NULL) { regtail(chain, latest); - if (peekchr() != Magic('&')) + } + if (peekchr() != Magic('&')) { break; + } skipchr(); regtail(latest, regnode(END)); // operand ends - if (reg_toolong) + if (reg_toolong) { break; + } reginsert(MATCH, latest); chain = latest; } @@ -2223,22 +2769,20 @@ static char_u *regbranch(int *flagp) return ret; } -/* - * Parse regular expression, i.e. main body or parenthesized thing. - * - * Caller must absorb opening parenthesis. - * - * Combining parenthesis handling with the base level of regular expression - * is a trifle forced, but the need to tie the tails of the branches to what - * follows makes it hard to avoid. - */ -static char_u *reg( - int paren, // REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN - int *flagp) +/// Parse regular expression, i.e. main body or parenthesized thing. +/// +/// Caller must absorb opening parenthesis. +/// +/// Combining parenthesis handling with the base level of regular expression +/// is a trifle forced, but the need to tie the tails of the branches to what +/// follows makes it hard to avoid. +/// +/// @param paren REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN +static char_u *reg(int paren, int *flagp) { - char_u *ret; - char_u *br; - char_u *ender; + char_u *ret; + char_u *br; + char_u *ender; int parno = 0; int flags; @@ -2246,73 +2790,83 @@ static char_u *reg( if (paren == REG_ZPAREN) { // Make a ZOPEN node. - if (regnzpar >= NSUBEXP) + if (regnzpar >= NSUBEXP) { EMSG_RET_NULL(_("E50: Too many \\z(")); + } parno = regnzpar; regnzpar++; ret = regnode(ZOPEN + parno); - } else if (paren == REG_PAREN) { + } else if (paren == REG_PAREN) { // Make a MOPEN node. - if (regnpar >= NSUBEXP) + if (regnpar >= NSUBEXP) { EMSG2_RET_NULL(_("E51: Too many %s("), reg_magic == MAGIC_ALL); + } parno = regnpar; ++regnpar; ret = regnode(MOPEN + parno); - } else if (paren == REG_NPAREN) { + } else if (paren == REG_NPAREN) { // Make a NOPEN node. ret = regnode(NOPEN); - } else + } else { ret = NULL; + } // Pick up the branches, linking them together. br = regbranch(&flags); - if (br == NULL) + if (br == NULL) { return NULL; - if (ret != NULL) + } + if (ret != NULL) { regtail(ret, br); // [MZ]OPEN -> first. - else + } else { ret = br; + } // If one of the branches can be zero-width, the whole thing can. // If one of the branches has * at start or matches a line-break, the // whole thing can. - if (!(flags & HASWIDTH)) + if (!(flags & HASWIDTH)) { *flagp &= ~HASWIDTH; + } *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); while (peekchr() == Magic('|')) { skipchr(); br = regbranch(&flags); - if (br == NULL || reg_toolong) + if (br == NULL || reg_toolong) { return NULL; + } regtail(ret, br); // BRANCH -> BRANCH. - if (!(flags & HASWIDTH)) + if (!(flags & HASWIDTH)) { *flagp &= ~HASWIDTH; + } *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); } // Make a closing node, and hook it on the end. - ender = regnode( - paren == REG_ZPAREN ? ZCLOSE + parno : - paren == REG_PAREN ? MCLOSE + parno : - paren == REG_NPAREN ? NCLOSE : END); + ender = regnode(paren == REG_ZPAREN ? ZCLOSE + parno : + paren == REG_PAREN ? MCLOSE + parno : + paren == REG_NPAREN ? NCLOSE : END); regtail(ret, ender); // Hook the tails of the branches to the closing node. - for (br = ret; br != NULL; br = regnext(br)) + for (br = ret; br != NULL; br = regnext(br)) { regoptail(br, ender); + } // Check for proper termination. if (paren != REG_NOPAREN && getchr() != Magic(')')) { - if (paren == REG_ZPAREN) + if (paren == REG_ZPAREN) { EMSG_RET_NULL(_("E52: Unmatched \\z(")); - else if (paren == REG_NPAREN) + } else if (paren == REG_NPAREN) { EMSG2_RET_NULL(_(e_unmatchedpp), reg_magic == MAGIC_ALL); - else + } else { EMSG2_RET_NULL(_(e_unmatchedp), reg_magic == MAGIC_ALL); + } } else if (paren == REG_NOPAREN && peekchr() != NUL) { - if (curchr == Magic(')')) + if (curchr == Magic(')')) { EMSG2_RET_NULL(_(e_unmatchedpar), reg_magic == MAGIC_ALL); - else + } else { EMSG_RET_NULL(_(e_trailing)); // "Can't happen". + } // NOTREACHED } // Here we set the flag allowing back references to this set of @@ -2347,8 +2901,8 @@ static char_u *reg( */ static regprog_T *bt_regcomp(char_u *expr, int re_flags) { - char_u *scan; - char_u *longest; + char_u *scan; + char_u *longest; int len; int flags; @@ -2362,8 +2916,9 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) regcomp_start(expr, re_flags); regcode = JUST_CALC_SIZE; regc(REGMAGIC); - if (reg(REG_NOPAREN, &flags) == NULL) + if (reg(REG_NOPAREN, &flags) == NULL) { return NULL; + } // Allocate space. bt_regprog_T *r = xmalloc(sizeof(bt_regprog_T) + regsize); @@ -2375,8 +2930,9 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) regc(REGMAGIC); if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong) { xfree(r); - if (reg_toolong) + if (reg_toolong) { EMSG_RET_NULL(_("E339: Pattern too long")); + } return NULL; } @@ -2386,10 +2942,12 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) r->regmust = NULL; r->regmlen = 0; r->regflags = regflags; - if (flags & HASNL) + if (flags & HASNL) { r->regflags |= RF_HASNL; - if (flags & HASLOOKBH) + } + if (flags & HASLOOKBH) { r->regflags |= RF_LOOKBH; + } // Remember whether this pattern has any \z specials in it. r->reghasz = re_has_z; scan = r->program + 1; // First BRANCH. @@ -2407,7 +2965,7 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) } else if (OP(scan) == BOW || OP(scan) == EOW || OP(scan) == NOTHING - || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN + || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE) { char_u *regnext_scan = regnext(scan); if (OP(regnext_scan) == EXACTLY) { @@ -2428,11 +2986,12 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) && !(flags & HASNL)) { longest = NULL; len = 0; - for (; scan != NULL; scan = regnext(scan)) + for (; scan != NULL; scan = regnext(scan)) { if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len) { longest = OPERAND(scan); len = (int)STRLEN(OPERAND(scan)); } + } r->regmust = longest; r->regmlen = len; } @@ -2462,11 +3021,16 @@ static int coll_get_char(void) int64_t nr = -1; switch (*regparse++) { - case 'd': nr = getdecchrs(); break; - case 'o': nr = getoctchrs(); break; - case 'x': nr = gethexchrs(2); break; - case 'u': nr = gethexchrs(4); break; - case 'U': nr = gethexchrs(8); break; + case 'd': + nr = getdecchrs(); break; + case 'o': + nr = getoctchrs(); break; + case 'x': + nr = gethexchrs(2); break; + case 'u': + nr = gethexchrs(4); break; + case 'U': + nr = gethexchrs(8); break; } if (nr < 0 || nr > INT_MAX) { // If getting the number fails be backwards compatible: the character @@ -2492,8 +3056,8 @@ static void bt_regfree(regprog_T *prog) * to regmatch(), but they are here to reduce the amount of stack space used * (it can be called recursively many times). */ -static long bl_minval; -static long bl_maxval; +static long bl_minval; +static long bl_maxval; // Save the input line and position in a regsave_T. static void reg_save(regsave_T *save, garray_T *gap) @@ -2543,10 +3107,10 @@ static bool reg_save_equal(const regsave_T *save) // After a failed match restore the sub-expressions. #define restore_se(savep, posp, pp) { \ - if (REG_MULTI) \ - *(posp) = (savep)->se_u.pos; \ - else \ - *(pp) = (savep)->se_u.ptr; } + if (REG_MULTI) /* NOLINT(readability/braces) */ \ + *(posp) = (savep)->se_u.pos; \ + else /* NOLINT */ \ + *(pp) = (savep)->se_u.ptr; } /* * Tentatively set the sub-expression start to the current position (after @@ -2568,17 +3132,14 @@ static void save_se_one(save_se_T *savep, char_u **pp) *pp = rex.input; } -/* - * regrepeat - repeatedly match something simple, return how many. - * Advances rex.input (and rex.lnum) to just after the matched chars. - */ - static int -regrepeat( - char_u *p, - long maxcount) // maximum number of matches allowed +/// regrepeat - repeatedly match something simple, return how many. +/// Advances rex.input (and rex.lnum) to just after the matched chars. +/// +/// @param maxcount maximum number of matches allowed +static int regrepeat(char_u *p, long maxcount) { long count = 0; - char_u *opnd; + char_u *opnd; int mask; int testval = 0; @@ -2822,8 +3383,7 @@ do_class: mask = RI_UPPER; goto do_class; - case EXACTLY: - { + case EXACTLY: { int cu, cl; // This doesn't do a multi-byte character, because a MULTIBYTECODE @@ -2846,8 +3406,7 @@ do_class: break; } - case MULTIBYTECODE: - { + case MULTIBYTECODE: { int i, len, cf = 0; // Safety check (just in case 'encoding' was changed since @@ -2900,9 +3459,10 @@ do_class: } scan += len; } else { - if ((cstrchr(opnd, *scan) == NULL) == testval) + if ((cstrchr(opnd, *scan) == NULL) == testval) { break; - ++scan; + } + scan++; } ++count; } @@ -2944,7 +3504,7 @@ do_class: */ static regitem_T *regstack_push(regstate_T state, char_u *scan) { - regitem_T *rp; + regitem_T *rp; if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp) { emsg(_(e_maxmempat)); @@ -2965,7 +3525,7 @@ static regitem_T *regstack_push(regstate_T state, char_u *scan) */ static void regstack_pop(char_u **scan) { - regitem_T *rp; + regitem_T *rp; rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1; *scan = rp->rs_scan; @@ -3021,19 +3581,20 @@ static void restore_subexpr(regbehind_T *bp) /// (that don't need to know whether the rest of the match failed) by a nested /// loop. /// -/// Returns true when there is a match. Leaves rex.input and rex.lnum -/// just after the last matched character. -/// Returns false when there is no match. Leaves rex.input and rex.lnum in an -/// undefined state! -static bool regmatch( - char_u *scan, // Current node. - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// @param scan Current node. +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return - true when there is a match. Leaves rex.input and rex.lnum +/// just after the last matched character. +/// - false when there is no match. Leaves rex.input and rex.lnum in an +/// undefined state! +static bool regmatch(char_u *scan, proftime_T *tm, int *timed_out) { - char_u *next; // Next node. + char_u *next; // Next node. int op; int c; - regitem_T *rp; + regitem_T *rp; int no; int status; // one of the RA_ values: int tm_count = 0; @@ -3044,7 +3605,7 @@ static bool regmatch( backpos.ga_len = 0; // Repeat until "regstack" is empty. - for (;; ) { + for (;;) { // Some patterns may take a long time to match, e.g., "\([a-z]\+\)\+Q". // Allow interrupting them with CTRL-C. fast_breakcheck(); @@ -3058,7 +3619,7 @@ static bool regmatch( // Repeat for items that can be matched sequentially, without using the // regstack. - for (;; ) { + for (;;) { if (got_int || scan == NULL) { status = RA_FAIL; break; @@ -3086,8 +3647,9 @@ static bool regmatch( mch_errmsg(_("External submatches:\n")); for (i = 0; i < NSUBEXP; i++) { mch_errmsg(" \""); - if (re_extmatch_in->matches[i] != NULL) + if (re_extmatch_in->matches[i] != NULL) { mch_errmsg((char *)re_extmatch_in->matches[i]); + } mch_errmsg("\"\n"); } } @@ -3168,7 +3730,7 @@ static bool regmatch( status = RA_NOMATCH; } else { const colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum - && pos->col == MAXCOL + && pos->col == MAXCOL ? (colnr_T)STRLEN(reg_getline(pos->lnum - rex.reg_firstlnum)) : pos->col; @@ -3188,8 +3750,9 @@ static bool regmatch( break; case RE_VISUAL: - if (!reg_match_visual()) + if (!reg_match_visual()) { status = RA_NOMATCH; + } break; case RE_LNUM: @@ -3260,10 +3823,11 @@ static bool regmatch( break; case IDENT: - if (!vim_isIDc(c)) + if (!vim_isIDc(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case SIDENT: @@ -3324,135 +3888,152 @@ static bool regmatch( break; case WHITE: - if (!ascii_iswhite(c)) + if (!ascii_iswhite(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NWHITE: - if (c == NUL || ascii_iswhite(c)) + if (c == NUL || ascii_iswhite(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case DIGIT: - if (!ri_digit(c)) + if (!ri_digit(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NDIGIT: - if (c == NUL || ri_digit(c)) + if (c == NUL || ri_digit(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case HEX: - if (!ri_hex(c)) + if (!ri_hex(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NHEX: - if (c == NUL || ri_hex(c)) + if (c == NUL || ri_hex(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case OCTAL: - if (!ri_octal(c)) + if (!ri_octal(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NOCTAL: - if (c == NUL || ri_octal(c)) + if (c == NUL || ri_octal(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case WORD: - if (!ri_word(c)) + if (!ri_word(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NWORD: - if (c == NUL || ri_word(c)) + if (c == NUL || ri_word(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case HEAD: - if (!ri_head(c)) + if (!ri_head(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NHEAD: - if (c == NUL || ri_head(c)) + if (c == NUL || ri_head(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case ALPHA: - if (!ri_alpha(c)) + if (!ri_alpha(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NALPHA: - if (c == NUL || ri_alpha(c)) + if (c == NUL || ri_alpha(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case LOWER: - if (!ri_lower(c)) + if (!ri_lower(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NLOWER: - if (c == NUL || ri_lower(c)) + if (c == NUL || ri_lower(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case UPPER: - if (!ri_upper(c)) + if (!ri_upper(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NUPPER: - if (c == NUL || ri_upper(c)) + if (c == NUL || ri_upper(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; - case EXACTLY: - { + case EXACTLY: { int len; - char_u *opnd; + char_u *opnd; opnd = OPERAND(scan); // Inline the first byte, for speed. @@ -3492,29 +4073,29 @@ static bool regmatch( case ANYOF: case ANYBUT: - if (c == NUL) + if (c == NUL) { status = RA_NOMATCH; - else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF)) + } else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; - case MULTIBYTECODE: - { + case MULTIBYTECODE: { int i, len; const char_u *opnd = OPERAND(scan); - // Safety check (just in case 'encoding' was changed since - // compiling the program). + // Safety check (just in case 'encoding' was changed since + // compiling the program). if ((len = utfc_ptr2len((char *)opnd)) < 2) { status = RA_NOMATCH; break; } const int opndc = utf_ptr2char((char *)opnd); if (utf_iscomposing(opndc)) { - // When only a composing char is given match at any - // position where that composing char appears. + // When only a composing char is given match at any + // position where that composing char appears. status = RA_NOMATCH; for (i = 0; rex.input[i] != NUL; i += utf_ptr2len((char *)rex.input + i)) { @@ -3524,7 +4105,7 @@ static bool regmatch( break; } } else if (opndc == inpc) { - // Include all following composing chars. + // Include all following composing chars. len = i + utfc_ptr2len((char *)rex.input + i); status = RA_MATCH; break; @@ -3543,19 +4124,16 @@ static bool regmatch( break; case RE_COMPOSING: - { - // Skip composing characters. + // Skip composing characters. while (utf_iscomposing(utf_ptr2char((char *)rex.input))) { MB_CPTR_ADV(rex.input); } - } - break; + break; case NOTHING: break; - case BACK: - { + case BACK: { int i; // When we run into BACK we need to check if we don't keep @@ -3565,15 +4143,18 @@ static bool regmatch( // The positions are stored in "backpos" and found by the // current value of "scan", the position in the RE program. backpos_T *bp = (backpos_T *)backpos.ga_data; - for (i = 0; i < backpos.ga_len; ++i) - if (bp[i].bp_scan == scan) + for (i = 0; i < backpos.ga_len; i++) { + if (bp[i].bp_scan == scan) { break; + } + } if (i == backpos.ga_len) { backpos_T *p = GA_APPEND_VIA_PTR(backpos_T, &backpos); p->bp_scan = scan; - } else if (reg_save_equal(&bp[i].bp_pos)) + } else if (reg_save_equal(&bp[i].bp_pos)) { // Still at same position as last time, fail. status = RA_NOMATCH; + } assert(status != RA_FAIL); if (status != RA_NOMATCH) { @@ -3592,25 +4173,24 @@ static bool regmatch( case MOPEN + 7: case MOPEN + 8: case MOPEN + 9: - { no = op - MOPEN; cleanup_subexpr(); rp = regstack_push(RS_MOPEN, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, &rex.reg_startpos[no], &rex.reg_startp[no]); // We simply continue and handle the result when done. } - } - break; + break; case NOPEN: // \%( case NCLOSE: // \) after \%( - if (regstack_push(RS_NOPEN, scan) == NULL) + if (regstack_push(RS_NOPEN, scan) == NULL) { status = RA_FAIL; + } // We simply continue and handle the result when done. break; @@ -3623,20 +4203,18 @@ static bool regmatch( case ZOPEN + 7: case ZOPEN + 8: case ZOPEN + 9: - { no = op - ZOPEN; cleanup_zsubexpr(); rp = regstack_push(RS_ZOPEN, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, ®_startzpos[no], - ®_startzp[no]); + ®_startzp[no]); // We simply continue and handle the result when done. } - } - break; + break; case MCLOSE + 0: // Match end: \ze case MCLOSE + 1: // \) @@ -3648,7 +4226,6 @@ static bool regmatch( case MCLOSE + 7: case MCLOSE + 8: case MCLOSE + 9: - { no = op - MCLOSE; cleanup_subexpr(); rp = regstack_push(RS_MCLOSE, scan); @@ -3659,8 +4236,7 @@ static bool regmatch( save_se(&rp->rs_un.sesave, &rex.reg_endpos[no], &rex.reg_endp[no]); // We simply continue and handle the result when done. } - } - break; + break; case ZCLOSE + 1: // \) after \z( case ZCLOSE + 2: @@ -3671,20 +4247,18 @@ static bool regmatch( case ZCLOSE + 7: case ZCLOSE + 8: case ZCLOSE + 9: - { no = op - ZCLOSE; cleanup_zsubexpr(); rp = regstack_push(RS_ZCLOSE, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, ®_endzpos[no], - ®_endzp[no]); + ®_endzp[no]); // We simply continue and handle the result when done. } - } - break; + break; case BACKREF + 1: case BACKREF + 2: @@ -3694,8 +4268,7 @@ static bool regmatch( case BACKREF + 6: case BACKREF + 7: case BACKREF + 8: - case BACKREF + 9: - { + case BACKREF + 9: { int len; no = op - BACKREF; @@ -3752,7 +4325,6 @@ static bool regmatch( case ZREF + 7: case ZREF + 8: case ZREF + 9: - { cleanup_zsubexpr(); no = op - ZREF; if (re_extmatch_in != NULL @@ -3766,25 +4338,22 @@ static bool regmatch( } else { // Backref was not set: Match an empty string. } - } - break; + break; case BRANCH: - { - if (OP(next) != BRANCH) // No choice. + if (OP(next) != BRANCH) { // No choice. next = OPERAND(scan); // Avoid recursion. - else { + } else { rp = regstack_push(RS_BRANCH, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else + } else { status = RA_BREAK; // rest is below + } } - } - break; + break; case BRACE_LIMITS: - { if (OP(next) == BRACE_SIMPLE) { bl_minval = OPERAND_MIN(scan); bl_maxval = OPERAND_MAX(scan); @@ -3798,8 +4367,7 @@ static bool regmatch( internal_error("BRACE_LIMITS"); status = RA_FAIL; } - } - break; + break; case BRACE_COMPLEX + 0: case BRACE_COMPLEX + 1: @@ -3811,7 +4379,6 @@ static bool regmatch( case BRACE_COMPLEX + 7: case BRACE_COMPLEX + 8: case BRACE_COMPLEX + 9: - { no = op - BRACE_COMPLEX; ++brace_count[no]; @@ -3819,9 +4386,9 @@ static bool regmatch( if (brace_count[no] <= (brace_min[no] <= brace_max[no] ? brace_min[no] : brace_max[no])) { rp = regstack_push(RS_BRCPLX_MORE, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3835,9 +4402,9 @@ static bool regmatch( // Range is the normal way around, use longest match if (brace_count[no] <= brace_max[no]) { rp = regstack_push(RS_BRCPLX_LONG, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3848,21 +4415,19 @@ static bool regmatch( // Range is backwards, use shortest match first if (brace_count[no] <= brace_min[no]) { rp = regstack_push(RS_BRCPLX_SHORT, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { reg_save(&rp->rs_un.regsave, &backpos); // We continue and handle the result when done. } } } - } - break; + break; case BRACE_SIMPLE: case STAR: - case PLUS: - { + case PLUS: { regstar_T rst; // Lookahead to avoid useless match attempts when we know @@ -3910,18 +4475,17 @@ static bool regmatch( } else { ga_grow(®stack, sizeof(regstar_T)); regstack.ga_len += sizeof(regstar_T); - rp = regstack_push(rst.minval <= rst.maxval - ? RS_STAR_LONG : RS_STAR_SHORT, scan); - if (rp == NULL) + rp = regstack_push(rst.minval <= rst.maxval ? RS_STAR_LONG : RS_STAR_SHORT, scan); + if (rp == NULL) { status = RA_FAIL; - else { + } else { *(((regstar_T *)rp) - 1) = rst; status = RA_BREAK; // skip the restore bits } } - } else + } else { status = RA_NOMATCH; - + } } break; @@ -3929,9 +4493,9 @@ static bool regmatch( case MATCH: case SUBPAT: rp = regstack_push(RS_NOMATCH, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = op; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3949,9 +4513,9 @@ static bool regmatch( ga_grow(®stack, sizeof(regbehind_T)); regstack.ga_len += sizeof(regbehind_T); rp = regstack_push(RS_BEHIND1, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { // Need to save the subexpr to be able to restore them // when there is a match but we don't use it. save_subexpr(((regbehind_T *)rp) - 1); @@ -4001,13 +4565,13 @@ static bool regmatch( } // If we can't continue sequentially, break the inner loop. - if (status != RA_CONT) + if (status != RA_CONT) { break; + } // Continue in inner loop, advance to next item. scan = next; - - } // end of inner loop + } // end of inner loop // If there is something on the regstack execute the code for the state. // If the state is popped then loop and use the older state. @@ -4030,9 +4594,10 @@ static bool regmatch( case RS_ZOPEN: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { restore_se(&rp->rs_un.sesave, ®_startzpos[rp->rs_no], - ®_startzp[rp->rs_no]); + ®_startzp[rp->rs_no]); + } regstack_pop(&scan); break; @@ -4047,17 +4612,18 @@ static bool regmatch( case RS_ZCLOSE: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { restore_se(&rp->rs_un.sesave, ®_endzpos[rp->rs_no], - ®_endzp[rp->rs_no]); + ®_endzp[rp->rs_no]); + } regstack_pop(&scan); break; case RS_BRANCH: - if (status == RA_MATCH) + if (status == RA_MATCH) { // this branch matched, use it regstack_pop(&scan); - else { + } else { if (status != RA_BREAK) { // After a non-matching branch: try next one. reg_restore(&rp->rs_un.regsave, &backpos); @@ -4095,15 +4661,17 @@ static bool regmatch( status = RA_CONT; } regstack_pop(&scan); - if (status == RA_CONT) + if (status == RA_CONT) { scan = regnext(scan); + } break; case RS_BRCPLX_SHORT: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { // There was no match, try to match one more item. reg_restore(&rp->rs_un.regsave, &backpos); + } regstack_pop(&scan); if (status == RA_NOMATCH) { scan = OPERAND(scan); @@ -4115,16 +4683,18 @@ static bool regmatch( // Pop the state. If the operand matches for NOMATCH or // doesn't match for MATCH/SUBPAT, we fail. Otherwise backup, // except for SUBPAT, and continue with the next item. - if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH)) + if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH)) { status = RA_NOMATCH; - else { + } else { status = RA_CONT; - if (rp->rs_no != SUBPAT) // zero-width + if (rp->rs_no != SUBPAT) { // zero-width reg_restore(&rp->rs_un.regsave, &backpos); + } } regstack_pop(&scan); - if (status == RA_CONT) + if (status == RA_CONT) { scan = regnext(scan); + } break; case RS_BEHIND1: @@ -4162,10 +4732,10 @@ static bool regmatch( if (status == RA_MATCH && reg_save_equal(&behind_pos)) { // found a match that ends where "next" started behind_pos = (((regbehind_T *)rp) - 1)->save_behind; - if (rp->rs_no == BEHIND) + if (rp->rs_no == BEHIND) { reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); - else { + &backpos); + } else { // But we didn't want a match. Need to restore the // subexpr, because what follows matched, so they have // been set. @@ -4187,16 +4757,15 @@ static bool regmatch( < behind_pos.rs_u.pos.lnum ? (colnr_T)STRLEN(rex.line) : behind_pos.rs_u.pos.col) - - rp->rs_un.regsave.rs_u.pos.col >= limit)) + - rp->rs_un.regsave.rs_u.pos.col >= limit)) { no = FAIL; - else if (rp->rs_un.regsave.rs_u.pos.col == 0) { + } else if (rp->rs_un.regsave.rs_u.pos.col == 0) { if (rp->rs_un.regsave.rs_u.pos.lnum < behind_pos.rs_u.pos.lnum - || reg_getline( - --rp->rs_un.regsave.rs_u.pos.lnum) - == NULL) + || reg_getline(--rp->rs_un.regsave.rs_u.pos.lnum) + == NULL) { no = FAIL; - else { + } else { reg_restore(&rp->rs_un.regsave, &backpos); rp->rs_un.regsave.rs_u.pos.col = (colnr_T)STRLEN(rex.line); @@ -4207,7 +4776,7 @@ static bool regmatch( rp->rs_un.regsave.rs_u.pos.col -= utf_head_off(line, - line + rp->rs_un.regsave.rs_u.pos.col - 1) + line + rp->rs_un.regsave.rs_u.pos.col - 1) + 1; } } else { @@ -4236,7 +4805,7 @@ static bool regmatch( behind_pos = (((regbehind_T *)rp) - 1)->save_behind; if (rp->rs_no == NOBEHIND) { reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); + &backpos); status = RA_MATCH; } else { // We do want a proper match. Need to restore the @@ -4254,9 +4823,8 @@ static bool regmatch( break; case RS_STAR_LONG: - case RS_STAR_SHORT: - { - regstar_T *rst = ((regstar_T *)rp) - 1; + case RS_STAR_SHORT: { + regstar_T *rst = ((regstar_T *)rp) - 1; if (status == RA_MATCH) { regstack_pop(&scan); @@ -4265,18 +4833,20 @@ static bool regmatch( } // Tried once already, restore input pointers. - if (status != RA_BREAK) + if (status != RA_BREAK) { reg_restore(&rp->rs_un.regsave, &backpos); + } // Repeat until we found a position where it could match. - for (;; ) { + for (;;) { if (status != RA_BREAK) { // Tried first position already, advance. if (rp->rs_state == RS_STAR_LONG) { // Trying for longest match, but couldn't or // didn't match -- back up one char. - if (--rst->count < rst->minval) + if (--rst->count < rst->minval) { break; + } if (rex.input == rex.line) { // backup to last char of previous line if (rex.lnum == 0) { @@ -4300,14 +4870,17 @@ static bool regmatch( // Couldn't or didn't match: try advancing one // char. if (rst->count == rst->minval - || regrepeat(OPERAND(rp->rs_scan), 1L) == 0) + || regrepeat(OPERAND(rp->rs_scan), 1L) == 0) { break; - ++rst->count; + } + rst->count++; } - if (got_int) + if (got_int) { break; - } else + } + } else { status = RA_NOMATCH; + } // If it could match, try it. if (rst->nextb == NUL || *rex.input == rst->nextb @@ -4331,13 +4904,15 @@ static bool regmatch( // If we want to continue the inner loop or didn't pop a state // continue matching loop if (status == RA_CONT || rp == (regitem_T *) - ((char *)regstack.ga_data + regstack.ga_len) - 1) + ((char *)regstack.ga_data + regstack.ga_len) - 1) { break; + } } // May need to continue with the inner loop, starting at "scan". - if (status == RA_CONT) + if (status == RA_CONT) { continue; + } // If the regstack is empty or something failed we are done. if (GA_EMPTY(®stack) || status == RA_FAIL) { @@ -4351,18 +4926,18 @@ static bool regmatch( } return status == RA_MATCH; } - - } // End of loop until the regstack is empty. + } // End of loop until the regstack is empty. // NOTREACHED } /// Try match of "prog" with at rex.line["col"]. -/// @returns 0 for failure, or number of lines contained in the match. -static long regtry(bt_regprog_T *prog, - colnr_T col, - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return 0 for failure, or number of lines contained in the match. +static long regtry(bt_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_out) { rex.input = rex.line + col; rex.need_clear_subexpr = true; @@ -4416,9 +4991,10 @@ static long regtry(bt_regprog_T *prog, - reg_startzpos[i].col); } } else { - if (reg_startzp[i] != NULL && reg_endzp[i] != NULL) + if (reg_startzp[i] != NULL && reg_endzp[i] != NULL) { re_extmatch_out->matches[i] = vim_strnsave(reg_startzp[i], reg_endzp[i] - reg_startzp[i]); + } } } } @@ -4427,14 +5003,16 @@ static long regtry(bt_regprog_T *prog, /// Match a regexp against a string ("line" points to the string) or multiple /// lines (if "line" is NULL, use reg_getline()). -/// @return 0 for failure, or number of lines contained in the match. -static long bt_regexec_both(char_u *line, - colnr_T col, // column to start search - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// +/// @param col column to start search +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return 0 for failure, or number of lines contained in the match. +static long bt_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int *timed_out) { - bt_regprog_T *prog; - char_u *s; + bt_regprog_T *prog; + char_u *s; long retval = 0L; // Create "regstack" and "backpos" if they are not allocated yet. @@ -4473,8 +5051,9 @@ static long bt_regexec_both(char_u *line, } // Check validity of program. - if (prog_magic_wrong()) + if (prog_magic_wrong()) { goto theend; + } // If the start column is past the maximum column: no need to try. if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol) { @@ -4501,7 +5080,7 @@ static long bt_regexec_both(char_u *line, // This is used very often, esp. for ":global". Use two versions of // the loop to avoid overhead of conditions. if (!rex.reg_ic) { - while ((s = vim_strchr(s, c)) != NULL) { + while ((s = (char_u *)vim_strchr((char *)s, c)) != NULL) { if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) { break; // Found it. } @@ -4590,10 +5169,12 @@ theend: if (reg_tofreelen > 400) { XFREE_CLEAR(reg_tofree); } - if (regstack.ga_maxlen > REGSTACK_INITIAL) + if (regstack.ga_maxlen > REGSTACK_INITIAL) { ga_clear(®stack); - if (backpos.ga_maxlen > BACKPOS_INITIAL) + } + if (backpos.ga_maxlen > BACKPOS_INITIAL) { ga_clear(&backpos); + } if (retval > 0) { // Make sure the end is never before the start. Can happen when \zs @@ -4616,19 +5197,16 @@ theend: return retval; } -/* - * Match a regexp against a string. - * "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). - * Uses curbuf for line count and 'iskeyword'. - * If "line_lbr" is true, consider a "\n" in "line" to be a line break. - * - * Returns 0 for failure, number of lines contained in the match otherwise. - */ -static int bt_regexec_nl( - regmatch_T *rmp, - char_u *line, // string to match against - colnr_T col, // column to start looking for match - bool line_lbr) +/// Match a regexp against a string. +/// "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). +/// Uses curbuf for line count and 'iskeyword'. +/// If "line_lbr" is true, consider a "\n" in "line" to be a line break. +/// +/// @param line string to match against +/// @param col column to start looking for match +/// +/// @return 0 for failure, number of lines contained in the match otherwise. +static int bt_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col, bool line_lbr) { rex.reg_match = rmp; rex.reg_mmatch = NULL; @@ -4658,8 +5236,7 @@ static int bt_regexec_nl( /// /// @return zero if there is no match and number of lines contained in the match /// otherwise. -static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, - linenr_T lnum, colnr_T col, +static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm, int *timed_out) { rex.reg_match = NULL; @@ -4683,10 +5260,12 @@ static int re_num_cmp(uint32_t val, char_u *scan) { uint32_t n = (uint32_t)OPERAND_MIN(scan); - if (OPERAND_CMP(scan) == '>') + if (OPERAND_CMP(scan) == '>') { return val > n; - if (OPERAND_CMP(scan) == '<') + } + if (OPERAND_CMP(scan) == '<') { return val < n; + } return val == n; } @@ -4697,21 +5276,22 @@ static int re_num_cmp(uint32_t val, char_u *scan) */ static void regdump(char_u *pattern, bt_regprog_T *r) { - char_u *s; + char_u *s; int op = EXACTLY; // Arbitrary non-END op. - char_u *next; - char_u *end = NULL; - FILE *f; + char_u *next; + char_u *end = NULL; + FILE *f; -#ifdef BT_REGEXP_LOG +# ifdef BT_REGEXP_LOG f = fopen("bt_regexp_log.log", "a"); -#else +# else f = stdout; -#endif - if (f == NULL) +# endif + if (f == NULL) { return; + } fprintf(f, "-------------------------------------\n\r\nregcomp(%s):\r\n", - pattern); + pattern); s = r->program + 1; // Loop until we find the END that isn't before a referred next (an END @@ -4720,12 +5300,14 @@ static void regdump(char_u *pattern, bt_regprog_T *r) op = OP(s); fprintf(f, "%2d%s", (int)(s - r->program), regprop(s)); // Where, what. next = regnext(s); - if (next == NULL) // Next ptr. + if (next == NULL) { // Next ptr. fprintf(f, "(0)"); - else + } else { fprintf(f, "(%d)", (int)((s - r->program) + (next - s))); - if (end < next) + } + if (end < next) { end = next; + } if (op == BRACE_LIMITS) { // Two ints fprintf(f, " minval %" PRId64 ", maxval %" PRId64, @@ -4746,8 +5328,9 @@ static void regdump(char_u *pattern, bt_regprog_T *r) || op == EXACTLY) { // Literal string, where present. fprintf(f, "\nxxxxxxxxx\n"); - while (*s != NUL) + while (*s != NUL) { fprintf(f, "%c", *s++); + } fprintf(f, "\nxxxxxxxxx\n"); s++; } @@ -4755,19 +5338,22 @@ static void regdump(char_u *pattern, bt_regprog_T *r) } // Header fields of interest. - if (r->regstart != NUL) + if (r->regstart != NUL) { fprintf(f, "start `%s' 0x%x; ", r->regstart < 256 - ? (char *)transchar(r->regstart) - : "multibyte", r->regstart); - if (r->reganch) + ? (char *)transchar(r->regstart) + : "multibyte", r->regstart); + } + if (r->reganch) { fprintf(f, "anchored; "); - if (r->regmust != NULL) + } + if (r->regmust != NULL) { fprintf(f, "must have \"%s\"", r->regmust); + } fprintf(f, "\r\n"); -#ifdef BT_REGEXP_LOG +# ifdef BT_REGEXP_LOG fclose(f); -#endif +# endif } #endif // BT_REGEXP_DUMP @@ -4778,7 +5364,7 @@ static void regdump(char_u *pattern, bt_regprog_T *r) */ static char_u *regprop(char_u *op) { - char *p; + char *p; static char buf[50]; STRCPY(buf, ":"); @@ -5144,8 +5730,9 @@ static char_u *regprop(char_u *op) p = NULL; break; } - if (p != NULL) + if (p != NULL) { STRCAT(buf, p); + } return (char_u *)buf; } #endif // REGEXP_DEBUG diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 7ab4f4ed53..cad5e9df29 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * NFA regular expression implementation. * @@ -11,8 +9,8 @@ #include <assert.h> #include <inttypes.h> -#include <stdbool.h> #include <limits.h> +#include <stdbool.h> #include "nvim/ascii.h" #include "nvim/garray.h" @@ -39,13 +37,13 @@ # define NFA_REGEXP_DEBUG_LOG "nfa_regexp_debug.log" #endif -/* Added to NFA_ANY - NFA_NUPPER_IC to include a NL. */ +// Added to NFA_ANY - NFA_NUPPER_IC to include a NL. #define NFA_ADD_NL 31 enum { NFA_SPLIT = -1024, NFA_MATCH, - NFA_EMPTY, /* matches 0-length */ + NFA_EMPTY, // matches 0-length NFA_START_COLL, // [abc] start NFA_END_COLL, // [abc] end @@ -64,17 +62,17 @@ enum { NFA_QUEST, // greedy \? (postfix only) NFA_QUEST_NONGREEDY, // non-greedy \? (postfix only) - NFA_BOL, /* ^ Begin line */ - NFA_EOL, /* $ End line */ - NFA_BOW, /* \< Begin word */ - NFA_EOW, /* \> End word */ - NFA_BOF, /* \%^ Begin file */ - NFA_EOF, /* \%$ End file */ + NFA_BOL, // ^ Begin line + NFA_EOL, // $ End line + NFA_BOW, // \< Begin word + NFA_EOW, // \> End word + NFA_BOF, // \%^ Begin file + NFA_EOF, // \%$ End file NFA_NEWL, - NFA_ZSTART, /* Used for \zs */ - NFA_ZEND, /* Used for \ze */ - NFA_NOPEN, /* Start of subexpression marked with \%( */ - NFA_NCLOSE, /* End of subexpr. marked with \%( ... \) */ + NFA_ZSTART, // Used for \zs + NFA_ZEND, // Used for \ze + NFA_NOPEN, // Start of subexpression marked with \%( + NFA_NCLOSE, // End of subexpr. marked with \%( ... \) NFA_START_INVISIBLE, NFA_START_INVISIBLE_FIRST, NFA_START_INVISIBLE_NEG, @@ -91,34 +89,34 @@ enum { // composing multibyte char NFA_END_COMPOSING, // End of a composing char in the NFA NFA_ANY_COMPOSING, // \%C: Any composing characters. - NFA_OPT_CHARS, /* \%[abc] */ - - /* The following are used only in the postfix form, not in the NFA */ - NFA_PREV_ATOM_NO_WIDTH, /* Used for \@= */ - NFA_PREV_ATOM_NO_WIDTH_NEG, /* Used for \@! */ - NFA_PREV_ATOM_JUST_BEFORE, /* Used for \@<= */ - NFA_PREV_ATOM_JUST_BEFORE_NEG, /* Used for \@<! */ - NFA_PREV_ATOM_LIKE_PATTERN, /* Used for \@> */ - - NFA_BACKREF1, /* \1 */ - NFA_BACKREF2, /* \2 */ - NFA_BACKREF3, /* \3 */ - NFA_BACKREF4, /* \4 */ - NFA_BACKREF5, /* \5 */ - NFA_BACKREF6, /* \6 */ - NFA_BACKREF7, /* \7 */ - NFA_BACKREF8, /* \8 */ - NFA_BACKREF9, /* \9 */ - NFA_ZREF1, /* \z1 */ - NFA_ZREF2, /* \z2 */ - NFA_ZREF3, /* \z3 */ - NFA_ZREF4, /* \z4 */ - NFA_ZREF5, /* \z5 */ - NFA_ZREF6, /* \z6 */ - NFA_ZREF7, /* \z7 */ - NFA_ZREF8, /* \z8 */ - NFA_ZREF9, /* \z9 */ - NFA_SKIP, /* Skip characters */ + NFA_OPT_CHARS, // \%[abc] + + // The following are used only in the postfix form, not in the NFA + NFA_PREV_ATOM_NO_WIDTH, // Used for \@= + NFA_PREV_ATOM_NO_WIDTH_NEG, // Used for \@! + NFA_PREV_ATOM_JUST_BEFORE, // Used for \@<= + NFA_PREV_ATOM_JUST_BEFORE_NEG, // Used for \@<! + NFA_PREV_ATOM_LIKE_PATTERN, // Used for \@> + + NFA_BACKREF1, // \1 + NFA_BACKREF2, // \2 + NFA_BACKREF3, // \3 + NFA_BACKREF4, // \4 + NFA_BACKREF5, // \5 + NFA_BACKREF6, // \6 + NFA_BACKREF7, // \7 + NFA_BACKREF8, // \8 + NFA_BACKREF9, // \9 + NFA_ZREF1, // \z1 + NFA_ZREF2, // \z2 + NFA_ZREF3, // \z3 + NFA_ZREF4, // \z4 + NFA_ZREF5, // \z5 + NFA_ZREF6, // \z6 + NFA_ZREF7, // \z7 + NFA_ZREF8, // \z8 + NFA_ZREF9, // \z9 + NFA_SKIP, // Skip characters NFA_MOPEN, NFA_MOPEN1, @@ -164,58 +162,58 @@ enum { NFA_ZCLOSE8, NFA_ZCLOSE9, - /* NFA_FIRST_NL */ - NFA_ANY, /* Match any one character. */ - NFA_IDENT, /* Match identifier char */ - NFA_SIDENT, /* Match identifier char but no digit */ - NFA_KWORD, /* Match keyword char */ - NFA_SKWORD, /* Match word char but no digit */ - NFA_FNAME, /* Match file name char */ - NFA_SFNAME, /* Match file name char but no digit */ - NFA_PRINT, /* Match printable char */ - NFA_SPRINT, /* Match printable char but no digit */ - NFA_WHITE, /* Match whitespace char */ - NFA_NWHITE, /* Match non-whitespace char */ - NFA_DIGIT, /* Match digit char */ - NFA_NDIGIT, /* Match non-digit char */ - NFA_HEX, /* Match hex char */ - NFA_NHEX, /* Match non-hex char */ - NFA_OCTAL, /* Match octal char */ - NFA_NOCTAL, /* Match non-octal char */ - NFA_WORD, /* Match word char */ - NFA_NWORD, /* Match non-word char */ - NFA_HEAD, /* Match head char */ - NFA_NHEAD, /* Match non-head char */ - NFA_ALPHA, /* Match alpha char */ - NFA_NALPHA, /* Match non-alpha char */ - NFA_LOWER, /* Match lowercase char */ - NFA_NLOWER, /* Match non-lowercase char */ - NFA_UPPER, /* Match uppercase char */ - NFA_NUPPER, /* Match non-uppercase char */ - NFA_LOWER_IC, /* Match [a-z] */ - NFA_NLOWER_IC, /* Match [^a-z] */ - NFA_UPPER_IC, /* Match [A-Z] */ - NFA_NUPPER_IC, /* Match [^A-Z] */ + // NFA_FIRST_NL + NFA_ANY, // Match any one character. + NFA_IDENT, // Match identifier char + NFA_SIDENT, // Match identifier char but no digit + NFA_KWORD, // Match keyword char + NFA_SKWORD, // Match word char but no digit + NFA_FNAME, // Match file name char + NFA_SFNAME, // Match file name char but no digit + NFA_PRINT, // Match printable char + NFA_SPRINT, // Match printable char but no digit + NFA_WHITE, // Match whitespace char + NFA_NWHITE, // Match non-whitespace char + NFA_DIGIT, // Match digit char + NFA_NDIGIT, // Match non-digit char + NFA_HEX, // Match hex char + NFA_NHEX, // Match non-hex char + NFA_OCTAL, // Match octal char + NFA_NOCTAL, // Match non-octal char + NFA_WORD, // Match word char + NFA_NWORD, // Match non-word char + NFA_HEAD, // Match head char + NFA_NHEAD, // Match non-head char + NFA_ALPHA, // Match alpha char + NFA_NALPHA, // Match non-alpha char + NFA_LOWER, // Match lowercase char + NFA_NLOWER, // Match non-lowercase char + NFA_UPPER, // Match uppercase char + NFA_NUPPER, // Match non-uppercase char + NFA_LOWER_IC, // Match [a-z] + NFA_NLOWER_IC, // Match [^a-z] + NFA_UPPER_IC, // Match [A-Z] + NFA_NUPPER_IC, // Match [^A-Z] NFA_FIRST_NL = NFA_ANY + NFA_ADD_NL, NFA_LAST_NL = NFA_NUPPER_IC + NFA_ADD_NL, - NFA_CURSOR, /* Match cursor pos */ - NFA_LNUM, /* Match line number */ - NFA_LNUM_GT, /* Match > line number */ - NFA_LNUM_LT, /* Match < line number */ - NFA_COL, /* Match cursor column */ - NFA_COL_GT, /* Match > cursor column */ - NFA_COL_LT, /* Match < cursor column */ - NFA_VCOL, /* Match cursor virtual column */ - NFA_VCOL_GT, /* Match > cursor virtual column */ - NFA_VCOL_LT, /* Match < cursor virtual column */ - NFA_MARK, /* Match mark */ - NFA_MARK_GT, /* Match > mark */ - NFA_MARK_LT, /* Match < mark */ - NFA_VISUAL, /* Match Visual area */ - - /* Character classes [:alnum:] etc */ + NFA_CURSOR, // Match cursor pos + NFA_LNUM, // Match line number + NFA_LNUM_GT, // Match > line number + NFA_LNUM_LT, // Match < line number + NFA_COL, // Match cursor column + NFA_COL_GT, // Match > cursor column + NFA_COL_LT, // Match < cursor column + NFA_VCOL, // Match cursor virtual column + NFA_VCOL_GT, // Match > cursor virtual column + NFA_VCOL_LT, // Match < cursor virtual column + NFA_MARK, // Match mark + NFA_MARK_GT, // Match > mark + NFA_MARK_LT, // Match < mark + NFA_VISUAL, // Match Visual area + + // Character classes [:alnum:] etc NFA_CLASS_ALNUM, NFA_CLASS_ALPHA, NFA_CLASS_BLANK, @@ -237,9 +235,9 @@ enum { NFA_CLASS_FNAME, }; -/* Keep in sync with classchars. */ +// Keep in sync with classchars. static int nfa_classcodes[] = { - NFA_ANY, NFA_IDENT, NFA_SIDENT, NFA_KWORD,NFA_SKWORD, + NFA_ANY, NFA_IDENT, NFA_SIDENT, NFA_KWORD, NFA_SKWORD, NFA_FNAME, NFA_SFNAME, NFA_PRINT, NFA_SPRINT, NFA_WHITE, NFA_NWHITE, NFA_DIGIT, NFA_NDIGIT, NFA_HEX, NFA_NHEX, NFA_OCTAL, NFA_NOCTAL, @@ -248,11 +246,9 @@ static int nfa_classcodes[] = { NFA_UPPER, NFA_NUPPER }; -static char_u e_nul_found[] = N_( - "E865: (NFA) Regexp end encountered prematurely"); +static char_u e_nul_found[] = N_("E865: (NFA) Regexp end encountered prematurely"); static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c"); -static char_u e_ill_char_class[] = N_( - "E877: (NFA regexp) Invalid character class: %" PRId64); +static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %" PRId64); static char_u e_value_too_large[] = N_("E951: \\% value too large"); // Since the out pointers in the list are always @@ -260,13 +256,13 @@ static char_u e_value_too_large[] = N_("E951: \\% value too large"); // as storage for the Ptrlists. typedef union Ptrlist Ptrlist; union Ptrlist { - Ptrlist *next; + Ptrlist *next; nfa_state_T *s; }; struct Frag { nfa_state_T *start; - Ptrlist *out; + Ptrlist *out; }; typedef struct Frag Frag_T; @@ -276,36 +272,36 @@ typedef struct { // When REG_MULTI is true list.multi is used, otherwise list.line. union { struct multipos { - linenr_T start_lnum; - linenr_T end_lnum; + linenr_T start_lnum; + linenr_T end_lnum; colnr_T start_col; colnr_T end_col; } multi[NSUBEXP]; struct linepos { - char_u *start; - char_u *end; + char_u *start; + char_u *end; } line[NSUBEXP]; } list; } regsub_T; typedef struct { - regsub_T norm; /* \( .. \) matches */ - regsub_T synt; /* \z( .. \) matches */ + regsub_T norm; // \( .. \) matches + regsub_T synt; // \z( .. \) matches } regsubs_T; -/* nfa_pim_T stores a Postponed Invisible Match. */ +// nfa_pim_T stores a Postponed Invisible Match. typedef struct nfa_pim_S nfa_pim_T; struct nfa_pim_S { - int result; /* NFA_PIM_*, see below */ - nfa_state_T *state; /* the invisible match start state */ - regsubs_T subs; /* submatch info, only party used */ + int result; // NFA_PIM_*, see below + nfa_state_T *state; // the invisible match start state + regsubs_T subs; // submatch info, only party used union { lpos_T pos; - char_u *ptr; - } end; /* where the match must end */ + char_u *ptr; + } end; // where the match must end }; -/* nfa_thread_T contains execution information of a NFA state */ +// nfa_thread_T contains execution information of a NFA state typedef struct { nfa_state_T *state; int count; @@ -316,7 +312,7 @@ typedef struct { // nfa_list_T contains the alternative NFA execution states. typedef struct { - nfa_thread_T *t; ///< allocated array of states + nfa_thread_T *t; ///< allocated array of states int n; ///< nr of states currently in "t" int len; ///< max nr of states in "t" int id; ///< ID of the list @@ -337,10 +333,10 @@ static bool wants_nfa; static int nstate; ///< Number of states in the NFA. Also used when executing. static int istate; ///< Index in the state vector, used in alloc_state() -/* If not NULL match must end at this position */ +// If not NULL match must end at this position static save_se_T *nfa_endp = NULL; -/* 0 for first call to nfa_regmatch(), 1 for recursive call. */ +// 0 for first call to nfa_regmatch(), 1 for recursive call. static int nfa_ll_index = 0; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -349,35 +345,31 @@ static int nfa_ll_index = 0; // Helper functions used when doing re2post() ... regatom() parsing #define EMIT(c) \ - do { \ - if (post_ptr >= post_end) { \ - realloc_post_list(); \ - } \ - *post_ptr++ = c; \ - } while (0) - -/* - * Initialize internal variables before NFA compilation. - */ -static void -nfa_regcomp_start ( - char_u *expr, - int re_flags /* see vim_regcomp() */ -) + do { \ + if (post_ptr >= post_end) { \ + realloc_post_list(); \ + } \ + *post_ptr++ = c; \ + } while (0) + +/// Initialize internal variables before NFA compilation. +/// +/// @param re_flags @see vim_regcomp() +static void nfa_regcomp_start(char_u *expr, int re_flags) { size_t postfix_size; size_t nstate_max; nstate = 0; istate = 0; - /* A reasonable estimation for maximum size */ + // A reasonable estimation for maximum size nstate_max = (STRLEN(expr) + 1) * 25; // Some items blow up in size, such as [A-z]. Add more space for that. // When it is still not enough realloc_post_list() will be used. nstate_max += 1000; - /* Size for postfix representation of expr. */ + // Size for postfix representation of expr. postfix_size = sizeof(int) * nstate_max; post_start = (int *)xmalloc(postfix_size); @@ -387,7 +379,7 @@ nfa_regcomp_start ( rex.nfa_has_zend = false; rex.nfa_has_backref = false; - /* shared with BT engine */ + // shared with BT engine regcomp_start(expr, re_flags); } @@ -399,14 +391,15 @@ static int nfa_get_reganch(nfa_state_T *start, int depth) { nfa_state_T *p = start; - if (depth > 4) + if (depth > 4) { return 0; + } while (p != NULL) { switch (p->c) { case NFA_BOL: case NFA_BOF: - return 1; /* yes! */ + return 1; // yes! case NFA_ZSTART: case NFA_ZEND: @@ -442,7 +435,7 @@ static int nfa_get_reganch(nfa_state_T *start, int depth) && nfa_get_reganch(p->out1, depth + 1); default: - return 0; /* noooo */ + return 0; // noooo } } return 0; @@ -456,12 +449,13 @@ static int nfa_get_regstart(nfa_state_T *start, int depth) { nfa_state_T *p = start; - if (depth > 4) + if (depth > 4) { return 0; + } while (p != NULL) { switch (p->c) { - /* all kinds of zero-width matches */ + // all kinds of zero-width matches case NFA_BOL: case NFA_BOF: case NFA_BOW: @@ -507,19 +501,20 @@ static int nfa_get_regstart(nfa_state_T *start, int depth) p = p->out; break; - case NFA_SPLIT: - { + case NFA_SPLIT: { int c1 = nfa_get_regstart(p->out, depth + 1); int c2 = nfa_get_regstart(p->out1, depth + 1); - if (c1 == c2) - return c1; /* yes! */ + if (c1 == c2) { + return c1; // yes! + } return 0; } default: - if (p->c > 0) - return p->c; /* yes! */ + if (p->c > 0) { + return p->c; // yes! + } return 0; } } @@ -535,21 +530,23 @@ static char_u *nfa_get_match_text(nfa_state_T *start) { nfa_state_T *p = start; int len = 0; - char_u *ret; - char_u *s; + char_u *ret; + char_u *s; - if (p->c != NFA_MOPEN) - return NULL; /* just in case */ + if (p->c != NFA_MOPEN) { + return NULL; // just in case + } p = p->out; while (p->c > 0) { len += utf_char2len(p->c); p = p->out; } - if (p->c != NFA_MCLOSE || p->out->c != NFA_MATCH) + if (p->c != NFA_MCLOSE || p->out->c != NFA_MATCH) { return NULL; + } ret = xmalloc(len); - p = start->out->out; /* skip first char, it goes into regstart */ + p = start->out->out; // skip first char, it goes into regstart s = ret; while (p->c > 0) { s += utf_char2bytes(p->c, (char *)s); @@ -587,22 +584,23 @@ static void realloc_post_list(void) */ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl) { -# define CLASS_not 0x80 -# define CLASS_af 0x40 -# define CLASS_AF 0x20 -# define CLASS_az 0x10 -# define CLASS_AZ 0x08 -# define CLASS_o7 0x04 -# define CLASS_o9 0x02 -# define CLASS_underscore 0x01 - - char_u *p; +#define CLASS_not 0x80 +#define CLASS_af 0x40 +#define CLASS_AF 0x20 +#define CLASS_az 0x10 +#define CLASS_AZ 0x08 +#define CLASS_o7 0x04 +#define CLASS_o9 0x02 +#define CLASS_underscore 0x01 + + char_u *p; int config = 0; bool newl = extra_newl == true; - if (*end != ']') + if (*end != ']') { return FAIL; + } p = start; if (*p == '^') { config |= CLASS_not; @@ -652,12 +650,14 @@ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl) } else if (*p == '\n') { newl = true; p++; - } else + } else { return FAIL; - } /* while (p < end) */ + } + } // while (p < end) - if (p != end) + if (p != end) { return FAIL; + } if (newl == true) { extra_newl = NFA_ADD_NL; @@ -769,17 +769,40 @@ static void nfa_emit_equi_class(int c) #define y_acute 0xfd #define y_diaeresis 0xff switch (c) { - case 'A': case A_grave: case A_acute: case A_circumflex: - case A_virguilla: case A_diaeresis: case A_ring: - case 0x100: case 0x102: case 0x104: case 0x1cd: - case 0x1de: case 0x1e0: case 0x1fa: case 0x200: - case 0x202: case 0x226: case 0x23a: case 0x1e00: - case 0x1ea0: case 0x1ea2: case 0x1ea4: case 0x1ea6: - case 0x1ea8: case 0x1eaa: case 0x1eac: case 0x1eae: - case 0x1eb0: case 0x1eb2: case 0x1eb4: case 0x1eb6: - EMIT2('A') EMIT2(A_grave) EMIT2(A_acute) - EMIT2(A_circumflex) EMIT2(A_virguilla) - EMIT2(A_diaeresis) EMIT2(A_ring) + case 'A': + case A_grave: + case A_acute: + case A_circumflex: + case A_virguilla: + case A_diaeresis: + case A_ring: + case 0x100: + case 0x102: + case 0x104: + case 0x1cd: + case 0x1de: + case 0x1e0: + case 0x1fa: + case 0x200: + case 0x202: + case 0x226: + case 0x23a: + case 0x1e00: + case 0x1ea0: + case 0x1ea2: + case 0x1ea4: + case 0x1ea6: + case 0x1ea8: + case 0x1eaa: + case 0x1eac: + case 0x1eae: + case 0x1eb0: + case 0x1eb2: + case 0x1eb4: + case 0x1eb6: + EMIT2('A') EMIT2(A_grave) EMIT2(A_acute) // NOLINT(whitespace/cast) + EMIT2(A_circumflex) EMIT2(A_virguilla) // NOLINT(whitespace/cast) + EMIT2(A_diaeresis) EMIT2(A_ring) // NOLINT(whitespace/cast) EMIT2(0x100) EMIT2(0x102) EMIT2(0x104) EMIT2(0x1cd) EMIT2(0x1de) EMIT2(0x1e0) EMIT2(0x1fa) EMIT2(0x200) EMIT2(0x202) @@ -790,39 +813,76 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eb2) EMIT2(0x1eb6) EMIT2(0x1eb4) return; - case 'B': case 0x181: case 0x243: case 0x1e02: - case 0x1e04: case 0x1e06: + case 'B': + case 0x181: + case 0x243: + case 0x1e02: + case 0x1e04: + case 0x1e06: EMIT2('B') EMIT2(0x181) EMIT2(0x243) EMIT2(0x1e02) EMIT2(0x1e04) EMIT2(0x1e06) return; - case 'C': case C_cedilla: case 0x106: case 0x108: - case 0x10a: case 0x10c: case 0x187: case 0x23b: - case 0x1e08: case 0xa792: + case 'C': + case C_cedilla: + case 0x106: + case 0x108: + case 0x10a: + case 0x10c: + case 0x187: + case 0x23b: + case 0x1e08: + case 0xa792: EMIT2('C') EMIT2(C_cedilla) EMIT2(0x106) EMIT2(0x108) EMIT2(0x10a) EMIT2(0x10c) EMIT2(0x187) EMIT2(0x23b) EMIT2(0x1e08) EMIT2(0xa792) return; - case 'D': case 0x10e: case 0x110: case 0x18a: - case 0x1e0a: case 0x1e0c: case 0x1e0e: case 0x1e10: + case 'D': + case 0x10e: + case 0x110: + case 0x18a: + case 0x1e0a: + case 0x1e0c: + case 0x1e0e: + case 0x1e10: case 0x1e12: EMIT2('D') EMIT2(0x10e) EMIT2(0x110) EMIT2(0x18a) EMIT2(0x1e0a) EMIT2(0x1e0c) EMIT2(0x1e0e) EMIT2(0x1e10) EMIT2(0x1e12) return; - case 'E': case E_grave: case E_acute: case E_circumflex: - case E_diaeresis: case 0x112: case 0x114: case 0x116: - case 0x118: case 0x11a: case 0x204: case 0x206: - case 0x228: case 0x246: case 0x1e14: case 0x1e16: - case 0x1e18: case 0x1e1a: case 0x1e1c: case 0x1eb8: - case 0x1eba: case 0x1ebc: case 0x1ebe: case 0x1ec0: - case 0x1ec2: case 0x1ec4: case 0x1ec6: - EMIT2('E') EMIT2(E_grave) EMIT2(E_acute) - EMIT2(E_circumflex) EMIT2(E_diaeresis) + case 'E': + case E_grave: + case E_acute: + case E_circumflex: + case E_diaeresis: + case 0x112: + case 0x114: + case 0x116: + case 0x118: + case 0x11a: + case 0x204: + case 0x206: + case 0x228: + case 0x246: + case 0x1e14: + case 0x1e16: + case 0x1e18: + case 0x1e1a: + case 0x1e1c: + case 0x1eb8: + case 0x1eba: + case 0x1ebc: + case 0x1ebe: + case 0x1ec0: + case 0x1ec2: + case 0x1ec4: + case 0x1ec6: + EMIT2('E') EMIT2(E_grave) EMIT2(E_acute) // NOLINT(whitespace/cast) + EMIT2(E_circumflex) EMIT2(E_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x112) EMIT2(0x114) EMIT2(0x116) EMIT2(0x118) EMIT2(0x11a) EMIT2(0x204) EMIT2(0x206) EMIT2(0x228) EMIT2(0x246) @@ -833,34 +893,65 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ec6) return; - case 'F': case 0x191: case 0x1e1e: case 0xa798: + case 'F': + case 0x191: + case 0x1e1e: + case 0xa798: EMIT2('F') EMIT2(0x191) EMIT2(0x1e1e) EMIT2(0xa798) return; - case 'G': case 0x11c: case 0x11e: case 0x120: - case 0x122: case 0x193: case 0x1e4: case 0x1e6: - case 0x1f4: case 0x1e20: case 0xa7a0: + case 'G': + case 0x11c: + case 0x11e: + case 0x120: + case 0x122: + case 0x193: + case 0x1e4: + case 0x1e6: + case 0x1f4: + case 0x1e20: + case 0xa7a0: EMIT2('G') EMIT2(0x11c) EMIT2(0x11e) EMIT2(0x120) EMIT2(0x122) EMIT2(0x193) EMIT2(0x1e4) EMIT2(0x1e6) EMIT2(0x1f4) EMIT2(0x1e20) EMIT2(0xa7a0) return; - case 'H': case 0x124: case 0x126: case 0x21e: - case 0x1e22: case 0x1e24: case 0x1e26: case 0x1e28: - case 0x1e2a: case 0x2c67: + case 'H': + case 0x124: + case 0x126: + case 0x21e: + case 0x1e22: + case 0x1e24: + case 0x1e26: + case 0x1e28: + case 0x1e2a: + case 0x2c67: EMIT2('H') EMIT2(0x124) EMIT2(0x126) EMIT2(0x21e) EMIT2(0x1e22) EMIT2(0x1e24) EMIT2(0x1e26) EMIT2(0x1e28) EMIT2(0x1e2a) EMIT2(0x2c67) return; - case 'I': case I_grave: case I_acute: case I_circumflex: - case I_diaeresis: case 0x128: case 0x12a: case 0x12c: - case 0x12e: case 0x130: case 0x197: case 0x1cf: - case 0x208: case 0x20a: case 0x1e2c: case 0x1e2e: - case 0x1ec8: case 0x1eca: - EMIT2('I') EMIT2(I_grave) EMIT2(I_acute) - EMIT2(I_circumflex) EMIT2(I_diaeresis) + case 'I': + case I_grave: + case I_acute: + case I_circumflex: + case I_diaeresis: + case 0x128: + case 0x12a: + case 0x12c: + case 0x12e: + case 0x130: + case 0x197: + case 0x1cf: + case 0x208: + case 0x20a: + case 0x1e2c: + case 0x1e2e: + case 0x1ec8: + case 0x1eca: + EMIT2('I') EMIT2(I_grave) EMIT2(I_acute) // NOLINT(whitespace/cast) + EMIT2(I_circumflex) EMIT2(I_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x128) EMIT2(0x12a) EMIT2(0x12c) EMIT2(0x12e) EMIT2(0x130) EMIT2(0x197) EMIT2(0x1cf) EMIT2(0x208) EMIT2(0x20a) @@ -868,34 +959,62 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eca) return; - case 'J': case 0x134: case 0x248: + case 'J': + case 0x134: + case 0x248: EMIT2('J') EMIT2(0x134) EMIT2(0x248) return; - case 'K': case 0x136: case 0x198: case 0x1e8: case 0x1e30: - case 0x1e32: case 0x1e34: case 0x2c69: case 0xa740: + case 'K': + case 0x136: + case 0x198: + case 0x1e8: + case 0x1e30: + case 0x1e32: + case 0x1e34: + case 0x2c69: + case 0xa740: EMIT2('K') EMIT2(0x136) EMIT2(0x198) EMIT2(0x1e8) EMIT2(0x1e30) EMIT2(0x1e32) EMIT2(0x1e34) EMIT2(0x2c69) EMIT2(0xa740) return; - case 'L': case 0x139: case 0x13b: case 0x13d: - case 0x13f: case 0x141: case 0x23d: case 0x1e36: - case 0x1e38: case 0x1e3a: case 0x1e3c: case 0x2c60: + case 'L': + case 0x139: + case 0x13b: + case 0x13d: + case 0x13f: + case 0x141: + case 0x23d: + case 0x1e36: + case 0x1e38: + case 0x1e3a: + case 0x1e3c: + case 0x2c60: EMIT2('L') EMIT2(0x139) EMIT2(0x13b) EMIT2(0x13d) EMIT2(0x13f) EMIT2(0x141) EMIT2(0x23d) EMIT2(0x1e36) EMIT2(0x1e38) EMIT2(0x1e3a) EMIT2(0x1e3c) EMIT2(0x2c60) return; - case 'M': case 0x1e3e: case 0x1e40: case 0x1e42: + case 'M': + case 0x1e3e: + case 0x1e40: + case 0x1e42: EMIT2('M') EMIT2(0x1e3e) EMIT2(0x1e40) EMIT2(0x1e42) return; - case 'N': case N_virguilla: - case 0x143: case 0x145: case 0x147: case 0x1f8: - case 0x1e44: case 0x1e46: case 0x1e48: case 0x1e4a: + case 'N': + case N_virguilla: + case 0x143: + case 0x145: + case 0x147: + case 0x1f8: + case 0x1e44: + case 0x1e46: + case 0x1e48: + case 0x1e4a: case 0xa7a4: EMIT2('N') EMIT2(N_virguilla) EMIT2(0x143) EMIT2(0x145) EMIT2(0x147) @@ -903,19 +1022,47 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e48) EMIT2(0x1e4a) EMIT2(0xa7a4) return; - case 'O': case O_grave: case O_acute: case O_circumflex: - case O_virguilla: case O_diaeresis: case O_slash: - case 0x14c: case 0x14e: case 0x150: case 0x19f: - case 0x1a0: case 0x1d1: case 0x1ea: case 0x1ec: - case 0x1fe: case 0x20c: case 0x20e: case 0x22a: - case 0x22c: case 0x22e: case 0x230: case 0x1e4c: - case 0x1e4e: case 0x1e50: case 0x1e52: case 0x1ecc: - case 0x1ece: case 0x1ed0: case 0x1ed2: case 0x1ed4: - case 0x1ed6: case 0x1ed8: case 0x1eda: case 0x1edc: - case 0x1ede: case 0x1ee0: case 0x1ee2: - EMIT2('O') EMIT2(O_grave) EMIT2(O_acute) - EMIT2(O_circumflex) EMIT2(O_virguilla) - EMIT2(O_diaeresis) EMIT2(O_slash) + case 'O': + case O_grave: + case O_acute: + case O_circumflex: + case O_virguilla: + case O_diaeresis: + case O_slash: + case 0x14c: + case 0x14e: + case 0x150: + case 0x19f: + case 0x1a0: + case 0x1d1: + case 0x1ea: + case 0x1ec: + case 0x1fe: + case 0x20c: + case 0x20e: + case 0x22a: + case 0x22c: + case 0x22e: + case 0x230: + case 0x1e4c: + case 0x1e4e: + case 0x1e50: + case 0x1e52: + case 0x1ecc: + case 0x1ece: + case 0x1ed0: + case 0x1ed2: + case 0x1ed4: + case 0x1ed6: + case 0x1ed8: + case 0x1eda: + case 0x1edc: + case 0x1ede: + case 0x1ee0: + case 0x1ee2: + EMIT2('O') EMIT2(O_grave) EMIT2(O_acute) // NOLINT(whitespace/cast) + EMIT2(O_circumflex) EMIT2(O_virguilla) // NOLINT(whitespace/cast) + EMIT2(O_diaeresis) EMIT2(O_slash) // NOLINT(whitespace/cast) EMIT2(0x14c) EMIT2(0x14e) EMIT2(0x150) EMIT2(0x19f) EMIT2(0x1a0) EMIT2(0x1d1) EMIT2(0x1ea) EMIT2(0x1ec) EMIT2(0x1fe) @@ -929,51 +1076,109 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ee2) return; - case 'P': case 0x1a4: case 0x1e54: case 0x1e56: case 0x2c63: + case 'P': + case 0x1a4: + case 0x1e54: + case 0x1e56: + case 0x2c63: EMIT2('P') EMIT2(0x1a4) EMIT2(0x1e54) EMIT2(0x1e56) EMIT2(0x2c63) return; - case 'Q': case 0x24a: + case 'Q': + case 0x24a: EMIT2('Q') EMIT2(0x24a) return; - case 'R': case 0x154: case 0x156: case 0x158: case 0x210: - case 0x212: case 0x24c: case 0x1e58: case 0x1e5a: - case 0x1e5c: case 0x1e5e: case 0x2c64: case 0xa7a6: + case 'R': + case 0x154: + case 0x156: + case 0x158: + case 0x210: + case 0x212: + case 0x24c: + case 0x1e58: + case 0x1e5a: + case 0x1e5c: + case 0x1e5e: + case 0x2c64: + case 0xa7a6: EMIT2('R') EMIT2(0x154) EMIT2(0x156) EMIT2(0x158) EMIT2(0x210) EMIT2(0x212) EMIT2(0x24c) EMIT2(0x1e58) EMIT2(0x1e5a) EMIT2(0x1e5c) EMIT2(0x1e5e) EMIT2(0x2c64) EMIT2(0xa7a6) return; - case 'S': case 0x15a: case 0x15c: case 0x15e: case 0x160: - case 0x218: case 0x1e60: case 0x1e62: case 0x1e64: - case 0x1e66: case 0x1e68: case 0x2c7e: case 0xa7a8: + case 'S': + case 0x15a: + case 0x15c: + case 0x15e: + case 0x160: + case 0x218: + case 0x1e60: + case 0x1e62: + case 0x1e64: + case 0x1e66: + case 0x1e68: + case 0x2c7e: + case 0xa7a8: EMIT2('S') EMIT2(0x15a) EMIT2(0x15c) EMIT2(0x15e) EMIT2(0x160) EMIT2(0x218) EMIT2(0x1e60) EMIT2(0x1e62) EMIT2(0x1e64) EMIT2(0x1e66) EMIT2(0x1e68) EMIT2(0x2c7e) EMIT2(0xa7a8) return; - case 'T': case 0x162: case 0x164: case 0x166: case 0x1ac: - case 0x1ae: case 0x21a: case 0x23e: case 0x1e6a: case 0x1e6c: - case 0x1e6e: case 0x1e70: + case 'T': + case 0x162: + case 0x164: + case 0x166: + case 0x1ac: + case 0x1ae: + case 0x21a: + case 0x23e: + case 0x1e6a: + case 0x1e6c: + case 0x1e6e: + case 0x1e70: EMIT2('T') EMIT2(0x162) EMIT2(0x164) EMIT2(0x166) EMIT2(0x1ac) EMIT2(0x1ae) EMIT2(0x23e) EMIT2(0x21a) EMIT2(0x1e6a) EMIT2(0x1e6c) EMIT2(0x1e6e) EMIT2(0x1e70) return; - case 'U': case U_grave: case U_acute: case U_diaeresis: - case U_circumflex: case 0x168: case 0x16a: case 0x16c: - case 0x16e: case 0x170: case 0x172: case 0x1af: - case 0x1d3: case 0x1d5: case 0x1d7: case 0x1d9: - case 0x1db: case 0x214: case 0x216: case 0x244: - case 0x1e72: case 0x1e74: case 0x1e76: case 0x1e78: - case 0x1e7a: case 0x1ee4: case 0x1ee6: case 0x1ee8: - case 0x1eea: case 0x1eec: case 0x1eee: case 0x1ef0: - EMIT2('U') EMIT2(U_grave) EMIT2(U_acute) - EMIT2(U_diaeresis) EMIT2(U_circumflex) + case 'U': + case U_grave: + case U_acute: + case U_diaeresis: + case U_circumflex: + case 0x168: + case 0x16a: + case 0x16c: + case 0x16e: + case 0x170: + case 0x172: + case 0x1af: + case 0x1d3: + case 0x1d5: + case 0x1d7: + case 0x1d9: + case 0x1db: + case 0x214: + case 0x216: + case 0x244: + case 0x1e72: + case 0x1e74: + case 0x1e76: + case 0x1e78: + case 0x1e7a: + case 0x1ee4: + case 0x1ee6: + case 0x1ee8: + case 0x1eea: + case 0x1eec: + case 0x1eee: + case 0x1ef0: + EMIT2('U') EMIT2(U_grave) EMIT2(U_acute) // NOLINT(whitespace/cast) + EMIT2(U_diaeresis) EMIT2(U_circumflex) // NOLINT(whitespace/cast) EMIT2(0x168) EMIT2(0x16a) EMIT2(0x16c) EMIT2(0x16e) EMIT2(0x170) EMIT2(0x172) EMIT2(0x1af) EMIT2(0x1d3) @@ -986,23 +1191,42 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef0) return; - case 'V': case 0x1b2: case 0x1e7c: case 0x1e7e: + case 'V': + case 0x1b2: + case 0x1e7c: + case 0x1e7e: EMIT2('V') EMIT2(0x1b2) EMIT2(0x1e7c) EMIT2(0x1e7e) return; - case 'W': case 0x174: case 0x1e80: case 0x1e82: case 0x1e84: - case 0x1e86: case 0x1e88: + case 'W': + case 0x174: + case 0x1e80: + case 0x1e82: + case 0x1e84: + case 0x1e86: + case 0x1e88: EMIT2('W') EMIT2(0x174) EMIT2(0x1e80) EMIT2(0x1e82) EMIT2(0x1e84) EMIT2(0x1e86) EMIT2(0x1e88) return; - case 'X': case 0x1e8a: case 0x1e8c: + case 'X': + case 0x1e8a: + case 0x1e8c: EMIT2('X') EMIT2(0x1e8a) EMIT2(0x1e8c) return; - case 'Y': case Y_acute: case 0x176: case 0x178: - case 0x1b3: case 0x232: case 0x24e: case 0x1e8e: - case 0x1ef2: case 0x1ef4: case 0x1ef6: case 0x1ef8: + case 'Y': + case Y_acute: + case 0x176: + case 0x178: + case 0x1b3: + case 0x232: + case 0x24e: + case 0x1e8e: + case 0x1ef2: + case 0x1ef4: + case 0x1ef6: + case 0x1ef8: EMIT2('Y') EMIT2(Y_acute) EMIT2(0x176) EMIT2(0x178) EMIT2(0x1b3) EMIT2(0x232) EMIT2(0x24e) EMIT2(0x1e8e) @@ -1010,26 +1234,56 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef8) return; - case 'Z': case 0x179: case 0x17b: case 0x17d: - case 0x1b5: case 0x1e90: case 0x1e92: case 0x1e94: + case 'Z': + case 0x179: + case 0x17b: + case 0x17d: + case 0x1b5: + case 0x1e90: + case 0x1e92: + case 0x1e94: case 0x2c6b: EMIT2('Z') EMIT2(0x179) EMIT2(0x17b) EMIT2(0x17d) EMIT2(0x1b5) EMIT2(0x1e90) EMIT2(0x1e92) EMIT2(0x1e94) EMIT2(0x2c6b) return; - case 'a': case a_grave: case a_acute: case a_circumflex: - case a_virguilla: case a_diaeresis: case a_ring: - case 0x101: case 0x103: case 0x105: case 0x1ce: - case 0x1df: case 0x1e1: case 0x1fb: case 0x201: - case 0x203: case 0x227: case 0x1d8f: case 0x1e01: - case 0x1e9a: case 0x1ea1: case 0x1ea3: case 0x1ea5: - case 0x1ea7: case 0x1ea9: case 0x1eab: case 0x1ead: - case 0x1eaf: case 0x1eb1: case 0x1eb3: case 0x1eb5: - case 0x1eb7: case 0x2c65: - EMIT2('a') EMIT2(a_grave) EMIT2(a_acute) - EMIT2(a_circumflex) EMIT2(a_virguilla) - EMIT2(a_diaeresis) EMIT2(a_ring) + case 'a': + case a_grave: + case a_acute: + case a_circumflex: + case a_virguilla: + case a_diaeresis: + case a_ring: + case 0x101: + case 0x103: + case 0x105: + case 0x1ce: + case 0x1df: + case 0x1e1: + case 0x1fb: + case 0x201: + case 0x203: + case 0x227: + case 0x1d8f: + case 0x1e01: + case 0x1e9a: + case 0x1ea1: + case 0x1ea3: + case 0x1ea5: + case 0x1ea7: + case 0x1ea9: + case 0x1eab: + case 0x1ead: + case 0x1eaf: + case 0x1eb1: + case 0x1eb3: + case 0x1eb5: + case 0x1eb7: + case 0x2c65: + EMIT2('a') EMIT2(a_grave) EMIT2(a_acute) // NOLINT(whitespace/cast) + EMIT2(a_circumflex) EMIT2(a_virguilla) // NOLINT(whitespace/cast) + EMIT2(a_diaeresis) EMIT2(a_ring) // NOLINT(whitespace/cast) EMIT2(0x101) EMIT2(0x103) EMIT2(0x105) EMIT2(0x1ce) EMIT2(0x1df) EMIT2(0x1e1) EMIT2(0x1fb) EMIT2(0x201) EMIT2(0x203) @@ -1041,14 +1295,28 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eb7) EMIT2(0x2c65) return; - case 'b': case 0x180: case 0x253: case 0x1d6c: case 0x1d80: - case 0x1e03: case 0x1e05: case 0x1e07: + case 'b': + case 0x180: + case 0x253: + case 0x1d6c: + case 0x1d80: + case 0x1e03: + case 0x1e05: + case 0x1e07: EMIT2('b') EMIT2(0x180) EMIT2(0x253) EMIT2(0x1d6c) EMIT2(0x1d80) EMIT2(0x1e03) EMIT2(0x1e05) EMIT2(0x1e07) return; - case 'c': case c_cedilla: case 0x107: case 0x109: case 0x10b: - case 0x10d: case 0x188: case 0x23c: case 0x1e09: case 0xa793: + case 'c': + case c_cedilla: + case 0x107: + case 0x109: + case 0x10b: + case 0x10d: + case 0x188: + case 0x23c: + case 0x1e09: + case 0xa793: case 0xa794: EMIT2('c') EMIT2(c_cedilla) EMIT2(0x107) EMIT2(0x109) EMIT2(0x10b) @@ -1056,24 +1324,54 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e09) EMIT2(0xa793) EMIT2(0xa794) return; - case 'd': case 0x10f: case 0x111: case 0x257: case 0x1d6d: - case 0x1d81: case 0x1d91: case 0x1e0b: case 0x1e0d: case 0x1e0f: - case 0x1e11: case 0x1e13: + case 'd': + case 0x10f: + case 0x111: + case 0x257: + case 0x1d6d: + case 0x1d81: + case 0x1d91: + case 0x1e0b: + case 0x1e0d: + case 0x1e0f: + case 0x1e11: + case 0x1e13: EMIT2('d') EMIT2(0x10f) EMIT2(0x111) EMIT2(0x257) EMIT2(0x1d6d) EMIT2(0x1d81) EMIT2(0x1d91) EMIT2(0x1e0b) EMIT2(0x1e0d) EMIT2(0x1e0f) EMIT2(0x1e11) EMIT2(0x1e13) return; - case 'e': case e_grave: case e_acute: case e_circumflex: - case e_diaeresis: case 0x113: case 0x115: case 0x117: - case 0x119: case 0x11b: case 0x205: case 0x207: - case 0x229: case 0x247: case 0x1d92: case 0x1e15: - case 0x1e17: case 0x1e19: case 0x1e1b: case 0x1e1d: - case 0x1eb9: case 0x1ebb: case 0x1ebd: case 0x1ebf: - case 0x1ec1: case 0x1ec3: case 0x1ec5: case 0x1ec7: - EMIT2('e') EMIT2(e_grave) EMIT2(e_acute) - EMIT2(e_circumflex) EMIT2(e_diaeresis) + case 'e': + case e_grave: + case e_acute: + case e_circumflex: + case e_diaeresis: + case 0x113: + case 0x115: + case 0x117: + case 0x119: + case 0x11b: + case 0x205: + case 0x207: + case 0x229: + case 0x247: + case 0x1d92: + case 0x1e15: + case 0x1e17: + case 0x1e19: + case 0x1e1b: + case 0x1e1d: + case 0x1eb9: + case 0x1ebb: + case 0x1ebd: + case 0x1ebf: + case 0x1ec1: + case 0x1ec3: + case 0x1ec5: + case 0x1ec7: + EMIT2('e') EMIT2(e_grave) EMIT2(e_acute) // NOLINT(whitespace/cast) + EMIT2(e_circumflex) EMIT2(e_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x113) EMIT2(0x115) EMIT2(0x117) EMIT2(0x119) EMIT2(0x11b) EMIT2(0x205) EMIT2(0x207) EMIT2(0x229) @@ -1084,37 +1382,72 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ec3) EMIT2(0x1ec5) EMIT2(0x1ec7) return; - case 'f': case 0x192: case 0x1d6e: case 0x1d82: - case 0x1e1f: case 0xa799: + case 'f': + case 0x192: + case 0x1d6e: + case 0x1d82: + case 0x1e1f: + case 0xa799: EMIT2('f') EMIT2(0x192) EMIT2(0x1d6e) EMIT2(0x1d82) EMIT2(0x1e1f) EMIT2(0xa799) return; - case 'g': case 0x11d: case 0x11f: case 0x121: case 0x123: - case 0x1e5: case 0x1e7: case 0x1f5: case 0x260: case 0x1d83: - case 0x1e21: case 0xa7a1: + case 'g': + case 0x11d: + case 0x11f: + case 0x121: + case 0x123: + case 0x1e5: + case 0x1e7: + case 0x1f5: + case 0x260: + case 0x1d83: + case 0x1e21: + case 0xa7a1: EMIT2('g') EMIT2(0x11d) EMIT2(0x11f) EMIT2(0x121) EMIT2(0x123) EMIT2(0x1e5) EMIT2(0x1e7) EMIT2(0x1f5) EMIT2(0x260) EMIT2(0x1d83) EMIT2(0x1e21) EMIT2(0xa7a1) return; - case 'h': case 0x125: case 0x127: case 0x21f: case 0x1e23: - case 0x1e25: case 0x1e27: case 0x1e29: case 0x1e2b: - case 0x1e96: case 0x2c68: case 0xa795: + case 'h': + case 0x125: + case 0x127: + case 0x21f: + case 0x1e23: + case 0x1e25: + case 0x1e27: + case 0x1e29: + case 0x1e2b: + case 0x1e96: + case 0x2c68: + case 0xa795: EMIT2('h') EMIT2(0x125) EMIT2(0x127) EMIT2(0x21f) EMIT2(0x1e23) EMIT2(0x1e25) EMIT2(0x1e27) EMIT2(0x1e29) EMIT2(0x1e2b) EMIT2(0x1e96) EMIT2(0x2c68) EMIT2(0xa795) return; - case 'i': case i_grave: case i_acute: case i_circumflex: - case i_diaeresis: case 0x129: case 0x12b: case 0x12d: - case 0x12f: case 0x1d0: case 0x209: case 0x20b: - case 0x268: case 0x1d96: case 0x1e2d: case 0x1e2f: - case 0x1ec9: case 0x1ecb: - EMIT2('i') EMIT2(i_grave) EMIT2(i_acute) - EMIT2(i_circumflex) EMIT2(i_diaeresis) + case 'i': + case i_grave: + case i_acute: + case i_circumflex: + case i_diaeresis: + case 0x129: + case 0x12b: + case 0x12d: + case 0x12f: + case 0x1d0: + case 0x209: + case 0x20b: + case 0x268: + case 0x1d96: + case 0x1e2d: + case 0x1e2f: + case 0x1ec9: + case 0x1ecb: + EMIT2('i') EMIT2(i_grave) EMIT2(i_acute) // NOLINT(whitespace/cast) + EMIT2(i_circumflex) EMIT2(i_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x129) EMIT2(0x12b) EMIT2(0x12d) EMIT2(0x12f) EMIT2(0x1d0) EMIT2(0x209) EMIT2(0x20b) EMIT2(0x268) EMIT2(0x1d96) @@ -1122,34 +1455,69 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ecb) EMIT2(0x1ecb) return; - case 'j': case 0x135: case 0x1f0: case 0x249: + case 'j': + case 0x135: + case 0x1f0: + case 0x249: EMIT2('j') EMIT2(0x135) EMIT2(0x1f0) EMIT2(0x249) return; - case 'k': case 0x137: case 0x199: case 0x1e9: case 0x1d84: - case 0x1e31: case 0x1e33: case 0x1e35: case 0x2c6a: case 0xa741: + case 'k': + case 0x137: + case 0x199: + case 0x1e9: + case 0x1d84: + case 0x1e31: + case 0x1e33: + case 0x1e35: + case 0x2c6a: + case 0xa741: EMIT2('k') EMIT2(0x137) EMIT2(0x199) EMIT2(0x1e9) EMIT2(0x1d84) EMIT2(0x1e31) EMIT2(0x1e33) EMIT2(0x1e35) EMIT2(0x2c6a) EMIT2(0xa741) return; - case 'l': case 0x13a: case 0x13c: case 0x13e: case 0x140: - case 0x142: case 0x19a: case 0x1e37: case 0x1e39: case 0x1e3b: - case 0x1e3d: case 0x2c61: + case 'l': + case 0x13a: + case 0x13c: + case 0x13e: + case 0x140: + case 0x142: + case 0x19a: + case 0x1e37: + case 0x1e39: + case 0x1e3b: + case 0x1e3d: + case 0x2c61: EMIT2('l') EMIT2(0x13a) EMIT2(0x13c) EMIT2(0x13e) EMIT2(0x140) EMIT2(0x142) EMIT2(0x19a) EMIT2(0x1e37) EMIT2(0x1e39) EMIT2(0x1e3b) EMIT2(0x1e3d) EMIT2(0x2c61) return; - case 'm': case 0x1d6f: case 0x1e3f: case 0x1e41: case 0x1e43: + case 'm': + case 0x1d6f: + case 0x1e3f: + case 0x1e41: + case 0x1e43: EMIT2('m') EMIT2(0x1d6f) EMIT2(0x1e3f) EMIT2(0x1e41) EMIT2(0x1e43) return; - case 'n': case n_virguilla: case 0x144: case 0x146: case 0x148: - case 0x149: case 0x1f9: case 0x1d70: case 0x1d87: case 0x1e45: - case 0x1e47: case 0x1e49: case 0x1e4b: case 0xa7a5: + case 'n': + case n_virguilla: + case 0x144: + case 0x146: + case 0x148: + case 0x149: + case 0x1f9: + case 0x1d70: + case 0x1d87: + case 0x1e45: + case 0x1e47: + case 0x1e49: + case 0x1e4b: + case 0xa7a5: EMIT2('n') EMIT2(n_virguilla) EMIT2(0x144) EMIT2(0x146) EMIT2(0x148) EMIT2(0x149) EMIT2(0x1f9) EMIT2(0x1d70) @@ -1157,19 +1525,47 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e49) EMIT2(0x1e4b) EMIT2(0xa7a5) return; - case 'o': case o_grave: case o_acute: case o_circumflex: - case o_virguilla: case o_diaeresis: case o_slash: - case 0x14d: case 0x14f: case 0x151: case 0x1a1: - case 0x1d2: case 0x1eb: case 0x1ed: case 0x1ff: - case 0x20d: case 0x20f: case 0x22b: case 0x22d: - case 0x22f: case 0x231: case 0x275: case 0x1e4d: - case 0x1e4f: case 0x1e51: case 0x1e53: case 0x1ecd: - case 0x1ecf: case 0x1ed1: case 0x1ed3: case 0x1ed5: - case 0x1ed7: case 0x1ed9: case 0x1edb: case 0x1edd: - case 0x1edf: case 0x1ee1: case 0x1ee3: - EMIT2('o') EMIT2(o_grave) EMIT2(o_acute) - EMIT2(o_circumflex) EMIT2(o_virguilla) - EMIT2(o_diaeresis) EMIT2(o_slash) + case 'o': + case o_grave: + case o_acute: + case o_circumflex: + case o_virguilla: + case o_diaeresis: + case o_slash: + case 0x14d: + case 0x14f: + case 0x151: + case 0x1a1: + case 0x1d2: + case 0x1eb: + case 0x1ed: + case 0x1ff: + case 0x20d: + case 0x20f: + case 0x22b: + case 0x22d: + case 0x22f: + case 0x231: + case 0x275: + case 0x1e4d: + case 0x1e4f: + case 0x1e51: + case 0x1e53: + case 0x1ecd: + case 0x1ecf: + case 0x1ed1: + case 0x1ed3: + case 0x1ed5: + case 0x1ed7: + case 0x1ed9: + case 0x1edb: + case 0x1edd: + case 0x1edf: + case 0x1ee1: + case 0x1ee3: + EMIT2('o') EMIT2(o_grave) EMIT2(o_acute) // NOLINT(whitespace/cast) + EMIT2(o_circumflex) EMIT2(o_virguilla) // NOLINT(whitespace/cast) + EMIT2(o_diaeresis) EMIT2(o_slash) // NOLINT(whitespace/cast) EMIT2(0x14d) EMIT2(0x14f) EMIT2(0x151) EMIT2(0x1a1) EMIT2(0x1d2) EMIT2(0x1eb) EMIT2(0x1ed) EMIT2(0x1ff) EMIT2(0x20d) @@ -1183,19 +1579,38 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ee3) return; - case 'p': case 0x1a5: case 0x1d71: case 0x1d7d: case 0x1d88: - case 0x1e55: case 0x1e57: + case 'p': + case 0x1a5: + case 0x1d71: + case 0x1d7d: + case 0x1d88: + case 0x1e55: + case 0x1e57: EMIT2('p') EMIT2(0x1a5) EMIT2(0x1d71) EMIT2(0x1d7d) EMIT2(0x1d88) EMIT2(0x1e55) EMIT2(0x1e57) return; - case 'q': case 0x24b: case 0x2a0: + case 'q': + case 0x24b: + case 0x2a0: EMIT2('q') EMIT2(0x24b) EMIT2(0x2a0) return; - case 'r': case 0x155: case 0x157: case 0x159: case 0x211: - case 0x213: case 0x24d: case 0x27d: case 0x1d72: case 0x1d73: - case 0x1d89: case 0x1e59: case 0x1e5b: case 0x1e5d: case 0x1e5f: + case 'r': + case 0x155: + case 0x157: + case 0x159: + case 0x211: + case 0x213: + case 0x24d: + case 0x27d: + case 0x1d72: + case 0x1d73: + case 0x1d89: + case 0x1e59: + case 0x1e5b: + case 0x1e5d: + case 0x1e5f: case 0xa7a7: EMIT2('r') EMIT2(0x155) EMIT2(0x157) EMIT2(0x159) EMIT2(0x211) EMIT2(0x213) EMIT2(0x24d) EMIT2(0x27d) @@ -1203,34 +1618,84 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e5b) EMIT2(0x1e5d) EMIT2(0x1e5f) EMIT2(0xa7a7) return; - case 's': case 0x15b: case 0x15d: case 0x15f: case 0x161: - case 0x219: case 0x23f: case 0x1d74: case 0x1d8a: case 0x1e61: - case 0x1e63: case 0x1e65: case 0x1e67: case 0x1e69: case 0xa7a9: + case 's': + case 0x15b: + case 0x15d: + case 0x15f: + case 0x161: + case 0x219: + case 0x23f: + case 0x1d74: + case 0x1d8a: + case 0x1e61: + case 0x1e63: + case 0x1e65: + case 0x1e67: + case 0x1e69: + case 0xa7a9: EMIT2('s') EMIT2(0x15b) EMIT2(0x15d) EMIT2(0x15f) EMIT2(0x161) EMIT2(0x219) EMIT2(0x23f) EMIT2(0x1d74) EMIT2(0x1d8a) EMIT2(0x1e61) EMIT2(0x1e63) EMIT2(0x1e65) EMIT2(0x1e67) EMIT2(0x1e69) EMIT2(0xa7a9) return; - case 't': case 0x163: case 0x165: case 0x167: case 0x1ab: - case 0x1ad: case 0x21b: case 0x288: case 0x1d75: case 0x1e6b: - case 0x1e6d: case 0x1e6f: case 0x1e71: case 0x1e97: case 0x2c66: + case 't': + case 0x163: + case 0x165: + case 0x167: + case 0x1ab: + case 0x1ad: + case 0x21b: + case 0x288: + case 0x1d75: + case 0x1e6b: + case 0x1e6d: + case 0x1e6f: + case 0x1e71: + case 0x1e97: + case 0x2c66: EMIT2('t') EMIT2(0x163) EMIT2(0x165) EMIT2(0x167) EMIT2(0x1ab) EMIT2(0x1ad) EMIT2(0x21b) EMIT2(0x288) EMIT2(0x1d75) EMIT2(0x1e6b) EMIT2(0x1e6d) EMIT2(0x1e6f) EMIT2(0x1e71) EMIT2(0x1e97) EMIT2(0x2c66) return; - case 'u': case u_grave: case u_acute: case u_circumflex: - case u_diaeresis: case 0x169: case 0x16b: case 0x16d: - case 0x16f: case 0x171: case 0x173: case 0x1b0: case 0x1d4: - case 0x1d6: case 0x1d8: case 0x1da: case 0x1dc: case 0x215: - case 0x217: case 0x289: case 0x1d7e: case 0x1d99: case 0x1e73: - case 0x1e75: case 0x1e77: case 0x1e79: case 0x1e7b: - case 0x1ee5: case 0x1ee7: case 0x1ee9: case 0x1eeb: - case 0x1eed: case 0x1eef: case 0x1ef1: - EMIT2('u') EMIT2(u_grave) EMIT2(u_acute) - EMIT2(u_circumflex) EMIT2(u_diaeresis) + case 'u': + case u_grave: + case u_acute: + case u_circumflex: + case u_diaeresis: + case 0x169: + case 0x16b: + case 0x16d: + case 0x16f: + case 0x171: + case 0x173: + case 0x1b0: + case 0x1d4: + case 0x1d6: + case 0x1d8: + case 0x1da: + case 0x1dc: + case 0x215: + case 0x217: + case 0x289: + case 0x1d7e: + case 0x1d99: + case 0x1e73: + case 0x1e75: + case 0x1e77: + case 0x1e79: + case 0x1e7b: + case 0x1ee5: + case 0x1ee7: + case 0x1ee9: + case 0x1eeb: + case 0x1eed: + case 0x1eef: + case 0x1ef1: + EMIT2('u') EMIT2(u_grave) EMIT2(u_acute) // NOLINT(whitespace/cast) + EMIT2(u_circumflex) EMIT2(u_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x169) EMIT2(0x16b) EMIT2(0x16d) EMIT2(0x16f) EMIT2(0x171) EMIT2(0x173) EMIT2(0x1d6) EMIT2(0x1d8) @@ -1243,24 +1708,45 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eed) EMIT2(0x1eef) EMIT2(0x1ef1) return; - case 'v': case 0x28b: case 0x1d8c: case 0x1e7d: case 0x1e7f: + case 'v': + case 0x28b: + case 0x1d8c: + case 0x1e7d: + case 0x1e7f: EMIT2('v') EMIT2(0x28b) EMIT2(0x1d8c) EMIT2(0x1e7d) EMIT2(0x1e7f) return; - case 'w': case 0x175: case 0x1e81: case 0x1e83: case 0x1e85: - case 0x1e87: case 0x1e89: case 0x1e98: + case 'w': + case 0x175: + case 0x1e81: + case 0x1e83: + case 0x1e85: + case 0x1e87: + case 0x1e89: + case 0x1e98: EMIT2('w') EMIT2(0x175) EMIT2(0x1e81) EMIT2(0x1e83) EMIT2(0x1e85) EMIT2(0x1e87) EMIT2(0x1e89) EMIT2(0x1e98) return; - case 'x': case 0x1e8b: case 0x1e8d: + case 'x': + case 0x1e8b: + case 0x1e8d: EMIT2('x') EMIT2(0x1e8b) EMIT2(0x1e8d) return; - case 'y': case y_acute: case y_diaeresis: case 0x177: - case 0x1b4: case 0x233: case 0x24f: case 0x1e8f: - case 0x1e99: case 0x1ef3: case 0x1ef5: case 0x1ef7: + case 'y': + case y_acute: + case y_diaeresis: + case 0x177: + case 0x1b4: + case 0x233: + case 0x24f: + case 0x1e8f: + case 0x1e99: + case 0x1ef3: + case 0x1ef5: + case 0x1ef7: case 0x1ef9: EMIT2('y') EMIT2(y_acute) EMIT2(y_diaeresis) EMIT2(0x177) EMIT2(0x1b4) EMIT2(0x233) EMIT2(0x24f) @@ -1268,9 +1754,17 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef5) EMIT2(0x1ef7) EMIT2(0x1ef9) return; - case 'z': case 0x17a: case 0x17c: case 0x17e: case 0x1b6: - case 0x1d76: case 0x1d8e: case 0x1e91: case 0x1e93: - case 0x1e95: case 0x2c6c: + case 'z': + case 0x17a: + case 0x17c: + case 0x17e: + case 0x1b6: + case 0x1d76: + case 0x1d8e: + case 0x1e91: + case 0x1e93: + case 0x1e95: + case 0x2c6c: EMIT2('z') EMIT2(0x17a) EMIT2(0x17c) EMIT2(0x17e) EMIT2(0x1b6) EMIT2(0x1d76) EMIT2(0x1d8e) EMIT2(0x1e91) EMIT2(0x1e93) EMIT2(0x1e95) EMIT2(0x2c6c) @@ -1311,9 +1805,9 @@ static int nfa_regatom(void) int equiclass; int collclass; int got_coll_char; - char_u *p; - char_u *endp; - char_u *old_regparse = regparse; + char_u *p; + char_u *endp; + char_u *old_regparse = regparse; int extra = 0; int emit_range; int negated; @@ -1344,14 +1838,15 @@ static int nfa_regatom(void) case Magic('_'): c = no_Magic(getchr()); - if (c == NUL) + if (c == NUL) { EMSG_RET_FAIL(_(e_nul_found)); + } - if (c == '^') { /* "\_^" is start-of-line */ + if (c == '^') { // "\_^" is start-of-line EMIT(NFA_BOL); break; } - if (c == '$') { /* "\_$" is end-of-line */ + if (c == '$') { // "\_$" is end-of-line EMIT(NFA_EOL); had_eol = true; break; @@ -1359,12 +1854,13 @@ static int nfa_regatom(void) extra = NFA_ADD_NL; - /* "\_[" is collection plus newline */ - if (c == '[') + // "\_[" is collection plus newline + if (c == '[') { goto collection; + } - // "\_x" is character class plus newline - FALLTHROUGH; + // "\_x" is character class plus newline + FALLTHROUGH; /* * Character classes. @@ -1396,7 +1892,7 @@ static int nfa_regatom(void) case Magic('L'): case Magic('u'): case Magic('U'): - p = vim_strchr(classchars, no_Magic(c)); + p = (char_u *)vim_strchr((char *)classchars, no_Magic(c)); if (p == NULL) { if (extra == NFA_ADD_NL) { semsg(_(e_ill_char_class), (int64_t)c); @@ -1454,9 +1950,8 @@ static int nfa_regatom(void) semsg(_(e_misplaced), (int64_t)no_Magic(c)); return FAIL; - case Magic('~'): - { - char_u *lp; + case Magic('~'): { + char_u *lp; // Previous substitute pattern. // Generated as "\%(pattern\)". @@ -1482,17 +1977,16 @@ static int nfa_regatom(void) case Magic('6'): case Magic('7'): case Magic('8'): - case Magic('9'): - { - int refnum = no_Magic(c) - '1'; + case Magic('9'): { + int refnum = no_Magic(c) - '1'; - if (!seen_endbrace(refnum + 1)) { - return FAIL; - } - EMIT(NFA_BACKREF1 + refnum); - rex.nfa_has_backref = true; + if (!seen_endbrace(refnum + 1)) { + return FAIL; } - break; + EMIT(NFA_BACKREF1 + refnum); + rex.nfa_has_backref = true; + } + break; case Magic('z'): c = no_Magic(getchr()); @@ -1548,28 +2042,35 @@ static int nfa_regatom(void) case Magic('%'): c = no_Magic(getchr()); switch (c) { - /* () without a back reference */ + // () without a back reference case '(': - if (nfa_reg(REG_NPAREN) == FAIL) + if (nfa_reg(REG_NPAREN) == FAIL) { return FAIL; + } EMIT(NFA_NOPEN); break; - case 'd': /* %d123 decimal */ - case 'o': /* %o123 octal */ - case 'x': /* %xab hex 2 */ - case 'u': /* %uabcd hex 4 */ - case 'U': /* %U1234abcd hex 8 */ + case 'd': // %d123 decimal + case 'o': // %o123 octal + case 'x': // %xab hex 2 + case 'u': // %uabcd hex 4 + case 'U': // %U1234abcd hex 8 { int64_t nr; switch (c) { - case 'd': nr = getdecchrs(); break; - case 'o': nr = getoctchrs(); break; - case 'x': nr = gethexchrs(2); break; - case 'u': nr = gethexchrs(4); break; - case 'U': nr = gethexchrs(8); break; - default: nr = -1; break; + case 'd': + nr = getdecchrs(); break; + case 'o': + nr = getoctchrs(); break; + case 'x': + nr = gethexchrs(2); break; + case 'u': + nr = gethexchrs(4); break; + case 'U': + nr = gethexchrs(8); break; + default: + nr = -1; break; } if (nr < 0 || nr > INT_MAX) { @@ -1604,18 +2105,19 @@ static int nfa_regatom(void) EMIT(NFA_ANY_COMPOSING); break; - case '[': - { + case '[': { int n; - /* \%[abc] */ - for (n = 0; (c = peekchr()) != ']'; ++n) { - if (c == NUL) + // \%[abc] + for (n = 0; (c = peekchr()) != ']'; n++) { + if (c == NUL) { EMSG2_RET_FAIL(_(e_missing_sb), - reg_magic == MAGIC_ALL); - /* recursive call! */ - if (nfa_regatom() == FAIL) + reg_magic == MAGIC_ALL); + } + // recursive call! + if (nfa_regatom() == FAIL) { return FAIL; + } } (void)getchr(); // get the ] if (n == 0) { @@ -1635,8 +2137,7 @@ static int nfa_regatom(void) break; } - default: - { + default: { int64_t n = 0; const int cmp = c; bool cur = false; @@ -1700,9 +2201,9 @@ static int nfa_regatom(void) EMIT((int)n); break; } else if (c == '\'' && n == 0) { - /* \%'m \%<'m \%>'m */ + // \%'m \%<'m \%>'m EMIT(cmp == '<' ? NFA_MARK_LT : - cmp == '>' ? NFA_MARK_GT : NFA_MARK); + cmp == '>' ? NFA_MARK_GT : NFA_MARK); EMIT(getchr()); break; } @@ -1740,8 +2241,9 @@ collection: EMIT(result - NFA_ADD_NL); EMIT(NFA_NEWL); EMIT(NFA_OR); - } else + } else { EMIT(result); + } regparse = endp; MB_PTR_ADV(regparse); return OK; @@ -1756,8 +2258,9 @@ collection: negated = true; MB_PTR_ADV(regparse); EMIT(NFA_START_NEG_COLL); - } else + } else { EMIT(NFA_START_COLL); + } if (*regparse == '-') { startc = '-'; EMIT(startc); @@ -1771,16 +2274,17 @@ collection: startc = -1; got_coll_char = false; if (*regparse == '[') { - /* Check for [: :], [= =], [. .] */ + // Check for [: :], [= =], [. .] equiclass = collclass = 0; charclass = get_char_class(®parse); if (charclass == CLASS_NONE) { equiclass = get_equi_class(®parse); - if (equiclass == 0) + if (equiclass == 0) { collclass = get_coll_element(®parse); + } } - /* Character class like [:alpha:] */ + // Character class like [:alpha:] if (charclass != CLASS_NONE) { switch (charclass) { case CLASS_ALNUM: @@ -1846,12 +2350,12 @@ collection: EMIT(NFA_CONCAT); continue; } - /* Try equivalence class [=a=] and the like */ + // Try equivalence class [=a=] and the like if (equiclass != 0) { nfa_emit_equi_class(equiclass); continue; } - /* Try collating class like [. .] */ + // Try collating class like [. .] if (collclass != 0) { startc = collclass; // allow [.a.]-x as a range // Will emit the proper atom at the end of the @@ -1876,26 +2380,23 @@ collection: && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, regparse[1]) - != NULL) - ) - ) { + != NULL))) { MB_PTR_ADV(regparse); if (*regparse == 'n') { startc = (reg_string || emit_range || regparse[1] == '-') ? NL : NFA_NEWL; - } else if (*regparse == 'd' - || *regparse == 'o' - || *regparse == 'x' - || *regparse == 'u' - || *regparse == 'U' - ) { + } else if (*regparse == 'd' + || *regparse == 'o' + || *regparse == 'x' + || *regparse == 'u' + || *regparse == 'U') { // TODO(RE): This needs more testing startc = coll_get_char(); got_coll_char = true; MB_PTR_BACK(old_regparse, regparse); } else { - /* \r,\t,\e,\b */ + // \r,\t,\e,\b startc = backslash_trans(*regparse); } } @@ -1905,7 +2406,7 @@ collection: startc = utf_ptr2char((char *)regparse); } - /* Previous char was '-', so this char is end of range. */ + // Previous char was '-', so this char is end of range. if (emit_range) { int endc = startc; startc = oldstartc; @@ -1977,7 +2478,7 @@ collection: EMIT(NFA_CONCAT); } - /* skip the trailing ] */ + // skip the trailing ] regparse = endp; MB_PTR_ADV(regparse); @@ -1995,14 +2496,14 @@ collection: } return OK; - } /* if exists closing ] */ + } // if exists closing ] - if (reg_strict) + if (reg_strict) { EMSG_RET_FAIL(_(e_missingbracket)); + } FALLTHROUGH; - default: - { + default: { int plen; nfa_do_multibyte: @@ -2019,12 +2520,14 @@ nfa_do_multibyte: // building the postfix form, not the NFA itself; // a composing char could be: a, b, c, NFA_COMPOSING // where 'b' and 'c' are chars with codes > 256. */ - for (;; ) { + for (;;) { EMIT(c); - if (i > 0) + if (i > 0) { EMIT(NFA_CONCAT); - if ((i += utf_char2len(c)) >= plen) + } + if ((i += utf_char2len(c)) >= plen) { break; + } c = utf_ptr2char((char *)old_regparse + i); } EMIT(NFA_COMPOSING); @@ -2047,8 +2550,8 @@ nfa_do_multibyte: * times the atom can be matched. Example: "a*" matches any sequence of "a" * characters: "", "a", "aa", etc. * - * piece ::= atom - * or atom multi + * piece ::= atom + * or atom multi */ static int nfa_regpiece(void) { @@ -2068,16 +2571,17 @@ static int nfa_regpiece(void) // next. save_parse_state(&old_state); - /* store current pos in the postfix form, for \{m,n} involving 0s */ + // store current pos in the postfix form, for \{m,n} involving 0s my_post_start = (int)(post_ptr - post_start); ret = nfa_regatom(); - if (ret == FAIL) - return FAIL; /* cascaded error */ - + if (ret == FAIL) { + return FAIL; // cascaded error + } op = peekchr(); - if (re_multi_type(op) == NOT_MULTI) + if (re_multi_type(op) == NOT_MULTI) { return OK; + } skipchr(); switch (op) { @@ -2099,37 +2603,39 @@ static int nfa_regpiece(void) */ restore_parse_state(&old_state); curchr = -1; - if (nfa_regatom() == FAIL) + if (nfa_regatom() == FAIL) { return FAIL; + } EMIT(NFA_STAR); EMIT(NFA_CONCAT); - skipchr(); /* skip the \+ */ + skipchr(); // skip the \+ break; case Magic('@'): c2 = getdecchrs(); op = no_Magic(getchr()); i = 0; - switch(op) { + switch (op) { case '=': - /* \@= */ + // \@= i = NFA_PREV_ATOM_NO_WIDTH; break; case '!': - /* \@! */ + // \@! i = NFA_PREV_ATOM_NO_WIDTH_NEG; break; case '<': op = no_Magic(getchr()); - if (op == '=') - /* \@<= */ + if (op == '=') { + // \@<= i = NFA_PREV_ATOM_JUST_BEFORE; - else if (op == '!') - /* \@<! */ + } else if (op == '!') { + // \@<! i = NFA_PREV_ATOM_JUST_BEFORE_NEG; + } break; case '>': - /* \@> */ + // \@> i = NFA_PREV_ATOM_LIKE_PATTERN; break; } @@ -2139,8 +2645,9 @@ static int nfa_regpiece(void) } EMIT(i); if (i == NFA_PREV_ATOM_JUST_BEFORE - || i == NFA_PREV_ATOM_JUST_BEFORE_NEG) + || i == NFA_PREV_ATOM_JUST_BEFORE_NEG) { EMIT(c2); + } break; case Magic('?'): @@ -2161,26 +2668,28 @@ static int nfa_regpiece(void) skipchr(); greedy = false; } - if (!read_limits(&minval, &maxval)) + if (!read_limits(&minval, &maxval)) { EMSG_RET_FAIL(_("E870: (NFA regexp) Error reading repetition limits")); + } // <atom>{0,inf}, <atom>{0,} and <atom>{} are equivalent to // <atom>* if (minval == 0 && maxval == MAX_LIMIT) { - if (greedy) - /* \{}, \{0,} */ + if (greedy) { + // \{}, \{0,} EMIT(NFA_STAR); - else - /* \{-}, \{-0,} */ + } else { + // \{-}, \{-0,} EMIT(NFA_STAR_NONGREEDY); + } break; } - /* Special case: x{0} or x{-0} */ + // Special case: x{0} or x{-0} if (maxval == 0) { - /* Ignore result of previous call to nfa_regatom() */ + // Ignore result of previous call to nfa_regatom() post_ptr = post_start + my_post_start; - /* NFA_EMPTY is 0-length and works everywhere */ + // NFA_EMPTY is 0-length and works everywhere EMIT(NFA_EMPTY); return OK; } @@ -2199,35 +2708,40 @@ static int nfa_regpiece(void) return FAIL; } - /* Ignore previous call to nfa_regatom() */ + // Ignore previous call to nfa_regatom() post_ptr = post_start + my_post_start; - /* Save parse state after the repeated atom and the \{} */ + // Save parse state after the repeated atom and the \{} save_parse_state(&new_state); quest = (greedy == true ? NFA_QUEST : NFA_QUEST_NONGREEDY); for (i = 0; i < maxval; i++) { - /* Goto beginning of the repeated atom */ + // Goto beginning of the repeated atom restore_parse_state(&old_state); old_post_pos = (int)(post_ptr - post_start); - if (nfa_regatom() == FAIL) + if (nfa_regatom() == FAIL) { return FAIL; - /* after "minval" times, atoms are optional */ + } + // after "minval" times, atoms are optional if (i + 1 > minval) { if (maxval == MAX_LIMIT) { - if (greedy) + if (greedy) { EMIT(NFA_STAR); - else + } else { EMIT(NFA_STAR_NONGREEDY); - } else + } + } else { EMIT(quest); + } } - if (old_post_pos != my_post_start) + if (old_post_pos != my_post_start) { EMIT(NFA_CONCAT); - if (i + 1 > minval && maxval == MAX_LIMIT) + } + if (i + 1 > minval && maxval == MAX_LIMIT) { break; + } } - /* Go to just after the repeated atom and the \{} */ + // Go to just after the repeated atom and the \{} restore_parse_state(&new_state); curchr = -1; @@ -2236,7 +2750,7 @@ static int nfa_regpiece(void) default: break; - } /* end switch */ + } // end switch if (re_multi_type(peekchr()) != NOT_MULTI) { // Can't have a multi follow a multi. @@ -2251,10 +2765,10 @@ static int nfa_regpiece(void) * first piece, followed by a match for the second piece, etc. Example: * "f[0-9]b", first matches "f", then a digit and then "b". * - * concat ::= piece - * or piece piece - * or piece piece piece - * etc. + * concat ::= piece + * or piece piece + * or piece piece piece + * etc. */ static int nfa_regconcat(void) { @@ -2326,10 +2840,10 @@ static int nfa_regconcat(void) * "foobeep\&..." matches "foo" in "foobeep". * ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" * - * branch ::= concat - * or concat \& concat - * or concat \& concat \& concat - * etc. + * branch ::= concat + * or concat \& concat + * or concat \& concat \& concat + * etc. */ static int nfa_regbranch(void) { @@ -2337,9 +2851,10 @@ static int nfa_regbranch(void) old_post_pos = (int)(post_ptr - post_start); - /* First branch, possibly the only one */ - if (nfa_regconcat() == FAIL) + // First branch, possibly the only one + if (nfa_regconcat() == FAIL) { return FAIL; + } // Try next concats while (peekchr() == Magic('&')) { @@ -2351,71 +2866,76 @@ static int nfa_regbranch(void) EMIT(NFA_NOPEN); EMIT(NFA_PREV_ATOM_NO_WIDTH); old_post_pos = (int)(post_ptr - post_start); - if (nfa_regconcat() == FAIL) + if (nfa_regconcat() == FAIL) { return FAIL; - /* if concat is empty do emit a node */ - if (old_post_pos == (int)(post_ptr - post_start)) + } + // if concat is empty do emit a node + if (old_post_pos == (int)(post_ptr - post_start)) { EMIT(NFA_EMPTY); + } EMIT(NFA_CONCAT); } - /* if a branch is empty, emit one node for it */ - if (old_post_pos == (int)(post_ptr - post_start)) + // if a branch is empty, emit one node for it + if (old_post_pos == (int)(post_ptr - post_start)) { EMIT(NFA_EMPTY); + } return OK; } -/* - * Parse a pattern, one or more branches, separated by "\|". It matches - * anything that matches one of the branches. Example: "foo\|beep" matches - * "foo" and matches "beep". If more than one branch matches, the first one - * is used. - * - * pattern ::= branch - * or branch \| branch - * or branch \| branch \| branch - * etc. - */ -static int -nfa_reg ( - int paren /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */ -) +/// Parse a pattern, one or more branches, separated by "\|". It matches +/// anything that matches one of the branches. Example: "foo\|beep" matches +/// "foo" and matches "beep". If more than one branch matches, the first one +/// is used. +/// +/// pattern ::= branch +/// or branch \| branch +/// or branch \| branch \| branch +/// etc. +/// +/// @param paren REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN +static int nfa_reg(int paren) { int parno = 0; if (paren == REG_PAREN) { - if (regnpar >= NSUBEXP) /* Too many `(' */ + if (regnpar >= NSUBEXP) { // Too many `(' EMSG_RET_FAIL(_("E872: (NFA regexp) Too many '('")); + } parno = regnpar++; } else if (paren == REG_ZPAREN) { - /* Make a ZOPEN node. */ - if (regnzpar >= NSUBEXP) + // Make a ZOPEN node. + if (regnzpar >= NSUBEXP) { EMSG_RET_FAIL(_("E879: (NFA regexp) Too many \\z(")); + } parno = regnzpar++; } - if (nfa_regbranch() == FAIL) - return FAIL; /* cascaded error */ - + if (nfa_regbranch() == FAIL) { + return FAIL; // cascaded error + } while (peekchr() == Magic('|')) { skipchr(); - if (nfa_regbranch() == FAIL) - return FAIL; /* cascaded error */ + if (nfa_regbranch() == FAIL) { + return FAIL; // cascaded error + } EMIT(NFA_OR); } - /* Check for proper termination. */ + // Check for proper termination. if (paren != REG_NOPAREN && getchr() != Magic(')')) { - if (paren == REG_NPAREN) + if (paren == REG_NPAREN) { EMSG2_RET_FAIL(_(e_unmatchedpp), reg_magic == MAGIC_ALL); - else + } else { EMSG2_RET_FAIL(_(e_unmatchedp), reg_magic == MAGIC_ALL); + } } else if (paren == REG_NOPAREN && peekchr() != NUL) { - if (peekchr() == Magic(')')) + if (peekchr() == Magic(')')) { EMSG2_RET_FAIL(_(e_unmatchedpar), reg_magic == MAGIC_ALL); - else + } else { EMSG_RET_FAIL(_("E873: (NFA regexp) proper termination error")); + } } // Here we set the flag allowing back references to this set of // parentheses. @@ -2443,32 +2963,57 @@ static void nfa_set_code(int c) STRCPY(code, ""); switch (c) { - case NFA_MATCH: STRCPY(code, "NFA_MATCH "); break; - case NFA_SPLIT: STRCPY(code, "NFA_SPLIT "); break; - case NFA_CONCAT: STRCPY(code, "NFA_CONCAT "); break; - case NFA_NEWL: STRCPY(code, "NFA_NEWL "); break; - case NFA_ZSTART: STRCPY(code, "NFA_ZSTART"); break; - case NFA_ZEND: STRCPY(code, "NFA_ZEND"); break; - - case NFA_BACKREF1: STRCPY(code, "NFA_BACKREF1"); break; - case NFA_BACKREF2: STRCPY(code, "NFA_BACKREF2"); break; - case NFA_BACKREF3: STRCPY(code, "NFA_BACKREF3"); break; - case NFA_BACKREF4: STRCPY(code, "NFA_BACKREF4"); break; - case NFA_BACKREF5: STRCPY(code, "NFA_BACKREF5"); break; - case NFA_BACKREF6: STRCPY(code, "NFA_BACKREF6"); break; - case NFA_BACKREF7: STRCPY(code, "NFA_BACKREF7"); break; - case NFA_BACKREF8: STRCPY(code, "NFA_BACKREF8"); break; - case NFA_BACKREF9: STRCPY(code, "NFA_BACKREF9"); break; - case NFA_ZREF1: STRCPY(code, "NFA_ZREF1"); break; - case NFA_ZREF2: STRCPY(code, "NFA_ZREF2"); break; - case NFA_ZREF3: STRCPY(code, "NFA_ZREF3"); break; - case NFA_ZREF4: STRCPY(code, "NFA_ZREF4"); break; - case NFA_ZREF5: STRCPY(code, "NFA_ZREF5"); break; - case NFA_ZREF6: STRCPY(code, "NFA_ZREF6"); break; - case NFA_ZREF7: STRCPY(code, "NFA_ZREF7"); break; - case NFA_ZREF8: STRCPY(code, "NFA_ZREF8"); break; - case NFA_ZREF9: STRCPY(code, "NFA_ZREF9"); break; - case NFA_SKIP: STRCPY(code, "NFA_SKIP"); break; + case NFA_MATCH: + STRCPY(code, "NFA_MATCH "); break; + case NFA_SPLIT: + STRCPY(code, "NFA_SPLIT "); break; + case NFA_CONCAT: + STRCPY(code, "NFA_CONCAT "); break; + case NFA_NEWL: + STRCPY(code, "NFA_NEWL "); break; + case NFA_ZSTART: + STRCPY(code, "NFA_ZSTART"); break; + case NFA_ZEND: + STRCPY(code, "NFA_ZEND"); break; + + case NFA_BACKREF1: + STRCPY(code, "NFA_BACKREF1"); break; + case NFA_BACKREF2: + STRCPY(code, "NFA_BACKREF2"); break; + case NFA_BACKREF3: + STRCPY(code, "NFA_BACKREF3"); break; + case NFA_BACKREF4: + STRCPY(code, "NFA_BACKREF4"); break; + case NFA_BACKREF5: + STRCPY(code, "NFA_BACKREF5"); break; + case NFA_BACKREF6: + STRCPY(code, "NFA_BACKREF6"); break; + case NFA_BACKREF7: + STRCPY(code, "NFA_BACKREF7"); break; + case NFA_BACKREF8: + STRCPY(code, "NFA_BACKREF8"); break; + case NFA_BACKREF9: + STRCPY(code, "NFA_BACKREF9"); break; + case NFA_ZREF1: + STRCPY(code, "NFA_ZREF1"); break; + case NFA_ZREF2: + STRCPY(code, "NFA_ZREF2"); break; + case NFA_ZREF3: + STRCPY(code, "NFA_ZREF3"); break; + case NFA_ZREF4: + STRCPY(code, "NFA_ZREF4"); break; + case NFA_ZREF5: + STRCPY(code, "NFA_ZREF5"); break; + case NFA_ZREF6: + STRCPY(code, "NFA_ZREF6"); break; + case NFA_ZREF7: + STRCPY(code, "NFA_ZREF7"); break; + case NFA_ZREF8: + STRCPY(code, "NFA_ZREF8"); break; + case NFA_ZREF9: + STRCPY(code, "NFA_ZREF9"); break; + case NFA_SKIP: + STRCPY(code, "NFA_SKIP"); break; case NFA_PREV_ATOM_NO_WIDTH: STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH"); break; @@ -2481,9 +3026,12 @@ static void nfa_set_code(int c) case NFA_PREV_ATOM_LIKE_PATTERN: STRCPY(code, "NFA_PREV_ATOM_LIKE_PATTERN"); break; - case NFA_NOPEN: STRCPY(code, "NFA_NOPEN"); break; - case NFA_NCLOSE: STRCPY(code, "NFA_NCLOSE"); break; - case NFA_START_INVISIBLE: STRCPY(code, "NFA_START_INVISIBLE"); break; + case NFA_NOPEN: + STRCPY(code, "NFA_NOPEN"); break; + case NFA_NCLOSE: + STRCPY(code, "NFA_NCLOSE"); break; + case NFA_START_INVISIBLE: + STRCPY(code, "NFA_START_INVISIBLE"); break; case NFA_START_INVISIBLE_FIRST: STRCPY(code, "NFA_START_INVISIBLE_FIRST"); break; case NFA_START_INVISIBLE_NEG: @@ -2498,14 +3046,21 @@ static void nfa_set_code(int c) STRCPY(code, "NFA_START_INVISIBLE_BEFORE_NEG"); break; case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: STRCPY(code, "NFA_START_INVISIBLE_BEFORE_NEG_FIRST"); break; - case NFA_START_PATTERN: STRCPY(code, "NFA_START_PATTERN"); break; - case NFA_END_INVISIBLE: STRCPY(code, "NFA_END_INVISIBLE"); break; - case NFA_END_INVISIBLE_NEG: STRCPY(code, "NFA_END_INVISIBLE_NEG"); break; - case NFA_END_PATTERN: STRCPY(code, "NFA_END_PATTERN"); break; + case NFA_START_PATTERN: + STRCPY(code, "NFA_START_PATTERN"); break; + case NFA_END_INVISIBLE: + STRCPY(code, "NFA_END_INVISIBLE"); break; + case NFA_END_INVISIBLE_NEG: + STRCPY(code, "NFA_END_INVISIBLE_NEG"); break; + case NFA_END_PATTERN: + STRCPY(code, "NFA_END_PATTERN"); break; - case NFA_COMPOSING: STRCPY(code, "NFA_COMPOSING"); break; - case NFA_END_COMPOSING: STRCPY(code, "NFA_END_COMPOSING"); break; - case NFA_OPT_CHARS: STRCPY(code, "NFA_OPT_CHARS"); break; + case NFA_COMPOSING: + STRCPY(code, "NFA_COMPOSING"); break; + case NFA_END_COMPOSING: + STRCPY(code, "NFA_END_COMPOSING"); break; + case NFA_OPT_CHARS: + STRCPY(code, "NFA_OPT_CHARS"); break; case NFA_MOPEN: case NFA_MOPEN1: @@ -2559,94 +3114,178 @@ static void nfa_set_code(int c) STRCPY(code, "NFA_ZCLOSE(x)"); code[11] = c - NFA_ZCLOSE + '0'; break; - case NFA_EOL: STRCPY(code, "NFA_EOL "); break; - case NFA_BOL: STRCPY(code, "NFA_BOL "); break; - case NFA_EOW: STRCPY(code, "NFA_EOW "); break; - case NFA_BOW: STRCPY(code, "NFA_BOW "); break; - case NFA_EOF: STRCPY(code, "NFA_EOF "); break; - case NFA_BOF: STRCPY(code, "NFA_BOF "); break; - case NFA_LNUM: STRCPY(code, "NFA_LNUM "); break; - case NFA_LNUM_GT: STRCPY(code, "NFA_LNUM_GT "); break; - case NFA_LNUM_LT: STRCPY(code, "NFA_LNUM_LT "); break; - case NFA_COL: STRCPY(code, "NFA_COL "); break; - case NFA_COL_GT: STRCPY(code, "NFA_COL_GT "); break; - case NFA_COL_LT: STRCPY(code, "NFA_COL_LT "); break; - case NFA_VCOL: STRCPY(code, "NFA_VCOL "); break; - case NFA_VCOL_GT: STRCPY(code, "NFA_VCOL_GT "); break; - case NFA_VCOL_LT: STRCPY(code, "NFA_VCOL_LT "); break; - case NFA_MARK: STRCPY(code, "NFA_MARK "); break; - case NFA_MARK_GT: STRCPY(code, "NFA_MARK_GT "); break; - case NFA_MARK_LT: STRCPY(code, "NFA_MARK_LT "); break; - case NFA_CURSOR: STRCPY(code, "NFA_CURSOR "); break; - case NFA_VISUAL: STRCPY(code, "NFA_VISUAL "); break; - case NFA_ANY_COMPOSING: STRCPY(code, "NFA_ANY_COMPOSING "); break; - - case NFA_STAR: STRCPY(code, "NFA_STAR "); break; - case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break; - case NFA_QUEST: STRCPY(code, "NFA_QUEST"); break; - case NFA_QUEST_NONGREEDY: STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; - case NFA_EMPTY: STRCPY(code, "NFA_EMPTY"); break; - case NFA_OR: STRCPY(code, "NFA_OR"); break; - - case NFA_START_COLL: STRCPY(code, "NFA_START_COLL"); break; - case NFA_END_COLL: STRCPY(code, "NFA_END_COLL"); break; - case NFA_START_NEG_COLL: STRCPY(code, "NFA_START_NEG_COLL"); break; - case NFA_END_NEG_COLL: STRCPY(code, "NFA_END_NEG_COLL"); break; - case NFA_RANGE: STRCPY(code, "NFA_RANGE"); break; - case NFA_RANGE_MIN: STRCPY(code, "NFA_RANGE_MIN"); break; - case NFA_RANGE_MAX: STRCPY(code, "NFA_RANGE_MAX"); break; - - case NFA_CLASS_ALNUM: STRCPY(code, "NFA_CLASS_ALNUM"); break; - case NFA_CLASS_ALPHA: STRCPY(code, "NFA_CLASS_ALPHA"); break; - case NFA_CLASS_BLANK: STRCPY(code, "NFA_CLASS_BLANK"); break; - case NFA_CLASS_CNTRL: STRCPY(code, "NFA_CLASS_CNTRL"); break; - case NFA_CLASS_DIGIT: STRCPY(code, "NFA_CLASS_DIGIT"); break; - case NFA_CLASS_GRAPH: STRCPY(code, "NFA_CLASS_GRAPH"); break; - case NFA_CLASS_LOWER: STRCPY(code, "NFA_CLASS_LOWER"); break; - case NFA_CLASS_PRINT: STRCPY(code, "NFA_CLASS_PRINT"); break; - case NFA_CLASS_PUNCT: STRCPY(code, "NFA_CLASS_PUNCT"); break; - case NFA_CLASS_SPACE: STRCPY(code, "NFA_CLASS_SPACE"); break; - case NFA_CLASS_UPPER: STRCPY(code, "NFA_CLASS_UPPER"); break; - case NFA_CLASS_XDIGIT: STRCPY(code, "NFA_CLASS_XDIGIT"); break; - case NFA_CLASS_TAB: STRCPY(code, "NFA_CLASS_TAB"); break; - case NFA_CLASS_RETURN: STRCPY(code, "NFA_CLASS_RETURN"); break; - case NFA_CLASS_BACKSPACE: STRCPY(code, "NFA_CLASS_BACKSPACE"); break; - case NFA_CLASS_ESCAPE: STRCPY(code, "NFA_CLASS_ESCAPE"); break; - case NFA_CLASS_IDENT: STRCPY(code, "NFA_CLASS_IDENT"); break; - case NFA_CLASS_KEYWORD: STRCPY(code, "NFA_CLASS_KEYWORD"); break; - case NFA_CLASS_FNAME: STRCPY(code, "NFA_CLASS_FNAME"); break; - - case NFA_ANY: STRCPY(code, "NFA_ANY"); break; - case NFA_IDENT: STRCPY(code, "NFA_IDENT"); break; - case NFA_SIDENT: STRCPY(code, "NFA_SIDENT"); break; - case NFA_KWORD: STRCPY(code, "NFA_KWORD"); break; - case NFA_SKWORD: STRCPY(code, "NFA_SKWORD"); break; - case NFA_FNAME: STRCPY(code, "NFA_FNAME"); break; - case NFA_SFNAME: STRCPY(code, "NFA_SFNAME"); break; - case NFA_PRINT: STRCPY(code, "NFA_PRINT"); break; - case NFA_SPRINT: STRCPY(code, "NFA_SPRINT"); break; - case NFA_WHITE: STRCPY(code, "NFA_WHITE"); break; - case NFA_NWHITE: STRCPY(code, "NFA_NWHITE"); break; - case NFA_DIGIT: STRCPY(code, "NFA_DIGIT"); break; - case NFA_NDIGIT: STRCPY(code, "NFA_NDIGIT"); break; - case NFA_HEX: STRCPY(code, "NFA_HEX"); break; - case NFA_NHEX: STRCPY(code, "NFA_NHEX"); break; - case NFA_OCTAL: STRCPY(code, "NFA_OCTAL"); break; - case NFA_NOCTAL: STRCPY(code, "NFA_NOCTAL"); break; - case NFA_WORD: STRCPY(code, "NFA_WORD"); break; - case NFA_NWORD: STRCPY(code, "NFA_NWORD"); break; - case NFA_HEAD: STRCPY(code, "NFA_HEAD"); break; - case NFA_NHEAD: STRCPY(code, "NFA_NHEAD"); break; - case NFA_ALPHA: STRCPY(code, "NFA_ALPHA"); break; - case NFA_NALPHA: STRCPY(code, "NFA_NALPHA"); break; - case NFA_LOWER: STRCPY(code, "NFA_LOWER"); break; - case NFA_NLOWER: STRCPY(code, "NFA_NLOWER"); break; - case NFA_UPPER: STRCPY(code, "NFA_UPPER"); break; - case NFA_NUPPER: STRCPY(code, "NFA_NUPPER"); break; - case NFA_LOWER_IC: STRCPY(code, "NFA_LOWER_IC"); break; - case NFA_NLOWER_IC: STRCPY(code, "NFA_NLOWER_IC"); break; - case NFA_UPPER_IC: STRCPY(code, "NFA_UPPER_IC"); break; - case NFA_NUPPER_IC: STRCPY(code, "NFA_NUPPER_IC"); break; + case NFA_EOL: + STRCPY(code, "NFA_EOL "); break; + case NFA_BOL: + STRCPY(code, "NFA_BOL "); break; + case NFA_EOW: + STRCPY(code, "NFA_EOW "); break; + case NFA_BOW: + STRCPY(code, "NFA_BOW "); break; + case NFA_EOF: + STRCPY(code, "NFA_EOF "); break; + case NFA_BOF: + STRCPY(code, "NFA_BOF "); break; + case NFA_LNUM: + STRCPY(code, "NFA_LNUM "); break; + case NFA_LNUM_GT: + STRCPY(code, "NFA_LNUM_GT "); break; + case NFA_LNUM_LT: + STRCPY(code, "NFA_LNUM_LT "); break; + case NFA_COL: + STRCPY(code, "NFA_COL "); break; + case NFA_COL_GT: + STRCPY(code, "NFA_COL_GT "); break; + case NFA_COL_LT: + STRCPY(code, "NFA_COL_LT "); break; + case NFA_VCOL: + STRCPY(code, "NFA_VCOL "); break; + case NFA_VCOL_GT: + STRCPY(code, "NFA_VCOL_GT "); break; + case NFA_VCOL_LT: + STRCPY(code, "NFA_VCOL_LT "); break; + case NFA_MARK: + STRCPY(code, "NFA_MARK "); break; + case NFA_MARK_GT: + STRCPY(code, "NFA_MARK_GT "); break; + case NFA_MARK_LT: + STRCPY(code, "NFA_MARK_LT "); break; + case NFA_CURSOR: + STRCPY(code, "NFA_CURSOR "); break; + case NFA_VISUAL: + STRCPY(code, "NFA_VISUAL "); break; + case NFA_ANY_COMPOSING: + STRCPY(code, "NFA_ANY_COMPOSING "); break; + + case NFA_STAR: + STRCPY(code, "NFA_STAR "); break; + case NFA_STAR_NONGREEDY: + STRCPY(code, "NFA_STAR_NONGREEDY "); break; + case NFA_QUEST: + STRCPY(code, "NFA_QUEST"); break; + case NFA_QUEST_NONGREEDY: + STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; + case NFA_EMPTY: + STRCPY(code, "NFA_EMPTY"); break; + case NFA_OR: + STRCPY(code, "NFA_OR"); break; + + case NFA_START_COLL: + STRCPY(code, "NFA_START_COLL"); break; + case NFA_END_COLL: + STRCPY(code, "NFA_END_COLL"); break; + case NFA_START_NEG_COLL: + STRCPY(code, "NFA_START_NEG_COLL"); break; + case NFA_END_NEG_COLL: + STRCPY(code, "NFA_END_NEG_COLL"); break; + case NFA_RANGE: + STRCPY(code, "NFA_RANGE"); break; + case NFA_RANGE_MIN: + STRCPY(code, "NFA_RANGE_MIN"); break; + case NFA_RANGE_MAX: + STRCPY(code, "NFA_RANGE_MAX"); break; + + case NFA_CLASS_ALNUM: + STRCPY(code, "NFA_CLASS_ALNUM"); break; + case NFA_CLASS_ALPHA: + STRCPY(code, "NFA_CLASS_ALPHA"); break; + case NFA_CLASS_BLANK: + STRCPY(code, "NFA_CLASS_BLANK"); break; + case NFA_CLASS_CNTRL: + STRCPY(code, "NFA_CLASS_CNTRL"); break; + case NFA_CLASS_DIGIT: + STRCPY(code, "NFA_CLASS_DIGIT"); break; + case NFA_CLASS_GRAPH: + STRCPY(code, "NFA_CLASS_GRAPH"); break; + case NFA_CLASS_LOWER: + STRCPY(code, "NFA_CLASS_LOWER"); break; + case NFA_CLASS_PRINT: + STRCPY(code, "NFA_CLASS_PRINT"); break; + case NFA_CLASS_PUNCT: + STRCPY(code, "NFA_CLASS_PUNCT"); break; + case NFA_CLASS_SPACE: + STRCPY(code, "NFA_CLASS_SPACE"); break; + case NFA_CLASS_UPPER: + STRCPY(code, "NFA_CLASS_UPPER"); break; + case NFA_CLASS_XDIGIT: + STRCPY(code, "NFA_CLASS_XDIGIT"); break; + case NFA_CLASS_TAB: + STRCPY(code, "NFA_CLASS_TAB"); break; + case NFA_CLASS_RETURN: + STRCPY(code, "NFA_CLASS_RETURN"); break; + case NFA_CLASS_BACKSPACE: + STRCPY(code, "NFA_CLASS_BACKSPACE"); break; + case NFA_CLASS_ESCAPE: + STRCPY(code, "NFA_CLASS_ESCAPE"); break; + case NFA_CLASS_IDENT: + STRCPY(code, "NFA_CLASS_IDENT"); break; + case NFA_CLASS_KEYWORD: + STRCPY(code, "NFA_CLASS_KEYWORD"); break; + case NFA_CLASS_FNAME: + STRCPY(code, "NFA_CLASS_FNAME"); break; + + case NFA_ANY: + STRCPY(code, "NFA_ANY"); break; + case NFA_IDENT: + STRCPY(code, "NFA_IDENT"); break; + case NFA_SIDENT: + STRCPY(code, "NFA_SIDENT"); break; + case NFA_KWORD: + STRCPY(code, "NFA_KWORD"); break; + case NFA_SKWORD: + STRCPY(code, "NFA_SKWORD"); break; + case NFA_FNAME: + STRCPY(code, "NFA_FNAME"); break; + case NFA_SFNAME: + STRCPY(code, "NFA_SFNAME"); break; + case NFA_PRINT: + STRCPY(code, "NFA_PRINT"); break; + case NFA_SPRINT: + STRCPY(code, "NFA_SPRINT"); break; + case NFA_WHITE: + STRCPY(code, "NFA_WHITE"); break; + case NFA_NWHITE: + STRCPY(code, "NFA_NWHITE"); break; + case NFA_DIGIT: + STRCPY(code, "NFA_DIGIT"); break; + case NFA_NDIGIT: + STRCPY(code, "NFA_NDIGIT"); break; + case NFA_HEX: + STRCPY(code, "NFA_HEX"); break; + case NFA_NHEX: + STRCPY(code, "NFA_NHEX"); break; + case NFA_OCTAL: + STRCPY(code, "NFA_OCTAL"); break; + case NFA_NOCTAL: + STRCPY(code, "NFA_NOCTAL"); break; + case NFA_WORD: + STRCPY(code, "NFA_WORD"); break; + case NFA_NWORD: + STRCPY(code, "NFA_NWORD"); break; + case NFA_HEAD: + STRCPY(code, "NFA_HEAD"); break; + case NFA_NHEAD: + STRCPY(code, "NFA_NHEAD"); break; + case NFA_ALPHA: + STRCPY(code, "NFA_ALPHA"); break; + case NFA_NALPHA: + STRCPY(code, "NFA_NALPHA"); break; + case NFA_LOWER: + STRCPY(code, "NFA_LOWER"); break; + case NFA_NLOWER: + STRCPY(code, "NFA_NLOWER"); break; + case NFA_UPPER: + STRCPY(code, "NFA_UPPER"); break; + case NFA_NUPPER: + STRCPY(code, "NFA_NUPPER"); break; + case NFA_LOWER_IC: + STRCPY(code, "NFA_LOWER_IC"); break; + case NFA_NLOWER_IC: + STRCPY(code, "NFA_NLOWER_IC"); break; + case NFA_UPPER_IC: + STRCPY(code, "NFA_UPPER_IC"); break; + case NFA_NUPPER_IC: + STRCPY(code, "NFA_NUPPER_IC"); break; default: STRCPY(code, "CHAR(x)"); @@ -2659,8 +3298,8 @@ static void nfa_set_code(int c) } static FILE *log_fd; -static char_u e_log_open_failed[] = N_( - "Could not open temporary log file for writing, displaying on stderr... "); +static char_u e_log_open_failed[] = + N_("Could not open temporary log file for writing, displaying on stderr... "); /* * Print the postfix notation of the current regexp. @@ -2684,8 +3323,9 @@ static void nfa_postfix_dump(char_u *expr, int retval) fprintf(f, "%s, ", code); } fprintf(f, "\"\nPostfix notation (int): "); - for (p = post_start; *p && p < post_ptr; p++) + for (p = post_start; *p && p < post_ptr; p++) { fprintf(f, "%d ", *p); + } fprintf(f, "\n\n"); fclose(f); } @@ -2706,14 +3346,15 @@ static void nfa_print_state(FILE *debugf, nfa_state_T *state) static void nfa_print_state2(FILE *debugf, nfa_state_T *state, garray_T *indent) { - char_u *p; + char_u *p; - if (state == NULL) + if (state == NULL) { return; + } fprintf(debugf, "(%2d)", abs(state->id)); - /* Output indent */ + // Output indent p = (char_u *)indent->ga_data; if (indent->ga_len >= 3) { int last = indent->ga_len - 3; @@ -2722,39 +3363,42 @@ static void nfa_print_state2(FILE *debugf, nfa_state_T *state, garray_T *indent) STRNCPY(save, &p[last], 2); STRNCPY(&p[last], "+-", 2); fprintf(debugf, " %s", p); - STRNCPY(&p[last], save, 2); - } else + STRNCPY(&p[last], save, 2); // NOLINT(runtime/printf) + } else { fprintf(debugf, " %s", p); + } nfa_set_code(state->c); fprintf(debugf, "%s (%d) (id=%d) val=%d\n", - code, - state->c, - abs(state->id), - state->val); - if (state->id < 0) + code, + state->c, + abs(state->id), + state->val); + if (state->id < 0) { return; + } state->id = abs(state->id) * -1; - /* grow indent for state->out */ + // grow indent for state->out indent->ga_len -= 1; - if (state->out1) + if (state->out1) { ga_concat(indent, (char_u *)"| "); - else + } else { ga_concat(indent, (char_u *)" "); + } ga_append(indent, NUL); nfa_print_state2(debugf, state->out, indent); - /* replace last part of indent for state->out1 */ + // replace last part of indent for state->out1 indent->ga_len -= 3; ga_concat(indent, (char_u *)" "); ga_append(indent, NUL); nfa_print_state2(debugf, state->out1, indent); - /* shrink indent */ + // shrink indent indent->ga_len -= 3; ga_append(indent, NUL); } @@ -2769,13 +3413,16 @@ static void nfa_dump(nfa_regprog_T *prog) if (debugf != NULL) { nfa_print_state(debugf, prog->start); - if (prog->reganch) + if (prog->reganch) { fprintf(debugf, "reganch: %d\n", prog->reganch); - if (prog->regstart != NUL) + } + if (prog->regstart != NUL) { fprintf(debugf, "regstart: %c (decimal: %d)\n", - prog->regstart, prog->regstart); - if (prog->match_text != NULL) + prog->regstart, prog->regstart); + } + if (prog->match_text != NULL) { fprintf(debugf, "match_text: \"%s\"\n", prog->match_text); + } fclose(debugf); } @@ -2788,13 +3435,14 @@ static void nfa_dump(nfa_regprog_T *prog) */ static int *re2post(void) { - if (nfa_reg(REG_NOPAREN) == FAIL) + if (nfa_reg(REG_NOPAREN) == FAIL) { return NULL; + } EMIT(NFA_MOPEN); return post_start; } -/* NB. Some of the code below is inspired by Russ's. */ +// NB. Some of the code below is inspired by Russ's. /* * Represents an NFA state plus zero or one or two arrows exiting. @@ -2803,7 +3451,7 @@ static int *re2post(void) * If c < 256, labeled arrow with character c to out. */ -static nfa_state_T *state_ptr; /* points to nfa_prog->state */ +static nfa_state_T *state_ptr; // points to nfa_prog->state /* * Allocate and initialize nfa_state_T. @@ -2812,8 +3460,9 @@ static nfa_state_T *alloc_state(int c, nfa_state_T *out, nfa_state_T *out1) { nfa_state_T *s; - if (istate >= nstate) + if (istate >= nstate) { return NULL; + } s = &state_ptr[istate++]; @@ -2883,8 +3532,9 @@ static Ptrlist *append(Ptrlist *l1, Ptrlist *l2) Ptrlist *oldl1; oldl1 = l1; - while (l1->next) + while (l1->next) { l1 = l1->next; + } l1->next = l2; return oldl1; } @@ -2903,11 +3553,11 @@ static void st_error(int *postfix, int *end, int *p) df = fopen(NFA_REGEXP_ERROR_LOG, "a"); if (df) { fprintf(df, "Error popping the stack!\n"); -#ifdef REGEXP_DEBUG +# ifdef REGEXP_DEBUG fprintf(df, "Current regexp is \"%s\"\n", nfa_regengine.expr); -#endif +# endif fprintf(df, "Postfix form is: "); -#ifdef REGEXP_DEBUG +# ifdef REGEXP_DEBUG for (p2 = postfix; p2 < end; p2++) { nfa_set_code(*p2); fprintf(df, "%s, ", code); @@ -2918,7 +3568,7 @@ static void st_error(int *postfix, int *end, int *p) nfa_set_code(*p2); fprintf(df, "%s, ", code); } -#else +# else for (p2 = postfix; p2 < end; p2++) { fprintf(df, "%d, ", *p2); } @@ -2926,7 +3576,7 @@ static void st_error(int *postfix, int *end, int *p) for (p2 = postfix; p2 <= p; p2++) { fprintf(df, "%d, ", *p2); } -#endif +# endif fprintf(df, "\n--------------------------\n"); fclose(df); } @@ -2941,8 +3591,9 @@ static void st_push(Frag_T s, Frag_T **p, Frag_T *stack_end) { Frag_T *stackp = *p; - if (stackp >= stack_end) + if (stackp >= stack_end) { return; + } *stackp = s; *p = *p + 1; } @@ -2956,8 +3607,9 @@ static Frag_T st_pop(Frag_T **p, Frag_T *stack) *p = *p - 1; stackp = *p; - if (stackp < stack) + if (stackp < stack) { return empty; + } return **p; } @@ -2968,26 +3620,28 @@ static Frag_T st_pop(Frag_T **p, Frag_T *stack) static int nfa_max_width(nfa_state_T *startstate, int depth) { int l, r; - nfa_state_T *state = startstate; + nfa_state_T *state = startstate; int len = 0; - /* detect looping in a NFA_SPLIT */ - if (depth > 4) + // detect looping in a NFA_SPLIT + if (depth > 4) { return -1; + } while (state != NULL) { switch (state->c) { case NFA_END_INVISIBLE: case NFA_END_INVISIBLE_NEG: - /* the end, return what we have */ + // the end, return what we have return len; case NFA_SPLIT: - /* two alternatives, use the maximum */ + // two alternatives, use the maximum l = nfa_max_width(state->out, depth + 1); r = nfa_max_width(state->out1, depth + 1); - if (l < 0 || r < 0) + if (l < 0 || r < 0) { return -1; + } return len + (l > r ? l : r); case NFA_ANY: @@ -3006,8 +3660,8 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_WHITE: case NFA_HEX: case NFA_OCTAL: - /* ascii */ - ++len; + // ascii + len++; break; case NFA_IDENT: @@ -3045,7 +3699,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_START_INVISIBLE_NEG: case NFA_START_INVISIBLE_BEFORE: case NFA_START_INVISIBLE_BEFORE_NEG: - /* zero-width, out1 points to the END state */ + // zero-width, out1 points to the END state state = state->out1->out; continue; @@ -3069,7 +3723,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_ZREF9: case NFA_NEWL: case NFA_SKIP: - /* unknown width */ + // unknown width return -1; case NFA_BOL: @@ -3144,23 +3798,24 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_END_PATTERN: case NFA_COMPOSING: case NFA_END_COMPOSING: - /* zero-width */ + // zero-width break; default: - if (state->c < 0) - /* don't know what this is */ + if (state->c < 0) { + // don't know what this is return -1; + } // normal character len += utf_char2len(state->c); break; } - /* normal way to continue */ + // normal way to continue state = state->out; } - /* unrecognized, "cannot happen" */ + // unrecognized, "cannot happen" return -1; } @@ -3170,12 +3825,12 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) */ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) { - int *p; + int *p; int mopen; int mclose; - Frag_T *stack = NULL; - Frag_T *stackp = NULL; - Frag_T *stack_end = NULL; + Frag_T *stack = NULL; + Frag_T *stackp = NULL; + Frag_T *stack_end = NULL; Frag_T e1; Frag_T e2; Frag_T e; @@ -3184,8 +3839,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) nfa_state_T *matchstate; nfa_state_T *ret = NULL; - if (postfix == NULL) + if (postfix == NULL) { return NULL; + } #define PUSH(s) st_push((s), &stackp, stack_end) #define POP() st_pop(&stackp, stack); \ @@ -3228,8 +3884,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) e2 = POP(); e1 = POP(); s = alloc_state(NFA_SPLIT, e1.start, e2.start); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e1.out, e2.out))); break; @@ -3241,8 +3898,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); PUSH(frag(s, list1(&s->out1))); break; @@ -3255,8 +3913,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, NULL, e.start); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); PUSH(frag(s, list1(&s->out))); break; @@ -3269,8 +3928,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e.out, list1(&s->out1)))); break; @@ -3282,8 +3942,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, NULL, e.start); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e.out, list1(&s->out)))); break; @@ -3298,8 +3959,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_END_COLL, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); e.start->out1 = s; PUSH(frag(e.start, list1(&s->out))); @@ -3329,13 +3991,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(NFA_EMPTY, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, list1(&s->out))); break; - case NFA_OPT_CHARS: - { + case NFA_OPT_CHARS: { int n; // \%[abc] implemented as: @@ -3354,16 +4016,18 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) nstate += n; break; } - s = NULL; /* avoid compiler warning */ - e1.out = NULL; /* stores list with out1's */ - s1 = NULL; /* previous NFA_SPLIT to connect to */ + s = NULL; // avoid compiler warning + e1.out = NULL; // stores list with out1's + s1 = NULL; // previous NFA_SPLIT to connect to while (n-- > 0) { - e = POP(); /* get character */ + e = POP(); // get character s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; - if (e1.out == NULL) + } + if (e1.out == NULL) { e1 = e; + } patch(e.out, s1); append(e1.out, list1(&s->out1)); s1 = s; @@ -3376,8 +4040,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_PREV_ATOM_NO_WIDTH_NEG: case NFA_PREV_ATOM_JUST_BEFORE: case NFA_PREV_ATOM_JUST_BEFORE_NEG: - case NFA_PREV_ATOM_LIKE_PATTERN: - { + case NFA_PREV_ATOM_LIKE_PATTERN: { int before = (*p == NFA_PREV_ATOM_JUST_BEFORE || *p == NFA_PREV_ATOM_JUST_BEFORE_NEG); int pattern = (*p == NFA_PREV_ATOM_LIKE_PATTERN); @@ -3404,15 +4067,15 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) start_state = NFA_START_INVISIBLE_BEFORE_NEG; end_state = NFA_END_INVISIBLE_NEG; break; - default: /* NFA_PREV_ATOM_LIKE_PATTERN: */ + default: // NFA_PREV_ATOM_LIKE_PATTERN: start_state = NFA_START_PATTERN; end_state = NFA_END_PATTERN; break; } - if (before) - n = *++p; /* get the count */ - + if (before) { + n = *++p; // get the count + } // The \@= operator: match the preceding atom with zero width. // The \@! operator: no match for the preceding atom. // The \@<= operator: match for the preceding atom. @@ -3426,14 +4089,16 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s1 = alloc_state(end_state, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } s = alloc_state(start_state, e.start, s1); - if (s == NULL) + if (s == NULL) { goto theend; + } if (pattern) { - /* NFA_ZEND -> NFA_END_PATTERN -> NFA_SKIP -> what follows. */ + // NFA_ZEND -> NFA_END_PATTERN -> NFA_SKIP -> what follows. skip = alloc_state(NFA_SKIP, NULL, NULL); if (skip == NULL) { goto theend; @@ -3463,7 +4128,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_COMPOSING: // char with composing char FALLTHROUGH; - case NFA_MOPEN: /* \( \) Submatch */ + case NFA_MOPEN: // \( \) Submatch case NFA_MOPEN1: case NFA_MOPEN2: case NFA_MOPEN3: @@ -3473,7 +4138,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_MOPEN7: case NFA_MOPEN8: case NFA_MOPEN9: - case NFA_ZOPEN: /* \z( \) Submatch */ + case NFA_ZOPEN: // \z( \) Submatch case NFA_ZOPEN1: case NFA_ZOPEN2: case NFA_ZOPEN3: @@ -3491,20 +4156,32 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) mopen = *p; switch (*p) { - case NFA_NOPEN: mclose = NFA_NCLOSE; break; - case NFA_ZOPEN: mclose = NFA_ZCLOSE; break; - case NFA_ZOPEN1: mclose = NFA_ZCLOSE1; break; - case NFA_ZOPEN2: mclose = NFA_ZCLOSE2; break; - case NFA_ZOPEN3: mclose = NFA_ZCLOSE3; break; - case NFA_ZOPEN4: mclose = NFA_ZCLOSE4; break; - case NFA_ZOPEN5: mclose = NFA_ZCLOSE5; break; - case NFA_ZOPEN6: mclose = NFA_ZCLOSE6; break; - case NFA_ZOPEN7: mclose = NFA_ZCLOSE7; break; - case NFA_ZOPEN8: mclose = NFA_ZCLOSE8; break; - case NFA_ZOPEN9: mclose = NFA_ZCLOSE9; break; - case NFA_COMPOSING: mclose = NFA_END_COMPOSING; break; + case NFA_NOPEN: + mclose = NFA_NCLOSE; break; + case NFA_ZOPEN: + mclose = NFA_ZCLOSE; break; + case NFA_ZOPEN1: + mclose = NFA_ZCLOSE1; break; + case NFA_ZOPEN2: + mclose = NFA_ZCLOSE2; break; + case NFA_ZOPEN3: + mclose = NFA_ZCLOSE3; break; + case NFA_ZOPEN4: + mclose = NFA_ZCLOSE4; break; + case NFA_ZOPEN5: + mclose = NFA_ZCLOSE5; break; + case NFA_ZOPEN6: + mclose = NFA_ZCLOSE6; break; + case NFA_ZOPEN7: + mclose = NFA_ZCLOSE7; break; + case NFA_ZOPEN8: + mclose = NFA_ZCLOSE8; break; + case NFA_ZOPEN9: + mclose = NFA_ZCLOSE9; break; + case NFA_COMPOSING: + mclose = NFA_END_COMPOSING; break; default: - /* NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 */ + // NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 mclose = *p + NSUBEXP; break; } @@ -3515,11 +4192,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) // empty groups of parenthesis, and empty mbyte chars if (stackp == stack) { s = alloc_state(mopen, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s1 = alloc_state(mclose, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } patch(list1(&s->out), s1); PUSH(frag(s, list1(&s1->out))); break; @@ -3528,18 +4207,21 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) // At least one node was emitted before NFA_MOPEN, so // at least one node will be between NFA_MOPEN and NFA_MCLOSE e = POP(); - s = alloc_state(mopen, e.start, NULL); /* `(' */ - if (s == NULL) + s = alloc_state(mopen, e.start, NULL); // `(' + if (s == NULL) { goto theend; + } - s1 = alloc_state(mclose, NULL, NULL); /* `)' */ - if (s1 == NULL) + s1 = alloc_state(mclose, NULL, NULL); // `)' + if (s1 == NULL) { goto theend; + } patch(e.out, s1); - if (mopen == NFA_COMPOSING) - /* COMPOSING->out1 = END_COMPOSING */ + if (mopen == NFA_COMPOSING) { + // COMPOSING->out1 = END_COMPOSING patch(list1(&s->out1), s1); + } PUSH(frag(s, list1(&s1->out))); break; @@ -3567,11 +4249,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(*p, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s1 = alloc_state(NFA_SKIP, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } patch(list1(&s->out), s1); PUSH(frag(s, list1(&s1->out))); break; @@ -3587,17 +4271,17 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_COL_LT: case NFA_MARK: case NFA_MARK_GT: - case NFA_MARK_LT: - { - int n = *++p; /* lnum, col or mark name */ + case NFA_MARK_LT: { + int n = *++p; // lnum, col or mark name if (nfa_calc_size == true) { nstate += 1; break; } s = alloc_state(p[-1], NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s->val = n; PUSH(frag(s, list1(&s->out))); break; @@ -3612,18 +4296,17 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(*p, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, list1(&s->out))); break; - - } /* switch(*p) */ - - } /* for(p = postfix; *p; ++p) */ + } // switch(*p) + } // for(p = postfix; *p; ++p) if (nfa_calc_size == true) { nstate++; - goto theend; /* Return value when counting size is ignored anyway */ + goto theend; // Return value when counting size is ignored anyway } e = POP(); @@ -3639,7 +4322,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) "Not enough space to store the whole NFA ")); } - matchstate = &state_ptr[istate++]; /* the match state */ + matchstate = &state_ptr[istate++]; // the match state matchstate->c = NFA_MATCH; matchstate->out = matchstate->out1 = NULL; matchstate->id = 0; @@ -3702,9 +4385,10 @@ static void nfa_postprocess(nfa_regprog_T *prog) directly = ch_follows < ch_invisible; } } - if (directly) - /* switch to the _FIRST state */ - ++prog->state[i].c; + if (directly) { + // switch to the _FIRST state + prog->state[i].c++; + } } } } @@ -3713,11 +4397,11 @@ static void nfa_postprocess(nfa_regprog_T *prog) // NFA execution code. ///////////////////////////////////////////////////////////////// -/* Values for done in nfa_pim_T. */ -#define NFA_PIM_UNUSED 0 /* pim not used */ -#define NFA_PIM_TODO 1 /* pim not done yet */ -#define NFA_PIM_MATCH 2 /* pim executed, matches */ -#define NFA_PIM_NOMATCH 3 /* pim executed, no match */ +// Values for done in nfa_pim_T. +#define NFA_PIM_UNUSED 0 // pim not used +#define NFA_PIM_TODO 1 // pim not done yet +#define NFA_PIM_MATCH 2 // pim executed, matches +#define NFA_PIM_NOMATCH 3 // pim executed, no match #ifdef REGEXP_DEBUG @@ -3733,23 +4417,24 @@ static void log_subexpr(regsub_T *sub) { int j; - for (j = 0; j < sub->in_use; j++) - if (REG_MULTI) + for (j = 0; j < sub->in_use; j++) { + if (REG_MULTI) { fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", - j, - sub->list.multi[j].start_col, - (int)sub->list.multi[j].start_lnum, - sub->list.multi[j].end_col, - (int)sub->list.multi[j].end_lnum); - else { + j, + sub->list.multi[j].start_col, + (int)sub->list.multi[j].start_lnum, + sub->list.multi[j].end_col, + (int)sub->list.multi[j].end_lnum); + } else { char *s = (char *)sub->list.line[j].start; char *e = (char *)sub->list.line[j].end; fprintf(log_fd, "*** group %d, start: \"%s\", end: \"%s\"\n", - j, - s == NULL ? "NULL" : s, - e == NULL ? "NULL" : e); + j, + s == NULL ? "NULL" : s, + e == NULL ? "NULL" : e); } + } } static char *pim_info(const nfa_pim_T *pim) @@ -3806,15 +4491,16 @@ static void copy_sub(regsub_T *to, regsub_T *from) { to->in_use = from->in_use; if (from->in_use > 0) { - /* Copy the match start and end positions. */ - if (REG_MULTI) + // Copy the match start and end positions. + if (REG_MULTI) { memmove(&to->list.multi[0], - &from->list.multi[0], - sizeof(struct multipos) * from->in_use); - else + &from->list.multi[0], + sizeof(struct multipos) * from->in_use); + } else { memmove(&to->list.line[0], - &from->list.line[0], - sizeof(struct linepos) * from->in_use); + &from->list.line[0], + sizeof(struct linepos) * from->in_use); + } } } @@ -3823,18 +4509,20 @@ static void copy_sub(regsub_T *to, regsub_T *from) */ static void copy_sub_off(regsub_T *to, regsub_T *from) { - if (to->in_use < from->in_use) + if (to->in_use < from->in_use) { to->in_use = from->in_use; + } if (from->in_use > 1) { - /* Copy the match start and end positions. */ - if (REG_MULTI) + // Copy the match start and end positions. + if (REG_MULTI) { memmove(&to->list.multi[1], - &from->list.multi[1], - sizeof(struct multipos) * (from->in_use - 1)); - else + &from->list.multi[1], + sizeof(struct multipos) * (from->in_use - 1)); + } else { memmove(&to->list.line[1], - &from->list.line[1], - sizeof(struct linepos) * (from->in_use - 1)); + &from->list.line[1], + sizeof(struct linepos) * (from->in_use - 1)); + } } } @@ -3845,13 +4533,14 @@ static void copy_ze_off(regsub_T *to, regsub_T *from) { if (rex.nfa_has_zend) { if (REG_MULTI) { - if (from->list.multi[0].end_lnum >= 0){ + if (from->list.multi[0].end_lnum >= 0) { to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; to->list.multi[0].end_col = from->list.multi[0].end_col; } } else { - if (from->list.line[0].end != NULL) + if (from->list.line[0].end != NULL) { to->list.line[0].end = from->list.line[0].end; + } } } } @@ -3864,8 +4553,8 @@ static bool sub_equal(regsub_T *sub1, regsub_T *sub2) int todo; linenr_T s1; linenr_T s2; - char_u *sp1; - char_u *sp2; + char_u *sp1; + char_u *sp2; todo = sub1->in_use > sub2->in_use ? sub1->in_use : sub2->in_use; if (REG_MULTI) { @@ -3944,11 +4633,8 @@ static bool sub_equal(regsub_T *sub1, regsub_T *sub2) } #ifdef REGEXP_DEBUG -static void report_state(char *action, - regsub_T *sub, - nfa_state_T *state, - int lid, - nfa_pim_T *pim) { +static void report_state(char *action, regsub_T *sub, nfa_state_T *state, int lid, nfa_pim_T *pim) +{ int col; if (sub->in_use <= 0) { @@ -3966,14 +4652,14 @@ static void report_state(char *action, #endif -// Return true if the same state is already in list "l" with the same -// positions as "subs". -static bool has_state_with_pos( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs, // pointers to subexpressions - nfa_pim_T *pim // postponed match or NULL -) +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// @param pim postponed match or NULL +/// +/// @return true if the same state is already in list "l" with the same +/// positions as "subs". +static bool has_state_with_pos(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim) FUNC_ATTR_NONNULL_ARG(1, 2, 3) { for (int i = 0; i < l->n; i++) { @@ -4048,7 +4734,7 @@ static bool match_follows(const nfa_state_T *startstate, int depth) case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: case NFA_COMPOSING: - /* skip ahead to next state */ + // skip ahead to next state state = state->out1->out; continue; @@ -4105,12 +4791,12 @@ static bool match_follows(const nfa_state_T *startstate, int depth) } -// Return true if "state" is already in list "l". -static bool state_in_list( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs // pointers to subexpressions -) +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// +/// @return true if "state" is already in list "l". +static bool state_in_list(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs) FUNC_ATTR_NONNULL_ALL { if (state->lastlist[nfa_ll_index] == l->id) { @@ -4124,15 +4810,18 @@ static bool state_in_list( // Offset used for "off" by addstate_here(). #define ADDSTATE_HERE_OFFSET 10 -// Add "state" and possibly what follows to state list ".". -// Returns "subs_arg", possibly copied into temp_subs. -// Returns NULL when recursiveness is too deep. -static regsubs_T *addstate( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs_arg, // pointers to subexpressions - nfa_pim_T *pim, // postponed look-behind match - int off_arg) // byte offset, when -1 go to next line +/// Add "state" and possibly what follows to state list ".". +/// +/// @param l runtime state list +/// @param state state to update +/// @param subs_arg pointers to subexpressions +/// @param pim postponed look-behind match +/// @param off_arg byte offset, when -1 go to next line +/// +/// @return "subs_arg", possibly copied into temp_subs. +/// NULL when recursiveness is too deep. +static regsubs_T *addstate(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs_arg, nfa_pim_T *pim, + int off_arg) FUNC_ATTR_NONNULL_ARG(1, 2) FUNC_ATTR_WARN_UNUSED_RESULT { int subidx; @@ -4141,13 +4830,13 @@ static regsubs_T *addstate( int listindex = 0; int k; int found = false; - nfa_thread_T *thread; - struct multipos save_multipos; + nfa_thread_T *thread; + struct multipos save_multipos; int save_in_use; - char_u *save_ptr; + char_u *save_ptr; int i; - regsub_T *sub; - regsubs_T *subs = subs_arg; + regsub_T *sub; + regsubs_T *subs = subs_arg; static regsubs_T temp_subs; #ifdef REGEXP_DEBUG int did_print = false; @@ -4259,12 +4948,13 @@ static regsubs_T *addstate( skip_add: #ifdef REGEXP_DEBUG nfa_set_code(state->c); - fprintf(log_fd, "> Not adding state %d to list %d. char %d: %s pim: %s has_pim: %d found: %d\n", + fprintf(log_fd, + "> Not adding state %d to list %d. char %d: %s pim: %s has_pim: %d found: %d\n", abs(state->id), l->id, state->c, code, pim == NULL ? "NULL" : "yes", l->has_pim, found); #endif - depth--; - return subs; + depth--; + return subs; } } @@ -4301,13 +4991,13 @@ skip_add: l->len = newlen; } - /* add the state to the list */ + // add the state to the list state->lastlist[nfa_ll_index] = l->id; thread = &l->t[l->n++]; thread->state = state; - if (pim == NULL) + if (pim == NULL) { thread->pim.result = NFA_PIM_UNUSED; - else { + } else { copy_pim(&thread->pim, pim); l->has_pim = true; } @@ -4322,15 +5012,16 @@ skip_add: } #ifdef REGEXP_DEBUG - if (!did_print) + if (!did_print) { report_state("Processing", &subs->norm, state, l->id, pim); + } #endif switch (state->c) { case NFA_MATCH: break; case NFA_SPLIT: - /* order matters here */ + // order matters here subs = addstate(l, state->out, subs, pim, off_arg); subs = addstate(l, state->out1, subs, pim, off_arg); break; @@ -4373,7 +5064,7 @@ skip_add: sub = &subs->norm; } - /* avoid compiler warnings */ + // avoid compiler warnings save_ptr = NULL; memset(&save_multipos, 0, sizeof(save_multipos)); @@ -4429,11 +5120,12 @@ skip_add: if (save_in_use == -1) { if (REG_MULTI) { sub->list.multi[subidx] = save_multipos; - } - else + } else { sub->list.line[subidx].start = save_ptr; - } else + } + } else { sub->in_use = save_in_use; + } break; case NFA_MCLOSE: @@ -4480,8 +5172,9 @@ skip_add: // We don't fill in gaps here, there must have been an MOPEN that // has done that. save_in_use = sub->in_use; - if (sub->in_use <= subidx) + if (sub->in_use <= subidx) { sub->in_use = subidx + 1; + } if (REG_MULTI) { save_multipos = sub->list.multi[subidx]; if (off == -1) { @@ -4492,7 +5185,7 @@ skip_add: sub->list.multi[subidx].end_col = (colnr_T)(rex.input - rex.line + off); } - /* avoid compiler warnings */ + // avoid compiler warnings save_ptr = NULL; } else { save_ptr = sub->list.line[subidx].end; @@ -4514,9 +5207,9 @@ skip_add: if (REG_MULTI) { sub->list.multi[subidx] = save_multipos; - } - else + } else { sub->list.line[subidx].end = save_ptr; + } sub->in_use = save_in_use; break; } @@ -4524,19 +5217,17 @@ skip_add: return subs; } -/* - * Like addstate(), but the new state(s) are put at position "*ip". - * Used for zero-width matches, next state to use is the added one. - * This makes sure the order of states to be tried does not change, which - * matters for alternatives. - */ -static regsubs_T *addstate_here( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs, // pointers to subexpressions - nfa_pim_T *pim, // postponed look-behind match - int *ip -) +/// Like addstate(), but the new state(s) are put at position "*ip". +/// Used for zero-width matches, next state to use is the added one. +/// This makes sure the order of states to be tried does not change, which +/// matters for alternatives. +/// +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// @param pim postponed look-behind match +static regsubs_T *addstate_here(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim, + int *ip) FUNC_ATTR_NONNULL_ARG(1, 2, 5) FUNC_ATTR_WARN_UNUSED_RESULT { int tlen = l->n; @@ -4578,25 +5269,25 @@ static regsubs_T *addstate_here( nfa_thread_T *const newl = xmalloc(newsize); l->len = newlen; memmove(&(newl[0]), - &(l->t[0]), - sizeof(nfa_thread_T) * listidx); + &(l->t[0]), + sizeof(nfa_thread_T) * listidx); memmove(&(newl[listidx]), - &(l->t[l->n - count]), - sizeof(nfa_thread_T) * count); + &(l->t[l->n - count]), + sizeof(nfa_thread_T) * count); memmove(&(newl[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); xfree(l->t); l->t = newl; } else { // make space for new states, then move them from the // end to the current position memmove(&(l->t[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - listidx - 1)); + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - listidx - 1)); memmove(&(l->t[listidx]), - &(l->t[l->n - 1]), - sizeof(nfa_thread_T) * count); + &(l->t[l->n - 1]), + sizeof(nfa_thread_T) * count); } } --l->n; @@ -4622,8 +5313,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_BLANK: - if (c == ' ' || c == '\t') + if (c == ' ' || c == '\t') { return OK; + } break; case NFA_CLASS_CNTRL: if (c >= 1 && c <= 127 && iscntrl(c)) { @@ -4631,8 +5323,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_DIGIT: - if (ascii_isdigit(c)) + if (ascii_isdigit(c)) { return OK; + } break; case NFA_CLASS_GRAPH: if (c >= 1 && c <= 127 && isgraph(c)) { @@ -4645,8 +5338,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_PRINT: - if (vim_isprintc(c)) + if (vim_isprintc(c)) { return OK; + } break; case NFA_CLASS_PUNCT: if (c >= 1 && c < 128 && ispunct(c)) { @@ -4654,8 +5348,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_SPACE: - if ((c >= 9 && c <= 13) || (c == ' ')) + if ((c >= 9 && c <= 13) || (c == ' ')) { return OK; + } break; case NFA_CLASS_UPPER: if (mb_isupper(c)) { @@ -4663,20 +5358,24 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_XDIGIT: - if (ascii_isxdigit(c)) + if (ascii_isxdigit(c)) { return OK; + } break; case NFA_CLASS_TAB: - if (c == '\t') + if (c == '\t') { return OK; + } break; case NFA_CLASS_RETURN: - if (c == '\r') + if (c == '\r') { return OK; + } break; case NFA_CLASS_BACKSPACE: - if (c == '\b') + if (c == '\b') { return OK; + } break; case NFA_CLASS_ESCAPE: if (c == ESC) { @@ -4707,30 +5406,28 @@ static int check_char_class(int class, int c) return FAIL; } -/* - * Check for a match with subexpression "subidx". - * Return true if it matches. - */ -static int -match_backref ( - regsub_T *sub, /* pointers to subexpressions */ - int subidx, - int *bytelen /* out: length of match in bytes */ -) +/// Check for a match with subexpression "subidx". +/// +/// @param sub pointers to subexpressions +/// @param bytelen out: length of match in bytes +/// +/// @return true if it matches. +static int match_backref(regsub_T *sub, int subidx, int *bytelen) { int len; if (sub->in_use <= subidx) { retempty: - /* backref was not set, match an empty string */ + // backref was not set, match an empty string *bytelen = 0; return true; } if (REG_MULTI) { if (sub->list.multi[subidx].start_lnum < 0 - || sub->list.multi[subidx].end_lnum < 0) + || sub->list.multi[subidx].end_lnum < 0) { goto retempty; + } if (sub->list.multi[subidx].start_lnum == rex.lnum && sub->list.multi[subidx].end_lnum == rex.lnum) { len = sub->list.multi[subidx].end_col @@ -4751,8 +5448,9 @@ retempty: } } else { if (sub->list.line[subidx].start == NULL - || sub->list.line[subidx].end == NULL) + || sub->list.line[subidx].end == NULL) { goto retempty; + } len = (int)(sub->list.line[subidx].end - sub->list.line[subidx].start); if (cstrncmp(sub->list.line[subidx].start, rex.input, &len) == 0) { *bytelen = len; @@ -4763,22 +5461,18 @@ retempty: } - -/* - * Check for a match with \z subexpression "subidx". - * Return true if it matches. - */ -static int -match_zref ( - int subidx, - int *bytelen /* out: length of match in bytes */ -) +/// Check for a match with \z subexpression "subidx". +/// +/// @param bytelen out: length of match in bytes +/// +/// @return true if it matches. +static int match_zref(int subidx, int *bytelen) { int len; cleanup_zsubexpr(); if (re_extmatch_in == NULL || re_extmatch_in->matches[subidx] == NULL) { - /* backref was not set, match an empty string */ + // backref was not set, match an empty string *bytelen = 0; return true; } @@ -4799,11 +5493,11 @@ match_zref ( static void nfa_save_listids(nfa_regprog_T *prog, int *list) { int i; - nfa_state_T *p; + nfa_state_T *p; - /* Order in the list is reverse, it's a bit faster that way. */ + // Order in the list is reverse, it's a bit faster that way. p = &prog->state[0]; - for (i = prog->nstate; --i >= 0; ) { + for (i = prog->nstate; --i >= 0;) { list[i] = p->lastlist[1]; p->lastlist[1] = 0; ++p; @@ -4816,10 +5510,10 @@ static void nfa_save_listids(nfa_regprog_T *prog, int *list) static void nfa_restore_listids(nfa_regprog_T *prog, int *list) { int i; - nfa_state_T *p; + nfa_state_T *p; p = &prog->state[0]; - for (i = prog->nstate; --i >= 0; ) { + for (i = prog->nstate; --i >= 0;) { p->lastlist[1] = list[i]; ++p; } @@ -4827,8 +5521,12 @@ static void nfa_restore_listids(nfa_regprog_T *prog, int *list) static bool nfa_re_num_cmp(uintmax_t val, int op, uintmax_t pos) { - if (op == 1) return pos > val; - if (op == 2) return pos < val; + if (op == 1) { + return pos > val; + } + if (op == 2) { + return pos < val; + } return val == pos; } @@ -4838,9 +5536,8 @@ static bool nfa_re_num_cmp(uintmax_t val, int op, uintmax_t pos) * "pim" is NULL or contains info about a Postponed Invisible Match (start * position). */ -static int recursive_regmatch( - nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T *prog, - regsubs_T *submatch, regsubs_T *m, int **listids, int *listids_len) +static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T *prog, + regsubs_T *submatch, regsubs_T *m, int **listids, int *listids_len) FUNC_ATTR_NONNULL_ARG(1, 3, 5, 6, 7) { const int save_reginput_col = (int)(rex.input - rex.line); @@ -4849,7 +5546,7 @@ static int recursive_regmatch( const int save_nfa_listid = rex.nfa_listid; save_se_T *const save_nfa_endp = nfa_endp; save_se_T endpos; - save_se_T *endposp = NULL; + save_se_T *endposp = NULL; int need_restore = false; if (pim != NULL) { @@ -4919,8 +5616,9 @@ static int recursive_regmatch( } #ifdef REGEXP_DEBUG - if (log_fd != stderr) + if (log_fd != stderr) { fclose(log_fd); + } log_fd = NULL; #endif // Have to clear the lastlist field of the NFA nodes, so that @@ -4998,28 +5696,30 @@ static int failure_chance(nfa_state_T *state, int depth) int c = state->c; int l, r; - /* detect looping */ - if (depth > 4) + // detect looping + if (depth > 4) { return 1; + } switch (c) { case NFA_SPLIT: - if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT) - /* avoid recursive stuff */ + if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT) { + // avoid recursive stuff return 1; - /* two alternatives, use the lowest failure chance */ + } + // two alternatives, use the lowest failure chance l = failure_chance(state->out, depth + 1); r = failure_chance(state->out1, depth + 1); return l < r ? l : r; case NFA_ANY: - /* matches anything, unlikely to fail */ + // matches anything, unlikely to fail return 1; case NFA_MATCH: case NFA_MCLOSE: case NFA_ANY_COMPOSING: - /* empty match works always */ + // empty match works always return 0; case NFA_START_INVISIBLE: @@ -5031,7 +5731,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: case NFA_START_PATTERN: - /* recursive regmatch is expensive, use low failure chance */ + // recursive regmatch is expensive, use low failure chance return 5; case NFA_BOL: @@ -5106,7 +5806,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_ZREF7: case NFA_ZREF8: case NFA_ZREF9: - /* backreferences don't match in many places */ + // backreferences don't match in many places return 94; case NFA_LNUM_GT: @@ -5118,7 +5818,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_MARK_GT: case NFA_MARK_LT: case NFA_VISUAL: - /* before/after positions don't match very often */ + // before/after positions don't match very often return 85; case NFA_LNUM: @@ -5128,19 +5828,20 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_COL: case NFA_VCOL: case NFA_MARK: - /* specific positions rarely match */ + // specific positions rarely match return 98; case NFA_COMPOSING: return 95; default: - if (c > 0) - /* character match fails often */ + if (c > 0) { + // character match fails often return 95; + } } - /* something else, includes character classes */ + // something else, includes character classes return 50; } @@ -5236,8 +5937,7 @@ static int nfa_did_time_out(void) /// When there is a match "submatch" contains the positions. /// /// Note: Caller must ensure that: start != NULL. -static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, - regsubs_T *submatch, regsubs_T *m) +static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *submatch, regsubs_T *m) FUNC_ATTR_NONNULL_ARG(1, 2, 4) { int result = false; @@ -5246,9 +5946,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, nfa_thread_T *t; nfa_list_T list[2]; int listidx; - nfa_list_T *thislist; - nfa_list_T *nextlist; - int *listids = NULL; + nfa_list_T *thislist; + nfa_list_T *nextlist; + int *listids = NULL; int listids_len = 0; nfa_state_T *add_state; bool add_here; @@ -5257,7 +5957,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, int toplevel = start->c == NFA_MOPEN; regsubs_T *r; #ifdef NFA_REGEXP_DEBUG_LOG - FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a"); + FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a"); if (debug == NULL) { semsg("(NFA) COULD NOT OPEN %s!", NFA_REGEXP_DEBUG_LOG); @@ -5295,7 +5995,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, fprintf(log_fd, "**********************************\n"); nfa_set_code(start->c); fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n", - abs(start->id), code); + abs(start->id), code); fprintf(log_fd, "**********************************\n"); } else { emsg(_(e_log_open_failed)); @@ -5342,7 +6042,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, /* * Run for each character. */ - for (;; ) { + for (;;) { int curc = utf_ptr2char((char *)rex.input); int clen = utfc_ptr2len((char *)rex.input); if (curc == NUL) { @@ -5350,7 +6050,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, go_to_nextline = false; } - /* swap lists */ + // swap lists thislist = &list[flag]; nextlist = &list[flag ^= 1]; nextlist->n = 0; // clear nextlist @@ -5377,8 +6077,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, { int i; - for (i = 0; i < thislist->n; i++) + for (i = 0; i < thislist->n; i++) { fprintf(log_fd, "%d ", abs(thislist->t[i].state->id)); + } } fprintf(log_fd, "\n"); #endif @@ -5389,8 +6090,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, /* * If the state lists are empty we can stop. */ - if (thislist->n == 0) + if (thislist->n == 0) { break; + } // compute nextlist for (listidx = 0; listidx < thislist->n; listidx++) { @@ -5439,7 +6141,6 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, add_count = 0; switch (t->state->c) { case NFA_MATCH: - { // If the match is not at the start of the line, ends before a // composing characters and rex.reg_icombine is not set, that // is not really a match. @@ -5464,7 +6165,6 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, clen = 0; } goto nextchar; - } case NFA_END_INVISIBLE: case NFA_END_INVISIBLE_NEG: @@ -5530,11 +6230,10 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_START_INVISIBLE_BEFORE_FIRST: case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: - { #ifdef REGEXP_DEBUG fprintf(log_fd, "Failure chance invisible: %d, what follows: %d\n", - failure_chance(t->state->out, 0), - failure_chance(t->state->out1->out, 0)); + failure_chance(t->state->out, 0), + failure_chance(t->state->out1->out, 0)); #endif // Do it directly if there already is a PIM or when // nfa_postprocess() detected it will work better. @@ -5610,11 +6309,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, goto theend; } } - } - break; + break; - case NFA_START_PATTERN: - { + case NFA_START_PATTERN: { nfa_state_T *skip = NULL; #ifdef REGEXP_DEBUG int skip_lid = 0; @@ -5628,13 +6325,13 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, skip_lid = nextlist->id; #endif } else if (state_in_list(nextlist, - t->state->out1->out->out, &t->subs)) { + t->state->out1->out->out, &t->subs)) { skip = t->state->out1->out->out; #ifdef REGEXP_DEBUG skip_lid = nextlist->id; #endif } else if (state_in_list(thislist, - t->state->out1->out->out, &t->subs)) { + t->state->out1->out->out, &t->subs)) { skip = t->state->out1->out->out; #ifdef REGEXP_DEBUG skip_lid = thislist->id; @@ -5643,10 +6340,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, if (skip != NULL) { #ifdef REGEXP_DEBUG nfa_set_code(skip->c); - fprintf( - log_fd, - "> Not trying to match pattern, output state %d is already in list %d. char %d: %s\n", - abs(skip->id), skip_lid, skip->c, code); + fprintf(log_fd, + "> Not trying to match pattern, output state %d is already in list %d. char %d: %s\n", // NOLINT(whitespace/line_length) + abs(skip->id), skip_lid, skip->c, code); #endif break; } @@ -5783,8 +6479,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, } break; - case NFA_COMPOSING: - { + case NFA_COMPOSING: { int mc = curc; int len = 0; nfa_state_T *end; @@ -5835,17 +6530,20 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, // composing chars are matched. result = OK; while (sta->c != NFA_END_COMPOSING) { - for (j = 0; j < ccount; ++j) - if (cchars[j] == sta->c) + for (j = 0; j < ccount; j++) { + if (cchars[j] == sta->c) { break; + } + } if (j == ccount) { result = FAIL; break; } sta = sta->out; } - } else + } else { result = FAIL; + } end = t->state->out1; // NFA_END_COMPOSING ADD_STATE_IF_MATCH(end); @@ -5868,11 +6566,10 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, break; case NFA_START_COLL: - case NFA_START_NEG_COLL: - { + case NFA_START_NEG_COLL: { // What follows is a list of characters, until NFA_END_COLL. // One of them must match or none of them must match. - nfa_state_T *state; + nfa_state_T *state; int result_if_matched; int c1, c2; @@ -5884,7 +6581,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, state = t->state->out; result_if_matched = (t->state->c == NFA_START_COLL); - for (;; ) { + for (;;) { if (state->c == NFA_END_COLL) { result = !result_if_matched; break; @@ -5895,7 +6592,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, c2 = state->val; #ifdef REGEXP_DEBUG fprintf(log_fd, "NFA_RANGE_MIN curc=%d c1=%d c2=%d\n", - curc, c1, c2); + curc, c1, c2); #endif if (curc >= c1 && curc <= c2) { result = result_if_matched; @@ -6210,45 +6907,43 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_VCOL: case NFA_VCOL_GT: - case NFA_VCOL_LT: - { - int op = t->state->c - NFA_VCOL; - colnr_T col = (colnr_T)(rex.input - rex.line); - - // Bail out quickly when there can't be a match, avoid the overhead of - // win_linetabsize() on long lines. - if (op != 1 && col > t->state->val * MB_MAXBYTES) { - break; - } + case NFA_VCOL_LT: { + int op = t->state->c - NFA_VCOL; + colnr_T col = (colnr_T)(rex.input - rex.line); - result = false; - win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win; - if (op == 1 && col - 1 > t->state->val && col > 100) { - long ts = wp->w_buffer->b_p_ts; - - // Guess that a character won't use more columns than 'tabstop', - // with a minimum of 4. - if (ts < 4) { - ts = 4; - } - result = col > t->state->val * ts; - } - if (!result) { - uintmax_t lts = win_linetabsize(wp, rex.line, col); - assert(t->state->val >= 0); - result = nfa_re_num_cmp((uintmax_t)t->state->val, op, lts + 1); - } - if (result) { - add_here = true; - add_state = t->state->out; + // Bail out quickly when there can't be a match, avoid the overhead of + // win_linetabsize() on long lines. + if (op != 1 && col > t->state->val * MB_MAXBYTES) { + break; + } + + result = false; + win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win; + if (op == 1 && col - 1 > t->state->val && col > 100) { + long ts = wp->w_buffer->b_p_ts; + + // Guess that a character won't use more columns than 'tabstop', + // with a minimum of 4. + if (ts < 4) { + ts = 4; } + result = col > t->state->val * ts; } - break; + if (!result) { + uintmax_t lts = win_linetabsize(wp, rex.line, col); + assert(t->state->val >= 0); + result = nfa_re_num_cmp((uintmax_t)t->state->val, op, lts + 1); + } + if (result) { + add_here = true; + add_state = t->state->out; + } + } + break; case NFA_MARK: case NFA_MARK_GT: - case NFA_MARK_LT: - { + case NFA_MARK_LT: { pos_T *pos; size_t col = REG_MULTI ? rex.input - rex.line : 0; @@ -6264,7 +6959,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, // exists and mark is set in reg_buf. if (pos != NULL && pos->lnum > 0) { const colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum - && pos->col == MAXCOL + && pos->col == MAXCOL ? (colnr_T)STRLEN(reg_getline(pos->lnum - rex.reg_firstlnum)) : pos->col; @@ -6287,8 +6982,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_CURSOR: result = rex.reg_win != NULL - && (rex.lnum + rex.reg_firstlnum == rex.reg_win->w_cursor.lnum) - && ((colnr_T)(rex.input - rex.line) == rex.reg_win->w_cursor.col); + && (rex.lnum + rex.reg_firstlnum == rex.reg_win->w_cursor.lnum) + && ((colnr_T)(rex.input - rex.line) == rex.reg_win->w_cursor.col); if (result) { add_here = true; add_state = t->state->out; @@ -6358,10 +7053,11 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, nfa_pim_T *pim; nfa_pim_T pim_copy; - if (t->pim.result == NFA_PIM_UNUSED) + if (t->pim.result == NFA_PIM_UNUSED) { pim = NULL; - else + } else { pim = &t->pim; + } // Handle the postponed invisible match if the match might end // without advancing and before the end of the line. @@ -6394,10 +7090,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, result = (pim->result == NFA_PIM_MATCH); #ifdef REGEXP_DEBUG fprintf(log_fd, "\n"); - fprintf( - log_fd, - "Using previous recursive nfa_regmatch() result, result == %d\n", - pim->result); + fprintf(log_fd, + "Using previous recursive nfa_regmatch() result, result == %d\n", + pim->result); fprintf(log_fd, "MATCH = %s\n", result ? "OK" : "false"); fprintf(log_fd, "\n"); #endif @@ -6500,7 +7195,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, || utf_fold(c) != utf_fold(prog->regstart))) { #ifdef REGEXP_DEBUG fprintf(log_fd, - " Skipping start state, regstart does not match\n"); + " Skipping start state, regstart does not match\n"); #endif add = false; } @@ -6532,8 +7227,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, { int i; - for (i = 0; i < thislist->n; i++) + for (i = 0; i < thislist->n; i++) { fprintf(log_fd, "%d ", abs(thislist->t[i].state->id)); + } } fprintf(log_fd, "\n"); #endif @@ -6565,8 +7261,9 @@ nextchar: } #ifdef REGEXP_DEBUG - if (log_fd != stderr) + if (log_fd != stderr) { fclose(log_fd); + } log_fd = NULL; #endif @@ -6583,18 +7280,19 @@ theend: return nfa_match; } -// Try match of "prog" with at rex.line["col"]. -// Returns <= 0 for failure, number of lines contained in the match otherwise. -static long nfa_regtry(nfa_regprog_T *prog, - colnr_T col, - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// Try match of "prog" with at rex.line["col"]. +/// +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return <= 0 for failure, number of lines contained in the match otherwise. +static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_out) { int i; regsubs_T subs, m; nfa_state_T *start = prog->start; #ifdef REGEXP_DEBUG - FILE *f; + FILE *f; #endif rex.input = rex.line + col; @@ -6606,10 +7304,10 @@ static long nfa_regtry(nfa_regprog_T *prog, f = fopen(NFA_REGEXP_RUN_LOG, "a"); if (f != NULL) { fprintf(f, - "\n\n\t=======================================================\n"); -#ifdef REGEXP_DEBUG + "\n\n\t=======================================================\n"); +# ifdef REGEXP_DEBUG fprintf(f, "\tRegexp is \"%s\"\n", nfa_regengine.expr); -#endif +# endif fprintf(f, "\tInput text is \"%s\" \n", rex.input); fprintf(f, "\t=======================================================\n\n"); nfa_print_state(f, start); @@ -6668,7 +7366,7 @@ static long nfa_regtry(nfa_regprog_T *prog, } } - /* Package any found \z(...\) matches for export. Default is none. */ + // Package any found \z(...\) matches for export. Default is none. unref_extmatch(re_extmatch_out); re_extmatch_out = NULL; @@ -6691,9 +7389,10 @@ static long nfa_regtry(nfa_regprog_T *prog, } else { struct linepos *lpos = &subs.synt.list.line[i]; - if (lpos->start != NULL && lpos->end != NULL) + if (lpos->start != NULL && lpos->end != NULL) { re_extmatch_out->matches[i] = vim_strnsave(lpos->start, lpos->end - lpos->start); + } } } } @@ -6711,10 +7410,9 @@ static long nfa_regtry(nfa_regprog_T *prog, /// /// @return <= 0 if there is no match and number of lines contained in the /// match otherwise. -static long nfa_regexec_both(char_u *line, colnr_T startcol, - proftime_T *tm, int *timed_out) +static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm, int *timed_out) { - nfa_regprog_T *prog; + nfa_regprog_T *prog; long retval = 0L; colnr_T col = startcol; @@ -6729,7 +7427,7 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, rex.reg_endp = rex.reg_match->endp; } - /* Be paranoid... */ + // Be paranoid... if (prog == NULL || line == NULL) { iemsg(_(e_null)); goto theend; @@ -6759,8 +7457,9 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, nfa_regengine.expr = prog->pattern; #endif - if (prog->reganch && col > 0) + if (prog->reganch && col > 0) { return 0L; + } rex.need_clear_subexpr = true; // Clear the external match subpointers if necessary. @@ -6834,11 +7533,12 @@ theend: */ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) { - nfa_regprog_T *prog = NULL; - int *postfix; + nfa_regprog_T *prog = NULL; + int *postfix; - if (expr == NULL) + if (expr == NULL) { return NULL; + } #ifdef REGEXP_DEBUG nfa_regengine.expr = expr; @@ -6881,7 +7581,7 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) */ post2nfa(postfix, post_ptr, true); - /* allocate the regprog with space for the compiled regexp */ + // allocate the regprog with space for the compiled regexp size_t prog_size = sizeof(nfa_regprog_T) + sizeof(nfa_state_T) * (nstate - 1); prog = xmalloc(prog_size); state_ptr = prog->state; @@ -6912,7 +7612,7 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) nfa_postfix_dump(expr, OK); nfa_dump(prog); #endif - /* Remember whether this pattern has any \z specials in it. */ + // Remember whether this pattern has any \z specials in it. prog->reghasz = re_has_z; prog->pattern = vim_strsave(expr); #ifdef REGEXP_DEBUG @@ -6946,21 +7646,16 @@ static void nfa_regfree(regprog_T *prog) } } -/* - * Match a regexp against a string. - * "rmp->regprog" is a compiled regexp as returned by nfa_regcomp(). - * Uses curbuf for line count and 'iskeyword'. - * If "line_lbr" is true, consider a "\n" in "line" to be a line break. - * - * Returns <= 0 for failure, number of lines contained in the match otherwise. - */ -static int -nfa_regexec_nl ( - regmatch_T *rmp, - char_u *line, /* string to match against */ - colnr_T col, /* column to start looking for match */ - bool line_lbr -) +/// Match a regexp against a string. +/// "rmp->regprog" is a compiled regexp as returned by nfa_regcomp(). +/// Uses curbuf for line count and 'iskeyword'. +/// If "line_lbr" is true, consider a "\n" in "line" to be a line break. +/// +/// @param line string to match against +/// @param col column to start looking for match +/// +/// @return <= 0 for failure, number of lines contained in the match otherwise. +static int nfa_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col, bool line_lbr) { rex.reg_match = rmp; rex.reg_mmatch = NULL; @@ -7009,8 +7704,7 @@ nfa_regexec_nl ( /// /// @par /// FIXME if this behavior is not compatible. -static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, - linenr_T lnum, colnr_T col, +static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm, int *timed_out) { rex.reg_match = NULL; diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 4d0fde642d..86dbf532a7 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -132,10 +132,6 @@ static match_T search_hl; // used for 'hlsearch' highlight matching -StlClickDefinition *tab_page_click_defs = NULL; - -long tab_page_click_defs_size = 0; - // for line_putchar. Contains the state that needs to be remembered from // putting one character to the next. typedef struct { @@ -276,25 +272,25 @@ void redrawWinline(win_T *wp, linenr_T lnum) } } -/* - * update all windows that are editing the current buffer - */ -void update_curbuf(int type) -{ - redraw_curbuf_later(type); - update_screen(type); -} - /// called when the status bars for the buffer 'buf' need to be updated void redraw_buf_status_later(buf_T *buf) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_buffer == buf - && (wp->w_status_height || (wp == curwin && global_stl_height()))) { + if (wp->w_buffer != buf) { + continue; + } + bool redraw = false; + + if (wp->w_status_height || (wp == curwin && global_stl_height())) { wp->w_redr_status = true; - if (must_redraw < VALID) { - must_redraw = VALID; - } + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw && must_redraw < VALID) { + must_redraw = VALID; } } } @@ -382,9 +378,9 @@ int update_screen(int type) int valid = MAX(Rows - msg_scrollsize(), 0); if (msg_grid.chars) { // non-displayed part of msg_grid is considered invalid. - for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.Rows); i++) { + for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.rows); i++) { grid_clear_line(&msg_grid, msg_grid.line_offset[i], - msg_grid.Columns, false); + msg_grid.cols, false); } } if (msg_use_msgsep()) { @@ -400,6 +396,9 @@ int update_screen(int type) if (wp->w_floating) { continue; } + if (wp->w_winrow + wp->w_winbar_height > valid) { + wp->w_redr_winbar = true; + } if (W_ENDROW(wp) > valid) { wp->w_redr_type = MAX(wp->w_redr_type, NOT_VALID); } @@ -431,6 +430,9 @@ int update_screen(int type) wp->w_redr_type = REDRAW_TOP; } else { wp->w_redr_type = NOT_VALID; + if (wp->w_winrow + wp->w_winbar_height <= msg_scrolled) { + wp->w_redr_winbar = true; + } if (!is_stl_global && W_ENDROW(wp) + wp->w_status_height <= msg_scrolled) { wp->w_redr_status = true; } @@ -585,10 +587,13 @@ int update_screen(int type) win_update(wp, &providers); } - // redraw status line after the window to minimize cursor movement + // redraw status line and window bar after the window to minimize cursor movement if (wp->w_redr_status) { win_redr_status(wp); } + if (wp->w_redr_winbar) { + win_redr_winbar(wp); + } } end_search_hl(); @@ -598,8 +603,6 @@ int update_screen(int type) pum_redraw(); } - send_grid_resize = false; - /* Reset b_mod_set flags. Going through all windows is probably faster * than going through all buffers (there could be many buffers). */ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { @@ -639,18 +642,18 @@ bool conceal_cursor_line(const win_T *wp) if (*wp->w_p_cocu == NUL) { return false; } - if (get_real_state() & VISUAL) { + if (get_real_state() & MODE_VISUAL) { c = 'v'; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { c = 'i'; - } else if (State & NORMAL) { + } else if (State & MODE_NORMAL) { c = 'n'; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { c = 'c'; } else { return false; } - return vim_strchr(wp->w_p_cocu, c) != NULL; + return vim_strchr((char *)wp->w_p_cocu, c) != NULL; } // Check if the cursor line needs to be redrawn because of 'concealcursor'. @@ -743,11 +746,12 @@ static void win_update(win_T *wp, DecorProviders *providers) if (type >= NOT_VALID) { wp->w_redr_status = true; + wp->w_redr_winbar = true; wp->w_lines_valid = 0; } // Window is zero-height: Only need to draw the separator - if (wp->w_grid.Rows == 0) { + if (wp->w_grid.rows == 0) { // draw the horizontal separator below this window draw_hsep_win(wp); draw_sep_connectors_win(wp); @@ -756,7 +760,7 @@ static void win_update(win_T *wp, DecorProviders *providers) } // Window is zero-width: Only need to draw the separator. - if (wp->w_grid.Columns == 0) { + if (wp->w_grid.cols == 0) { // draw the vertical separator right of this window draw_vsep_win(wp); draw_sep_connectors_win(wp); @@ -955,7 +959,7 @@ static void win_update(win_T *wp, DecorProviders *providers) j = 0; for (ln = wp->w_topline; ln < wp->w_lines[0].wl_lnum; ln++) { j++; - if (j >= wp->w_grid.Rows - 2) { + if (j >= wp->w_grid.rows - 2) { break; } (void)hasFoldingWin(wp, ln, NULL, &ln, true, NULL); @@ -963,13 +967,13 @@ static void win_update(win_T *wp, DecorProviders *providers) } else { j = wp->w_lines[0].wl_lnum - wp->w_topline; } - if (j < wp->w_grid.Rows - 2) { // not too far off + if (j < wp->w_grid.rows - 2) { // not too far off i = plines_m_win(wp, wp->w_topline, wp->w_lines[0].wl_lnum - 1); // insert extra lines for previously invisible filler lines if (wp->w_lines[0].wl_lnum != wp->w_topline) { i += win_get_fill(wp, wp->w_lines[0].wl_lnum) - wp->w_old_topfill; } - if (i != 0 && i < wp->w_grid.Rows - 2) { // less than a screen off + if (i != 0 && i < wp->w_grid.rows - 2) { // less than a screen off // Try to insert the correct number of lines. // If not the last window, delete the lines at the bottom. // win_ins_lines may fail when the terminal can't do it. @@ -982,8 +986,8 @@ static void win_update(win_T *wp, DecorProviders *providers) // Move the entries that were scrolled, disable // the entries for the lines to be redrawn. - if ((wp->w_lines_valid += j) > wp->w_grid.Rows) { - wp->w_lines_valid = wp->w_grid.Rows; + if ((wp->w_lines_valid += j) > wp->w_grid.rows) { + wp->w_lines_valid = wp->w_grid.rows; } for (idx = wp->w_lines_valid; idx - j >= 0; idx--) { wp->w_lines[idx] = wp->w_lines[idx - j]; @@ -1036,7 +1040,7 @@ static void win_update(win_T *wp, DecorProviders *providers) row -= wp->w_topfill; if (row > 0) { win_scroll_lines(wp, 0, -row); - bot_start = wp->w_grid.Rows - row; + bot_start = wp->w_grid.rows - row; } if ((row == 0 || bot_start < 999) && wp->w_lines_valid != 0) { /* @@ -1052,7 +1056,7 @@ static void win_update(win_T *wp, DecorProviders *providers) /* stop at line that didn't fit, unless it is still * valid (no lines deleted) */ if (row > 0 && bot_start + row - + (int)wp->w_lines[j].wl_size > wp->w_grid.Rows) { + + (int)wp->w_lines[j].wl_size > wp->w_grid.rows) { wp->w_lines_valid = idx + 1; break; } @@ -1077,18 +1081,18 @@ static void win_update(win_T *wp, DecorProviders *providers) // When starting redraw in the first line, redraw all lines. if (mid_start == 0) { - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; } } else { // Not VALID or INVERTED: redraw all lines. mid_start = 0; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; } if (type == SOME_VALID) { // SOME_VALID: redraw all lines. mid_start = 0; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; type = NOT_VALID; } @@ -1275,7 +1279,7 @@ static void win_update(win_T *wp, DecorProviders *providers) } } srow += mid_start; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; for (; idx < wp->w_lines_valid; idx++) { // find end if (wp->w_lines[idx].wl_valid && wp->w_lines[idx].wl_lnum >= to + 1) { @@ -1328,7 +1332,7 @@ static void win_update(win_T *wp, DecorProviders *providers) for (;;) { /* stop updating when reached the end of the window (check for _past_ * the end of the window is at the end of the loop) */ - if (row == wp->w_grid.Rows) { + if (row == wp->w_grid.rows) { didline = true; break; } @@ -1433,7 +1437,7 @@ static void win_update(win_T *wp, DecorProviders *providers) new_rows += plines_win(wp, l, true); } j++; - if (new_rows > wp->w_grid.Rows - row - 2) { + if (new_rows > wp->w_grid.rows - row - 2) { // it's getting too much, must redraw the rest new_rows = 9999; break; @@ -1445,17 +1449,17 @@ static void win_update(win_T *wp, DecorProviders *providers) * remaining text or scrolling fails, must redraw the * rest. If scrolling works, must redraw the text * below the scrolled text. */ - if (row - xtra_rows >= wp->w_grid.Rows - 2) { + if (row - xtra_rows >= wp->w_grid.rows - 2) { mod_bot = MAXLNUM; } else { win_scroll_lines(wp, row, xtra_rows); - bot_start = wp->w_grid.Rows + xtra_rows; + bot_start = wp->w_grid.rows + xtra_rows; } } else if (xtra_rows > 0) { /* May scroll text down. If there is not enough * remaining text of scrolling fails, must redraw the * rest. */ - if (row + xtra_rows >= wp->w_grid.Rows - 2) { + if (row + xtra_rows >= wp->w_grid.rows - 2) { mod_bot = MAXLNUM; } else { win_scroll_lines(wp, row + old_rows, xtra_rows); @@ -1483,7 +1487,7 @@ static void win_update(win_T *wp, DecorProviders *providers) wp->w_lines[j] = wp->w_lines[i]; // stop at a line that won't fit if (x + (int)wp->w_lines[j].wl_size - > wp->w_grid.Rows) { + > wp->w_grid.rows) { wp->w_lines_valid = j + 1; break; } @@ -1497,8 +1501,8 @@ static void win_update(win_T *wp, DecorProviders *providers) // move entries in w_lines[] downwards j -= i; wp->w_lines_valid += j; - if (wp->w_lines_valid > wp->w_grid.Rows) { - wp->w_lines_valid = wp->w_grid.Rows; + if (wp->w_lines_valid > wp->w_grid.rows) { + wp->w_lines_valid = wp->w_grid.rows; } for (i = wp->w_lines_valid; i - j >= idx; i--) { wp->w_lines[i] = wp->w_lines[i - j]; @@ -1529,11 +1533,11 @@ static void win_update(win_T *wp, DecorProviders *providers) && wp->w_lines[idx].wl_lnum == lnum && lnum > wp->w_topline && !(dy_flags & (DY_LASTLINE | DY_TRUNCATE)) - && srow + wp->w_lines[idx].wl_size > wp->w_grid.Rows + && srow + wp->w_lines[idx].wl_size > wp->w_grid.rows && win_get_fill(wp, lnum) == 0) { // This line is not going to fit. Don't draw anything here, // will draw "@ " lines below. - row = wp->w_grid.Rows + 1; + row = wp->w_grid.rows + 1; } else { prepare_search_hl(wp, &search_hl, lnum); // Let the syntax stuff know we skipped a few lines. @@ -1544,7 +1548,7 @@ static void win_update(win_T *wp, DecorProviders *providers) // Display one line row = win_line(wp, lnum, srow, - foldinfo.fi_lines ? srow : wp->w_grid.Rows, + foldinfo.fi_lines ? srow : wp->w_grid.rows, mod_top == 0, false, foldinfo, &line_providers); if (foldinfo.fi_lines == 0) { @@ -1563,7 +1567,7 @@ static void win_update(win_T *wp, DecorProviders *providers) wp->w_lines[idx].wl_lnum = lnum; wp->w_lines[idx].wl_valid = true; - if (row > wp->w_grid.Rows) { // past end of grid + if (row > wp->w_grid.rows) { // past end of grid // we may need the size of that too long line later on if (dollar_vcol == -1) { wp->w_lines[idx].wl_size = plines_win(wp, lnum, true); @@ -1581,13 +1585,13 @@ static void win_update(win_T *wp, DecorProviders *providers) // 'relativenumber' set and cursor moved vertically: The // text doesn't need to be drawn, but the number column does. foldinfo_T info = fold_info(wp, lnum); - (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true, + (void)win_line(wp, lnum, srow, wp->w_grid.rows, true, true, info, &line_providers); } // This line does not need to be drawn, advance to the next one. row += wp->w_lines[idx++].wl_size; - if (row > wp->w_grid.Rows) { // past end of screen + if (row > wp->w_grid.rows) { // past end of screen break; } lnum = wp->w_lines[idx - 1].wl_lastlnum + 1; @@ -1635,41 +1639,41 @@ static void win_update(win_T *wp, DecorProviders *providers) * Don't overwrite it, it can be edited. */ wp->w_botline = lnum + 1; - } else if (win_get_fill(wp, lnum) >= wp->w_grid.Rows - srow) { + } else if (win_get_fill(wp, lnum) >= wp->w_grid.rows - srow) { // Window ends in filler lines. wp->w_botline = lnum; - wp->w_filler_rows = wp->w_grid.Rows - srow; + wp->w_filler_rows = wp->w_grid.rows - srow; } else if (dy_flags & DY_TRUNCATE) { // 'display' has "truncate" - int scr_row = wp->w_grid.Rows - 1; + int scr_row = wp->w_grid.rows - 1; // Last line isn't finished: Display "@@@" in the last screen line. - grid_puts_len(&wp->w_grid, (char_u *)"@@", MIN(wp->w_grid.Columns, 2), scr_row, 0, at_attr); + grid_puts_len(&wp->w_grid, (char_u *)"@@", MIN(wp->w_grid.cols, 2), scr_row, 0, at_attr); - grid_fill(&wp->w_grid, scr_row, scr_row + 1, 2, wp->w_grid.Columns, + grid_fill(&wp->w_grid, scr_row, scr_row + 1, 2, wp->w_grid.cols, '@', ' ', at_attr); set_empty_rows(wp, srow); wp->w_botline = lnum; } else if (dy_flags & DY_LASTLINE) { // 'display' has "lastline" - int start_col = wp->w_grid.Columns - 3; + int start_col = wp->w_grid.cols - 3; // Last line isn't finished: Display "@@@" at the end. - grid_fill(&wp->w_grid, wp->w_grid.Rows - 1, wp->w_grid.Rows, - MAX(start_col, 0), wp->w_grid.Columns, '@', '@', at_attr); + grid_fill(&wp->w_grid, wp->w_grid.rows - 1, wp->w_grid.rows, + MAX(start_col, 0), wp->w_grid.cols, '@', '@', at_attr); set_empty_rows(wp, srow); wp->w_botline = lnum; } else { - win_draw_end(wp, '@', ' ', true, srow, wp->w_grid.Rows, HLF_AT); + win_draw_end(wp, '@', ' ', true, srow, wp->w_grid.rows, HLF_AT); wp->w_botline = lnum; } } else { if (eof) { // we hit the end of the file wp->w_botline = buf->b_ml.ml_line_count + 1; j = win_get_fill(wp, wp->w_botline); - if (j > 0 && !wp->w_botfill && row < wp->w_grid.Rows) { + if (j > 0 && !wp->w_botfill && row < wp->w_grid.rows) { // Display filler text below last line. win_line() will check // for ml_line_count+1 and only draw filler lines foldinfo_T info = FOLDINFO_INIT; - row = win_line(wp, wp->w_botline, row, wp->w_grid.Rows, + row = win_line(wp, wp->w_botline, row, wp->w_grid.rows, false, false, info, &line_providers); } } else if (dollar_vcol == -1) { @@ -1678,7 +1682,7 @@ static void win_update(win_T *wp, DecorProviders *providers) // make sure the rest of the screen is blank // write the 'eob' character to rows that aren't part of the file. - win_draw_end(wp, wp->w_p_fcs_chars.eob, ' ', false, row, wp->w_grid.Rows, + win_draw_end(wp, wp->w_p_fcs_chars.eob, ' ', false, row, wp->w_grid.rows, HLF_EOB); } @@ -1763,8 +1767,8 @@ static int win_fill_end(win_T *wp, int c1, int c2, int off, int width, int row, { int nn = off + width; - if (nn > wp->w_grid.Columns) { - nn = wp->w_grid.Columns; + if (nn > wp->w_grid.cols) { + nn = wp->w_grid.cols; } if (wp->w_p_rl) { @@ -1813,7 +1817,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, bool draw_margin, int row, i grid_fill(&wp->w_grid, row, endrow, W_ENDCOL(wp) - 1 - n, W_ENDCOL(wp) - n, c1, c2, attr); } else { - grid_fill(&wp->w_grid, row, endrow, n, wp->w_grid.Columns, c1, c2, attr); + grid_fill(&wp->w_grid, row, endrow, n, wp->w_grid.cols, c1, c2, attr); } set_empty_rows(wp, row); @@ -1837,7 +1841,7 @@ static int compute_foldcolumn(win_T *wp, int col) { int fdc = win_fdccol_count(wp); int wmw = wp == curwin && p_wmw == 0 ? 1 : p_wmw; - int wwidth = wp->w_grid.Columns; + int wwidth = wp->w_grid.cols; if (fdc > wwidth - (col + wmw)) { fdc = wwidth - (col + wmw); @@ -2384,7 +2388,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { - if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + if (!(State & MODE_INSERT) && bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { line_attr = hl_combine_attr(cul_attr, line_attr); } else { @@ -2621,7 +2625,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // Rightleft window: process the text in the normal direction, but put // it in linebuf_char[off] from right to left. Start at the // rightmost column of the window. - col = grid->Columns - 1; + col = grid->cols - 1; off += col; } @@ -2803,7 +2807,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_rl) { n_extra = col + 1; } else { - n_extra = grid->Columns - col; + n_extra = grid->cols - col; } char_attr = 0; } else if (filler_todo > 0) { @@ -2818,7 +2822,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_rl) { n_extra = col + 1; } else { - n_extra = grid->Columns - col; + n_extra = grid->cols - col; } char_attr = win_hl_attr(wp, HLF_DED); } @@ -2876,7 +2880,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { - if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + if (!(State & MODE_INSERT) && bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { line_attr = hl_combine_attr(cul_attr, line_attr); } else { @@ -2892,15 +2896,15 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && vcol >= (long)wp->w_virtcol) || (number_only && draw_state > WL_NR)) && filler_todo <= 0) { - draw_virt_text(wp, buf, win_col_offset, &col, grid->Columns, row); - grid_put_linebuf(grid, row, 0, col, -grid->Columns, wp->w_p_rl, wp, + draw_virt_text(wp, buf, win_col_offset, &col, grid->cols, row); + grid_put_linebuf(grid, row, 0, col, -grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); // Pretend we have finished updating the window. Except when // 'cursorcolumn' is set. if (wp->w_p_cuc) { row = wp->w_cline_row + wp->w_cline_height; } else { - row = grid->Rows; + row = grid->rows; } break; } @@ -2928,19 +2932,19 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (draw_state == WL_LINE && has_fold - && col < grid->Columns + && col < grid->cols && n_extra == 0 && row == startrow) { // fill rest of line with 'fold' c_extra = wp->w_p_fcs_chars.fold; c_final = NUL; - n_extra = wp->w_p_rl ? (col + 1) : (grid->Columns - col); + n_extra = wp->w_p_rl ? (col + 1) : (grid->cols - col); } if (draw_state == WL_LINE && has_fold - && col >= grid->Columns + && col >= grid->cols && n_extra != 0 && row == startrow) { // Truncate the folding. @@ -3006,6 +3010,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (area_attr != 0) { char_attr = hl_combine_attr(line_attr, area_attr); + if (!highlight_match) { + // let search highlight show in Visual area if possible + char_attr = hl_combine_attr(search_attr, char_attr); + } } else if (search_attr != 0) { char_attr = hl_combine_attr(line_attr, search_attr); } @@ -3065,7 +3073,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } // If a double-width char doesn't fit display a '>' in the last column. - if ((wp->w_p_rl ? (col <= 0) : (col >= grid->Columns - 1)) + if ((wp->w_p_rl ? (col <= 0) : (col >= grid->cols - 1)) && utf_char2cells(mb_c) == 2) { c = '>'; mb_c = c; @@ -3179,7 +3187,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // last column; the character is displayed at the start of the // next line. if ((wp->w_p_rl ? (col <= 0) : - (col >= grid->Columns - 1)) + (col >= grid->cols - 1)) && utf_char2cells(mb_c) == 2) { c = '>'; mb_c = c; @@ -3299,7 +3307,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc /* In Insert mode only highlight a word that * doesn't touch the cursor. */ if (spell_hlf != HLF_COUNT - && (State & INSERT) != 0 + && (State & MODE_INSERT) && wp->w_cursor.lnum == lnum && wp->w_cursor.col >= (colnr_T)(prev_ptr - line) @@ -3384,7 +3392,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } } - if (c == TAB && n_extra + col > grid->Columns) { + if (c == TAB && n_extra + col > grid->cols) { n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts, wp->w_buffer->b_p_vts_array) - 1; } @@ -3587,7 +3595,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc || ((fromcol >= 0 || fromcol_prev >= 0) && tocol > vcol && VIsual_mode != Ctrl_V - && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns)) + && (wp->w_p_rl ? (col >= 0) : (col < grid->cols)) && !(noinvcur && lnum == wp->w_cursor.lnum && (colnr_T)vcol == wp->w_virtcol))) @@ -3659,7 +3667,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && virtual_active() && tocol != MAXCOL && vcol < tocol - && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns))) { + && (wp->w_p_rl ? (col >= 0) : (col < grid->cols))) { c = ' '; ptr--; // put it back at the NUL } @@ -3668,7 +3676,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_cole > 0 && (wp != curwin || lnum != wp->w_cursor.lnum || conceal_cursor_line(wp)) && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc > 0 || decor_conceal > 0) - && !(lnum_in_visual_area && vim_strchr(wp->w_p_cocu, 'v') == NULL)) { + && !(lnum_in_visual_area && vim_strchr((char *)wp->w_p_cocu, 'v') == NULL)) { char_attr = conceal_attr; if (((prev_syntax_id != syntax_seqnr && (syntax_flags & HL_CONCEAL) != 0) || has_match_conc > 1 || decor_conceal > 1) @@ -3741,7 +3749,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && conceal_cursor_line(wp) && (int)wp->w_virtcol <= vcol + n_skip) { if (wp->w_p_rl) { - wp->w_wcol = grid->Columns - col + boguscols - 1; + wp->w_wcol = grid->cols - col + boguscols - 1; } else { wp->w_wcol = col - boguscols; } @@ -3813,7 +3821,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc n = 1; } } else { - if (col >= grid->Columns) { + if (col >= grid->cols) { n = -1; } } @@ -3881,7 +3889,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (((wp->w_p_cuc && (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off && (int)wp->w_virtcol < - (long)grid->Columns * (row - startrow + 1) + v + (long)grid->cols * (row - startrow + 1) + v && lnum != wp->w_cursor.lnum) || draw_color_col || line_attr_lowprio || line_attr || diff_hlf != (hlf_T)0 || has_virttext)) { @@ -3919,7 +3927,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc int col_stride = wp->w_p_rl ? -1 : 1; - while (wp->w_p_rl ? col >= 0 : col < grid->Columns) { + while (wp->w_p_rl ? col >= 0 : col < grid->cols) { schar_from_ascii(linebuf_char[off], ' '); col += col_stride; if (draw_color_col) { @@ -3952,7 +3960,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // terminal buffers may need to highlight beyond the end of the // logical line int n = wp->w_p_rl ? -1 : 1; - while (col >= 0 && col < grid->Columns) { + while (col >= 0 && col < grid->cols) { schar_from_ascii(linebuf_char[off], ' '); linebuf_attr[off] = vcol >= TERM_ATTRS_MAX ? 0 : term_attrs[vcol]; off += n; @@ -3961,8 +3969,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } } - draw_virt_text(wp, buf, win_col_offset, &col, grid->Columns, row); - grid_put_linebuf(grid, row, 0, col, grid->Columns, wp->w_p_rl, wp, + draw_virt_text(wp, buf, win_col_offset, &col, grid->cols, row); + grid_put_linebuf(grid, row, 0, col, grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); row++; @@ -3987,7 +3995,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && wp->w_p_list && !wp->w_p_wrap && filler_todo <= 0 - && (wp->w_p_rl ? col == 0 : col == grid->Columns - 1) + && (wp->w_p_rl ? col == 0 : col == grid->cols - 1) && !has_fold && (*ptr != NUL || lcs_eol_one > 0 @@ -4177,7 +4185,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc * At end of screen line and there is more to come: Display the line * so far. If there is no more to display it is caught above. */ - if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns)) + if ((wp->w_p_rl ? (col < 0) : (col >= grid->cols)) && foldinfo.fi_lines == 0 && (draw_state != WL_LINE || *ptr != NUL @@ -4190,7 +4198,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && filler_todo <= 0 // Not drawing diff filler lines. && lcs_eol_one != -1 // Haven't printed the lcs_eol character. && row != endrow - 1 // Not the last line being displayed. - && (grid->Columns == Columns // Window spans the width of the screen, + && (grid->cols == Columns // Window spans the width of the screen, || ui_has(kUIMultigrid)) // or has dedicated grid. && !wp->w_p_rl; // Not right-to-left. @@ -4202,13 +4210,13 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc assert(i >= 0); int offset = kv_A(virt_lines, i).left_col ? 0 : win_col_offset; draw_virt_text_item(buf, offset, kv_A(virt_lines, i).line, - kHlModeReplace, grid->Columns, offset); + kHlModeReplace, grid->cols, offset); } } else { - draw_virt_text(wp, buf, win_col_offset, &draw_col, grid->Columns, row); + draw_virt_text(wp, buf, win_col_offset, &draw_col, grid->cols, row); } - grid_put_linebuf(grid, row, 0, draw_col, grid->Columns, wp->w_p_rl, + grid_put_linebuf(grid, row, 0, draw_col, grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, wrap); if (wrap) { ScreenGrid *current_grid = grid; @@ -4235,7 +4243,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // When the window is too narrow draw all "@" lines. if (draw_state != WL_LINE && filler_todo <= 0) { - win_draw_end(wp, '@', ' ', true, row, wp->w_grid.Rows, HLF_AT); + win_draw_end(wp, '@', ' ', true, row, wp->w_grid.rows, HLF_AT); row = endrow; } @@ -4248,7 +4256,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc col = 0; off = 0; if (wp->w_p_rl) { - col = grid->Columns - 1; // col is not used if breaking! + col = grid->cols - 1; // col is not used if breaking! off += col; } @@ -4524,42 +4532,55 @@ void rl_mirror(char_u *str) } } -/* - * mark all status lines for redraw; used after first :cd - */ +/// Mark all status lines and window bars for redraw; used after first :cd void status_redraw_all(void) { - if (global_stl_height()) { - curwin->w_redr_status = true; - redraw_later(curwin, VALID); - } else { - FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_status_height) { - wp->w_redr_status = true; - redraw_later(wp, VALID); - } + bool is_stl_global = global_stl_height() != 0; + + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + bool redraw = false; + + if ((!is_stl_global && wp->w_status_height) || (is_stl_global && wp == curwin)) { + wp->w_redr_status = true; + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw) { + redraw_later(wp, VALID); } } } -/// Marks all status lines of the current buffer for redraw. +/// Marks all status lines and window bars of the current buffer for redraw. void status_redraw_curbuf(void) { status_redraw_buf(curbuf); } -/// Marks all status lines of the specified buffer for redraw. +/// Marks all status lines and window bars of the given buffer for redraw. void status_redraw_buf(buf_T *buf) { - if (global_stl_height() != 0 && curwin->w_buffer == buf) { - curwin->w_redr_status = true; - redraw_later(curwin, VALID); - } else { - FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_status_height != 0 && wp->w_buffer == buf) { - wp->w_redr_status = true; - redraw_later(wp, VALID); - } + bool is_stl_global = global_stl_height() != 0; + + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + if (wp->w_buffer != buf) { + continue; + } + bool redraw = false; + + if ((!is_stl_global && wp->w_status_height) || (is_stl_global && wp == curwin)) { + wp->w_redr_status = true; + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw) { + redraw_later(wp, VALID); } } } @@ -4573,6 +4594,9 @@ void redraw_statuslines(void) if (wp->w_redr_status) { win_redr_status(wp); } + if (wp->w_redr_winbar) { + win_redr_winbar(wp); + } } if (redraw_tabline) { draw_tabline(); @@ -5071,7 +5095,7 @@ static void redraw_custom_statusline(win_T *wp) entered = true; did_emsg = false; - win_redr_custom(wp, false); + win_redr_custom(wp, false, false); if (did_emsg) { // When there is an error disable the statusline, otherwise the // display is messed up with errors and a redraw triggers the problem @@ -5084,6 +5108,41 @@ static void redraw_custom_statusline(win_T *wp) entered = false; } +static void win_redr_winbar(win_T *wp) +{ + static bool entered = false; + + // Return when called recursively. This can happen when the winbar contains an expression + // that triggers a redraw. + if (entered) { + return; + } + entered = true; + + wp->w_redr_winbar = false; + if (wp->w_winbar_height == 0) { + // No window bar, do nothing. + } else if (!redrawing()) { + // Don't redraw right now, do it later. + wp->w_redr_winbar = true; + } else if (*p_wbr != NUL || *wp->w_p_wbr != NUL) { + int saved_did_emsg = did_emsg; + + did_emsg = false; + win_redr_custom(wp, true, false); + if (did_emsg) { + // 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 *)"", + OPT_FREE | (*wp->w_p_stl != NUL + ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR); + } + did_emsg |= saved_did_emsg; + } + entered = false; +} + /// Only call if (wp->w_vsep_width != 0). /// /// @return true if the status line of window "wp" is connected to the status @@ -5220,11 +5279,9 @@ bool get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len) return buf[0] != NUL; } -/* - * Redraw the status line or ruler of window "wp". - * When "wp" is NULL redraw the tab pages line from 'tabline'. - */ -static void win_redr_custom(win_T *wp, bool draw_ruler) +/// Redraw the status line, window bar or ruler of window "wp". +/// When "wp" is NULL redraw the tab pages line from 'tabline'. +static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) { static bool entered = false; int attr; @@ -5265,6 +5322,16 @@ static void win_redr_custom(win_T *wp, bool draw_ruler) attr = HL_ATTR(HLF_TPF); maxwidth = Columns; use_sandbox = was_set_insecurely(wp, "tabline", 0); + } else if (draw_winbar) { + stl = (char_u *)((*wp->w_p_wbr != NUL) ? wp->w_p_wbr : p_wbr); + row = -1; // row zero is first row of text + col = 0; + grid = &wp->w_grid; + grid_adjust(&grid, &row, &col); + fillchar = wp->w_p_fcs_chars.wbr; + attr = (wp == curwin) ? HL_ATTR(HLF_WBR) : HL_ATTR(HLF_WBRNC); + maxwidth = wp->w_width_inner; + use_sandbox = was_set_insecurely(wp, "winbar", 0); } else { row = is_stl_global ? (Rows - p_ch - 1) : W_ENDROW(wp); fillchar = fillchar_status(&attr, wp); @@ -5500,85 +5567,6 @@ void check_for_delay(bool check_msg_scroll) } } -/// (Re)allocates a window grid if size changed while in ext_multigrid mode. -/// Updates size, offsets and handle for the grid regardless. -/// -/// If "doclear" is true, don't try to copy from the old grid rather clear the -/// resized grid. -void win_grid_alloc(win_T *wp) -{ - ScreenGrid *grid = &wp->w_grid; - ScreenGrid *grid_allocated = &wp->w_grid_alloc; - - int rows = wp->w_height_inner; - int cols = wp->w_width_inner; - int total_rows = wp->w_height_outer; - int total_cols = wp->w_width_outer; - - bool want_allocation = ui_has(kUIMultigrid) || wp->w_floating; - bool has_allocation = (grid_allocated->chars != NULL); - - if (grid->Rows != rows) { - wp->w_lines_valid = 0; - xfree(wp->w_lines); - wp->w_lines = xcalloc(rows + 1, sizeof(wline_T)); - } - - int was_resized = false; - if (want_allocation && (!has_allocation - || grid_allocated->Rows != total_rows - || grid_allocated->Columns != total_cols)) { - grid_alloc(grid_allocated, total_rows, total_cols, - wp->w_grid_alloc.valid, false); - grid_allocated->valid = true; - if (wp->w_floating && wp->w_float_config.border) { - wp->w_redr_border = true; - } - was_resized = true; - } else if (!want_allocation && has_allocation) { - // Single grid mode, all rendering will be redirected to default_grid. - // Only keep track of the size and offset of the window. - grid_free(grid_allocated); - grid_allocated->valid = false; - was_resized = true; - } else if (want_allocation && has_allocation && !wp->w_grid_alloc.valid) { - grid_invalidate(grid_allocated); - grid_allocated->valid = true; - } - - grid->Rows = rows; - grid->Columns = cols; - - if (want_allocation) { - grid->target = grid_allocated; - grid->row_offset = wp->w_border_adj[0]; - grid->col_offset = wp->w_border_adj[3]; - } else { - grid->target = &default_grid; - grid->row_offset = wp->w_winrow; - grid->col_offset = wp->w_wincol; - } - - // send grid resize event if: - // - a grid was just resized - // - screen_resize was called and all grid sizes must be sent - // - the UI wants multigrid event (necessary) - if ((send_grid_resize || was_resized) && want_allocation) { - ui_call_grid_resize(grid_allocated->handle, - grid_allocated->Columns, grid_allocated->Rows); - } -} - -/// assign a handle to the grid. The grid need not be allocated. -void grid_assign_handle(ScreenGrid *grid) -{ - static int last_grid_handle = DEFAULT_GRID_HANDLE; - - // only assign a grid handle if not already - if (grid->handle == 0) { - grid->handle = ++last_grid_handle; - } -} /// Resize the screen to Rows and Columns. /// @@ -5586,7 +5574,7 @@ void grid_assign_handle(ScreenGrid *grid) /// /// There may be some time between setting Rows and Columns and (re)allocating /// default_grid arrays. This happens when starting up and when -/// (manually) changing the shell size. Always use default_grid.Rows and +/// (manually) changing the shell size. Always use default_grid.rows and /// default_grid.Columns to access items in default_grid.chars[]. Use Rows /// and Columns for positioning text etc. where the final size of the shell is /// needed. @@ -5607,8 +5595,8 @@ retry: // when Rows and Columns have been set and we have started doing full // screen stuff. if ((default_grid.chars != NULL - && Rows == default_grid.Rows - && Columns == default_grid.Columns + && Rows == default_grid.rows + && Columns == default_grid.cols ) || Rows == 0 || Columns == 0 @@ -5707,9 +5695,9 @@ void screenclear(void) } // blank out the default grid - for (i = 0; i < default_grid.Rows; i++) { + for (i = 0; i < default_grid.rows; i++) { grid_clear_line(&default_grid, default_grid.line_offset[i], - default_grid.Columns, true); + default_grid.cols, true); default_grid.line_wraps[i] = false; } @@ -5793,16 +5781,16 @@ void win_scroll_lines(win_T *wp, int row, int line_count) } // No lines are being moved, just draw over the entire area - if (row + abs(line_count) >= wp->w_grid.Rows) { + if (row + abs(line_count) >= wp->w_grid.rows) { return; } if (line_count < 0) { grid_del_lines(&wp->w_grid, row, -line_count, - wp->w_grid.Rows, 0, wp->w_grid.Columns); + wp->w_grid.rows, 0, wp->w_grid.cols); } else { grid_ins_lines(&wp->w_grid, row, line_count, - wp->w_grid.Rows, 0, wp->w_grid.Columns); + wp->w_grid.rows, 0, wp->w_grid.cols); } } @@ -5841,7 +5829,7 @@ void grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end, int col, // Shift line_offset[] line_count down to reflect the inserted lines. // Clear the inserted lines. for (i = 0; i < line_count; i++) { - if (width != grid->Columns) { + if (width != grid->cols) { // need to copy part of a line j = end - 1 - i; while ((j -= line_count) >= row) { @@ -5859,7 +5847,7 @@ void grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end, int col, } grid->line_offset[j + line_count] = temp; grid->line_wraps[j + line_count] = false; - grid_clear_line(grid, temp, grid->Columns, false); + grid_clear_line(grid, temp, grid->cols, false); } } @@ -5890,7 +5878,7 @@ void grid_del_lines(ScreenGrid *grid, int row, int line_count, int end, int col, // Now shift line_offset[] line_count up to reflect the deleted lines. // Clear the inserted lines. for (i = 0; i < line_count; i++) { - if (width != grid->Columns) { + if (width != grid->cols) { // need to copy part of a line j = row + i; while ((j += line_count) <= end - 1) { @@ -5909,7 +5897,7 @@ void grid_del_lines(ScreenGrid *grid, int row, int line_count, int end, int col, } grid->line_offset[j - line_count] = temp; grid->line_wraps[j - line_count] = false; - grid_clear_line(grid, temp, grid->Columns, false); + grid_clear_line(grid, temp, grid->cols, false); } } @@ -5943,8 +5931,8 @@ int showmode(void) msg_grid_validate(); do_mode = ((p_smd && msg_silent == 0) - && ((State & TERM_FOCUS) - || (State & INSERT) + && ((State & MODE_TERMINAL) + || (State & MODE_INSERT) || restart_edit != NUL || VIsual_active)); if (do_mode || reg_recording != 0) { @@ -6013,13 +6001,13 @@ int showmode(void) } } } else { - if (State & TERM_FOCUS) { + if (State & MODE_TERMINAL) { msg_puts_attr(_(" TERMINAL"), attr); } else if (State & VREPLACE_FLAG) { msg_puts_attr(_(" VREPLACE"), attr); } else if (State & REPLACE_FLAG) { msg_puts_attr(_(" REPLACE"), attr); - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { if (p_ri) { msg_puts_attr(_(" REVERSE"), attr); } @@ -6035,7 +6023,7 @@ int showmode(void) if (p_hkmap) { msg_puts_attr(_(" Hebrew"), attr); } - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { if (curwin->w_p_arab) { msg_puts_attr(_(" Arabic"), attr); } else if (get_keymap_str(curwin, (char_u *)" (%s)", @@ -6043,7 +6031,7 @@ int showmode(void) msg_puts_attr((char *)NameBuff, attr); } } - if ((State & INSERT) && p_paste) { + if ((State & MODE_INSERT) && p_paste) { msg_puts_attr(_(" (paste)"), attr); } @@ -6216,7 +6204,7 @@ void draw_tabline(void) // Check for an error. If there is one we would loop in redrawing the // screen. Avoid that by making 'tabline' empty. did_emsg = false; - win_redr_custom(NULL, false); + win_redr_custom(NULL, false, false); if (did_emsg) { set_string_option_direct("tabline", -1, (char_u *)"", OPT_FREE, SID_ERROR); @@ -6390,7 +6378,7 @@ void get_trans_bufname(buf_T *buf) if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, TRUE); + home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); } @@ -6512,7 +6500,7 @@ static void win_redr_ruler(win_T *wp, bool always) int save_called_emsg = called_emsg; called_emsg = false; - win_redr_custom(wp, true); + win_redr_custom(wp, false, true); if (called_emsg) { set_string_option_direct("rulerformat", -1, (char_u *)"", OPT_FREE, SID_ERROR); @@ -6521,13 +6509,10 @@ static void win_redr_ruler(win_T *wp, bool always) return; } - /* - * Check if not in Insert mode and the line is empty (will show "0-1"). - */ - int empty_line = FALSE; - if (!(State & INSERT) - && *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE) == NUL) { - empty_line = TRUE; + // Check if not in Insert mode and the line is empty (will show "0-1"). + int empty_line = false; + if ((State & MODE_INSERT) == 0 && *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, false) == NUL) { + empty_line = true; } /* @@ -6753,11 +6738,9 @@ static void margin_columns_win(win_T *wp, int *left_col, int *right_col) /// Set dimensions of the Nvim application "shell". void screen_resize(int width, int height) { - static bool recursive = false; - // Avoid recursiveness, can happen when setting the window size causes // another window-changed signal. - if (updating_screen || recursive) { + if (updating_screen || resizing_screen) { return; } @@ -6765,9 +6748,9 @@ void screen_resize(int width, int height) return; } - if (State == HITRETURN || State == SETWSIZE) { + if (State == MODE_HITRETURN || State == MODE_SETWSIZE) { // postpone the resizing - State = SETWSIZE; + State = MODE_SETWSIZE; return; } @@ -6779,7 +6762,7 @@ void screen_resize(int width, int height) return; } - recursive = true; + resizing_screen = true; Rows = height; Columns = width; @@ -6796,11 +6779,11 @@ void screen_resize(int width, int height) send_grid_resize = true; - /* The window layout used to be adjusted here, but it now happens in - * screenalloc() (also invoked from screenclear()). That is because the - * "recursive" check above may skip this, but not screenalloc(). */ + /// The window layout used to be adjusted here, but it now happens in + /// screenalloc() (also invoked from screenclear()). That is because the + /// recursize "resizing_screen" check above may skip this, but not screenalloc(). - if (State != ASKMORE && State != EXTERNCMD && State != CONFIRM) { + if (State != MODE_ASKMORE && State != MODE_EXTERNCMD && State != MODE_CONFIRM) { screenclear(); } @@ -6819,7 +6802,7 @@ void screen_resize(int width, int height) * Always need to call update_screen() or screenalloc(), to make * sure Rows/Columns and the size of the screen is correct! */ - if (State == ASKMORE || State == EXTERNCMD || State == CONFIRM + if (State == MODE_ASKMORE || State == MODE_EXTERNCMD || State == MODE_CONFIRM || exmode_active) { screenalloc(); if (msg_grid.chars) { @@ -6833,7 +6816,7 @@ void screen_resize(int width, int height) if (curwin->w_p_scb) { do_check_scrollbind(true); } - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redraw_popupmenu = false; update_screen(NOT_VALID); redrawcmdline(); @@ -6857,7 +6840,7 @@ void screen_resize(int width, int height) } ui_flush(); } - recursive = false; + resizing_screen = false; } /// Check if the new Nvim application "shell" dimensions are valid. diff --git a/src/nvim/screen.h b/src/nvim/screen.h index 3afbaa5eb6..f3beeff8a9 100644 --- a/src/nvim/screen.h +++ b/src/nvim/screen.h @@ -49,14 +49,22 @@ typedef struct { } StlClickRecord; /// Array defining what should be done when tabline is clicked -extern StlClickDefinition *tab_page_click_defs; +EXTERN StlClickDefinition *tab_page_click_defs INIT(= NULL); /// Size of the tab_page_click_defs array -extern long tab_page_click_defs_size; +EXTERN long tab_page_click_defs_size INIT(= 0); #define W_ENDCOL(wp) ((wp)->w_wincol + (wp)->w_width) #define W_ENDROW(wp) ((wp)->w_winrow + (wp)->w_height) +// While redrawing the screen this flag is set. It means the screen size +// ('lines' and 'rows') must not be changed. +EXTERN bool updating_screen INIT(= 0); + +// While resizing the screen this flag is set. +EXTERN bool resizing_screen INIT(= 0); + + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "screen.h.generated.h" #endif diff --git a/src/nvim/search.c b/src/nvim/search.c index b386c6a7c4..11d40c058c 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -189,7 +189,7 @@ int search_regcomp(char_u *pat, int pat_save, int pat_use, int options, regmmatc regmatch->rmm_ic = ignorecase(pat); regmatch->rmm_maxcol = 0; - regmatch->regprog = vim_regcomp(pat, magic ? RE_MAGIC : 0); + regmatch->regprog = vim_regcomp((char *)pat, magic ? RE_MAGIC : 0); if (regmatch->regprog == NULL) { return FAIL; } @@ -1055,7 +1055,7 @@ int do_search(oparg_T *oap, int dirc, int search_delim, char_u *pat, long count, * A line offset is not remembered, this is vi compatible. */ if (spats[0].off.line && vim_strchr(p_cpo, CPO_LINEOFF) != NULL) { - spats[0].off.line = FALSE; + spats[0].off.line = false; spats[0].off.off = 0; } @@ -1979,7 +1979,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) // This is just guessing: when 'rightleft' is set, search for a matching // paren/brace in the other direction. - if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) { + if (curwin->w_p_rl && vim_strchr("()[]{}<>", initc) != NULL) { backwards = !backwards; } @@ -2092,7 +2092,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) } else if (raw_string) { if (linep[pos.col - 1] == 'R' && linep[pos.col] == '"' - && vim_strchr(linep + pos.col + 1, '(') != NULL) { + && vim_strchr((char *)linep + pos.col + 1, '(') != NULL) { // Possible start of raw string. Now that we have the // delimiter we can check if it ends before where we // started searching, or before the previously found @@ -2273,7 +2273,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) * (actually, we skip #\( et al) */ if (curbuf->b_p_lisp - && vim_strchr((char_u *)"(){}[]", c) != NULL + && vim_strchr("(){}[]", c) != NULL && pos.col > 1 && check_prevcol(linep, pos.col, '\\', NULL) && check_prevcol(linep, pos.col - 1, '#', NULL)) { @@ -2321,7 +2321,7 @@ int check_linecomment(const char_u *line) const char_u *p = line; // scan from start // skip Lispish one-line comments if (curbuf->b_p_lisp) { - if (vim_strchr(p, ';') != NULL) { // there may be comments + if (vim_strchr((char *)p, ';') != NULL) { // there may be comments bool in_str = false; // inside of string while ((p = (char_u *)strpbrk((char *)p, "\";")) != NULL) { @@ -2346,7 +2346,7 @@ int check_linecomment(const char_u *line) p = NULL; } } else { - while ((p = vim_strchr(p, '/')) != NULL) { + while ((p = (char_u *)vim_strchr((char *)p, '/')) != NULL) { // Accept a double /, unless it's preceded with * and followed by *, // because * / / * is an end and start of a C comment. // Only accept the position if it is not inside a string. @@ -2428,7 +2428,7 @@ void showmatch(int c) save_dollar_vcol = dollar_vcol; save_state = State; - State = SHOWMATCH; + State = MODE_SHOWMATCH; ui_cursor_shape(); // may show different cursor shape curwin->w_cursor = mpos; // move to matching char *so = 0; // don't use 'scrolloff' here @@ -2507,7 +2507,7 @@ int findsent(Direction dir, long count) // go back to the previous non-white non-punctuation character bool found_dot = false; while (c = gchar_pos(&pos), ascii_iswhite(c) - || vim_strchr((char_u *)".!?)]\"'", c) != NULL) { + || vim_strchr(".!?)]\"'", c) != NULL) { tpos = pos; if (decl(&tpos) == -1 || (LINEEMPTY(tpos.lnum) && dir == FORWARD)) { break; @@ -2515,11 +2515,11 @@ int findsent(Direction dir, long count) if (found_dot) { break; } - if (vim_strchr((char_u *)".!?", c) != NULL) { + if (vim_strchr(".!?", c) != NULL) { found_dot = true; } - if (vim_strchr((char_u *)")]\"'", c) != NULL - && vim_strchr((char_u *)".!?)]\"'", gchar_pos(&tpos)) == NULL) { + if (vim_strchr(")]\"'", c) != NULL + && vim_strchr(".!?)]\"'", gchar_pos(&tpos)) == NULL) { break; } decl(&pos); @@ -2543,7 +2543,7 @@ int findsent(Direction dir, long count) if ((c = inc(&tpos)) == -1) { break; } - } while (vim_strchr((char_u *)")]\"'", c = gchar_pos(&tpos)) + } while (vim_strchr(")]\"'", c = gchar_pos(&tpos)) != NULL); if (c == -1 || (!cpo_J && (c == ' ' || c == '\t')) || c == NUL || (cpo_J && (c == ' ' && inc(&tpos) >= 0 @@ -3399,7 +3399,7 @@ int current_block(oparg_T *oap, long count, int include, int what, int other) pos_T start_pos; pos_T *end_pos; pos_T old_start, old_end; - char_u *save_cpo; + char *save_cpo; bool sol = false; // '{' at start of line old_pos = curwin->w_cursor; @@ -3434,7 +3434,7 @@ int current_block(oparg_T *oap, long count, int include, int what, int other) // Ignore quotes here. Keep the "M" flag in 'cpo', as that is what the // user wants. save_cpo = p_cpo; - p_cpo = (char_u *)(vim_strchr(p_cpo, CPO_MATCHBSL) != NULL ? "%M" : "%"); + p_cpo = vim_strchr(p_cpo, CPO_MATCHBSL) != NULL ? "%M" : "%"; if ((pos = findmatch(NULL, what)) != NULL) { while (count-- > 0) { if ((pos = findmatch(NULL, what)) == NULL) { @@ -3967,7 +3967,7 @@ static int find_next_quote(char_u *line, int col, int quotechar, char_u *escape) c = line[col]; if (c == NUL) { return -1; - } else if (escape != NULL && vim_strchr(escape, c)) { + } else if (escape != NULL && vim_strchr((char *)escape, c)) { col++; if (line[col] == NUL) { return -1; @@ -3996,7 +3996,7 @@ static int find_prev_quote(char_u *line, int col_start, int quotechar, char_u *e col_start -= utf_head_off(line, line + col_start); n = 0; if (escape != NULL) { - while (col_start - n > 0 && vim_strchr(escape, + while (col_start - n > 0 && vim_strchr((char *)escape, line[col_start - n - 1]) != NULL) { ++n; } @@ -5160,7 +5160,7 @@ static void fuzzy_match_in_list(list_T *const l, char_u *const str, const bool m int j = 0; const char_u *p = str; while (*p != NUL) { - if (!ascii_iswhite(utf_ptr2char((char *)p))) { + if (!ascii_iswhite(utf_ptr2char((char *)p)) || matchseq) { tv_list_append_number(items[match_count].lmatchpos, matches[j]); j++; } @@ -5332,7 +5332,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo char_u *pat; char_u *new_fname; - char_u *curr_fname = curbuf->b_fname; + char_u *curr_fname = (char_u *)curbuf->b_fname; char_u *prev_fname = NULL; linenr_T lnum; int depth; @@ -5372,7 +5372,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo sprintf((char *)pat, whole ? "\\<%.*s\\>" : "%.*s", (int)len, ptr); // ignore case according to p_ic, p_scs and pat regmatch.rm_ic = ignorecase(pat); - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp((char *)pat, p_magic ? RE_MAGIC : 0); xfree(pat); if (regmatch.regprog == NULL) { goto fpip_end; @@ -5380,7 +5380,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo } inc_opt = (*curbuf->b_p_inc == NUL) ? p_inc : curbuf->b_p_inc; if (*inc_opt != NUL) { - incl_regmatch.regprog = vim_regcomp(inc_opt, p_magic ? RE_MAGIC : 0); + incl_regmatch.regprog = vim_regcomp((char *)inc_opt, p_magic ? RE_MAGIC : 0); if (incl_regmatch.regprog == NULL) { goto fpip_end; } @@ -5388,7 +5388,8 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo } if (type == FIND_DEFINE && (*curbuf->b_p_def != NUL || *p_def != NUL)) { def_regmatch.regprog = vim_regcomp(*curbuf->b_p_def == NUL - ? p_def : curbuf->b_p_def, p_magic ? RE_MAGIC : 0); + ? (char *)p_def : (char *)curbuf->b_p_def, + p_magic ? RE_MAGIC : 0); if (def_regmatch.regprog == NULL) { goto fpip_end; } @@ -5410,7 +5411,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo for (;;) { if (incl_regmatch.regprog != NULL && vim_regexec(&incl_regmatch, line, (colnr_T)0)) { - char_u *p_fname = (curr_fname == curbuf->b_fname) + char_u *p_fname = (curr_fname == (char_u *)curbuf->b_fname) ? curbuf->b_ffname : curr_fname; if (inc_opt != NULL && strstr((char *)inc_opt, "\\zs") != NULL) { @@ -5737,7 +5738,8 @@ search_line: } const int add_r = ins_compl_add_infercase(aux, i, p_ic, - curr_fname == curbuf->b_fname ? NULL : curr_fname, + curr_fname == (char_u *)curbuf->b_fname + ? NULL : curr_fname, dir, cont_s_ipos); if (add_r == OK) { // if dir was BACKWARD then honor it just once @@ -5865,8 +5867,8 @@ exit_matched: --old_files; files[old_files].name = files[depth].name; files[old_files].matched = files[depth].matched; - --depth; - curr_fname = (depth == -1) ? curbuf->b_fname + depth--; + curr_fname = (depth == -1) ? (char_u *)curbuf->b_fname : files[depth].name; if (depth < depth_displayed) { depth_displayed = depth; diff --git a/src/nvim/shada.c b/src/nvim/shada.c index a3d88a4963..abb6c68474 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -1447,7 +1447,7 @@ static const char *shada_get_default_file(void) FUNC_ATTR_WARN_UNUSED_RESULT { if (default_shada_file == NULL) { - char *shada_dir = stdpaths_user_data_subpath("shada", 0, false); + char *shada_dir = stdpaths_user_state_subpath("shada", 0, false); default_shada_file = concat_fnames_realloc(shada_dir, "main.shada", true); } return default_shada_file; diff --git a/src/nvim/sign.c b/src/nvim/sign.c index 6a690f9af8..dd6fdf3cd5 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -1742,33 +1742,33 @@ static char_u *get_nth_sign_group_name(int idx) /// Function given to ExpandGeneric() to obtain the sign command /// expansion. -char_u *get_sign_name(expand_T *xp, int idx) +char *get_sign_name(expand_T *xp, int idx) { switch (expand_what) { case EXP_SUBCMD: - return (char_u *)cmds[idx]; + return cmds[idx]; case EXP_DEFINE: { char *define_arg[] = { "culhl=", "icon=", "linehl=", "numhl=", "text=", "texthl=", NULL }; - return (char_u *)define_arg[idx]; + return define_arg[idx]; } case EXP_PLACE: { char *place_arg[] = { "line=", "name=", "group=", "priority=", "file=", "buffer=", NULL }; - return (char_u *)place_arg[idx]; + return place_arg[idx]; } case EXP_LIST: { char *list_arg[] = { "group=", "file=", "buffer=", NULL }; - return (char_u *)list_arg[idx]; + return list_arg[idx]; } case EXP_UNPLACE: { char *unplace_arg[] = { "group=", "file=", "buffer=", NULL }; - return (char_u *)unplace_arg[idx]; + return unplace_arg[idx]; } case EXP_SIGN_NAMES: - return get_nth_sign_name(idx); + return (char *)get_nth_sign_name(idx); case EXP_SIGN_GROUPS: - return get_nth_sign_group_name(idx); + return (char *)get_nth_sign_group_name(idx); default: return NULL; } @@ -1815,7 +1815,7 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg) p = skiptowhite(p); } while (*p != NUL); - p = vim_strchr(last, '='); + p = (char_u *)vim_strchr((char *)last, '='); // :sign define {name} {args}... {last}= // | | diff --git a/src/nvim/spell.c b/src/nvim/spell.c index fc3bcef666..1ba29e3fc1 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -385,7 +385,7 @@ size_t spell_check(win_T *wp, char_u *ptr, hlf_T *attrp, int *capcol, bool docou } else if (*ptr == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) { mi.mi_end = skiphex(ptr + 2); } else { - mi.mi_end = skipdigits(ptr); + mi.mi_end = (char_u *)skipdigits((char *)ptr); } nrlen = (size_t)(mi.mi_end - ptr); } @@ -1173,7 +1173,7 @@ static bool match_compoundrule(slang_T *slang, char_u *compflags) } // Skip to the next "/", where the next pattern starts. - p = vim_strchr(p, '/'); + p = (char_u *)vim_strchr((char *)p, '/'); if (p == NULL) { break; } @@ -1637,7 +1637,7 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen) int n; p = (char_u *)skipwhite((char *)line); - while (vim_strchr((char_u *)"*#/\"\t", *p) != NULL) { + while (vim_strchr("*#/\"\t", *p) != NULL) { p = (char_u *)skipwhite((char *)p + 1); } @@ -1656,7 +1656,7 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen) // "lang" must be the language without the region: e.g., "en". static void spell_load_lang(char_u *lang) { - char_u fname_enc[85]; + char fname_enc[85]; int r; spelload_T sl; int round; @@ -1682,8 +1682,8 @@ static void spell_load_lang(char_u *lang) r = do_in_runtimepath((char *)fname_enc, 0, spell_load_cb, &sl); if (r == FAIL && *sl.sl_lang != NUL && round == 1 - && apply_autocmds(EVENT_SPELLFILEMISSING, lang, - curbuf->b_fname, FALSE, curbuf)) { + && apply_autocmds(EVENT_SPELLFILEMISSING, (char *)lang, + curbuf->b_fname, false, curbuf)) { continue; } break; @@ -1961,14 +1961,14 @@ int init_syl_tab(slang_T *slang) int l; ga_init(&slang->sl_syl_items, sizeof(syl_item_T), 4); - p = vim_strchr(slang->sl_syllable, '/'); + p = (char_u *)vim_strchr((char *)slang->sl_syllable, '/'); while (p != NULL) { *p++ = NUL; if (*p == NUL) { // trailing slash break; } s = p; - p = vim_strchr(p, '/'); + p = (char_u *)vim_strchr((char *)p, '/'); if (p == NULL) { l = (int)STRLEN(s); } else { @@ -2025,7 +2025,7 @@ static int count_syllables(slang_T *slang, const char_u *word) // No recognized syllable item, at least a syllable char then? c = utf_ptr2char((char *)p); len = utfc_ptr2len((char *)p); - if (vim_strchr(slang->sl_syllable, c) == NULL) { + if (vim_strchr((char *)slang->sl_syllable, c) == NULL) { skip = false; // No, search for next syllable } else if (!skip) { ++cnt; // Yes, count it @@ -2105,7 +2105,7 @@ char *did_set_spelllang(win_T *wp) filename = true; // Locate a region and remove it from the file name. - p = vim_strchr(path_tail(lang), '_'); + p = (char_u *)vim_strchr(path_tail((char *)lang), '_'); if (p != NULL && ASCII_ISALPHA(p[1]) && ASCII_ISALPHA(p[2]) && !ASCII_ISALPHA(p[3])) { STRLCPY(region_cp, p + 1, 3); @@ -2247,8 +2247,8 @@ char *did_set_spelllang(win_T *wp) if (round == 0) { STRCPY(lang, "internal wordlist"); } else { - STRLCPY(lang, path_tail(spf_name), MAXWLEN + 1); - p = vim_strchr(lang, '.'); + STRLCPY(lang, path_tail((char *)spf_name), MAXWLEN + 1); + p = (char_u *)vim_strchr((char *)lang, '.'); if (p != NULL) { *p = NUL; // truncate at ".encoding.add" } @@ -2686,7 +2686,7 @@ static bool spell_iswordp(const char_u *p, const win_T *wp) if (c < 256 ? wp->w_s->b_spell_ismw[c] : (wp->w_s->b_spell_ismw_mb != NULL - && vim_strchr(wp->w_s->b_spell_ismw_mb, c) != NULL)) { + && vim_strchr((char *)wp->w_s->b_spell_ismw_mb, c) != NULL)) { s = p + l; } } @@ -2730,9 +2730,10 @@ static bool spell_iswordp_w(const int *p, const win_T *wp) { const int *s; - if (*p < 256 ? wp->w_s->b_spell_ismw[*p] - : (wp->w_s->b_spell_ismw_mb != NULL - && vim_strchr(wp->w_s->b_spell_ismw_mb, *p) != NULL)) { + if (*p < + 256 ? wp->w_s->b_spell_ismw[*p] : (wp->w_s->b_spell_ismw_mb != NULL + && vim_strchr((char *)wp->w_s->b_spell_ismw_mb, + *p) != NULL)) { s = p + 1; } else { s = p; @@ -3413,7 +3414,7 @@ static void spell_suggest_file(suginfo_T *su, char_u *fname) while (!vim_fgets(line, MAXWLEN * 2, fd) && !got_int) { line_breakcheck(); - p = vim_strchr(line, '/'); + p = (char_u *)vim_strchr((char *)line, '/'); if (p == NULL) { continue; // No Tab found, just skip the line. } @@ -5652,12 +5653,12 @@ static void make_case_word(char_u *fword, char_u *cword, int flags) static bool similar_chars(slang_T *slang, int c1, int c2) { int m1, m2; - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; hashitem_T *hi; if (c1 >= 256) { buf[utf_char2bytes(c1, (char *)buf)] = 0; - hi = hash_find(&slang->sl_map_hash, buf); + hi = hash_find(&slang->sl_map_hash, (char_u *)buf); if (HASHITEM_EMPTY(hi)) { m1 = 0; } else { @@ -5672,7 +5673,7 @@ static bool similar_chars(slang_T *slang, int c1, int c2) if (c2 >= 256) { buf[utf_char2bytes(c2, (char *)buf)] = 0; - hi = hash_find(&slang->sl_map_hash, buf); + hi = hash_find(&slang->sl_map_hash, (char_u *)buf); if (HASHITEM_EMPTY(hi)) { m2 = 0; } else { @@ -6260,7 +6261,7 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res) // replace string ws = smp[n].sm_to_w; s = smp[n].sm_rules; - p0 = (vim_strchr(s, '<') != NULL) ? 1 : 0; + p0 = (vim_strchr((char *)s, '<') != NULL) ? 1 : 0; if (p0 == 1 && z == 0) { // rule with '<' is used if (reslen > 0 && ws != NULL && *ws != NUL @@ -6871,20 +6872,20 @@ void ex_spellinfo(exarg_T *eap) // ":spelldump" void ex_spelldump(exarg_T *eap) { - char_u *spl; + char *spl; long dummy; if (no_spell_checking(curwin)) { return; } - get_option_value("spl", &dummy, (char **)&spl, OPT_LOCAL); + get_option_value("spl", &dummy, &spl, OPT_LOCAL); // Create a new empty buffer in a new window. do_cmdline_cmd("new"); // enable spelling locally in the new window set_option_value("spell", true, "", OPT_LOCAL); - set_option_value("spl", dummy, (char *)spl, OPT_LOCAL); + set_option_value("spl", dummy, spl, OPT_LOCAL); xfree(spl); if (!buf_is_empty(curbuf)) { diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c index b7ee3e7374..f8c01bc27f 100644 --- a/src/nvim/spellfile.c +++ b/src/nvim/spellfile.c @@ -302,6 +302,7 @@ #define CF_UPPER 0x02 static char *e_spell_trunc = N_("E758: Truncated spell file"); +static char *e_illegal_character_in_word = N_("E1280: Illegal character in word"); static char *e_afftrailing = N_("Trailing text in %s line %d: %s"); static char *e_affname = N_("Affix name too long in %s line %d: %s"); static char *msg_compressing = N_("Compressing word tree..."); @@ -575,7 +576,7 @@ slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, bool sile char_u *p; int n; int len; - char_u *save_sourcing_name = sourcing_name; + char_u *save_sourcing_name = (char_u *)sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; slang_T *lp = NULL; int c = 0; @@ -605,13 +606,13 @@ slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, bool sile lp->sl_fname = vim_strsave(fname); // Check for .add.spl. - lp->sl_add = strstr((char *)path_tail(fname), SPL_FNAME_ADD) != NULL; + lp->sl_add = strstr(path_tail((char *)fname), SPL_FNAME_ADD) != NULL; } else { lp = old_lp; } // Set sourcing_name, so that error messages mention the file name. - sourcing_name = fname; + sourcing_name = (char *)fname; sourcing_lnum = 0; // <HEADER>: <fileID> @@ -809,7 +810,7 @@ endOK: if (fd != NULL) { fclose(fd); } - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; return lp; @@ -1099,7 +1100,7 @@ static int read_prefcond_section(FILE *fd, slang_T *lp) buf[0] = '^'; // always match at one position only SPELL_READ_NONNUL_BYTES(buf + 1, (size_t)n, fd,; ); buf[n + 1] = NUL; - lp->sl_prefprog[i] = vim_regcomp((char_u *)buf, RE_MAGIC | RE_STRING); + lp->sl_prefprog[i] = vim_regcomp(buf, RE_MAGIC | RE_STRING); } } return 0; @@ -1201,7 +1202,7 @@ static int read_sal_section(FILE *fd, slang_T *slang) int i = 0; for (; i < ccnt; ++i) { c = getc(fd); // <salfrom> - if (vim_strchr((char_u *)"0123456789(-<^$", c) != NULL) { + if (vim_strchr("0123456789(-<^$", c) != NULL) { break; } *p++ = c; @@ -1465,7 +1466,7 @@ static int read_compound(FILE *fd, slang_T *slang, int len) } // Add all flags to "sl_compallflags". - if (vim_strchr((char_u *)"?*+[]/", c) == NULL + if (vim_strchr("?*+[]/", c) == NULL && !byte_in_str(slang->sl_compallflags, c)) { *ap++ = c; *ap = NUL; @@ -1520,7 +1521,7 @@ static int read_compound(FILE *fd, slang_T *slang, int len) *crp = NUL; } - slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT); + slang->sl_compprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING + RE_STRICT); xfree(pat); if (slang->sl_compprog == NULL) { return SP_FORMERROR; @@ -2251,7 +2252,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) } } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) { // Don't use the first rule if it is a number. - if (compflags != NULL || *skipdigits(items[1]) != NUL) { + if (compflags != NULL || *skipdigits((char *)items[1]) != NUL) { // Concatenate this string to previously defined ones, // using a slash to separate them. l = (int)STRLEN(items[1]) + 1; @@ -2460,7 +2461,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) aff_entry->ae_add = getroom_save(spin, items[3]); // Recognize flags on the affix: abcd/XYZ - aff_entry->ae_flags = vim_strchr(aff_entry->ae_add, '/'); + aff_entry->ae_flags = (char_u *)vim_strchr((char *)aff_entry->ae_add, '/'); if (aff_entry->ae_flags != NULL) { *aff_entry->ae_flags++ = NUL; aff_process_flags(aff, aff_entry); @@ -2483,8 +2484,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) } else { sprintf((char *)buf, "%s$", items[4]); } - aff_entry->ae_prog = vim_regcomp(buf, - RE_MAGIC + RE_STRING + RE_STRICT); + aff_entry->ae_prog = vim_regcomp((char *)buf, RE_MAGIC + RE_STRING + RE_STRICT); if (aff_entry->ae_prog == NULL) { smsg(_("Broken condition in %s line %d: %s"), fname, lnum, items[4]); @@ -2532,7 +2532,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) sprintf((char *)buf, "^%s", aff_entry->ae_cond); vim_regfree(aff_entry->ae_prog); - aff_entry->ae_prog = vim_regcomp(buf, RE_MAGIC + RE_STRING); + aff_entry->ae_prog = vim_regcomp((char *)buf, RE_MAGIC + RE_STRING); } } } @@ -2651,7 +2651,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) if ((!GA_EMPTY(&spin->si_map) && vim_strchr(spin->si_map.ga_data, c) != NULL) - || vim_strchr(p, c) != NULL) { + || vim_strchr((char *)p, c) != NULL) { smsg(_("Duplicate character in MAP in %s line %d"), fname, lnum); } @@ -2923,7 +2923,7 @@ static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compfla tp = p + STRLEN(p); for (p = compflags; *p != NUL;) { - if (vim_strchr((char_u *)"/?*+[]", *p) != NULL) { + if (vim_strchr("/?*+[]", *p) != NULL) { // Copy non-flag characters directly. *tp++ = *p++; } else { @@ -2946,7 +2946,7 @@ static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compfla do { check_renumber(spin); id = spin->si_newcompID--; - } while (vim_strchr((char_u *)"/?*+[]\\-^", id) != NULL); + } while (vim_strchr("/?*+[]\\-^", id) != NULL); ci->ci_newID = id; hash_add(&aff->af_comp, ci->ci_key); } @@ -2981,7 +2981,7 @@ static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag) switch (flagtype) { case AFT_CHAR: - return vim_strchr(afflist, flag) != NULL; + return vim_strchr((char *)afflist, flag) != NULL; case AFT_CAPLONG: case AFT_LONG: @@ -3782,7 +3782,7 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname) regionmask = spin->si_region; // Check for flags and region after a slash. - p = vim_strchr(line, '/'); + p = (char_u *)vim_strchr((char *)line, '/'); if (p != NULL) { *p++ = NUL; while (*p != NUL) { @@ -3927,6 +3927,11 @@ static int store_word(spellinfo_T *spin, char_u *word, int flags, int region, co char_u foldword[MAXWLEN]; int res = OK; + // Avoid adding illegal bytes to the word tree. + if (!utf_valid_string(word, NULL)) { + return FAIL; + } + (void)spell_casefold(curwin, word, len, foldword, MAXWLEN); for (const char_u *p = pfxlist; res == OK; p++) { if (!need_affix || (p != NULL && *p != NUL)) { @@ -4401,7 +4406,7 @@ static int write_vim_spell(spellinfo_T *spin, char_u *fname) // Also skip this for an .add.spl file, the main spell file must contain // the table (avoids that it conflicts). File is shorter too. if (!spin->si_ascii && !spin->si_add) { - char_u folchars[128 * 8]; + char folchars[128 * 8]; int flags; putc(SN_CHARFLAGS, fd); // <sectionID> @@ -5320,19 +5325,19 @@ static void mkspell(int fcount, char_u **fnames, bool ascii, bool over_write, bo } // Check for .ascii.spl. - if (strstr((char *)path_tail(wfname), SPL_FNAME_ASCII) != NULL) { + if (strstr(path_tail((char *)wfname), SPL_FNAME_ASCII) != NULL) { spin.si_ascii = true; } // Check for .add.spl. - if (strstr((char *)path_tail(wfname), SPL_FNAME_ADD) != NULL) { + if (strstr(path_tail((char *)wfname), SPL_FNAME_ADD) != NULL) { spin.si_add = true; } } if (incount <= 0) { emsg(_(e_invarg)); // need at least output and input names - } else if (vim_strchr(path_tail(wfname), '_') != NULL) { + } else if (vim_strchr(path_tail((char *)wfname), '_') != NULL) { emsg(_("E751: Output file name must not have region name")); } else if (incount > MAXREGIONS) { semsg(_("E754: Only up to %d regions supported"), MAXREGIONS); @@ -5357,7 +5362,7 @@ static void mkspell(int fcount, char_u **fnames, bool ascii, bool over_write, bo if (incount > 1) { len = (int)STRLEN(innames[i]); - if (STRLEN(path_tail(innames[i])) < 5 + if (STRLEN(path_tail((char *)innames[i])) < 5 || innames[i][len - 3] != '_') { semsg(_("E755: Invalid region in %s"), innames[i]); goto theend; @@ -5525,6 +5530,11 @@ void spell_add_word(char_u *word, int len, SpellAddType what, int idx, bool undo int i; char_u *spf; + if (!utf_valid_string(word, NULL)) { + emsg(_(e_illegal_character_in_word)); + return; + } + if (idx == 0) { // use internal wordlist if (int_wordlist == NULL) { int_wordlist = vim_tempname(); @@ -5682,7 +5692,7 @@ static void init_spellfile(void) // Find the end of the language name. Exclude the region. If there // is a path separator remember the start of the tail. for (lend = curwin->w_s->b_p_spl; *lend != NUL - && vim_strchr((char_u *)",._", *lend) == NULL; ++lend) { + && vim_strchr(",._", *lend) == NULL; lend++) { if (vim_ispathsep(*lend)) { aspath = true; lstart = lend + 1; @@ -5725,7 +5735,7 @@ static void init_spellfile(void) ->lp_slang->sl_fname; vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add", ((fname != NULL - && strstr((char *)path_tail(fname), ".ascii.") != NULL) + && strstr(path_tail((char *)fname), ".ascii.") != NULL) ? "ascii" : (const char *)spell_enc())); set_option_value("spellfile", 0L, (const char *)buf, OPT_LOCAL); @@ -5862,19 +5872,19 @@ static void set_map_str(slang_T *lp, char_u *map) if (c >= 256) { int cl = utf_char2len(c); int headcl = utf_char2len(headc); - char_u *b; + char *b; hash_T hash; hashitem_T *hi; b = xmalloc(cl + headcl + 2); - utf_char2bytes(c, (char *)b); + utf_char2bytes(c, b); b[cl] = NUL; - utf_char2bytes(headc, (char *)b + cl + 1); + utf_char2bytes(headc, b + cl + 1); b[cl + 1 + headcl] = NUL; - hash = hash_hash(b); + hash = hash_hash((char_u *)b); hi = hash_lookup(&lp->sl_map_hash, (const char *)b, STRLEN(b), hash); if (HASHITEM_EMPTY(hi)) { - hash_add_item(&lp->sl_map_hash, hi, b, hash); + hash_add_item(&lp->sl_map_hash, hi, (char_u *)b, hash); } else { // This should have been checked when generating the .spl // file. diff --git a/src/nvim/state.c b/src/nvim/state.c index 6f4bab62d1..36789016a9 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -56,7 +56,7 @@ getkey: key = K_EVENT; } else { // Duplicate display updating logic in vgetorpeek() - if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0 + if (((State & MODE_INSERT) != 0 || p_lz) && (State & MODE_CMDLINE) == 0 && must_redraw != 0 && !need_wait_return) { update_screen(0); setcursor(); // put cursor back where it belongs @@ -136,21 +136,22 @@ bool virtual_active(void) } return cur_ve_flags == VE_ALL || ((cur_ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V) - || ((cur_ve_flags & VE_INSERT) && (State & INSERT)); + || ((cur_ve_flags & VE_INSERT) && (State & MODE_INSERT)); } -/// VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to -/// NORMAL State with a condition. This function returns the real State. +/// MODE_VISUAL, MODE_SELECTMODE and MODE_OP_PENDING State are never set, they are +/// equal to MODE_NORMAL State with a condition. This function returns the real +/// State. int get_real_state(void) { - if (State & NORMAL) { + if (State & MODE_NORMAL) { if (VIsual_active) { if (VIsual_select) { - return SELECTMODE; + return MODE_SELECT; } - return VISUAL; + return MODE_VISUAL; } else if (finish_op) { - return OP_PENDING; + return MODE_OP_PENDING; } } return State; @@ -173,17 +174,17 @@ void get_mode(char *buf) buf[i++] = 's'; } } - } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE - || State == CONFIRM) { + } else if (State == MODE_HITRETURN || State == MODE_ASKMORE || State == MODE_SETWSIZE + || State == MODE_CONFIRM) { buf[i++] = 'r'; - if (State == ASKMORE) { + if (State == MODE_ASKMORE) { buf[i++] = 'm'; - } else if (State == CONFIRM) { + } else if (State == MODE_CONFIRM) { buf[i++] = '?'; } - } else if (State == EXTERNCMD) { + } else if (State == MODE_EXTERNCMD) { buf[i++] = '!'; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { if (State & VREPLACE_FLAG) { buf[i++] = 'R'; buf[i++] = 'v'; @@ -199,12 +200,12 @@ void get_mode(char *buf) } else if (ctrl_x_mode_not_defined_yet()) { buf[i++] = 'x'; } - } else if ((State & CMDLINE) || exmode_active) { + } else if ((State & MODE_CMDLINE) || exmode_active) { buf[i++] = 'c'; if (exmode_active) { buf[i++] = 'v'; } - } else if (State & TERM_FOCUS) { + } else if (State & MODE_TERMINAL) { buf[i++] = 't'; } else { buf[i++] = 'n'; @@ -232,7 +233,7 @@ void may_trigger_modechanged(void) } char curr_mode[MODE_MAX_LENGTH]; - char_u pattern_buf[2 * MODE_MAX_LENGTH]; + char pattern_buf[2 * MODE_MAX_LENGTH]; get_mode(curr_mode); if (STRCMP(curr_mode, last_mode) == 0) { @@ -246,7 +247,7 @@ void may_trigger_modechanged(void) tv_dict_set_keys_readonly(v_event); // concatenate modes in format "old_mode:new_mode" - vim_snprintf((char *)pattern_buf, sizeof(pattern_buf), "%s:%s", last_mode, curr_mode); + vim_snprintf(pattern_buf, sizeof(pattern_buf), "%s:%s", last_mode, curr_mode); apply_autocmds(EVENT_MODECHANGED, pattern_buf, NULL, false, curbuf); STRCPY(last_mode, curr_mode); diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 0307cf4696..cde2059a9d 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -104,8 +104,8 @@ char_u *vim_strsave_escaped_ext(const char_u *string, const char_u *esc_chars, c p += l - 1; continue; } - if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { - ++length; // count a backslash + if (vim_strchr((char *)esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { + length++; // count a backslash } ++length; // count an ordinary char } @@ -120,7 +120,7 @@ char_u *vim_strsave_escaped_ext(const char_u *string, const char_u *esc_chars, c p += l - 1; // skip multibyte char continue; } - if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { + if (vim_strchr((char *)esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { *p2++ = cc; } *p2++ = *p; @@ -473,18 +473,18 @@ int vim_strnicmp(const char *s1, const char *s2, size_t len) /// @return Pointer to the first byte of the found character in string or NULL /// if it was not found or character is invalid. NUL character is never /// found, use `strlen()` instead. -char_u *vim_strchr(const char_u *const string, const int c) +char *vim_strchr(const char *const string, const int c) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { if (c <= 0) { return NULL; } else if (c < 0x80) { - return (char_u *)strchr((const char *)string, c); + return strchr(string, c); } else { char u8char[MB_MAXBYTES + 1]; const int len = utf_char2bytes(c, u8char); u8char[len] = NUL; - return (char_u *)strstr((const char *)string, u8char); + return strstr(string, u8char); } } @@ -634,7 +634,7 @@ static const void *tv_ptr(const typval_T *const tvs, int *const idxp) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT { #define OFF(attr) offsetof(union typval_vval_union, attr) - STATIC_ASSERT(OFF(v_string) == OFF(v_list) + STATIC_ASSERT(OFF(v_string) == OFF(v_list) // -V568 && OFF(v_string) == OFF(v_dict) && OFF(v_string) == OFF(v_partial) && sizeof(tvs[0].vval.v_string) == sizeof(tvs[0].vval.v_list) @@ -1313,8 +1313,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t if (fmt_spec == 'f' || fmt_spec == 'F') { tp = tmp + str_arg_l - 1; } else { - tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); + tp = vim_strchr(tmp, fmt_spec == 'e' ? 'e' : 'E'); if (tp) { // remove superfluous '+' and leading zeroes from exponent if (tp[1] == '+') { @@ -1343,8 +1342,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t } else { // Be consistent: some printf("%e") use 1.0e+12 and some // 1.0e+012; remove one zero in the last case. - char *tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); + char *tp = vim_strchr(tmp, fmt_spec == 'e' ? 'e' : 'E'); if (tp && (tp[1] == '+' || tp[1] == '-') && tp[2] == '0' && ascii_isdigit(tp[3]) && ascii_isdigit(tp[4])) { STRMOVE(tp + 2, tp + 3); @@ -1480,3 +1478,32 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t // written to the buffer if it were large enough. return (int)str_l; } + +int kv_do_printf(StringBuilder *str, const char *fmt, ...) + FUNC_ATTR_PRINTF(2, 3) +{ + size_t remaining = str->capacity - str->size; + + va_list ap; + va_start(ap, fmt); + int printed = vsnprintf(str->items ? str->items + str->size : NULL, remaining, fmt, ap); + va_end(ap); + + if (printed < 0) { + return -1; + } + + // printed string didn't fit, resize and try again + if ((size_t)printed >= remaining) { + kv_ensure_space(*str, (size_t)printed + 1); // include space for NUL terminator at the end + va_start(ap, fmt); + printed = vsnprintf(str->items + str->size, str->capacity - str->size, fmt, ap); + va_end(ap); + if (printed < 0) { + return -1; + } + } + + str->size += (size_t)printed; + return printed; +} diff --git a/src/nvim/strings.h b/src/nvim/strings.h index 893b0ea269..0503cecc8a 100644 --- a/src/nvim/strings.h +++ b/src/nvim/strings.h @@ -7,6 +7,7 @@ #include "nvim/eval/typval.h" #include "nvim/types.h" +#include "nvim/lib/kvec.h" /// Append string to string and return pointer to the next byte /// @@ -25,6 +26,8 @@ static inline char *strappend(char *const dst, const char *const src) return (char *)memmove(dst, src, src_len) + src_len; } +typedef kvec_t(char) StringBuilder; + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "strings.h.generated.h" #endif diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index d8d1b736d2..6744e4445c 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -27,7 +27,7 @@ #include "nvim/highlight.h" #include "nvim/highlight_group.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/macros.h" #include "nvim/mbyte.h" @@ -3807,7 +3807,7 @@ static void put_pattern(const char *const s, const int c, const synpat_T *const msg_putchar(c); // output the pattern, in between a char that is not in the pattern - for (i = 0; vim_strchr(spp->sp_pattern, sepchars[i]) != NULL;) { + for (i = 0; vim_strchr((char *)spp->sp_pattern, sepchars[i]) != NULL;) { if (sepchars[++i] == NUL) { i = 0; // no good char found, just use the first one break; @@ -4393,7 +4393,7 @@ static void syn_cmd_keyword(exarg_T *eap, int syncing) // 2: Add an entry for each keyword. for (kw = keyword_copy; --cnt >= 0; kw += STRLEN(kw) + 1) { - for (p = vim_strchr(kw, '[');;) { + for (p = (char_u *)vim_strchr((char *)kw, '[');;) { if (p != NULL) { *p = NUL; } @@ -5075,7 +5075,7 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci) char_u *end; int *p; int idx; - char_u *cpo_save; + char *cpo_save; // need at least three chars if (arg == NULL || arg[0] == NUL || arg[1] == NUL || arg[2] == NUL) { @@ -5092,8 +5092,8 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci) // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; - ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC); + p_cpo = ""; + ci->sp_prog = vim_regcomp((char *)ci->sp_pattern, RE_MAGIC); p_cpo = cpo_save; if (ci->sp_prog == NULL) { @@ -5174,7 +5174,7 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) int illegal = FALSE; int finished = FALSE; long n; - char_u *cpo_save; + char *cpo_save; if (ends_excmd(*arg_start)) { syn_cmd_list(eap, TRUE); @@ -5253,9 +5253,9 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; curwin->w_s->b_syn_linecont_prog = - vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC); + vim_regcomp((char *)curwin->w_s->b_syn_linecont_pat, RE_MAGIC); p_cpo = cpo_save; syn_clear_time(&curwin->w_s->b_syn_linecont_time); @@ -5303,8 +5303,8 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) /// @return FAIL for some error, OK for success. static int get_id_list(char_u **const arg, const int keylen, int16_t **const list, const bool skip) { - char_u *p = NULL; - char_u *end; + char *p = NULL; + char *end; int total_count = 0; int16_t *retval = NULL; regmatch_T regmatch; @@ -5318,12 +5318,12 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis // grow when a regexp is used. In that case round 1 is done once again. for (int round = 1; round <= 2; round++) { // skip "contains" - p = (char_u *)skipwhite((char *)(*arg) + keylen); + p = skipwhite((char *)(*arg) + keylen); if (*p != '=') { semsg(_("E405: Missing equal sign: %s"), *arg); break; } - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); if (ends_excmd(*p)) { semsg(_("E406: Empty argument: %s"), *arg); break; @@ -5333,7 +5333,7 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis int count = 0; do { for (end = p; *end && !ascii_iswhite(*end) && *end != ','; end++) {} - char_u *const name = xmalloc(end - p + 3); // leave room for "^$" + char *const name = xmalloc(end - p + 3); // leave room for "^$" STRLCPY(name + 1, p, end - p + 1); if (STRCMP(name + 1, "ALLBUT") == 0 || STRCMP(name + 1, "ALL") == 0 @@ -5367,14 +5367,14 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis if (skip) { id = -1; } else { - id = syn_check_cluster(name + 2, (int)(end - p - 1)); + id = syn_check_cluster((char_u *)name + 2, (int)(end - p - 1)); } } else { /* * Handle full group name. */ - if (strpbrk((char *)name + 1, "\\.*^$~[") == NULL) { - id = syn_check_group((char *)(name + 1), (int)(end - p)); + if (strpbrk(name + 1, "\\.*^$~[") == NULL) { + id = syn_check_group((name + 1), (int)(end - p)); } else { // Handle match of regexp with group names. *name = '^'; @@ -5427,11 +5427,11 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis } ++count; } - p = (char_u *)skipwhite((char *)end); + p = skipwhite(end); if (*p != ',') { break; } - p = (char_u *)skipwhite((char *)p + 1); // skip comma in between arguments + p = skipwhite(p + 1); // skip comma in between arguments } while (!ends_excmd(*p)); if (failed) { break; @@ -5443,7 +5443,7 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis } } - *arg = p; + *arg = (char_u *)p; if (failed || retval == NULL) { xfree(retval); return FAIL; @@ -5669,7 +5669,7 @@ void ex_ownsyntax(exarg_T *eap) } // Apply the "syntax" autocommand event, this finds and loads the syntax file. - apply_autocmds(EVENT_SYNTAX, (char_u *)eap->arg, curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, true, curbuf); // Move value of b:current_syntax to w:current_syntax. new_value = get_var_value("b:current_syntax"); @@ -5763,26 +5763,26 @@ void set_context_in_syntax_cmd(expand_T *xp, const char *arg) * Function given to ExpandGeneric() to obtain the list syntax names for * expansion. */ -char_u *get_syntax_name(expand_T *xp, int idx) +char *get_syntax_name(expand_T *xp, int idx) { switch (expand_what) { case EXP_SUBCMD: - return (char_u *)subcommands[idx].name; + return subcommands[idx].name; case EXP_CASE: { static char *case_args[] = { "match", "ignore", NULL }; - return (char_u *)case_args[idx]; + return case_args[idx]; } case EXP_SPELL: { static char *spell_args[] = { "toplevel", "notoplevel", "default", NULL }; - return (char_u *)spell_args[idx]; + return spell_args[idx]; } case EXP_SYNC: { static char *sync_args[] = { "ccomment", "clear", "fromstart", "linebreaks=", "linecont", "lines=", "match", "maxlines=", "minlines=", "region", NULL }; - return (char_u *)sync_args[idx]; + return sync_args[idx]; } } return NULL; @@ -5965,17 +5965,17 @@ static void syntime_clear(void) * Function given to ExpandGeneric() to obtain the possible arguments of the * ":syntime {on,off,clear,report}" command. */ -char_u *get_syntime_arg(expand_T *xp, int idx) +char *get_syntime_arg(expand_T *xp, int idx) { switch (idx) { case 0: - return (char_u *)"on"; + return "on"; case 1: - return (char_u *)"off"; + return "off"; case 2: - return (char_u *)"clear"; + return "clear"; case 3: - return (char_u *)"report"; + return "report"; } return NULL; } diff --git a/src/nvim/tag.c b/src/nvim/tag.c index c914ad5251..8a21ec3e5d 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -1108,10 +1108,8 @@ static void prepare_pats(pat_T *pats, int has_re) if (pats->head == pats->pat) { pats->headlen = 0; } else { - for (pats->headlen = 0; pats->head[pats->headlen] != NUL; - ++pats->headlen) { - if (vim_strchr((char_u *)(p_magic ? ".[~*\\$" : "\\$"), - pats->head[pats->headlen]) != NULL) { + for (pats->headlen = 0; pats->head[pats->headlen] != NUL; pats->headlen++) { + if (vim_strchr((p_magic ? ".[~*\\$" : "\\$"), pats->head[pats->headlen]) != NULL) { break; } } @@ -1122,7 +1120,7 @@ static void prepare_pats(pat_T *pats, int has_re) } if (has_re) { - pats->regmatch.regprog = vim_regcomp(pats->pat, p_magic ? RE_MAGIC : 0); + pats->regmatch.regprog = vim_regcomp((char *)pats->pat, p_magic ? RE_MAGIC : 0); } else { pats->regmatch.regprog = NULL; } @@ -1604,8 +1602,8 @@ int find_tags(char_u *pat, int *num_matches, char_u ***matchesp, int flags, int if (STRNICMP(s, help_lang, 2) == 0) { break; } - ++help_pri; - if ((s = vim_strchr(s, ',')) == NULL) { + help_pri++; + if ((s = (char_u *)vim_strchr((char *)s, ',')) == NULL) { break; } } @@ -1864,7 +1862,7 @@ parse_line: // This speeds up tag searching a lot! if (orgpat.headlen) { tagp.tagname = lbuf; - tagp.tagname_end = vim_strchr(lbuf, TAB); + tagp.tagname_end = (char_u *)vim_strchr((char *)lbuf, TAB); if (tagp.tagname_end == NULL) { // Corrupted tag line. line_error = true; @@ -1982,7 +1980,7 @@ parse_line: // Can be a matching tag, isolate the file name and command. tagp.fname = tagp.tagname_end + 1; - tagp.fname_end = vim_strchr(tagp.fname, TAB); + tagp.fname_end = (char_u *)vim_strchr((char *)tagp.fname, TAB); tagp.command = tagp.fname_end + 1; if (tagp.fname_end == NULL) { i = FAIL; @@ -2129,7 +2127,7 @@ parse_line: STRLCPY(mfp, tagp.tagname, len + 1); // if wanted, re-read line to get long form too - if (State & INSERT) { + if (State & MODE_INSERT) { get_it_again = p_sft; } } @@ -2369,7 +2367,7 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf) } ++tnp->tn_hf_idx; STRCPY(buf, p_hf); - STRCPY(path_tail(buf), "tags"); + STRCPY(path_tail((char *)buf), "tags"); #ifdef BACKSLASH_IN_FILENAME slash_adjust(buf); #endif @@ -2428,7 +2426,7 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf) r_ptr = vim_findfile_stopdir(buf); // move the filename one char forward and truncate the // filepath with a NUL - filename = path_tail(buf); + filename = (char_u *)path_tail((char *)buf); STRMOVE(filename + 1, filename); *filename++ = NUL; @@ -2473,7 +2471,7 @@ static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp) // Isolate the tagname, from lbuf up to the first white tagp->tagname = lbuf; - p = vim_strchr(lbuf, TAB); + p = (char_u *)vim_strchr((char *)lbuf, TAB); if (p == NULL) { return FAIL; } @@ -2484,7 +2482,7 @@ static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp) ++p; } tagp->fname = p; - p = vim_strchr(p, TAB); + p = (char_u *)vim_strchr((char *)p, TAB); if (p == NULL) { return FAIL; } @@ -2522,8 +2520,8 @@ static bool test_for_static(tagptrs_T *tagp) // Check for new style static tag ":...<Tab>file:[<Tab>...]" p = tagp->command; - while ((p = vim_strchr(p, '\t')) != NULL) { - ++p; + while ((p = (char_u *)vim_strchr((char *)p, '\t')) != NULL) { + p++; if (STRNCMP(p, "file:", 5) == 0) { return TRUE; } @@ -2595,8 +2593,8 @@ static int parse_match(char_u *lbuf, tagptrs_T *tagp) break; } - pc = vim_strchr(p, ':'); - pt = vim_strchr(p, '\t'); + pc = (char_u *)vim_strchr((char *)p, ':'); + pt = (char_u *)vim_strchr((char *)p, '\t'); if (pc == NULL || (pt != NULL && pc > pt)) { tagp->tagkind = p; } @@ -2715,7 +2713,7 @@ static int jumpto_tag(const char_u *lbuf_arg, int forceit, int keep_help) * autocommand event (e.g., http://sys/file). */ if (!os_path_exists(fname) - && !has_autocmd(EVENT_BUFREADCMD, fname, + && !has_autocmd(EVENT_BUFREADCMD, (char *)fname, NULL)) { retval = NOTAGFILE; xfree(nofile_fname); @@ -2997,7 +2995,7 @@ static char_u *expand_tag_fname(char_u *fname, char_u *const tag_fname, const bo char_u *retval; if ((p_tr || curbuf->b_help) && !vim_isAbsName(fname) - && (p = path_tail(tag_fname)) != tag_fname) { + && (p = (char_u *)path_tail((char *)tag_fname)) != tag_fname) { retval = xmalloc(MAXPATHL); STRCPY(retval, tag_fname); STRLCPY(retval + (p - tag_fname), fname, @@ -3054,7 +3052,7 @@ static int find_extra(char_u **pp) // Repeat for addresses separated with ';' for (;;) { if (ascii_isdigit(*str)) { - str = skipdigits(str + 1); + str = (char_u *)skipdigits((char *)str + 1); } else if (*str == '/' || *str == '?') { str = skip_regexp(str + 1, *str, false, NULL); if (*str != first_char) { diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 142da8f184..c8f70d4afd 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -56,7 +56,7 @@ #include "nvim/getchar.h" #include "nvim/highlight.h" #include "nvim/highlight_group.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/log.h" #include "nvim/macros.h" #include "nvim/main.h" @@ -381,7 +381,7 @@ void terminal_check_size(Terminal *term) invalidate_terminal(term, -1, -1); } -/// Implements TERM_FOCUS mode. :help Terminal-mode +/// Implements MODE_TERMINAL state. :help Terminal-mode void terminal_enter(void) { buf_T *buf = curbuf; @@ -398,13 +398,13 @@ void terminal_enter(void) int save_state = State; s->save_rd = RedrawingDisabled; - State = TERM_FOCUS; - mapped_ctrl_c |= TERM_FOCUS; // Always map CTRL-C to avoid interrupt. + State = MODE_TERMINAL; + mapped_ctrl_c |= MODE_TERMINAL; // Always map CTRL-C to avoid interrupt. RedrawingDisabled = false; // Disable these options in terminal-mode. They are nonsense because cursor is // placed at end of buffer to "follow" output. #11072 - win_T *save_curwin = curwin; + handle_T save_curwin = curwin->handle; bool save_w_p_cul = curwin->w_p_cul; char_u *save_w_p_culopt = NULL; char_u save_w_p_culopt_flags = curwin->w_p_culopt_flags; @@ -442,7 +442,7 @@ void terminal_enter(void) RedrawingDisabled = s->save_rd; apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf); - if (save_curwin == curwin) { // save_curwin may be invalid (window closed)! + if (save_curwin == curwin->handle) { // Else: window was closed. curwin->w_p_cul = save_w_p_cul; if (save_w_p_culopt) { xfree(curwin->w_p_culopt); @@ -1374,26 +1374,21 @@ static void fetch_row(Terminal *term, int row, int end_col) while (col < end_col) { VTermScreenCell cell; fetch_cell(term, row, col, &cell); - int cell_len = 0; if (cell.chars[0]) { + int cell_len = 0; for (int i = 0; cell.chars[i]; i++) { cell_len += utf_char2bytes((int)cell.chars[i], ptr + cell_len); } - } else { - *ptr = ' '; - cell_len = 1; - } - char c = *ptr; - ptr += cell_len; - if (c != ' ') { - // only increase the line length if the last character is not whitespace + ptr += cell_len; line_len = (size_t)(ptr - term->textbuf); + } else { + *ptr++ = ' '; } col += cell.width; } - // trim trailing whitespace - term->textbuf[line_len] = 0; + // end of line + term->textbuf[line_len] = NUL; } static bool fetch_cell(Terminal *term, int row, int col, VTermScreenCell *cell) @@ -1637,7 +1632,7 @@ static int linenr_to_row(Terminal *term, int linenr) static bool is_focused(Terminal *term) { - return State & TERM_FOCUS && curbuf->terminal == term; + return State & MODE_TERMINAL && curbuf->terminal == term; } static char *get_config_string(char *key) diff --git a/src/nvim/testdir/setup.vim b/src/nvim/testdir/setup.vim index 15e3b31498..f1092af358 100644 --- a/src/nvim/testdir/setup.vim +++ b/src/nvim/testdir/setup.vim @@ -26,11 +26,9 @@ set sessionoptions+=options set viewoptions+=options set switchbuf= -" Unmap Nvim default mappings. -unmap Y -unmap <C-L> -iunmap <C-U> -iunmap <C-W> +" Clear Nvim default mappings. +mapclear +mapclear! " Prevent Nvim log from writing to stderr. let $NVIM_LOG_FILE = exists($NVIM_LOG_FILE) ? $NVIM_LOG_FILE : 'Xnvim.log' diff --git a/src/nvim/testdir/test_buffer.vim b/src/nvim/testdir/test_buffer.vim index a31cdbb49a..9eb768f124 100644 --- a/src/nvim/testdir/test_buffer.vim +++ b/src/nvim/testdir/test_buffer.vim @@ -61,4 +61,15 @@ func Test_buffer_scheme() set shellslash& endfunc +" this was using a NULL pointer after failing to use the pattern +func Test_buf_pattern_invalid() + vsplit 0000000 + silent! buf [0--]\&\zs*\zs*e + bwipe! + + vsplit 00000000000000000000000000 + silent! buf [0--]\&\zs*\zs*e + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_cindent.vim b/src/nvim/testdir/test_cindent.vim index 4d69aed96c..7ba8ef3397 100644 --- a/src/nvim/testdir/test_cindent.vim +++ b/src/nvim/testdir/test_cindent.vim @@ -5311,6 +5311,13 @@ func Test_cindent_case() bwipe! endfunc +" This was reading past the end of the line +func Test_cindent_check_funcdecl() + new + sil norm o0('\0=L + bwipe! +endfunc + func Test_cindent_scopedecls() new setl cindent ts=4 sw=4 diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 759caac878..b2c752376f 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -1224,4 +1224,16 @@ func Test_screenpos_and_completion() call feedkeys(":let a\<C-R>=Check_completion()\<CR>\<Esc>", "xt") endfunc +func Test_recursive_register() + let @= = '' + silent! ?e/ + let caught = 'no' + try + normal // + catch /E169:/ + let caught = 'yes' + endtry + call assert_equal('yes', caught) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_cursor_func.vim b/src/nvim/testdir/test_cursor_func.vim index 9ba82e3b70..6c6a6290cb 100644 --- a/src/nvim/testdir/test_cursor_func.vim +++ b/src/nvim/testdir/test_cursor_func.vim @@ -102,10 +102,11 @@ func Test_screenpos() bwipe! call assert_equal({'col': 1, 'row': 1, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) - " Needs WinBar " nmenu WinBar.TEST : - " call assert_equal({'col': 1, 'row': 2, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) + setlocal winbar=TEST + call assert_equal({'col': 1, 'row': 2, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) " nunmenu WinBar.TEST + setlocal winbar& endfunc func Test_screenpos_number() diff --git a/src/nvim/testdir/test_matchfuzzy.vim b/src/nvim/testdir/test_matchfuzzy.vim index d53f8b0f4d..533aec8d9a 100644 --- a/src/nvim/testdir/test_matchfuzzy.vim +++ b/src/nvim/testdir/test_matchfuzzy.vim @@ -135,6 +135,9 @@ func Test_matchfuzzypos() " match multiple words (separated by space) call assert_equal([['foo bar baz'], [[8, 9, 10, 0, 1, 2]], [369]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('baz foo')) + call assert_equal([[], [], []], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('baz foo', {'matchseq': 1})) + call assert_equal([['foo bar baz'], [[0, 1, 2, 8, 9, 10]], [369]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('foo baz')) + call assert_equal([['foo bar baz'], [[0, 1, 2, 3, 4, 5, 10]], [326]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('foo baz', {'matchseq': 1})) call assert_equal([[], [], []], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('one two')) call assert_equal([[], [], []], ['foo bar']->matchfuzzypos(" \t ")) call assert_equal([['grace'], [[1, 2, 3, 4, 2, 3, 4, 0, 1, 2, 3, 4]], [657]], ['grace']->matchfuzzypos('race ace grace')) diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index 8f67b1732e..9e16625cc2 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -832,4 +832,17 @@ func Test_opt_cdhome() set cdhome& endfunc +func Test_switchbuf_reset() + set switchbuf=useopen + sblast + call assert_equal(1, winnr('$')) + set all& + " Nvim has a different default for 'switchbuf' + " call assert_equal('', &switchbuf) + call assert_equal('uselast', &switchbuf) + sblast + call assert_equal(2, winnr('$')) + only! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index d359e69f91..454c956996 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -925,6 +925,26 @@ func Test_hlsearch_block_visual_match() call delete('Xhlsearch_block') endfunc +func Test_hlsearch_and_visual() + CheckOption hlsearch + CheckScreendump + + call writefile([ + \ 'set hlsearch', + \ 'call setline(1, repeat(["xxx yyy zzz"], 3))', + \ 'hi Search cterm=bold', + \ '/yyy', + \ 'call cursor(1, 6)', + \ ], 'Xhlvisual_script') + let buf = RunVimInTerminal('-S Xhlvisual_script', {'rows': 6, 'cols': 40}) + call term_sendkeys(buf, "vjj") + call VerifyScreenDump(buf, 'Test_hlsearch_visual_1', {}) + call term_sendkeys(buf, "\<Esc>") + + call StopVimInTerminal(buf) + call delete('Xhlvisual_script') +endfunc + func Test_incsearch_substitute() CheckFunction test_override CheckOption incsearch diff --git a/src/nvim/testdir/test_smartindent.vim b/src/nvim/testdir/test_smartindent.vim index dc0f99e93f..f3650a9ac4 100644 --- a/src/nvim/testdir/test_smartindent.vim +++ b/src/nvim/testdir/test_smartindent.vim @@ -61,4 +61,26 @@ func Test_smartindent_braces() close! endfunc +func Test_si_after_completion() + new + setlocal ai smartindent indentexpr= + call setline(1, 'foo foot') + call feedkeys("o f\<C-X>\<C-N>#", 'tx') + call assert_equal(' foo#', getline(2)) + + call setline(2, '') + call feedkeys("1Go f\<C-X>\<C-N>}", 'tx') + call assert_equal(' foo}', getline(2)) + + bwipe! +endfunc + +func Test_no_si_after_completion() + new + call setline(1, 'foo foot') + call feedkeys("o f\<C-X>\<C-N>#", 'tx') + call assert_equal(' foo#', getline(2)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim index 56ed97cdd9..ce21b8bdc9 100644 --- a/src/nvim/testdir/test_spell.vim +++ b/src/nvim/testdir/test_spell.vim @@ -776,14 +776,6 @@ func Test_spell_screendump() call delete('XtestSpell') endfunc -func Test_spell_single_word() - new - silent! norm 0R00 - spell! ß - silent 0norm 0r$ Dvz= - bwipe! -endfunc - let g:test_data_aff1 = [ \"SET ISO8859-1", \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ", diff --git a/src/nvim/testdir/test_spell_utf8.vim b/src/nvim/testdir/test_spell_utf8.vim index 3d159f3352..1d323df67e 100644 --- a/src/nvim/testdir/test_spell_utf8.vim +++ b/src/nvim/testdir/test_spell_utf8.vim @@ -768,4 +768,10 @@ func Test_spellfile_value() set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add endfunc +" Invalid bytes may cause trouble when creating the word list. +func Test_check_for_valid_word() + call assert_fails("spellgood! 0\xac", 'E1280:') +endfunc + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim index 492d09c645..8579457d9f 100644 --- a/src/nvim/testdir/test_statusline.vim +++ b/src/nvim/testdir/test_statusline.vim @@ -461,7 +461,6 @@ func Test_statusline_removed_group() call writefile(lines, 'XTest_statusline') let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 10, 'cols': 50}) - call term_wait(buf, 100) call VerifyScreenDump(buf, 'Test_statusline_1', {}) " clean up @@ -535,4 +534,22 @@ func Test_statusline_verylong_filename() bwipe! endfunc +func Test_statusline_highlight_truncate() + CheckScreendump + + let lines =<< trim END + set laststatus=2 + hi! link User1 Directory + hi! link User2 ErrorMsg + set statusline=%.5(%1*ABC%2*DEF%1*GHI%) + END + call writefile(lines, 'XTest_statusline') + + let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 6}) + call VerifyScreenDump(buf, 'Test_statusline_hl', {}) + + call StopVimInTerminal(buf) + call delete('XTest_statusline') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim index e0b05edf15..2fe3c448d6 100644 --- a/src/nvim/testdir/test_tagjump.vim +++ b/src/nvim/testdir/test_tagjump.vim @@ -1077,6 +1077,15 @@ Type number and <Enter> (q or empty cancels): %bwipe endfunc +func Test_define_search() + " this was accessing freed memory + new + call setline(1, ['first line', '', '#define something 0']) + sil norm o0 + sil! norm + bwipe! +endfunc + " Test for the 'taglength' option func Test_tag_length() set tags=Xtags diff --git a/src/nvim/testdir/test_undo.vim b/src/nvim/testdir/test_undo.vim index 30e00e7ad4..848860649e 100644 --- a/src/nvim/testdir/test_undo.vim +++ b/src/nvim/testdir/test_undo.vim @@ -733,4 +733,21 @@ func Test_undofile_cryptmethod_blowfish2() set undofile& undolevels& cryptmethod& endfunc +func Test_undo_mark() + new + " The undo is applied to the only line. + call setline(1, 'hello') + call feedkeys("ggyiw$p", 'xt') + undo + call assert_equal([0, 1, 1, 0], getpos("'[")) + call assert_equal([0, 1, 1, 0], getpos("']")) + " The undo removes the last line. + call feedkeys("Goaaaa\<Esc>", 'xt') + call feedkeys("obbbb\<Esc>", 'xt') + undo + call assert_equal([0, 2, 1, 0], getpos("'[")) + call assert_equal([0, 2, 1, 0], getpos("']")) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim index 2b88deb813..41c29c5bb0 100644 --- a/src/nvim/testdir/test_visual.vim +++ b/src/nvim/testdir/test_visual.vim @@ -1249,11 +1249,23 @@ endfunc func Test_visual_block_append_invalid_char() " this was going over the end of the line + set isprint=@,161-255 new call setline(1, [' let xxx', 'xxxxxˆ', 'xxxxxxxxxxx']) exe "normal 0\<C-V>jjA-\<Esc>" call assert_equal([' - let xxx', 'xxxxx -ˆ', 'xxxxxxxx-xxx'], getline(1, 3)) bwipe! + set isprint& +endfunc + +func Test_visual_block_with_substitute() + " this was reading beyond the end of the line + new + norm a0) + sil! norm O + s/) + sil! norm + bwipe! endfunc func Test_visual_reselect_with_count() diff --git a/src/nvim/tui/terminfo_defs.h b/src/nvim/tui/terminfo_defs.h index 40261058dc..4e8affa4d3 100644 --- a/src/nvim/tui/terminfo_defs.h +++ b/src/nvim/tui/terminfo_defs.h @@ -4,7 +4,7 @@ // uncrustify:off // -// Generated by scripts/update_terminfo.sh and ncurses 6.1.20180127 +// Generated by scripts/update_terminfo.sh and ncurses 6.3.20211021 // #ifndef NVIM_TUI_TERMINFO_DEFS_H @@ -96,7 +96,7 @@ // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t ansi_terminfo[] = { - 26,1,40,0,38,0,16,0,125,1,68,2,97,110,115,105,124,97,110,115,105,47,112,99,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,0,8,0,24,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,0,0,4,0,6,0,-1,-1,8,0,13,0,20,0,24,0,28,0,-1,-1,39,0,56,0,60,0,-1,-1,64,0,-1,-1,-1,-1,68,0,-1,-1,72,0,-1,-1,76,0,80,0,-1,-1,-1,-1,84,0,90,0,95,0,-1,-1,-1,-1,-1,-1,-1,-1,100,0,-1,-1,105,0,110,0,115,0,120,0,-127,0,-121,0,-1,-1,-1,-1,-1,-1,-113,0,-109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-105,0,-1,-1,-101,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-99,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-95,0,-91,0,-1,-1,-87,0,-1,-1,-1,-1,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-79,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-75,0,-1,-1,-70,0,-61,0,-52,0,-43,0,-34,0,-25,0,-16,0,-7,0,2,1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,20,1,25,1,30,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,1,-1,-1,61,1,-1,-1,63,1,-107,1,-1,-1,-104,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,1,-1,-1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-28,1,-17,1,-12,1,7,2,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,2,30,2,-1,-1,-1,-1,-1,-1,40,2,44,2,48,2,52,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,2,62,2,27,91,90,0,7,0,13,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,53,109,0,27,91,49,109,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,27,91,66,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,67,0,27,91,65,0,13,27,91,83,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,91,37,105,37,112,49,37,100,100,0,10,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,27,72,0,27,91,73,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,40,66,0,27,41,66,0,27,42,66,0,27,43,66,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,0,0,0,0,1,0,3,0,1,0,0,0,65,88,0 // NOLINT + 26,1,40,0,38,0,16,0,125,1,68,2,97,110,115,105,124,97,110,115,105,47,112,99,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,0,8,0,24,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,0,0,4,0,6,0,-1,-1,8,0,13,0,20,0,24,0,28,0,-1,-1,39,0,56,0,60,0,-1,-1,64,0,-1,-1,-1,-1,68,0,-1,-1,72,0,-1,-1,76,0,80,0,-1,-1,-1,-1,84,0,90,0,95,0,-1,-1,-1,-1,-1,-1,-1,-1,100,0,-1,-1,105,0,110,0,115,0,120,0,-127,0,-121,0,-1,-1,-1,-1,-1,-1,-113,0,-109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-105,0,-1,-1,-101,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-99,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-95,0,-91,0,-1,-1,-87,0,-1,-1,-1,-1,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-79,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-75,0,-1,-1,-70,0,-61,0,-52,0,-43,0,-34,0,-25,0,-16,0,-7,0,2,1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,20,1,25,1,30,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,1,-1,-1,61,1,-1,-1,63,1,-107,1,-1,-1,-104,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,1,-1,-1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-28,1,-17,1,-12,1,7,2,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,2,30,2,-1,-1,-1,-1,-1,-1,40,2,44,2,48,2,52,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,2,62,2,27,91,90,0,7,0,13,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,53,109,0,27,91,49,109,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,27,91,66,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,67,0,27,91,65,0,13,27,91,83,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,91,37,105,37,112,49,37,100,100,0,10,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,27,72,0,27,91,73,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,40,66,0,27,41,66,0,27,42,66,0,27,43,66,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,0,0,0,0,1,0,3,0,1,0,0,0,65,88,0 }; // conemu|ANIS X3.64 and Xterm 256 colors for ConEmu with libuv, @@ -118,6 +118,7 @@ static const int8_t ansi_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs@, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -159,9 +160,13 @@ static const int8_t ansi_terminfo[] = { // init_2string@, // initialize_color@, // insert_line=\E[L, +// key_a1=\EOw, +// key_a3=\EOy, // key_b2=\E[G, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\E[B, // key_end=\E[4~, @@ -253,6 +258,7 @@ static const int8_t ansi_terminfo[] = { // memory_unlock@, // meta_off@, // meta_on@, +// newline=\EE, // orig_colors@, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -279,6 +285,7 @@ static const int8_t ansi_terminfo[] = { // set_a_background=\E[48;5;%p1%dm, // set_a_foreground=\E[38;5;%p1%dm, // set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab@, // tab=^I, // user6@, @@ -286,7 +293,7 @@ static const int8_t ansi_terminfo[] = { // user8@, // user9@, static const int8_t conemu_terminfo[] = { - 30,2,61,0,38,0,15,0,-99,1,31,3,99,111,110,101,109,117,124,65,78,73,83,32,88,51,46,54,52,32,97,110,100,32,88,116,101,114,109,32,50,53,54,32,99,111,108,111,114,115,32,102,111,114,32,67,111,110,69,109,117,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-2,-1,0,0,2,0,4,0,-2,-1,21,0,29,0,33,0,37,0,-1,-1,48,0,65,0,69,0,73,0,80,0,-1,-1,82,0,89,0,-1,-1,93,0,-2,-1,97,0,101,0,-1,-1,-1,-1,-2,-1,-2,-1,105,0,110,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,119,0,124,0,-127,0,-122,0,-2,-1,-113,0,-108,0,-1,-1,-2,-1,-99,0,-93,0,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-87,0,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-81,0,-1,-1,-76,0,-1,-1,-1,-1,-1,-1,-1,-1,-72,0,-67,0,-61,0,-56,0,-51,0,-46,0,-41,0,-35,0,-29,0,-23,0,-17,0,-12,0,-1,-1,-7,0,-1,-1,-3,0,2,1,7,1,11,1,18,1,-1,-1,25,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,29,1,38,1,47,1,56,1,65,1,74,1,83,1,92,1,101,1,110,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,119,1,-2,-1,-2,-1,-1,-1,-1,-1,-117,1,-114,1,-103,1,-100,1,-98,1,-95,1,-2,-1,-1,-1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-50,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-46,1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-42,1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-26,1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-12,1,-5,1,-1,-1,-1,-1,2,2,-1,-1,9,2,-1,-1,-1,-1,-1,-1,16,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,2,29,2,35,2,41,2,47,2,53,2,59,2,65,2,71,2,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-52,2,-46,2,-40,2,-34,2,-28,2,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-22,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-17,2,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-8,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,3,3,17,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,51,56,59,53,59,37,112,49,37,100,109,0,27,91,52,56,59,53,59,37,112,49,37,100,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,61,0,38,0,15,0,-99,1,80,3,99,111,110,101,109,117,124,65,78,73,83,32,88,51,46,54,52,32,97,110,100,32,88,116,101,114,109,32,50,53,54,32,99,111,108,111,114,115,32,102,111,114,32,67,111,110,69,109,117,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-2,-1,0,0,2,0,4,0,-2,-1,21,0,29,0,33,0,37,0,-1,-1,48,0,65,0,69,0,73,0,80,0,-1,-1,82,0,89,0,-1,-1,93,0,-2,-1,97,0,101,0,-1,-1,-1,-1,-2,-1,-2,-1,105,0,110,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,119,0,124,0,-127,0,-122,0,-2,-1,-113,0,-108,0,-1,-1,-2,-1,-99,0,-93,0,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-87,0,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-81,0,-1,-1,-76,0,-1,-1,-1,-1,-1,-1,-1,-1,-72,0,-67,0,-61,0,-56,0,-51,0,-46,0,-41,0,-35,0,-29,0,-23,0,-17,0,-12,0,-1,-1,-7,0,-1,-1,-3,0,2,1,7,1,11,1,18,1,-1,-1,25,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,29,1,-1,-1,32,1,41,1,50,1,59,1,68,1,77,1,86,1,95,1,104,1,113,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,122,1,-2,-1,-2,-1,-1,-1,-1,-1,-114,1,-111,1,-100,1,-97,1,-95,1,-92,1,-2,-1,-1,-1,-49,1,-1,-1,-1,-1,-1,-1,-1,-1,-47,1,-43,1,-39,1,-35,1,-31,1,-1,-1,-1,-1,-2,-1,-1,-1,-27,1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-23,1,-18,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-14,1,-1,-1,-1,-1,-7,1,-1,-1,-1,-1,-1,-1,-1,-1,0,2,7,2,14,2,-1,-1,-1,-1,21,2,-1,-1,28,2,-1,-1,-1,-1,-1,-1,35,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,42,2,48,2,54,2,60,2,66,2,72,2,78,2,84,2,90,2,96,2,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-94,2,-88,2,-82,2,-76,2,-70,2,-64,2,-58,2,-52,2,-46,2,-40,2,-33,2,-27,2,-21,2,-15,2,-9,2,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-3,2,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,9,3,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,18,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,29,3,43,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,79,119,0,27,79,121,0,27,91,71,0,27,79,113,0,27,79,115,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,51,56,59,53,59,37,112,49,37,100,109,0,27,91,52,56,59,53,59,37,112,49,37,100,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,2,0,0,0,74,0,92,0,-46,1,1,1,-2,-1,-2,-1,0,0,-2,-1,5,0,11,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,28,0,32,0,36,0,40,0,44,0,48,0,52,0,56,0,60,0,64,0,68,0,72,0,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // cygwin|ANSI emulation for Cygwin, @@ -392,7 +399,7 @@ static const int8_t conemu_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t cygwin_terminfo[] = { - 26,1,33,0,21,0,15,0,125,1,-108,2,99,121,103,119,105,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,67,121,103,119,105,110,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,65,0,69,0,-1,-1,-1,-1,73,0,-1,-1,79,0,84,0,-1,-1,-1,-1,93,0,98,0,-1,-1,103,0,108,0,113,0,-1,-1,118,0,124,0,-124,0,-1,-1,-111,0,-106,0,-100,0,-1,-1,-1,-1,-94,0,-1,-1,-1,-1,-1,-1,-1,-1,-92,0,-88,0,-1,-1,-84,0,-1,-1,-1,-1,-1,-1,-82,0,-1,-1,-77,0,-1,-1,-1,-1,-1,-1,-1,-1,-73,0,-68,0,-62,0,-57,0,-52,0,-47,0,-42,0,-36,0,-30,0,-24,0,-18,0,-13,0,-1,-1,-8,0,-1,-1,-4,0,1,1,6,1,-1,-1,-1,-1,-1,-1,10,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,1,-1,-1,17,1,26,1,35,1,44,1,-1,-1,53,1,62,1,71,1,-1,-1,80,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,89,1,-1,-1,-1,-1,-1,-1,95,1,98,1,109,1,112,1,114,1,117,1,-1,-1,-1,-1,-64,1,-62,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-1,-1,-1,-1,-54,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,2,92,2,97,2,103,2,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,2,126,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,2,-114,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,7,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,9,0,27,93,59,0,27,91,71,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0 // NOLINT + 26,1,33,0,21,0,15,0,125,1,-108,2,99,121,103,119,105,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,67,121,103,119,105,110,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,65,0,69,0,-1,-1,-1,-1,73,0,-1,-1,79,0,84,0,-1,-1,-1,-1,93,0,98,0,-1,-1,103,0,108,0,113,0,-1,-1,118,0,124,0,-124,0,-1,-1,-111,0,-106,0,-100,0,-1,-1,-1,-1,-94,0,-1,-1,-1,-1,-1,-1,-1,-1,-92,0,-88,0,-1,-1,-84,0,-1,-1,-1,-1,-1,-1,-82,0,-1,-1,-77,0,-1,-1,-1,-1,-1,-1,-1,-1,-73,0,-68,0,-62,0,-57,0,-52,0,-47,0,-42,0,-36,0,-30,0,-24,0,-18,0,-13,0,-1,-1,-8,0,-1,-1,-4,0,1,1,6,1,-1,-1,-1,-1,-1,-1,10,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,1,-1,-1,17,1,26,1,35,1,44,1,-1,-1,53,1,62,1,71,1,-1,-1,80,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,89,1,-1,-1,-1,-1,-1,-1,95,1,98,1,109,1,112,1,114,1,117,1,-1,-1,-1,-1,-64,1,-62,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-1,-1,-1,-1,-54,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,2,92,2,97,2,103,2,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,2,126,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,2,-114,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,7,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,9,0,27,93,59,0,27,91,71,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0 }; // interix|opennt|opennt-25|ntconsole|ntconsole-25|OpenNT-term compatible with color, @@ -517,7 +524,6 @@ static const int8_t cygwin_terminfo[] = { // parm_right_cursor=\E[%p1%dC, // parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, -// repeat_char=%p1%c\E[%p2%{1}%-%db, // reset_1string=\Ec, // restore_cursor=\E[u, // save_cursor=\E[s, @@ -527,7 +533,7 @@ static const int8_t cygwin_terminfo[] = { // set_a_foreground=\E[3%p1%dm, // tab=^I, static const int8_t interix_8colour_terminfo[] = { - 26,1,82,0,29,0,16,0,105,1,116,2,105,110,116,101,114,105,120,124,111,112,101,110,110,116,124,111,112,101,110,110,116,45,50,53,124,110,116,99,111,110,115,111,108,101,124,110,116,99,111,110,115,111,108,101,45,50,53,124,79,112,101,110,78,84,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,80,0,8,0,25,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,9,0,13,0,-1,-1,-1,-1,17,0,34,0,36,0,-1,-1,40,0,-1,-1,-1,-1,44,0,48,0,52,0,-1,-1,-1,-1,56,0,-1,-1,-1,-1,-1,-1,-1,-1,60,0,65,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,73,0,78,0,83,0,-1,-1,-1,-1,88,0,93,0,-1,-1,-1,-1,105,0,109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,0,-1,-1,117,0,-1,-1,-1,-1,-1,-1,119,0,-1,-1,121,0,-1,-1,-1,-1,-1,-1,125,0,-127,0,-123,0,-119,0,-115,0,-111,0,-107,0,-103,0,-99,0,-95,0,-91,0,-87,0,-83,0,-1,-1,-79,0,-75,0,-71,0,-67,0,-63,0,-59,0,-55,0,-1,-1,-51,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-47,0,-1,-1,-1,-1,-44,0,-35,0,-1,-1,-26,0,-17,0,-8,0,1,1,10,1,19,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,1,48,1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,55,1,59,1,63,1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,69,1,-1,-1,-124,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-108,1,-104,1,-100,1,-96,1,-92,1,-88,1,-84,1,-80,1,-76,1,-72,1,-68,1,-64,1,-60,1,-56,1,-52,1,-48,1,-44,1,-40,1,-36,1,-32,1,-28,1,-24,1,-20,1,-16,1,-12,1,-8,1,-4,1,0,2,4,2,8,2,12,2,16,2,20,2,24,2,28,2,32,2,36,2,40,2,44,2,48,2,52,2,56,2,60,2,64,2,68,2,72,2,76,2,80,2,84,2,88,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,2,106,2,7,0,13,0,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,85,0,27,91,65,0,27,91,77,0,27,91,49,109,0,27,91,115,27,91,49,98,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,48,109,0,27,91,50,98,27,91,117,13,27,91,75,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,127,0,27,91,66,0,27,70,65,0,27,70,49,0,27,70,65,0,27,70,50,0,27,70,51,0,27,70,52,0,27,70,53,0,27,70,54,0,27,70,55,0,27,70,56,0,27,70,57,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,85,0,27,91,84,0,27,91,83,0,27,91,67,0,27,70,43,0,27,70,45,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,0,27,91,117,0,27,91,115,0,27,91,83,0,27,91,84,0,9,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,85,0,27,70,94,0,27,70,36,0,27,70,66,0,27,70,67,0,27,70,68,0,27,70,69,0,27,70,70,0,27,70,71,0,27,70,72,0,27,70,73,0,27,70,74,0,27,70,75,0,27,70,76,0,27,70,77,0,27,70,78,0,27,70,79,0,27,70,80,0,27,70,81,0,27,70,82,0,27,70,83,0,27,70,84,0,27,70,85,0,27,70,86,0,27,70,87,0,27,70,88,0,27,70,89,0,27,70,90,0,27,70,97,0,27,70,98,0,27,70,99,0,27,70,100,0,27,70,101,0,27,70,102,0,27,70,103,0,27,70,104,0,27,70,105,0,27,70,106,0,27,70,107,0,27,70,109,0,27,70,110,0,27,70,111,0,27,70,112,0,27,70,113,0,27,70,114,0,27,70,115,0,27,70,116,0,27,70,117,0,27,70,118,0,27,70,119,0,27,70,120,0,27,70,121,0,27,70,122,0,27,91,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0 // NOLINT + 26,1,82,0,29,0,16,0,105,1,96,2,105,110,116,101,114,105,120,124,111,112,101,110,110,116,124,111,112,101,110,110,116,45,50,53,124,110,116,99,111,110,115,111,108,101,124,110,116,99,111,110,115,111,108,101,45,50,53,124,79,112,101,110,78,84,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,80,0,8,0,25,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,9,0,13,0,-1,-1,-1,-1,17,0,34,0,36,0,-1,-1,40,0,-1,-1,-1,-1,44,0,48,0,52,0,-1,-1,-1,-1,56,0,-1,-1,-1,-1,-1,-1,-1,-1,60,0,65,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,73,0,78,0,83,0,-1,-1,-1,-1,88,0,93,0,-1,-1,-1,-1,105,0,109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,0,-1,-1,117,0,-1,-1,-1,-1,-1,-1,119,0,-1,-1,121,0,-1,-1,-1,-1,-1,-1,125,0,-127,0,-123,0,-119,0,-115,0,-111,0,-107,0,-103,0,-99,0,-95,0,-91,0,-87,0,-83,0,-1,-1,-79,0,-75,0,-71,0,-67,0,-63,0,-59,0,-55,0,-1,-1,-51,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-47,0,-1,-1,-1,-1,-44,0,-35,0,-1,-1,-26,0,-17,0,-8,0,1,1,10,1,19,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,35,1,39,1,43,1,-1,-1,-1,-1,-1,-1,47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,1,-1,-1,112,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-124,1,-120,1,-116,1,-112,1,-108,1,-104,1,-100,1,-96,1,-92,1,-88,1,-84,1,-80,1,-76,1,-72,1,-68,1,-64,1,-60,1,-56,1,-52,1,-48,1,-44,1,-40,1,-36,1,-32,1,-28,1,-24,1,-20,1,-16,1,-12,1,-8,1,-4,1,0,2,4,2,8,2,12,2,16,2,20,2,24,2,28,2,32,2,36,2,40,2,44,2,48,2,52,2,56,2,60,2,64,2,68,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,86,2,7,0,13,0,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,85,0,27,91,65,0,27,91,77,0,27,91,49,109,0,27,91,115,27,91,49,98,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,48,109,0,27,91,50,98,27,91,117,13,27,91,75,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,127,0,27,91,66,0,27,70,65,0,27,70,49,0,27,70,65,0,27,70,50,0,27,70,51,0,27,70,52,0,27,70,53,0,27,70,54,0,27,70,55,0,27,70,56,0,27,70,57,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,85,0,27,91,84,0,27,91,83,0,27,91,67,0,27,70,43,0,27,70,45,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,91,117,0,27,91,115,0,27,91,83,0,27,91,84,0,9,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,85,0,27,70,94,0,27,70,36,0,27,70,66,0,27,70,67,0,27,70,68,0,27,70,69,0,27,70,70,0,27,70,71,0,27,70,72,0,27,70,73,0,27,70,74,0,27,70,75,0,27,70,76,0,27,70,77,0,27,70,78,0,27,70,79,0,27,70,80,0,27,70,81,0,27,70,82,0,27,70,83,0,27,70,84,0,27,70,85,0,27,70,86,0,27,70,87,0,27,70,88,0,27,70,89,0,27,70,90,0,27,70,97,0,27,70,98,0,27,70,99,0,27,70,100,0,27,70,101,0,27,70,102,0,27,70,103,0,27,70,104,0,27,70,105,0,27,70,106,0,27,70,107,0,27,70,109,0,27,70,110,0,27,70,111,0,27,70,112,0,27,70,113,0,27,70,114,0,27,70,115,0,27,70,116,0,27,70,117,0,27,70,118,0,27,70,119,0,27,70,120,0,27,70,121,0,27,70,122,0,27,91,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0 }; // iTerm2.app|iterm2|terminal emulator for Mac OS X, @@ -670,7 +676,7 @@ static const int8_t interix_8colour_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t iterm_256colour_terminfo[] = { - 30,2,49,0,29,0,15,0,105,1,-29,3,105,84,101,114,109,50,46,97,112,112,124,105,116,101,114,109,50,124,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,32,102,111,114,32,77,97,99,32,79,83,32,88,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,95,0,-1,-1,99,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-109,0,-104,0,-1,-1,-1,-1,-99,0,-94,0,-89,0,-1,-1,-84,0,-82,0,-77,0,-1,-1,-59,0,-54,0,-48,0,-42,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-22,0,-18,0,-1,-1,-14,0,-1,-1,-1,-1,-1,-1,-12,0,-1,-1,-7,0,-1,-1,-1,-1,-1,-1,-1,-1,-3,0,1,1,7,1,11,1,15,1,19,1,25,1,31,1,37,1,43,1,49,1,-1,-1,-1,-1,53,1,-1,-1,57,1,62,1,67,1,71,1,78,1,-1,-1,85,1,89,1,97,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,1,-1,-1,108,1,117,1,126,1,-121,1,-112,1,-103,1,-94,1,-85,1,-76,1,-67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-32,1,-29,1,-18,1,-15,1,-13,1,-10,1,68,2,-1,-1,71,2,73,2,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,78,2,-1,-1,-127,2,-1,-1,-1,-1,-123,2,-117,2,-1,-1,-1,-1,-111,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-104,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-93,2,-1,-1,-86,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,2,-66,2,-60,2,-53,2,-46,2,-39,2,-32,2,-24,2,-16,2,-8,2,0,3,8,3,16,3,24,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,3,48,3,53,3,72,3,76,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,85,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,3,-1,-1,-1,-1,-1,-1,100,3,-93,3,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,50,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,7,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,50,59,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,79,70,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,49,59,50,68,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,1,0,0,0,33,0,67,0,-37,1,0,0,0,0,5,0,32,0,37,0,45,0,52,0,59,0,66,0,74,0,81,0,88,0,96,0,104,0,111,0,119,0,126,0,-123,0,-115,0,-107,0,-102,0,-94,0,-87,0,-80,0,-74,0,-68,0,-63,0,-55,0,-48,0,-41,0,-36,0,-28,0,-21,0,-14,0,0,0,3,0,6,0,9,0,14,0,19,0,24,0,29,0,35,0,41,0,47,0,53,0,59,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,107,0,113,0,119,0,125,0,-125,0,-119,0,-113,0,-107,0,-101,0,-95,0,-90,0,-85,0,-80,0,-75,0,27,93,50,59,0,27,91,63,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,27,91,66,0,27,91,49,59,49,48,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,57,70,0,27,91,49,59,49,48,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,49,51,70,0,27,91,49,59,49,52,70,0,27,91,49,59,57,72,0,27,91,49,59,49,48,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,49,51,72,0,27,91,49,59,49,52,72,0,27,27,91,68,0,27,91,49,59,49,48,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,27,91,54,126,0,27,27,91,53,126,0,27,27,91,67,0,27,91,49,59,49,48,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,27,91,65,0,27,91,49,59,49,48,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,77,37,63,37,112,52,37,116,51,37,101,37,112,51,37,39,32,39,37,43,37,99,37,59,37,112,50,37,39,33,39,37,43,37,99,37,112,49,37,39,33,39,37,43,37,99,0,65,88,0,84,83,0,88,77,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,78,88,84,51,0,107,80,82,86,51,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,120,109,0 // NOLINT + 30,2,49,0,29,0,15,0,105,1,-29,3,105,84,101,114,109,50,46,97,112,112,124,105,116,101,114,109,50,124,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,32,102,111,114,32,77,97,99,32,79,83,32,88,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,95,0,-1,-1,99,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-109,0,-104,0,-1,-1,-1,-1,-99,0,-94,0,-89,0,-1,-1,-84,0,-82,0,-77,0,-1,-1,-59,0,-54,0,-48,0,-42,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-22,0,-18,0,-1,-1,-14,0,-1,-1,-1,-1,-1,-1,-12,0,-1,-1,-7,0,-1,-1,-1,-1,-1,-1,-1,-1,-3,0,1,1,7,1,11,1,15,1,19,1,25,1,31,1,37,1,43,1,49,1,-1,-1,-1,-1,53,1,-1,-1,57,1,62,1,67,1,71,1,78,1,-1,-1,85,1,89,1,97,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,1,-1,-1,108,1,117,1,126,1,-121,1,-112,1,-103,1,-94,1,-85,1,-76,1,-67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-32,1,-29,1,-18,1,-15,1,-13,1,-10,1,68,2,-1,-1,71,2,73,2,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,78,2,-1,-1,-127,2,-1,-1,-1,-1,-123,2,-117,2,-1,-1,-1,-1,-111,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-104,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-93,2,-1,-1,-86,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,2,-66,2,-60,2,-53,2,-46,2,-39,2,-32,2,-24,2,-16,2,-8,2,0,3,8,3,16,3,24,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,3,48,3,53,3,72,3,76,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,85,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,3,-1,-1,-1,-1,-1,-1,100,3,-93,3,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,50,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,7,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,50,59,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,79,70,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,49,59,50,68,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,0,0,0,0,33,0,66,0,-37,1,0,0,5,0,32,0,37,0,45,0,52,0,59,0,66,0,74,0,81,0,88,0,96,0,104,0,111,0,119,0,126,0,-123,0,-115,0,-107,0,-102,0,-94,0,-87,0,-80,0,-74,0,-68,0,-63,0,-55,0,-48,0,-41,0,-36,0,-28,0,-21,0,-14,0,0,0,3,0,6,0,11,0,16,0,21,0,26,0,32,0,38,0,44,0,50,0,56,0,62,0,68,0,74,0,80,0,86,0,92,0,98,0,104,0,110,0,116,0,122,0,-128,0,-122,0,-116,0,-110,0,-104,0,-98,0,-93,0,-88,0,-83,0,-78,0,27,93,50,59,0,27,91,63,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,27,91,66,0,27,91,49,59,49,48,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,57,70,0,27,91,49,59,49,48,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,49,51,70,0,27,91,49,59,49,52,70,0,27,91,49,59,57,72,0,27,91,49,59,49,48,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,49,51,72,0,27,91,49,59,49,52,72,0,27,27,91,68,0,27,91,49,59,49,48,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,27,91,54,126,0,27,27,91,53,126,0,27,27,91,67,0,27,91,49,59,49,48,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,27,91,65,0,27,91,49,59,49,48,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,77,37,63,37,112,52,37,116,37,112,51,37,101,37,123,51,125,37,59,37,39,32,39,37,43,37,99,37,112,50,37,39,33,39,37,43,37,99,37,112,49,37,39,33,39,37,43,37,99,0,84,83,0,88,77,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,78,88,84,51,0,107,80,82,86,51,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,120,109,0 }; // linux|linux console, @@ -686,7 +692,7 @@ static const int8_t iterm_256colour_terminfo[] = { // max_colors#8, // max_pairs#64, // no_color_video#18, -// acs_chars=++\054\054--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~, +// acs_chars=++\054\054--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, // bell=^G, // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, @@ -792,7 +798,7 @@ static const int8_t iterm_256colour_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t linux_16colour_terminfo[] = { - 26,1,20,0,29,0,16,0,125,1,69,3,108,105,110,117,120,124,108,105,110,117,120,32,99,111,110,115,111,108,101,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,18,0,-1,-1,0,0,2,0,4,0,21,0,26,0,33,0,37,0,41,0,-1,-1,52,0,69,0,71,0,75,0,87,0,-1,-1,89,0,101,0,-1,-1,105,0,109,0,121,0,125,0,-1,-1,-1,-1,-127,0,-125,0,-120,0,-1,-1,-1,-1,-115,0,-110,0,-1,-1,-1,-1,-105,0,-100,0,-95,0,-90,0,-81,0,-79,0,-1,-1,-1,-1,-74,0,-69,0,-63,0,-57,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,0,-35,0,-1,-1,-31,0,-1,-1,-1,-1,-1,-1,-29,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-20,0,-15,0,-9,0,-4,0,1,1,6,1,11,1,17,1,23,1,29,1,35,1,40,1,-1,-1,45,1,-1,-1,49,1,54,1,59,1,-1,-1,-1,-1,-1,-1,63,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,70,1,79,1,88,1,97,1,-1,-1,106,1,115,1,124,1,-1,-1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-114,1,-1,-1,-1,-1,-1,-1,-108,1,-105,1,-94,1,-91,1,-89,1,-86,1,1,2,-1,-1,4,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,2,-1,-1,-1,-1,-1,-1,-1,-1,10,2,-1,-1,77,2,-1,-1,-1,-1,81,2,87,2,-1,-1,-1,-1,93,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,97,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,102,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,2,110,2,116,2,122,2,-128,2,-122,2,-116,2,-110,2,-104,2,-98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-87,2,-76,2,-71,2,-65,2,-61,2,-52,2,-48,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,33,3,-1,-1,-1,-1,-1,-1,37,3,47,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,3,63,3,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,27,91,63,49,99,0,8,0,27,91,63,50,53,104,27,91,63,48,99,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,27,91,63,56,99,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,54,37,116,59,49,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,71,0,43,43,44,44,45,45,46,46,48,48,95,95,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,99,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,93,80,37,112,49,37,120,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,0,27,91,77,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0,0,3,0,1,0,12,0,28,0,63,0,1,0,0,0,1,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,33,0,39,0,43,0,47,0,51,0,55,0,27,91,51,74,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,84,83,0,88,77,0,107,69,78,68,53,0,107,72,79,77,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 26,1,20,0,29,0,16,0,125,1,67,3,108,105,110,117,120,124,108,105,110,117,120,32,99,111,110,115,111,108,101,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,18,0,-1,-1,0,0,2,0,4,0,21,0,26,0,33,0,37,0,41,0,-1,-1,52,0,69,0,71,0,75,0,87,0,-1,-1,89,0,101,0,-1,-1,105,0,109,0,121,0,125,0,-1,-1,-1,-1,-127,0,-125,0,-120,0,-1,-1,-1,-1,-115,0,-110,0,-1,-1,-1,-1,-105,0,-100,0,-95,0,-90,0,-81,0,-79,0,-1,-1,-1,-1,-74,0,-69,0,-63,0,-57,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,0,-35,0,-1,-1,-31,0,-1,-1,-1,-1,-1,-1,-29,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-20,0,-15,0,-9,0,-4,0,1,1,6,1,11,1,17,1,23,1,29,1,35,1,40,1,-1,-1,45,1,-1,-1,49,1,54,1,59,1,-1,-1,-1,-1,-1,-1,63,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,70,1,79,1,88,1,97,1,-1,-1,106,1,115,1,124,1,-1,-1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-114,1,-1,-1,-1,-1,-1,-1,-108,1,-105,1,-94,1,-91,1,-89,1,-86,1,1,2,-1,-1,4,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,2,-1,-1,-1,-1,-1,-1,-1,-1,10,2,-1,-1,75,2,-1,-1,-1,-1,79,2,85,2,-1,-1,-1,-1,91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,95,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-94,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-89,2,-78,2,-73,2,-67,2,-63,2,-54,2,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,3,-1,-1,-1,-1,-1,-1,35,3,45,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,3,61,3,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,27,91,63,49,99,0,8,0,27,91,63,50,53,104,27,91,63,48,99,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,27,91,63,56,99,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,54,37,116,59,49,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,71,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,93,80,37,112,49,37,120,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,0,27,91,77,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0,0,1,0,1,0,1,0,4,0,14,0,1,0,1,0,0,0,0,0,3,0,6,0,27,91,51,74,0,65,88,0,85,56,0,69,51,0 }; // putty-256color|PuTTY 0.58 with xterm 256-colors, @@ -855,12 +861,18 @@ static const int8_t linux_16colour_terminfo[] = { // from_status_line=^G, // init_2string=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R, // insert_line=\E[L, -// key_b2=\E[G, +// key_a1=\EOq, +// key_a3=\EOs, +// key_b2=\EOr, // key_backspace=\177, // key_btab=\E[Z, +// key_c1=\EOp, +// key_c3=\EOn, // key_dc=\E[3~, // key_down=\EOB, // key_end=\E[4~, +// key_enter=\EOM, +// key_f0=\EOy, // key_f1=\E[11~, // key_f10=\E[21~, // key_f11=\E[23~, @@ -884,14 +896,12 @@ static const int8_t linux_16colour_terminfo[] = { // key_home=\E[1~, // key_ic=\E[2~, // key_left=\EOD, -// key_mouse=\E[M, +// key_mouse=\E[<, // key_npage=\E[6~, // key_ppage=\E[5~, // key_right=\EOC, // key_sf=\E[B, -// key_sleft=\E[D, // key_sr=\E[A, -// key_sright=\E[C, // key_suspend=^Z, // key_up=\EOA, // keypad_local=\E[?1l\E>, @@ -908,6 +918,7 @@ static const int8_t linux_16colour_terminfo[] = { // parm_right_cursor=\E[%p1%dC, // parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, +// repeat_char=%p1%c\E[%p2%{1}%-%db, // reset_2string=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l, // restore_cursor=\E8, // row_address=\E[%i%p1%dd, @@ -928,7 +939,7 @@ static const int8_t linux_16colour_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t putty_256colour_terminfo[] = { - 30,2,48,0,29,0,16,0,125,1,-106,4,112,117,116,116,121,45,50,53,54,99,111,108,111,114,124,80,117,84,84,89,32,48,46,53,56,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,-1,-1,-1,8,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,22,0,0,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-1,-1,-120,0,-1,-1,-1,-1,-115,0,-110,0,-105,0,-100,0,-91,0,-89,0,-84,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-38,0,-1,-1,-36,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,2,1,-1,-1,-1,-1,-1,-1,4,1,-1,-1,9,1,-1,-1,-1,-1,-1,-1,-1,-1,13,1,19,1,25,1,31,1,37,1,43,1,49,1,55,1,61,1,67,1,73,1,78,1,-1,-1,83,1,-1,-1,87,1,92,1,97,1,101,1,105,1,-1,-1,109,1,113,1,121,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,1,-1,-1,-124,1,-115,1,-106,1,-1,-1,-97,1,-88,1,-79,1,-70,1,-61,1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-43,1,-1,-1,-1,-1,-10,1,-7,1,4,2,7,2,9,2,12,2,84,2,-1,-1,87,2,89,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,94,2,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-107,2,-1,-1,-1,-1,-103,2,-97,2,-1,-1,-1,-1,-91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-84,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-77,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-63,2,-57,2,-51,2,-45,2,-39,2,-33,2,-27,2,-21,2,-15,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,2,7,3,12,3,18,3,22,3,31,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,35,3,-1,-1,-1,-1,-1,-1,39,3,102,3,-1,-1,-1,-1,-1,-1,-90,3,-84,3,-78,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,3,-118,4,-112,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,68,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,55,27,91,114,27,91,109,27,91,63,55,104,27,91,63,49,59,52,59,54,108,27,91,52,108,27,56,27,62,27,93,82,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,66,0,27,91,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,60,27,91,34,112,27,91,53,48,59,54,34,112,27,99,27,91,63,51,108,27,93,82,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,54,37,124,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,27,91,71,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,91,52,126,0,26,0,27,91,68,0,27,91,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,49,48,109,0,27,91,49,49,109,0,27,91,49,50,109,0,37,63,37,112,49,37,123,56,125,37,61,37,116,27,37,37,71,-30,-105,-104,27,37,37,64,37,101,37,112,49,37,123,49,48,125,37,61,37,116,27,37,37,71,-30,-105,-103,27,37,37,64,37,101,37,112,49,37,123,49,50,125,37,61,37,116,27,37,37,71,-30,-103,-128,27,37,37,64,37,101,37,112,49,37,123,49,51,125,37,61,37,116,27,37,37,71,-30,-103,-86,27,37,37,64,37,101,37,112,49,37,123,49,52,125,37,61,37,116,27,37,37,71,-30,-103,-85,27,37,37,64,37,101,37,112,49,37,123,49,53,125,37,61,37,116,27,37,37,71,-30,-104,-68,27,37,37,64,37,101,37,112,49,37,123,50,55,125,37,61,37,116,27,37,37,71,-30,-122,-112,27,37,37,64,37,101,37,112,49,37,123,49,53,53,125,37,61,37,116,27,37,37,71,-32,-126,-94,27,37,37,64,37,101,37,112,49,37,99,37,59,0,27,91,49,49,109,0,27,91,49,48,109,0,3,0,1,0,60,0,124,0,74,1,0,0,1,0,1,0,0,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,45,0,50,0,55,0,60,0,65,0,70,0,74,0,79,0,84,0,89,0,94,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-109,0,-103,0,-97,0,-91,0,-85,0,-80,0,-75,0,-69,0,-63,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,25,1,30,1,35,1,40,1,45,1,49,1,53,1,57,1,61,1,27,91,51,74,0,27,93,48,59,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,51,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,48,0,29,0,16,0,125,1,-70,4,112,117,116,116,121,45,50,53,54,99,111,108,111,114,124,80,117,84,84,89,32,48,46,53,56,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,-1,-1,-1,8,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,22,0,0,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-1,-1,-120,0,-1,-1,-1,-1,-115,0,-110,0,-105,0,-100,0,-91,0,-89,0,-84,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-38,0,-1,-1,-36,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,2,1,-1,-1,-1,-1,-1,-1,4,1,-1,-1,9,1,-1,-1,-1,-1,-1,-1,13,1,17,1,23,1,29,1,35,1,41,1,47,1,53,1,59,1,65,1,71,1,77,1,82,1,-1,-1,87,1,-1,-1,91,1,96,1,101,1,105,1,109,1,-1,-1,113,1,117,1,125,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-123,1,-1,-1,-120,1,-111,1,-102,1,-1,-1,-93,1,-84,1,-75,1,-66,1,-57,1,-48,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,1,-1,-1,-19,1,-1,-1,-1,-1,14,2,17,2,28,2,31,2,33,2,36,2,108,2,-1,-1,111,2,113,2,-1,-1,-1,-1,-1,-1,118,2,122,2,126,2,-126,2,-122,2,-1,-1,-1,-1,-118,2,-1,-1,-67,2,-1,-1,-1,-1,-63,2,-57,2,-1,-1,-1,-1,-51,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-44,2,-39,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-35,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,2,-27,2,-21,2,-15,2,-9,2,-3,2,3,3,9,3,15,3,21,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,43,3,48,3,54,3,58,3,67,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,71,3,-1,-1,-1,-1,-1,-1,75,3,-118,3,-1,-1,-1,-1,-1,-1,-54,3,-48,3,-42,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-36,3,-82,4,-76,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,68,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,55,27,91,114,27,91,109,27,91,63,55,104,27,91,63,49,59,52,59,54,108,27,91,52,108,27,56,27,62,27,93,82,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,121,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,66,0,27,91,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,60,27,91,34,112,27,91,53,48,59,54,34,112,27,99,27,91,63,51,108,27,93,82,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,54,37,124,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,27,79,113,0,27,79,115,0,27,79,114,0,27,79,112,0,27,79,110,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,91,52,126,0,27,79,77,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,49,48,109,0,27,91,49,49,109,0,27,91,49,50,109,0,37,63,37,112,49,37,123,56,125,37,61,37,116,27,37,37,71,-30,-105,-104,27,37,37,64,37,101,37,112,49,37,123,49,48,125,37,61,37,116,27,37,37,71,-30,-105,-103,27,37,37,64,37,101,37,112,49,37,123,49,50,125,37,61,37,116,27,37,37,71,-30,-103,-128,27,37,37,64,37,101,37,112,49,37,123,49,51,125,37,61,37,116,27,37,37,71,-30,-103,-86,27,37,37,64,37,101,37,112,49,37,123,49,52,125,37,61,37,116,27,37,37,71,-30,-103,-85,27,37,37,64,37,101,37,112,49,37,123,49,53,125,37,61,37,116,27,37,37,71,-30,-104,-68,27,37,37,64,37,101,37,112,49,37,123,50,55,125,37,61,37,116,27,37,37,71,-30,-122,-112,27,37,37,64,37,101,37,112,49,37,123,49,53,53,125,37,61,37,116,27,37,37,71,-32,-126,-94,27,37,37,64,37,101,37,112,49,37,99,37,59,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,1,0,20,0,42,0,-17,0,1,0,1,0,0,0,0,0,5,0,10,0,42,0,46,0,50,0,54,0,58,0,62,0,66,0,70,0,74,0,78,0,82,0,86,0,90,0,94,0,98,0,102,0,106,0,0,0,3,0,6,0,9,0,12,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,57,0,63,0,69,0,75,0,81,0,87,0,93,0,27,91,51,74,0,27,93,48,59,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,79,113,0,27,79,114,0,27,79,115,0,27,79,116,0,27,79,117,0,27,79,118,0,27,79,119,0,27,79,120,0,27,79,121,0,27,79,108,0,27,79,81,0,27,79,110,0,27,79,82,0,27,79,80,0,27,79,83,0,27,79,112,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,88,84,0,85,56,0,69,51,0,84,83,0,88,77,0,107,112,49,0,107,112,50,0,107,112,51,0,107,112,52,0,107,112,53,0,107,112,54,0,107,112,55,0,107,112,56,0,107,112,57,0,107,112,65,68,68,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,78,85,77,0,107,112,83,85,66,0,107,112,90,82,79,0,120,109,0 }; // rxvt-256color|rxvt 2.7.9 with xterm 256-colors, @@ -984,7 +995,6 @@ static const int8_t putty_256colour_terminfo[] = { // init_1string=\E[?47l\E=\E[?1l, // init_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, -// insert_character=\E[@, // insert_line=\E[L, // key_a1=\EOw, // key_a3=\EOy, @@ -1093,7 +1103,7 @@ static const int8_t putty_256colour_terminfo[] = { // user8=\E[?1;2c, // user9=\E[c, static const int8_t rxvt_256colour_terminfo[] = { - 30,2,47,0,38,0,15,0,110,1,-31,4,114,120,118,116,45,50,53,54,99,111,108,111,114,124,114,120,118,116,32,50,46,55,46,57,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-1,-1,0,0,2,0,4,0,21,0,26,0,34,0,38,0,42,0,-1,-1,53,0,70,0,72,0,76,0,83,0,-1,-1,85,0,92,0,-1,-1,96,0,-1,-1,-1,-1,100,0,-1,-1,-1,-1,104,0,106,0,111,0,116,0,-1,-1,-1,-1,125,0,-1,-1,-1,-1,-126,0,-121,0,-116,0,-1,-1,-111,0,-109,0,-104,0,-1,-1,-91,0,-86,0,-80,0,-74,0,-1,-1,-1,-1,-56,0,-42,0,-1,-1,-1,-1,-8,0,-4,0,-1,-1,0,1,-1,-1,-1,-1,-1,-1,2,1,-1,-1,7,1,-1,-1,11,1,-1,-1,16,1,22,1,28,1,34,1,40,1,46,1,52,1,58,1,64,1,70,1,76,1,82,1,87,1,-1,-1,92,1,-1,-1,96,1,101,1,106,1,110,1,114,1,-1,-1,118,1,122,1,125,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-1,-1,-101,1,-92,1,-83,1,-1,-1,-74,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65,1,-32,1,-1,-1,-1,-1,18,2,21,2,32,2,35,2,37,2,40,2,107,2,-1,-1,110,2,-1,-1,-1,-1,-1,-1,-1,-1,112,2,116,2,120,2,124,2,-128,2,-1,-1,-1,-1,-124,2,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-62,2,-57,2,-1,-1,-53,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,2,-1,-1,-43,2,-38,2,-1,-1,-1,-1,-1,-1,-1,-1,-33,2,-28,2,-23,2,-1,-1,-1,-1,-19,2,-1,-1,-14,2,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-5,2,1,3,7,3,13,3,19,3,25,3,31,3,37,3,43,3,49,3,55,3,61,3,67,3,73,3,79,3,85,3,91,3,97,3,103,3,109,3,115,3,121,3,127,3,-123,3,-117,3,-111,3,-105,3,-99,3,-93,3,-87,3,-81,3,-75,3,-69,3,-63,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-57,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,3,-41,3,-36,3,-28,3,-24,3,-15,3,-8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,4,-1,-1,-1,-1,-1,-1,90,4,-103,4,-1,-1,-1,-1,-1,-1,-39,4,-35,4,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,63,52,55,108,27,61,27,91,63,49,108,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,56,94,0,27,91,50,49,126,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,55,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,97,0,27,91,98,0,27,91,65,0,27,62,0,27,61,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,62,27,91,49,59,51,59,52,59,53,59,54,108,27,91,63,55,104,27,91,109,27,91,114,27,91,50,74,27,91,72,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,56,126,0,27,79,77,0,27,91,49,126,0,27,91,51,36,0,27,91,52,126,0,27,91,56,36,0,27,91,55,36,0,27,91,50,36,0,27,91,100,0,27,91,54,36,0,27,91,53,36,0,27,91,99,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,40,66,0,27,40,48,0,0,2,0,0,0,25,0,52,0,-27,0,1,1,-1,-1,-1,-1,0,0,5,0,10,0,14,0,18,0,23,0,28,0,33,0,38,0,43,0,48,0,52,0,57,0,62,0,67,0,72,0,76,0,80,0,84,0,88,0,92,0,96,0,-1,-1,0,0,3,0,6,0,9,0,12,0,17,0,22,0,26,0,31,0,37,0,43,0,49,0,55,0,60,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,105,0,110,0,114,0,118,0,122,0,126,0,27,91,51,94,0,27,91,51,64,0,27,91,98,0,27,79,98,0,27,91,56,94,0,27,91,56,64,0,27,91,55,94,0,27,91,55,64,0,27,91,50,94,0,27,91,50,64,0,27,79,100,0,27,91,54,94,0,27,91,54,64,0,27,91,53,94,0,27,91,53,64,0,27,79,99,0,27,91,97,0,27,79,97,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,65,88,0,88,84,0,84,83,0,88,77,0,107,68,67,53,0,107,68,67,54,0,107,68,78,0,107,68,78,53,0,107,69,78,68,53,0,107,69,78,68,54,0,107,72,79,77,53,0,107,72,79,77,54,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,53,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,53,0,107,85,80,0,107,85,80,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,47,0,38,0,15,0,110,1,-35,4,114,120,118,116,45,50,53,54,99,111,108,111,114,124,114,120,118,116,32,50,46,55,46,57,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-1,-1,0,0,2,0,4,0,21,0,26,0,34,0,38,0,42,0,-1,-1,53,0,70,0,72,0,76,0,83,0,-1,-1,85,0,92,0,-1,-1,96,0,-1,-1,-1,-1,100,0,-1,-1,-1,-1,104,0,106,0,111,0,116,0,-1,-1,-1,-1,125,0,-1,-1,-1,-1,-126,0,-121,0,-116,0,-1,-1,-111,0,-109,0,-104,0,-1,-1,-91,0,-86,0,-80,0,-74,0,-1,-1,-1,-1,-56,0,-42,0,-1,-1,-1,-1,-1,-1,-8,0,-1,-1,-4,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,3,1,-1,-1,7,1,-1,-1,12,1,18,1,24,1,30,1,36,1,42,1,48,1,54,1,60,1,66,1,72,1,78,1,83,1,-1,-1,88,1,-1,-1,92,1,97,1,102,1,106,1,110,1,-1,-1,114,1,118,1,121,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,1,-123,1,-114,1,-1,-1,-105,1,-96,1,-87,1,-1,-1,-78,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,1,-36,1,-1,-1,-1,-1,14,2,17,2,28,2,31,2,33,2,36,2,103,2,-1,-1,106,2,-1,-1,-1,-1,-1,-1,-1,-1,108,2,112,2,116,2,120,2,124,2,-1,-1,-1,-1,-128,2,-1,-1,-77,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-66,2,-61,2,-1,-1,-57,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,2,-1,-1,-47,2,-42,2,-1,-1,-1,-1,-1,-1,-1,-1,-37,2,-32,2,-27,2,-1,-1,-1,-1,-23,2,-1,-1,-18,2,-1,-1,-1,-1,-1,-1,-13,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-9,2,-3,2,3,3,9,3,15,3,21,3,27,3,33,3,39,3,45,3,51,3,57,3,63,3,69,3,75,3,81,3,87,3,93,3,99,3,105,3,111,3,117,3,123,3,-127,3,-121,3,-115,3,-109,3,-103,3,-97,3,-91,3,-85,3,-79,3,-73,3,-67,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-61,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-56,3,-45,3,-40,3,-32,3,-28,3,-19,3,-12,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,82,4,-1,-1,-1,-1,-1,-1,86,4,-107,4,-1,-1,-1,-1,-1,-1,-43,4,-39,4,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,63,52,55,108,27,61,27,91,63,49,108,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,56,94,0,27,91,50,49,126,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,55,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,97,0,27,91,98,0,27,91,65,0,27,62,0,27,61,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,62,27,91,49,59,51,59,52,59,53,59,54,108,27,91,63,55,104,27,91,109,27,91,114,27,91,50,74,27,91,72,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,56,126,0,27,79,77,0,27,91,49,126,0,27,91,51,36,0,27,91,52,126,0,27,91,56,36,0,27,91,55,36,0,27,91,50,36,0,27,91,100,0,27,91,54,36,0,27,91,53,36,0,27,91,99,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,40,66,0,27,40,48,0,0,2,0,0,0,22,0,46,0,-36,0,1,1,0,0,5,0,10,0,14,0,18,0,23,0,28,0,33,0,38,0,43,0,48,0,52,0,57,0,62,0,67,0,72,0,76,0,80,0,84,0,88,0,92,0,96,0,0,0,3,0,6,0,11,0,16,0,20,0,25,0,31,0,37,0,43,0,49,0,54,0,59,0,65,0,71,0,77,0,83,0,89,0,95,0,99,0,104,0,108,0,112,0,116,0,27,91,51,94,0,27,91,51,64,0,27,91,98,0,27,79,98,0,27,91,56,94,0,27,91,56,64,0,27,91,55,94,0,27,91,55,64,0,27,91,50,94,0,27,91,50,64,0,27,79,100,0,27,91,54,94,0,27,91,54,64,0,27,91,53,94,0,27,91,53,64,0,27,79,99,0,27,91,97,0,27,79,97,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,65,88,0,88,84,0,107,68,67,53,0,107,68,67,54,0,107,68,78,0,107,68,78,53,0,107,69,78,68,53,0,107,69,78,68,54,0,107,72,79,77,53,0,107,72,79,77,54,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,53,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,53,0,107,85,80,0,107,85,80,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0 }; // screen-256color|GNU Screen with 256 colors, @@ -1187,6 +1197,7 @@ static const int8_t rxvt_256colour_terminfo[] = { // parm_insert_line=\E[%p1%dL, // parm_left_cursor=\E[%p1%dD, // parm_right_cursor=\E[%p1%dC, +// parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, // reset_2string=\Ec\E[?1000l\E[?25h, // restore_cursor=\E8, @@ -1199,13 +1210,18 @@ static const int8_t rxvt_256colour_terminfo[] = { // set_attributes=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e^O%;, // set_tab=\EH, // tab=^I, +// user6=\E[%i%d;%dR, +// user7=\E[6n, +// user8=\E[?1;2c, +// user9=\E[c, static const int8_t screen_256colour_terminfo[] = { - 30,2,43,0,43,0,15,0,105,1,4,3,115,99,114,101,101,110,45,50,53,54,99,111,108,111,114,124,71,78,85,32,83,99,114,101,101,110,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,-1,-1,-1,-1,121,0,123,0,-128,0,-123,0,-1,-1,-114,0,-109,0,-1,-1,-1,-1,-104,0,-99,0,-94,0,-1,-1,-89,0,-87,0,-82,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-45,0,-1,-1,-1,-1,-1,-1,-43,0,-1,-1,-38,0,-1,-1,-1,-1,-1,-1,-1,-1,-34,0,-30,0,-24,0,-20,0,-16,0,-12,0,-6,0,0,1,6,1,12,1,18,1,23,1,-1,-1,28,1,-1,-1,32,1,37,1,42,1,-1,-1,-1,-1,-1,-1,46,1,50,1,58,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,1,-1,-1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-1,-1,-115,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-106,1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,17,2,-1,-1,20,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,2,-1,-1,87,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,103,2,109,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,120,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,2,-1,-1,-1,-1,-1,-1,-123,2,-60,2,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,51,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,51,109,0,27,91,50,52,109,0,27,103,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,49,37,116,59,51,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,3,0,1,0,33,0,70,0,-71,0,1,1,0,0,1,0,0,0,0,0,4,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,29,0,34,0,39,0,44,0,49,0,53,0,58,0,63,0,68,0,73,0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-102,0,-98,0,-94,0,-90,0,-86,0,27,40,66,0,27,40,37,112,49,37,99,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,83,48,0,84,83,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,53,0,107,72,79,77,53,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,43,0,43,0,15,0,105,1,41,3,115,99,114,101,101,110,45,50,53,54,99,111,108,111,114,124,71,78,85,32,83,99,114,101,101,110,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,-1,-1,-1,-1,121,0,123,0,-128,0,-123,0,-1,-1,-114,0,-109,0,-1,-1,-1,-1,-104,0,-99,0,-94,0,-1,-1,-89,0,-87,0,-82,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-45,0,-1,-1,-1,-1,-1,-1,-43,0,-1,-1,-38,0,-1,-1,-1,-1,-1,-1,-1,-1,-34,0,-30,0,-24,0,-20,0,-16,0,-12,0,-6,0,0,1,6,1,12,1,18,1,23,1,-1,-1,28,1,-1,-1,32,1,37,1,42,1,-1,-1,-1,-1,-1,-1,46,1,50,1,58,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,1,-1,-1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-97,1,-1,-1,-1,-1,-80,1,-77,1,-66,1,-63,1,-61,1,-58,1,26,2,-1,-1,29,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,2,-1,-1,96,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,112,2,118,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,2,-116,2,-111,2,-103,2,-99,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,2,-1,-1,-1,-1,-1,-1,-86,2,-23,2,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,51,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,51,109,0,27,91,50,52,109,0,27,103,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,49,37,116,59,51,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,2,0,1,0,2,0,7,0,27,0,1,1,1,0,0,0,0,0,4,0,0,0,3,0,6,0,9,0,12,0,27,40,66,0,27,40,37,112,49,37,99,0,65,88,0,71,48,0,85,56,0,69,48,0,83,48,0 }; // st-256color|stterm-256color|simpleterm with 256 colors, // auto_right_margin, // back_color_erase, +// can_change, // eat_newline_glitch, // has_status_line, // move_insert_mode, @@ -1232,10 +1248,9 @@ static const int8_t screen_256colour_terminfo[] = { // cursor_home=\E[H, // cursor_invisible=\E[?25l, // cursor_left=^H, -// cursor_normal=\E[?12l\E[?25h, +// cursor_normal=\E[?25h, // cursor_right=\E[C, // cursor_up=\E[A, -// cursor_visible=\E[?25h, // delete_character=\E[P, // delete_line=\E[M, // dis_status_line=\E]0;^G, @@ -1262,7 +1277,7 @@ static const int8_t screen_256colour_terminfo[] = { // flash_screen=\E[?5h$<100/>\E[?5l, // from_status_line=^G, // init_2string=\E[4l\E>\E[?1034l, -// initialize_color@, +// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, // insert_line=\E[L, // key_a1=\E[1~, // key_a3=\E[5~, @@ -1362,7 +1377,7 @@ static const int8_t screen_256colour_terminfo[] = { // key_up=\EOA, // keypad_local=\E[?1l\E>, // keypad_xmit=\E[?1h\E=, -// orig_colors@, +// orig_colors=\E]104^G, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, // parm_delete_line=\E[%p1%dM, @@ -1372,6 +1387,7 @@ static const int8_t screen_256colour_terminfo[] = { // parm_insert_line=\E[%p1%dL, // parm_left_cursor=\E[%p1%dD, // parm_right_cursor=\E[%p1%dC, +// parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, // print_screen=\E[i, // prtr_off=\E[4i, @@ -1394,7 +1410,7 @@ static const int8_t screen_256colour_terminfo[] = { // user8=\E[?1;2c, // user9=\E[c, static const int8_t st_256colour_terminfo[] = { - 30,2,55,0,29,0,15,0,105,1,-125,5,115,116,45,50,53,54,99,111,108,111,114,124,115,116,116,101,114,109,45,50,53,54,99,111,108,111,114,124,115,105,109,112,108,101,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,117,0,121,0,125,0,-1,-1,-125,0,-121,0,-116,0,-111,0,-1,-1,-102,0,-97,0,-92,0,-1,-1,-87,0,-82,0,-77,0,-72,0,-63,0,-59,0,-54,0,-1,-1,-45,0,-40,0,-34,0,-28,0,-1,-1,-10,0,-1,-1,-8,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,11,1,-1,-1,13,1,-1,-1,20,1,25,1,32,1,36,1,43,1,50,1,-1,-1,57,1,61,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,114,1,119,1,126,1,-1,-1,-126,1,-121,1,-116,1,-112,1,-105,1,-1,-1,-98,1,-94,1,-86,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-78,1,-69,1,-60,1,-51,1,-42,1,-33,1,-24,1,-15,1,-1,-1,-6,1,-1,-1,-1,-1,-1,-1,3,2,7,2,12,2,-1,-1,17,2,20,2,-1,-1,-1,-1,35,2,38,2,49,2,52,2,54,2,57,2,-106,2,-1,-1,-103,2,-101,2,-1,-1,-1,-1,-1,-1,-96,2,-91,2,-86,2,-82,2,-77,2,-1,-1,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,16,3,23,3,30,3,-1,-1,-1,-1,37,3,-1,-1,44,3,-1,-1,-1,-1,-1,-1,51,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,58,3,64,3,70,3,77,3,84,3,91,3,98,3,106,3,114,3,122,3,-126,3,-118,3,-110,3,-102,3,-94,3,-87,3,-80,3,-73,3,-66,3,-58,3,-50,3,-42,3,-34,3,-26,3,-18,3,-10,3,-2,3,5,4,12,4,19,4,26,4,34,4,42,4,50,4,58,4,66,4,74,4,82,4,90,4,97,4,104,4,111,4,118,4,126,4,-122,4,-114,4,-106,4,-98,4,-90,4,-82,4,-74,4,-67,4,-60,4,-53,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,4,-37,4,-32,4,-24,4,-20,4,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-11,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-6,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,-1,-1,-1,-1,-1,-1,4,5,67,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,91,76,0,127,0,27,91,51,59,53,126,0,27,91,51,126,0,27,91,51,59,50,126,0,27,79,66,0,27,91,50,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,53,70,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,50,59,53,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,27,99,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,93,48,59,0,27,91,49,126,0,27,91,53,126,0,27,79,117,0,27,91,52,126,0,27,91,54,126,0,43,67,44,68,45,65,46,66,48,69,96,96,97,97,102,102,103,103,104,70,105,71,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,71,0,-110,0,-1,1,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,18,0,24,0,34,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,39,0,-1,-1,46,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,53,0,-1,-1,60,0,-1,-1,-1,-1,67,0,-1,-1,74,0,-1,-1,-1,-1,81,0,-1,-1,88,0,-1,-1,-1,-1,95,0,-1,-1,102,0,-1,-1,-1,-1,-1,-1,109,0,-1,-1,116,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,123,0,-127,0,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,42,0,48,0,53,0,58,0,63,0,68,0,73,0,77,0,82,0,87,0,92,0,97,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-77,0,-72,0,-67,0,-62,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,67,1,72,1,77,1,82,1,87,1,92,1,96,1,100,1,104,1,108,1,113,1,118,1,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,49,59,51,66,0,27,91,49,59,53,66,0,27,91,49,59,51,68,0,27,91,49,59,53,68,0,27,91,54,59,51,126,0,27,91,54,59,53,126,0,27,91,53,59,51,126,0,27,91,53,59,53,126,0,27,91,49,59,51,67,0,27,91,49,59,53,67,0,27,91,49,59,51,65,0,27,91,49,59,53,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,55,0,29,0,15,0,105,1,-28,5,115,116,45,50,53,54,99,111,108,111,114,124,115,116,116,101,114,109,45,50,53,54,99,111,108,111,114,124,115,105,109,112,108,101,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,112,0,-1,-1,118,0,122,0,127,0,-124,0,-1,-1,-115,0,-110,0,-105,0,-1,-1,-100,0,-95,0,-90,0,-85,0,-76,0,-72,0,-67,0,-1,-1,-58,0,-53,0,-47,0,-41,0,-1,-1,-23,0,-1,-1,-21,0,-1,-1,-1,-1,-1,-1,-6,0,-1,-1,-2,0,-1,-1,0,1,-1,-1,7,1,12,1,19,1,23,1,30,1,37,1,-1,-1,44,1,48,1,54,1,58,1,62,1,66,1,72,1,78,1,84,1,90,1,96,1,101,1,106,1,113,1,-1,-1,117,1,122,1,127,1,-125,1,-118,1,-1,-1,-111,1,-107,1,-99,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-91,1,-82,1,-73,1,-64,1,-55,1,-46,1,-37,1,-28,1,-19,1,-10,1,-1,-1,-1,-1,-1,-1,-1,1,3,2,8,2,-1,-1,13,2,16,2,-1,-1,-1,-1,31,2,34,2,45,2,48,2,50,2,53,2,-110,2,-1,-1,-107,2,-105,2,-1,-1,-1,-1,-1,-1,-100,2,-95,2,-90,2,-86,2,-81,2,-1,-1,-1,-1,-76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,2,-1,-1,-1,-1,5,3,-1,-1,-1,-1,-1,-1,-1,-1,12,3,19,3,26,3,-1,-1,-1,-1,33,3,-1,-1,40,3,-1,-1,-1,-1,-1,-1,47,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,3,60,3,66,3,73,3,80,3,87,3,94,3,102,3,110,3,118,3,126,3,-122,3,-114,3,-106,3,-98,3,-91,3,-84,3,-77,3,-70,3,-62,3,-54,3,-46,3,-38,3,-30,3,-22,3,-14,3,-6,3,1,4,8,4,15,4,22,4,30,4,38,4,46,4,54,4,62,4,70,4,78,4,86,4,93,4,100,4,107,4,114,4,122,4,-126,4,-118,4,-110,4,-102,4,-94,4,-86,4,-78,4,-71,4,-64,4,-57,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,4,-41,4,-36,4,-28,4,-24,4,-15,4,-8,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,97,5,-1,-1,-1,-1,-1,-1,101,5,-92,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,91,76,0,127,0,27,91,51,59,53,126,0,27,91,51,126,0,27,91,51,59,50,126,0,27,79,66,0,27,91,50,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,53,70,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,50,59,53,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,27,99,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,93,48,59,0,27,91,49,126,0,27,91,53,126,0,27,79,117,0,27,91,52,126,0,27,91,54,126,0,43,67,44,68,45,65,46,66,48,69,96,96,97,97,102,102,103,103,104,70,105,71,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,1,0,0,0,18,0,37,0,-29,0,1,0,0,0,18,0,24,0,34,0,39,0,46,0,53,0,60,0,67,0,74,0,81,0,88,0,95,0,102,0,109,0,116,0,123,0,-127,0,0,0,3,0,6,0,9,0,12,0,15,0,20,0,25,0,31,0,37,0,43,0,49,0,55,0,61,0,67,0,73,0,78,0,83,0,88,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,49,59,51,66,0,27,91,49,59,53,66,0,27,91,49,59,51,68,0,27,91,49,59,53,68,0,27,91,54,59,51,126,0,27,91,54,59,53,126,0,27,91,53,59,51,126,0,27,91,53,59,53,126,0,27,91,49,59,51,67,0,27,91,49,59,53,67,0,27,91,49,59,51,65,0,27,91,49,59,53,65,0,27,91,50,57,109,0,27,91,57,109,0,88,84,0,77,115,0,83,101,0,83,115,0,84,83,0,107,68,78,51,0,107,68,78,53,0,107,76,70,84,51,0,107,76,70,84,53,0,107,78,88,84,51,0,107,78,88,84,53,0,107,80,82,86,51,0,107,80,82,86,53,0,107,82,73,84,51,0,107,82,73,84,53,0,107,85,80,51,0,107,85,80,53,0,114,109,120,120,0,115,109,120,120,0 }; // tmux-256color|tmux with 256 colors, @@ -1457,7 +1473,7 @@ static const int8_t st_256colour_terminfo[] = { // from_status_line=^G, // init_2string=\E)0, // insert_line=\E[L, -// key_backspace=^H, +// key_backspace=\177, // key_btab=\E[Z, // key_dc=\E[3~, // key_down=\EOB, @@ -1568,8 +1584,12 @@ static const int8_t st_256colour_terminfo[] = { // set_tab=\EH, // tab=^I, // to_status_line=\E]0;, +// user6=\E[%i%d;%dR, +// user7=\E[6n, +// user8=\E[?1;2c, +// user9=\E[c, static const int8_t tmux_256colour_terminfo[] = { - 30,2,35,0,43,0,15,0,105,1,-15,4,116,109,117,120,45,50,53,54,99,111,108,111,114,124,116,109,117,120,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,121,0,-1,-1,127,0,-127,0,-122,0,-117,0,-1,-1,-108,0,-103,0,-98,0,-1,-1,-93,0,-88,0,-83,0,-1,-1,-78,0,-76,0,-71,0,-1,-1,-62,0,-57,0,-51,0,-45,0,-1,-1,-42,0,-1,-1,-40,0,-1,-1,-1,-1,-1,-1,-36,0,-1,-1,-32,0,-1,-1,-1,-1,-1,-1,-30,0,-1,-1,-25,0,-1,-1,-1,-1,-1,-1,-1,-1,-21,0,-17,0,-11,0,-7,0,-3,0,1,1,7,1,13,1,19,1,25,1,31,1,36,1,-1,-1,41,1,-1,-1,45,1,50,1,55,1,59,1,66,1,-1,-1,73,1,77,1,85,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,93,1,-1,-1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-97,1,-1,-1,-88,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,1,-1,-1,-1,-1,-62,1,-59,1,-48,1,-45,1,-43,1,-40,1,49,2,-1,-1,52,2,54,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,2,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-121,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,2,-1,-1,-1,-1,-109,2,-1,-1,-1,-1,-1,-1,-1,-1,-102,2,-95,2,-88,2,-1,-1,-1,-1,-81,2,-1,-1,-74,2,-1,-1,-1,-1,-1,-1,-67,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-60,2,-54,2,-48,2,-41,2,-34,2,-27,2,-20,2,-12,2,-4,2,4,3,12,3,20,3,28,3,36,3,44,3,51,3,58,3,65,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,-128,3,-120,3,-113,3,-106,3,-99,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-36,3,-28,3,-21,3,-14,3,-7,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,56,4,64,4,71,4,78,4,85,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,99,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,4,-1,-1,-1,-1,-1,-1,114,4,-79,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,103,0,7,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,73,0,-106,0,65,3,1,1,0,0,1,0,0,0,0,0,7,0,19,0,23,0,28,0,46,0,54,0,60,0,70,0,-1,-1,-1,-1,-1,-1,75,0,82,0,89,0,96,0,103,0,110,0,117,0,124,0,-125,0,-118,0,-111,0,-104,0,-97,0,-90,0,-83,0,-76,0,-1,-1,-69,0,-62,0,-55,0,-48,0,-41,0,-1,-1,-34,0,-27,0,-20,0,-13,0,-6,0,1,1,8,1,15,1,22,1,29,1,36,1,43,1,50,1,57,1,64,1,71,1,78,1,85,1,92,1,99,1,106,1,113,1,120,1,127,1,-122,1,-115,1,-108,1,-101,1,-94,1,-87,1,-80,1,-1,-1,-1,-1,-1,-1,-1,-1,-73,1,-67,1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,40,66,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,40,37,112,49,37,99,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,35,0,43,0,15,0,105,1,13,5,116,109,117,120,45,50,53,54,99,111,108,111,114,124,116,109,117,120,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,121,0,-1,-1,127,0,-127,0,-122,0,-117,0,-1,-1,-108,0,-103,0,-98,0,-1,-1,-93,0,-88,0,-83,0,-1,-1,-78,0,-76,0,-71,0,-1,-1,-62,0,-57,0,-51,0,-45,0,-1,-1,-42,0,-1,-1,-40,0,-1,-1,-1,-1,-1,-1,-36,0,-1,-1,-32,0,-1,-1,-1,-1,-1,-1,-30,0,-1,-1,-25,0,-1,-1,-1,-1,-1,-1,-1,-1,-21,0,-17,0,-11,0,-7,0,-3,0,1,1,7,1,13,1,19,1,25,1,31,1,36,1,-1,-1,41,1,-1,-1,45,1,50,1,55,1,59,1,66,1,-1,-1,73,1,77,1,85,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,93,1,-1,-1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-97,1,-1,-1,-88,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,1,-1,-1,-1,-1,-62,1,-59,1,-48,1,-45,1,-43,1,-40,1,49,2,-1,-1,52,2,54,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,2,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-121,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,2,-1,-1,-1,-1,-109,2,-1,-1,-1,-1,-1,-1,-1,-1,-102,2,-95,2,-88,2,-1,-1,-1,-1,-81,2,-1,-1,-74,2,-1,-1,-1,-1,-1,-1,-67,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-60,2,-54,2,-48,2,-41,2,-34,2,-27,2,-20,2,-12,2,-4,2,4,3,12,3,20,3,28,3,36,3,44,3,51,3,58,3,65,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,-128,3,-120,3,-113,3,-106,3,-99,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-36,3,-28,3,-21,3,-14,3,-7,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,56,4,64,4,71,4,78,4,85,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,4,101,4,106,4,114,4,118,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-124,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-118,4,-1,-1,-1,-1,-1,-1,-114,4,-51,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,103,0,7,0,27,41,48,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,2,0,1,0,64,0,-125,0,33,3,1,1,1,0,0,0,0,0,7,0,19,0,23,0,28,0,46,0,54,0,60,0,71,0,81,0,86,0,93,0,100,0,107,0,114,0,121,0,-128,0,-121,0,-114,0,-107,0,-100,0,-93,0,-86,0,-79,0,-72,0,-65,0,-58,0,-51,0,-44,0,-37,0,-30,0,-23,0,-16,0,-9,0,-2,0,5,1,12,1,19,1,26,1,33,1,40,1,47,1,54,1,61,1,68,1,75,1,82,1,89,1,96,1,103,1,110,1,117,1,124,1,-125,1,-118,1,-111,1,-104,1,-97,1,-90,1,-83,1,-76,1,-69,1,-62,1,-56,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,36,0,39,0,42,0,47,0,52,0,57,0,62,0,67,0,71,0,76,0,81,0,86,0,91,0,96,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-95,0,-90,0,-85,0,-80,0,-75,0,-69,0,-63,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,49,1,54,1,59,1,64,1,69,1,74,1,79,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,40,66,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,40,37,112,49,37,99,0,27,91,50,32,113,0,27,91,52,58,37,112,49,37,100,109,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,114,109,120,120,0,115,109,120,120,0 }; // vte-256color|VTE with xterm 256-colors, @@ -1754,7 +1774,7 @@ static const int8_t tmux_256colour_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t vte_256colour_terminfo[] = { - 30,2,39,0,38,0,15,0,-99,1,-49,5,118,116,101,45,50,53,54,99,111,108,111,114,124,86,84,69,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,-1,-1,-1,-1,112,0,-1,-1,114,0,119,0,-1,-1,-128,0,-123,0,-118,0,-1,-1,-113,0,-108,0,-103,0,-98,0,-89,0,-87,0,-81,0,-1,-1,-68,0,-63,0,-57,0,-51,0,-1,-1,-1,-1,-1,-1,-33,0,-1,-1,-1,-1,-1,-1,0,1,-1,-1,4,1,-1,-1,-1,-1,-1,-1,6,1,-1,-1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,15,1,19,1,25,1,29,1,33,1,37,1,43,1,49,1,55,1,61,1,67,1,71,1,-1,-1,76,1,-1,-1,80,1,85,1,90,1,94,1,101,1,-1,-1,108,1,112,1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-101,1,-92,1,-83,1,-74,1,-65,1,-56,1,-47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-38,1,-35,1,-1,-1,-1,-1,16,2,19,2,30,2,33,2,35,2,38,2,116,2,-1,-1,119,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,2,-1,-1,-1,-1,-1,-1,-1,-1,125,2,-1,-1,-78,2,-1,-1,-1,-1,-74,2,-68,2,-1,-1,-1,-1,-62,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,2,-54,2,-1,-1,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,2,-1,-1,-38,2,-33,2,-1,-1,-1,-1,-1,-1,-1,-1,-26,2,-19,2,-12,2,-1,-1,-1,-1,-5,2,-1,-1,2,3,-1,-1,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,3,22,3,28,3,35,3,42,3,49,3,56,3,64,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,127,3,-122,3,-115,3,-108,3,-100,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-37,3,-30,3,-23,3,-16,3,-8,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,55,4,62,4,69,4,76,4,84,4,92,4,100,4,108,4,116,4,124,4,-124,4,-116,4,-109,4,-102,4,-95,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,4,-79,4,-74,4,-55,4,-51,4,-42,4,-35,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,5,-1,-1,-1,-1,-1,-1,74,5,-119,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-55,5,-52,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,14,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,48,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,109,27,91,63,55,104,27,91,52,108,27,62,27,55,27,91,114,27,91,63,49,59,51,59,52,59,54,108,27,56,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,55,27,91,114,27,56,27,91,109,27,91,63,55,104,27,91,33,112,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,79,70,0,27,79,77,0,27,91,49,126,0,27,91,51,59,50,126,0,27,91,52,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,0,3,0,1,0,73,0,-106,0,57,3,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,32,0,39,0,46,0,53,0,60,0,67,0,74,0,81,0,88,0,95,0,102,0,109,0,116,0,123,0,-126,0,-119,0,-1,-1,-112,0,-105,0,-98,0,-91,0,-84,0,-1,-1,-77,0,-70,0,-63,0,-56,0,-49,0,-42,0,-35,0,-28,0,-21,0,-14,0,-7,0,0,1,7,1,14,1,21,1,28,1,35,1,42,1,49,1,56,1,63,1,70,1,77,1,84,1,91,1,98,1,105,1,112,1,119,1,126,1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-110,1,-105,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,39,0,38,0,15,0,-99,1,-49,5,118,116,101,45,50,53,54,99,111,108,111,114,124,86,84,69,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,-1,-1,-1,-1,112,0,-1,-1,114,0,119,0,-1,-1,-128,0,-123,0,-118,0,-1,-1,-113,0,-108,0,-103,0,-98,0,-89,0,-87,0,-81,0,-1,-1,-68,0,-63,0,-57,0,-51,0,-1,-1,-1,-1,-1,-1,-33,0,-1,-1,-1,-1,-1,-1,0,1,-1,-1,4,1,-1,-1,-1,-1,-1,-1,6,1,-1,-1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,15,1,19,1,25,1,29,1,33,1,37,1,43,1,49,1,55,1,61,1,67,1,71,1,-1,-1,76,1,-1,-1,80,1,85,1,90,1,94,1,101,1,-1,-1,108,1,112,1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-101,1,-92,1,-83,1,-74,1,-65,1,-56,1,-47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-38,1,-35,1,-1,-1,-1,-1,16,2,19,2,30,2,33,2,35,2,38,2,116,2,-1,-1,119,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,2,-1,-1,-1,-1,-1,-1,-1,-1,125,2,-1,-1,-78,2,-1,-1,-1,-1,-74,2,-68,2,-1,-1,-1,-1,-62,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,2,-54,2,-1,-1,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,2,-1,-1,-38,2,-33,2,-1,-1,-1,-1,-1,-1,-1,-1,-26,2,-19,2,-12,2,-1,-1,-1,-1,-5,2,-1,-1,2,3,-1,-1,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,3,22,3,28,3,35,3,42,3,49,3,56,3,64,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,127,3,-122,3,-115,3,-108,3,-100,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-37,3,-30,3,-23,3,-16,3,-8,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,55,4,62,4,69,4,76,4,84,4,92,4,100,4,108,4,116,4,124,4,-124,4,-116,4,-109,4,-102,4,-95,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,4,-79,4,-74,4,-55,4,-51,4,-42,4,-35,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,5,-1,-1,-1,-1,-1,-1,74,5,-119,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-55,5,-52,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,14,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,48,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,109,27,91,63,55,104,27,91,52,108,27,62,27,55,27,91,114,27,91,63,49,59,51,59,52,59,54,108,27,56,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,55,27,91,114,27,56,27,91,109,27,91,63,55,104,27,91,33,112,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,79,70,0,27,79,77,0,27,91,49,126,0,27,91,51,59,50,126,0,27,91,52,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,0,1,0,0,0,59,0,119,0,22,3,1,0,0,0,6,0,12,0,23,0,55,0,62,0,69,0,76,0,83,0,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-54,0,-47,0,-40,0,-33,0,-26,0,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-87,1,-82,1,0,0,3,0,8,0,13,0,19,0,22,0,27,0,32,0,37,0,42,0,47,0,51,0,56,0,61,0,66,0,71,0,76,0,82,0,88,0,94,0,100,0,106,0,112,0,118,0,124,0,-126,0,-120,0,-115,0,-110,0,-105,0,-100,0,-95,0,-89,0,-83,0,-77,0,-71,0,-65,0,-59,0,-53,0,-47,0,-41,0,-35,0,-29,0,-23,0,-17,0,-11,0,-5,0,1,1,7,1,13,1,19,1,25,1,29,1,34,1,39,1,44,1,49,1,54,1,59,1,64,1,27,91,53,53,109,0,27,91,53,51,109,0,27,91,52,58,37,112,49,37,100,109,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,88,84,0,82,109,111,108,0,83,109,111,108,0,83,109,117,108,120,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // vtpcon|ANIS emulation for console virtual terminal sequence with libuv, @@ -1776,6 +1796,7 @@ static const int8_t vte_256colour_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs@, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -1817,9 +1838,13 @@ static const int8_t vte_256colour_terminfo[] = { // init_2string=\E[\041p\E[?3l, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E, // insert_line=\E[L, +// key_a1=\EOw, +// key_a3=\EOy, // key_b2=\E[G, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\E[B, // key_end=\E[4~, @@ -1911,6 +1936,7 @@ static const int8_t vte_256colour_terminfo[] = { // memory_unlock@, // meta_off@, // meta_on@, +// newline=\EE, // orig_colors@, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -1937,6 +1963,7 @@ static const int8_t vte_256colour_terminfo[] = { // set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, // set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, // set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab=\EH, // tab=^I, // user6@, @@ -1944,7 +1971,7 @@ static const int8_t vte_256colour_terminfo[] = { // user8@, // user9@, static const int8_t vtpcon_terminfo[] = { - 30,2,71,0,38,0,15,0,-99,1,21,4,118,116,112,99,111,110,124,65,78,73,83,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,99,111,110,115,111,108,101,32,118,105,114,116,117,97,108,32,116,101,114,109,105,110,97,108,32,115,101,113,117,101,110,99,101,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,-2,-1,25,0,33,0,37,0,41,0,-1,-1,52,0,69,0,73,0,77,0,84,0,-1,-1,86,0,99,0,-1,-1,103,0,-2,-1,107,0,111,0,-1,-1,-1,-1,115,0,-2,-1,119,0,124,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,-123,0,-118,0,-113,0,-108,0,-99,0,-95,0,-90,0,-1,-1,-2,-1,-81,0,-75,0,-2,-1,-1,-1,-1,-1,-1,-1,-69,0,-1,-1,-1,-1,-1,-1,-59,0,-1,-1,-55,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-48,0,-1,-1,-1,-1,-1,-1,-1,-1,-44,0,-39,0,-33,0,-28,0,-23,0,-18,0,-13,0,-7,0,-1,0,5,1,11,1,16,1,-1,-1,21,1,-1,-1,25,1,30,1,35,1,39,1,46,1,-1,-1,53,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,57,1,66,1,75,1,84,1,93,1,102,1,111,1,120,1,-127,1,-118,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-109,1,-2,-1,-2,-1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,-24,1,-1,-1,-21,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-1,-1,-1,-1,-1,-1,-1,-1,-15,1,-1,-1,8,2,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,2,17,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,21,2,-1,-1,-1,-1,28,2,-1,-1,-1,-1,-1,-1,-1,-1,35,2,42,2,49,2,-1,-1,-1,-1,56,2,-1,-1,63,2,-1,-1,-1,-1,-1,-1,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-53,2,-47,2,-41,2,-35,2,-29,2,-23,2,-17,2,-11,2,-5,2,2,3,8,3,14,3,20,3,26,3,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,37,3,-2,-1,46,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-117,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-106,3,-43,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,33,112,27,91,63,51,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,27,72,0,9,0,27,91,71,0,106,106,107,107,108,108,109,109,110,110,113,113,116,116,117,117,118,118,119,119,120,120,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,0,27,91,51,109,0,27,91,50,51,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,71,0,38,0,15,0,-99,1,70,4,118,116,112,99,111,110,124,65,78,73,83,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,99,111,110,115,111,108,101,32,118,105,114,116,117,97,108,32,116,101,114,109,105,110,97,108,32,115,101,113,117,101,110,99,101,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,-2,-1,25,0,33,0,37,0,41,0,-1,-1,52,0,69,0,73,0,77,0,84,0,-1,-1,86,0,99,0,-1,-1,103,0,-2,-1,107,0,111,0,-1,-1,-1,-1,115,0,-2,-1,119,0,124,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,-123,0,-118,0,-113,0,-108,0,-99,0,-95,0,-90,0,-1,-1,-2,-1,-81,0,-75,0,-2,-1,-1,-1,-1,-1,-1,-1,-69,0,-1,-1,-1,-1,-1,-1,-59,0,-1,-1,-55,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-48,0,-1,-1,-1,-1,-1,-1,-1,-1,-44,0,-39,0,-33,0,-28,0,-23,0,-18,0,-13,0,-7,0,-1,0,5,1,11,1,16,1,-1,-1,21,1,-1,-1,25,1,30,1,35,1,39,1,46,1,-1,-1,53,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,57,1,-1,-1,60,1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-115,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-106,1,-2,-1,-2,-1,-1,-1,-1,-1,-86,1,-83,1,-72,1,-69,1,-67,1,-64,1,-21,1,-1,-1,-18,1,-1,-1,-1,-1,-1,-1,-1,-1,-16,1,-12,1,-8,1,-4,1,0,2,-1,-1,-1,-1,4,2,-1,-1,27,2,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,2,36,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,40,2,-1,-1,-1,-1,47,2,-1,-1,-1,-1,-1,-1,-1,-1,54,2,61,2,68,2,-1,-1,-1,-1,75,2,-1,-1,82,2,-1,-1,-1,-1,-1,-1,89,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,2,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-94,2,-88,2,-82,2,-76,2,-70,2,-64,2,-58,2,-52,2,-46,2,-40,2,-34,2,-28,2,-22,2,-16,2,-10,2,-4,2,2,3,8,3,14,3,21,3,27,3,33,3,39,3,45,3,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,51,3,56,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,63,3,-2,-1,72,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-91,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-86,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-80,3,-17,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,47,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,33,112,27,91,63,51,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,91,71,0,27,79,113,0,27,79,115,0,106,106,107,107,108,108,109,109,110,110,113,113,116,116,117,117,118,118,119,119,120,120,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,51,57,59,52,57,109,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,0,27,91,51,109,0,27,91,50,51,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,2,0,0,0,74,0,92,0,-46,1,1,1,-2,-1,-2,-1,0,0,-2,-1,5,0,11,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,28,0,32,0,36,0,40,0,44,0,48,0,52,0,56,0,60,0,64,0,68,0,72,0,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // win32con|ANSI emulation for libuv on legacy console, @@ -2080,7 +2107,7 @@ static const int8_t vtpcon_terminfo[] = { // user8@, // user9@, static const int8_t win32con_terminfo[] = { - 26,1,52,0,15,0,15,0,125,1,106,2,119,105,110,51,50,99,111,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,108,105,98,117,118,32,111,110,32,108,101,103,97,99,121,32,99,111,110,115,111,108,101,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,65,0,70,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,79,0,84,0,-2,-1,-1,-1,-2,-1,89,0,94,0,-1,-1,-2,-1,107,0,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,113,0,-1,-1,-1,-1,-1,-1,115,0,-1,-1,120,0,-1,-1,-1,-1,-1,-1,-1,-1,124,0,-127,0,-121,0,-116,0,-111,0,-106,0,-101,0,-95,0,-89,0,-83,0,-77,0,-72,0,-1,-1,-67,0,-1,-1,-63,0,-58,0,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,0,-1,-1,-2,-1,-2,-1,-42,0,-2,-1,-1,-1,-2,-1,-33,0,-24,0,-1,-1,-15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-6,0,-3,0,8,1,-2,-1,-2,-1,11,1,-1,-1,-1,-1,49,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,1,-1,-1,-1,-1,69,1,-1,-1,-1,-1,-1,-1,-1,-1,76,1,83,1,90,1,-1,-1,-1,-1,97,1,-1,-1,104,1,-1,-1,-1,-1,-1,-1,111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,118,1,124,1,-126,1,-120,1,-114,1,-108,1,-102,1,-96,1,-90,1,-84,1,-78,1,-72,1,-66,1,-60,1,-54,1,-48,1,-42,1,-36,1,-30,1,-24,1,-18,1,-12,1,-6,1,0,2,6,2,12,2,18,2,24,2,30,2,-1,-1,36,2,42,2,48,2,54,2,60,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,71,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,2,90,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,100,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,55,109,0,27,91,55,109,0,27,91,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,50,55,109,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,27,91,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,52,126,0,26,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,48,109,0,1,0,0,0,2,0,5,0,25,0,0,0,0,0,6,0,0,0,3,0,6,0,27,91,48,32,113,0,27,91,37,112,49,37,100,32,113,0,65,88,0,83,101,0,83,115,0 // NOLINT + 26,1,52,0,15,0,15,0,125,1,106,2,119,105,110,51,50,99,111,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,108,105,98,117,118,32,111,110,32,108,101,103,97,99,121,32,99,111,110,115,111,108,101,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,65,0,70,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,79,0,84,0,-2,-1,-1,-1,-2,-1,89,0,94,0,-1,-1,-2,-1,107,0,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,113,0,-1,-1,-1,-1,-1,-1,115,0,-1,-1,120,0,-1,-1,-1,-1,-1,-1,-1,-1,124,0,-127,0,-121,0,-116,0,-111,0,-106,0,-101,0,-95,0,-89,0,-83,0,-77,0,-72,0,-1,-1,-67,0,-1,-1,-63,0,-58,0,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,0,-1,-1,-2,-1,-2,-1,-42,0,-2,-1,-1,-1,-2,-1,-33,0,-24,0,-1,-1,-15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-6,0,-3,0,8,1,-2,-1,-2,-1,11,1,-1,-1,-1,-1,49,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,1,-1,-1,-1,-1,69,1,-1,-1,-1,-1,-1,-1,-1,-1,76,1,83,1,90,1,-1,-1,-1,-1,97,1,-1,-1,104,1,-1,-1,-1,-1,-1,-1,111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,118,1,124,1,-126,1,-120,1,-114,1,-108,1,-102,1,-96,1,-90,1,-84,1,-78,1,-72,1,-66,1,-60,1,-54,1,-48,1,-42,1,-36,1,-30,1,-24,1,-18,1,-12,1,-6,1,0,2,6,2,12,2,18,2,24,2,30,2,-1,-1,36,2,42,2,48,2,54,2,60,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,71,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,2,90,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,100,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,55,109,0,27,91,55,109,0,27,91,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,50,55,109,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,27,91,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,52,126,0,26,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,48,109,0,0,0,0,0,2,0,4,0,22,0,0,0,6,0,0,0,3,0,27,91,48,32,113,0,27,91,37,112,49,37,100,32,113,0,83,101,0,83,115,0 }; // xterm-256color|xterm with 256 colors, @@ -2105,6 +2132,7 @@ static const int8_t win32con_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs=\E[3g, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -2146,9 +2174,13 @@ static const int8_t win32con_terminfo[] = { // init_2string=\E[\041p\E[?3;4l\E[4l\E>, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, // insert_line=\E[L, -// key_b2=\EOE, +// key_a1=\EOw, +// key_a3=\EOy, +// key_b2=\EOu, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\EOB, // key_end=\EOF, @@ -2240,6 +2272,7 @@ static const int8_t win32con_terminfo[] = { // memory_unlock=\Em, // meta_off=\E[?1034l, // meta_on=\E[?1034h, +// newline=\EE, // orig_colors=\E]104^G, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -2266,6 +2299,7 @@ static const int8_t win32con_terminfo[] = { // set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, // set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, // set_attributes=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab=\EH, // tab=^I, // user6=\E[%i%d;%dR, @@ -2273,6 +2307,6 @@ static const int8_t win32con_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t xterm_256colour_terminfo[] = { - 30,2,37,0,38,0,15,0,-99,1,2,6,120,116,101,114,109,45,50,53,54,99,111,108,111,114,124,120,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,120,0,124,0,-1,-1,-1,-1,-128,0,-124,0,-119,0,-114,0,-1,-1,-96,0,-91,0,-86,0,-1,-1,-81,0,-76,0,-71,0,-66,0,-57,0,-53,0,-46,0,-1,-1,-28,0,-23,0,-17,0,-11,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,-1,-1,-1,-1,25,1,-1,-1,29,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,36,1,-1,-1,-1,-1,-1,-1,-1,-1,40,1,44,1,50,1,54,1,58,1,62,1,68,1,74,1,80,1,86,1,92,1,96,1,-1,-1,101,1,-1,-1,105,1,110,1,115,1,119,1,126,1,-1,-1,-123,1,-119,1,-111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-103,1,-94,1,-1,-1,-1,-1,-85,1,-76,1,-67,1,-58,1,-49,1,-40,1,-31,1,-22,1,-13,1,-4,1,-1,-1,-1,-1,-1,-1,5,2,9,2,14,2,19,2,39,2,48,2,-1,-1,-1,-1,66,2,69,2,80,2,83,2,85,2,88,2,-75,2,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-70,2,-1,-1,-1,-1,-1,-1,-1,-1,-66,2,-1,-1,-13,2,-1,-1,-1,-1,-9,2,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,3,7,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,3,-1,-1,-1,-1,18,3,-1,-1,-1,-1,-1,-1,-1,-1,25,3,32,3,39,3,-1,-1,-1,-1,46,3,-1,-1,53,3,-1,-1,-1,-1,-1,-1,60,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,3,73,3,79,3,86,3,93,3,100,3,107,3,115,3,123,3,-125,3,-117,3,-109,3,-101,3,-93,3,-85,3,-78,3,-71,3,-64,3,-57,3,-49,3,-41,3,-33,3,-25,3,-17,3,-9,3,-1,3,7,4,14,4,21,4,28,4,35,4,43,4,51,4,59,4,67,4,75,4,83,4,91,4,99,4,106,4,113,4,120,4,127,4,-121,4,-113,4,-105,4,-97,4,-89,4,-81,4,-73,4,-65,4,-58,4,-51,4,-44,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,4,-28,4,-23,4,-4,4,0,5,9,5,16,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,5,-1,-1,-1,-1,-1,-1,125,5,-68,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,5,-1,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,49,50,59,50,53,104,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,40,66,27,91,109,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,63,49,48,51,52,108,0,27,91,63,49,48,51,52,104,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,27,93,49,48,52,7,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,79,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,79,70,0,27,79,77,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,3,0,1,0,73,0,-106,0,115,3,1,0,1,0,-1,-1,-1,-1,0,0,7,0,-1,-1,19,0,24,0,-1,-1,42,0,48,0,-1,-1,58,0,-1,-1,-1,-1,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-1,-1,-54,0,-47,0,-40,0,-33,0,-26,0,-1,-1,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-86,1,-79,1,-72,1,-65,1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-52,1,-47,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,37,0,38,0,15,0,-99,1,51,6,120,116,101,114,109,45,50,53,54,99,111,108,111,114,124,120,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,120,0,124,0,-1,-1,-1,-1,-128,0,-124,0,-119,0,-114,0,-1,-1,-96,0,-91,0,-86,0,-1,-1,-81,0,-76,0,-71,0,-66,0,-57,0,-53,0,-46,0,-1,-1,-28,0,-23,0,-17,0,-11,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,-1,-1,-1,-1,25,1,-1,-1,29,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,36,1,-1,-1,-1,-1,-1,-1,-1,-1,40,1,44,1,50,1,54,1,58,1,62,1,68,1,74,1,80,1,86,1,92,1,96,1,-1,-1,101,1,-1,-1,105,1,110,1,115,1,119,1,126,1,-1,-1,-123,1,-119,1,-111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-103,1,-94,1,-85,1,-1,-1,-82,1,-73,1,-64,1,-55,1,-46,1,-37,1,-28,1,-19,1,-10,1,-1,1,-1,-1,-1,-1,-1,-1,8,2,12,2,17,2,22,2,42,2,51,2,-1,-1,-1,-1,69,2,72,2,83,2,86,2,88,2,91,2,-72,2,-1,-1,-69,2,-1,-1,-1,-1,-1,-1,-1,-1,-67,2,-63,2,-59,2,-55,2,-51,2,-1,-1,-1,-1,-47,2,-1,-1,6,3,-1,-1,-1,-1,10,3,16,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,3,26,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,3,-1,-1,-1,-1,37,3,-1,-1,-1,-1,-1,-1,-1,-1,44,3,51,3,58,3,-1,-1,-1,-1,65,3,-1,-1,72,3,-1,-1,-1,-1,-1,-1,79,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,3,92,3,98,3,105,3,112,3,119,3,126,3,-122,3,-114,3,-106,3,-98,3,-90,3,-82,3,-74,3,-66,3,-59,3,-52,3,-45,3,-38,3,-30,3,-22,3,-14,3,-6,3,2,4,10,4,18,4,26,4,33,4,40,4,47,4,54,4,62,4,70,4,78,4,86,4,94,4,102,4,110,4,118,4,125,4,-124,4,-117,4,-110,4,-102,4,-94,4,-86,4,-78,4,-70,4,-62,4,-54,4,-46,4,-39,4,-32,4,-25,4,-20,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-13,4,-2,4,3,5,22,5,26,5,35,5,42,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-115,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-109,5,-1,-1,-1,-1,-1,-1,-105,5,-42,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,45,6,48,6,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,49,50,59,50,53,104,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,40,66,27,91,109,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,63,49,48,51,52,108,0,27,91,63,49,48,51,52,104,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,27,93,49,48,52,7,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,79,70,0,27,79,77,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,27,108,0,27,109,0,0,2,0,0,0,74,0,-106,0,-84,3,1,1,0,0,7,0,19,0,24,0,42,0,48,0,58,0,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-54,0,-47,0,-40,0,-33,0,-26,0,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-86,1,-79,1,-72,1,-65,1,-58,1,-54,1,-50,1,-46,1,-42,1,-38,1,-34,1,-30,1,-26,1,-22,1,-18,1,-14,1,-10,1,-4,1,1,2,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; #endif // NVIM_TUI_TERMINFO_DEFS_H diff --git a/src/nvim/ui.c b/src/nvim/ui.c index ac20b00c71..01583c032f 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -344,7 +344,7 @@ void vim_beep(unsigned val) // When 'debug' contains "beep" produce a message. If we are sourcing // a script or executing a function give the user a hint where the beep // comes from. - if (vim_strchr(p_debug, 'e') != NULL) { + if (vim_strchr((char *)p_debug, 'e') != NULL) { msg_source(HL_ATTR(HLF_W)); msg_attr(_("Beep!"), HL_ATTR(HLF_W)); } @@ -436,7 +436,7 @@ void ui_set_ext_option(UI *ui, UIExtension ext, bool active) void ui_line(ScreenGrid *grid, int row, int startcol, int endcol, int clearcol, int clearattr, bool wrap) { - assert(0 <= row && row < grid->Rows); + assert(0 <= row && row < grid->rows); LineFlags flags = wrap ? kLineFlagWrap : 0; if (startcol == -1) { startcol = 0; @@ -453,7 +453,7 @@ void ui_line(ScreenGrid *grid, int row, int startcol, int endcol, int clearcol, if (p_wd && !(rdb_flags & RDB_COMPOSITOR)) { // If 'writedelay' is active, set the cursor to indicate what was drawn. ui_call_grid_cursor_goto(grid->handle, row, - MIN(clearcol, (int)grid->Columns - 1)); + MIN(clearcol, (int)grid->cols - 1)); ui_call_flush(); uint64_t wd = (uint64_t)labs(p_wd); os_microdelay(wd * 1000u, true); @@ -549,13 +549,13 @@ void ui_check_mouse(void) int checkfor = MOUSE_NORMAL; // assume normal mode if (VIsual_active) { checkfor = MOUSE_VISUAL; - } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE) { + } else if (State == MODE_HITRETURN || State == MODE_ASKMORE || State == MODE_SETWSIZE) { checkfor = MOUSE_RETURN; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { checkfor = MOUSE_INSERT; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { checkfor = MOUSE_COMMAND; - } else if (State == CONFIRM || State == EXTERNCMD) { + } else if (State == MODE_CONFIRM || State == MODE_EXTERNCMD) { checkfor = ' '; // don't use mouse for ":confirm" or ":!cmd" } @@ -567,7 +567,7 @@ void ui_check_mouse(void) for (char_u *p = p_mouse; *p; p++) { switch (*p) { case 'a': - if (vim_strchr((char_u *)MOUSE_A, checkfor) != NULL) { + if (vim_strchr(MOUSE_A, checkfor) != NULL) { has_mouse = true; return; } diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c index f76158ff12..1dce84a1de 100644 --- a/src/nvim/ui_compositor.c +++ b/src/nvim/ui_compositor.c @@ -138,19 +138,19 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width, // use it. grid->comp_disabled = true; compose_area(grid->comp_row, row, - grid->comp_col, grid->comp_col + grid->Columns); + grid->comp_col, grid->comp_col + grid->cols); if (grid->comp_col < col) { compose_area(MAX(row, grid->comp_row), - MIN(row + height, grid->comp_row + grid->Rows), + MIN(row + height, grid->comp_row + grid->rows), grid->comp_col, col); } - if (col + width < grid->comp_col + grid->Columns) { + if (col + width < grid->comp_col + grid->cols) { compose_area(MAX(row, grid->comp_row), - MIN(row + height, grid->comp_row + grid->Rows), - col + width, grid->comp_col + grid->Columns); + MIN(row + height, grid->comp_row + grid->rows), + col + width, grid->comp_col + grid->cols); } - compose_area(row + height, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(row + height, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); grid->comp_disabled = false; } grid->comp_row = row; @@ -188,8 +188,8 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width, grid->comp_index = insert_at; } if (moved && valid && ui_comp_should_draw()) { - compose_area(grid->comp_row, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(grid->comp_row, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); } return moved; } @@ -249,10 +249,10 @@ static void ui_comp_raise_grid(ScreenGrid *grid, size_t new_index) for (size_t i = old_index; i < new_index; i++) { ScreenGrid *grid2 = kv_A(layers, i); int startcol = MAX(grid->comp_col, grid2->comp_col); - int endcol = MIN(grid->comp_col + grid->Columns, - grid2->comp_col + grid2->Columns); + int endcol = MIN(grid->comp_col + grid->cols, + grid2->comp_col + grid2->cols); compose_area(MAX(grid->comp_row, grid2->comp_row), - MIN(grid->comp_row + grid->Rows, grid2->comp_row + grid2->Rows), + MIN(grid->comp_row + grid->rows, grid2->comp_row + grid2->rows), startcol, endcol); } } @@ -279,7 +279,7 @@ static void ui_comp_grid_cursor_goto(UI *ui, Integer grid_handle, Integer r, Int } } - if (cursor_col >= default_grid.Columns || cursor_row >= default_grid.Rows) { + if (cursor_col >= default_grid.cols || cursor_row >= default_grid.rows) { // TODO(bfredl): this happens with 'writedelay', refactor? // abort(); return; @@ -292,8 +292,8 @@ ScreenGrid *ui_comp_mouse_focus(int row, int col) for (ssize_t i = (ssize_t)kv_size(layers) - 1; i > 0; i--) { ScreenGrid *grid = kv_A(layers, i); if (grid->focusable - && row >= grid->comp_row && row < grid->comp_row + grid->Rows - && col >= grid->comp_col && col < grid->comp_col + grid->Columns) { + && row >= grid->comp_row && row < grid->comp_row + grid->rows + && col >= grid->comp_col && col < grid->comp_col + grid->cols) { return grid; } } @@ -315,7 +315,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag startcol--; skipstart = 1; } - if (endcol < default_grid.Columns && (flags & kLineFlagInvalid)) { + if (endcol < default_grid.cols && (flags & kLineFlagInvalid)) { endcol++; skipend = 1; } @@ -337,8 +337,8 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag // first check to see if any grids have pending updates to width/height, // to ensure that we don't accidentally put any characters into `linebuf` // that have been invalidated. - grid_width = MIN(g->Columns, g->comp_width); - grid_height = MIN(g->Rows, g->comp_height); + grid_width = MIN(g->cols, g->comp_width); + grid_height = MIN(g->rows, g->comp_height); if (g->comp_row > row || row >= g->comp_row + grid_height || g->comp_disabled) { continue; @@ -354,7 +354,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag assert(grid != NULL); assert(until > col); - assert(until <= default_grid.Columns); + assert(until <= default_grid.cols); size_t n = (size_t)(until - col); if (row == msg_sep_row && grid->comp_index <= msg_grid.comp_index) { @@ -371,7 +371,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag + (size_t)(col - grid->comp_col); memcpy(linebuf + (col - startcol), grid->chars + off, n * sizeof(*linebuf)); memcpy(attrbuf + (col - startcol), grid->attrs + off, n * sizeof(*attrbuf)); - if (grid->comp_col + grid->Columns > until + if (grid->comp_col + grid->cols > until && grid->chars[off + n][0] == NUL) { linebuf[until - 1 - startcol][0] = ' '; linebuf[until - 1 - startcol][1] = '\0'; @@ -452,8 +452,8 @@ static void compose_debug(Integer startrow, Integer endrow, Integer startcol, In return; } - endrow = MIN(endrow, default_grid.Rows); - endcol = MIN(endcol, default_grid.Columns); + endrow = MIN(endrow, default_grid.rows); + endcol = MIN(endcol, default_grid.cols); int attr = syn_id2attr(syn_id); for (int row = (int)startrow; row < endrow; row++) { @@ -480,8 +480,8 @@ static void debug_delay(Integer lines) static void compose_area(Integer startrow, Integer endrow, Integer startcol, Integer endcol) { compose_debug(startrow, endrow, startcol, endcol, dbghl_recompose, true); - endrow = MIN(endrow, default_grid.Rows); - endcol = MIN(endcol, default_grid.Columns); + endrow = MIN(endrow, default_grid.rows); + endcol = MIN(endcol, default_grid.cols); if (endcol <= startcol) { return; } @@ -497,8 +497,8 @@ static void compose_area(Integer startrow, Integer endrow, Integer startcol, Int void ui_comp_compose_grid(ScreenGrid *grid) { if (ui_comp_should_draw()) { - compose_area(grid->comp_row, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(grid->comp_row, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); } } @@ -523,17 +523,17 @@ static void ui_comp_raw_line(UI *ui, Integer grid, Integer row, Integer startcol // TODO(bfredl): this should not really be necessary. But on some condition // when resizing nvim, a window will be attempted to be drawn on the older // and possibly larger global screen size. - if (row >= default_grid.Rows) { + if (row >= default_grid.rows) { DLOG("compositor: invalid row %" PRId64 " on grid %" PRId64, row, grid); return; } - if (clearcol > default_grid.Columns) { + if (clearcol > default_grid.cols) { DLOG("compositor: invalid last column %" PRId64 " on grid %" PRId64, clearcol, grid); - if (startcol >= default_grid.Columns) { + if (startcol >= default_grid.cols) { return; } - clearcol = default_grid.Columns; + clearcol = default_grid.cols; endcol = MIN(endcol, clearcol); } @@ -581,7 +581,7 @@ static void ui_comp_msg_set_pos(UI *ui, Integer grid, Integer row, Boolean scrol } if (row > msg_current_row && ui_comp_should_draw()) { - compose_area(MAX(msg_current_row - 1, 0), row, 0, default_grid.Columns); + compose_area(MAX(msg_current_row - 1, 0), row, 0, default_grid.cols); } else if (row < msg_current_row && ui_comp_should_draw() && msg_current_row < Rows) { int delta = msg_current_row - (int)row; diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 937e86b161..529eef19a3 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -702,7 +702,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) const size_t ffname_len = strlen(ffname); undo_file_name = xmalloc(ffname_len + 6); memmove(undo_file_name, ffname, ffname_len + 1); - char *const tail = (char *)path_tail((char_u *)undo_file_name); + char *const tail = path_tail(undo_file_name); const size_t tail_len = strlen(tail); memmove(tail + 1, tail, tail_len + 1); *tail = '.'; @@ -2418,10 +2418,11 @@ static void u_undoredo(int undo, bool do_buf_event) changed_lines(top + 1, 0, bot, newsize - oldsize, do_buf_event); - // set '[ and '] mark + // Set the '[ mark. if (top + 1 < curbuf->b_op_start.lnum) { curbuf->b_op_start.lnum = top + 1; } + // Set the '] mark. if (newsize == 0 && top + 1 > curbuf->b_op_end.lnum) { curbuf->b_op_end.lnum = top + 1; } else if (top + newsize > curbuf->b_op_end.lnum) { @@ -2442,6 +2443,14 @@ static void u_undoredo(int undo, bool do_buf_event) newlist = uep; } + // Ensure the '[ and '] marks are within bounds. + if (curbuf->b_op_start.lnum > curbuf->b_ml.ml_line_count) { + curbuf->b_op_start.lnum = curbuf->b_ml.ml_line_count; + } + if (curbuf->b_op_end.lnum > curbuf->b_ml.ml_line_count) { + curbuf->b_op_end.lnum = curbuf->b_ml.ml_line_count; + } + // Adjust Extmarks ExtmarkUndoObject undo_info; if (undo) { diff --git a/src/nvim/version.c b/src/nvim/version.c index 2369681dca..1b520780d1 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -215,7 +215,7 @@ static const int included_patches[] = { 1709, 1708, 1707, - // 1706, + 1706, 1705, 1704, 1703, @@ -305,14 +305,14 @@ static const int included_patches[] = { 1619, 1618, 1617, - // 1616, + 1616, 1615, 1614, 1613, 1612, 1611, 1610, - // 1609, + 1609, 1608, 1607, 1606, @@ -359,7 +359,7 @@ static const int included_patches[] = { 1565, 1564, 1563, - // 1562, + 1562, 1561, 1560, 1559, @@ -554,7 +554,7 @@ static const int included_patches[] = { 1370, 1369, 1368, - // 1367, + 1367, 1366, 1365, 1364, @@ -582,11 +582,11 @@ static const int included_patches[] = { 1342, 1341, 1340, - // 1339, + 1339, 1338, 1337, 1336, - // 1335, + 1335, 1334, 1333, 1332, @@ -614,7 +614,7 @@ static const int included_patches[] = { 1310, 1309, 1308, - // 1307, + 1307, 1306, 1305, 1304, @@ -802,7 +802,7 @@ static const int included_patches[] = { 1122, 1121, 1120, - // 1119, + 1119, 1118, 1117, 1116, @@ -2201,8 +2201,8 @@ void maybe_intro_message(void) if (buf_is_empty(curbuf) && (curbuf->b_fname == NULL) && (firstwin->w_next == NULL) - && (vim_strchr(p_shm, SHM_INTRO) == NULL)) { - intro_message(FALSE); + && (vim_strchr((char *)p_shm, SHM_INTRO) == NULL)) { + intro_message(false); } } diff --git a/src/nvim/vim.h b/src/nvim/vim.h index 3c8a865fb1..1c05387da3 100644 --- a/src/nvim/vim.h +++ b/src/nvim/vim.h @@ -31,49 +31,49 @@ enum { NUMBUFLEN = 65, }; #define ROOT_UID 0 #include "nvim/gettext.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/macros.h" // special attribute addition: Put message in history #define MSG_HIST 0x1000 -// values for State +// Values for State // -// The lower bits up to 0x20 are used to distinguish normal/visual/op_pending -// and cmdline/insert+replace mode. This is used for mapping. If none of -// these bits are set, no mapping is done. -// The upper bits are used to distinguish between other states. - -#define NORMAL 0x01 // Normal mode, command expected -#define VISUAL 0x02 // Visual mode - use get_real_state() -#define OP_PENDING 0x04 // Normal mode, operator is pending - use - // get_real_state() -#define CMDLINE 0x08 // Editing command line -#define INSERT 0x10 // Insert mode -#define LANGMAP 0x20 // Language mapping, can be combined with - // INSERT and CMDLINE - -#define REPLACE_FLAG 0x40 // Replace mode flag -#define REPLACE (REPLACE_FLAG + INSERT) -#define VREPLACE_FLAG 0x80 // Virtual-replace mode flag -#define VREPLACE (REPLACE_FLAG + VREPLACE_FLAG + INSERT) -#define LREPLACE (REPLACE_FLAG + LANGMAP) - -#define NORMAL_BUSY (0x100 + NORMAL) // Normal mode, busy with a command -#define HITRETURN (0x200 + NORMAL) // waiting for return or command -#define ASKMORE 0x300 // Asking if you want --more-- -#define SETWSIZE 0x400 // window size has changed -#define ABBREV 0x500 // abbreviation instead of mapping -#define EXTERNCMD 0x600 // executing an external command -#define SHOWMATCH (0x700 + INSERT) // show matching paren -#define CONFIRM 0x800 // ":confirm" prompt -#define SELECTMODE 0x1000 // Select mode, only for mappings -#define TERM_FOCUS 0x2000 // Terminal focus mode -#define CMDPREVIEW 0x4000 // Showing 'inccommand' command "live" preview. - -// all mode bits used for mapping -#define MAP_ALL_MODES (0x3f | SELECTMODE | TERM_FOCUS) +// The lower bits up to 0x80 are used to distinguish normal/visual/op_pending +// /cmdline/insert/replace/terminal mode. This is used for mapping. If none +// of these bits are set, no mapping is done. See the comment above do_map(). +// The upper bits are used to distinguish between other states and variants of +// the base modes. + +#define MODE_NORMAL 0x01 // Normal mode, command expected +#define MODE_VISUAL 0x02 // Visual mode - use get_real_state() +#define MODE_OP_PENDING 0x04 // Normal mode, operator is pending - use + // get_real_state() +#define MODE_CMDLINE 0x08 // Editing the command line +#define MODE_INSERT 0x10 // Insert mode, also for Replace mode +#define MODE_LANGMAP 0x20 // Language mapping, can be combined with + // MODE_INSERT and MODE_CMDLINE +#define MODE_SELECT 0x40 // Select mode, use get_real_state() +#define MODE_TERMINAL 0x80 // Terminal mode + +#define MAP_ALL_MODES 0xff // all mode bits used for mapping + +#define REPLACE_FLAG 0x100 // Replace mode flag +#define MODE_REPLACE (REPLACE_FLAG | MODE_INSERT) +#define VREPLACE_FLAG 0x200 // Virtual-replace mode flag +#define MODE_VREPLACE (REPLACE_FLAG | VREPLACE_FLAG | MODE_INSERT) +#define MODE_LREPLACE (REPLACE_FLAG | MODE_LANGMAP) + +#define MODE_NORMAL_BUSY (0x1000 | MODE_NORMAL) // Normal mode, busy with a command +#define MODE_HITRETURN (0x2000 | MODE_NORMAL) // waiting for return or command +#define MODE_ASKMORE 0x3000 // Asking if you want --more-- +#define MODE_SETWSIZE 0x4000 // window size has changed +#define MODE_EXTERNCMD 0x5000 // executing an external command +#define MODE_SHOWMATCH (0x6000 | MODE_INSERT) // show matching paren +#define MODE_CONFIRM 0x7000 // ":confirm" prompt +#define MODE_CMDPREVIEW 0x8000 // Showing 'inccommand' command "live" preview. + /// Directions. typedef enum { diff --git a/src/nvim/window.c b/src/nvim/window.c index de57ce7a1d..9c9b1fe176 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -515,9 +515,14 @@ wingotofile: if ((len = find_ident_under_cursor(&ptr, FIND_IDENT)) == 0) { break; } + + // Make a copy, if the line was changed it will be freed. + ptr = vim_strnsave(ptr, len); + find_pattern_in_path(ptr, 0, len, true, Prenum == 0, type, Prenum1, ACTION_SPLIT, 1, MAXLNUM); - curwin->w_set_curswant = TRUE; + xfree(ptr); + curwin->w_set_curswant = true; break; // Quickfix window only: view the result under the cursor in a new split. @@ -695,6 +700,7 @@ win_T *win_new_float(win_T *wp, bool last, FloatConfig fconfig, Error *err) } wp->w_floating = 1; wp->w_status_height = 0; + wp->w_winbar_height = 0; wp->w_hsep_height = 0; wp->w_vsep_width = 0; @@ -780,10 +786,8 @@ void win_config_float(win_T *wp, FloatConfig fconfig) } if (!ui_has(kUIMultigrid)) { - wp->w_height = MIN(wp->w_height, - Rows - 1 - (wp->w_border_adj[0] + wp->w_border_adj[2])); - wp->w_width = MIN(wp->w_width, - Columns - (wp->w_border_adj[1] + wp->w_border_adj[3])); + wp->w_height = MIN(wp->w_height, Rows - 1 - win_extra_height(wp)); + wp->w_width = MIN(wp->w_width, Columns - win_extra_width(wp)); } win_set_inner_size(wp); @@ -1138,15 +1142,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } else { layout = FR_COL; - /* - * Check if we are able to split the current window and compute its - * height. - */ - // Current window requires at least 1 space. - wmh1 = p_wmh == 0 ? 1 : p_wmh; + // Check if we are able to split the current window and compute its height. + // Current window requires at least 1 space plus space for the window bar. + wmh1 = MAX(p_wmh, 1) + oldwin->w_winbar_height; needed = wmh1 + STATUS_HEIGHT; if (flags & WSP_ROOM) { - needed += p_wh - wmh1; + needed += p_wh - wmh1 + oldwin->w_winbar_height; } if (flags & (WSP_BOT | WSP_TOP)) { minheight = frame_minheight(topframe, NOWIN) + need_status; @@ -1155,8 +1156,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } else if (p_ea) { minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; prevfrp = oldwin->w_frame; - for (frp = oldwin->w_frame->fr_parent; frp != NULL; - frp = frp->fr_parent) { + for (frp = oldwin->w_frame->fr_parent; frp != NULL; frp = frp->fr_parent) { if (frp->fr_layout == FR_COL) { FOR_ALL_FRAMES(frp2, frp->fr_child) { if (frp2 != prevfrp) { @@ -1339,6 +1339,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) set_fraction(oldwin); } wp->w_fraction = oldwin->w_fraction; + wp->w_winbar_height = oldwin->w_winbar_height; if (flags & WSP_VERT) { wp->w_p_scr = curwin->w_p_scr; @@ -1416,9 +1417,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & (WSP_TOP | WSP_BOT)) { int new_fr_height = curfrp->fr_height - new_size; - if (!((flags & WSP_BOT) && p_ls == 0) && global_stl_height() == 0) { + if (!((flags & WSP_BOT) && p_ls == 0) && !is_stl_global) { new_fr_height -= STATUS_HEIGHT; - } else if (global_stl_height() > 0) { + } else if (is_stl_global) { if (flags & WSP_BOT) { frame_add_hsep(curfrp); } else { @@ -1452,7 +1453,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } } } - if ((flags & WSP_BOT) && global_stl_height() == 0) { + if ((flags & WSP_BOT) && !is_stl_global) { frame_add_statusline(curfrp); } frame_fix_height(wp); @@ -1482,10 +1483,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) * equalize the window sizes. */ if (do_equal || dir != 0) { - win_equal(wp, true, - (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') - : dir == 'h' ? 'b' : - 'v'); + win_equal(wp, true, (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') : (dir == 'h' ? 'b' : 'v')); } // Don't change the window height/width to 'winheight' / 'winwidth' if a @@ -1675,10 +1673,10 @@ int win_count(void) } /// Make "count" windows on the screen. -/// Must be called when there is just one window, filling the whole screen +/// Must be called when there is just one window, filling the whole screen. /// (excluding the command line). /// -/// @param vertical split windows vertically if true +/// @param vertical split windows vertically if true. /// /// @return actual number of windows on the screen. int make_windows(int count, bool vertical) @@ -1687,15 +1685,15 @@ int make_windows(int count, bool vertical) int todo; if (vertical) { - // Each window needs at least 'winminwidth' lines and a separator - // column. + // Each window needs at least 'winminwidth' lines and a separator column. maxcount = (curwin->w_width + curwin->w_vsep_width - (p_wiw - p_wmw)) / (p_wmw + 1); } else { - // Each window needs at least 'winminheight' lines - // If statusline isn't global, each window also needs a statusline + // Each window needs at least 'winminheight' lines. + // If statusline isn't global, each window also needs a statusline. + // If 'winbar' is set, each window also needs a winbar. maxcount = (curwin->w_height + curwin->w_hsep_height + curwin->w_status_height - - (p_wh - p_wmh)) / (p_wmh + STATUS_HEIGHT); + - (p_wh - p_wmh)) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); } if (maxcount < 2) { @@ -1705,17 +1703,13 @@ int make_windows(int count, bool vertical) count = maxcount; } - /* - * add status line now, otherwise first window will be too big - */ + // add status line now, otherwise first window will be too big if (count > 1) { last_status(true); } - /* - * Don't execute autocommands while creating the windows. Must do that - * when putting the buffers in the windows. - */ + // Don't execute autocommands while creating the windows. Must do that + // when putting the buffers in the windows. block_autocmds(); // todo is number of windows left to create @@ -1790,7 +1784,7 @@ static void win_exchange(long Prenum) * if wp != wp2 * 3. remove wp from the list * 4. insert wp after wp2 - * 5. exchange the status line height, hsep height and vsep width. + * 5. exchange the status line height, winbar height, hsep height and vsep width. */ wp2 = curwin->w_prev; frp2 = curwin->w_frame->fr_prev; @@ -1897,7 +1891,7 @@ static void win_rotate(bool upwards, int count) frame_insert(frp->fr_parent->fr_child, frp); } - // exchange status height, hsep height and vsep width of old and new last window + // exchange status height, winbar height, hsep height and vsep width of old and new last window n = wp2->w_status_height; wp2->w_status_height = wp1->w_status_height; wp1->w_status_height = n; @@ -1988,7 +1982,8 @@ void win_move_after(win_T *win1, win_T *win2) return; } - // may need move the status line, horizontal or vertical separator of the last window + // may need move the status line, window bar, horizontal or vertical separator of the last + // window if (win1 == lastwin) { height = win1->w_prev->w_status_height; win1->w_prev->w_status_height = win1->w_status_height; @@ -2237,7 +2232,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int } else { extra_sep = 0; } - totwincount = (n + extra_sep) / (p_wmh + STATUS_HEIGHT); + totwincount = (n + extra_sep) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); has_next_curwin = frame_has_win(topfr, next_curwin); /* @@ -2272,7 +2267,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int } else { // These windows don't use up room. totwincount -= (n + (fr->fr_next == NULL - ? extra_sep : 0)) / (p_wmh + STATUS_HEIGHT); + ? extra_sep : 0)) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); } room -= new_size - n; if (room < 0) { @@ -2318,7 +2313,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int // Compute the maximum number of windows vert. in "fr". n = frame_minheight(fr, NOWIN); wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) - / (p_wmh + STATUS_HEIGHT); + / (p_wmh + STATUS_HEIGHT + global_winbar_height()); m = frame_minheight(fr, next_curwin); if (has_next_curwin) { hnc = frame_has_win(fr, next_curwin); @@ -2376,7 +2371,7 @@ static void leaving_window(win_T *const win) // When leaving the window (or closing the window) was done from a // callback we need to break out of the Insert mode loop and restart Insert // mode when entering the window again. - if (State & INSERT) { + if (State & MODE_INSERT) { stop_insert_mode = true; if (win->w_buffer->b_prompt_insert == NUL) { win->w_buffer->b_prompt_insert = 'A'; @@ -2400,7 +2395,7 @@ void entering_window(win_T *const win) // When entering the prompt window restart Insert mode if we were in Insert // mode when we left it and not already in Insert mode. - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { restart_edit = win->w_buffer->b_prompt_insert; } } @@ -2916,8 +2911,8 @@ static void do_autocmd_winclosed(win_T *win) return; } recursive = true; - char_u winid[NUMBUFLEN]; - vim_snprintf((char *)winid, sizeof(winid), "%d", win->handle); + char winid[NUMBUFLEN]; + vim_snprintf(winid, sizeof(winid), "%d", win->handle); apply_autocmds(EVENT_WINCLOSED, winid, winid, false, win->w_buffer); recursive = false; } @@ -2984,9 +2979,9 @@ void win_close_othertab(win_T *win, int free_buf, tabpage_T *tp) // When closing the last window in a tab page remove the tab page. if (tp->tp_firstwin == tp->tp_lastwin) { - char_u prev_idx[NUMBUFLEN]; + char prev_idx[NUMBUFLEN]; if (has_event(EVENT_TABCLOSED)) { - vim_snprintf((char *)prev_idx, NUMBUFLEN, "%i", tabpage_index(tp)); + vim_snprintf(prev_idx, NUMBUFLEN, "%i", tabpage_index(tp)); } if (tp == first_tabpage) { @@ -3732,13 +3727,9 @@ static void frame_fix_height(win_T *wp) wp->w_frame->fr_height = wp->w_height + wp->w_hsep_height + wp->w_status_height; } -/* - * Compute the minimal height for frame "topfrp". - * Uses the 'winminheight' option. - * When "next_curwin" isn't NULL, use p_wh for this window. - * When "next_curwin" is NOWIN, don't use at least one line for the current - * window. - */ +/// Compute the minimal height for frame "topfrp". Uses the 'winminheight' option. +/// When "next_curwin" isn't NULL, use p_wh for this window. +/// When "next_curwin" is NOWIN, don't use at least one line for the current window. static int frame_minheight(frame_T *topfrp, win_T *next_curwin) { frame_T *frp; @@ -3746,12 +3737,14 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin) int n; if (topfrp->fr_win != NULL) { + // Combined height of window bar and separator column or status line. + int extra_height = topfrp->fr_win->w_winbar_height + topfrp->fr_win->w_hsep_height + + topfrp->fr_win->w_status_height; + if (topfrp->fr_win == next_curwin) { - m = p_wh + topfrp->fr_win->w_hsep_height + topfrp->fr_win->w_status_height; + m = p_wh + extra_height; } else { - // window: minimal height of the window plus separator column or status line - // depending on whether global statusline is enabled - m = p_wmh + topfrp->fr_win->w_hsep_height + topfrp->fr_win->w_status_height; + m = p_wmh + extra_height; if (topfrp->fr_win == curwin && next_curwin == NULL) { // Current window is minimal one line high. if (p_wmh == 0) { @@ -3976,7 +3969,7 @@ static void new_frame(win_T *wp) void win_init_size(void) { firstwin->w_height = ROWS_AVAIL; - firstwin->w_height_inner = firstwin->w_height; + firstwin->w_height_inner = firstwin->w_height - firstwin->w_winbar_height; firstwin->w_height_outer = firstwin->w_height; topframe->fr_height = ROWS_AVAIL; firstwin->w_width = Columns; @@ -4087,6 +4080,7 @@ int win_new_tabpage(int after, char_u *filename) newtp->tp_topframe = topframe; last_status(false); + set_winbar(); redraw_all_later(NOT_VALID); @@ -4098,7 +4092,7 @@ int win_new_tabpage(int after, char_u *filename) apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf); apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf); - apply_autocmds(EVENT_TABNEW, filename, filename, false, curbuf); + apply_autocmds(EVENT_TABNEW, (char *)filename, (char *)filename, false, curbuf); apply_autocmds(EVENT_TABENTER, NULL, NULL, false, curbuf); return OK; @@ -4890,7 +4884,7 @@ void fix_current_dir(void) // (unless that was done already) and change to the local directory. if (globaldir == NULL) { if (cwd[0] != NUL) { - globaldir = (char_u *)xstrdup(cwd); + globaldir = xstrdup(cwd); } } bool dir_differs = pathcmp(new_dir, cwd, -1) != 0; @@ -4909,13 +4903,13 @@ void fix_current_dir(void) } else if (globaldir != NULL) { // Window doesn't have a local directory and we are not in the global // directory: Change to the global directory. - bool dir_differs = pathcmp((char *)globaldir, cwd, -1) != 0; + bool dir_differs = pathcmp(globaldir, cwd, -1) != 0; if (!p_acd && dir_differs) { - do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, true); + do_autocmd_dirchanged(globaldir, kCdScopeGlobal, kCdCauseWindow, true); } - if (os_chdir((char *)globaldir) == 0) { + if (os_chdir(globaldir) == 0) { if (!p_acd && dir_differs) { - do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, false); + do_autocmd_dirchanged(globaldir, kCdScopeGlobal, kCdCauseWindow, false); } } XFREE_CLEAR(globaldir); @@ -5317,8 +5311,8 @@ void may_trigger_winscrolled(void) || wp->w_last_leftcol != wp->w_leftcol || wp->w_last_width != wp->w_width || wp->w_last_height != wp->w_height) { - char_u winid[NUMBUFLEN]; - vim_snprintf((char *)winid, sizeof(winid), "%d", wp->handle); + char winid[NUMBUFLEN]; + vim_snprintf(winid, sizeof(winid), "%d", wp->handle); recursive = true; apply_autocmds(EVENT_WINSCROLLED, winid, winid, false, wp->w_buffer); @@ -5460,16 +5454,9 @@ void win_setheight(int height) */ void win_setheight_win(int height, win_T *win) { - if (win == curwin) { - // Always keep current window at least one line high, even when - // 'winminheight' is zero. - if (height < p_wmh) { - height = p_wmh; - } - if (height == 0) { - height = 1; - } - } + // Always keep current window at least one line high, even when 'winminheight' is zero. + // Keep window at least two lines high if 'winbar' is enabled. + height = MAX(height, (win == curwin ? MAX(p_wmh, 1) : p_wmh) + win->w_winbar_height); if (win->w_floating) { win->w_float_config.height = height; @@ -6262,7 +6249,7 @@ void win_set_inner_size(win_T *wp) int prev_height = wp->w_height_inner; int height = wp->w_height_request; if (height == 0) { - height = wp->w_height; + height = wp->w_height - wp->w_winbar_height; } if (height != prev_height) { @@ -6279,8 +6266,8 @@ void win_set_inner_size(win_T *wp) set_fraction(wp); } } - wp->w_height_inner = height; wp->w_skipcol = 0; + wp->w_height_inner = height; // There is no point in adjusting the scroll position when exiting. Some // values might be invalid. @@ -6306,10 +6293,20 @@ void win_set_inner_size(win_T *wp) terminal_check_size(wp->w_buffer->terminal); } - wp->w_height_outer = (wp->w_height_inner - + wp->w_border_adj[0] + wp->w_border_adj[2]); - wp->w_width_outer = (wp->w_width_inner - + wp->w_border_adj[1] + wp->w_border_adj[3]); + wp->w_height_outer = (wp->w_height_inner + win_extra_height(wp)); + wp->w_width_outer = (wp->w_width_inner + win_extra_width(wp)); + wp->w_winrow_off = wp->w_border_adj[0] + wp->w_winbar_height; + wp->w_wincol_off = wp->w_border_adj[3]; +} + +static int win_extra_height(win_T *wp) +{ + return wp->w_border_adj[0] + wp->w_border_adj[2] + wp->w_winbar_height; +} + +static int win_extra_width(win_T *wp) +{ + return wp->w_border_adj[1] + wp->w_border_adj[3]; } /// Set the width of a window. @@ -6477,7 +6474,7 @@ char_u *file_name_at_cursor(int options, long count, linenr_T *file_lnum) char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u *rel_fname, linenr_T *file_lnum) { - char_u *ptr; + char *ptr; size_t len; bool in_type = true; bool is_url = false; @@ -6485,7 +6482,7 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u /* * search forward for what could be the start of a file name */ - ptr = line + col; + ptr = (char *)line + col; while (*ptr != NUL && !vim_isfilec(*ptr)) { MB_PTR_ADV(ptr); } @@ -6500,11 +6497,10 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u * Search backward for first char of the file name. * Go one char back to ":" before "//" even when ':' is not in 'isfname'. */ - while (ptr > line) { - if ((len = (size_t)(utf_head_off(line, ptr - 1))) > 0) { + while ((char_u *)ptr > line) { + if ((len = (size_t)(utf_head_off(line, (char_u *)ptr - 1))) > 0) { ptr -= len + 1; - } else if (vim_isfilec(ptr[-1]) - || ((options & FNAME_HYP) && path_is_url((char *)ptr - 1))) { + } else if (vim_isfilec(ptr[-1]) || ((options & FNAME_HYP) && path_is_url(ptr - 1))) { ptr--; } else { break; @@ -6517,13 +6513,13 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u */ len = 0; while (vim_isfilec(ptr[len]) || (ptr[len] == '\\' && ptr[len + 1] == ' ') - || ((options & FNAME_HYP) && path_is_url((char *)ptr + len)) - || (is_url && vim_strchr((char_u *)":?&=", ptr[len]) != NULL)) { + || ((options & FNAME_HYP) && path_is_url(ptr + len)) + || (is_url && vim_strchr(":?&=", ptr[len]) != NULL)) { // After type:// we also include :, ?, & and = as valid characters, so that // http://google.com:8080?q=this&that=ok works. if ((ptr[len] >= 'A' && ptr[len] <= 'Z') || (ptr[len] >= 'a' && ptr[len] <= 'z')) { - if (in_type && path_is_url((char *)ptr + len + 1)) { + if (in_type && path_is_url(ptr + len + 1)) { is_url = true; } } else { @@ -6534,20 +6530,20 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u // Skip over the "\" in "\ ". ++len; } - len += (size_t)(utfc_ptr2len((char *)ptr + len)); + len += (size_t)(utfc_ptr2len(ptr + len)); } /* * If there is trailing punctuation, remove it. * But don't remove "..", could be a directory name. */ - if (len > 2 && vim_strchr((char_u *)".,:;!", ptr[len - 1]) != NULL + if (len > 2 && vim_strchr(".,:;!", ptr[len - 1]) != NULL && ptr[len - 2] != '.') { --len; } if (file_lnum != NULL) { - char_u *p; + char *p; const char *line_english = " line "; const char *line_transl = _(line_msg); @@ -6560,20 +6556,20 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u } else if (STRNCMP(p, line_transl, STRLEN(line_transl)) == 0) { p += STRLEN(line_transl); } else { - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); } if (*p != NUL) { if (!isdigit(*p)) { p++; // skip the separator } - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); if (isdigit(*p)) { - *file_lnum = getdigits_long(&p, false, 0); + *file_lnum = getdigits_long((char_u **)&p, false, 0); } } } - return find_file_name_in_path(ptr, len, options, count, rel_fname); + return find_file_name_in_path((char_u *)ptr, len, options, count, rel_fname); } /// Add or remove a status line from window(s), according to the @@ -6663,6 +6659,19 @@ static void last_status_rec(frame_T *fr, bool statusline, bool is_stl_global) } } +// Add or remove window bars from windows depending on the value of 'winbar'. +void set_winbar(void) +{ + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + int winbar_height = (*p_wbr != NUL || *wp->w_p_wbr != NUL) ? 1 : 0; + if (wp->w_winbar_height != winbar_height) { + wp->w_winbar_height = winbar_height; + win_set_inner_size(wp); + wp->w_redr_winbar = winbar_height; + } + } +} + /// Return the number of lines used by the tab page line. int tabline_height(void) { @@ -6679,6 +6688,12 @@ int tabline_height(void) return 1; } +/// Return the number of lines used by default by the window bar. +int global_winbar_height(void) +{ + return *p_wbr != NUL ? 1 : 0; +} + /// Return the number of lines used by the global statusline int global_stl_height(void) { |