157416Smarkm/* 2233294Sstas * Copyright (c) 1998, 1999 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 557416Smarkm * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 957416Smarkm * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 1257416Smarkm * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * documentation and/or other materials provided with the distribution. 1657416Smarkm * 17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 18233294Sstas * may be used to endorse or promote products derived from this software 19233294Sstas * without specific prior written permission. 2057416Smarkm * 21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31233294Sstas * SUCH DAMAGE. 3257416Smarkm */ 3357416Smarkm 3457416Smarkm#include <config.h> 3557416Smarkm 3657416Smarkm#include <stdarg.h> 3757416Smarkm#include <stdlib.h> 3857416Smarkm#include <string.h> 3957416Smarkm#include <errno.h> 40178825Sdfr#include "roken.h" 4157416Smarkm 4257416Smarkmenum { initial = 10, increment = 5 }; 4357416Smarkm 4457416Smarkmstatic char ** 4557416Smarkmsub (char **argv, int i, int argc, va_list *ap) 4657416Smarkm{ 4757416Smarkm do { 4857416Smarkm if(i == argc) { 4957416Smarkm /* realloc argv */ 5057416Smarkm char **tmp = realloc(argv, (argc + increment) * sizeof(*argv)); 5157416Smarkm if(tmp == NULL) { 5257416Smarkm free(argv); 5357416Smarkm errno = ENOMEM; 5457416Smarkm return NULL; 5557416Smarkm } 5657416Smarkm argv = tmp; 5757416Smarkm argc += increment; 5857416Smarkm } 5957416Smarkm argv[i++] = va_arg(*ap, char*); 6057416Smarkm } while(argv[i - 1] != NULL); 6157416Smarkm return argv; 6257416Smarkm} 6357416Smarkm 6457416Smarkm/* 6557416Smarkm * return a malloced vector of pointers to the strings in `ap' 6657416Smarkm * terminated by NULL. 6757416Smarkm */ 6857416Smarkm 69233294SstasROKEN_LIB_FUNCTION char ** ROKEN_LIB_CALL 7057416Smarkmvstrcollect(va_list *ap) 7157416Smarkm{ 7257416Smarkm return sub (NULL, 0, 0, ap); 7357416Smarkm} 7457416Smarkm 7557416Smarkm/* 7657416Smarkm * 7757416Smarkm */ 7857416Smarkm 79233294SstasROKEN_LIB_FUNCTION char ** ROKEN_LIB_CALL 8057416Smarkmstrcollect(char *first, ...) 8157416Smarkm{ 8257416Smarkm va_list ap; 8357416Smarkm char **ret = malloc (initial * sizeof(char *)); 8457416Smarkm 8557416Smarkm if (ret == NULL) 8657416Smarkm return ret; 8757416Smarkm 8857416Smarkm ret[0] = first; 8957416Smarkm va_start(ap, first); 9057416Smarkm ret = sub (ret, 1, initial, &ap); 9157416Smarkm va_end(ap); 9257416Smarkm return ret; 9357416Smarkm} 94