jsonsax.c
author Fabien Ninoles <fabien@tzone.org>
Sun, 07 Oct 2012 14:30:52 -0400
changeset 1 ef7abb48573b
parent 0 jsonsax.cpp@d187e7fc9970
permissions -rw-r--r--
Convert to C api.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     1
/*
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     2
Copyright (c) Fabien Ninoles <fabien@tzone.org>
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     3
All rights reserved.
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     4
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     5
Redistribution and use in source and binary forms, with or without
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     6
modification, are permitted provided that the following conditions
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     7
are met:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     8
1. Redistributions of source code must retain the above copyright
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     9
   notice, this list of conditions and the following disclaimer.
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    10
2. Redistributions in binary form must reproduce the above copyright
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    11
   notice, this list of conditions and the following disclaimer in the
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    12
   documentation and/or other materials provided with the distribution.
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    13
3. Neither the name of the University nor the names of its contributors
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    14
   may be used to endorse or promote products derived from this software
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    15
   without specific prior written permission.
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    16
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    17
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    18
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    19
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    20
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    21
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    22
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    23
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    24
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    25
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    26
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    27
SUCH DAMAGE.
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    28
*/
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    29
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    30
#include "jsonsax.h"
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    31
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    32
#include <assert.h>
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    34
#define CASE_IS_SPACE   \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    35
    case ' ':           \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    36
case '\n':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    37
case '\t':              \
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
case '\r'
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    39
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    40
#define CASE_IS_DIGIT  \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    41
    case '0':          \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    42
case '1':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    43
case '2':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    44
case '3':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    45
case '4':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    46
case '5':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    47
case '6':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    48
case '7':              \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    49
case '8':              \
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
case '9'
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    51
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    52
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    53
struct _jsonsax_state
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    54
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    55
  struct jsonsax_backend  m_backend;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    56
  char                    m_lastchar;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    57
  void*                   m_data;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    58
};
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    59
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    60
#define JSONSAX_GETCHAR(state) \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    61
  (state)->m_backend.m_getchar((state)->m_data)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    62
#define JSONSAX_ONERROR(state, err) \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    63
  (state)->m_backend.m_onerror((state)->m_data, err)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    64
#define JSONSAX_ONSTART(state,type) \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    65
  (state)->m_backend.m_onstart((state)->m_data, type)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    66
#define JSONSAX_ONSTOP(state,type) \
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    67
  (state)->m_backend.m_onstop((state)->m_data, type)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    68
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    69
static int jsonsax_parsevalue(struct _jsonsax_state* state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    70
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    71
static int _jsonsax_getc(struct _jsonsax_state* state)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    72
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    73
  int c = JSONSAX_GETCHAR(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    74
  if (c > 0)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    75
  {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    76
    state->m_lastchar = c;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    77
    return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    78
  };
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    79
  return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    80
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    81
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    82
static int _jsonsax_trim(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    84
  do
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    85
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    86
      switch(state->m_lastchar)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    87
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    88
        CASE_IS_SPACE:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    89
          break;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    90
        default:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    91
          return 0;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    92
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    93
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    94
  while(_jsonsax_getc(state) == 0);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    95
  return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    96
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    97
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    98
static int jsonsax_getc(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    99
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   100
  int err = _jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   101
  if (err == 0)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   102
  {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   103
    return _jsonsax_trim(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   104
  }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   105
  return err;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   106
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   107
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   108
int jsonsax_parsearray(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   110
    assert(state->m_lastchar == '[');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   111
    int err = jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   112
    if (err != 0) return err;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   113
    while(jsonsax_parsevalue(state))
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   114
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   115
        switch(state->m_lastchar)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   116
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   117
        case ',':
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   118
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   119
          break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   120
        case ']':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   121
          JSONSAX_ONSTOP(state, EJSONSAX_ARRAY);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   122
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   123
          return 0;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   124
        default:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   125
          JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   126
          return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   127
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   128
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   129
    if (state->m_lastchar != ']')
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   130
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   131
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   132
      return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   133
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   134
    JSONSAX_ONSTOP(state, EJSONSAX_ARRAY);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   135
    jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   136
    return 0;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   137
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   138
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   139
int jsonsax_parsestring(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   140
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   141
    assert(state->m_lastchar == '"');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   142
    JSONSAX_ONSTART(state, EJSONSAX_STRING);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   143
    while(jsonsax_getc(state) == 0)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   144
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   145
        switch(state->m_lastchar)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   146
        {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   147
        case '\\':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   148
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   149
          break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   150
        case '"':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   151
          JSONSAX_ONSTOP(state, EJSONSAX_STRING);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   152
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   153
          return 0;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   154
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   155
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   156
    return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   157
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   158
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   159
int jsonsax_parsenumber(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   160
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   161
    assert(state->m_lastchar == '-' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   162
           state->m_lastchar == '0' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   163
           state->m_lastchar == '1' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   164
           state->m_lastchar == '2' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   165
           state->m_lastchar == '3' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   166
           state->m_lastchar == '4' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   167
           state->m_lastchar == '5' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   168
           state->m_lastchar == '6' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   169
           state->m_lastchar == '7' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   170
           state->m_lastchar == '8' ||
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   171
           state->m_lastchar == '9');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   172
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   173
    JSONSAX_ONSTART(state, EJSONSAX_NUMBER);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   174
    while(jsonsax_getc(state) == 0)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   175
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   176
        switch(state->m_lastchar)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   177
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   178
            // TODO: lookup for correct number format.
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   179
        case 'e':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   180
        case '-':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   181
        case '.':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   182
        CASE_IS_DIGIT:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   183
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   184
        default:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   185
          JSONSAX_ONSTOP(state, EJSONSAX_NUMBER);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   186
          return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   187
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   188
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   189
    return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   190
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   191
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   192
int jsonsax_parseconstant(struct _jsonsax_state* state,
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   193
                          const char* constant,
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   194
                          enum EJSONSAX_TYPE etype)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   195
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   196
    assert(state->m_lastchar == constant[0]);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   197
    ++constant;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   198
    while(jsonsax_getc(state) == 0)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   199
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   200
      if (*constant == '\0') break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   201
      if (*constant != state->m_lastchar) break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   202
      constant++;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   203
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   204
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   205
    if (*constant == '\0')
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   206
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   207
      JSONSAX_ONSTOP(state, etype);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   208
      return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   209
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   210
    else
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   211
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   212
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   213
      return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   214
    }
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   215
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   216
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   217
int jsonsax_parsenull(struct _jsonsax_state* state)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   218
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   219
  return jsonsax_parseconstant(state, "null", EJSONSAX_NULL);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   220
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   221
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   222
int jsonsax_parsetrue(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   223
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   224
  return jsonsax_parseconstant(state, "true", EJSONSAX_TRUE);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   225
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   226
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   227
int jsonsax_parsefalse(struct _jsonsax_state* state)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   228
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   229
  return jsonsax_parseconstant(state, "false", EJSONSAX_FALSE);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   230
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   231
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   232
int jsonsax_parsepair(struct _jsonsax_state* state)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   233
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   234
    if (state->m_lastchar != '"')
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   235
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   236
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   237
      return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   238
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   239
    if (jsonsax_parsestring(state) != 0)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   240
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   241
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   242
      return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   243
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   244
    if (state->m_lastchar != ':')
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   245
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   246
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   247
      return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   248
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   249
    if (jsonsax_getc(state) != 0)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   250
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   251
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   252
      return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   253
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   254
    return jsonsax_parsevalue(state);
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   255
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   256
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   257
static int jsonsax_parseobject(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   258
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   259
    assert(state->m_lastchar == '{');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   260
    JSONSAX_ONSTART(state, EJSONSAX_OBJECT);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   261
    jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   262
    while(jsonsax_parsepair(state) == 0)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   263
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   264
        switch(state->m_lastchar)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   265
        {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   266
        case ',':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   267
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   268
          break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   269
        case '}':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   270
          JSONSAX_ONSTOP(state, EJSONSAX_OBJECT);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   271
          jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   272
          return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   273
        default:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   274
          JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   275
          return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   276
        }
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   277
    }
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   278
    if (state->m_lastchar != '}')
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   279
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   280
      JSONSAX_ONERROR(state, -1);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   281
      return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   282
    }
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   283
    JSONSAX_ONSTOP(state, EJSONSAX_OBJECT);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   284
    jsonsax_getc(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   285
    return 0;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   286
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   287
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   288
static int jsonsax_parsevalue(struct _jsonsax_state* state)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   289
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   290
    switch(state->m_lastchar)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   291
    {
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   292
    case '[':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   293
        return jsonsax_parsearray(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   294
    case '{':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   295
        return jsonsax_parseobject(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   296
    case '"':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   297
        return jsonsax_parsestring(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   298
    case '-':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   299
    CASE_IS_DIGIT:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   300
        return jsonsax_parsenumber(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   301
    case 'n':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   302
        return jsonsax_parsenull(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   303
    case 't':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   304
        return jsonsax_parsetrue(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   305
    case 'f':
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   306
        return jsonsax_parsefalse(state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   307
    default:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   308
        return -1;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   309
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   310
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   311
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   312
static int default_onevent(void* data, enum EJSONSAX_TYPE type)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   313
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   314
  return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   315
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   316
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   317
static void default_onerror(void* data, int error)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   318
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   319
  (void)data;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   320
  (void)error;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   321
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   322
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   323
int jsonsax_parse(struct jsonsax_backend* backend, void* data)
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   324
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   325
  assert(backend != 0);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   326
  assert(backend->m_getchar != 0);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   327
  struct _jsonsax_state state;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   328
  state.m_backend.m_getchar = backend->m_getchar;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   329
  state.m_backend.m_onstart = backend->m_onstart ? backend->m_onstart : default_onevent;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   330
  state.m_backend.m_onstop  = backend->m_onstop  ? backend->m_onstop  : default_onevent;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   331
  state.m_backend.m_onerror = backend->m_onerror ? backend->m_onerror : default_onerror;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   332
  state.m_data = data;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   333
  state.m_lastchar = '\0';
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   334
  int err = jsonsax_getc(&state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   335
  if (err != 0) return err;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   336
  err = jsonsax_parsevalue(&state);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   337
  return err;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   338
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   339
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   340
#undef CASE_IS_DIGIT
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   341
#undef CASE_IS_SPACE