diff options
author | Grigori Goronzy <greg@chown.ath.cx> | 2015-06-12 02:53:09 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@chown.ath.cx> | 2015-07-10 10:43:16 +0200 |
commit | 2272875210b9abc3255bedce9301231e8e8c4865 (patch) | |
tree | bb46b5715da54e8586edd495a07a9b9471ddc08c /libass | |
parent | ef707a9e7d1934c433a55b9f7f4376ca6e7956d1 (diff) | |
download | libass-2272875210b9abc3255bedce9301231e8e8c4865.tar.bz2 libass-2272875210b9abc3255bedce9301231e8e8c4865.tar.xz |
fontselect: add and use strdup_trimmed
This is just a cleaner and safer interface for string trimming.
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_fontselect.c | 13 | ||||
-rw-r--r-- | libass/ass_utils.c | 18 | ||||
-rw-r--r-- | libass/ass_utils.h | 1 |
3 files changed, 20 insertions, 12 deletions
diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 95a4038..3fcd8c7 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -455,11 +455,14 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, int idx = -1; ASS_FontInfo req; char *req_fullname; - char *tfamily = trim_space(strdup(family)); + char *family_trim = strdup_trimmed(family); + + if (family_trim == NULL) + return NULL; ASS_FontProvider *default_provider = priv->default_provider; if (default_provider && default_provider->funcs.match_fonts) - default_provider->funcs.match_fonts(library, default_provider, tfamily); + default_provider->funcs.match_fonts(library, default_provider, family_trim); ASS_FontInfo *font_infos = priv->font_infos; @@ -474,7 +477,7 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, req.width = 100; req.n_fullname = 1; req.fullnames = &req_fullname; - req.fullnames[0] = tfamily; + req.fullnames[0] = family_trim; // match font unsigned score_min = UINT_MAX; @@ -494,8 +497,8 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, } } - // free font request - free(req.fullnames[0]); + // free font name + free(family_trim); // found anything? if (idx < 0) { diff --git a/libass/ass_utils.c b/libass/ass_utils.c index 40e6533..06ae8c7 100644 --- a/libass/ass_utils.c +++ b/libass/ass_utils.c @@ -331,22 +331,26 @@ void ass_msg(ASS_Library *priv, int lvl, char *fmt, ...) va_end(va); } -char *trim_space(char *str) +/** + * Return a string with spaces trimmed at start and end. + * \param str input string + * \return output string, can be released with free() + */ +char *strdup_trimmed(const char *str) { - int i; int left = 0; int right = strlen(str) - 1; + char *out = NULL; while (isspace(str[left])) left++; while (right > left && isspace(str[right])) right--; - if (left > 0) - for (i = 0; i <= right - left; i++) - str[i] = str[left+i]; + out = calloc(1, right-left+2); - str[right-left+1] = '\0'; + if (out) + memcpy(out, str + left, right-left+1); - return str; + return out; } unsigned ass_utf8_get_char(char **str) diff --git a/libass/ass_utils.h b/libass/ass_utils.h index caff161..79fe589 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -91,6 +91,7 @@ int32_t parse_alpha_tag(char *str); uint32_t parse_color_tag(char *str); uint32_t parse_color_header(char *str); char *trim_space(char *str); +char *strdup_trimmed(const char *str); char parse_bool(char *str); int parse_ycbcr_matrix(char *str); unsigned ass_utf8_get_char(char **str); |