diff --git a/src/sign.c b/src/sign.c
index 7395131..ddf2ac6 100644
--- a/src/sign.c
+++ b/src/sign.c
@@ -89,15 +89,15 @@
 	if (group == NULL)
 	    return NULL;
 	STRCPY(group->sg_name, groupname);
-	group->refcount = 1;
-	group->next_sign_id = 1;
+	group->sg_refcount = 1;
+	group->sg_next_sign_id = 1;
 	hash_add_item(&sg_table, hi, group->sg_name, hash);
     }
     else
     {
 	// existing group
 	group = HI2SG(hi);
-	group->refcount++;
+	group->sg_refcount++;
     }
 
     return group;
@@ -117,8 +117,8 @@
     if (!HASHITEM_EMPTY(hi))
     {
 	group = HI2SG(hi);
-	group->refcount--;
-	if (group->refcount == 0)
+	group->sg_refcount--;
+	if (group->sg_refcount == 0)
 	{
 	    // All the signs in this group are removed
 	    hash_remove(&sg_table, hi);
@@ -129,16 +129,16 @@
 
 /*
  * Returns TRUE if 'sign' is in 'group'.
- * A sign can either be in the global group (sign->group == NULL)
+ * A sign can either be in the global group (sign->se_group == NULL)
  * or in a named group. If 'group' is '*', then the sign is part of the group.
  */
     static int
-sign_in_group(signlist_T *sign, char_u *group)
+sign_in_group(sign_entry_T *sign, char_u *group)
 {
     return ((group != NULL && STRCMP(group, "*") == 0)
-	    || (group == NULL && sign->group == NULL)
-	    || (group != NULL && sign->group != NULL
-				 && STRCMP(group, sign->group->sg_name) == 0));
+	    || (group == NULL && sign->se_group == NULL)
+	    || (group != NULL && sign->se_group != NULL
+				 && STRCMP(group, sign->se_group->sg_name) == 0));
 }
 
 /*
@@ -149,7 +149,7 @@
 {
     int			id = 1;
     signgroup_T		*group = NULL;
-    signlist_T		*sign;
+    sign_entry_T	*sign;
     hashitem_T		*hi;
     int			found = FALSE;
 
@@ -167,13 +167,13 @@
 	if (group == NULL)
 	    id = next_sign_id++;		// global group
 	else
-	    id = group->next_sign_id++;
+	    id = group->sg_next_sign_id++;
 
 	// Check whether this sign is already placed in the buffer
 	found = TRUE;
 	FOR_ALL_SIGNS_IN_BUF(buf, sign)
 	{
-	    if (id == sign->id && sign_in_group(sign, groupname))
+	    if (id == sign->se_id && sign_in_group(sign, groupname))
 	    {
 		found = FALSE;		// sign identifier is in use
 		break;
@@ -191,38 +191,38 @@
     static void
 insert_sign(
     buf_T	*buf,		// buffer to store sign in
-    signlist_T	*prev,		// previous sign entry
-    signlist_T	*next,		// next sign entry
+    sign_entry_T *prev,		// previous sign entry
+    sign_entry_T *next,		// next sign entry
     int		id,		// sign ID
     char_u	*group,		// sign group; NULL for global group
     int		prio,		// sign priority
     linenr_T	lnum,		// line number which gets the mark
     int		typenr)		// typenr of sign we are adding
 {
-    signlist_T	*newsign;
+    sign_entry_T *newsign;
 
-    newsign = lalloc_id(sizeof(signlist_T), FALSE, aid_insert_sign);
+    newsign = lalloc_id(sizeof(sign_entry_T), FALSE, aid_insert_sign);
     if (newsign != NULL)
     {
-	newsign->id = id;
-	newsign->lnum = lnum;
-	newsign->typenr = typenr;
+	newsign->se_id = id;
+	newsign->se_lnum = lnum;
+	newsign->se_typenr = typenr;
 	if (group != NULL)
 	{
-	    newsign->group = sign_group_ref(group);
-	    if (newsign->group == NULL)
+	    newsign->se_group = sign_group_ref(group);
+	    if (newsign->se_group == NULL)
 	    {
 		vim_free(newsign);
 		return;
 	    }
 	}
 	else
-	    newsign->group = NULL;
-	newsign->priority = prio;
-	newsign->next = next;
-	newsign->prev = prev;
+	    newsign->se_group = NULL;
+	newsign->se_priority = prio;
+	newsign->se_next = next;
+	newsign->se_prev = prev;
 	if (next != NULL)
-	    next->prev = newsign;
+	    next->se_prev = newsign;
 
 	if (prev == NULL)
 	{
@@ -242,7 +242,7 @@
 #endif
 	}
 	else
-	    prev->next = newsign;
+	    prev->se_next = newsign;
     }
 }
 
@@ -252,23 +252,23 @@
     static void
 insert_sign_by_lnum_prio(
     buf_T	*buf,		// buffer to store sign in
-    signlist_T	*prev,		// previous sign entry
+    sign_entry_T *prev,		// previous sign entry
     int		id,		// sign ID
     char_u	*group,		// sign group; NULL for global group
     int		prio,		// sign priority
     linenr_T	lnum,		// line number which gets the mark
     int		typenr)		// typenr of sign we are adding
 {
-    signlist_T	*sign;
+    sign_entry_T	*sign;
 
     // keep signs sorted by lnum and by priority: insert new sign at
     // the proper position in the list for this lnum.
-    while (prev != NULL && prev->lnum == lnum && prev->priority <= prio)
-	prev = prev->prev;
+    while (prev != NULL && prev->se_lnum == lnum && prev->se_priority <= prio)
+	prev = prev->se_prev;
     if (prev == NULL)
 	sign = buf->b_signlist;
     else
-	sign = prev->next;
+	sign = prev->se_next;
 
     insert_sign(buf, prev, sign, id, group, prio, lnum, typenr);
 }
@@ -305,18 +305,18 @@
  * Return information about a sign in a Dict
  */
     static dict_T *
-sign_get_info(signlist_T *sign)
+sign_get_info(sign_entry_T *sign)
 {
     dict_T	*d;
 
     if ((d = dict_alloc_id(aid_sign_getinfo)) == NULL)
 	return NULL;
-    dict_add_number(d, "id", sign->id);
-    dict_add_string(d, "group", (sign->group == NULL) ?
-					(char_u *)"" : sign->group->sg_name);
-    dict_add_number(d, "lnum", sign->lnum);
-    dict_add_string(d, "name", sign_typenr2name(sign->typenr));
-    dict_add_number(d, "priority", sign->priority);
+    dict_add_number(d, "id", sign->se_id);
+    dict_add_string(d, "group", (sign->se_group == NULL) ?
+				       (char_u *)"" : sign->se_group->sg_name);
+    dict_add_number(d, "lnum", sign->se_lnum);
+    dict_add_string(d, "name", sign_typenr2name(sign->se_typenr));
+    dict_add_number(d, "priority", sign->se_priority);
 
     return d;
 }
@@ -327,18 +327,18 @@
  * buffer are sorted by line number and priority.
  */
     static void
-sign_sort_by_prio_on_line(buf_T *buf, signlist_T *sign)
+sign_sort_by_prio_on_line(buf_T *buf, sign_entry_T *sign)
 {
-    signlist_T *p = NULL;
+    sign_entry_T *p = NULL;
 
     // If there is only one sign in the buffer or only one sign on the line or
     // the sign is already sorted by priority, then return.
-    if ((sign->prev == NULL
-		|| sign->prev->lnum != sign->lnum
-		|| sign->prev->priority > sign->priority)
-	    && (sign->next == NULL
-		|| sign->next->lnum != sign->lnum
-		|| sign->next->priority < sign->priority))
+    if ((sign->se_prev == NULL
+		|| sign->se_prev->se_lnum != sign->se_lnum
+		|| sign->se_prev->se_priority > sign->se_priority)
+	    && (sign->se_next == NULL
+		|| sign->se_next->se_lnum != sign->se_lnum
+		|| sign->se_next->se_priority < sign->se_priority))
 	return;
 
     // One or more signs on the same line as 'sign'
@@ -346,50 +346,50 @@
 
     // First search backward for a sign with higher priority on the same line
     p = sign;
-    while (p->prev != NULL && p->prev->lnum == sign->lnum
-					&& p->prev->priority <= sign->priority)
-	p = p->prev;
+    while (p->se_prev != NULL && p->se_prev->se_lnum == sign->se_lnum
+			       && p->se_prev->se_priority <= sign->se_priority)
+	p = p->se_prev;
 
     if (p == sign)
     {
 	// Sign not found. Search forward for a sign with priority just before
 	// 'sign'.
-	p = sign->next;
-	while (p->next != NULL && p->next->lnum == sign->lnum
-					 && p->next->priority > sign->priority)
-	    p = p->next;
+	p = sign->se_next;
+	while (p->se_next != NULL && p->se_next->se_lnum == sign->se_lnum
+				&& p->se_next->se_priority > sign->se_priority)
+	    p = p->se_next;
     }
 
     // Remove 'sign' from the list
     if (buf->b_signlist == sign)
-	buf->b_signlist = sign->next;
-    if (sign->prev != NULL)
-	sign->prev->next = sign->next;
-    if (sign->next != NULL)
-	sign->next->prev = sign->prev;
-    sign->prev = NULL;
-    sign->next = NULL;
+	buf->b_signlist = sign->se_next;
+    if (sign->se_prev != NULL)
+	sign->se_prev->se_next = sign->se_next;
+    if (sign->se_next != NULL)
+	sign->se_next->se_prev = sign->se_prev;
+    sign->se_prev = NULL;
+    sign->se_next = NULL;
 
     // Re-insert 'sign' at the right place
-    if (p->priority <= sign->priority)
+    if (p->se_priority <= sign->se_priority)
     {
 	// 'sign' has a higher priority and should be inserted before 'p'
-	sign->prev = p->prev;
-	sign->next = p;
-	p->prev = sign;
-	if (sign->prev != NULL)
-	    sign->prev->next = sign;
+	sign->se_prev = p->se_prev;
+	sign->se_next = p;
+	p->se_prev = sign;
+	if (sign->se_prev != NULL)
+	    sign->se_prev->se_next = sign;
 	if (buf->b_signlist == p)
 	    buf->b_signlist = sign;
     }
     else
     {
 	// 'sign' has a lower priority and should be inserted after 'p'
-	sign->prev = p;
-	sign->next = p->next;
-	p->next = sign;
-	if (sign->next != NULL)
-	    sign->next->prev = sign;
+	sign->se_prev = p;
+	sign->se_next = p->se_next;
+	p->se_next = sign;
+	if (sign->se_next != NULL)
+	    sign->se_next->se_prev = sign;
     }
 }
 
@@ -405,22 +405,22 @@
     linenr_T	lnum,		// line number which gets the mark
     int		typenr)		// typenr of sign we are adding
 {
-    signlist_T	*sign;		// a sign in the signlist
-    signlist_T	*prev;		// the previous sign
+    sign_entry_T	*sign;		// a sign in the signlist
+    sign_entry_T	*prev;		// the previous sign
 
     prev = NULL;
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (lnum == sign->lnum && id == sign->id
+	if (lnum == sign->se_lnum && id == sign->se_id
 		&& sign_in_group(sign, groupname))
 	{
 	    // Update an existing sign
-	    sign->typenr = typenr;
-	    sign->priority = prio;
+	    sign->se_typenr = typenr;
+	    sign->se_priority = prio;
 	    sign_sort_by_prio_on_line(buf, sign);
 	    return;
 	}
-	else if (lnum < sign->lnum)
+	else if (lnum < sign->se_lnum)
 	{
 	    insert_sign_by_lnum_prio(buf, prev, id, groupname, prio,
 								lnum, typenr);
@@ -445,16 +445,16 @@
     int		typenr,		// typenr of sign we are adding
     int		prio)		// sign priority
 {
-    signlist_T	*sign;		// a sign in the signlist
+    sign_entry_T	*sign;		// a sign in the signlist
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (sign->id == markId && sign_in_group(sign, group))
+	if (sign->se_id == markId && sign_in_group(sign, group))
 	{
-	    sign->typenr = typenr;
-	    sign->priority = prio;
+	    sign->se_typenr = typenr;
+	    sign->se_priority = prio;
 	    sign_sort_by_prio_on_line(buf, sign);
-	    return sign->lnum;
+	    return sign->se_lnum;
 	}
     }
 
@@ -469,33 +469,33 @@
     int
 buf_get_signattrs(buf_T *buf, linenr_T lnum, sign_attrs_T *sattr)
 {
-    signlist_T	*sign;
-    sign_T	*sp;
+    sign_entry_T	*sign;
+    sign_T		*sp;
 
     vim_memset(sattr, 0, sizeof(sign_attrs_T));
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (sign->lnum > lnum)
+	if (sign->se_lnum > lnum)
 	    // Signs are sorted by line number in the buffer. No need to check
 	    // for signs after the specified line number 'lnum'.
 	    break;
 
-	if (sign->lnum == lnum)
+	if (sign->se_lnum == lnum)
 	{
-	    sattr->typenr = sign->typenr;
-	    sp = find_sign_by_typenr(sign->typenr);
+	    sattr->sat_typenr = sign->se_typenr;
+	    sp = find_sign_by_typenr(sign->se_typenr);
 	    if (sp == NULL)
 		return FALSE;
 
 # ifdef FEAT_SIGN_ICONS
-	    sattr->icon = sp->sn_image;
+	    sattr->sat_icon = sp->sn_image;
 # endif
-	    sattr->text = sp->sn_text;
-	    if (sattr->text != NULL && sp->sn_text_hl > 0)
-		sattr->texthl = syn_id2attr(sp->sn_text_hl);
+	    sattr->sat_text = sp->sn_text;
+	    if (sattr->sat_text != NULL && sp->sn_text_hl > 0)
+		sattr->sat_texthl = syn_id2attr(sp->sn_text_hl);
 	    if (sp->sn_line_hl > 0)
-		sattr->linehl = syn_id2attr(sp->sn_line_hl);
+		sattr->sat_linehl = syn_id2attr(sp->sn_line_hl);
 	    return TRUE;
 	}
     }
@@ -519,27 +519,27 @@
     int		id,		// sign id
     char_u	*group)		// sign group
 {
-    signlist_T	**lastp;	// pointer to pointer to current sign
-    signlist_T	*sign;		// a sign in a b_signlist
-    signlist_T	*next;		// the next sign in a b_signlist
-    linenr_T	lnum;		// line number whose sign was deleted
+    sign_entry_T	**lastp;	// pointer to pointer to current sign
+    sign_entry_T	*sign;		// a sign in a b_signlist
+    sign_entry_T	*next;		// the next sign in a b_signlist
+    linenr_T		lnum;		// line number whose sign was deleted
 
     lastp = &buf->b_signlist;
     lnum = 0;
     for (sign = buf->b_signlist; sign != NULL; sign = next)
     {
-	next = sign->next;
-	if ((id == 0 || sign->id == id)
-		&& (atlnum == 0 || sign->lnum == atlnum)
+	next = sign->se_next;
+	if ((id == 0 || sign->se_id == id)
+		&& (atlnum == 0 || sign->se_lnum == atlnum)
 		&& sign_in_group(sign, group))
 
 	{
 	    *lastp = next;
 	    if (next != NULL)
-		next->prev = sign->prev;
-	    lnum = sign->lnum;
-	    if (sign->group != NULL)
-		sign_group_unref(sign->group->sg_name);
+		next->se_prev = sign->se_prev;
+	    lnum = sign->se_lnum;
+	    if (sign->se_group != NULL)
+		sign_group_unref(sign->se_group->sg_name);
 	    vim_free(sign);
 	    redraw_buf_line_later(buf, lnum);
 
@@ -553,7 +553,7 @@
 		break;
 	}
 	else
-	    lastp = &sign->next;
+	    lastp = &sign->se_next;
     }
 
     // When deleting the last sign the cursor position may change, because the
@@ -579,11 +579,11 @@
     int		id,		// sign ID
     char_u	*group)		// sign group
 {
-    signlist_T	*sign;		// a sign in the signlist
+    sign_entry_T	*sign;		// a sign in the signlist
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
-	if (sign->id == id && sign_in_group(sign, group))
-	    return sign->lnum;
+	if (sign->se_id == id && sign_in_group(sign, group))
+	    return sign->se_lnum;
 
     return 0;
 }
@@ -592,22 +592,22 @@
  * Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is
  * not found at the line. If 'groupname' is NULL, searches in the global group.
  */
-    static signlist_T *
+    static sign_entry_T *
 buf_getsign_at_line(
     buf_T	*buf,		// buffer whose sign we are searching for
     linenr_T	lnum,		// line number of sign
     char_u	*groupname)	// sign group name
 {
-    signlist_T	*sign;		// a sign in the signlist
+    sign_entry_T	*sign;		// a sign in the signlist
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (sign->lnum > lnum)
+	if (sign->se_lnum > lnum)
 	    // Signs are sorted by line number in the buffer. No need to check
 	    // for signs after the specified line number 'lnum'.
 	    break;
 
-	if (sign->lnum == lnum && sign_in_group(sign, groupname))
+	if (sign->se_lnum == lnum && sign_in_group(sign, groupname))
 	    return sign;
     }
 
@@ -623,11 +623,11 @@
     linenr_T	lnum,		// line number of sign
     char_u	*groupname)	// sign group name
 {
-    signlist_T	*sign;		// a sign in the signlist
+    sign_entry_T	*sign;		// a sign in the signlist
 
     sign = buf_getsign_at_line(buf, lnum, groupname);
     if (sign != NULL)
-	return sign->id;
+	return sign->se_id;
 
     return 0;
 }
@@ -642,17 +642,17 @@
     linenr_T	lnum,		// line number of sign
     int		typenr)		// sign type number
 {
-    signlist_T	*sign;		// a sign in the signlist
+    sign_entry_T	*sign;		// a sign in the signlist
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (sign->lnum > lnum)
+	if (sign->se_lnum > lnum)
 	    // Signs are sorted by line number in the buffer. No need to check
 	    // for signs after the specified line number 'lnum'.
 	    break;
 
-	if (sign->lnum == lnum && sign->typenr == typenr)
-	    return sign->id;
+	if (sign->se_lnum == lnum && sign->se_typenr == typenr)
+	    return sign->se_id;
     }
 
     return 0;
@@ -666,18 +666,18 @@
     int
 buf_signcount(buf_T *buf, linenr_T lnum)
 {
-    signlist_T	*sign;		// a sign in the signlist
-    int		count = 0;
+    sign_entry_T	*sign;		// a sign in the signlist
+    int			count = 0;
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-	if (sign->lnum > lnum)
+	if (sign->se_lnum > lnum)
 	    // Signs are sorted by line number in the buffer. No need to check
 	    // for signs after the specified line number 'lnum'.
 	    break;
 
-	if (sign->lnum == lnum)
-	    if (sign_get_image(sign->typenr) != NULL)
+	if (sign->se_lnum == lnum)
+	    if (sign_get_image(sign->se_typenr) != NULL)
 		count++;
     }
 
@@ -693,9 +693,9 @@
     void
 buf_delete_signs(buf_T *buf, char_u *group)
 {
-    signlist_T	*sign;
-    signlist_T	**lastp;	// pointer to pointer to current sign
-    signlist_T	*next;
+    sign_entry_T	*sign;
+    sign_entry_T	**lastp;	// pointer to pointer to current sign
+    sign_entry_T	*next;
 
     // When deleting the last sign need to redraw the windows to remove the
     // sign column. Not when curwin is NULL (this means we're exiting).
@@ -708,18 +708,18 @@
     lastp = &buf->b_signlist;
     for (sign = buf->b_signlist; sign != NULL; sign = next)
     {
-	next = sign->next;
+	next = sign->se_next;
 	if (sign_in_group(sign, group))
 	{
 	    *lastp = next;
 	    if (next != NULL)
-		next->prev = sign->prev;
-	    if (sign->group != NULL)
-		sign_group_unref(sign->group->sg_name);
+		next->se_prev = sign->se_prev;
+	    if (sign->se_group != NULL)
+		sign_group_unref(sign->se_group->sg_name);
 	    vim_free(sign);
 	}
 	else
-	    lastp = &sign->next;
+	    lastp = &sign->se_next;
     }
 }
 
@@ -729,10 +729,10 @@
     static void
 sign_list_placed(buf_T *rbuf, char_u *sign_group)
 {
-    buf_T	*buf;
-    signlist_T	*sign;
-    char	lbuf[MSG_BUF_LEN];
-    char	group[MSG_BUF_LEN];
+    buf_T		*buf;
+    sign_entry_T	*sign;
+    char		lbuf[MSG_BUF_LEN];
+    char		group[MSG_BUF_LEN];
 
     msg_puts_title(_("\n--- Signs ---"));
     msg_putchar('\n');
@@ -754,15 +754,15 @@
 		break;
 	    if (!sign_in_group(sign, sign_group))
 		continue;
-	    if (sign->group != NULL)
+	    if (sign->se_group != NULL)
 		vim_snprintf(group, MSG_BUF_LEN, _("  group=%s"),
-							sign->group->sg_name);
+						      sign->se_group->sg_name);
 	    else
 		group[0] = '\0';
 	    vim_snprintf(lbuf, MSG_BUF_LEN,
 			   _("    line=%ld  id=%d%s  name=%s  priority=%d"),
-			   (long)sign->lnum, sign->id, group,
-			   sign_typenr2name(sign->typenr), sign->priority);
+			   (long)sign->se_lnum, sign->se_id, group,
+			 sign_typenr2name(sign->se_typenr), sign->se_priority);
 	    msg_puts(lbuf);
 	    msg_putchar('\n');
 	}
@@ -782,21 +782,21 @@
     long	amount,
     long	amount_after)
 {
-    signlist_T	*sign;		// a sign in a b_signlist
-    linenr_T	new_lnum;
+    sign_entry_T	*sign;		// a sign in a b_signlist
+    linenr_T		new_lnum;
 
     FOR_ALL_SIGNS_IN_BUF(curbuf, sign)
     {
 	// Ignore changes to lines after the sign
-	if (sign->lnum < line1)
+	if (sign->se_lnum < line1)
 	    continue;
-	new_lnum = sign->lnum;
-	if (sign->lnum >= line1 && sign->lnum <= line2)
+	new_lnum = sign->se_lnum;
+	if (sign->se_lnum >= line1 && sign->se_lnum <= line2)
 	{
 	    if (amount != MAXLNUM)
 		new_lnum += amount;
 	}
-	else if (sign->lnum > line2)
+	else if (sign->se_lnum > line2)
 	    // Lines inserted or deleted before the sign
 	    new_lnum += amount_after;
 
@@ -804,7 +804,7 @@
 	// then don't adjust the line number. Otherwise, it will always be past
 	// the last line and will not be visible.
 	if (new_lnum <= curbuf->b_ml.ml_line_count)
-	    sign->lnum = new_lnum;
+	    sign->se_lnum = new_lnum;
     }
 }
 
@@ -1694,8 +1694,8 @@
     void
 get_buffer_signs(buf_T *buf, list_T *l)
 {
-    signlist_T	*sign;
-    dict_T	*d;
+    sign_entry_T	*sign;
+    dict_T		*d;
 
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
@@ -1715,10 +1715,10 @@
 	char_u		*sign_group,
 	list_T		*retlist)
 {
-    dict_T	*d;
-    list_T	*l;
-    signlist_T	*sign;
-    dict_T	*sdict;
+    dict_T		*d;
+    list_T		*l;
+    sign_entry_T	*sign;
+    dict_T		*sdict;
 
     if ((d = dict_alloc_id(aid_sign_getplaced_dict)) == NULL)
 	return;
@@ -1735,9 +1735,9 @@
 	if (!sign_in_group(sign, sign_group))
 	    continue;
 	if ((lnum == 0 && sign_id == 0)
-		|| (sign_id == 0 && lnum == sign->lnum)
-		|| (lnum == 0 && sign_id == sign->id)
-		|| (lnum == sign->lnum && sign_id == sign->id))
+		|| (sign_id == 0 && lnum == sign->se_lnum)
+		|| (lnum == 0 && sign_id == sign->se_id)
+		|| (lnum == sign->se_lnum && sign_id == sign->se_id))
 	{
 	    if ((sdict = sign_get_info(sign)) != NULL)
 		list_append_dict(l, sdict);
