98 bool allocated = false; |
98 bool allocated = false; |
99 if (json->uncompleted.tokentype != CX_JSON_NO_TOKEN) { |
99 if (json->uncompleted.tokentype != CX_JSON_NO_TOKEN) { |
100 allocated = true; |
100 allocated = true; |
101 str = cx_strcat_m(json->uncompleted.content, 1, str); |
101 str = cx_strcat_m(json->uncompleted.content, 1, str); |
102 if (str.ptr == NULL) { |
102 if (str.ptr == NULL) { |
103 return (CxJsonToken){CX_JSON_NO_TOKEN, false, {0, 0}}; |
103 return (CxJsonToken){CX_JSON_NO_TOKEN, false, {NULL, 0}}; |
104 } |
104 } |
105 } |
105 } |
106 json->uncompleted = (CxJsonToken){0}; |
106 json->uncompleted = (CxJsonToken){0}; |
107 CxJsonTokenType ttype; |
107 CxJsonTokenType ttype; |
108 if (isstring) { |
108 if (isstring) { |
118 } |
118 } |
119 if (ttype == CX_JSON_TOKEN_ERROR) { |
119 if (ttype == CX_JSON_TOKEN_ERROR) { |
120 if (allocated) { |
120 if (allocated) { |
121 cx_strfree(&str); |
121 cx_strfree(&str); |
122 } |
122 } |
123 return (CxJsonToken){CX_JSON_TOKEN_ERROR, false, {0, 0}}; |
123 return (CxJsonToken){CX_JSON_TOKEN_ERROR, false, {NULL, 0}}; |
124 } |
124 } |
125 return (CxJsonToken){ttype, allocated, str}; |
125 return (CxJsonToken){ttype, allocated, str}; |
126 } |
126 } |
127 |
127 |
128 static CxJsonTokenType char2ttype(char c) { |
128 static CxJsonTokenType char2ttype(char c) { |
182 ttype = CX_JSON_TOKEN_STRING; |
182 ttype = CX_JSON_TOKEN_STRING; |
183 token_start = i; |
183 token_start = i; |
184 } else if (ctype != CX_JSON_NO_TOKEN) { |
184 } else if (ctype != CX_JSON_NO_TOKEN) { |
185 // single-char token |
185 // single-char token |
186 json->buffer.pos = i + 1; |
186 json->buffer.pos = i + 1; |
187 *result = (CxJsonToken){ctype, NULL, {0, 0}}; |
187 *result = (CxJsonToken){ctype, false, {NULL, 0}}; |
188 return CX_JSON_NO_ERROR; |
188 return CX_JSON_NO_ERROR; |
189 } else { |
189 } else { |
190 ttype = CX_JSON_TOKEN_LITERAL; // number or literal |
190 ttype = CX_JSON_TOKEN_LITERAL; // number or literal |
191 token_start = i; |
191 token_start = i; |
192 } |
192 } |