Convert to C api.
#include "jsonsax.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdarg.h>
#define DEBUGTEST
void debug(const char* msg, ...)
{
#ifdef DEBUGTEST
fprintf(stderr, "\n-*- ");
va_list ap;
va_start(ap, msg);
vfprintf(stderr, msg, ap);
va_end(ap);
fprintf(stderr, " -*-\n");
#else
(void)msg;
#endif
}
const char* TEST_JSONTYPE_STR[] = {
"EJSONSAX_OBJECT",
"EJSONSAX_ARRAY",
"EJSONSAX_STRING",
"EJSONSAX_NUMBER",
"EJSONSAX_NULL",
"EJSONSAX_TRUE",
"EJSONSAX_FALSE"
};
struct test_data
{
const char* m_str;
};
int test_getchar(void* data)
{
assert(data);
struct test_data* t = (struct test_data*)(data);
if (t->m_str[0] == 0) return -1;
#ifdef DEBUGTEST
char c = t->m_str[0];
fprintf(stderr, "%c", c == ' ' ? '_' : c);
#endif
return *(t->m_str++);
}
int test_on_start(void* data, enum EJSONSAX_TYPE etype)
{
assert(data);
struct test_data* t = (struct test_data*)(data);
debug("start %s", TEST_JSONTYPE_STR[etype]);
switch (etype)
{
case EJSONSAX_OBJECT:
assert(t->m_str[-1] == '{');
break;
case EJSONSAX_ARRAY:
assert(t->m_str[-1] == '[');
break;
case EJSONSAX_STRING:
assert(t->m_str[-1] == '"');
break;
case EJSONSAX_NUMBER:
break;
case EJSONSAX_NULL:
case EJSONSAX_TRUE:
case EJSONSAX_FALSE:
assert(0);
}
return 0;
}
int test_on_stop(void* data, enum EJSONSAX_TYPE etype)
{
assert(data);
struct test_data* t = (struct test_data*)(data);
debug("stop %s", TEST_JSONTYPE_STR[etype]);
switch (etype)
{
case EJSONSAX_OBJECT:
assert(t->m_str[-1] == '}');
break;
case EJSONSAX_ARRAY:
assert(t->m_str[-1] == ']');
break;
case EJSONSAX_STRING:
assert(t->m_str[-1] == '"');
break;
case EJSONSAX_NUMBER:
case EJSONSAX_NULL:
case EJSONSAX_TRUE:
case EJSONSAX_FALSE:
break;
}
return 0;
}
void test_on_error(void* data, int error)
{
assert(data);
debug("Error %d", error);
}
int main()
{
const char json[] =
"{ \"hello\" : [ 11, 12 ,1"
"3 ], \n \"world\" : -3.45e2 }";
struct test_data data;
data.m_str = json;
struct jsonsax_backend tester;
memset(&tester, 0, sizeof(tester));
tester.m_getchar = &test_getchar;
tester.m_onstart = &test_on_start;
tester.m_onstop = &test_on_stop;
int err = jsonsax_parse(&tester, &data);
assert(err == 0);
return err;
};