ex_cmds: port cmd_addr_T and ADDR_NONE (#13492)

Patch 8.1.1241 is too hard to port in 1 commit.
https://github.com/neovim/neovim/pull/13079 is too hard to review
and seems to be blocked.

Use 'int' type for some  addr variables to suppress 'switch/case' warnings.
This commit is contained in:
Jan Edmund Lazo 2020-12-10 19:48:18 -05:00 committed by GitHub
parent 52e660e857
commit a92dbf49bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 589 additions and 574 deletions

File diff suppressed because it is too large Load Diff

View File

@ -67,15 +67,18 @@
#define FILE1 (FILES | NOSPC) // 1 file allowed, defaults to current file
// values for cmd_addr_type
#define ADDR_LINES 0
#define ADDR_WINDOWS 1
#define ADDR_ARGUMENTS 2
#define ADDR_LOADED_BUFFERS 3
#define ADDR_BUFFERS 4
#define ADDR_TABS 5
#define ADDR_TABS_RELATIVE 6 // Tab page that only relative
#define ADDR_QUICKFIX 7
#define ADDR_OTHER 99
typedef enum {
ADDR_LINES, // buffer line numbers
ADDR_WINDOWS, // window number
ADDR_ARGUMENTS, // argument number
ADDR_LOADED_BUFFERS, // buffer number of loaded buffer
ADDR_BUFFERS, // buffer number
ADDR_TABS, // tab page number
ADDR_TABS_RELATIVE, // Tab page that only relative
ADDR_QUICKFIX, // quickfix list entry number
ADDR_OTHER, // something else
ADDR_NONE // no range used
} cmd_addr_T;
typedef struct exarg exarg_T;
@ -93,7 +96,7 @@ typedef struct cmdname {
char_u *cmd_name; ///< Name of the command.
ex_func_T cmd_func; ///< Function with implementation of this command.
uint32_t cmd_argt; ///< Relevant flags from the declared above.
int cmd_addr_type; ///< Flag for address type
cmd_addr_T cmd_addr_type; ///< Flag for address type
} CommandDefinition;
// A list used for saving values of "emsg_silent". Used by ex_try() to save the

View File

@ -85,7 +85,7 @@ typedef struct ucmd {
char_u *uc_rep; // The command's replacement string
long uc_def; // The default value for a range/count
int uc_compl; // completion type
int uc_addr_type; // The command's address type
cmd_addr_T uc_addr_type; // The command's address type
sctx_T uc_script_ctx; // SCTX where the command was defined
char_u *uc_compl_arg; // completion argument if any
} ucmd_T;
@ -1734,6 +1734,9 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = 1;
}
break;
case ADDR_NONE:
IEMSG(_("INTERNAL: Cannot use DFLALL with ADDR_NONE"));
break;
}
}
@ -2347,6 +2350,9 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
case ADDR_QUICKFIX:
eap->line2 = qf_get_cur_valid_idx(eap);
break;
case ADDR_NONE:
// Will give an error later if a range is found.
break;
}
eap->cmd = skipwhite(eap->cmd);
lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent,
@ -2412,6 +2418,9 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
eap->line2 = 1;
}
break;
case ADDR_NONE:
// Will give an error later if a range is found.
break;
}
eap->addr_count++;
} else if (*eap->cmd == '*') {
@ -3698,12 +3707,14 @@ char_u *skip_range(
// Return MAXLNUM when no Ex address was found.
static linenr_T get_address(exarg_T *eap,
char_u **ptr,
int addr_type, // flag: one of ADDR_LINES, ...
cmd_addr_T addr_type_arg,
int skip, // only skip the address, don't use it
bool silent, // no errors or side effects
int to_other_file, // flag: may jump to other file
int address_count) // 1 for first, >1 after comma
FUNC_ATTR_NONNULL_ALL
{
const int addr_type = addr_type_arg;
int c;
int i;
long n;
@ -3737,6 +3748,7 @@ static linenr_T get_address(exarg_T *eap,
lnum = CURRENT_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
case ADDR_NONE:
EMSG(_(e_invrange));
cmd = NULL;
goto error;
@ -3776,6 +3788,7 @@ static linenr_T get_address(exarg_T *eap,
lnum = LAST_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
case ADDR_NONE:
EMSG(_(e_invrange));
cmd = NULL;
goto error;
@ -3938,6 +3951,8 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_QUICKFIX:
lnum = qf_get_cur_valid_idx(eap);
break;
case ADDR_NONE:
break;
}
}
@ -4089,6 +4104,9 @@ static char_u *invalid_range(exarg_T *eap)
return (char_u *)_(e_invrange);
}
break;
case ADDR_NONE:
// Will give an error elsewhere.
break;
}
}
return NULL;
@ -4957,7 +4975,8 @@ char_u *get_command_name(expand_T *xp, int idx)
static int uc_add_command(char_u *name, size_t name_len, char_u *rep,
uint32_t argt, long def, int flags, int compl,
char_u *compl_arg, int addr_type, int force)
char_u *compl_arg, cmd_addr_T addr_type, bool force)
FUNC_ATTR_NONNULL_ARG(1, 3)
{
ucmd_T *cmd = NULL;
char_u *p;
@ -5049,7 +5068,7 @@ fail:
static struct {
int expand;
cmd_addr_T expand;
char *name;
char *shortname;
} addr_type_complete[] =
@ -5062,7 +5081,7 @@ static struct {
{ ADDR_WINDOWS, "windows", "win" },
{ ADDR_QUICKFIX, "quickfix", "qf" },
{ ADDR_OTHER, "other", "?" },
{ -1, NULL, NULL }
{ ADDR_NONE, NULL, NULL }
};
/*
@ -5236,7 +5255,7 @@ static void uc_list(char_u *name, size_t name_len)
} while (len < 8 - over);
// Address Type
for (j = 0; addr_type_complete[j].expand != -1; j++) {
for (j = 0; addr_type_complete[j].expand != ADDR_NONE; j++) {
if (addr_type_complete[j].expand != ADDR_LINES
&& addr_type_complete[j].expand == cmd->uc_addr_type) {
STRCPY(IObuff + len, addr_type_complete[j].shortname);
@ -5284,7 +5303,8 @@ static void uc_list(char_u *name, size_t name_len)
static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def,
int *flags, int *complp, char_u **compl_arg,
int *addr_type_arg)
cmd_addr_T *addr_type_arg)
FUNC_ATTR_NONNULL_ALL
{
char_u *p;
@ -5421,7 +5441,7 @@ static void ex_command(exarg_T *eap)
int flags = 0;
int compl = EXPAND_NOTHING;
char_u *compl_arg = NULL;
int addr_type_arg = ADDR_LINES;
cmd_addr_T addr_type_arg = ADDR_LINES;
int has_attr = (eap->arg[0] == '-');
int name_len;
@ -6080,11 +6100,12 @@ char_u *get_user_cmd_complete(expand_T *xp, int idx)
* Parse address type argument
*/
int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
int *addr_type_arg)
cmd_addr_T *addr_type_arg)
FUNC_ATTR_NONNULL_ALL
{
int i, a, b;
for (i = 0; addr_type_complete[i].expand != -1; i++) {
for (i = 0; addr_type_complete[i].expand != ADDR_NONE; i++) {
a = (int)STRLEN(addr_type_complete[i].name) == vallen;
b = STRNCMP(value, addr_type_complete[i].name, vallen) == 0;
if (a && b) {
@ -6093,7 +6114,7 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
}
}
if (addr_type_complete[i].expand == -1) {
if (addr_type_complete[i].expand == ADDR_NONE) {
char_u *err = value;
for (i = 0; err[i] != NUL && !ascii_iswhite(err[i]); i++) {}
@ -6117,6 +6138,7 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
*/
int parse_compl_arg(const char_u *value, int vallen, int *complp,
uint32_t *argt, char_u **compl_arg)
FUNC_ATTR_NONNULL_ALL
{
const char_u *arg = NULL;
size_t arglen = 0;
@ -9489,7 +9511,7 @@ Dictionary commands_array(buf_T *buf)
PUT(d, "range", obj);
obj = NIL;
for (int j = 0; addr_type_complete[j].expand != -1; j++) {
for (int j = 0; addr_type_complete[j].expand != ADDR_NONE; j++) {
if (addr_type_complete[j].expand != ADDR_LINES
&& addr_type_complete[j].expand == cmd->uc_addr_type) {
obj = STRING_OBJ(cstr_to_string(addr_type_complete[j].name));

View File

@ -62,7 +62,7 @@ for _, cmd in ipairs(defs) do
.cmd_name = (char_u *) "%s",
.cmd_func = (ex_func_T)&%s,
.cmd_argt = %uL,
.cmd_addr_type = %i
.cmd_addr_type = %s
},
]], enumname, cmd.command, cmd.func, cmd.flags, cmd.addr_type))
end