From 0f3306a56ebffc3140f662a0b87ab06b4e0363af Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Tue, 15 Nov 2016 13:34:44 +0000 Subject: [PATCH] Add reference counted strings 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. --- glib/Makefile.am | 2 ++ glib/glib.h | 1 + glib/grefstring.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ glib/grefstring.h | 39 +++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 glib/grefstring.c create mode 100644 glib/grefstring.h 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 #include #include +#include #include #include #include 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 . + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "grefstring.h" + +#include + +#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 . + */ + +#ifndef __G_REF_STRING_H__ +#define __G_REF_STRING_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +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__ */