diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/command.c | 127 | ||||
-rw-r--r-- | src/nvim/api/deprecated.c | 4 | ||||
-rw-r--r-- | src/nvim/api/options.c | 8 | ||||
-rw-r--r-- | src/nvim/api/private/helpers.c | 4 | ||||
-rw-r--r-- | src/nvim/api/private/helpers.h | 3 | ||||
-rw-r--r-- | src/nvim/api/ui.c | 15 | ||||
-rw-r--r-- | src/nvim/api/vim.c | 10 | ||||
-rw-r--r-- | src/nvim/api/win_config.c | 6 | ||||
-rw-r--r-- | src/nvim/autocmd.c | 4 | ||||
-rw-r--r-- | src/nvim/decoration.c | 6 | ||||
-rw-r--r-- | src/nvim/eval/funcs.c | 6 | ||||
-rw-r--r-- | src/nvim/highlight.c | 64 | ||||
-rw-r--r-- | src/nvim/highlight_group.c | 2 | ||||
-rw-r--r-- | src/nvim/message.c | 2 | ||||
-rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 6 | ||||
-rw-r--r-- | src/nvim/option.c | 43 | ||||
-rw-r--r-- | src/nvim/os/fs.c | 2 | ||||
-rw-r--r-- | src/nvim/popupmenu.c | 2 | ||||
-rw-r--r-- | src/nvim/sign.c | 2 | ||||
-rw-r--r-- | src/nvim/ui.c | 36 | ||||
-rw-r--r-- | src/nvim/usercmd.c | 14 | ||||
-rw-r--r-- | src/nvim/window.c | 2 |
22 files changed, 192 insertions, 176 deletions
diff --git a/src/nvim/api/command.c b/src/nvim/api/command.c index db0a918f5c..bafc45e543 100644 --- a/src/nvim/api/command.c +++ b/src/nvim/api/command.c @@ -96,15 +96,15 @@ /// - "belowright": |:belowright|. /// - "topleft": |:topleft|. /// - "botright": |:botright|. -Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) +Dict(cmd) nvim_parse_cmd(String str, Dict(empty) *opts, Arena *arena, Error *err) FUNC_API_SINCE(10) FUNC_API_FAST { - Dictionary result = ARRAY_DICT_INIT; + Dict(cmd) result = { 0 }; // Parse command line exarg_T ea; CmdParseInfo cmdinfo; - char *cmdline = string_to_cstr(str); + char *cmdline = arena_memdupz(arena, str.data, str.size); const char *errormsg = NULL; if (!parse_cmdline(cmdline, &ea, &cmdinfo, &errormsg)) { @@ -124,22 +124,23 @@ Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) // otherwise split arguments by whitespace. if (ea.argt & EX_NOSPC) { if (*ea.arg != NUL) { - ADD(args, STRING_OBJ(cstrn_to_string(ea.arg, length))); + args = arena_array(arena, 1); + ADD_C(args, STRING_OBJ(cstrn_as_string(ea.arg, length))); } } else { size_t end = 0; size_t len = 0; - char *buf = xcalloc(length, sizeof(char)); + char *buf = arena_alloc(arena, length + 1, false); bool done = false; + args = arena_array(arena, uc_nargs_upper_bound(ea.arg, length)); while (!done) { done = uc_split_args_iter(ea.arg, length, &end, buf, &len); if (len > 0) { - ADD(args, STRING_OBJ(cstrn_to_string(buf, len))); + ADD_C(args, STRING_OBJ(cstrn_as_string(buf, len))); + buf += len + 1; } } - - xfree(buf); } ucmd_T *cmd = NULL; @@ -149,40 +150,32 @@ Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) cmd = USER_CMD_GA(&curbuf->b_ucmds, ea.useridx); } - if (cmd != NULL) { - PUT(result, "cmd", CSTR_TO_OBJ(cmd->uc_name)); - } else { - PUT(result, "cmd", CSTR_TO_OBJ(get_command_name(NULL, ea.cmdidx))); - } + char *name = (cmd != NULL ? cmd->uc_name : get_command_name(NULL, ea.cmdidx)); + PUT_KEY(result, cmd, cmd, cstr_as_string(name)); if (ea.argt & EX_RANGE) { - Array range = ARRAY_DICT_INIT; + Array range = arena_array(arena, 2); if (ea.addr_count > 0) { if (ea.addr_count > 1) { - ADD(range, INTEGER_OBJ(ea.line1)); + ADD_C(range, INTEGER_OBJ(ea.line1)); } - ADD(range, INTEGER_OBJ(ea.line2)); + ADD_C(range, INTEGER_OBJ(ea.line2)); } - PUT(result, "range", ARRAY_OBJ(range)); + PUT_KEY(result, cmd, range, range); } if (ea.argt & EX_COUNT) { - if (ea.addr_count > 0) { - PUT(result, "count", INTEGER_OBJ(ea.line2)); - } else if (cmd != NULL) { - PUT(result, "count", INTEGER_OBJ(cmd->uc_def)); - } else { - PUT(result, "count", INTEGER_OBJ(0)); - } + Integer count = ea.addr_count > 0 ? ea.line2 : (cmd != NULL ? cmd->uc_def : 0); + PUT_KEY(result, cmd, count, count); } if (ea.argt & EX_REGSTR) { char reg[2] = { (char)ea.regname, NUL }; - PUT(result, "reg", CSTR_TO_OBJ(reg)); + PUT_KEY(result, cmd, reg, CSTR_TO_ARENA_STR(arena, reg)); } - PUT(result, "bang", BOOLEAN_OBJ(ea.forceit)); - PUT(result, "args", ARRAY_OBJ(args)); + PUT_KEY(result, cmd, bang, ea.forceit); + PUT_KEY(result, cmd, args, args); char nargs[2]; if (ea.argt & EX_EXTRA) { @@ -201,9 +194,9 @@ Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) nargs[0] = '0'; } nargs[1] = '\0'; - PUT(result, "nargs", CSTR_TO_OBJ(nargs)); + PUT_KEY(result, cmd, nargs, CSTR_TO_ARENA_OBJ(arena, nargs)); - const char *addr; + char *addr; switch (ea.addr_type) { case ADDR_LINES: addr = "line"; @@ -233,38 +226,37 @@ Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) addr = "?"; break; } - PUT(result, "addr", CSTR_TO_OBJ(addr)); - PUT(result, "nextcmd", CSTR_TO_OBJ(ea.nextcmd)); - - Dictionary mods = ARRAY_DICT_INIT; - - Dictionary filter = ARRAY_DICT_INIT; - PUT(filter, "pattern", cmdinfo.cmdmod.cmod_filter_pat - ? CSTR_TO_OBJ(cmdinfo.cmdmod.cmod_filter_pat) - : STATIC_CSTR_TO_OBJ("")); - PUT(filter, "force", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_filter_force)); - PUT(mods, "filter", DICTIONARY_OBJ(filter)); - - PUT(mods, "silent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_SILENT)); - PUT(mods, "emsg_silent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_ERRSILENT)); - PUT(mods, "unsilent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_UNSILENT)); - PUT(mods, "sandbox", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_SANDBOX)); - PUT(mods, "noautocmd", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_NOAUTOCMD)); - PUT(mods, "tab", INTEGER_OBJ(cmdinfo.cmdmod.cmod_tab - 1)); - PUT(mods, "verbose", INTEGER_OBJ(cmdinfo.cmdmod.cmod_verbose - 1)); - PUT(mods, "browse", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_BROWSE)); - PUT(mods, "confirm", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_CONFIRM)); - PUT(mods, "hide", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_HIDE)); - PUT(mods, "keepalt", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPALT)); - PUT(mods, "keepjumps", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPJUMPS)); - PUT(mods, "keepmarks", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPMARKS)); - PUT(mods, "keeppatterns", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPPATTERNS)); - PUT(mods, "lockmarks", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_LOCKMARKS)); - PUT(mods, "noswapfile", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_NOSWAPFILE)); - PUT(mods, "vertical", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_split & WSP_VERT)); - PUT(mods, "horizontal", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_split & WSP_HOR)); - - const char *split; + PUT_KEY(result, cmd, addr, CSTR_AS_OBJ(addr)); + PUT_KEY(result, cmd, nextcmd, CSTR_AS_OBJ(ea.nextcmd)); + + // TODO(bfredl): nested keydict would be nice.. + Dictionary mods = arena_dict(arena, 20); + + Dictionary filter = arena_dict(arena, 2); + PUT_C(filter, "pattern", CSTR_TO_ARENA_OBJ(arena, cmdinfo.cmdmod.cmod_filter_pat)); + PUT_C(filter, "force", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_filter_force)); + PUT_C(mods, "filter", DICTIONARY_OBJ(filter)); + + PUT_C(mods, "silent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_SILENT)); + PUT_C(mods, "emsg_silent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_ERRSILENT)); + PUT_C(mods, "unsilent", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_UNSILENT)); + PUT_C(mods, "sandbox", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_SANDBOX)); + PUT_C(mods, "noautocmd", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_NOAUTOCMD)); + PUT_C(mods, "tab", INTEGER_OBJ(cmdinfo.cmdmod.cmod_tab - 1)); + PUT_C(mods, "verbose", INTEGER_OBJ(cmdinfo.cmdmod.cmod_verbose - 1)); + PUT_C(mods, "browse", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_BROWSE)); + PUT_C(mods, "confirm", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_CONFIRM)); + PUT_C(mods, "hide", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_HIDE)); + PUT_C(mods, "keepalt", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPALT)); + PUT_C(mods, "keepjumps", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPJUMPS)); + PUT_C(mods, "keepmarks", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPMARKS)); + PUT_C(mods, "keeppatterns", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_KEEPPATTERNS)); + PUT_C(mods, "lockmarks", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_LOCKMARKS)); + PUT_C(mods, "noswapfile", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_flags & CMOD_NOSWAPFILE)); + PUT_C(mods, "vertical", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_split & WSP_VERT)); + PUT_C(mods, "horizontal", BOOLEAN_OBJ(cmdinfo.cmdmod.cmod_split & WSP_HOR)); + + char *split; if (cmdinfo.cmdmod.cmod_split & WSP_BOT) { split = "botright"; } else if (cmdinfo.cmdmod.cmod_split & WSP_TOP) { @@ -276,18 +268,17 @@ Dictionary nvim_parse_cmd(String str, Dict(empty) *opts, Error *err) } else { split = ""; } - PUT(mods, "split", CSTR_TO_OBJ(split)); + PUT_C(mods, "split", CSTR_AS_OBJ(split)); - PUT(result, "mods", DICTIONARY_OBJ(mods)); + PUT_KEY(result, cmd, mods, mods); - Dictionary magic = ARRAY_DICT_INIT; - PUT(magic, "file", BOOLEAN_OBJ(cmdinfo.magic.file)); - PUT(magic, "bar", BOOLEAN_OBJ(cmdinfo.magic.bar)); - PUT(result, "magic", DICTIONARY_OBJ(magic)); + Dictionary magic = arena_dict(arena, 2); + PUT_C(magic, "file", BOOLEAN_OBJ(cmdinfo.magic.file)); + PUT_C(magic, "bar", BOOLEAN_OBJ(cmdinfo.magic.bar)); + PUT_KEY(result, cmd, magic, magic); undo_cmdmod(&cmdinfo.cmdmod); end: - xfree(cmdline); return result; } diff --git a/src/nvim/api/deprecated.c b/src/nvim/api/deprecated.c index b09645a819..27f0589e53 100644 --- a/src/nvim/api/deprecated.c +++ b/src/nvim/api/deprecated.c @@ -514,11 +514,11 @@ static int64_t convert_index(int64_t index) /// @param name Option name /// @param[out] err Error details, if any /// @return Option Information -Dictionary nvim_get_option_info(String name, Error *err) +Dictionary nvim_get_option_info(String name, Arena *arena, Error *err) FUNC_API_SINCE(7) FUNC_API_DEPRECATED_SINCE(11) { - return get_vimoption(name, OPT_GLOBAL, curbuf, curwin, err); + return get_vimoption(name, OPT_GLOBAL, curbuf, curwin, arena, err); } /// Sets the global value of an option. diff --git a/src/nvim/api/options.c b/src/nvim/api/options.c index fce4a85804..8128fdf67b 100644 --- a/src/nvim/api/options.c +++ b/src/nvim/api/options.c @@ -263,10 +263,10 @@ void nvim_set_option_value(uint64_t channel_id, String name, Object value, Dict( /// @see |nvim_get_commands()| /// /// @return dictionary of all options -Dictionary nvim_get_all_options_info(Error *err) +Dictionary nvim_get_all_options_info(Arena *arena, Error *err) FUNC_API_SINCE(7) { - return get_all_vimoptions(); + return get_all_vimoptions(arena); } /// Gets the option information for one option from arbitrary buffer or window @@ -302,7 +302,7 @@ Dictionary nvim_get_all_options_info(Error *err) /// Implies {scope} is "local". /// @param[out] err Error details, if any /// @return Option Information -Dictionary nvim_get_option_info2(String name, Dict(option) *opts, Error *err) +Dictionary nvim_get_option_info2(String name, Dict(option) *opts, Arena *arena, Error *err) FUNC_API_SINCE(11) { OptIndex opt_idx = 0; @@ -317,5 +317,5 @@ Dictionary nvim_get_option_info2(String name, Dict(option) *opts, Error *err) buf_T *buf = (req_scope == kOptReqBuf) ? (buf_T *)from : curbuf; win_T *win = (req_scope == kOptReqWin) ? (win_T *)from : curwin; - return get_vimoption(name, scope, buf, win, err); + return get_vimoption(name, scope, buf, win, arena, err); } diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index cc95f46baf..8b45af7c71 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -425,12 +425,12 @@ String cstrn_as_string(char *str, size_t maxsize) /// @param str the C string to use /// @return The resulting String, or an empty String if /// str was NULL -String cstr_as_string(char *str) FUNC_ATTR_PURE +String cstr_as_string(const char *str) FUNC_ATTR_PURE { if (str == NULL) { return (String)STRING_INIT; } - return (String){ .data = str, .size = strlen(str) }; + return (String){ .data = (char *)str, .size = strlen(str) }; } /// Return the owned memory of a ga as a String diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h index 0dbe3d2fb6..9ee812f45c 100644 --- a/src/nvim/api/private/helpers.h +++ b/src/nvim/api/private/helpers.h @@ -32,7 +32,8 @@ #define CSTR_AS_OBJ(s) STRING_OBJ(cstr_as_string(s)) #define CSTR_TO_OBJ(s) STRING_OBJ(cstr_to_string(s)) -#define CSTR_TO_ARENA_OBJ(arena, s) STRING_OBJ(arena_string(arena, cstr_as_string(s))) +#define CSTR_TO_ARENA_STR(arena, s) arena_string(arena, cstr_as_string(s)) +#define CSTR_TO_ARENA_OBJ(arena, s) STRING_OBJ(CSTR_TO_ARENA_STR(arena, s)) #define BUFFER_OBJ(s) ((Object) { \ .type = kObjectTypeBuffer, \ diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index f955b315a8..5c8ebfb861 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -247,10 +247,9 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, Dictiona void ui_attach(uint64_t channel_id, Integer width, Integer height, Boolean enable_rgb, Error *err) FUNC_API_DEPRECATED_SINCE(1) { - Dictionary opts = ARRAY_DICT_INIT; - PUT(opts, "rgb", BOOLEAN_OBJ(enable_rgb)); + MAXSIZE_TEMP_DICT(opts, 1); + PUT_C(opts, "rgb", BOOLEAN_OBJ(enable_rgb)); nvim_ui_attach(channel_id, width, height, opts, err); - api_free_dictionary(opts); } /// Tells the nvim server if focus was gained or lost by the GUI @@ -789,7 +788,7 @@ void remote_ui_hl_attr_define(UI *ui, Integer id, HlAttrs rgb_attrs, HlAttrs cte // system. So we add them here. if (rgb_attrs.url >= 0) { const char *url = hl_get_url((uint32_t)rgb_attrs.url); - PUT_C(rgb, "url", STRING_OBJ(cstr_as_string((char *)url))); + PUT_C(rgb, "url", CSTR_AS_OBJ(url)); } ADD_C(args, DICTIONARY_OBJ(rgb)); @@ -857,7 +856,7 @@ void remote_ui_put(UI *ui, const char *cell) UIData *data = ui->data; data->client_col++; Array args = data->call_buf; - ADD_C(args, CSTR_AS_OBJ((char *)cell)); + ADD_C(args, CSTR_AS_OBJ(cell)); push_call(ui, "put", args); } @@ -1113,9 +1112,3 @@ void remote_ui_event(UI *ui, char *name, Array args) free_ret: arena_mem_free(arena_finish(&arena)); } - -void remote_ui_inspect(UI *ui, Dictionary *info) -{ - UIData *data = ui->data; - PUT(*info, "chan", INTEGER_OBJ((Integer)data->channel_id)); -} diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 1453de30d4..a47694a0cf 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -1866,10 +1866,10 @@ Dictionary nvim__stats(Arena *arena) /// - "rgb" true if the UI uses RGB colors (false implies |cterm-colors|) /// - "ext_..." Requested UI extensions, see |ui-option| /// - "chan" |channel-id| of remote UI -Array nvim_list_uis(void) +Array nvim_list_uis(Arena *arena) FUNC_API_SINCE(4) { - return ui_array(); + return ui_array(arena); } /// Gets the immediate children of process `pid`. @@ -2005,7 +2005,7 @@ Array nvim__inspect_cell(Integer grid, Integer row, Integer col, Arena *arena, E ADD_C(ret, DICTIONARY_OBJ(hl_get_attr_by_id(attr, true, arena, err))); // will not work first time if (!highlight_use_hlstate()) { - ADD_C(ret, ARRAY_OBJ(hl_inspect(attr))); + ADD_C(ret, ARRAY_OBJ(hl_inspect(attr, arena))); } return ret; } @@ -2289,7 +2289,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Arena * opts->use_winbar, stc_hl_id); PUT_C(hl_info, "start", INTEGER_OBJ(0)); - PUT_C(hl_info, "group", CSTR_AS_OBJ((char *)grpname)); + PUT_C(hl_info, "group", CSTR_AS_OBJ(grpname)); ADD_C(hl_values, DICTIONARY_OBJ(hl_info)); } @@ -2308,7 +2308,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Arena * snprintf(user_group, sizeof(user_group), "User%d", sp->userhl); grpname = arena_memdupz(arena, user_group, strlen(user_group)); } - PUT_C(hl_info, "group", CSTR_AS_OBJ((char *)grpname)); + PUT_C(hl_info, "group", CSTR_AS_OBJ(grpname)); ADD_C(hl_values, DICTIONARY_OBJ(hl_info)); } PUT_C(result, "highlights", ARRAY_OBJ(hl_values)); diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c index 22a321149b..8841bd225b 100644 --- a/src/nvim/api/win_config.c +++ b/src/nvim/api/win_config.c @@ -626,7 +626,7 @@ Dict(win_config) nvim_win_get_config(Window window, Arena *arena, Error *err) PUT_KEY_X(rv, bufpos, pos); } } - PUT_KEY_X(rv, anchor, cstr_as_string((char *)float_anchor_str[config->anchor])); + PUT_KEY_X(rv, anchor, cstr_as_string(float_anchor_str[config->anchor])); PUT_KEY_X(rv, row, config->row); PUT_KEY_X(rv, col, config->col); PUT_KEY_X(rv, zindex, config->zindex); @@ -659,12 +659,12 @@ Dict(win_config) nvim_win_get_config(Window window, Arena *arena, Error *err) PUT_KEY_X(rv, width, wp->w_width); PUT_KEY_X(rv, height, wp->w_height); WinSplit split = win_split_dir(wp); - PUT_KEY_X(rv, split, cstr_as_string((char *)win_split_str[split])); + PUT_KEY_X(rv, split, cstr_as_string(win_split_str[split])); } const char *rel = (wp->w_floating && !config->external ? float_relative_str[config->relative] : ""); - PUT_KEY_X(rv, relative, cstr_as_string((char *)rel)); + PUT_KEY_X(rv, relative, cstr_as_string(rel)); return rv; } diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index a385161beb..8c7831688f 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -121,7 +121,7 @@ static void augroup_map_del(int id, const char *name) { if (name != NULL) { String key; - map_del(String, int)(&map_augroup_name_to_id, cstr_as_string((char *)name), &key); + map_del(String, int)(&map_augroup_name_to_id, cstr_as_string(name), &key); api_free_string(key); } if (id > 0) { @@ -476,7 +476,7 @@ void augroup_del(char *name, bool stupid_legacy_mode) int augroup_find(const char *name) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - int existing_id = map_get(String, int)(&map_augroup_name_to_id, cstr_as_string((char *)name)); + int existing_id = map_get(String, int)(&map_augroup_name_to_id, cstr_as_string(name)); if (existing_id == AUGROUP_DELETED) { return existing_id; } diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c index a593b8eda1..9742a2020a 100644 --- a/src/nvim/decoration.c +++ b/src/nvim/decoration.c @@ -977,12 +977,12 @@ void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name, Are } if (sh_hl.url != NULL) { - PUT_C(*dict, "url", STRING_OBJ(cstr_as_string((char *)sh_hl.url))); + PUT_C(*dict, "url", STRING_OBJ(cstr_as_string(sh_hl.url))); } if (virt_text) { if (virt_text->hl_mode) { - PUT_C(*dict, "hl_mode", CSTR_AS_OBJ((char *)hl_mode_str[virt_text->hl_mode])); + PUT_C(*dict, "hl_mode", CSTR_AS_OBJ(hl_mode_str[virt_text->hl_mode])); } Array chunks = virt_text_to_array(virt_text->data.virt_text, hl_name, arena); @@ -992,7 +992,7 @@ void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name, Are if (virt_text->pos == kVPosWinCol) { PUT_C(*dict, "virt_text_win_col", INTEGER_OBJ(virt_text->col)); } - PUT_C(*dict, "virt_text_pos", CSTR_AS_OBJ((char *)virt_text_pos_str[virt_text->pos])); + PUT_C(*dict, "virt_text_pos", CSTR_AS_OBJ(virt_text_pos_str[virt_text->pos])); priority = virt_text->priority; } diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 655d6c9ab3..e4d2a219d9 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -2093,8 +2093,8 @@ static void f_feedkeys(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) flags = tv_get_string_buf(&argvars[1], nbuf); } - nvim_feedkeys(cstr_as_string((char *)keys), - cstr_as_string((char *)flags), true); + nvim_feedkeys(cstr_as_string(keys), + cstr_as_string(flags), true); } /// "filereadable()" function @@ -4528,7 +4528,7 @@ static void f_luaeval(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) return; } - nlua_typval_eval(cstr_as_string((char *)str), &argvars[1], rettv); + nlua_typval_eval(cstr_as_string(str), &argvars[1], rettv); } static void find_some_match(typval_T *const argvars, typval_T *const rettv, diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c index 17d743784f..1dc06ec988 100644 --- a/src/nvim/highlight.c +++ b/src/nvim/highlight.c @@ -116,12 +116,13 @@ retry: {} // new attr id, send event to remote ui:s int id = (int)k; - Array inspect = hl_inspect(id); + Arena arena = ARENA_EMPTY; + Array inspect = hl_inspect(id, &arena); // Note: internally we don't distinguish between cterm and rgb attributes, // remote_ui_hl_attr_define will however. ui_call_hl_attr_define(id, entry.attr, entry.attr, inspect); - api_free_array(inspect); + arena_mem_free(arena_finish(&arena)); return id; } @@ -129,13 +130,14 @@ retry: {} void ui_send_all_hls(UI *ui) { for (size_t i = 1; i < set_size(&attr_entries); i++) { - Array inspect = hl_inspect((int)i); + Arena arena = ARENA_EMPTY; + Array inspect = hl_inspect((int)i, &arena); HlAttrs attr = attr_entry(i).attr; remote_ui_hl_attr_define(ui, (Integer)i, attr, attr, inspect); - api_free_array(inspect); + arena_mem_free(arena_finish(&arena)); } for (size_t hlf = 0; hlf < HLF_COUNT; hlf++) { - remote_ui_hl_group_set(ui, cstr_as_string((char *)hlf_names[hlf]), + remote_ui_hl_group_set(ui, cstr_as_string(hlf_names[hlf]), highlight_attr[hlf]); } } @@ -204,7 +206,7 @@ int ns_get_hl(NS *ns_hl, int hl_id, bool link, bool nodefault) if (!valid_item && p->hl_def != LUA_NOREF && !recursive) { MAXSIZE_TEMP_ARRAY(args, 3); ADD_C(args, INTEGER_OBJ((Integer)ns_id)); - ADD_C(args, CSTR_TO_OBJ(syn_id2name(hl_id))); + ADD_C(args, CSTR_AS_OBJ(syn_id2name(hl_id))); ADD_C(args, BOOLEAN_OBJ(link)); // TODO(bfredl): preload the "global" attr dict? @@ -1176,17 +1178,30 @@ int object_to_color(Object val, char *key, bool rgb, Error *err) } } -Array hl_inspect(int attr) +Array hl_inspect(int attr, Arena *arena) { - // TODO(bfredl): use arena allocation - Array ret = ARRAY_DICT_INIT; - if (hlstate_active) { - hl_inspect_impl(&ret, attr); + if (!hlstate_active) { + return (Array)ARRAY_DICT_INIT; } + Array ret = arena_array(arena, hl_inspect_size(attr)); + hl_inspect_impl(&ret, attr, arena); return ret; } -static void hl_inspect_impl(Array *arr, int attr) +static size_t hl_inspect_size(int attr) +{ + if (attr <= 0 || attr >= (int)set_size(&attr_entries)) { + return 0; + } + + HlEntry e = attr_entry(attr); + if (e.kind == kHlCombine || e.kind == kHlBlend || e.kind == kHlBlendThrough) { + return hl_inspect_size(e.id1) + hl_inspect_size(e.id2); + } + return 1; +} + +static void hl_inspect_impl(Array *arr, int attr, Arena *arena) { Dictionary item = ARRAY_DICT_INIT; if (attr <= 0 || attr >= (int)set_size(&attr_entries)) { @@ -1196,35 +1211,36 @@ static void hl_inspect_impl(Array *arr, int attr) HlEntry e = attr_entry(attr); switch (e.kind) { case kHlSyntax: - PUT(item, "kind", CSTR_TO_OBJ("syntax")); - PUT(item, "hi_name", - CSTR_TO_OBJ(syn_id2name(e.id1))); + item = arena_dict(arena, 3); + PUT_C(item, "kind", CSTR_AS_OBJ("syntax")); + PUT_C(item, "hi_name", CSTR_AS_OBJ(syn_id2name(e.id1))); break; case kHlUI: - PUT(item, "kind", CSTR_TO_OBJ("ui")); + item = arena_dict(arena, 4); + PUT_C(item, "kind", CSTR_AS_OBJ("ui")); const char *ui_name = (e.id1 == -1) ? "Normal" : hlf_names[e.id1]; - PUT(item, "ui_name", CSTR_TO_OBJ(ui_name)); - PUT(item, "hi_name", - CSTR_TO_OBJ(syn_id2name(e.id2))); + PUT_C(item, "ui_name", CSTR_AS_OBJ(ui_name)); + PUT_C(item, "hi_name", CSTR_AS_OBJ(syn_id2name(e.id2))); break; case kHlTerminal: - PUT(item, "kind", CSTR_TO_OBJ("term")); + item = arena_dict(arena, 2); + PUT_C(item, "kind", CSTR_AS_OBJ("term")); break; case kHlCombine: case kHlBlend: case kHlBlendThrough: // attribute combination is associative, so flatten to an array - hl_inspect_impl(arr, e.id1); - hl_inspect_impl(arr, e.id2); + hl_inspect_impl(arr, e.id1, arena); + hl_inspect_impl(arr, e.id2, arena); return; case kHlUnknown: case kHlInvalid: return; } - PUT(item, "id", INTEGER_OBJ(attr)); - ADD(*arr, DICTIONARY_OBJ(item)); + PUT_C(item, "id", INTEGER_OBJ(attr)); + ADD_C(*arr, DICTIONARY_OBJ(item)); } diff --git a/src/nvim/highlight_group.c b/src/nvim/highlight_group.c index 67b33e6ef7..a1ce206a2b 100644 --- a/src/nvim/highlight_group.c +++ b/src/nvim/highlight_group.c @@ -2241,7 +2241,7 @@ void highlight_changed(void) HlAttrs attrs = syn_attr2entry(highlight_attr[hlf]); msg_grid.blending = attrs.hl_blend > -1; } - ui_call_hl_group_set(cstr_as_string((char *)hlf_names[hlf]), + ui_call_hl_group_set(cstr_as_string(hlf_names[hlf]), highlight_attr[hlf]); highlight_attr_last[hlf] = highlight_attr[hlf]; } diff --git a/src/nvim/message.c b/src/nvim/message.c index cb89d34e23..991ed65ffe 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -3017,7 +3017,7 @@ void msg_ext_ui_flush(void) msg_ext_emit_chunk(); if (msg_ext_chunks.size > 0) { - ui_call_msg_show(cstr_as_string((char *)msg_ext_kind), + ui_call_msg_show(cstr_as_string(msg_ext_kind), msg_ext_chunks, msg_ext_overwrite); if (!msg_ext_overwrite) { msg_ext_visible++; diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index 0178ef622b..36fa7e77fc 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -547,7 +547,7 @@ static void send_error(Channel *chan, MsgpackRpcRequestHandler handler, MessageT static void send_request(Channel *channel, uint32_t id, const char *name, Array args) { - const String method = cstr_as_string((char *)name); + const String method = cstr_as_string(name); channel_write(channel, serialize_request(channel->id, id, method, @@ -558,7 +558,7 @@ static void send_request(Channel *channel, uint32_t id, const char *name, Array static void send_event(Channel *channel, const char *name, Array args) { - const String method = cstr_as_string((char *)name); + const String method = cstr_as_string(name); channel_write(channel, serialize_request(channel->id, 0, method, @@ -583,7 +583,7 @@ static void broadcast_event(const char *name, Array args) goto end; } - const String method = cstr_as_string((char *)name); + const String method = cstr_as_string(name); WBuffer *buffer = serialize_request(0, 0, method, diff --git a/src/nvim/option.c b/src/nvim/option.c index db013b460e..cdb27fcd1c 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -6314,32 +6314,33 @@ int get_sidescrolloff_value(win_T *wp) return (int)(wp->w_p_siso < 0 ? p_siso : wp->w_p_siso); } -Dictionary get_vimoption(String name, int scope, buf_T *buf, win_T *win, Error *err) +Dictionary get_vimoption(String name, int scope, buf_T *buf, win_T *win, Arena *arena, Error *err) { OptIndex opt_idx = find_option_len(name.data, name.size); VALIDATE_S(opt_idx != kOptInvalid, "option (not found)", name.data, { return (Dictionary)ARRAY_DICT_INIT; }); - return vimoption2dict(&options[opt_idx], scope, buf, win); + return vimoption2dict(&options[opt_idx], scope, buf, win, arena); } -Dictionary get_all_vimoptions(void) +Dictionary get_all_vimoptions(Arena *arena) { - Dictionary retval = ARRAY_DICT_INIT; + Dictionary retval = arena_dict(arena, kOptIndexCount); for (OptIndex opt_idx = 0; opt_idx < kOptIndexCount; opt_idx++) { - Dictionary opt_dict = vimoption2dict(&options[opt_idx], OPT_GLOBAL, curbuf, curwin); - PUT(retval, options[opt_idx].fullname, DICTIONARY_OBJ(opt_dict)); + Dictionary opt_dict = vimoption2dict(&options[opt_idx], OPT_GLOBAL, curbuf, curwin, arena); + PUT_C(retval, options[opt_idx].fullname, DICTIONARY_OBJ(opt_dict)); } return retval; } -static Dictionary vimoption2dict(vimoption_T *opt, int req_scope, buf_T *buf, win_T *win) +static Dictionary vimoption2dict(vimoption_T *opt, int req_scope, buf_T *buf, win_T *win, + Arena *arena) { - Dictionary dict = ARRAY_DICT_INIT; + Dictionary dict = arena_dict(arena, 13); - PUT(dict, "name", CSTR_TO_OBJ(opt->fullname)); - PUT(dict, "shortname", CSTR_TO_OBJ(opt->shortname)); + PUT_C(dict, "name", CSTR_AS_OBJ(opt->fullname)); + PUT_C(dict, "shortname", CSTR_AS_OBJ(opt->shortname)); const char *scope; if (opt->indir & PV_BUF) { @@ -6350,14 +6351,14 @@ static Dictionary vimoption2dict(vimoption_T *opt, int req_scope, buf_T *buf, wi scope = "global"; } - PUT(dict, "scope", CSTR_TO_OBJ(scope)); + PUT_C(dict, "scope", CSTR_AS_OBJ(scope)); // welcome to the jungle - PUT(dict, "global_local", BOOLEAN_OBJ(opt->indir & PV_BOTH)); - PUT(dict, "commalist", BOOLEAN_OBJ(opt->flags & P_COMMA)); - PUT(dict, "flaglist", BOOLEAN_OBJ(opt->flags & P_FLAGLIST)); + PUT_C(dict, "global_local", BOOLEAN_OBJ(opt->indir & PV_BOTH)); + PUT_C(dict, "commalist", BOOLEAN_OBJ(opt->flags & P_COMMA)); + PUT_C(dict, "flaglist", BOOLEAN_OBJ(opt->flags & P_FLAGLIST)); - PUT(dict, "was_set", BOOLEAN_OBJ(opt->flags & P_WAS_SET)); + PUT_C(dict, "was_set", BOOLEAN_OBJ(opt->flags & P_WAS_SET)); LastSet last_set = { .channel_id = 0 }; if (req_scope == OPT_GLOBAL) { @@ -6375,16 +6376,16 @@ static Dictionary vimoption2dict(vimoption_T *opt, int req_scope, buf_T *buf, wi } } - PUT(dict, "last_set_sid", INTEGER_OBJ(last_set.script_ctx.sc_sid)); - PUT(dict, "last_set_linenr", INTEGER_OBJ(last_set.script_ctx.sc_lnum)); - PUT(dict, "last_set_chan", INTEGER_OBJ((int64_t)last_set.channel_id)); + PUT_C(dict, "last_set_sid", INTEGER_OBJ(last_set.script_ctx.sc_sid)); + PUT_C(dict, "last_set_linenr", INTEGER_OBJ(last_set.script_ctx.sc_lnum)); + PUT_C(dict, "last_set_chan", INTEGER_OBJ((int64_t)last_set.channel_id)); // TODO(bfredl): do you even nocp? OptVal def = optval_from_varp(get_opt_idx(opt), &opt->def_val); - PUT(dict, "type", CSTR_TO_OBJ(optval_type_get_name(def.type))); - PUT(dict, "default", optval_as_object(optval_copy(def))); - PUT(dict, "allows_duplicates", BOOLEAN_OBJ(!(opt->flags & P_NODUP))); + PUT_C(dict, "type", CSTR_AS_OBJ(optval_type_get_name(def.type))); + PUT_C(dict, "default", optval_as_object(def)); + PUT_C(dict, "allows_duplicates", BOOLEAN_OBJ(!(opt->flags & P_NODUP))); return dict; } diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index 566d51f30a..ade745df2c 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -95,7 +95,7 @@ int os_chdir(const char *path) } int err = uv_chdir(path); if (err == 0) { - ui_call_chdir(cstr_as_string((char *)path)); + ui_call_chdir(cstr_as_string(path)); } return err; } diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c index 3f2d27edd0..d116b46d88 100644 --- a/src/nvim/popupmenu.c +++ b/src/nvim/popupmenu.c @@ -488,7 +488,7 @@ void pum_redraw(void) if (ui_has(kUIMultigrid)) { const char *anchor = pum_above ? "SW" : "NW"; int row_off = pum_above ? -pum_height : 0; - ui_call_win_float_pos(pum_grid.handle, -1, cstr_as_string((char *)anchor), pum_anchor_grid, + ui_call_win_float_pos(pum_grid.handle, -1, cstr_as_string(anchor), pum_anchor_grid, pum_row - row_off, pum_left_col, false, pum_grid.zindex); } diff --git a/src/nvim/sign.c b/src/nvim/sign.c index 1cf91f273a..9caacd8115 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -84,7 +84,7 @@ static int64_t group_get_ns(const char *group) return UINT32_MAX; // All namespaces } // Specific or non-existing namespace - int ns = map_get(String, int)(&namespace_ids, cstr_as_string((char *)group)); + int ns = map_get(String, int)(&namespace_ids, cstr_as_string(group)); return ns ? ns : -1; } diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 2744f68951..6420f44640 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -229,7 +229,7 @@ void ui_refresh(void) } ui_ext[i] = ext_widgets[i]; if (i < kUIGlobalCount) { - ui_call_option_set(cstr_as_string((char *)ui_ext_names[i]), + ui_call_option_set(cstr_as_string(ui_ext_names[i]), BOOLEAN_OBJ(ext_widgets[i])); } } @@ -451,8 +451,7 @@ void ui_set_ext_option(UI *ui, UIExtension ext, bool active) return; } if (ui_ext_names[ext][0] != '_' || active) { - remote_ui_option_set(ui, cstr_as_string((char *)ui_ext_names[ext]), - BOOLEAN_OBJ(active)); + remote_ui_option_set(ui, cstr_as_string(ui_ext_names[ext]), BOOLEAN_OBJ(active)); } if (ext == kUITermColors) { ui_default_colors_set(); @@ -646,34 +645,35 @@ bool ui_has(UIExtension ext) return ui_ext[ext]; } -Array ui_array(void) +Array ui_array(Arena *arena) { - Array all_uis = ARRAY_DICT_INIT; + Array all_uis = arena_array(arena, ui_count); for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; - Dictionary info = ARRAY_DICT_INIT; - PUT(info, "width", INTEGER_OBJ(ui->width)); - PUT(info, "height", INTEGER_OBJ(ui->height)); - PUT(info, "rgb", BOOLEAN_OBJ(ui->rgb)); - PUT(info, "override", BOOLEAN_OBJ(ui->override)); + Dictionary info = arena_dict(arena, 10 + kUIExtCount); + PUT_C(info, "width", INTEGER_OBJ(ui->width)); + PUT_C(info, "height", INTEGER_OBJ(ui->height)); + PUT_C(info, "rgb", BOOLEAN_OBJ(ui->rgb)); + PUT_C(info, "override", BOOLEAN_OBJ(ui->override)); // TUI fields. (`stdin_fd` is intentionally omitted.) - PUT(info, "term_name", CSTR_TO_OBJ(ui->term_name)); + PUT_C(info, "term_name", CSTR_AS_OBJ(ui->term_name)); // term_background is deprecated. Populate with an empty string - PUT(info, "term_background", CSTR_TO_OBJ("")); + PUT_C(info, "term_background", STATIC_CSTR_AS_OBJ("")); - PUT(info, "term_colors", INTEGER_OBJ(ui->term_colors)); - PUT(info, "stdin_tty", BOOLEAN_OBJ(ui->stdin_tty)); - PUT(info, "stdout_tty", BOOLEAN_OBJ(ui->stdout_tty)); + PUT_C(info, "term_colors", INTEGER_OBJ(ui->term_colors)); + PUT_C(info, "stdin_tty", BOOLEAN_OBJ(ui->stdin_tty)); + PUT_C(info, "stdout_tty", BOOLEAN_OBJ(ui->stdout_tty)); for (UIExtension j = 0; j < kUIExtCount; j++) { if (ui_ext_names[j][0] != '_' || ui->ui_ext[j]) { - PUT(info, ui_ext_names[j], BOOLEAN_OBJ(ui->ui_ext[j])); + PUT_C(info, (char *)ui_ext_names[j], BOOLEAN_OBJ(ui->ui_ext[j])); } } - remote_ui_inspect(ui, &info); - ADD(all_uis, DICTIONARY_OBJ(info)); + PUT_C(info, "chan", INTEGER_OBJ((Integer)ui->data->channel_id)); + + ADD_C(all_uis, DICTIONARY_OBJ(info)); } return all_uis; } diff --git a/src/nvim/usercmd.c b/src/nvim/usercmd.c index e20c3f6044..729e57cb2b 100644 --- a/src/nvim/usercmd.c +++ b/src/nvim/usercmd.c @@ -1136,6 +1136,20 @@ bool uc_split_args_iter(const char *arg, size_t arglen, size_t *end, char *buf, return true; } +size_t uc_nargs_upper_bound(const char *arg, size_t arglen) +{ + bool was_white = true; // space before first arg + size_t nargs = 0; + for (size_t i = 0; i < arglen; i++) { + bool is_white = ascii_iswhite(arg[i]); + if (was_white && !is_white) { + nargs++; + } + was_white = is_white; + } + return nargs; +} + /// split and quote args for <f-args> static char *uc_split_args(const char *arg, char **args, const size_t *arglens, size_t argc, size_t *lenp) diff --git a/src/nvim/window.c b/src/nvim/window.c index c63d27976a..a188d75000 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -796,7 +796,7 @@ void ui_ext_win_position(win_T *wp, bool validate) wp->w_grid_alloc.zindex = wp->w_float_config.zindex; if (ui_has(kUIMultigrid)) { - String anchor = cstr_as_string((char *)float_anchor_str[c.anchor]); + String anchor = cstr_as_string(float_anchor_str[c.anchor]); if (!c.hide) { ui_call_win_float_pos(wp->w_grid_alloc.handle, wp->handle, anchor, grid->handle, row, col, c.focusable, |