From 106fb627f1dc5c51a8fb759702344ae6f08d60c7 Mon Sep 17 00:00:00 2001 From: Alex Larsson Date: Fri, 8 Jun 2001 23:14:03 +0000 Subject: [PATCH] Added new functions g_strstr_len, g_strrstr and g_strrstr_len 2001-06-08 Alex Larsson * gstrfuncs.[ch]: Added new functions g_strstr_len, g_strrstr and g_strrstr_len * tests/strfunc-test.c: Add some tests for the new functions. * gunicode.h: * gutf8.c: Add length argument to g_utf8_strchr and g_utf8_strrchr. --- ChangeLog | 12 +++++ ChangeLog.pre-2-0 | 12 +++++ ChangeLog.pre-2-10 | 12 +++++ ChangeLog.pre-2-12 | 12 +++++ ChangeLog.pre-2-2 | 12 +++++ ChangeLog.pre-2-4 | 12 +++++ ChangeLog.pre-2-6 | 12 +++++ ChangeLog.pre-2-8 | 12 +++++ glib/gstrfuncs.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++ glib/gstrfuncs.h | 9 ++++ glib/gunicode.h | 3 +- glib/gutf8.c | 28 +++++----- gstrfuncs.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++ gstrfuncs.h | 9 ++++ gunicode.h | 3 +- gutf8.c | 28 +++++----- tests/strfunc-test.c | 8 ++- 17 files changed, 449 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 006ab4b..553b483 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 006ab4b..553b483 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + 2001-06-08 Havoc Pennington * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 734118a..dd7dc45 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -1497,3 +1497,149 @@ g_strjoin (const gchar *separator, return string; } + + +/** + * g_strstr_len: + * @haystack: a string + * @haystack_len: The maximum length of haystack + * @needle: The string to search for. + * + * Searches the string haystack for the first occurrence + * of the string needle, limiting the length of the search + * to haystack_len. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle) +{ + int i; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return strstr (haystack, needle); + else + { + const char *p = haystack; + int needle_len = strlen (needle); + const char *end = haystack + haystack_len - needle_len; + + if (needle_len == 0) + return (char *)haystack; + + while (*p && p <= end) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p++; + } + } + + return NULL; +} + +/** + * g_strrstr_len: + * @haystack: a nul-terminated string + * @needle: The nul-terminated string to search for. + * + * Searches the string haystack for the last occurrence + * of the string needle. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strrstr (const gchar *haystack, + const gchar *needle) +{ + int i; + int needle_len = strlen (needle); + int haystack_len = strlen (haystack); + const char *p = haystack + haystack_len - needle_len; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (needle_len == 0) + return (char *)p; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p--; + } + + return NULL; +} + +/** + * g_strrstr_len: + * @haystack: a nul-terminated string + * @haystack_len: The maximum length of haystack + * @needle: The nul-terminated string to search for. + * + * Searches the string haystack for the last occurrence + * of the string needle, limiting the length of the search + * to haystack_len. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strrstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle) +{ + int i; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return g_strrstr (haystack, needle); + else + { + int needle_len = strlen (needle); + const char *haystack_max = haystack + haystack_len; + const char *p = haystack; + + while (p < haystack_max && *p) + p++; + + p -= needle_len; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p--; + } + } + + return NULL; +} + + diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h index e23973c..bf00fab 100644 --- a/glib/gstrfuncs.h +++ b/glib/gstrfuncs.h @@ -60,6 +60,15 @@ gsize g_strlcpy (gchar *dest, gsize g_strlcat (gchar *dest, const gchar *src, gsize dest_size); +gchar * g_strstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle); +gchar * g_strrstr (const gchar *haystack, + const gchar *needle); +gchar * g_strrstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle); + /* removes leading spaces */ gchar* g_strchug (gchar *string); /* removes trailing spaces */ diff --git a/glib/gunicode.h b/glib/gunicode.h index d0836ad..e3bb817 100644 --- a/glib/gunicode.h +++ b/glib/gunicode.h @@ -188,10 +188,11 @@ gchar* g_utf8_strncpy (gchar *dest, /* Find the UTF-8 character corresponding to ch, in string p. These functions are equivalants to strchr and strrchr */ - gchar* g_utf8_strchr (const gchar *p, + gint len, gunichar c); gchar* g_utf8_strrchr (const gchar *p, + gint len, gunichar c); gunichar2 *g_utf8_to_utf16 (const gchar *str, diff --git a/glib/gutf8.c b/glib/gutf8.c index b335ca6..341a7f6 100644 --- a/glib/gutf8.c +++ b/glib/gutf8.c @@ -494,51 +494,55 @@ g_unichar_to_utf8 (gunichar c, gchar *outbuf) /** * g_utf8_strchr: * @p: a nul-terminated utf-8 string + * @p_len: the maximum length of p * @c: a iso-10646 character * * Find the leftmost occurence of the given iso-10646 character - * in a UTF-8 string. + * in a UTF-8 string, while limiting the search to p_len bytes. + * If len is -1, allow unbounded search. * * Return value: NULL if the string does not contain the character, otherwise, a * a pointer to the start of the leftmost of the character in the string. **/ gchar * -g_utf8_strchr (const char *p, gunichar c) +g_utf8_strchr (const char *p, + gint p_len, + gunichar c) { gchar ch[10]; gint len = g_unichar_to_utf8 (c, ch); ch[len] = '\0'; - return strstr(p, ch); + return g_strstr_len (p, p_len, ch); } -#if 0 + /** * g_utf8_strrchr: * @p: a nul-terminated utf-8 string + * @p_len: the maximum length of p * @c: a iso-10646 character/ * * Find the rightmost occurence of the given iso-10646 character - * in a UTF-8 string. + * in a UTF-8 string, while limiting the search to p_len bytes. + * If len is -1, allow unbounded search. * * Return value: NULL if the string does not contain the character, otherwise, a * a pointer to the start of the rightmost of the character in the string. **/ - -/* This is ifdefed out atm as there is no strrstr function in libc. - */ gchar * -unicode_strrchr (const char *p, gunichar c) +g_utf8_strrchr (const char *p, + gint p_len, + gunichar c) { gchar ch[10]; - len = g_unichar_to_utf8 (c, ch); + gint len = g_unichar_to_utf8 (c, ch); ch[len] = '\0'; - return strrstr(p, ch); + return g_strrstr_len (p, p_len, ch); } -#endif /* Like g_utf8_get_char, but take a maximum length diff --git a/gstrfuncs.c b/gstrfuncs.c index 734118a..dd7dc45 100644 --- a/gstrfuncs.c +++ b/gstrfuncs.c @@ -1497,3 +1497,149 @@ g_strjoin (const gchar *separator, return string; } + + +/** + * g_strstr_len: + * @haystack: a string + * @haystack_len: The maximum length of haystack + * @needle: The string to search for. + * + * Searches the string haystack for the first occurrence + * of the string needle, limiting the length of the search + * to haystack_len. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle) +{ + int i; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return strstr (haystack, needle); + else + { + const char *p = haystack; + int needle_len = strlen (needle); + const char *end = haystack + haystack_len - needle_len; + + if (needle_len == 0) + return (char *)haystack; + + while (*p && p <= end) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p++; + } + } + + return NULL; +} + +/** + * g_strrstr_len: + * @haystack: a nul-terminated string + * @needle: The nul-terminated string to search for. + * + * Searches the string haystack for the last occurrence + * of the string needle. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strrstr (const gchar *haystack, + const gchar *needle) +{ + int i; + int needle_len = strlen (needle); + int haystack_len = strlen (haystack); + const char *p = haystack + haystack_len - needle_len; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (needle_len == 0) + return (char *)p; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p--; + } + + return NULL; +} + +/** + * g_strrstr_len: + * @haystack: a nul-terminated string + * @haystack_len: The maximum length of haystack + * @needle: The nul-terminated string to search for. + * + * Searches the string haystack for the last occurrence + * of the string needle, limiting the length of the search + * to haystack_len. + * + * Return value: A pointer to the found occurrence, or + * NULL if not found. + **/ +gchar * +g_strrstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle) +{ + int i; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return g_strrstr (haystack, needle); + else + { + int needle_len = strlen (needle); + const char *haystack_max = haystack + haystack_len; + const char *p = haystack; + + while (p < haystack_max && *p) + p++; + + p -= needle_len; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p--; + } + } + + return NULL; +} + + diff --git a/gstrfuncs.h b/gstrfuncs.h index e23973c..bf00fab 100644 --- a/gstrfuncs.h +++ b/gstrfuncs.h @@ -60,6 +60,15 @@ gsize g_strlcpy (gchar *dest, gsize g_strlcat (gchar *dest, const gchar *src, gsize dest_size); +gchar * g_strstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle); +gchar * g_strrstr (const gchar *haystack, + const gchar *needle); +gchar * g_strrstr_len (const gchar *haystack, + gint haystack_len, + const gchar *needle); + /* removes leading spaces */ gchar* g_strchug (gchar *string); /* removes trailing spaces */ diff --git a/gunicode.h b/gunicode.h index d0836ad..e3bb817 100644 --- a/gunicode.h +++ b/gunicode.h @@ -188,10 +188,11 @@ gchar* g_utf8_strncpy (gchar *dest, /* Find the UTF-8 character corresponding to ch, in string p. These functions are equivalants to strchr and strrchr */ - gchar* g_utf8_strchr (const gchar *p, + gint len, gunichar c); gchar* g_utf8_strrchr (const gchar *p, + gint len, gunichar c); gunichar2 *g_utf8_to_utf16 (const gchar *str, diff --git a/gutf8.c b/gutf8.c index b335ca6..341a7f6 100644 --- a/gutf8.c +++ b/gutf8.c @@ -494,51 +494,55 @@ g_unichar_to_utf8 (gunichar c, gchar *outbuf) /** * g_utf8_strchr: * @p: a nul-terminated utf-8 string + * @p_len: the maximum length of p * @c: a iso-10646 character * * Find the leftmost occurence of the given iso-10646 character - * in a UTF-8 string. + * in a UTF-8 string, while limiting the search to p_len bytes. + * If len is -1, allow unbounded search. * * Return value: NULL if the string does not contain the character, otherwise, a * a pointer to the start of the leftmost of the character in the string. **/ gchar * -g_utf8_strchr (const char *p, gunichar c) +g_utf8_strchr (const char *p, + gint p_len, + gunichar c) { gchar ch[10]; gint len = g_unichar_to_utf8 (c, ch); ch[len] = '\0'; - return strstr(p, ch); + return g_strstr_len (p, p_len, ch); } -#if 0 + /** * g_utf8_strrchr: * @p: a nul-terminated utf-8 string + * @p_len: the maximum length of p * @c: a iso-10646 character/ * * Find the rightmost occurence of the given iso-10646 character - * in a UTF-8 string. + * in a UTF-8 string, while limiting the search to p_len bytes. + * If len is -1, allow unbounded search. * * Return value: NULL if the string does not contain the character, otherwise, a * a pointer to the start of the rightmost of the character in the string. **/ - -/* This is ifdefed out atm as there is no strrstr function in libc. - */ gchar * -unicode_strrchr (const char *p, gunichar c) +g_utf8_strrchr (const char *p, + gint p_len, + gunichar c) { gchar ch[10]; - len = g_unichar_to_utf8 (c, ch); + gint len = g_unichar_to_utf8 (c, ch); ch[len] = '\0'; - return strrstr(p, ch); + return g_strrstr_len (p, p_len, ch); } -#endif /* Like g_utf8_get_char, but take a maximum length diff --git a/tests/strfunc-test.c b/tests/strfunc-test.c index 7c5cd05..2a0c6f5 100644 --- a/tests/strfunc-test.c +++ b/tests/strfunc-test.c @@ -116,7 +116,13 @@ main (int argc, g_assert (strcmp (copy[1], "Bar") == 0); g_assert (copy[2] == NULL); g_strfreev (copy); - + + g_assert (strcmp (g_strstr_len ("FooBarFooBarFoo", 6, "Bar"), + "BarFooBarFoo") == 0); + g_assert (strcmp (g_strrstr ("FooBarFooBarFoo", "Bar"), + "BarFoo") == 0); + g_assert (strcmp (g_strrstr_len ("FooBarFooBarFoo", 14, "BarFoo"), + "BarFooBarFoo") == 0); return 0; } -- 2.7.4