summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/feature.h2
-rw-r--r--src/textprop.c24
-rw-r--r--src/version.c2
3 files changed, 17 insertions, 11 deletions
diff --git a/src/feature.h b/src/feature.h
index 404461cc6..9615a9fa4 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -505,7 +505,7 @@
* +textprop Text properties
*/
#if defined(FEAT_EVAL) && defined(FEAT_SYN_HL)
-// # define FEAT_TEXT_PROP
+# define FEAT_TEXT_PROP
#endif
/*
diff --git a/src/textprop.c b/src/textprop.c
index fa28e8005..85d32475d 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -151,7 +151,7 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
size_t textlen;
char_u *props;
char_u *newprops;
- static textprop_T tmp_prop; // static to get it aligned.
+ textprop_T tmp_prop;
int i;
lnum = get_tv_number(&argvars[0]);
@@ -212,8 +212,9 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
// Fetch the line to get the ml_line_len field updated.
proplen = get_text_props(buf, lnum, &props, TRUE);
+ textlen = buf->b_ml.ml_line_len - proplen * sizeof(textprop_T);
- if (col >= (colnr_T)STRLEN(buf->b_ml.ml_line_ptr))
+ if (col >= (colnr_T)textlen - 1)
{
EMSGN(_(e_invalid_col), (long)col);
return;
@@ -224,7 +225,6 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
if (newtext == NULL)
return;
// Copy the text, including terminating NUL.
- textlen = buf->b_ml.ml_line_len - proplen * sizeof(textprop_T);
mch_memmove(newtext, buf->b_ml.ml_line_ptr, textlen);
// Find the index where to insert the new property.
@@ -232,8 +232,8 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
// text, we need to copy them as bytes before using it as a struct.
for (i = 0; i < proplen; ++i)
{
- mch_memmove(&tmp_prop, props + i * sizeof(proptype_T),
- sizeof(proptype_T));
+ mch_memmove(&tmp_prop, props + i * sizeof(textprop_T),
+ sizeof(textprop_T));
if (tmp_prop.tp_col >= col)
break;
}
@@ -274,7 +274,7 @@ has_any_text_properties(buf_T *buf)
}
/*
- * Fetch the text properties for line "lnum" in buffer 'buf".
+ * Fetch the text properties for line "lnum" in buffer "buf".
* Returns the number of text properties and, when non-zero, a pointer to the
* first one in "props" (note that it is not aligned, therefore the char_u
* pointer).
@@ -617,11 +617,13 @@ prop_type_set(typval_T *argvars, int add)
{
*htp = (hashtab_T *)alloc(sizeof(hashtab_T));
if (*htp == NULL)
+ {
+ vim_free(prop);
return;
+ }
hash_init(*htp);
}
- hash_add(buf == NULL ? global_proptypes : buf->b_proptypes,
- PT2HIKEY(prop));
+ hash_add(*htp, PT2HIKEY(prop));
}
else
{
@@ -640,7 +642,7 @@ prop_type_set(typval_T *argvars, int add)
char_u *highlight;
int hl_id = 0;
- highlight = get_dict_string(dict, (char_u *)"highlight", TRUE);
+ highlight = get_dict_string(dict, (char_u *)"highlight", FALSE);
if (highlight != NULL && *highlight != NUL)
hl_id = syn_name2id(highlight);
if (hl_id <= 0)
@@ -721,12 +723,14 @@ f_prop_type_delete(typval_T *argvars, typval_T *rettv UNUSED)
if (hi != NULL)
{
hashtab_T *ht;
+ proptype_T *prop = HI2PT(hi);
if (buf == NULL)
ht = global_proptypes;
else
ht = buf->b_proptypes;
hash_remove(ht, hi);
+ vim_free(prop);
}
}
@@ -846,7 +850,7 @@ clear_ht_prop_types(hashtab_T *ht)
#if defined(EXITFREE) || defined(PROTO)
/*
- * Free all property types for "buf".
+ * Free all global property types.
*/
void
clear_global_prop_types(void)
diff --git a/src/version.c b/src/version.c
index 9a44976f0..a0ffd4e37 100644
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 582,
+/**/
581,
/**/
580,