1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /* This file is dedicated to the public domain. */
- {.desc = "the KeyValues parser"};
- // undef conflicting macros
- #undef ERROR // windows.h
- #undef OUT // "
- #undef EOF // stdio.h
- #include "../src/kv.c"
- #include "../src/intdefs.h"
- #include "../src/noreturn.h"
- static noreturn die(const struct kv_parser *kvp) {
- fprintf(stderr, "parse error: %d:%d: %s\n", kvp->line, kvp->col,
- kvp->errmsg);
- exit(1);
- }
- static void tokcb(enum kv_token type, const char *p, uint len,
- void *ctxt) {
- // nop - we're just testing the tokeniser
- }
- static const char data[] =
- "KeyValues {\n\
- Key/1 Val1![conditional]\n\
- Key2\n\
- Val2// comment\n\
- \"String Key\" // also comment\n\
- Val3 Key4 [conditional!]{ Key5 \"Value Five\" } // one more\n\
- } \n\
- ";
- static const int sz = sizeof(data) - 1;
- TEST("parsing should work with any buffer size") {
- for (int chunksz = 3; chunksz <= sz; ++chunksz) {
- struct kv_parser kvp = {0};
- // sending data in chunks to test reentrancy
- for (int chunk = 0; chunk * chunksz < sz; ++chunk) {
- int thischunk = chunksz;
- if (chunk * chunksz + thischunk > sz) {
- thischunk = sz - chunk * chunksz;
- }
- if (!kv_parser_feed(&kvp, data + chunk * chunksz, thischunk,
- tokcb, 0)) {
- die(&kvp);
- }
- }
- if (!kv_parser_done(&kvp)) die(&kvp);
- }
- return true;
- }
- // vi: sw=4 ts=4 noet tw=80 cc=80
|