From 2272875210b9abc3255bedce9301231e8e8c4865 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Fri, 12 Jun 2015 02:53:09 +0200 Subject: fontselect: add and use strdup_trimmed This is just a cleaner and safer interface for string trimming. --- libass/ass_fontselect.c | 13 ++++++++----- libass/ass_utils.c | 18 +++++++++++------- libass/ass_utils.h | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) (limited to 'libass') 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); -- cgit v1.2.3