Added new functions g_strstr_len, g_strrstr and g_strrstr_len
authorAlex Larsson <alexl@redhat.com>
Fri, 8 Jun 2001 23:14:03 +0000 (23:14 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Fri, 8 Jun 2001 23:14:03 +0000 (23:14 +0000)
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.

17 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib/gstrfuncs.c
glib/gstrfuncs.h
glib/gunicode.h
glib/gutf8.c
gstrfuncs.c
gstrfuncs.h
gunicode.h
gutf8.c
tests/strfunc-test.c

index 006ab4b..553b483 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 006ab4b..553b483 100644 (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 
index 734118a..dd7dc45 100644 (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;
+}
+
+
index e23973c..bf00fab 100644 (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 */
index d0836ad..e3bb817 100644 (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,
index b335ca6..341a7f6 100644 (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
index 734118a..dd7dc45 100644 (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;
+}
+
+
index e23973c..bf00fab 100644 (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 */
index d0836ad..e3bb817 100644 (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,
diff --git a/gutf8.c b/gutf8.c
index b335ca6..341a7f6 100644 (file)
--- 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
index 7c5cd05..2a0c6f5 100644 (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;
 }