Skip to content

Commit a644d6c

Browse files
committed
Add formatted SDB setters
1 parent 790815b commit a644d6c

4 files changed

Lines changed: 32 additions & 0 deletions

File tree

include/sdb/sdb.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ SDB_API const char *sdb_const_getf(Sdb*, ut32 *cas, const char *fmt, ...) SDB_PR
235235
// `vlen` the length of the value string.
236236
SDB_API const char *sdb_const_get_len(Sdb* s, const char *key, int *vlen, ut32 *cas);
237237
SDB_API int sdb_set(Sdb*, const char *key, const char *data, ut32 cas);
238+
SDB_API int sdb_setf(Sdb*, const char *data, ut32 cas, const char *fmt, ...) SDB_PRINTF_CHECK(4, 5);
238239
SDB_API int sdb_nset(Sdb*, ut64 nkey, const char *data, ut32 cas);
239240
SDB_API ut64 sdb_num_nget(Sdb *s, ut64 nkey, ut32 *cas);
240241
SDB_API int sdb_num_nset(Sdb* s, ut64 nkey, ut64 nval, ut32 cas);
@@ -252,6 +253,7 @@ SDB_API int sdb_num_base(const char *s);
252253
SDB_API ut64 sdb_num_get(Sdb* s, const char *key, ut32 *cas);
253254
SDB_API ut64 sdb_num_getf(Sdb* s, ut32 *cas, const char *fmt, ...) SDB_PRINTF_CHECK(3, 4);
254255
SDB_API int sdb_num_set(Sdb* s, const char *key, ut64 v, ut32 cas);
256+
SDB_API int sdb_num_setf(Sdb* s, ut64 v, ut32 cas, const char *fmt, ...) SDB_PRINTF_CHECK(4, 5);
255257
SDB_API int sdb_num_add(Sdb *s, const char *key, ut64 v, ut32 cas);
256258
SDB_API ut64 sdb_num_inc(Sdb* s, const char *key, ut64 n, ut32 cas);
257259
SDB_API ut64 sdb_num_dec(Sdb* s, const char *key, ut64 n, ut32 cas);

src/num.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ SDB_API int sdb_num_set(Sdb *s, const char *key, ut64 v, ut32 cas) {
3838
return sdb_set (s, key, val, cas);
3939
}
4040

41+
SDB_API int sdb_num_setf(Sdb *s, ut64 v, ut32 cas, const char *fmt, ...) {
42+
va_list ap;
43+
char key[SDB_MAX_KEY];
44+
char val[SDB_NUM_BUFSZ];
45+
int len, numbase;
46+
47+
va_start (ap, fmt);
48+
len = vsnprintf (key, sizeof (key), fmt, ap);
49+
va_end (ap);
50+
if (len < 0 || len >= (int)sizeof (key)) {
51+
return 0;
52+
}
53+
numbase = sdb_num_base (sdb_const_get (s, key, NULL));
54+
return sdb_set (s, key, sdb_itoa (v, numbase, val, sizeof (val)), cas);
55+
}
56+
4157
SDB_API ut64 sdb_num_inc(Sdb *s, const char *key, ut64 n2, ut32 cas) {
4258
ut32 c;
4359
ut64 n = sdb_num_get (s, key, &c);

src/sdb.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,16 @@ SDB_API int sdb_set(Sdb* s, const char *key, const char *val, ut32 cas) {
775775
return sdb_set_internal (s, key, (char *)val, false, cas);
776776
}
777777

778+
SDB_API int sdb_setf(Sdb *s, const char *val, ut32 cas, const char *fmt, ...) {
779+
va_list ap;
780+
char key[SDB_MAX_KEY];
781+
int len;
782+
va_start (ap, fmt);
783+
len = vsnprintf (key, sizeof (key), fmt, ap);
784+
va_end (ap);
785+
return len >= 0 && len < (int)sizeof (key)? sdb_set (s, key, val, cas): 0;
786+
}
787+
778788
SDB_API int sdb_nset(Sdb* s, ut64 nkey, const char *val, ut32 cas) {
779789
char buf[SDB_NUM_BUFSZ];
780790
const char *key = sdb_itoa (nkey, 16, buf, sizeof (buf));

test/unit/test_getf.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ static bool test_getf(void) {
55
Sdb *db = sdb_new0 ();
66
mu_assert_notnull (db, "database");
77
mu_assert ("set", sdb_set (db, "user.alice.42", "admin", 0));
8+
mu_assert ("formatted set", sdb_setf (db, "staff", 0, "group.%s.%d", "alice", 42));
9+
mu_assert_streq (sdb_const_get (db, "group.alice.42", NULL), "staff", "formatted set value");
10+
mu_assert ("formatted number set", sdb_num_setf (db, 42, 0, "number.%s", "answer"));
11+
mu_assert_eq (sdb_num_get (db, "number.answer", NULL), 42, "formatted number set value");
812

913
ut32 const_cas = 0;
1014
const char *const_value = sdb_const_getf (db, &const_cas,

0 commit comments

Comments
 (0)