Index: ossp-pkg/cfg/ChangeLog RCS File: /v/ossp/cvs/ossp-pkg/cfg/ChangeLog,v rcsdiff -q -kk '-r1.14' '-r1.15' -u '/v/ossp/cvs/ossp-pkg/cfg/ChangeLog,v' 2>/dev/null --- ChangeLog 2004/11/20 11:33:06 1.14 +++ ChangeLog 2004/11/20 11:34:52 1.15 @@ -10,6 +10,11 @@ Changes between 0.9.3 and 0.9.4 (23-Apr-2003 to xx-Nov-2004): + *) Return an empty string instead of NULL from internal + cfg_buf_content() function to not make visible to the caller the + implementation special case of an initial buffer. + [Ralf S. Engelschall ] + *) Added initial cut for Perl bindings. [Ralf S. Engelschall ] Index: ossp-pkg/cfg/cfg_buf.c RCS File: /v/ossp/cvs/ossp-pkg/cfg/cfg_buf.c,v co -q -kk -p'1.11' '/v/ossp/cvs/ossp-pkg/cfg/cfg_buf.c,v' | diff -u /dev/null - -L'ossp-pkg/cfg/cfg_buf.c' 2>/dev/null --- ossp-pkg/cfg/cfg_buf.c +++ - 2025-05-20 13:19:59.738812494 +0200 @@ -0,0 +1,151 @@ +/* +** OSSP cfg - Configuration Parsing +** Copyright (c) 2002-2004 Ralf S. Engelschall +** Copyright (c) 2002-2004 The OSSP Project (http://www.ossp.org/) +** Copyright (c) 2002-2004 Cable & Wireless (http://www.cw.com/) +** +** This file is part of OSSP cfg, a configuration parsing +** library which can be found at http://www.ossp.org/pkg/lib/cfg/. +** +** Permission to use, copy, modify, and distribute this software for +** any purpose with or without fee is hereby granted, provided that +** the above copyright notice and this permission notice appear in all +** copies. +** +** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +** 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. +** +** cfg_buf.c: auto-resizing buffer +*/ + +#include +#include +#include + +#include "cfg.h" +#include "cfg_global.h" +#include "cfg_buf.h" +#include "cfg_fmt.h" + +struct cfg_buf_st { + char *buf_ptr; + size_t buf_size; + size_t buf_len; +}; + +cfg_rc_t cfg_buf_create(cfg_buf_t **buf) +{ + if (buf == NULL) + return CFG_ERR_ARG; + if ((*buf = (cfg_buf_t *)malloc(sizeof(cfg_buf_t))) == NULL) + return CFG_ERR_SYS; + (*buf)->buf_ptr = NULL; + (*buf)->buf_len = 0; + (*buf)->buf_size = 0; + return CFG_OK; +} + +cfg_rc_t cfg_buf_resize(cfg_buf_t *buf, signed int n) +{ + char *cp; + + if (buf == NULL) + return CFG_ERR_ARG; + if (n == 0) { + /* destroy buffer */ + if (buf->buf_ptr != NULL) + free(buf->buf_ptr); + buf->buf_ptr = NULL; + buf->buf_len = 0; + buf->buf_size = 0; + } + else { + /* shrink or grow buffer */ + if (buf->buf_ptr == NULL) { + if ((buf->buf_ptr = malloc(n+1)) == NULL) + return CFG_ERR_SYS; + buf->buf_size = n+1; + buf->buf_len = 0; + } + else { + if ((cp = realloc(buf->buf_ptr, buf->buf_size+n)) == NULL) + return CFG_ERR_SYS; + buf->buf_ptr = cp; + buf->buf_size += n; + if (buf->buf_len >= buf->buf_size) { + buf->buf_len = buf->buf_size-1; + *(buf->buf_ptr + buf->buf_len) = '\0'; + } + } + } + return CFG_OK; +} + +cfg_rc_t cfg_buf_format(cfg_buf_t *buf, const char *fmt, ...) +{ + va_list ap; + cfg_rc_t rc; + + va_start(ap, fmt); + rc = cfg_buf_vformat(buf, fmt, ap); + va_end(ap); + return rc; +} + +cfg_rc_t cfg_buf_vformat(cfg_buf_t *buf, const char *fmt, va_list ap) +{ + cfg_rc_t rc; + int n; + + if (buf == NULL || fmt == NULL) + return CFG_ERR_ARG; + if ((n = cfg_fmt_vsprintf(NULL, -1, fmt, ap)) == -1) + return CFG_ERR_FMT; + if ((rc = cfg_buf_resize(buf, n)) != CFG_OK) + return rc; + if ((n = cfg_fmt_vsprintf(buf->buf_ptr + buf->buf_len, + buf->buf_size - buf->buf_len, + fmt, ap)) == -1) + return CFG_ERR_FMT; + buf->buf_len += n; + return CFG_OK; +} + +cfg_rc_t cfg_buf_content(cfg_buf_t *buf, char **ptr, size_t *len, size_t *size) +{ + if (buf == NULL) + return CFG_ERR_ARG; + if (ptr != NULL) { + if (buf->buf_ptr == NULL) + *ptr = strdup(""); + else + *ptr = buf->buf_ptr; + buf->buf_ptr = NULL; + } + if (len != NULL) + *len = buf->buf_len; + if (size != NULL) + *size = buf->buf_size; + return CFG_OK; +} + +cfg_rc_t cfg_buf_destroy(cfg_buf_t *buf) +{ + if (buf == NULL) + return CFG_ERR_ARG; + if (buf->buf_ptr != NULL) + free(buf->buf_ptr); + free(buf); + return CFG_OK; +} +