summaryrefslogtreecommitdiff
path: root/src/ex_cmds.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-10-14 21:29:37 +0200
committerBram Moolenaar <Bram@vim.org>2010-10-14 21:29:37 +0200
commitb60574ba21c127acb31f0710518a673e86ad7fd2 (patch)
tree1d4cc33c19119b56238823a852042663dd59bff8 /src/ex_cmds.c
parent464c92545ac15ebb481d3fde683d6b147a527814 (diff)
downloadvim-git-b60574ba21c127acb31f0710518a673e86ad7fd2.tar.gz
updated for version 7.3.028v7.3.028
Problem: Signs don't show up. (Charles Campbell) Solution: Don't use negative numbers. Also assign a number to signs that have a name of all digits to avoid using a sign number twice.
Diffstat (limited to 'src/ex_cmds.c')
-rw-r--r--src/ex_cmds.c62
1 files changed, 36 insertions, 26 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index e8b39b3c8..fb32545c1 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -6569,7 +6569,7 @@ struct sign
};
static sign_T *first_sign = NULL;
-static int last_sign_typenr = MAX_TYPENR; /* is decremented */
+static int next_sign_typenr = 1;
static int sign_cmd_idx __ARGS((char_u *begin_cmd, char_u *end_cmd));
static void sign_list_defined __ARGS((sign_T *sp));
@@ -6651,9 +6651,14 @@ ex_sign(eap)
EMSG(_("E156: Missing sign name"));
else
{
+ /* Isolate the sign name. If it's a number skip leading zeroes,
+ * so that "099" and "99" are the same sign. But keep "0". */
p = skiptowhite(arg);
if (*p != NUL)
*p++ = NUL;
+ while (arg[0] == '0' && arg[1] != NUL)
+ ++arg;
+
sp_prev = NULL;
for (sp = first_sign; sp != NULL; sp = sp->sn_next)
{
@@ -6666,41 +6671,45 @@ ex_sign(eap)
/* ":sign define {name} ...": define a sign */
if (sp == NULL)
{
+ sign_T *lp;
+ int start = next_sign_typenr;
+
/* Allocate a new sign. */
sp = (sign_T *)alloc_clear((unsigned)sizeof(sign_T));
if (sp == NULL)
return;
- /* If the name is a number use that for the typenr,
- * otherwise use a negative number. */
- if (VIM_ISDIGIT(*arg))
- sp->sn_typenr = atoi((char *)arg);
- else
+ /* Check that next_sign_typenr is not already being used.
+ * This only happens after wrapping around. Hopefully
+ * another one got deleted and we can use its number. */
+ for (lp = first_sign; lp != NULL; )
{
- sign_T *lp;
- int start = last_sign_typenr;
-
- for (lp = first_sign; lp != NULL; lp = lp->sn_next)
+ if (lp->sn_typenr == next_sign_typenr)
{
- if (lp->sn_typenr == -last_sign_typenr)
+ ++next_sign_typenr;
+ if (next_sign_typenr == MAX_TYPENR)
+ next_sign_typenr = 1;
+ if (next_sign_typenr == start)
{
- --last_sign_typenr;
- if (last_sign_typenr == 0)
- last_sign_typenr = MAX_TYPENR;
- if (last_sign_typenr == start)
- {
- vim_free(sp);
- EMSG(_("E612: Too many signs defined"));
- return;
- }
- lp = first_sign;
- continue;
+ vim_free(sp);
+ EMSG(_("E612: Too many signs defined"));
+ return;
}
+ lp = first_sign; /* start all over */
+ continue;
}
+ lp = lp->sn_next;
+ }
+
+ sp->sn_typenr = next_sign_typenr;
+ if (++next_sign_typenr == MAX_TYPENR)
+ next_sign_typenr = 1; /* wrap around */
- sp->sn_typenr = -last_sign_typenr;
- if (--last_sign_typenr == 0)
- last_sign_typenr = MAX_TYPENR; /* wrap around */
+ sp->sn_name = vim_strsave(arg);
+ if (sp->sn_name == NULL) /* out of memory */
+ {
+ vim_free(sp);
+ return;
}
/* add the new sign to the list of signs */
@@ -6708,7 +6717,6 @@ ex_sign(eap)
first_sign = sp;
else
sp_prev->sn_next = sp;
- sp->sn_name = vim_strnsave(arg, (int)(p - arg));
}
/* set values for a defined sign. */
@@ -6886,6 +6894,8 @@ ex_sign(eap)
arg = skiptowhite(arg);
if (*arg != NUL)
*arg++ = NUL;
+ while (sign_name[0] == '0' && sign_name[1] != NUL)
+ ++sign_name;
}
else if (STRNCMP(arg, "file=", 5) == 0)
{