dpkg 1.22.7-3-g89f48
Loading...
Searching...
No Matches
varbuf.h
Go to the documentation of this file.
1/*
2 * libdpkg - Debian packaging suite library routines
3 * varbuf.h - variable length expandable buffer handling
4 *
5 * Copyright © 1994, 1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
6 * Copyright © 2008-2015 Guillem Jover <guillem@debian.org>
7 *
8 * This is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#ifndef LIBDPKG_VARBUF_H
23#define LIBDPKG_VARBUF_H
24
25#include <stddef.h>
26#include <stdarg.h>
27#include <stdbool.h>
28#include <string.h>
29
30#include <dpkg/macros.h>
31
33
56struct varbuf {
57 size_t used, size;
58 char *buf;
59
60#ifdef __cplusplus
61 explicit varbuf(size_t _size = 0);
62 ~varbuf();
63 void init(size_t _size = 0);
64 void reset();
65 void destroy();
66 int fmt(const char *_fmt, ...) DPKG_ATTR_PRINTF(2);
67 int vfmt(const char *_fmt, va_list va) DPKG_ATTR_VPRINTF(2);
68 void operator()(int c);
69 void operator()(const char *s);
70 const char *string();
71#endif
72};
73
74#define VARBUF_INIT { 0, 0, NULL }
75
76#define VARBUF_OBJECT (struct varbuf)VARBUF_INIT
77
78struct varbuf *varbuf_new(size_t size);
79void varbuf_init(struct varbuf *v, size_t size);
80void varbuf_grow(struct varbuf *v, size_t need_size);
81void varbuf_trunc(struct varbuf *v, size_t used_size);
82char *varbuf_detach(struct varbuf *v);
83void varbuf_reset(struct varbuf *v);
84void varbuf_destroy(struct varbuf *v);
85void varbuf_free(struct varbuf *v);
86
87const char *varbuf_str(struct varbuf *v);
88
89void varbuf_set_varbuf(struct varbuf *v, struct varbuf *other);
90void varbuf_set_buf(struct varbuf *v, const void *buf, size_t size);
91#define varbuf_set_str(v, s) varbuf_set_buf(v, s, strlen(s))
92#define varbuf_set_strn(v, s, n) varbuf_set_buf(v, s, strnlen(s, n))
93
94void varbuf_add_varbuf(struct varbuf *v, const struct varbuf *other);
95void varbuf_add_char(struct varbuf *v, int c);
96void varbuf_dup_char(struct varbuf *v, int c, size_t n);
97void varbuf_map_char(struct varbuf *v, int c_src, int c_dst);
98#define varbuf_add_str(v, s) varbuf_add_buf(v, s, strlen(s))
99#define varbuf_add_strn(v, s, n) varbuf_add_buf(v, s, strnlen(s, n))
100void varbuf_add_dir(struct varbuf *v, const char *dirname);
101void varbuf_add_buf(struct varbuf *v, const void *s, size_t size);
102
103bool varbuf_has_prefix(struct varbuf *v, struct varbuf *prefix);
104bool varbuf_has_suffix(struct varbuf *v, struct varbuf *suffix);
105void varbuf_trim_varbuf_prefix(struct varbuf *v, struct varbuf *prefix);
106void varbuf_trim_char_prefix(struct varbuf *v, int prefix);
107
108int varbuf_printf(struct varbuf *v, const char *fmt, ...) DPKG_ATTR_PRINTF(2);
109int varbuf_vprintf(struct varbuf *v, const char *fmt, va_list va)
111
113 struct varbuf *v;
114 size_t used;
115};
116
117void varbuf_snapshot(struct varbuf *v, struct varbuf_state *vs);
118void varbuf_rollback(struct varbuf_state *vs);
119size_t varbuf_rollback_len(struct varbuf_state *vs);
120const char *varbuf_rollback_start(struct varbuf_state *vs);
121
125
126#ifdef __cplusplus
127inline
128varbuf::varbuf(size_t _size)
129{
130 varbuf_init(this, _size);
131}
132
133inline
134varbuf::~varbuf()
135{
136 varbuf_destroy(this);
137}
138
139inline void
140varbuf::init(size_t _size)
141{
142 varbuf_init(this, _size);
143}
144
145inline void
146varbuf::reset()
147{
148 used = 0;
149}
150
151inline void
152varbuf::destroy()
153{
154 varbuf_destroy(this);
155}
156
157inline int
158varbuf::fmt(const char *_fmt, ...)
159{
160 va_list args;
161 int rc;
162
163 va_start(args, _fmt);
164 rc = varbuf_vprintf(this, _fmt, args);
165 va_end(args);
166
167 return rc;
168}
169
170inline int
171varbuf::vfmt(const char *_fmt, va_list va)
172{
173 return varbuf_vprintf(this, _fmt, va);
174}
175
176inline void
177varbuf::operator()(int c)
178{
179 varbuf_add_char(this, c);
180}
181
182inline void
183varbuf::operator()(const char *s)
184{
185 varbuf_add_str(this, s);
186}
187
188inline const char *
189varbuf::string()
190{
191 return varbuf_str(this);
192}
193#endif
194
195#endif /* LIBDPKG_VARBUF_H */
void * args[20]
Definition ehandle.c:89
#define DPKG_BEGIN_DECLS
Definition macros.h:164
#define DPKG_ATTR_VPRINTF(n)
Definition macros.h:118
#define DPKG_ATTR_PRINTF(n)
Definition macros.h:117
#define DPKG_END_DECLS
Definition macros.h:165
void varbuf_free(struct varbuf *v)
Definition varbuf.c:333
void varbuf_dup_char(struct varbuf *v, int c, size_t n)
Definition varbuf.c:140
void varbuf_add_dir(struct varbuf *v, const char *dirname)
Definition varbuf.c:161
const char * varbuf_rollback_start(struct varbuf_state *vs)
Definition varbuf.c:297
#define varbuf_add_str(v, s)
Definition varbuf.h:98
void varbuf_add_varbuf(struct varbuf *v, const struct varbuf *other)
Definition varbuf.c:123
void varbuf_trim_varbuf_prefix(struct varbuf *v, struct varbuf *prefix)
Definition varbuf.c:212
void varbuf_destroy(struct varbuf *v)
Definition varbuf.c:324
int varbuf_printf(struct varbuf *v, const char *fmt,...) DPKG_ATTR_PRINTF(2)
Definition varbuf.c:262
char * varbuf_detach(struct varbuf *v)
Definition varbuf.c:309
void varbuf_map_char(struct varbuf *v, int c_src, int c_dst)
Definition varbuf.c:151
void varbuf_rollback(struct varbuf_state *vs)
Definition varbuf.c:282
void varbuf_add_buf(struct varbuf *v, const void *s, size_t size)
Definition varbuf.c:169
void varbuf_init(struct varbuf *v, size_t size)
Definition varbuf.c:45
void varbuf_grow(struct varbuf *v, size_t need_size)
Definition varbuf.c:58
void varbuf_snapshot(struct varbuf *v, struct varbuf_state *vs)
Definition varbuf.c:275
void varbuf_reset(struct varbuf *v)
Definition varbuf.c:93
void varbuf_set_varbuf(struct varbuf *v, struct varbuf *other)
Definition varbuf.c:117
struct varbuf * varbuf_new(size_t size)
Definition varbuf.c:34
size_t varbuf_rollback_len(struct varbuf_state *vs)
Definition varbuf.c:288
bool varbuf_has_suffix(struct varbuf *v, struct varbuf *suffix)
Definition varbuf.c:194
bool varbuf_has_prefix(struct varbuf *v, struct varbuf *prefix)
Definition varbuf.c:180
void varbuf_trunc(struct varbuf *v, size_t used_size)
Definition varbuf.c:81
void varbuf_set_buf(struct varbuf *v, const void *buf, size_t size)
Definition varbuf.c:110
void varbuf_trim_char_prefix(struct varbuf *v, int prefix)
Definition varbuf.c:222
const char * varbuf_str(struct varbuf *v)
Definition varbuf.c:101
int varbuf_vprintf(struct varbuf *v, const char *fmt, va_list va) DPKG_ATTR_VPRINTF(2)
Definition varbuf.c:238
void varbuf_add_char(struct varbuf *v, int c)
Definition varbuf.c:132
Definition varbuf.h:112
struct varbuf * v
Definition varbuf.h:113
size_t used
Definition varbuf.h:114
varbuf_init must be called exactly once before the use of each varbuf (including before any call to v...
Definition varbuf.h:56
size_t used
Definition varbuf.h:57
char * buf
Definition varbuf.h:58
size_t size
Definition varbuf.h:57