improved decimal handling in lib/json.c
This commit is contained in:
		@ -330,17 +330,51 @@ static int handle_string_value_char (mio_json_t* json, mio_ooci_t c)
 | 
			
		||||
 | 
			
		||||
static int handle_numeric_value_char (mio_json_t* json, mio_ooci_t c)
 | 
			
		||||
{
 | 
			
		||||
	if (mio_is_ooch_digit(c) || (json->tok.len == 0 && (c == '+' || c == '-')))
 | 
			
		||||
	switch (json->state_stack->u.nv.progress)
 | 
			
		||||
	{
 | 
			
		||||
		if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!json->state_stack->u.nv.dotted && c == '.' &&
 | 
			
		||||
	         json->tok.len > 0 && mio_is_ooch_digit(json->tok.ptr[json->tok.len - 1]))
 | 
			
		||||
	{
 | 
			
		||||
		if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
		json->state_stack->u.nv.dotted = 1;
 | 
			
		||||
		return 1;
 | 
			
		||||
		case 0: /* integer part */
 | 
			
		||||
			if (mio_is_ooch_digit(c) || (json->tok.len == 0 && (c == '+' || c == '-')))
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			else if ((c == '.' || c == 'e' || c == 'E') && json->tok.len > 0 && mio_is_ooch_digit(json->tok.ptr[json->tok.len - 1]))
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				json->state_stack->u.nv.progress = (c == '.'? 1: 2);
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 1: /* decimal part */
 | 
			
		||||
			if (mio_is_ooch_digit(c))
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			else if (c == 'e' || c == 'E')
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				json->state_stack->u.nv.progress = 2;
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 2: /* exponent part (ok to have a sign) */
 | 
			
		||||
			if (c == '+' || c == '-')
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				json->state_stack->u.nv.progress = 3;
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			/* fall thru */
 | 
			
		||||
		case 3: /* exponent part (no sign expected) */
 | 
			
		||||
			if (mio_is_ooch_digit(c))
 | 
			
		||||
			{
 | 
			
		||||
				if (add_char_to_token(json, c, 0) <= -1) return -1;
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pop_read_state (json);
 | 
			
		||||
@ -453,7 +487,7 @@ static int handle_char_in_array (mio_json_t* json, mio_ooci_t c)
 | 
			
		||||
		{
 | 
			
		||||
			if (push_read_state(json, MIO_JSON_STATE_IN_NUMERIC_VALUE) <= -1) return -1;
 | 
			
		||||
			clear_token (json);
 | 
			
		||||
			json->state_stack->u.nv.dotted = 0;
 | 
			
		||||
			json->state_stack->u.nv.progress = 0;
 | 
			
		||||
			return 0; /* start over */
 | 
			
		||||
		}
 | 
			
		||||
		else if (mio_is_ooch_alpha(c))
 | 
			
		||||
@ -539,7 +573,7 @@ static int handle_char_in_object (mio_json_t* json, mio_ooci_t c)
 | 
			
		||||
		{
 | 
			
		||||
			if (push_read_state(json, MIO_JSON_STATE_IN_NUMERIC_VALUE) <= -1) return -1;
 | 
			
		||||
			clear_token (json);
 | 
			
		||||
			json->state_stack->u.nv.dotted = 0;
 | 
			
		||||
			json->state_stack->u.nv.progress = 0;
 | 
			
		||||
			return 0; /* start over */
 | 
			
		||||
		}
 | 
			
		||||
		else if (mio_is_ooch_alpha(c))
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ struct mio_json_state_node_t
 | 
			
		||||
		} cv;
 | 
			
		||||
		struct
 | 
			
		||||
		{
 | 
			
		||||
			int dotted;
 | 
			
		||||
			int progress;
 | 
			
		||||
		} nv;
 | 
			
		||||
	} u;
 | 
			
		||||
	mio_json_state_node_t* next;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user