diff --git a/src/htsmsg.c b/src/htsmsg.c index 935c30b6..794b3e03 100644 --- a/src/htsmsg.c +++ b/src/htsmsg.c @@ -176,6 +176,16 @@ htsmsg_destroy(htsmsg_t *msg) free(msg); } +/* + * + */ +void +htsmsg_add_bool(htsmsg_t *msg, const char *name, int b) +{ + htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BOOL, HMF_NAME_ALLOCED); + f->hmf_bool = !!b; +} + /* * */ @@ -313,6 +323,9 @@ htsmsg_get_s64(htsmsg_t *msg, const char *name, int64_t *s64p) case HMF_S64: *s64p = f->hmf_s64; break; + case HMF_BOOL: + *s64p = f->hmf_bool; + break; case HMF_DBL: *s64p = f->hmf_dbl; break; @@ -321,6 +334,17 @@ htsmsg_get_s64(htsmsg_t *msg, const char *name, int64_t *s64p) } +/** + * + */ +int +htsmsg_get_bool_or_default(htsmsg_t *msg, const char *name, int def) +{ + int64_t s64; + return htsmsg_get_s64(msg, name, &s64) ? def : s64; +} + + /** * */ @@ -598,6 +622,10 @@ htsmsg_print0(htsmsg_t *msg, int indent) printf("S64) = %" PRId64 "\n", f->hmf_s64); break; + case HMF_BOOL: + printf("BOOL) = %s\n", f->hmf_bool ? "true" : "false"); + break; + case HMF_DBL: printf("DBL) = %f\n", f->hmf_dbl); break; @@ -644,6 +672,10 @@ htsmsg_copy_i(htsmsg_t *src, htsmsg_t *dst) htsmsg_add_s64(dst, f->hmf_name, f->hmf_s64); break; + case HMF_BOOL: + htsmsg_add_bool(dst, f->hmf_name, f->hmf_bool); + break; + case HMF_BIN: htsmsg_add_bin(dst, f->hmf_name, f->hmf_bin, f->hmf_binsize); break; diff --git a/src/htsmsg.h b/src/htsmsg.h index 82fb7fda..e2836820 100644 --- a/src/htsmsg.h +++ b/src/htsmsg.h @@ -50,6 +50,7 @@ typedef struct htsmsg { #define HMF_BIN 4 #define HMF_LIST 5 #define HMF_DBL 6 +#define HMF_BOOL 7 typedef struct htsmsg_field { TAILQ_ENTRY(htsmsg_field) hmf_link; @@ -69,6 +70,7 @@ typedef struct htsmsg_field { } bin; htsmsg_t msg; double dbl; + int bool; } u; } htsmsg_field_t; @@ -78,6 +80,7 @@ typedef struct htsmsg_field { #define hmf_bin u.bin.data #define hmf_binsize u.bin.len #define hmf_dbl u.dbl +#define hmf_bool u.bool #define htsmsg_get_map_by_field(f) \ ((f)->hmf_type == HMF_MAP ? &(f)->hmf_msg : NULL) @@ -106,6 +109,8 @@ void htsmsg_field_destroy(htsmsg_t *msg, htsmsg_field_t *f); */ void htsmsg_destroy(htsmsg_t *msg); +void htsmsg_add_bool(htsmsg_t *msg, const char *name, int b); + /** * Add an integer field where source is unsigned 32 bit. */ @@ -190,6 +195,8 @@ int htsmsg_get_s64(htsmsg_t *msg, const char *name, int64_t *s64p); */ int64_t htsmsg_get_s64_or_default(htsmsg_t *msg, const char *name, int64_t def); +int htsmsg_get_bool_or_default(htsmsg_t *msg, const char *name, int def); + /** * Get pointer to a binary field. No copying of data is performed. diff --git a/src/htsmsg_json.c b/src/htsmsg_json.c index 3fda47c1..19c85a71 100644 --- a/src/htsmsg_json.c +++ b/src/htsmsg_json.c @@ -39,6 +39,7 @@ htsmsg_json_write(htsmsg_t *msg, htsbuf_queue_t *hq, int isarray, htsmsg_field_t *f; char buf[100]; static const char *indentor = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; + const char *s; htsbuf_append(hq, isarray ? "[" : "{", 1); @@ -69,6 +70,11 @@ htsmsg_json_write(htsmsg_t *msg, htsbuf_queue_t *hq, int isarray, htsbuf_append_and_escape_jsonstr(hq, "binary"); break; + case HMF_BOOL: + s = f->hmf_bool ? "true" : "false"; + htsbuf_append(hq, s, strlen(s)); + break; + case HMF_S64: snprintf(buf, sizeof(buf), "%" PRId64, f->hmf_s64); htsbuf_append(hq, buf, strlen(buf)); @@ -169,7 +175,7 @@ add_double(void *opaque, void *parent, const char *name, double v) static void add_bool(void *opaque, void *parent, const char *name, int v) { - htsmsg_add_u32(parent, name, v); + htsmsg_add_bool(parent, name, v); } static void