From 7c3936078f04c073a233c8645046f5a956beb523 Mon Sep 17 00:00:00 2001 From: nekobit Date: Sun, 26 Jun 2022 03:15:36 +0000 Subject: [PATCH] Use booleans FossilOrigin-Name: f292b0e3c04535be65eca37d75b18721bf040a2e5c7098c1d04bd45b988029e4 --- include/mastodont_query.h | 2 ++ include/mastodont_types.h | 5 ++++- src/query.c | 26 ++++++++++++++++++++------ src/timeline.c | 30 +++++++++++++++--------------- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/include/mastodont_query.h b/include/mastodont_query.h index 36ced15..9d9dd7e 100644 --- a/include/mastodont_query.h +++ b/include/mastodont_query.h @@ -22,6 +22,7 @@ enum _mstdnt_query_type { _MSTDNT_QUERY_STRING, _MSTDNT_QUERY_INT, + _MSTDNT_QUERY_BOOL, _MSTDNT_QUERY_ARRAY, _MSTDNT_QUERY_FILE, }; @@ -39,6 +40,7 @@ struct _mstdnt_query_param union param_value { char* s; int i; + mstdnt_bool b; struct _mstdnt_query_array a; struct mstdnt_file* f; } value; diff --git a/include/mastodont_types.h b/include/mastodont_types.h index f237d0f..8632448 100644 --- a/include/mastodont_types.h +++ b/include/mastodont_types.h @@ -22,7 +22,10 @@ #define _mstdnt_arr_len(arr) (sizeof(arr)/sizeof(arr[0])) #define MSTDNT_URLSIZE 2048 #define MSTDNT_URISIZE 512 -typedef unsigned char mstdnt_bool; +typedef int8_t mstdnt_bool; +#define MSTDNT_TRUE 1 +#define MSTDNT_FALSE 0 +#define MSTDNT_BOOL_UNSET -1 // It's more logical to not sanitize than to sanitize data #define MSTDNT_FLAG_NO_URI_SANITIZE (1<<0) diff --git a/src/query.c b/src/query.c index 37bedb3..e1f0c0a 100644 --- a/src/query.c +++ b/src/query.c @@ -56,10 +56,12 @@ char* _mstdnt_query_string(mastodont_t* data, int res_count = 0; size_t arr_ind = 0; char* key_ptr; + int invalid_bool; /* If it's an array, we treat it as a "fake" regular key and keep iterating through it */ for (i = 0; i < param_len; ++i) { + invalid_bool = 0; escape_str = NULL; /* If array is NULL, skip */ @@ -81,9 +83,17 @@ char* _mstdnt_query_string(mastodont_t* data, key_ptr = params[i].key; } + // If boolean and set to 0, make it unset + if (params[i].type == _MSTDNT_QUERY_BOOL && + !(params[i].value.b >= 1)) + invalid_bool = 1; + + // If invalid_bool is true, then it's not actually set if (key_ptr && !(params[i].type == _MSTDNT_QUERY_STRING && - params[i].value.s == NULL)) + params[i].value.s == NULL) && + !(params[i].type == _MSTDNT_QUERY_BOOL && + invalid_bool)) { if (res_count++ == 0 && src_l) @@ -91,17 +101,21 @@ char* _mstdnt_query_string(mastodont_t* data, result[res_len-1] = '?'; /* Convert value */ - if (params[i].type == _MSTDNT_QUERY_INT) + if (params[i].type == _MSTDNT_QUERY_BOOL) { + if (params[i].value.b == 1) + val_ptr = "false"; + else // Anything above 1, can't be zero though + val_ptr = "true"; + } + else if (params[i].type == _MSTDNT_QUERY_INT) { snprintf(conv_val, CONV_SIZE, "%d", params[i].value.i); val_ptr = conv_val; } - else if (params[i].type == _MSTDNT_QUERY_ARRAY) - { + else if (params[i].type == _MSTDNT_QUERY_ARRAY) { val_ptr = params[i].value.a.arr[arr_ind]; } - else /* Point to it, it's a string */ - { + else { /* Point to it, it's a string */ /* First, let's encode it */ escape_str = MSTDNT_T_FLAG_ISSET(args, MSTDNT_FLAG_NO_URI_SANITIZE) ? params[i].value.s : curl_easy_escape(data->curl, params[i].value.s, 0); diff --git a/src/timeline.c b/src/timeline.c index e14c06c..8a41627 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -33,16 +33,16 @@ int mastodont_timeline_list(mastodont_t* data, snprintf(url, MSTDNT_URLSIZE, "api/v1/timelines/list/%s", list_id); struct _mstdnt_query_param params[] = { - { _MSTDNT_QUERY_INT, "local", { .i = args->local } }, - { _MSTDNT_QUERY_INT, "remote", { .i = args->remote } }, - { _MSTDNT_QUERY_INT, "only_media", { .i = args->only_media } }, + { _MSTDNT_QUERY_BOOL, "local", { .b = args->local } }, + { _MSTDNT_QUERY_BOOL, "remote", { .b = args->remote } }, + { _MSTDNT_QUERY_BOOL, "only_media", { .b = args->only_media } }, + { _MSTDNT_QUERY_BOOL, "with_muted", { .b = args->with_muted } }, /* { _MSTDNT_QUERY_INT, "exclude_visibilities", { .i = args->only_media } }, */ { _MSTDNT_QUERY_STRING, "max_id", { .s = args->max_id } }, { _MSTDNT_QUERY_STRING, "since_id", { .s = args->since_id } }, { _MSTDNT_QUERY_STRING, "min_id", { .s = args->min_id } }, { _MSTDNT_QUERY_INT, "limit", { .i = args->limit } }, { _MSTDNT_QUERY_INT, "offset", { .i = args->offset } }, - { _MSTDNT_QUERY_INT, "with_muted", { .i = args->with_muted } }, }; struct mastodont_request_args req_args = { @@ -80,11 +80,11 @@ int mastodont_timeline_tag(mastodont_t* data, // TODO NONE // TODO exclude_visibilities { _MSTDNT_QUERY_INT, "limit", { .i = args->limit } }, - { _MSTDNT_QUERY_INT, "local", { .i = args->local } }, { _MSTDNT_QUERY_INT, "offset", { .i = args->offset } }, - { _MSTDNT_QUERY_INT, "remote", { .i = args->remote } }, - { _MSTDNT_QUERY_INT, "only_media", { .i = args->only_media } }, - { _MSTDNT_QUERY_INT, "with_muted", { .i = args->with_muted } }, + { _MSTDNT_QUERY_BOOL, "local", { .b = args->local } }, + { _MSTDNT_QUERY_BOOL, "remote", { .b = args->remote } }, + { _MSTDNT_QUERY_BOOL, "only_media", { .b = args->only_media } }, + { _MSTDNT_QUERY_BOOL, "with_muted", { .b = args->with_muted } }, }; struct mastodont_request_args req_args = { @@ -124,12 +124,12 @@ int mastodont_timeline_public(mastodont_t* data, { struct _mstdnt_statuses_cb_args cb_args = { statuses, size }; struct _mstdnt_query_param params[] = { - { _MSTDNT_QUERY_INT, "local", { .i = args->local } }, + { _MSTDNT_QUERY_BOOL, "local", { .b = args->local } }, { _MSTDNT_QUERY_STRING, "instance", { .s = args->instance } }, - { _MSTDNT_QUERY_INT, "with_muted", { .i = args->with_muted } }, + { _MSTDNT_QUERY_BOOL, "with_muted", { .b = args->with_muted } }, { _MSTDNT_QUERY_STRING, "reply_visibility", { .s = (char*)reply_visibility_str(args->reply_visibility) } }, - { _MSTDNT_QUERY_INT, "remote", { .i = args->remote } }, - { _MSTDNT_QUERY_INT, "only_media", { .i = args->only_media } }, + { _MSTDNT_QUERY_BOOL, "remote", { .b = args->remote } }, + { _MSTDNT_QUERY_BOOL, "only_media", { .b = args->only_media } }, { _MSTDNT_QUERY_STRING, "max_id", { .s = args->max_id } }, { _MSTDNT_QUERY_STRING, "since_id", { .s = args->since_id } }, { _MSTDNT_QUERY_STRING, "min_id", { .s = args->min_id } }, @@ -167,7 +167,7 @@ int mastodont_timeline_direct(mastodont_t* data, { _MSTDNT_QUERY_STRING, "min_id", { .s = args->min_id } }, { _MSTDNT_QUERY_INT, "limit", { .i = args->limit } }, { _MSTDNT_QUERY_INT, "offset", { .i = args->offset } }, - { _MSTDNT_QUERY_INT, "with_muted", { .i = args->with_muted } }, + { _MSTDNT_QUERY_BOOL, "with_muted", { .b = args->with_muted } }, }; struct mastodont_request_args req_args = { @@ -195,8 +195,8 @@ int mastodont_timeline_home(mastodont_t* data, struct _mstdnt_statuses_cb_args cb_args = { statuses, size }; struct _mstdnt_query_param params[] = { - { _MSTDNT_QUERY_INT, "local", { .i = args->local } }, - { _MSTDNT_QUERY_INT, "remote", { .i = args->remote } }, + { _MSTDNT_QUERY_BOOL, "local", { .b = args->local } }, + { _MSTDNT_QUERY_BOOL, "remote", { .b = args->remote } }, { _MSTDNT_QUERY_INT, "only_media", { .i = args->only_media } }, { _MSTDNT_QUERY_INT, "with_muted", { .i = args->with_muted } }, /* { _MSTDNT_QUERY_INT, "exclude_visibilities", { .i = args->with_muted } }, */