diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2016-11-15 13:34:44 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2016-11-15 13:34:44 +0000 |
commit | 0f3306a56ebffc3140f662a0b87ab06b4e0363af (patch) | |
tree | c0c2f827118a5cf36f67ce1755cb8936f829a3ec | |
parent | 43ed42e4d52c14816b10ba83cedfb37e6ccc839a (diff) | |
download | glib-wip/ebassi/rc.tar.gz |
Add reference counted stringswip/ebassi/rc
Instead of copying strings around, we can box them using the g_ref_* API
and add reference counting to the char array.
Reference counted strings can be used with any string utility function.
-rw-r--r-- | glib/Makefile.am | 2 | ||||
-rw-r--r-- | glib/glib.h | 1 | ||||
-rw-r--r-- | glib/grefstring.c | 64 | ||||
-rw-r--r-- | glib/grefstring.h | 39 |
4 files changed, 106 insertions, 0 deletions
diff --git a/glib/Makefile.am b/glib/Makefile.am index 15623e304..0f1f8a3c1 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -156,6 +156,7 @@ libglib_2_0_la_SOURCES = \ gqueue.c \ grand.c \ grefcount.c \ + grefstring.c \ gregex.c \ gscanner.c \ gscripttable.h \ @@ -289,6 +290,7 @@ glibsubinclude_HEADERS = \ gqueue.h \ grand.h \ grefcount.h \ + grefstring.h \ gregex.h \ gscanner.h \ gsequence.h \ diff --git a/glib/glib.h b/glib/glib.h index b92ac6cfc..53324c956 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -70,6 +70,7 @@ #include <glib/gqueue.h> #include <glib/grand.h> #include <glib/grefcount.h> +#include <glib/grefstring.h> #include <glib/gregex.h> #include <glib/gscanner.h> #include <glib/gsequence.h> diff --git a/glib/grefstring.c b/glib/grefstring.c new file mode 100644 index 000000000..a37cd9912 --- /dev/null +++ b/glib/grefstring.c @@ -0,0 +1,64 @@ +/* GLib - Library of useful routines for C programming + * Copyright 2016 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "grefstring.h" + +#include <string.h> + +#include "gmessages.h" +#include "grefcount.h" + +char * +g_ref_string_new (const char *str) +{ + gsize len; + char *res; + + g_return_val_if_fail (str != NULL || *str != '\0', NULL); + + len = strlen (str); + res = g_ref_alloc (len + 1, NULL); + + memcpy (res, str, len); + res[len] = '\0'; + + return res; +} + +char * +g_ref_string_ref (char *str) +{ + g_return_val_if_fail (str != NULL, NULL); + + g_ref_acquire (str); + + return str; +} + +void +g_ref_string_unref (char *str) +{ + g_return_if_fail (str != NULL); + + g_ref_release (str); +} diff --git a/glib/grefstring.h b/glib/grefstring.h new file mode 100644 index 000000000..cc766b03d --- /dev/null +++ b/glib/grefstring.h @@ -0,0 +1,39 @@ +/* GLib - Library of useful routines for C programming + * Copyright 2016 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __G_REF_STRING_H__ +#define __G_REF_STRING_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only <glib.h> can be included directly." +#endif + +#include <glib/gutils.h> + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_52 +char * g_ref_string_new (const char *str); + +GLIB_AVAILABLE_IN_2_52 +char * g_ref_string_ref (char *str); +GLIB_AVAILABLE_IN_2_52 +void g_ref_string_unref (char *str); + +G_END_DECLS + +#endif /* __G_REF_STRING_H__ */ |