diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2020-06-15 21:48:09 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2020-06-15 21:48:09 +0000 |
commit | 1f8994da70d19127b4bfc3b7d7e663b33d1cb425 (patch) | |
tree | 6bd3d53e46e315180c353e2b2502b39a8ed5a082 /compat_stringlist.c | |
parent | b91ca2a687ec3398376597864c0df15dbd57ecd2 (diff) | |
download | mandoc-1f8994da70d19127b4bfc3b7d7e663b33d1cb425.tar.gz |
Sync stringlist implementation with NetBSD.
Various improvements of security, functionality, and style.
Diffstat (limited to 'compat_stringlist.c')
-rw-r--r-- | compat_stringlist.c | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/compat_stringlist.c b/compat_stringlist.c index 0cec45b3..452cbc6d 100644 --- a/compat_stringlist.c +++ b/compat_stringlist.c @@ -1,8 +1,13 @@ -/* $Id$ */ -/* - * Copyright (c) 1994 Christos Zoulas <christos@netbsd.org> +/* $Id$ */ +/* $NetBSD: stringlist.c,v 1.14 2015/05/21 01:29:13 christos Exp $ */ + +/*- + * Copyright (c) 1994, 1999 The NetBSD Foundation, Inc. * All rights reserved. * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,23 +17,20 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" -#if HAVE_ERR -#include <err.h> -#endif #include <stdlib.h> #include <string.h> #include "compat_stringlist.h" @@ -45,13 +47,15 @@ sl_init(void) sl = malloc(sizeof(StringList)); if (sl == NULL) - err(1, "stringlist"); + return NULL; sl->sl_cur = 0; sl->sl_max = _SL_CHUNKSIZE; sl->sl_str = reallocarray(NULL, sl->sl_max, sizeof(char *)); - if (sl->sl_str == NULL) - err(1, "stringlist"); + if (sl->sl_str == NULL) { + free(sl); + sl = NULL; + } return sl; } @@ -63,14 +67,17 @@ int sl_add(StringList *sl, char *name) { if (sl->sl_cur == sl->sl_max - 1) { + char **new; + + new = reallocarray(sl->sl_str, (sl->sl_max + _SL_CHUNKSIZE), + sizeof(char *)); + if (new == NULL) + return -1; sl->sl_max += _SL_CHUNKSIZE; - sl->sl_str = reallocarray(sl->sl_str, - sl->sl_max, sizeof(char *)); - if (sl->sl_str == NULL) - return (-1); + sl->sl_str = new; } sl->sl_str[sl->sl_cur++] = name; - return (0); + return 0; } @@ -108,3 +115,21 @@ sl_find(StringList *sl, const char *name) return NULL; } + +int +sl_delete(StringList *sl, const char *name, int all) +{ + size_t i, j; + + for (i = 0; i < sl->sl_cur; i++) + if (strcmp(sl->sl_str[i], name) == 0) { + if (all) + free(sl->sl_str[i]); + for (j = i + 1; j < sl->sl_cur; j++) + sl->sl_str[j - 1] = sl->sl_str[j]; + sl->sl_str[--sl->sl_cur] = NULL; + return 0; + } + return -1; +} + |