strcollect.c revision 57416
157416Smarkm/* 257416Smarkm * Copyright (c) 1998, 1999 Kungliga Tekniska H�gskolan 357416Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 457416Smarkm * All rights reserved. 557416Smarkm * 657416Smarkm * Redistribution and use in source and binary forms, with or without 757416Smarkm * modification, are permitted provided that the following conditions 857416Smarkm * are met: 957416Smarkm * 1057416Smarkm * 1. Redistributions of source code must retain the above copyright 1157416Smarkm * notice, this list of conditions and the following disclaimer. 1257416Smarkm * 1357416Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1457416Smarkm * notice, this list of conditions and the following disclaimer in the 1557416Smarkm * documentation and/or other materials provided with the distribution. 1657416Smarkm * 1757416Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1857416Smarkm * may be used to endorse or promote products derived from this software 1957416Smarkm * without specific prior written permission. 2057416Smarkm * 2157416Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2257416Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2357416Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2457416Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2557416Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2657416Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2757416Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2857416Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2957416Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3057416Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3157416Smarkm * SUCH DAMAGE. 3257416Smarkm */ 3357416Smarkm 3457416Smarkm#ifdef HAVE_CONFIG_H 3557416Smarkm#include <config.h> 3657416SmarkmRCSID("$Id: strcollect.c,v 1.1 2000/01/09 10:57:43 assar Exp $"); 3757416Smarkm#endif 3857416Smarkm 3957416Smarkm#include <stdarg.h> 4057416Smarkm#include <stdlib.h> 4157416Smarkm#include <string.h> 4257416Smarkm#include <errno.h> 4357416Smarkm#include <roken.h> 4457416Smarkm 4557416Smarkmenum { initial = 10, increment = 5 }; 4657416Smarkm 4757416Smarkmstatic char ** 4857416Smarkmsub (char **argv, int i, int argc, va_list *ap) 4957416Smarkm{ 5057416Smarkm do { 5157416Smarkm if(i == argc) { 5257416Smarkm /* realloc argv */ 5357416Smarkm char **tmp = realloc(argv, (argc + increment) * sizeof(*argv)); 5457416Smarkm if(tmp == NULL) { 5557416Smarkm free(argv); 5657416Smarkm errno = ENOMEM; 5757416Smarkm return NULL; 5857416Smarkm } 5957416Smarkm argv = tmp; 6057416Smarkm argc += increment; 6157416Smarkm } 6257416Smarkm argv[i++] = va_arg(*ap, char*); 6357416Smarkm } while(argv[i - 1] != NULL); 6457416Smarkm return argv; 6557416Smarkm} 6657416Smarkm 6757416Smarkm/* 6857416Smarkm * return a malloced vector of pointers to the strings in `ap' 6957416Smarkm * terminated by NULL. 7057416Smarkm */ 7157416Smarkm 7257416Smarkmchar ** 7357416Smarkmvstrcollect(va_list *ap) 7457416Smarkm{ 7557416Smarkm return sub (NULL, 0, 0, ap); 7657416Smarkm} 7757416Smarkm 7857416Smarkm/* 7957416Smarkm * 8057416Smarkm */ 8157416Smarkm 8257416Smarkmchar ** 8357416Smarkmstrcollect(char *first, ...) 8457416Smarkm{ 8557416Smarkm va_list ap; 8657416Smarkm char **ret = malloc (initial * sizeof(char *)); 8757416Smarkm 8857416Smarkm if (ret == NULL) 8957416Smarkm return ret; 9057416Smarkm 9157416Smarkm ret[0] = first; 9257416Smarkm va_start(ap, first); 9357416Smarkm ret = sub (ret, 1, initial, &ap); 9457416Smarkm va_end(ap); 9557416Smarkm return ret; 9657416Smarkm} 97