tag: revert g_strescape() patch
Don't use g_strescape(), because it escapes all non-ASCII characters. Add a new function which clears all non-printable characters, not just "newline".
This commit is contained in:
parent
6d2e4f4e72
commit
77b32addf1
63
src/tag.c
63
src/tag.c
@ -411,19 +411,64 @@ void tag_end_add(struct tag *tag)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
char_is_non_printable(unsigned char ch)
|
||||||
|
{
|
||||||
|
return ch < 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
find_non_printable(const char *p, size_t length)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < length; ++i)
|
||||||
|
if (char_is_non_printable(p[i]))
|
||||||
|
return p + i;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all non-printable characters, convert them to space.
|
||||||
|
* Returns NULL if nothing needs to be cleared.
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
clear_non_printable(const char *p, size_t length)
|
||||||
|
{
|
||||||
|
const char *first = find_non_printable(p, length);
|
||||||
|
char *dest;
|
||||||
|
|
||||||
|
if (first == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* duplicate and null-terminate the string */
|
||||||
|
dest = g_memdup(p, length);
|
||||||
|
dest[length] = 0;
|
||||||
|
|
||||||
|
for (size_t i = first - p; i < length; ++i)
|
||||||
|
if (char_is_non_printable(dest[i]))
|
||||||
|
dest[i] = ' ';
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
fix_tag_value(const char *p, size_t length)
|
fix_tag_value(const char *p, size_t length)
|
||||||
{
|
{
|
||||||
char *utf8, *escaped;
|
char *utf8, *cleared;
|
||||||
|
|
||||||
utf8 = fix_utf8(p, length);
|
utf8 = fix_utf8(p, length);
|
||||||
if (utf8 == NULL)
|
if (utf8 != NULL) {
|
||||||
utf8 = g_strndup(p, length);
|
p = utf8;
|
||||||
|
length = strlen(p);
|
||||||
|
}
|
||||||
|
|
||||||
escaped = g_strescape(utf8, NULL);
|
cleared = clear_non_printable(p, length);
|
||||||
g_free(utf8);
|
if (cleared == NULL)
|
||||||
|
cleared = utf8;
|
||||||
|
else
|
||||||
|
g_free(utf8);
|
||||||
|
|
||||||
return escaped;
|
return cleared;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void appendToTagItems(struct tag *tag, enum tag_type type,
|
static void appendToTagItems(struct tag *tag, enum tag_type type,
|
||||||
@ -433,6 +478,10 @@ static void appendToTagItems(struct tag *tag, enum tag_type type,
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = fix_tag_value(value, len);
|
p = fix_tag_value(value, len);
|
||||||
|
if (p != NULL) {
|
||||||
|
value = p;
|
||||||
|
len = strlen(value);
|
||||||
|
}
|
||||||
|
|
||||||
tag->numOfItems++;
|
tag->numOfItems++;
|
||||||
|
|
||||||
@ -449,7 +498,7 @@ static void appendToTagItems(struct tag *tag, enum tag_type type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_mutex_lock(tag_pool_lock);
|
g_mutex_lock(tag_pool_lock);
|
||||||
tag->items[i] = tag_pool_get_item(type, p, strlen(p));
|
tag->items[i] = tag_pool_get_item(type, value, len);
|
||||||
g_mutex_unlock(tag_pool_lock);
|
g_mutex_unlock(tag_pool_lock);
|
||||||
|
|
||||||
g_free(p);
|
g_free(p);
|
||||||
|
Loading…
Reference in New Issue
Block a user