1
/* GNU gettext - internationalization aids
2
Copyright (C) 1995, 1998, 2000-2003 Free Software Foundation, Inc.
4
This file was written by Peter Miller <millerp@canb.auug.org.au>
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software Foundation,
18
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
34
/* Initialize an empty list of strings. */
36
string_list_init (string_list_ty *slp)
44
/* Return a fresh, empty list of strings. */
50
slp = (string_list_ty *) xmalloc (sizeof (*slp));
59
/* Append a single string to the end of a list of strings. */
61
string_list_append (string_list_ty *slp, const char *s)
64
if (slp->nitems >= slp->nitems_max)
68
slp->nitems_max = slp->nitems_max * 2 + 4;
69
nbytes = slp->nitems_max * sizeof (slp->item[0]);
70
slp->item = (const char **) xrealloc (slp->item, nbytes);
73
/* Add a copy of the string to the end of the list. */
74
slp->item[slp->nitems++] = xstrdup (s);
78
/* Append a single string to the end of a list of strings, unless it is
79
already contained in the list. */
81
string_list_append_unique (string_list_ty *slp, const char *s)
85
/* Do not if the string is already in the list. */
86
for (j = 0; j < slp->nitems; ++j)
87
if (strcmp (slp->item[j], s) == 0)
91
if (slp->nitems >= slp->nitems_max)
93
slp->nitems_max = slp->nitems_max * 2 + 4;
94
slp->item = (const char **) xrealloc (slp->item,
96
* sizeof (slp->item[0]));
99
/* Add a copy of the string to the end of the list. */
100
slp->item[slp->nitems++] = xstrdup (s);
104
/* Destroy a list of strings. */
106
string_list_destroy (string_list_ty *slp)
110
for (j = 0; j < slp->nitems; ++j)
111
free ((char *) slp->item[j]);
112
if (slp->item != NULL)
117
/* Free a list of strings. */
119
string_list_free (string_list_ty *slp)
123
for (j = 0; j < slp->nitems; ++j)
124
free ((char *) slp->item[j]);
125
if (slp->item != NULL)
131
/* Return a freshly allocated string obtained by concatenating all the
132
strings in the list. */
134
string_list_concat (const string_list_ty *slp)
142
for (j = 0; j < slp->nitems; ++j)
143
len += strlen (slp->item[j]);
144
result = (char *) xmalloc (len);
146
for (j = 0; j < slp->nitems; ++j)
148
len = strlen (slp->item[j]);
149
memcpy (result + pos, slp->item[j], len);
157
/* Return a freshly allocated string obtained by concatenating all the
158
strings in the list, and destroy the list. */
160
string_list_concat_destroy (string_list_ty *slp)
164
/* Optimize the most frequent case. */
165
if (slp->nitems == 1)
167
result = (char *) slp->item[0];
172
result = string_list_concat (slp);
173
string_list_destroy (slp);
180
/* Return a freshly allocated string obtained by concatenating all the
181
strings in the list, separated by spaces. */
183
string_list_join (const string_list_ty *slp)
191
for (j = 0; j < slp->nitems; ++j)
195
len += strlen (slp->item[j]);
197
result = (char *) xmalloc (len);
199
for (j = 0; j < slp->nitems; ++j)
203
len = strlen (slp->item[j]);
204
memcpy (result + pos, slp->item[j], len);
213
/* Return 1 if s is contained in the list of strings, 0 otherwise. */
215
string_list_member (const string_list_ty *slp, const char *s)
219
for (j = 0; j < slp->nitems; ++j)
220
if (strcmp (slp->item[j], s) == 0)