Added new functions g_strstr_len, g_strrstr and g_strrstr_len

2001-06-08  Alex Larsson  <alexl@redhat.com>

	* 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.
This commit is contained in:
Alex Larsson 2001-06-08 23:14:03 +00:00 committed by Alexander Larsson
parent 6858b5342f
commit 106fb627f1
17 changed files with 449 additions and 27 deletions

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -1,3 +1,15 @@
2001-06-08 Alex Larsson <alexl@redhat.com>
* 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 <hp@redhat.com>
* gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that

View File

@ -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;
}

View File

@ -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 */

View File

@ -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,

View File

@ -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

View File

@ -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;
}

View File

@ -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 */

View File

@ -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,

28
gutf8.c
View File

@ -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

View File

@ -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;
}