#include "js_parser.h"
int Js_parser_object(void **parent_data, char *buffer, int *index)
{
PJOBJECT object = NULL;
int ret = 0;
if(parent_data == NULL)
return JS_RET_FAILED;
object = (PJOBJECT)Js_mem_malloc(sizeof(JOBJECT));
Js_memset(object, 0x0, sizeof(JOBJECT));
*parent_data = object;
while(*(buffer + *index) != '\0')
{
ret = Js_parser_object_state(object, buffer, index);
if(ret != JS_RET_EXECUTE)
{
return ret;
}
}
return JS_RET_SUCCESS;
}
int Js_parser_object_state(PJOBJECT object, char *buffer, int *index)
{
int ret = 0;
char *ch = buffer + (*index);
switch(object->obj_state)
{
//开始解析json对象
/*
* (1)如果搜索到‘ ’,保持状态,字符串自增
* (2)如果搜索到‘{’,字符串自增,解析对象元素
* (3)如果搜索到其余字符,跳转到JS_PARSER_OBJ_ERR
*/
case JS_PARSER_OBJ_START:
{
if(*ch == ' ' || *ch == '\n' || *ch == '\t')
{
(*index)++;
}
else if(*ch == '{')
{
(*index)++;
ret = Js_parser_member(&(object->obj_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == '}')
{
object->obj_state = JS_PARSER_OBJ_END;
}
else
{
//解析出错
object->obj_state = JS_PARSER_OBJ_ERR;
}
}
break;
//完成解析json对象
/*
* (1)如果搜索到‘}’,字符串自增
* (2)如果搜索到其余字符,跳转到JS_PARSER_OBJ_ERR
*/
case JS_PARSER_OBJ_END:
{
if(*ch == '}')
{
(*index)++;
return JS_RET_SUCCESS;
}
else
{
object->obj_state = JS_PARSER_OBJ_ERR;
}
}
break;
//解析json对象异常
case JS_PARSER_OBJ_ERR:
{
return JS_RET_FAILED;
}
break;
}
TRACE("OBJECT---ch = %c, state = %d, obj_data = 0x%x\n", *ch, object->obj_state, &(object->obj_data));
return JS_RET_EXECUTE;
}
int Js_parser_member(void **parent_data, char *buffer, int *index)
{
PJMEMBER member = NULL;
int ret = 0;
if(parent_data == NULL)
return JS_RET_FAILED;
member = (PJMEMBER)Js_mem_malloc(sizeof(JMEMBER));
Js_memset(member, 0x0, sizeof(JMEMBER));
*parent_data = member;
while(*(buffer + *index) != '\0')
{
ret = Js_parser_member_state(member, buffer, index);
if(ret != JS_RET_EXECUTE)
{
return ret;
}
}
return JS_RET_FAILED;
}
int Js_parser_member_state(PJMEMBER member, char *buffer, int *index)
{
int ret = 0;
char *ch = buffer + (*index);
switch(member->mem_state)
{
//开始解析json元素
/*
* (1)如果搜索到‘ ’,保持状态,字符串自增
* (2)如果搜索到‘"’,保持状态,字符串自增,解析键名
* (3)如果搜索到‘,’,保持状态,字符串自增,解析下一元素键名
* (4)如果搜索到‘:’,保持状态,字符串自增,解析键值
* (5)如果搜索到‘}’,跳转到JS_PARSER_MEM_END
* (6)如果搜索到其余字符,解析键名
*/
case JS_PARSER_MEM_START:
{
if(*ch == ' ' || *ch == '\n' || *ch == '\t')
{
(*index)++;
}
else if(*ch == '\"')
{
ret = Js_parser_key(&(member->mem_key), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == ',')
{
(*index)++;
return Js_parser_member(&(member->mem_next), buffer, index);
}
else if(*ch == ':')
{
(*index)++;
ret = Js_parser_value(&(member->mem_value), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == '}')
{
member->mem_state = JS_PARSER_MEM_END;
}
else
{
//member->mem_state = JS_PARSER_MEM_ERR;
ret = Js_parser_key(&(member->mem_key), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
}
break;
//完成解析json对象
case JS_PARSER_MEM_END:
{
return JS_RET_SUCCESS;
}
break;
//解析json对象异常
case JS_PARSER_MEM_ERR:
{
return JS_RET_FAILED;
}
break;
}
TRACE("MEMBER---ch = %c, state = %d, mem_key = 0x%x, mem_value = 0x%x\n", *ch, member->mem_state, &(member->mem_key), &(member->mem_value));
return JS_RET_EXECUTE;
}
int Js_parser_key(void **parent_data, char *buffer, int *index)
{
PJKEY key = NULL;
int ret = 0;
if(parent_data == NULL)
return JS_RET_FAILED;
key = (PJKEY)Js_mem_malloc(sizeof(JKEY));
Js_memset(key, 0x0, sizeof(JKEY));
*parent_data = key;
while(*(buffer + *index) != '\0')
{
ret = Js_parser_key_state(key, buffer, index);
if(ret != JS_RET_EXECUTE)
{
return ret;
}
}
return JS_RET_FAILED;
}
int Js_parser_key_state(PJKEY key, char *buffer, int *index)
{
int ret = 0;
char *ch = buffer + (*index);
switch(key->key_state)
{
//开始解析json键名
/*
* (1)如果搜索到‘ ’,保持状态,字符串自增
* (2)如果搜索到‘"’,保持状态,设置键名类型,解析字符串
* (3)如果搜索到‘:’,跳转到JS_PARSER_KEY_END
* (4)如果搜索到其余字符,跳转到JS_PARSER_MEM_ERR
*/
case JS_PARSER_KEY_START:
{
if(*ch == ' ' || *ch == '\n' || *ch == '\t')
{
(*index)++;
}
else if(*ch == '\"')
{
key->key_type = JS_STRING;
ret = Js_parser_string(&(key->key_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == ':')
{
key->key_state = JS_PARSER_KEY_END;
}
else
{
//key->key_state = JS_PARSER_KEY_ERR;
key->key_type = JS_STRING;
ret = Js_parser_data(&(key->key_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
}
break;
//完成json键名解析
case JS_PARSER_KEY_END:
{
return JS_RET_SUCCESS;
}
break;
//解析json键名异常
case JS_PARSER_KEY_ERR:
{
return JS_RET_FAILED;
}
break;
}
TRACE("KEY---ch = %c, state = %d, key_data = 0x%x\n", *ch, key->key_state, &(key->key_data));
return JS_RET_EXECUTE;
}
int Js_parser_value(void **parent_data, char *buffer, int *index)
{
PJVALUE value = NULL;
int ret = 0;
if(parent_data == NULL)
return JS_RET_FAILED;
value = (PJVALUE)Js_mem_malloc(sizeof(JVALUE));
Js_memset(value, 0x0, sizeof(JVALUE));
*parent_data = value;
while(*(buffer + *index) != '\0')
{
ret = Js_parser_value_state(value, buffer, index);
if(ret != JS_RET_EXECUTE)
{
return ret;
}
}
return JS_RET_FAILED;
}
int Js_parser_value_state(PJVALUE value, char *buffer, int *index)
{
int ret = 0;
char *ch = buffer + (*index);
switch(value->value_state)
{
//开始解析json键值
/*
* (1)如果搜索到‘ ’,保持状态,字符串自增
* (2)如果搜索到‘{’,保持状态,设置键值类型为OBJECT,解析对象
* (3)如果搜索到‘[’,保持状态,设置键值类型为ARRAY,解析数组,字符串自增
* (4)如果搜索到‘"’,保持状态,设置键值类型为STRING,解析字符串
* (5)如果搜索到‘}’或者‘]’或者‘,’,跳转到JS_PARSER_KEY_END
* (6)如果搜索到其余字符,保持状态,设置键值类型为DATA,解析数据
*/
case JS_PARSER_VAL_START:
{
if(*ch == ' ' || *ch == '\n' || *ch == '\t')
{
(*index)++;
}
else if(*ch == '{')
{
value->value_type = JS_OBJECT;
ret = Js_parser_object(&(value->value_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == '[')
{
(*index)++;
value->value_type = JS_ARRAY;
ret = Js_parser_array(&(value->value_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == '\"')
{
value->value_type = JS_STRING;
ret = Js_parser_string(&(value->value_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
else if(*ch == ']' || *ch == '}' || *ch == ',')
{
value->value_state = JS_PARSER_VAL_END;
}
else
{
value->value_type = JS_DATA;
ret = Js_parser_data(&(value->value_data), buffer, index);
if(ret != JS_RET_FAILED)
return JS_RET_EXECUTE;
}
}
break;
//完成json键值解析
case JS_PARSER_VAL_END:
{
return JS_RET_SUCCESS;
}
break;
- 1
- 2
- 3
- 4
- 5
- 6
前往页