blob: 51e27607db20a605512a298eb79333c142abb1e7 [file] [log] [blame]
/*
* libdpkg - Debian packaging suite library routines
* varbuf.h - variable length expandable buffer handling
*
* Copyright © 1994, 1995 Ian Jackson <ian@chiark.greenend.org.uk>
* Copyright © 2008-2011 Guillem Jover <guillem@debian.org>
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LIBDPKG_VARBUF_H
#define LIBDPKG_VARBUF_H
#include <stddef.h>
#include <stdarg.h>
#include <dpkg/macros.h>
DPKG_BEGIN_DECLS
/*
* varbuf_init must be called exactly once before the use of each varbuf
* (including before any call to varbuf_destroy), or the variable must be
* initialized with VARBUF_INIT.
*
* However, varbufs allocated ‘static’ are properly initialized anyway and
* do not need varbuf_init; multiple consecutive calls to varbuf_init before
* any use are allowed.
*
* varbuf_destroy must be called after a varbuf is finished with, if anything
* other than varbuf_init has been done. After this you are allowed but
* not required to call varbuf_init again if you want to start using the
* varbuf again.
*
* Callers using C++ need not worry about any of this.
*/
struct varbuf {
size_t used, size;
char *buf;
#ifdef __cplusplus
varbuf(size_t _size = 0);
~varbuf();
void init(size_t _size = 0);
void reset();
void destroy();
void operator()(int c);
void operator()(const char *s);
void terminate(void/*to shut 2.6.3 up*/);
const char *string();
#endif
};
#define VARBUF_INIT { 0, 0, NULL }
void varbuf_init(struct varbuf *v, size_t size);
void varbuf_grow(struct varbuf *v, size_t need_size);
void varbuf_trunc(struct varbuf *v, size_t used_size);
char *varbuf_detach(struct varbuf *v);
void varbuf_reset(struct varbuf *v);
void varbuf_destroy(struct varbuf *v);
void varbuf_add_char(struct varbuf *v, int c);
void varbuf_dup_char(struct varbuf *v, int c, size_t n);
void varbuf_map_char(struct varbuf *v, int c_src, int c_dst);
#define varbuf_add_str(v, s) varbuf_add_buf(v, s, strlen(s))
void varbuf_add_buf(struct varbuf *v, const void *s, size_t size);
void varbuf_end_str(struct varbuf *v);
int varbuf_printf(struct varbuf *v, const char *fmt, ...) DPKG_ATTR_PRINTF(2);
int varbuf_vprintf(struct varbuf *v, const char *fmt, va_list va)
DPKG_ATTR_VPRINTF(2);
DPKG_END_DECLS
#ifdef __cplusplus
inline
varbuf::varbuf(size_t _size)
{
varbuf_init(this, _size);
}
inline
varbuf::~varbuf()
{
varbuf_destroy(this);
}
inline void
varbuf::init(size_t _size)
{
varbuf_init(this, _size);
}
inline void
varbuf::reset()
{
used = 0;
}
inline void
varbuf::destroy()
{
varbuf_destroy(this);
}
inline void
varbuf::operator()(int c)
{
varbuf_add_char(this, c);
}
inline void
varbuf::operator()(const char *s)
{
varbuf_add_str(this, s);
}
inline void
varbuf::terminate(void/*to shut 2.6.3 up*/)
{
varbuf_end_str(this);
}
inline const char *
varbuf::string()
{
terminate();
return buf;
}
#endif
#endif /* LIBDPKG_VARBUF_H */