This commit is contained in:
Justin M. Keyes 2017-03-21 17:34:25 +01:00
parent 0f3afdaa1b
commit 7e23ce6b4f

View File

@ -4314,102 +4314,86 @@ static int getargopt(exarg_T *eap)
return OK; return OK;
} }
/* /// Handle the argument for a tabpage related ex command.
* Handle the argument for a tabpage related ex command. /// Returns a tabpage number.
* Returns a tabpage number. /// When an error is encountered then eap->errmsg is set.
* When an error is encountered then eap->errmsg is set. static int get_tabpage_arg(exarg_T *eap)
*/
static int
get_tabpage_arg(exarg_T *eap)
{ {
int tab_number; int tab_number;
int unaccept_arg0 = (eap->cmdidx == CMD_tabmove) ? 0 : 1; int unaccept_arg0 = (eap->cmdidx == CMD_tabmove) ? 0 : 1;
if (eap->arg && *eap->arg != NUL) if (eap->arg && *eap->arg != NUL) {
{ char_u *p = eap->arg;
char_u *p = eap->arg; char_u *p_save;
char_u *p_save; int relative = 0; // argument +N/-N means: go to N places to the
int relative = 0; /* argument +N/-N means: go to N places to the // right/left relative to the current position.
* right/left relative to the current position. */
if (*p == '-') if (*p == '-') {
{ relative = -1;
relative = -1; p++;
p++; } else if (*p == '+') {
} relative = 1;
else if (*p == '+') p++;
{
relative = 1;
p++;
}
p_save = p;
tab_number = getdigits(&p);
if (relative == 0)
{
if (STRCMP(p, "$") == 0)
tab_number = LAST_TAB_NR;
else if (p == p_save || *p_save == '-' || *p != NUL
|| tab_number > LAST_TAB_NR)
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
goto theend;
}
}
else
{
if (*p_save == NUL)
tab_number = 1;
else if (p == p_save || *p_save == '-' || *p != NUL
|| tab_number == 0)
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
goto theend;
}
tab_number = tab_number * relative + tabpage_index(curtab);
if (!unaccept_arg0 && relative == -1)
--tab_number;
}
if (tab_number < unaccept_arg0 || tab_number > LAST_TAB_NR)
eap->errmsg = e_invarg;
} }
else if (eap->addr_count > 0)
{ p_save = p;
if (unaccept_arg0 && eap->line2 == 0) tab_number = getdigits(&p);
eap->errmsg = e_invrange;
else if (relative == 0) {
{ if (STRCMP(p, "$") == 0) {
tab_number = eap->line2; tab_number = LAST_TAB_NR;
if (!unaccept_arg0 && **eap->cmdlinep == '-') } else if (p == p_save || *p_save == '-' || *p != NUL
{ || tab_number > LAST_TAB_NR) {
--tab_number; // No numbers as argument.
if (tab_number < unaccept_arg0) eap->errmsg = e_invarg;
eap->errmsg = e_invarg; goto theend;
} }
} } else {
if (*p_save == NUL) {
tab_number = 1;
}
else if (p == p_save || *p_save == '-' || *p != NUL || tab_number == 0) {
// No numbers as argument.
eap->errmsg = e_invarg;
goto theend;
}
tab_number = tab_number * relative + tabpage_index(curtab);
if (!unaccept_arg0 && relative == -1) {
--tab_number;
}
} }
else if (tab_number < unaccept_arg0 || tab_number > LAST_TAB_NR) {
{ eap->errmsg = e_invarg;
switch (eap->cmdidx)
{
case CMD_tabnext:
tab_number = tabpage_index(curtab) + 1;
if (tab_number > LAST_TAB_NR)
tab_number = 1;
break;
case CMD_tabmove:
tab_number = LAST_TAB_NR;
break;
default:
tab_number = tabpage_index(curtab);
}
} }
} else if (eap->addr_count > 0) {
if (unaccept_arg0 && eap->line2 == 0) {
eap->errmsg = e_invrange;
} else {
tab_number = eap->line2;
if (!unaccept_arg0 && **eap->cmdlinep == '-') {
--tab_number;
if (tab_number < unaccept_arg0) {
eap->errmsg = e_invarg;
}
}
}
} else {
switch (eap->cmdidx) {
case CMD_tabnext:
tab_number = tabpage_index(curtab) + 1;
if (tab_number > LAST_TAB_NR)
tab_number = 1;
break;
case CMD_tabmove:
tab_number = LAST_TAB_NR;
break;
default:
tab_number = tabpage_index(curtab);
}
}
theend: theend:
return tab_number; return tab_number;
} }
/* /*