summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@chown.ath.cx>2015-06-12 02:53:09 +0200
committerGrigori Goronzy <greg@chown.ath.cx>2015-07-10 10:43:16 +0200
commit2272875210b9abc3255bedce9301231e8e8c4865 (patch)
treebb46b5715da54e8586edd495a07a9b9471ddc08c /libass
parentef707a9e7d1934c433a55b9f7f4376ca6e7956d1 (diff)
downloadlibass-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.c13
-rw-r--r--libass/ass_utils.c18
-rw-r--r--libass/ass_utils.h1
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);