On Sat, 23 Aug 2008 09:58:12 -0400 "Havoc Pennington" <hp pobox com> wrote: > If you're talking about converting existing APIs to refcounted > strings, that's a very different proposal from just adding some kind > of refcounted string feature. It would break thousands of apps, or > else duplicate hundreds of API entry points ... Personally, I didn't have in mind a change of existing API; simply an addition of something new: typedef struct { gchar *str; gsize len; gint refcount; } GCString; GCString *g_cstring_new_static(gchar *data); GCString *g_cstring_new_from_gstring(GString *clone); GCString *g_cstring_ref(GCString *str); void g_cstring_unref(GCstring *str); should be sufficient for immutable strings. copy-on-write mutable ones would probably want allocated length in the struct too, and add something like GCString *g_cstring_dup(GCString *clone); which can then sit in the beginning of the modifier functions, looking something like GCstring *g_cstring_append(GCstring *s, gchar *data) { if(s->refcount > 1) s = g_cstring_dup(s); /* now modify s */ return s; } From my experience using GString I'd find the following macro useful; #define GCSTR(s) (s?s->str:NULL) Then you can printf("Hello, my name is %s\n", GCSTR(s)); a little safer. Or note that C requires the address of a struct must be the address of its first member; so a simple cast is sufficient printf("Hello, my name is %s\n", (gchar*)s); -- Paul "LeoNerd" Evans leonerd leonerd org uk ICQ# 4135350 | Registered Linux# 179460 http://www.leonerd.org.uk/
Attachment:
signature.asc
Description: PGP signature