Some new GString functions - constructors



As promised earlier, here's a patch with some new functions for GString.
I'll split them up with related changes, so this is just the first of a
sequence.

There's 3 functions added here, g_string_clone, g_string_new_lenz, and
g_string_slice. Each is a constructor, to return a new GString object.


* g_string_clone() is a convenient wrapper to take a copy of an
  existing GString;

    g_string_clone(s)  ==   g_string_new(s->str)

  Except it returns NULL if s == NULL.

* g_string_new_lenz() is similar to g_string_new_len(), only it appends
  a terminating nul byte to the string buffer, making it safe to
  printf() or use as a normal gchar* string.

* g_string_slice() returns a new GString containing just a portion of
  the given string.


I wasn't quite sure how to implement these, in terms of writing new
code, or just calling one of the other functions. And also I'm rather
new to the documentation system, so I hope I've done those right.
Comments / suggestions / corrections would be most appreciated.


---

Some other ideas
================


I have planned at least two other patches.

The first to add two new constructors that I find quite useful in my
code:

    GString* g_string_new_sprintf(const gchar *fmt, ...);

    GString* g_string_new_vsprintf(const gchar *fmt, va_list args);

These are a little more convenient than the g_string_new() /
g_string_sprintf() pair, especially if the contructed string is being
return'd from a function.

The other has some other useful functions:

    gboolean g_string_caseequal(GString *s1, GString *s2);

    gint g_string_indexof(GString *str, gchar c);

    void g_string_destroy(GString *str);

The latter is a function which would simply wrap 
  g_string_free(str, TRUE);
but whose type makes it usable as a GDestroyNotify callback.

I also have some slightly more special-purpose functions which I find
useful, but I'm not sure of their place in such a general-purpose
library as GLib. These are:

    GString* g_string_pull_token(GString *str);
    // Deletes a token from the beginning of str, and returns it

    GString* g_string_pull_line(GString *str);
    // Deletes a line from the beginning of str, and returns it

Finally, I have some which I find useful for dealing with lists of
strings. A trivial 

  typedef GList GStringList;

and some functions

  GStringList* g_string_split(GString *str, gchar c);

  GString* g_string_list_fold(GStringList *list, const char *sep);

  void g_string_list_free(GStringList *list, gboolean free_str, gboolean free_data);


I'd be interested to hear opinions on these ideas; especially the later
ones. It's quite possible that these are too special-purpose to warrant
inclusion in GLib. Though I have found them quite useful in my programs,
so I though I'd at least suggest inclusion, and see what the general
opinion is.

-- 
Paul "LeoNerd" Evans

leonerd leonerd org uk
ICQ# 4135350       |  Registered Linux# 179460
http://www.leonerd.org.uk/
Index: docs/reference/glib/glib-sections.txt
===================================================================
RCS file: /cvs/gnome/glib/docs/reference/glib/glib-sections.txt,v
retrieving revision 1.134
diff -u -r1.134 glib-sections.txt
--- docs/reference/glib/glib-sections.txt	19 Dec 2005 21:22:29 -0000	1.134
+++ docs/reference/glib/glib-sections.txt	20 Dec 2005 22:14:52 -0000
@@ -1794,8 +1794,11 @@
 <FILE>strings</FILE>
 GString
 g_string_new
+g_string_clone
 g_string_new_len
+g_string_new_lenz
 g_string_sized_new
+g_string_slice
 g_string_assign
 g_string_sprintf
 g_string_sprintfa
Index: docs/reference/glib/tmpl/strings.sgml
===================================================================
RCS file: /cvs/gnome/glib/docs/reference/glib/tmpl/strings.sgml,v
retrieving revision 1.28
diff -u -r1.28 strings.sgml
--- docs/reference/glib/tmpl/strings.sgml	20 Dec 2005 04:44:25 -0000	1.28
+++ docs/reference/glib/tmpl/strings.sgml	20 Dec 2005 22:14:52 -0000
@@ -46,6 +46,15 @@
 @Returns: the new #GString.
 
 
+<!-- ##### FUNCTION g_string_clone ##### -->
+<para>
+
+</para>
+
+ orig: 
+ Returns: 
+
+
 <!-- ##### FUNCTION g_string_new_len ##### -->
 <para>
 Creates a new #GString with @len bytes of the @init buffer.  Because a length is
@@ -57,6 +66,16 @@
 @Returns: a new #GString.
 
 
+<!-- ##### FUNCTION g_string_new_lenz ##### -->
+<para>
+
+</para>
+
+ init: 
+ len: 
+ Returns: 
+
+
 <!-- ##### FUNCTION g_string_sized_new ##### -->
 <para>
 Creates a new #GString, with enough space for @dfl_size bytes.
@@ -68,6 +87,17 @@
 @Returns: the new #GString.
 
 
+<!-- ##### FUNCTION g_string_slice ##### -->
+<para>
+
+</para>
+
+ string: 
+ pos: 
+ len: 
+ Returns: 
+
+
 <!-- ##### FUNCTION g_string_assign ##### -->
 <para>
 Copies the bytes from a string into a #GString, destroying any previous
@@ -91,6 +121,7 @@
 </para>
 
 @Deprecated: This function has been renamed to g_string_printf().
+<!-- # Unused Parameters # -->
 @string: a #GString.
 @format: the string format. See the sprintf() documentation.
 @Varargs: the parameters to insert into the format string.
@@ -104,6 +135,7 @@
 </para>
 
 @Deprecated: This function has been renamed to g_string_append_printf().
+<!-- # Unused Parameters # -->
 @string: a #GString.
 @format: the string format. See the sprintf() documentation.
 @Varargs: the parameters to insert into the format string.
Index: glib/gstring.c
===================================================================
RCS file: /cvs/gnome/glib/glib/gstring.c,v
retrieving revision 1.49
diff -u -r1.49 gstring.c
--- glib/gstring.c	5 Dec 2005 15:38:52 -0000	1.49
+++ glib/gstring.c	20 Dec 2005 22:14:53 -0000
@@ -297,6 +297,26 @@
   return string;
 }
 
+/**
+ * g_string_clone:
+ * @orig: a #GString object to copy
+ *
+ * Creates a new #GString, initialised to contain the same data as @orig. If 
+ * @orig is %NULL then no new string is allocated and %NULL is returned 
+ * instead.
+ *
+ * Return value: a new #GString or %NULL
+ */
+
+GString*
+g_string_clone (const GString *orig)
+{
+  if (orig)
+    return g_string_new(orig->str);
+  else
+    return NULL;
+}
+
 GString*
 g_string_new_len (const gchar *init,
                   gssize       len)    
@@ -315,6 +335,38 @@
       return string;
     }
 }
+/**
+ * g_string_new_lenz:
+ * @init: initial contents of string.
+ * @len: length of @init to use.
+ * 
+ * Creates a new #GString with @len bytes of the @init buffer, followed by a
+ * nul-termination. Because a length is provided, @init need not be
+ * nul-terminated.
+ *
+ * Return value: a new #GString
+ */
+
+GString*
+g_string_new_lenz (const gchar *init,
+                   gssize       len)
+{
+  GString *string;
+
+  if (len < 0)
+    return g_string_new (init);
+  else
+    {
+      string = g_string_sized_new (len + 1);
+
+      if (init)
+        g_string_append_len (string, init, len);
+
+      g_string_append_c (string, '\0');
+
+      return string;
+    }
+}
 
 gchar*
 g_string_free (GString *string,
@@ -924,6 +976,38 @@
   va_start (args, fmt);
   g_string_append_printf_internal (string, fmt, args);
   va_end (args);
+}
+
+/**
+ * g_string_slice:
+ * @string: a #GString.
+ * @pos: The zero-based index of the start of the section to copy
+ * @len: The number of bytes to copy
+ *
+ * Creates a new #GString by taking a slice of the given string. The slice
+ * will begin at the @pos character, and contain at most @len bytes. The
+ * returned string will be nul-terminated.
+ *
+ * Return value: a new #GString
+ */
+
+GString*
+g_string_slice (GString* string,
+                guint pos,
+                guint len)
+{
+  GString *ret = g_string_new("");
+
+  if (pos > string->len || len < 1)
+    return ret;
+
+  if (pos + len > string->len)
+    len = string->len - pos;
+
+  g_string_append_len (ret, string->str, len);
+  g_string_append_c (ret, '\0');
+
+  return ret;
 }
 
 #define __G_STRING_C__
Index: glib/gstring.h
===================================================================
RCS file: /cvs/gnome/glib/glib/gstring.h,v
retrieving revision 1.15
diff -u -r1.15 gstring.h
--- glib/gstring.h	2 Dec 2004 01:06:17 -0000	1.15
+++ glib/gstring.h	20 Dec 2005 22:14:53 -0000
@@ -59,8 +59,11 @@
 /* Strings
  */
 GString*     g_string_new	        (const gchar	 *init);
+GString*     g_string_clone             (const GString   *orig);
 GString*     g_string_new_len           (const gchar     *init,
                                          gssize           len);   
+GString*     g_string_new_lenz          (const gchar     *init,
+                                         gssize           len);
 GString*     g_string_sized_new         (gsize            dfl_size);  
 gchar*	     g_string_free	        (GString	 *string,
 					 gboolean	  free_segment);
@@ -115,6 +118,9 @@
 void         g_string_append_printf     (GString	 *string,
 					 const gchar	 *format,
 					 ...) G_GNUC_PRINTF (2, 3);
+GString*     g_string_slice             (GString         *string,
+                                         guint            pos,
+                                         guint            len);
 
 /* -- optimize g_strig_append_c --- */
 #ifdef G_CAN_INLINE

Attachment: signature.asc
Description: Digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]