Blame src/e-util/e-poolv.c

Packit Service de44cd
/*
Packit Service de44cd
 * e-poolv.c
Packit Service de44cd
 *
Packit Service de44cd
 * This program is free software; you can redistribute it and/or modify it
Packit Service de44cd
 * under the terms of the GNU Lesser General Public License as published by
Packit Service de44cd
 * the Free Software Foundation.
Packit Service de44cd
 *
Packit Service de44cd
 * This program is distributed in the hope that it will be useful, but
Packit Service de44cd
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service de44cd
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit Service de44cd
 * for more details.
Packit Service de44cd
 *
Packit Service de44cd
 * You should have received a copy of the GNU Lesser General Public License
Packit Service de44cd
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service de44cd
 *
Packit Service de44cd
 */
Packit Service de44cd
Packit Service de44cd
#include "evolution-config.h"
Packit Service de44cd
Packit Service de44cd
#include "e-poolv.h"
Packit Service de44cd
Packit Service de44cd
#include <string.h>
Packit Service de44cd
#include <camel/camel.h>
Packit Service de44cd
Packit Service de44cd
struct _EPoolv {
Packit Service de44cd
	guchar length;
Packit Service de44cd
	const gchar *s[1];
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
/**
Packit Service de44cd
 * e_poolv_new:
Packit Service de44cd
 * @size: The number of elements in the poolv, maximum of 254 elements.
Packit Service de44cd
 *
Packit Service de44cd
 * Create a new #EPoolv: a string vector which shares a global string
Packit Service de44cd
 * pool.  An #EPoolv can be used to work with arrays of strings which
Packit Service de44cd
 * save memory by eliminating duplicated allocations of the same string.
Packit Service de44cd
 *
Packit Service de44cd
 * This is useful when you have a log of read-only strings that do not
Packit Service de44cd
 * go away and are duplicated a lot, such as email headers.
Packit Service de44cd
 *
Packit Service de44cd
 * Returns: a new #EPoolv
Packit Service de44cd
 **/
Packit Service de44cd
EPoolv *
Packit Service de44cd
e_poolv_new (guint size)
Packit Service de44cd
{
Packit Service de44cd
	EPoolv *poolv;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (size < 255, NULL);
Packit Service de44cd
Packit Service de44cd
	poolv = g_malloc0 (sizeof (*poolv) + (size - 1) * sizeof (gchar *));
Packit Service de44cd
	poolv->length = size;
Packit Service de44cd
Packit Service de44cd
	return poolv;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/**
Packit Service de44cd
 * e_poolv_set:
Packit Service de44cd
 * @poolv: pooled string vector
Packit Service de44cd
 * @index: index in vector of string
Packit Service de44cd
 * @str: string to set
Packit Service de44cd
 * @freeit: whether the caller is releasing its reference to the
Packit Service de44cd
 * string
Packit Service de44cd
 *
Packit Service de44cd
 * Set a string vector reference.  If the caller will no longer be
Packit Service de44cd
 * referencing the string, freeit should be TRUE.  Otherwise, this
Packit Service de44cd
 * will duplicate the string if it is not found in the pool.
Packit Service de44cd
 *
Packit Service de44cd
 * Returns: @poolv
Packit Service de44cd
 **/
Packit Service de44cd
EPoolv *
Packit Service de44cd
e_poolv_set (EPoolv *poolv,
Packit Service de44cd
             gint index,
Packit Service de44cd
             gchar *str,
Packit Service de44cd
             gint freeit)
Packit Service de44cd
{
Packit Service de44cd
	const gchar *old_str;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (poolv != NULL, NULL);
Packit Service de44cd
	g_return_val_if_fail (index >= 0 && index < poolv->length, NULL);
Packit Service de44cd
Packit Service de44cd
	if (!str) {
Packit Service de44cd
		camel_pstring_free (poolv->s[index]);
Packit Service de44cd
		poolv->s[index] = NULL;
Packit Service de44cd
		return poolv;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	old_str = poolv->s[index];
Packit Service de44cd
	poolv->s[index] = (gchar *) camel_pstring_add (str, freeit);
Packit Service de44cd
Packit Service de44cd
	camel_pstring_free (old_str);
Packit Service de44cd
Packit Service de44cd
	return poolv;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/**
Packit Service de44cd
 * e_poolv_get:
Packit Service de44cd
 * @poolv: pooled string vector
Packit Service de44cd
 * @index: index in vector of string
Packit Service de44cd
 *
Packit Service de44cd
 * Retrieve a string by index.  This could possibly just be a macro.
Packit Service de44cd
 *
Packit Service de44cd
 * Since the pool is never freed, this string does not need to be
Packit Service de44cd
 * duplicated, but should not be modified.
Packit Service de44cd
 *
Packit Service de44cd
 * Returns: string at that index.
Packit Service de44cd
 **/
Packit Service de44cd
const gchar *
Packit Service de44cd
e_poolv_get (EPoolv *poolv,
Packit Service de44cd
             gint index)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (poolv != NULL, NULL);
Packit Service de44cd
	g_return_val_if_fail (index >= 0 && index < poolv->length, NULL);
Packit Service de44cd
Packit Service de44cd
	return poolv->s[index] ? poolv->s[index] : "";
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/**
Packit Service de44cd
 * e_poolv_destroy:
Packit Service de44cd
 * @poolv: pooled string vector to free
Packit Service de44cd
 *
Packit Service de44cd
 * Free a pooled string vector.  This doesn't free the strings from
Packit Service de44cd
 * the vector, however.
Packit Service de44cd
 **/
Packit Service de44cd
void
Packit Service de44cd
e_poolv_destroy (EPoolv *poolv)
Packit Service de44cd
{
Packit Service de44cd
	gint ii;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (poolv != NULL);
Packit Service de44cd
Packit Service de44cd
	for (ii = 0; ii < poolv->length; ii++) {
Packit Service de44cd
		camel_pstring_free (poolv->s[ii]);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_free (poolv);
Packit Service de44cd
}