This commit is contained in:
Troy D. Hanson
2015-08-25 18:39:20 -04:00
parent 510da4f2c4
commit ab5a8e4596
7 changed files with 56 additions and 70 deletions

View File

@@ -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
View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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);