tag: don't return const string from fix_utf8()

Return NULL instead of the input value if there is nothing to fix.
This way, the caller doesn't have to use the xfree() hack.
This commit is contained in:
Max Kellermann 2008-11-01 14:04:15 +01:00
parent aa33422de6
commit b996108675

View File

@ -343,22 +343,24 @@ int tag_equal(const struct tag *tag1, const struct tag *tag2)
return 1; return 1;
} }
static inline const char *fix_utf8(const char *str, size_t *length_r) { static char *
const char *temp; fix_utf8(const char *str, size_t *length_r)
{
char *temp;
GError *error = NULL; GError *error = NULL;
gsize written; gsize written;
assert(str != NULL); assert(str != NULL);
if (g_utf8_validate(str, *length_r, NULL)) if (g_utf8_validate(str, *length_r, NULL))
return str; return NULL;
DEBUG("not valid utf8 in tag: %s\n",str); DEBUG("not valid utf8 in tag: %s\n",str);
temp = g_convert(str, *length_r, "utf-8", "iso-8859-1", temp = g_convert(str, *length_r, "utf-8", "iso-8859-1",
NULL, &written, &error); NULL, &written, &error);
if (temp == NULL) { if (temp == NULL) {
g_error_free(error); g_error_free(error);
return str; return NULL;
} }
*length_r = written; *length_r = written;
@ -401,18 +403,17 @@ static void appendToTagItems(struct tag *tag, enum tag_type type,
const char *value, size_t len) const char *value, size_t len)
{ {
unsigned int i = tag->numOfItems; unsigned int i = tag->numOfItems;
char *duplicated;
const char *p; const char *p;
p = fix_utf8(value, &len); p = duplicated = fix_utf8(value, &len);
if (p == NULL)
p = value;
if (memchr(p, '\n', len) != NULL) { if (memchr(p, '\n', len) != NULL) {
char *duplicated = xmalloc(len + 1); if (duplicated == NULL)
memcpy(duplicated, p, len); p = duplicated = g_strndup(p, len);
duplicated[len] = '\0';
if (p != value)
xfree(p);
stripReturnChar(duplicated); stripReturnChar(duplicated);
p = duplicated;
} }
tag->numOfItems++; tag->numOfItems++;
@ -433,8 +434,7 @@ static void appendToTagItems(struct tag *tag, enum tag_type type,
tag->items[i] = tag_pool_get_item(type, p, len); tag->items[i] = tag_pool_get_item(type, p, len);
pthread_mutex_unlock(&tag_pool_lock); pthread_mutex_unlock(&tag_pool_lock);
if (p != value) g_free(duplicated);
xfree(p);
} }
void tag_add_item_n(struct tag *tag, enum tag_type itemType, void tag_add_item_n(struct tag *tag, enum tag_type itemType,