mirror of
https://github.com/DaveGamble/cJSON.git
synced 2024-12-28 06:30:52 +08:00
parse_value: Check only first character at first
This should improve performance
This commit is contained in:
parent
a2ede77ee0
commit
4e9154458d
108
cJSON.c
108
cJSON.c
@ -1214,51 +1214,75 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf
|
|||||||
return false; /* no input */
|
return false; /* no input */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse the different types of values */
|
if (!can_read(input_buffer, 1))
|
||||||
/* null */
|
|
||||||
if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0))
|
|
||||||
{
|
{
|
||||||
item->type = cJSON_NULL;
|
return false;
|
||||||
input_buffer->offset += 4;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
/* false */
|
|
||||||
if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0))
|
|
||||||
{
|
|
||||||
item->type = cJSON_False;
|
|
||||||
input_buffer->offset += 5;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
/* true */
|
|
||||||
if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0))
|
|
||||||
{
|
|
||||||
item->type = cJSON_True;
|
|
||||||
item->valueint = 1;
|
|
||||||
input_buffer->offset += 4;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
/* string */
|
|
||||||
if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"'))
|
|
||||||
{
|
|
||||||
return parse_string(item, input_buffer);
|
|
||||||
}
|
|
||||||
/* number */
|
|
||||||
if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9'))))
|
|
||||||
{
|
|
||||||
return parse_number(item, input_buffer);
|
|
||||||
}
|
|
||||||
/* array */
|
|
||||||
if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '['))
|
|
||||||
{
|
|
||||||
return parse_array(item, input_buffer);
|
|
||||||
}
|
|
||||||
/* object */
|
|
||||||
if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{'))
|
|
||||||
{
|
|
||||||
return parse_object(item, input_buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
/* parse the different types of values */
|
||||||
|
switch (buffer_at_offset(input_buffer)[0])
|
||||||
|
{
|
||||||
|
/* number */
|
||||||
|
case '-':
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
return parse_number(item, input_buffer);
|
||||||
|
|
||||||
|
/* string */
|
||||||
|
case '\"':
|
||||||
|
return parse_string(item, input_buffer);
|
||||||
|
|
||||||
|
/* array */
|
||||||
|
case '[':
|
||||||
|
return parse_array(item, input_buffer);
|
||||||
|
|
||||||
|
/* object */
|
||||||
|
case '{':
|
||||||
|
return parse_object(item, input_buffer);
|
||||||
|
|
||||||
|
/* null */
|
||||||
|
case 'n':
|
||||||
|
if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0))
|
||||||
|
{
|
||||||
|
item->type = cJSON_NULL;
|
||||||
|
input_buffer->offset += 4;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* true */
|
||||||
|
case 't':
|
||||||
|
if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0))
|
||||||
|
{
|
||||||
|
item->type = cJSON_True;
|
||||||
|
item->valueint = 1;
|
||||||
|
input_buffer->offset += 4;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* false */
|
||||||
|
case 'f':
|
||||||
|
if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0))
|
||||||
|
{
|
||||||
|
item->type = cJSON_False;
|
||||||
|
input_buffer->offset += 5;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Render a value to text. */
|
/* Render a value to text. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user