Skip to content
This repository was archived by the owner on Jun 27, 2019. It is now read-only.

Commit 07838f3

Browse files
author
Gustavo Sverzut Barbieri
committed
sol-buffer: add sol_buffer_insert_printf()
Allows inserting a formatted string at a given position. Signed-off-by: Gustavo Sverzut Barbieri [email protected]
1 parent 7578603 commit 07838f3

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

src/lib/datatypes/include/sol-buffer.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,24 @@ sol_buffer_append_printf(struct sol_buffer *buf, const char *fmt, ...)
212212
return r;
213213
}
214214

215+
/* insert the formatted string into the buffer at given position. If
216+
* position == buf->pos, then the behavior is the same as
217+
* sol_buffer_append_vprintf().
218+
*/
219+
int sol_buffer_insert_vprintf(struct sol_buffer *buf, size_t pos, const char *fmt, va_list args);
220+
static inline int sol_buffer_insert_printf(struct sol_buffer *buf, size_t pos, const char *fmt, ...) SOL_ATTR_PRINTF(3, 4);
221+
static inline int
222+
sol_buffer_insert_printf(struct sol_buffer *buf, size_t pos, const char *fmt, ...)
223+
{
224+
va_list args;
225+
int r;
226+
227+
va_start(args, fmt);
228+
r = sol_buffer_insert_vprintf(buf, pos, fmt, args);
229+
va_end(args);
230+
return r;
231+
}
232+
215233
/**
216234
* @}
217235
*/

src/lib/datatypes/sol-buffer.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,28 @@ sol_buffer_append_vprintf(struct sol_buffer *buf, const char *fmt, va_list args)
214214
va_end(args_copy);
215215
return r;
216216
}
217+
218+
SOL_API int
219+
sol_buffer_insert_vprintf(struct sol_buffer *buf, size_t pos, const char *fmt, va_list args)
220+
{
221+
char *s;
222+
ssize_t len;
223+
struct sol_str_slice slice;
224+
int r;
225+
226+
SOL_NULL_CHECK(buf, -EINVAL);
227+
SOL_NULL_CHECK(fmt, -EINVAL);
228+
SOL_INT_CHECK(pos, > buf->used, -EINVAL);
229+
230+
if (pos == buf->used)
231+
return sol_buffer_append_vprintf(buf, fmt, args);
232+
233+
len = vasprintf(&s, fmt, args);
234+
if (len < 0)
235+
return -errno;
236+
237+
slice = SOL_STR_SLICE_STR(s, len);
238+
r = sol_buffer_insert_slice(buf, pos, slice);
239+
free(s);
240+
return r;
241+
}

src/test/test-buffer.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,30 @@ test_append_printf(void)
241241
sol_buffer_fini(&buf);
242242
}
243243

244+
DEFINE_TEST(test_insert_printf);
245+
246+
static void
247+
test_insert_printf(void)
248+
{
249+
struct sol_buffer buf;
250+
int err;
251+
252+
sol_buffer_init(&buf);
253+
err = sol_buffer_insert_printf(&buf, 0, "'%s'", "This is a longer string, bla bla bla, bla bla bla");
254+
ASSERT_INT_EQ(err, 0);
255+
ASSERT_STR_EQ(buf.data, "'This is a longer string, bla bla bla, bla bla bla'");
256+
257+
err = sol_buffer_insert_printf(&buf, 0, "[%03d]", 1);
258+
ASSERT_INT_EQ(err, 0);
259+
ASSERT_STR_EQ(buf.data, "[001]'This is a longer string, bla bla bla, bla bla bla'");
260+
261+
err = sol_buffer_insert_printf(&buf, strlen("[001]"), " ### ");
262+
ASSERT_INT_EQ(err, 0);
263+
ASSERT_STR_EQ(buf.data, "[001] ### 'This is a longer string, bla bla bla, bla bla bla'");
264+
265+
sol_buffer_fini(&buf);
266+
}
267+
244268
DEFINE_TEST(test_memory_not_owned);
245269

246270
static void

0 commit comments

Comments
 (0)