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