mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -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