mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	media-session: fix parsing of booleans and null
Reorder the json file a bit
This commit is contained in:
		
							parent
							
								
									77b8959df5
								
							
						
					
					
						commit
						1f73280c52
					
				
					 1 changed files with 53 additions and 49 deletions
				
			
		| 
						 | 
					@ -35,6 +35,7 @@ extern "C" {
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* a simple JSON compatible tokenizer */
 | 
				
			||||||
struct spa_json {
 | 
					struct spa_json {
 | 
				
			||||||
	const char *cur;
 | 
						const char *cur;
 | 
				
			||||||
	const char *end;
 | 
						const char *end;
 | 
				
			||||||
| 
						 | 
					@ -56,6 +57,8 @@ static inline void spa_json_enter(struct spa_json * iter, struct spa_json * sub)
 | 
				
			||||||
	*sub = SPA_JSON_ENTER(iter);
 | 
						*sub = SPA_JSON_ENTER(iter);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Get the next token. \a value points to the token and the return value
 | 
				
			||||||
 | 
					 * is the length. */
 | 
				
			||||||
static inline int spa_json_next(struct spa_json * iter, const char **value)
 | 
					static inline int spa_json_next(struct spa_json * iter, const char **value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int utf8_remain = 0;
 | 
						int utf8_remain = 0;
 | 
				
			||||||
| 
						 | 
					@ -166,51 +169,62 @@ static inline int spa_json_enter_container(struct spa_json *iter, struct spa_jso
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* object */
 | 
				
			||||||
 | 
					static inline int spa_json_is_object(const char *val, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return len > 0 && *val == '{';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
static inline int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub)
 | 
					static inline int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return spa_json_enter_container(iter, sub, '{');
 | 
						return spa_json_enter_container(iter, sub, '{');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* array */
 | 
				
			||||||
 | 
					static inline bool spa_json_is_array(const char *val, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return len > 0 && *val == '[';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
static inline int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub)
 | 
					static inline int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return spa_json_enter_container(iter, sub, '[');
 | 
						return spa_json_enter_container(iter, sub, '[');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int spa_json_is_object(const char *val, int len)
 | 
					/* null */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return len > 0 && *val == '{';
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline bool spa_json_is_array(const char *val, int len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return len > 0 && *val == '[';
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline bool spa_json_is_float(const char *val, int len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *end;
 | 
					 | 
				
			||||||
	strtof(val, &end);
 | 
					 | 
				
			||||||
	return end == val + len;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline bool spa_json_is_string(const char *val, int len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return len > 1 && *val == '"';
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline bool spa_json_is_null(const char *val, int len)
 | 
					static inline bool spa_json_is_null(const char *val, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return len == 4 && strcmp(val, "null") == 0;
 | 
						return len == 4 && strncmp(val, "null", 4) == 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* float */
 | 
				
			||||||
 | 
					static inline int spa_json_parse_float(const char *val, int len, float *result)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *end;
 | 
				
			||||||
 | 
						*result = strtof(val, &end);
 | 
				
			||||||
 | 
						return end == val + len;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static inline bool spa_json_is_float(const char *val, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float dummy;
 | 
				
			||||||
 | 
						return spa_json_parse_float(val, len, &dummy);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static inline int spa_json_get_float(struct spa_json *iter, float *res)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *value;
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
 | 
						if ((len = spa_json_next(iter, &value)) <= 0)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						return spa_json_parse_float(value, len, res);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* bool */
 | 
				
			||||||
static inline bool spa_json_is_true(const char *val, int len)
 | 
					static inline bool spa_json_is_true(const char *val, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return len == 4 && strcmp(val, "true") == 0;
 | 
						return len == 4 && strncmp(val, "true", 4) == 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline bool spa_json_is_false(const char *val, int len)
 | 
					static inline bool spa_json_is_false(const char *val, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return len == 5 && strcmp(val, "false") == 0;
 | 
						return len == 5 && strncmp(val, "false", 5) == 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline bool spa_json_is_bool(const char *val, int len)
 | 
					static inline bool spa_json_is_bool(const char *val, int len)
 | 
				
			||||||
| 
						 | 
					@ -218,12 +232,6 @@ static inline bool spa_json_is_bool(const char *val, int len)
 | 
				
			||||||
	return spa_json_is_true(val, len) || spa_json_is_false(val, len);
 | 
						return spa_json_is_true(val, len) || spa_json_is_false(val, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int spa_json_parse_float(const char *val, int len, float *result)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *end;
 | 
					 | 
				
			||||||
	*result = strtof(val, &end);
 | 
					 | 
				
			||||||
	return end == val + len;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static inline int spa_json_parse_bool(const char *val, int len, bool *result)
 | 
					static inline int spa_json_parse_bool(const char *val, int len, bool *result)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if ((*result = spa_json_is_true(val, len)))
 | 
						if ((*result = spa_json_is_true(val, len)))
 | 
				
			||||||
| 
						 | 
					@ -232,6 +240,20 @@ static inline int spa_json_parse_bool(const char *val, int len, bool *result)
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					static inline int spa_json_get_bool(struct spa_json *iter, bool *res)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *value;
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
 | 
						if ((len = spa_json_next(iter, &value)) <= 0)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						return spa_json_parse_bool(value, len, res);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* string */
 | 
				
			||||||
 | 
					static inline bool spa_json_is_string(const char *val, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return len > 1 && *val == '"';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int spa_json_parse_string(const char *val, int len, char *result)
 | 
					static inline int spa_json_parse_string(const char *val, int len, char *result)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -258,24 +280,6 @@ static inline int spa_json_parse_string(const char *val, int len, char *result)
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int spa_json_get_float(struct spa_json *iter, float *res)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const char *value;
 | 
					 | 
				
			||||||
	int len;
 | 
					 | 
				
			||||||
	if ((len = spa_json_next(iter, &value)) <= 0)
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	return spa_json_parse_float(value, len, res);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int spa_json_get_bool(struct spa_json *iter, bool *res)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const char *value;
 | 
					 | 
				
			||||||
	int len;
 | 
					 | 
				
			||||||
	if ((len = spa_json_next(iter, &value)) <= 0)
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	return spa_json_parse_bool(value, len, res);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int spa_json_get_string(struct spa_json *iter, char *res, int maxlen)
 | 
					static inline int spa_json_get_string(struct spa_json *iter, char *res, int maxlen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char *value;
 | 
						const char *value;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue