gutf8: Add a g_utf8_validate_len() function

This is a variant of g_utf8_validate() which requires the length to be
specified, thereby allowing string lengths up to G_MAXSIZE rather than
just G_MAXSSIZE.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
This commit is contained in:
Philip Withnall 2018-10-01 19:52:14 +01:00
parent 8e60b3dde0
commit 7a4025cac1
4 changed files with 54 additions and 10 deletions

View File

@ -2964,6 +2964,7 @@ g_utf8_strrchr
g_utf8_strreverse
g_utf8_substring
g_utf8_validate
g_utf8_validate_len
g_utf8_make_valid
<SUBSECTION>

View File

@ -847,6 +847,10 @@ GLIB_AVAILABLE_IN_ALL
gboolean g_utf8_validate (const gchar *str,
gssize max_len,
const gchar **end);
GLIB_AVAILABLE_IN_2_60
gboolean g_utf8_validate_len (const gchar *str,
gsize max_len,
const gchar **end);
GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_strup (const gchar *str,

View File

@ -1669,16 +1669,48 @@ g_utf8_validate (const char *str,
{
const gchar *p;
if (max_len < 0)
if (max_len >= 0)
return g_utf8_validate_len (str, max_len, end);
p = fast_validate (str);
if (end)
*end = p;
if (*p != '\0')
return FALSE;
else
return TRUE;
}
/**
* g_utf8_validate_len:
* @str: (array length=max_len) (element-type guint8): a pointer to character data
* @max_len: max bytes to validate
* @end: (out) (optional) (transfer none): return location for end of valid data
*
* Validates UTF-8 encoded text.
*
* As with g_utf8_validate(), but @max_len must be set, and hence this function
* will always return %FALSE if any of the bytes of @str are nul.
*
* Returns: %TRUE if the text was valid UTF-8
* Since: 2.60
*/
gboolean
g_utf8_validate_len (const char *str,
gsize max_len,
const gchar **end)
{
const gchar *p;
p = fast_validate_len (str, max_len);
if (end)
*end = p;
if ((max_len >= 0 && p != str + max_len) ||
(max_len < 0 && *p != '\0'))
if (p != str + max_len)
return FALSE;
else
return TRUE;

View File

@ -280,15 +280,22 @@ do_test (gconstpointer d)
result = g_utf8_validate (test->text, test->max_len, &end);
g_assert (result == test->valid);
g_assert (end - test->text == test->offset);
g_assert_true (result == test->valid);
g_assert_cmpint (end - test->text, ==, test->offset);
if (test->max_len < 0)
{
result = g_utf8_validate (test->text, strlen (test->text), &end);
g_assert (result == test->valid);
g_assert (end - test->text == test->offset);
g_assert_true (result == test->valid);
g_assert_cmpint (end - test->text, ==, test->offset);
}
else
{
result = g_utf8_validate_len (test->text, test->max_len, &end);
g_assert_true (result == test->valid);
g_assert_cmpint (end - test->text, ==, test->offset);
}
}