# HG changeset patch # User Bram Moolenaar # Date 1544787008 -3600 # Node ID 7960bf50d345edede8e63a58f4c126080393a52d # Parent d04c4ce36c2a5be4f7394624d2fe701cacd30839 patch 8.1.0582: text properties are not enabled commit https://github.com/vim/vim/commit/fb95e212a2696e5b1c8b5e6b2984af59fa7ead6f Author: Bram Moolenaar Date: Fri Dec 14 12:18:11 2018 +0100 patch 8.1.0582: text properties are not enabled Problem: Text properties are not enabled. Solution: Fix sizeof argument and re-enable the text properties feature. Fix memory leak. diff --git a/src/feature.h b/src/feature.h --- 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 --- a/src/textprop.c +++ b/src/textprop.c @@ -151,7 +151,7 @@ f_prop_add(typval_T *argvars, typval_T * 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 * // 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 * 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 * // 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, ty 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 --- 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,