#include "util.h"
#include "solv_jsonparser.h"
-struct solv_jsonparser *
+void
jsonparser_init(struct solv_jsonparser *jp, FILE *fp)
{
memset(jp, 0, sizeof(*jp));
jp->line = jp->nextline = 1;
jp->nextc = ' ';
queue_init(&jp->stateq);
- return jp;
}
-struct solv_jsonparser *
+void
jsonparser_free(struct solv_jsonparser *jp)
{
+ solv_free(jp->space);
queue_free(&jp->stateq);
- return 0;
}
static void
skipspace(struct solv_jsonparser *jp)
{
int c = jp->nextc;
+ jp->nextc = ' ';
while (c == ' ' || c == '\t' || c == '\r' || c == '\n')
c = nextc(jp);
jp->line = jp->nextline;
- return (jp->nextc = c);
+ return c;
}
static int
-parseliteral(struct solv_jsonparser *jp)
+parseliteral(struct solv_jsonparser *jp, int c)
{
size_t nspace = jp->nspace;
- int c;
- savec(jp, jp->nextc);
+ savec(jp, c);
for (;;)
{
c = nextc(jp);
}
static int
-parsenumber(struct solv_jsonparser *jp)
+parsenumber(struct solv_jsonparser *jp, int c)
{
- int c;
- savec(jp, jp->nextc);
+ savec(jp, c);
for (;;)
{
c = nextc(jp);
}
savec(jp, c);
}
- jp->nextc = ' ';
savec(jp, 0);
return JP_STRING;
}
if (c == '"')
return parsestring(jp);
if ((c >= '0' && c <= '9') || c == '+' || c == '-' || c == '.')
- return parsenumber(jp);
+ return parsenumber(jp, c);
if ((c >= 'a' && c <= 'z'))
- return parseliteral(jp);
- jp->nextc = ' ';
+ return parseliteral(jp, c);
if (c == '[')
return JP_ARRAY;
if (c == '{')
return JP_ERROR;
if (skipspace(jp) != ':')
return JP_ERROR;
- jp->nextc = ' ';
type = parsevalue(jp);
if (type == JP_OBJECT_END || type == JP_ARRAY_END)
return JP_ERROR;
jp->value = jp->space + nspace;
jp->valuelen = jp->nspace - nspace - 1;
}
- if (type == JP_ARRAY || type == JP_OBJECT)
+ if (type == JP_OBJECT || type == JP_ARRAY)
{
queue_push(&jp->stateq, jp->state);
jp->state = type;
else if (jp->state == JP_OBJECT || jp->state == JP_ARRAY)
{
int c = skipspace(jp);
- if (c == ',')
- jp->nextc = ' ';
- else if (c != (jp->state == JP_OBJECT ? '}' : ']'))
+ if (c == (jp->state == JP_OBJECT ? '}' : ']'))
+ jp->nextc = c;
+ else if (c != ',')
return JP_ERROR;
}
return type;