xref: /freebsd-src/contrib/mandoc/compat_stringlist.c (revision 61d06d6bd19dafe8ea971dd43e8328fa1b473456)
1*61d06d6bSBaptiste Daroussin #include "config.h"
2*61d06d6bSBaptiste Daroussin 
3*61d06d6bSBaptiste Daroussin #if HAVE_STRINGLIST
4*61d06d6bSBaptiste Daroussin 
5*61d06d6bSBaptiste Daroussin int dummy;
6*61d06d6bSBaptiste Daroussin 
7*61d06d6bSBaptiste Daroussin #else
8*61d06d6bSBaptiste Daroussin 
9*61d06d6bSBaptiste Daroussin /*	$Id: compat_stringlist.c,v 1.6 2015/11/07 14:22:29 schwarze Exp $	*/
10*61d06d6bSBaptiste Daroussin /*
11*61d06d6bSBaptiste Daroussin  * Copyright (c) 1994 Christos Zoulas <christos@netbsd.org>
12*61d06d6bSBaptiste Daroussin  * All rights reserved.
13*61d06d6bSBaptiste Daroussin  *
14*61d06d6bSBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
15*61d06d6bSBaptiste Daroussin  * modification, are permitted provided that the following conditions
16*61d06d6bSBaptiste Daroussin  * are met:
17*61d06d6bSBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
18*61d06d6bSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
19*61d06d6bSBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
20*61d06d6bSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
21*61d06d6bSBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
22*61d06d6bSBaptiste Daroussin  *
23*61d06d6bSBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
24*61d06d6bSBaptiste Daroussin  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*61d06d6bSBaptiste Daroussin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*61d06d6bSBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
27*61d06d6bSBaptiste Daroussin  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*61d06d6bSBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*61d06d6bSBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*61d06d6bSBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*61d06d6bSBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*61d06d6bSBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*61d06d6bSBaptiste Daroussin  * SUCH DAMAGE.
34*61d06d6bSBaptiste Daroussin  */
35*61d06d6bSBaptiste Daroussin 
36*61d06d6bSBaptiste Daroussin #if HAVE_ERR
37*61d06d6bSBaptiste Daroussin #include <err.h>
38*61d06d6bSBaptiste Daroussin #endif
39*61d06d6bSBaptiste Daroussin #include <stdlib.h>
40*61d06d6bSBaptiste Daroussin #include <string.h>
41*61d06d6bSBaptiste Daroussin #include "compat_stringlist.h"
42*61d06d6bSBaptiste Daroussin 
43*61d06d6bSBaptiste Daroussin #define _SL_CHUNKSIZE	20
44*61d06d6bSBaptiste Daroussin 
45*61d06d6bSBaptiste Daroussin /*
46*61d06d6bSBaptiste Daroussin  * sl_init(): Initialize a string list
47*61d06d6bSBaptiste Daroussin  */
48*61d06d6bSBaptiste Daroussin StringList *
49*61d06d6bSBaptiste Daroussin sl_init(void)
50*61d06d6bSBaptiste Daroussin {
51*61d06d6bSBaptiste Daroussin 	StringList *sl;
52*61d06d6bSBaptiste Daroussin 
53*61d06d6bSBaptiste Daroussin 	sl = malloc(sizeof(StringList));
54*61d06d6bSBaptiste Daroussin 	if (sl == NULL)
55*61d06d6bSBaptiste Daroussin 		err(1, "stringlist");
56*61d06d6bSBaptiste Daroussin 
57*61d06d6bSBaptiste Daroussin 	sl->sl_cur = 0;
58*61d06d6bSBaptiste Daroussin 	sl->sl_max = _SL_CHUNKSIZE;
59*61d06d6bSBaptiste Daroussin 	sl->sl_str = reallocarray(NULL, sl->sl_max, sizeof(char *));
60*61d06d6bSBaptiste Daroussin 	if (sl->sl_str == NULL)
61*61d06d6bSBaptiste Daroussin 		err(1, "stringlist");
62*61d06d6bSBaptiste Daroussin 	return sl;
63*61d06d6bSBaptiste Daroussin }
64*61d06d6bSBaptiste Daroussin 
65*61d06d6bSBaptiste Daroussin 
66*61d06d6bSBaptiste Daroussin /*
67*61d06d6bSBaptiste Daroussin  * sl_add(): Add an item to the string list
68*61d06d6bSBaptiste Daroussin  */
69*61d06d6bSBaptiste Daroussin int
70*61d06d6bSBaptiste Daroussin sl_add(StringList *sl, char *name)
71*61d06d6bSBaptiste Daroussin {
72*61d06d6bSBaptiste Daroussin 	if (sl->sl_cur == sl->sl_max - 1) {
73*61d06d6bSBaptiste Daroussin 		sl->sl_max += _SL_CHUNKSIZE;
74*61d06d6bSBaptiste Daroussin 		sl->sl_str = reallocarray(sl->sl_str,
75*61d06d6bSBaptiste Daroussin 		    sl->sl_max, sizeof(char *));
76*61d06d6bSBaptiste Daroussin 		if (sl->sl_str == NULL)
77*61d06d6bSBaptiste Daroussin 			return (-1);
78*61d06d6bSBaptiste Daroussin 	}
79*61d06d6bSBaptiste Daroussin 	sl->sl_str[sl->sl_cur++] = name;
80*61d06d6bSBaptiste Daroussin 	return (0);
81*61d06d6bSBaptiste Daroussin }
82*61d06d6bSBaptiste Daroussin 
83*61d06d6bSBaptiste Daroussin 
84*61d06d6bSBaptiste Daroussin /*
85*61d06d6bSBaptiste Daroussin  * sl_free(): Free a stringlist
86*61d06d6bSBaptiste Daroussin  */
87*61d06d6bSBaptiste Daroussin void
88*61d06d6bSBaptiste Daroussin sl_free(StringList *sl, int all)
89*61d06d6bSBaptiste Daroussin {
90*61d06d6bSBaptiste Daroussin 	size_t i;
91*61d06d6bSBaptiste Daroussin 
92*61d06d6bSBaptiste Daroussin 	if (sl == NULL)
93*61d06d6bSBaptiste Daroussin 		return;
94*61d06d6bSBaptiste Daroussin 	if (sl->sl_str) {
95*61d06d6bSBaptiste Daroussin 		if (all)
96*61d06d6bSBaptiste Daroussin 			for (i = 0; i < sl->sl_cur; i++)
97*61d06d6bSBaptiste Daroussin 				free(sl->sl_str[i]);
98*61d06d6bSBaptiste Daroussin 		free(sl->sl_str);
99*61d06d6bSBaptiste Daroussin 	}
100*61d06d6bSBaptiste Daroussin 	free(sl);
101*61d06d6bSBaptiste Daroussin }
102*61d06d6bSBaptiste Daroussin 
103*61d06d6bSBaptiste Daroussin 
104*61d06d6bSBaptiste Daroussin /*
105*61d06d6bSBaptiste Daroussin  * sl_find(): Find a name in the string list
106*61d06d6bSBaptiste Daroussin  */
107*61d06d6bSBaptiste Daroussin char *
108*61d06d6bSBaptiste Daroussin sl_find(StringList *sl, const char *name)
109*61d06d6bSBaptiste Daroussin {
110*61d06d6bSBaptiste Daroussin 	size_t i;
111*61d06d6bSBaptiste Daroussin 
112*61d06d6bSBaptiste Daroussin 	for (i = 0; i < sl->sl_cur; i++)
113*61d06d6bSBaptiste Daroussin 		if (strcmp(sl->sl_str[i], name) == 0)
114*61d06d6bSBaptiste Daroussin 			return sl->sl_str[i];
115*61d06d6bSBaptiste Daroussin 
116*61d06d6bSBaptiste Daroussin 	return NULL;
117*61d06d6bSBaptiste Daroussin }
118*61d06d6bSBaptiste Daroussin 
119*61d06d6bSBaptiste Daroussin #endif
120