mirror of
https://github.com/JHUAPL/kvspool.git
synced 2026-01-09 15:37:56 -05:00
qk
This commit is contained in:
14
qk/README.md
14
qk/README.md
@@ -2,11 +2,11 @@ quick key (qk)
|
||||
--------------
|
||||
|
||||
This is a mini-kvspool that lets the application determine what to do with each
|
||||
key-value dictionary that is produced. First create one:
|
||||
key set that is produced. First create one:
|
||||
|
||||
struct qk *qk = qk_new();
|
||||
|
||||
Set up a callback to be invoked whenever you "end" a dictionary:
|
||||
Set up a callback to be invoked whenever you "end" a key set:
|
||||
|
||||
qk->cb = your_callback;
|
||||
|
||||
@@ -15,16 +15,16 @@ The callback has this prototype:
|
||||
int (*cb)(struct qk *);
|
||||
|
||||
The callback can use `qk->tmp` (a `UT_string`) as a scratch buffer. It can
|
||||
iterate over `qk->keys` and `qk->vals` (both of type `UT_vector` whose elements
|
||||
are `UT_string`). Use this sequence to produce a dictionary:
|
||||
iterate over `qk->keys` (of type `UT_vector` whose elements are `UT_string`).
|
||||
Use this sequence to produce a key set:
|
||||
|
||||
qk_start(qk);
|
||||
qk_add(qk, key, val, ...);
|
||||
qk_add(qk, key, ...);
|
||||
...
|
||||
qk_end(qk);
|
||||
|
||||
Call `qk_add` multiple times to add several key-value pairs to the dictionary.
|
||||
Note `val` is a printf-style format string that can take additional arguments.
|
||||
Call `qk_add` multiple times to add several keys to the key set.
|
||||
Note `key` is a printf-style format string that can take additional arguments.
|
||||
At program termination do this:
|
||||
|
||||
qk_free(qk);
|
||||
|
||||
11
qk/qk.c
11
qk/qk.c
@@ -41,7 +41,6 @@ struct qk *qk_new(void) {
|
||||
if (qk == NULL) goto done;
|
||||
memset(qk,0,sizeof(*qk));
|
||||
utvector_init(&qk->keys, &utvector_utstring_mm);
|
||||
utvector_init(&qk->vals, &utvector_utstring_mm);
|
||||
utstring_init(&qk->tmp);
|
||||
done:
|
||||
return qk;
|
||||
@@ -49,7 +48,6 @@ struct qk *qk_new(void) {
|
||||
|
||||
int qk_start(struct qk *qk) {
|
||||
utvector_clear(&qk->keys);
|
||||
utvector_clear(&qk->vals);
|
||||
utstring_clear(&qk->tmp);
|
||||
}
|
||||
|
||||
@@ -58,19 +56,16 @@ int qk_end(struct qk *qk) {
|
||||
return qk->cb(qk);
|
||||
}
|
||||
|
||||
int qk_add(struct qk *qk, char *key, char *vfmt, ...) {
|
||||
int qk_add(struct qk *qk, char *key, ...) {
|
||||
va_list ap;
|
||||
va_start(ap,vfmt);
|
||||
va_start(ap,key);
|
||||
UT_string *k = (UT_string*)utvector_extend(&qk->keys);
|
||||
UT_string *v = (UT_string*)utvector_extend(&qk->vals);
|
||||
utstring_bincpy(k,key,strlen(key));
|
||||
utstring_printf_va(v,vfmt,ap);
|
||||
utstring_printf_va(k,key,ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void qk_free(struct qk *qk) {
|
||||
utvector_fini(&qk->keys);
|
||||
utvector_fini(&qk->vals);
|
||||
utstring_done(&qk->tmp);
|
||||
free(qk);
|
||||
}
|
||||
|
||||
3
qk/qk.h
3
qk/qk.h
@@ -6,7 +6,6 @@
|
||||
|
||||
struct qk {
|
||||
UT_vector /* of UT_string */ keys;
|
||||
UT_vector /* of UT_string */ vals;
|
||||
|
||||
/* the callback below is invoked on qk_end. it receives this struct.
|
||||
* the tmp is reserved for the callback to use a scratch space. the
|
||||
@@ -20,7 +19,7 @@ struct qk {
|
||||
/* API */
|
||||
struct qk *qk_new(void);
|
||||
int qk_start(struct qk *qk);
|
||||
int qk_add(struct qk *qk, char *key, char *val, ...);
|
||||
int qk_add(struct qk *qk, char *key, ...);
|
||||
int qk_end(struct qk *qk);
|
||||
void qk_free(struct qk *qk);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
qk_end: 5 kv pairs
|
||||
A -> 1
|
||||
B -> 2a
|
||||
C -> 3b
|
||||
D -> IV
|
||||
E -> 5
|
||||
qk_end: 5 keys
|
||||
A:1
|
||||
B:2a
|
||||
C:3b
|
||||
D:IV
|
||||
E:5
|
||||
|
||||
@@ -4,23 +4,19 @@
|
||||
#include "qk.h"
|
||||
|
||||
int dump(struct qk *qk) {
|
||||
size_t l = utvector_len(&qk->vals);
|
||||
size_t l = utvector_len(&qk->keys);
|
||||
|
||||
utstring_printf(&qk->tmp, "qk_end: %lu kv pairs\n", l);
|
||||
utstring_clear(&qk->tmp);
|
||||
utstring_printf(&qk->tmp, "qk_end: %lu keys\n", l);
|
||||
|
||||
UT_string *k=NULL, *v=NULL;
|
||||
UT_string *k=NULL;
|
||||
while(l--) {
|
||||
k = (UT_string*)utvector_next(&qk->keys,k);
|
||||
v = (UT_string*)utvector_next(&qk->vals,v);
|
||||
assert(k); assert(v);
|
||||
utstring_printf(&qk->tmp, "%s -> %s\n",
|
||||
utstring_body(k), utstring_body(v));
|
||||
k = (UT_string*)utvector_next(&qk->keys,k); assert(k);
|
||||
utstring_printf(&qk->tmp, "%s\n", utstring_body(k));
|
||||
}
|
||||
|
||||
char *out = utstring_body(&qk->tmp);
|
||||
size_t len = utstring_len(&qk->tmp);
|
||||
size_t len =utstring_len( &qk->tmp);
|
||||
write(STDOUT_FILENO, out, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -30,11 +26,11 @@ int main() {
|
||||
qk->cb = dump;
|
||||
|
||||
qk_start(qk);
|
||||
qk_add(qk, "A", "%d", 1);
|
||||
qk_add(qk, "B", "%d%c", 2, 'a');
|
||||
qk_add(qk, "C", "%d%c", 3, 'b');
|
||||
qk_add(qk, "D", "%s", "IV");
|
||||
qk_add(qk, "E", "%lu", (long)5);
|
||||
qk_add(qk, "A:%d", 1);
|
||||
qk_add(qk, "B:%d%c", 2, 'a');
|
||||
qk_add(qk, "C:%d%c", 3, 'b');
|
||||
qk_add(qk, "D:%s", "IV");
|
||||
qk_add(qk, "E:%lu", (long)5);
|
||||
qk_end(qk);
|
||||
|
||||
qk_free(qk);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
qk_end: 5 kv pairs
|
||||
a -> 1
|
||||
b -> 2a
|
||||
c -> 3b
|
||||
d -> IV
|
||||
e -> IV
|
||||
qk_end: 4 kv pairs
|
||||
A -> 1
|
||||
B -> 2a
|
||||
C -> 3b
|
||||
D -> IV
|
||||
qk_end: 5 keys
|
||||
A:1
|
||||
B:2a
|
||||
C:3b
|
||||
D:IV
|
||||
E:5
|
||||
qk_end: 4 keys
|
||||
A:1
|
||||
B:2a
|
||||
C:3b
|
||||
D:IV
|
||||
|
||||
@@ -4,23 +4,19 @@
|
||||
#include "qk.h"
|
||||
|
||||
int dump(struct qk *qk) {
|
||||
size_t l = utvector_len(&qk->vals);
|
||||
size_t l = utvector_len(&qk->keys);
|
||||
|
||||
utstring_printf(&qk->tmp, "qk_end: %lu kv pairs\n", l);
|
||||
utstring_clear(&qk->tmp);
|
||||
utstring_printf(&qk->tmp, "qk_end: %lu keys\n", l);
|
||||
|
||||
UT_string *k=NULL, *v=NULL;
|
||||
UT_string *k=NULL;
|
||||
while(l--) {
|
||||
k = (UT_string*)utvector_next(&qk->keys,k);
|
||||
v = (UT_string*)utvector_next(&qk->vals,v);
|
||||
assert(k); assert(v);
|
||||
utstring_printf(&qk->tmp, "%s -> %s\n",
|
||||
utstring_body(k), utstring_body(v));
|
||||
k = (UT_string*)utvector_next(&qk->keys,k); assert(k);
|
||||
utstring_printf(&qk->tmp, "%s\n", utstring_body(k));
|
||||
}
|
||||
|
||||
char *out = utstring_body(&qk->tmp);
|
||||
size_t len = utstring_len(&qk->tmp);
|
||||
size_t len =utstring_len( &qk->tmp);
|
||||
write(STDOUT_FILENO, out, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -30,18 +26,18 @@ int main() {
|
||||
qk->cb = dump;
|
||||
|
||||
qk_start(qk);
|
||||
qk_add(qk, "a", "%d", 1);
|
||||
qk_add(qk, "b", "%d%c", 2, 'a');
|
||||
qk_add(qk, "c", "%d%c", 3, 'b');
|
||||
qk_add(qk, "d", "%s", "IV");
|
||||
qk_add(qk, "e", "%s", "IV");
|
||||
qk_add(qk, "A:%d", 1);
|
||||
qk_add(qk, "B:%d%c", 2, 'a');
|
||||
qk_add(qk, "C:%d%c", 3, 'b');
|
||||
qk_add(qk, "D:%s", "IV");
|
||||
qk_add(qk, "E:%lu", (long)5);
|
||||
qk_end(qk);
|
||||
|
||||
qk_start(qk);
|
||||
qk_add(qk, "A", "%d", 1);
|
||||
qk_add(qk, "B", "%d%c", 2, 'a');
|
||||
qk_add(qk, "C", "%d%c", 3, 'b');
|
||||
qk_add(qk, "D", "%s", "IV");
|
||||
qk_add(qk, "A:%d", 1);
|
||||
qk_add(qk, "B:%d%c", 2, 'a');
|
||||
qk_add(qk, "C:%d%c", 3, 'b');
|
||||
qk_add(qk, "D:%s", "IV");
|
||||
qk_end(qk);
|
||||
|
||||
qk_free(qk);
|
||||
|
||||
Reference in New Issue
Block a user