#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "str-list.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xalloc.h"
void
string_list_init (string_list_ty *slp)
{
slp->item = NULL;
slp->nitems = 0;
slp->nitems_max = 0;
}
string_list_ty *
string_list_alloc ()
{
string_list_ty *slp;
slp = (string_list_ty *) xmalloc (sizeof (*slp));
slp->item = NULL;
slp->nitems = 0;
slp->nitems_max = 0;
return slp;
}
void
string_list_append (string_list_ty *slp, const char *s)
{
if (slp->nitems >= slp->nitems_max)
{
size_t nbytes;
slp->nitems_max = slp->nitems_max * 2 + 4;
nbytes = slp->nitems_max * sizeof (slp->item[0]);
slp->item = (const char **) xrealloc (slp->item, nbytes);
}
slp->item[slp->nitems++] = xstrdup (s);
}
void
string_list_append_unique (string_list_ty *slp, const char *s)
{
size_t j;
for (j = 0; j < slp->nitems; ++j)
if (strcmp (slp->item[j], s) == 0)
return;
if (slp->nitems >= slp->nitems_max)
{
slp->nitems_max = slp->nitems_max * 2 + 4;
slp->item = (const char **) xrealloc (slp->item,
slp->nitems_max
* sizeof (slp->item[0]));
}
slp->item[slp->nitems++] = xstrdup (s);
}
void
string_list_destroy (string_list_ty *slp)
{
size_t j;
for (j = 0; j < slp->nitems; ++j)
free ((char *) slp->item[j]);
if (slp->item != NULL)
free (slp->item);
}
void
string_list_free (string_list_ty *slp)
{
size_t j;
for (j = 0; j < slp->nitems; ++j)
free ((char *) slp->item[j]);
if (slp->item != NULL)
free (slp->item);
free (slp);
}
char *
string_list_concat (const string_list_ty *slp)
{
size_t len;
size_t j;
char *result;
size_t pos;
len = 1;
for (j = 0; j < slp->nitems; ++j)
len += strlen (slp->item[j]);
result = (char *) xmalloc (len);
pos = 0;
for (j = 0; j < slp->nitems; ++j)
{
len = strlen (slp->item[j]);
memcpy (result + pos, slp->item[j], len);
pos += len;
}
result[pos] = '\0';
return result;
}
char *
string_list_concat_destroy (string_list_ty *slp)
{
char *result;
if (slp->nitems == 1)
{
result = (char *) slp->item[0];
free (slp->item);
}
else
{
result = string_list_concat (slp);
string_list_destroy (slp);
}
return result;
}
#if 0
char *
string_list_join (const string_list_ty *slp)
{
size_t len;
size_t j;
char *result;
size_t pos;
len = 1;
for (j = 0; j < slp->nitems; ++j)
{
if (j)
++len;
len += strlen (slp->item[j]);
}
result = (char *) xmalloc (len);
pos = 0;
for (j = 0; j < slp->nitems; ++j)
{
if (j)
result[pos++] = ' ';
len = strlen (slp->item[j]);
memcpy (result + pos, slp->item[j], len);
pos += len;
}
result[pos] = '\0';
return result;
}
#endif
bool
string_list_member (const string_list_ty *slp, const char *s)
{
size_t j;
for (j = 0; j < slp->nitems; ++j)
if (strcmp (slp->item[j], s) == 0)
return true;
return false;
}