Add assertion macro to return values
Just recently, I started using g_return_val_if_fail as a brief assertion checker. It'll also exit the function with a specified return value. But actually this introduces some weird behavior. It's configurable by environment variables and it'll print out a log message, if the expression didn't validate properly. But some of these assertions are actually ment to be silent. Using a simple macro makes it simple to structure the assertions and its return values in a block at the start of a function or anywhere else.
This commit is contained in:
parent
319e18e449
commit
8579b3ed6b
@ -463,8 +463,8 @@ static bool dbus_get_fdn_daemon_info(GDBusConnection *connection,
|
|||||||
char **name,
|
char **name,
|
||||||
char **vendor)
|
char **vendor)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail(pid, false);
|
ASSERT_OR_RET(pid, false);
|
||||||
g_return_val_if_fail(connection, false);
|
ASSERT_OR_RET(connection, false);
|
||||||
|
|
||||||
char *owner = NULL;
|
char *owner = NULL;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
@ -147,8 +147,7 @@ cairo_surface_t *icon_get_for_notification(const struct notification *n)
|
|||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!pixbuf)
|
ASSERT_OR_RET(pixbuf, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
int w = gdk_pixbuf_get_width(pixbuf);
|
int w = gdk_pixbuf_get_width(pixbuf);
|
||||||
int h = gdk_pixbuf_get_height(pixbuf);
|
int h = gdk_pixbuf_get_height(pixbuf);
|
||||||
|
@ -30,8 +30,7 @@ static const char *log_level_to_string(GLogLevelFlags level)
|
|||||||
/* see log.h */
|
/* see log.h */
|
||||||
void log_set_level_from_string(const char *level)
|
void log_set_level_from_string(const char *level)
|
||||||
{
|
{
|
||||||
if (!level)
|
ASSERT_OR_RET(level,);
|
||||||
return;
|
|
||||||
|
|
||||||
if (STR_CASEQ(level, "critical"))
|
if (STR_CASEQ(level, "critical"))
|
||||||
log_level = G_LOG_LEVEL_CRITICAL;
|
log_level = G_LOG_LEVEL_CRITICAL;
|
||||||
|
21
src/markup.c
21
src/markup.c
@ -18,8 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
static char *markup_quote(char *str)
|
static char *markup_quote(char *str)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
str = string_replace_all("&", "&", str);
|
str = string_replace_all("&", "&", str);
|
||||||
str = string_replace_all("\"", """, str);
|
str = string_replace_all("\"", """, str);
|
||||||
@ -36,8 +35,7 @@ static char *markup_quote(char *str)
|
|||||||
*/
|
*/
|
||||||
static char *markup_unquote(char *str)
|
static char *markup_unquote(char *str)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
str = string_replace_all(""", "\"", str);
|
str = string_replace_all(""", "\"", str);
|
||||||
str = string_replace_all("'", "'", str);
|
str = string_replace_all("'", "'", str);
|
||||||
@ -54,8 +52,7 @@ static char *markup_unquote(char *str)
|
|||||||
*/
|
*/
|
||||||
static char *markup_br2nl(char *str)
|
static char *markup_br2nl(char *str)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
str = string_replace_all("<br>", "\n", str);
|
str = string_replace_all("<br>", "\n", str);
|
||||||
str = string_replace_all("<br/>", "\n", str);
|
str = string_replace_all("<br/>", "\n", str);
|
||||||
@ -224,8 +221,7 @@ void markup_strip_img(char **str, char **urls)
|
|||||||
/* see markup.h */
|
/* see markup.h */
|
||||||
char *markup_strip(char *str)
|
char *markup_strip(char *str)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* strip all tags */
|
/* strip all tags */
|
||||||
string_strip_delimited(str, '<', '>');
|
string_strip_delimited(str, '<', '>');
|
||||||
@ -248,8 +244,7 @@ static bool markup_is_entity(const char *str)
|
|||||||
assert(*str == '&');
|
assert(*str == '&');
|
||||||
|
|
||||||
char *end = strchr(str, ';');
|
char *end = strchr(str, ';');
|
||||||
if (!end)
|
ASSERT_OR_RET(end, false);
|
||||||
return false;
|
|
||||||
|
|
||||||
// Parse (hexa)decimal entities with the format Ӓ or ઼
|
// Parse (hexa)decimal entities with the format Ӓ or ઼
|
||||||
if (str[1] == '#') {
|
if (str[1] == '#') {
|
||||||
@ -293,8 +288,7 @@ static bool markup_is_entity(const char *str)
|
|||||||
*/
|
*/
|
||||||
static char *markup_escape_unsupported(char *str)
|
static char *markup_escape_unsupported(char *str)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
char *match = str;
|
char *match = str;
|
||||||
while ((match = strchr(match, '&'))) {
|
while ((match = strchr(match, '&'))) {
|
||||||
@ -313,8 +307,7 @@ static char *markup_escape_unsupported(char *str)
|
|||||||
/* see markup.h */
|
/* see markup.h */
|
||||||
char *markup_transform(char *str, enum markup_mode markup_mode)
|
char *markup_transform(char *str, enum markup_mode markup_mode)
|
||||||
{
|
{
|
||||||
if (!str)
|
ASSERT_OR_RET(str, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
switch (markup_mode) {
|
switch (markup_mode) {
|
||||||
case MARKUP_NULL:
|
case MARKUP_NULL:
|
||||||
|
@ -222,8 +222,7 @@ void invoke_action(const char *action)
|
|||||||
*/
|
*/
|
||||||
void dispatch_menu_result(const char *input)
|
void dispatch_menu_result(const char *input)
|
||||||
{
|
{
|
||||||
if (!input)
|
ASSERT_OR_RET(input,);
|
||||||
return;
|
|
||||||
|
|
||||||
char *in = g_strdup(input);
|
char *in = g_strdup(input);
|
||||||
g_strstrip(in);
|
g_strstrip(in);
|
||||||
@ -248,8 +247,7 @@ char *invoke_dmenu(const char *dmenu_input)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dmenu_input || *dmenu_input == '\0')
|
ASSERT_OR_RET(STR_FULL(dmenu_input), NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
gint dunst_to_dmenu;
|
gint dunst_to_dmenu;
|
||||||
gint dmenu_to_dunst;
|
gint dmenu_to_dunst;
|
||||||
|
@ -168,8 +168,7 @@ int notification_cmp_data(const void *va, const void *vb, void *data)
|
|||||||
struct notification *a = (struct notification *) va;
|
struct notification *a = (struct notification *) va;
|
||||||
struct notification *b = (struct notification *) vb;
|
struct notification *b = (struct notification *) vb;
|
||||||
|
|
||||||
if (!settings.sort)
|
ASSERT_OR_RET(settings.sort, 1);
|
||||||
return 1;
|
|
||||||
|
|
||||||
return notification_cmp(a, b);
|
return notification_cmp(a, b);
|
||||||
}
|
}
|
||||||
@ -191,8 +190,7 @@ int notification_is_duplicate(const struct notification *a, const struct notific
|
|||||||
/* see notification.h */
|
/* see notification.h */
|
||||||
void rawimage_free(struct raw_image *i)
|
void rawimage_free(struct raw_image *i)
|
||||||
{
|
{
|
||||||
if (!i)
|
ASSERT_OR_RET(i,);
|
||||||
return;
|
|
||||||
|
|
||||||
g_free(i->data);
|
g_free(i->data);
|
||||||
g_free(i);
|
g_free(i);
|
||||||
@ -220,8 +218,7 @@ void notification_ref(struct notification *n)
|
|||||||
/* see notification.h */
|
/* see notification.h */
|
||||||
void notification_unref(struct notification *n)
|
void notification_unref(struct notification *n)
|
||||||
{
|
{
|
||||||
if (!n)
|
ASSERT_OR_RET(n,);
|
||||||
return;
|
|
||||||
|
|
||||||
assert(n->priv->refcount > 0);
|
assert(n->priv->refcount > 0);
|
||||||
if (!g_atomic_int_dec_and_test(&n->priv->refcount))
|
if (!g_atomic_int_dec_and_test(&n->priv->refcount))
|
||||||
|
@ -95,9 +95,7 @@ void add_entry(const char *section_name, const char *key, const char *value)
|
|||||||
const char *get_value(const char *section, const char *key)
|
const char *get_value(const char *section, const char *key)
|
||||||
{
|
{
|
||||||
struct section *s = get_section(section);
|
struct section *s = get_section(section);
|
||||||
if (!s) {
|
ASSERT_OR_RET(s, NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < s->entry_count; i++) {
|
for (int i = 0; i < s->entry_count; i++) {
|
||||||
if (STR_EQ(s->entries[i].key, key)) {
|
if (STR_EQ(s->entries[i].key, key)) {
|
||||||
@ -158,11 +156,8 @@ bool ini_is_set(const char *ini_section, const char *ini_key)
|
|||||||
|
|
||||||
const char *next_section(const char *section)
|
const char *next_section(const char *section)
|
||||||
{
|
{
|
||||||
if (section_count == 0)
|
ASSERT_OR_RET(section_count > 0, NULL);
|
||||||
return NULL;
|
ASSERT_OR_RET(section, sections[0].name);
|
||||||
|
|
||||||
if (!section)
|
|
||||||
return sections[0].name;
|
|
||||||
|
|
||||||
for (int i = 0; i < section_count; i++) {
|
for (int i = 0; i < section_count; i++) {
|
||||||
if (STR_EQ(section, sections[i].name)) {
|
if (STR_EQ(section, sections[i].name)) {
|
||||||
@ -202,8 +197,7 @@ int ini_get_bool(const char *section, const char *key, int def)
|
|||||||
|
|
||||||
int load_ini_file(FILE *fp)
|
int load_ini_file(FILE *fp)
|
||||||
{
|
{
|
||||||
if (!fp)
|
ASSERT_OR_RET(fp, 1);
|
||||||
return 1;
|
|
||||||
|
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t line_len = 0;
|
size_t line_len = 0;
|
||||||
@ -277,9 +271,8 @@ void cmdline_load(int argc, char *argv[])
|
|||||||
|
|
||||||
int cmdline_find_option(const char *key)
|
int cmdline_find_option(const char *key)
|
||||||
{
|
{
|
||||||
if (!key) {
|
ASSERT_OR_RET(key, -1);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
char *key1 = g_strdup(key);
|
char *key1 = g_strdup(key);
|
||||||
char *key2 = strchr(key1, '/');
|
char *key2 = strchr(key1, '/');
|
||||||
|
|
||||||
@ -535,8 +528,7 @@ const char *cmdline_create_usage(void)
|
|||||||
/* see option_parser.h */
|
/* see option_parser.h */
|
||||||
enum behavior_fullscreen parse_enum_fullscreen(const char *string, enum behavior_fullscreen def)
|
enum behavior_fullscreen parse_enum_fullscreen(const char *string, enum behavior_fullscreen def)
|
||||||
{
|
{
|
||||||
if (!string)
|
ASSERT_OR_RET(string, def);
|
||||||
return def;
|
|
||||||
|
|
||||||
if (STR_EQ(string, "show"))
|
if (STR_EQ(string, "show"))
|
||||||
return FS_SHOW;
|
return FS_SHOW;
|
||||||
|
@ -113,8 +113,7 @@ static void queues_swap_notifications(GQueue *queueA,
|
|||||||
*/
|
*/
|
||||||
static bool queues_notification_is_ready(const struct notification *n, struct dunst_status status, bool shown)
|
static bool queues_notification_is_ready(const struct notification *n, struct dunst_status status, bool shown)
|
||||||
{
|
{
|
||||||
if (!status.running)
|
ASSERT_OR_RET(status.running, false);
|
||||||
return false;
|
|
||||||
if (status.fullscreen && shown)
|
if (status.fullscreen && shown)
|
||||||
return n && n->fullscreen != FS_PUSHBACK;
|
return n && n->fullscreen != FS_PUSHBACK;
|
||||||
else if (status.fullscreen && !shown)
|
else if (status.fullscreen && !shown)
|
||||||
@ -418,8 +417,7 @@ void queues_update(struct dunst_status status)
|
|||||||
struct notification *n = iter->data;
|
struct notification *n = iter->data;
|
||||||
nextiter = iter->next;
|
nextiter = iter->next;
|
||||||
|
|
||||||
if (!n)
|
ASSERT_OR_RET(n,);
|
||||||
return;
|
|
||||||
|
|
||||||
if (!queues_notification_is_ready(n, status, false)) {
|
if (!queues_notification_is_ready(n, status, false)) {
|
||||||
iter = nextiter;
|
iter = nextiter;
|
||||||
|
@ -30,8 +30,7 @@ static const char *follow_mode_to_string(enum follow_mode f_mode)
|
|||||||
|
|
||||||
static enum follow_mode parse_follow_mode(const char *mode)
|
static enum follow_mode parse_follow_mode(const char *mode)
|
||||||
{
|
{
|
||||||
if (!mode)
|
ASSERT_OR_RET(mode, FOLLOW_NONE);
|
||||||
return FOLLOW_NONE;
|
|
||||||
|
|
||||||
if (STR_EQ(mode, "mouse"))
|
if (STR_EQ(mode, "mouse"))
|
||||||
return FOLLOW_MOUSE;
|
return FOLLOW_MOUSE;
|
||||||
|
@ -14,8 +14,7 @@
|
|||||||
/* see utils.h */
|
/* see utils.h */
|
||||||
char *string_replace_char(char needle, char replacement, char *haystack)
|
char *string_replace_char(char needle, char replacement, char *haystack)
|
||||||
{
|
{
|
||||||
if (!haystack)
|
ASSERT_OR_RET(haystack, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
char *current = haystack;
|
char *current = haystack;
|
||||||
while ((current = strchr(current, needle)))
|
while ((current = strchr(current, needle)))
|
||||||
@ -56,8 +55,7 @@ char *string_replace_at(char *buf, int pos, int len, const char *repl)
|
|||||||
/* see utils.h */
|
/* see utils.h */
|
||||||
char *string_replace_all(const char *needle, const char *replacement, char *haystack)
|
char *string_replace_all(const char *needle, const char *replacement, char *haystack)
|
||||||
{
|
{
|
||||||
if (!haystack)
|
ASSERT_OR_RET(haystack, NULL);
|
||||||
return NULL;
|
|
||||||
assert(needle);
|
assert(needle);
|
||||||
assert(replacement);
|
assert(replacement);
|
||||||
|
|
||||||
@ -104,8 +102,7 @@ char *string_append(char *a, const char *b, const char *sep)
|
|||||||
/* see utils.h */
|
/* see utils.h */
|
||||||
char *string_strip_quotes(const char *value)
|
char *string_strip_quotes(const char *value)
|
||||||
{
|
{
|
||||||
if (!value)
|
ASSERT_OR_RET(value, NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
size_t len = strlen(value);
|
size_t len = strlen(value);
|
||||||
char *s;
|
char *s;
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
//! Test if string a and b are the same case-insensitively
|
//! Test if string a and b are the same case-insensitively
|
||||||
#define STR_CASEQ(a, b) (strcasecmp(a, b) == 0)
|
#define STR_CASEQ(a, b) (strcasecmp(a, b) == 0)
|
||||||
|
|
||||||
|
//! Assert that expr evaluates to true, if not return with val
|
||||||
|
#define ASSERT_OR_RET(expr, val) if (!(expr)) return val;
|
||||||
|
|
||||||
//! Convert a second into the internal time representation
|
//! Convert a second into the internal time representation
|
||||||
#define S2US(s) (((gint64)(s)) * 1000 * 1000)
|
#define S2US(s) (((gint64)(s)) * 1000 * 1000)
|
||||||
|
|
||||||
|
@ -221,8 +221,7 @@ bool window_is_fullscreen(Window window)
|
|||||||
{
|
{
|
||||||
bool fs = false;
|
bool fs = false;
|
||||||
|
|
||||||
if (!window)
|
ASSERT_OR_RET(window, false);
|
||||||
return false;
|
|
||||||
|
|
||||||
Atom has_wm_state = XInternAtom(xctx.dpy, "_NET_WM_STATE", True);
|
Atom has_wm_state = XInternAtom(xctx.dpy, "_NET_WM_STATE", True);
|
||||||
if (has_wm_state == None){
|
if (has_wm_state == None){
|
||||||
|
@ -674,8 +674,7 @@ void x_win_show(struct window_x11 *win)
|
|||||||
*/
|
*/
|
||||||
void x_win_hide(struct window_x11 *win)
|
void x_win_hide(struct window_x11 *win)
|
||||||
{
|
{
|
||||||
if (!win->visible)
|
ASSERT_OR_RET(win->visible,);
|
||||||
return;
|
|
||||||
|
|
||||||
x_shortcut_ungrab(&settings.close_ks);
|
x_shortcut_ungrab(&settings.close_ks);
|
||||||
x_shortcut_ungrab(&settings.close_all_ks);
|
x_shortcut_ungrab(&settings.close_all_ks);
|
||||||
@ -755,8 +754,7 @@ static int x_shortcut_tear_down_error_handler(void)
|
|||||||
*/
|
*/
|
||||||
static int x_shortcut_grab(struct keyboard_shortcut *ks)
|
static int x_shortcut_grab(struct keyboard_shortcut *ks)
|
||||||
{
|
{
|
||||||
if (!ks->is_valid)
|
ASSERT_OR_RET(ks->is_valid, 1);
|
||||||
return 1;
|
|
||||||
Window root;
|
Window root;
|
||||||
root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
|
root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
|
||||||
|
|
||||||
@ -805,8 +803,7 @@ static void x_shortcut_ungrab(struct keyboard_shortcut *ks)
|
|||||||
*/
|
*/
|
||||||
static void x_shortcut_init(struct keyboard_shortcut *ks)
|
static void x_shortcut_init(struct keyboard_shortcut *ks)
|
||||||
{
|
{
|
||||||
if (!ks|| !ks->str)
|
ASSERT_OR_RET(ks && ks->str,);
|
||||||
return;
|
|
||||||
|
|
||||||
if (STR_EQ(ks->str, "none") || (STR_EQ(ks->str, ""))) {
|
if (STR_EQ(ks->str, "none") || (STR_EQ(ks->str, ""))) {
|
||||||
ks->is_valid = false;
|
ks->is_valid = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user