strpool.c revision 302408
1133808Spjd/* 2133808Spjd * Copyright (c) 2005 Kungliga Tekniska H��gskolan 3133808Spjd * (Royal Institute of Technology, Stockholm, Sweden). 4133808Spjd * All rights reserved. 5133808Spjd * 6133808Spjd * Redistribution and use in source and binary forms, with or without 7133808Spjd * modification, are permitted provided that the following conditions 8133808Spjd * are met: 9133808Spjd * 10133808Spjd * 1. Redistributions of source code must retain the above copyright 11133808Spjd * notice, this list of conditions and the following disclaimer. 12133808Spjd * 13133808Spjd * 2. Redistributions in binary form must reproduce the above copyright 14133808Spjd * notice, this list of conditions and the following disclaimer in the 15133808Spjd * documentation and/or other materials provided with the distribution. 16133808Spjd * 17133808Spjd * 3. Neither the name of the Institute nor the names of its contributors 18133808Spjd * may be used to endorse or promote products derived from this software 19133808Spjd * without specific prior written permission. 20133808Spjd * 21133808Spjd * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22133808Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23133808Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24133808Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25133808Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26133808Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27133808Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28133808Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29133808Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30133808Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31133808Spjd * SUCH DAMAGE. 32133808Spjd */ 33133808Spjd 34133808Spjd#include <config.h> 35133808Spjd 36133808Spjd#include <stdarg.h> 37133808Spjd#include <stdlib.h> 38133808Spjd#include "roken.h" 39133808Spjd 40133808Spjdstruct rk_strpool { 41133808Spjd char *str; 42133808Spjd size_t len; 43133808Spjd}; 44133808Spjd 45133808Spjd/* 46133808Spjd * 47133808Spjd */ 48133808Spjd 49133808SpjdROKEN_LIB_FUNCTION void ROKEN_LIB_CALL 50133808Spjdrk_strpoolfree(struct rk_strpool *p) 51133808Spjd{ 52133808Spjd if (p->str) { 53133808Spjd free(p->str); 54133808Spjd p->str = NULL; 55133808Spjd } 56133808Spjd free(p); 57133808Spjd} 58133808Spjd 59133808Spjd/* 60133808Spjd * 61134124Spjd */ 62134124Spjd 63134168SpjdROKEN_LIB_FUNCTION struct rk_strpool * ROKEN_LIB_CALL 64134168Spjdrk_strpoolprintf(struct rk_strpool *p, const char *fmt, ...) 65133808Spjd{ 66133808Spjd va_list ap; 67133808Spjd char *str, *str2; 68133808Spjd int len; 69133808Spjd 70133808Spjd if (p == NULL) { 71133808Spjd p = malloc(sizeof(*p)); 72133808Spjd if (p == NULL) 73133808Spjd return NULL; 74133808Spjd p->str = NULL; 75133808Spjd p->len = 0; 76133808Spjd } 77133808Spjd va_start(ap, fmt); 78133808Spjd len = vasprintf(&str, fmt, ap); 79133808Spjd va_end(ap); 80134124Spjd if (str == NULL) { 81134168Spjd rk_strpoolfree(p); 82133808Spjd return NULL; 83133808Spjd } 84133808Spjd str2 = realloc(p->str, len + p->len + 1); 85133808Spjd if (str2 == NULL) { 86133808Spjd rk_strpoolfree(p); 87133808Spjd return NULL; 88133808Spjd } 89133808Spjd p->str = str2; 90133808Spjd memcpy(p->str + p->len, str, len + 1); 91133808Spjd p->len += len; 92133808Spjd free(str); 93133808Spjd return p; 94133808Spjd} 95133808Spjd 96133808Spjd/* 97133808Spjd * 98133808Spjd */ 99133808Spjd 100133808SpjdROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL 101133808Spjdrk_strpoolcollect(struct rk_strpool *p) 102133808Spjd{ 103133808Spjd char *str; 104133808Spjd if (p == NULL) 105133808Spjd return strdup(""); 106133808Spjd str = p->str; 107133808Spjd p->str = NULL; 108134168Spjd free(p); 109133808Spjd return str; 110133808Spjd} 111134168Spjd