From dabdffafa59f43314333be42aa519d7fff1b4498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 07:42:20 +0200 Subject: [PATCH 1/8] don't use empty struct initializers --- config.c | 10 +++++----- input.c | 8 ++++---- render.c | 6 +++--- search.c | 4 ++-- selection.c | 6 +++--- sixel.c | 2 +- terminal.c | 18 +++++++++--------- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/config.c b/config.c index bf7c77ec..3112f422 100644 --- a/config.c +++ b/config.c @@ -689,7 +689,7 @@ parse_modifiers(struct config *conf, const char *text, size_t len, { bool ret = false; - *modifiers = (struct config_key_modifiers){}; + *modifiers = (struct config_key_modifiers){0}; char *copy = xstrndup(text, len); for (char *tok_ctx = NULL, *key = strtok_r(copy, "+", &tok_ctx); @@ -730,7 +730,7 @@ parse_key_combos(struct config *conf, const char *combos, key_combo_list_t *key_ combo != NULL; combo = strtok_r(NULL, " ", &tok_ctx)) { - struct config_key_modifiers modifiers = {}; + struct config_key_modifiers modifiers = {0}; const char *key = strrchr(combo, '+'); if (key == NULL) { @@ -1018,7 +1018,7 @@ parse_mouse_combos(struct config *conf, const char *combos, key_combo_list_t *ke combo != NULL; combo = strtok_r(NULL, " ", &tok_ctx)) { - struct config_key_modifiers modifiers = {}; + struct config_key_modifiers modifiers = {0}; char *key = strrchr(combo, '+'); if (key == NULL) { @@ -1494,7 +1494,7 @@ add_default_search_bindings(struct config *conf) ((struct config_key_binding_search){action, mods, sym})); \ } while (0) - const struct config_key_modifiers none = {}; + const struct config_key_modifiers none = {0}; const struct config_key_modifiers alt = {.alt = true}; const struct config_key_modifiers ctrl = {.ctrl = true}; const struct config_key_modifiers ctrl_shift = {.ctrl = true, .shift = true}; @@ -1538,7 +1538,7 @@ add_default_mouse_bindings(struct config *conf) ((struct config_mouse_binding){action, mods, btn, count})); \ } while (0) - const struct config_key_modifiers none = {}; + const struct config_key_modifiers none = {0}; const struct config_key_modifiers ctrl = {.ctrl = true}; add_binding(BIND_ACTION_PRIMARY_PASTE, none, BTN_MIDDLE, 1); diff --git a/input.c b/input.c index b188a140..9d73af95 100644 --- a/input.c +++ b/input.c @@ -549,7 +549,7 @@ stop_repeater(struct seat *seat, uint32_t key) if (key != -1 && key != seat->kbd.repeat.key) return true; - if (timerfd_settime(seat->kbd.repeat.fd, 0, &(struct itimerspec){}, NULL) < 0) { + if (timerfd_settime(seat->kbd.repeat.fd, 0, &(struct itimerspec){{0}}, NULL) < 0) { LOG_ERRNO("%s: failed to disarm keyboard repeat timer", seat->name); return false; } @@ -843,7 +843,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, * Compose, and maybe emit "normal" character */ - uint8_t buf[64] = {}; + uint8_t buf[64] = {0}; int count = 0; if (compose_status == XKB_COMPOSE_COMPOSED) { @@ -923,7 +923,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, const wchar_t wc = 0x80 | buf[0]; char utf8[8]; - mbstate_t ps = {}; + mbstate_t ps = {0}; size_t chars = wcrtomb(utf8, wc, &ps); if (chars != (size_t)-1) @@ -1544,7 +1544,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, continue; } - const struct config_key_modifiers no_mods = {}; + const struct config_key_modifiers no_mods = {0}; if (memcmp(&binding->modifiers, &no_mods, sizeof(no_mods)) != 0) { /* Binding has modifiers */ continue; diff --git a/render.c b/render.c index 12003468..a62d1150 100644 --- a/render.c +++ b/render.c @@ -36,7 +36,7 @@ static struct { size_t zero; /* commits presented in less than one frame interval */ size_t one; /* commits presented in one frame interval */ size_t two; /* commits presented in two or more frame intervals */ -} presentation_statistics = {}; +} presentation_statistics = {0}; static void fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data); @@ -952,11 +952,11 @@ get_csd_data(const struct terminal *term, enum csd_surface surf_idx) case CSD_SURF_COUNT: assert(false); - return (struct csd_data){}; + return (struct csd_data){0}; } assert(false); - return (struct csd_data){}; + return (struct csd_data){0}; } static void diff --git a/search.c b/search.c index 792fcae8..551d21ba 100644 --- a/search.c +++ b/search.c @@ -648,7 +648,7 @@ search_input(struct seat *seat, struct terminal *term, uint32_t key, } } - uint8_t buf[64] = {}; + uint8_t buf[64] = {0}; int count = 0; if (compose_status == XKB_COMPOSE_COMPOSED) { @@ -666,7 +666,7 @@ search_input(struct seat *seat, struct terminal *term, uint32_t key, return; const char *src = (const char *)buf; - mbstate_t ps = {}; + mbstate_t ps = {0}; size_t wchars = mbsnrtowcs(NULL, &src, count, 0, &ps); if (wchars == -1) { diff --git a/selection.c b/selection.c index cb8eb985..9062c606 100644 --- a/selection.c +++ b/selection.c @@ -325,7 +325,7 @@ selection_modify(struct terminal *term, struct coord start, struct coord end) assert(start.row != -1 && start.col != -1); assert(end.row != -1 && end.col != -1); - struct mark_context ctx = {}; + struct mark_context ctx = {0}; /* Premark all cells that *will* be selected */ foreach_selected(term, start, end, &premark_selected, &ctx); @@ -452,7 +452,7 @@ selection_dirty_cells(struct terminal *term) foreach_selected( term, term->selection.start, term->selection.end, &mark_selected, - &(struct mark_context){}); + &(struct mark_context){0}); } static void @@ -647,7 +647,7 @@ selection_cancel(struct terminal *term) if (term->selection.start.row >= 0 && term->selection.end.row >= 0) { foreach_selected( term, term->selection.start, term->selection.end, - &unmark_selected, &(struct mark_context){}); + &unmark_selected, &(struct mark_context){0}); render_refresh(term); } diff --git a/sixel.c b/sixel.c index 13596088..89d74061 100644 --- a/sixel.c +++ b/sixel.c @@ -231,7 +231,7 @@ sixel_overwrite(struct terminal *term, struct sixel *six, row, col, height, width, rel_above, rel_below, rel_left, rel_right); - struct sixel imgs[4] = {}; + struct sixel imgs[4] = {0}; if (rel_above > 0) { imgs[0] = (struct sixel){ diff --git a/terminal.c b/terminal.c index 70763aa6..c852952a 100644 --- a/terminal.c +++ b/terminal.c @@ -140,7 +140,7 @@ fdm_ptmx_out(struct fdm *fdm, int fd, int events, void *data) } #if PTMX_TIMING -static struct timespec last = {}; +static struct timespec last = {0}; #endif static bool @@ -339,7 +339,7 @@ fdm_blink(struct fdm *fdm, int fd, int events, void *data) term->blink.active = false; term->blink.state = BLINK_ON; - static const struct itimerspec disarm = {}; + static const struct itimerspec disarm = {{0}}; if (timerfd_settime(term->blink.fd, 0, &disarm, NULL) < 0) LOG_ERRNO("failed to disarm blink timer"); } else @@ -437,11 +437,11 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) return true; #if PTMX_TIMING - last = (struct timespec){}; + last = (struct timespec){0}; #endif /* Reset timers */ - struct itimerspec reset = {}; + struct itimerspec reset = {{0}}; timerfd_settime(term->delayed_render_timer.lower_fd, 0, &reset, NULL); timerfd_settime(term->delayed_render_timer.upper_fd, 0, &reset, NULL); term->delayed_render_timer.is_armed = false; @@ -707,7 +707,7 @@ reload_fonts(struct terminal *term) {count, (const char **)names, attrs3, &fonts[3]}, }; - thrd_t tids[4] = {}; + thrd_t tids[4] = {0}; for (size_t i = 0; i < 4; i++) { int ret = thrd_create(&tids[i], &font_loader_thread, &data[i]); if (ret != thrd_success) { @@ -1709,7 +1709,7 @@ cursor_blink_start_timer(struct terminal *term) static bool cursor_blink_stop_timer(struct terminal *term) { - return timerfd_settime(term->cursor_blink.fd, 0, &(struct itimerspec){}, NULL) == 0; + return timerfd_settime(term->cursor_blink.fd, 0, &(struct itimerspec){{0}}, NULL) == 0; } void @@ -2279,10 +2279,10 @@ term_enable_app_sync_updates(struct terminal *term) /* Disarm delayed rendering timers */ timerfd_settime( term->delayed_render_timer.lower_fd, 0, - &(struct itimerspec){}, NULL); + &(struct itimerspec){{0}}, NULL); timerfd_settime( term->delayed_render_timer.upper_fd, 0, - &(struct itimerspec){}, NULL); + &(struct itimerspec){{0}}, NULL); term->delayed_render_timer.is_armed = false; } @@ -2299,7 +2299,7 @@ term_disable_app_sync_updates(struct terminal *term) /* Reset timers */ timerfd_settime( term->render.app_sync_updates.timer_fd, 0, - &(struct itimerspec){}, NULL); + &(struct itimerspec){{0}}, NULL); } static inline void From c779a5ec7deecf91cb9aca298af90cbc2d9c04d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 07:44:02 +0200 Subject: [PATCH 2/8] log: include 'fmt' in __VA_ARGS__ This ensures all calls have at least one __VA_ARGS__ argument, thus making them ISO C99 compliant. --- config.c | 20 ++++++++++---------- log.h | 26 +++++++++++++------------- slave.c | 5 +++-- spawn.c | 2 +- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/config.c b/config.c index 3112f422..34398216 100644 --- a/config.c +++ b/config.c @@ -105,10 +105,10 @@ static const char *const search_binding_action_map[] = { static_assert(ALEN(search_binding_action_map) == BIND_ACTION_SEARCH_COUNT, "search binding action map size mismatch"); -#define LOG_AND_NOTIFY_ERR(fmt, ...) \ +#define LOG_AND_NOTIFY_ERR(...) \ do { \ - LOG_ERR(fmt, ## __VA_ARGS__); \ - char *text = xasprintf(fmt, ## __VA_ARGS__); \ + LOG_ERR(__VA_ARGS__); \ + char *text = xasprintf(__VA_ARGS__); \ struct user_notification notif = { \ .kind = USER_NOTIFICATION_ERROR, \ .text = text, \ @@ -116,10 +116,10 @@ static_assert(ALEN(search_binding_action_map) == BIND_ACTION_SEARCH_COUNT, tll_push_back(conf->notifications, notif); \ } while (0) -#define LOG_AND_NOTIFY_WARN(fmt, ...) \ +#define LOG_AND_NOTIFY_WARN(...) \ do { \ - LOG_WARN(fmt, ## __VA_ARGS__); \ - char *text = xasprintf(fmt, ## __VA_ARGS__); \ + LOG_WARN(__VA_ARGS__); \ + char *text = xasprintf(__VA_ARGS__); \ struct user_notification notif = { \ .kind = USER_NOTIFICATION_WARNING, \ .text = text, \ @@ -127,14 +127,14 @@ static_assert(ALEN(search_binding_action_map) == BIND_ACTION_SEARCH_COUNT, tll_push_back(conf->notifications, notif); \ } while (0) -#define LOG_AND_NOTIFY_ERRNO(fmt, ...) \ +#define LOG_AND_NOTIFY_ERRNO(...) \ do { \ int _errno = errno; \ - LOG_ERRNO(fmt, ## __VA_ARGS__); \ - int len = snprintf(NULL, 0, fmt, ## __VA_ARGS__); \ + LOG_ERRNO(__VA_ARGS__); \ + int len = snprintf(NULL, 0, __VA_ARGS__); \ int errno_len = snprintf(NULL, 0, ": %s", strerror(_errno)); \ char *text = xmalloc(len + errno_len + 1); \ - snprintf(text, len + errno_len + 1, fmt, ## __VA_ARGS__); \ + snprintf(text, len + errno_len + 1, __VA_ARGS__); \ snprintf(&text[len], errno_len + 1, ": %s", strerror(_errno)); \ struct user_notification notif = { \ .kind = USER_NOTIFICATION_ERROR, \ diff --git a/log.h b/log.h index 34713d2a..656a8ca0 100644 --- a/log.h +++ b/log.h @@ -23,21 +23,21 @@ void log_errno_provided( const char *file, int lineno, int _errno, const char *fmt, ...) PRINTF(6); -#define LOG_ERR(fmt, ...) \ - log_msg(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, fmt, ## __VA_ARGS__) -#define LOG_ERRNO(fmt, ...) \ - log_errno(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, fmt, ## __VA_ARGS__) -#define LOG_ERRNO_P(fmt, _errno, ...) \ +#define LOG_ERR(...) \ + log_msg(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) +#define LOG_ERRNO(...) \ + log_errno(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) +#define LOG_ERRNO_P(_errno, ...) \ log_errno_provided(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, \ - _errno, fmt, ## __VA_ARGS__) -#define LOG_WARN(fmt, ...) \ - log_msg(LOG_CLASS_WARNING, LOG_MODULE, __FILE__, __LINE__, fmt, ## __VA_ARGS__) -#define LOG_INFO(fmt, ...) \ - log_msg(LOG_CLASS_INFO, LOG_MODULE, __FILE__, __LINE__, fmt, ## __VA_ARGS__) + _errno, __VA_ARGS__) +#define LOG_WARN(...) \ + log_msg(LOG_CLASS_WARNING, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) +#define LOG_INFO(...) \ + log_msg(LOG_CLASS_INFO, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) #if defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG - #define LOG_DBG(fmt, ...) \ - log_msg(LOG_CLASS_DEBUG, LOG_MODULE, __FILE__, __LINE__, fmt, ## __VA_ARGS__) + #define LOG_DBG(...) \ + log_msg(LOG_CLASS_DEBUG, LOG_MODULE, __FILE__, __LINE__, __VA_ARGS__) #else - #define LOG_DBG(fmt, ...) + #define LOG_DBG(...) #endif diff --git a/slave.c b/slave.c index b104a8d7..eaa21060 100644 --- a/slave.c +++ b/slave.c @@ -281,7 +281,7 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv, sigprocmask(SIG_SETMASK, &mask, NULL) < 0) { const int _errno = errno; - LOG_ERRNO_P("failed to restore signals", errno); + LOG_ERRNO_P(errno, "failed to restore signals"); (void)!write(fork_pipe[1], &_errno, sizeof(_errno)); _exit(_errno); } @@ -332,7 +332,8 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv, return -1; } else if (ret == sizeof(_errno)) { LOG_ERRNO_P( - "%s: failed to execute", _errno, argc == 0 ? conf_shell : argv[0]); + _errno, "%s: failed to execute", + argc == 0 ? conf_shell : argv[0]); return -1; } else LOG_DBG("%s: successfully started", conf_shell); diff --git a/spawn.c b/spawn.c index b268bfe5..cc4755f4 100644 --- a/spawn.c +++ b/spawn.c @@ -61,7 +61,7 @@ spawn(struct reaper *reaper, const char *cwd, char *const argv[], LOG_ERRNO("failed to read from pipe"); return false; } else { - LOG_ERRNO_P("%s: failed to spawn", _errno, argv[0]); + LOG_ERRNO_P(_errno, "%s: failed to spawn", argv[0]); errno = _errno; waitpid(pid, NULL, 0); return false; From e32c0d9bf698782353bbe9e4348617523af473bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 07:50:27 +0200 Subject: [PATCH 3/8] Cast printf formatter %p arguments to void* --- fdm.c | 23 +++++++++++++++-------- input.c | 21 +++++++++++---------- shm.c | 8 ++++---- sixel.c | 2 +- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/fdm.c b/fdm.c index 93ac86ff..980a464c 100644 --- a/fdm.c +++ b/fdm.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -263,7 +264,7 @@ fdm_hook_add(struct fdm *fdm, fdm_hook_t hook, void *data, #if defined(_DEBUG) tll_foreach(*hooks, it) { if (it->item.callback == hook) { - LOG_ERR("hook=%p already registered", hook); + LOG_ERR("hook=0x%" PRIxPTR " already registered", (uintptr_t)hook); return false; } } @@ -286,7 +287,7 @@ fdm_hook_del(struct fdm *fdm, fdm_hook_t hook, enum fdm_hook_priority priority) return true; } - LOG_WARN("hook=%p not registered", hook); + LOG_WARN("hook=0x%" PRIxPTR " not registered", (uintptr_t)hook); return false; } @@ -300,18 +301,24 @@ fdm_poll(struct fdm *fdm) } tll_foreach(fdm->hooks_high, it) { - LOG_DBG("executing high priority hook %p(fdm=%p, data=%p)", - it->item.callback, fdm, it->item.callback_data); + LOG_DBG( + "executing high priority hook 0x%" PRIxPTR" (fdm=%p, data=%p)", + (uintptr_t)it->item.callback, (void *)fdm, + (void *)it->item.callback_data); it->item.callback(fdm, it->item.callback_data); } tll_foreach(fdm->hooks_normal, it) { - LOG_DBG("executing normal priority hook %p(fdm=%p, data=%p)", - it->item.callback, fdm, it->item.callback_data); + LOG_DBG( + "executing normal priority hook 0x%" PRIxPTR " (fdm=%p, data=%p)", + (uintptr_t)it->item.callback, (void *)fdm, + (void *)it->item.callback_data); it->item.callback(fdm, it->item.callback_data); } tll_foreach(fdm->hooks_low, it) { - LOG_DBG("executing low priority hook %p(fdm=%p, data=%p)", - it->item.callback, fdm, it->item.callback_data); + LOG_DBG( + "executing low priority hook 0x%" PRIxPTR " (fdm=%p, data=%p)", + (uintptr_t)it->item.callback, (void *)fdm, + (void *)it->item.callback_data); it->item.callback(fdm, it->item.callback_data); } diff --git a/input.c b/input.c index 9d73af95..d6bc2e8e 100644 --- a/input.c +++ b/input.c @@ -422,7 +422,7 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size) { LOG_DBG("keyboard_keymap: keyboard=%p (format=%u, size=%u)", - wl_keyboard, format, size); + (void *)wl_keyboard, format, size); struct seat *seat = data; struct wayland *wayl = seat->wayl; @@ -505,7 +505,7 @@ keyboard_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct terminal *term = win->term; LOG_DBG("%s: keyboard_enter: keyboard=%p, serial=%u, surface=%p", - seat->name, wl_keyboard, serial, surface); + seat->name, (void *)wl_keyboard, serial, (void *)surface); if (seat->kbd.xkb == NULL) return; @@ -564,7 +564,7 @@ keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct seat *seat = data; LOG_DBG("keyboard_leave: keyboard=%p, serial=%u, surface=%p", - wl_keyboard, serial, surface); + (void *)wl_keyboard, serial, (void *)surface); if (seat->kbd.xkb == NULL) return; @@ -597,7 +597,7 @@ keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, */ LOG_WARN( "compositor sent keyboard_leave event without a keyboard_enter " - "event: surface=%p", surface); + "event: surface=%p", (void *)surface); } } @@ -795,7 +795,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, LOG_DBG("keyboard_key: keyboard=%p, serial=%u, " "sym=%u, mod=0x%08x, consumed=0x%08x, significant=0x%08x, " "effective=0x%08x, repeats=%d", - wl_keyboard, serial, + (void *)wl_keyboard, serial, sym, mods, consumed, significant, effective_mods, should_repeat); /* @@ -1077,7 +1077,7 @@ wl_pointer_enter(void *data, struct wl_pointer *wl_pointer, seat->pointer.hidden = false; LOG_DBG("pointer-enter: pointer=%p, serial=%u, surface = %p, new-moused = %p", - wl_pointer, serial, surface, term); + (void *)wl_pointer, serial, (void *)surface, (void *)term); /* Scale may have changed */ wayl_reload_xcursor_theme(seat, term->scale); @@ -1145,7 +1145,8 @@ wl_pointer_leave(void *data, struct wl_pointer *wl_pointer, LOG_DBG( "%s: pointer-leave: pointer=%p, serial=%u, surface = %p, old-moused = %p", - seat->name, wl_pointer, serial, surface, old_moused); + seat->name, (void *)wl_pointer, serial, (void *)surface, + (void *)old_moused); seat->pointer.hidden = false; @@ -1170,7 +1171,7 @@ wl_pointer_leave(void *data, struct wl_pointer *wl_pointer, if (old_moused == NULL) { LOG_WARN( "compositor sent pointer_leave event without a pointer_enter " - "event: surface=%p", surface); + "event: surface=%p", (void *)surface); } else { if (surface != NULL) { /* Sway 1.4 sends this event with a NULL surface when we destroy the window */ @@ -1218,7 +1219,7 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer, struct terminal *term = seat->mouse_focus; struct wl_window *win = term->window; - LOG_DBG("pointer_motion: pointer=%p, x=%d, y=%d", wl_pointer, + LOG_DBG("pointer_motion: pointer=%p, x=%d, y=%d", (void *)wl_pointer, wl_fixed_to_int(surface_x), wl_fixed_to_int(surface_y)); assert(term != NULL); @@ -1353,7 +1354,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { LOG_DBG("BUTTON: pointer=%p, serial=%u, button=%x, state=%u", - wl_pointer, serial, button, state); + (void *)wl_pointer, serial, button, state); struct seat *seat = data; struct wayland *wayl = seat->wayl; diff --git a/shm.c b/shm.c index 587baa55..2b2c3435 100644 --- a/shm.c +++ b/shm.c @@ -116,7 +116,7 @@ static void buffer_release(void *data, struct wl_buffer *wl_buffer) { struct buffer *buffer = data; - LOG_DBG("release: cookie=%lx (buf=%p)", buffer->cookie, buffer); + LOG_DBG("release: cookie=%lx (buf=%p)", buffer->cookie, (void *)buffer); assert(buffer->wl_buf == wl_buffer); assert(buffer->busy); buffer->busy = false; @@ -208,7 +208,7 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie, assert(!it->item.busy); LOG_DBG("cookie=%lx: purging buffer %p (width=%d, height=%d): %zu KB", - cookie, &it->item, it->item.width, it->item.height, + cookie, (void *)&it->item, it->item.width, it->item.height, it->item.size / 1024); buffer_destroy(&it->item); @@ -225,7 +225,7 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie, if (!it->item.busy) { LOG_DBG("cookie=%lx: re-using buffer from cache (buf=%p)", - cookie, &it->item); + cookie, (void *)&it->item); it->item.busy = true; it->item.purge = false; assert(it->item.pix_instances == pix_instances); @@ -244,7 +244,7 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie, if (it->item.width == width && it->item.height == height) continue; - LOG_DBG("cookie=%lx: marking buffer %p for purging", cookie, &it->item); + LOG_DBG("cookie=%lx: marking buffer %p for purging", cookie, (void *)&it->item); it->item.purge = true; } diff --git a/sixel.c b/sixel.c index 89d74061..27441d8c 100644 --- a/sixel.c +++ b/sixel.c @@ -227,7 +227,7 @@ sixel_overwrite(struct terminal *term, struct sixel *six, assert(rel_right >= 0); LOG_DBG("SPLIT: six (%p): %dx%d-%dx%d, %dx%d-%dx%d, rel: above=%d, below=%d, left=%d, right=%d", - six, six->pos.row, six->pos.col, six->rows, six->cols, + (void *)six, six->pos.row, six->pos.col, six->rows, six->cols, row, col, height, width, rel_above, rel_below, rel_left, rel_right); From aa3985a298d7770ef780324adea3ba0fe75b4e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 09:37:51 +0200 Subject: [PATCH 4/8] Don't use "case X ... Y:", if possible/where it makes sense --- osc.c | 12 +++++++++--- sixel.c | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/osc.c b/osc.c index 20ceda8e..dcfaf524 100644 --- a/osc.c +++ b/osc.c @@ -339,9 +339,15 @@ static uint8_t nibble2hex(char c) { switch (c) { - case '0' ... '9': return c - '0'; - case 'a' ... 'f': return c - 'a' + 10; - case 'A' ... 'F': return c - 'A' + 10; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return c - '0'; + + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + return c - 'a' + 10; + + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + return c - 'A' + 10; } assert(false); diff --git a/sixel.c b/sixel.c index 27441d8c..c6fe1a10 100644 --- a/sixel.c +++ b/sixel.c @@ -668,7 +668,16 @@ decsixel(struct terminal *term, uint8_t c) term->sixel.pos.col = 0; break; - case '?'...'~': + case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': + case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': + case '[': case '\\': case ']': case '^': case '_': case '`': case 'a': + case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': + case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': + case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': + case '~': sixel_add(term, term->sixel.palette[term->sixel.color_idx], c - 63); break; @@ -687,7 +696,8 @@ static void decgra(struct terminal *term, uint8_t c) { switch (c) { - case '0'...'9': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': term->sixel.param *= 10; term->sixel.param += c - '0'; break; @@ -732,7 +742,8 @@ static void decgri(struct terminal *term, uint8_t c) { switch (c) { - case '0'...'9': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': term->sixel.param *= 10; term->sixel.param += c - '0'; break; @@ -750,7 +761,8 @@ static void decgci(struct terminal *term, uint8_t c) { switch (c) { - case '0'...'9': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': term->sixel.param *= 10; term->sixel.param += c - '0'; break; From 9db78c3122fd3dcd87c1b60ea41f3ad74ff227ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 09:38:37 +0200 Subject: [PATCH 5/8] vt: hide pedantic warnings around the VT state machine's switch cases The switch statements use the GCC extension "case X ... Y", and here it doesn't really make any sense to convert it to "case X: case Y:", so hide the warnings instead. --- vt.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/vt.c b/vt.c index 7485fa43..6b6bbd0b 100644 --- a/vt.c +++ b/vt.c @@ -734,6 +734,11 @@ action_utf8_44(struct terminal *term, uint8_t c) action_utf8_print(term, term->vt.utf8); } +#if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" +#endif + static enum state state_ground_switch(struct terminal *term, uint8_t data) { @@ -1256,6 +1261,10 @@ state_utf8_43_switch(struct terminal *term, uint8_t data) } } +#if defined(__GNUC__) + #pragma GCC diagnostic pop +#endif + void vt_from_slave(struct terminal *term, const uint8_t *data, size_t len) { From 74cf8e0206481394c4c75496467cca4b488fcbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 09:39:49 +0200 Subject: [PATCH 6/8] selection: don't do "return function_returning_void()" in functions returning void --- selection.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/selection.c b/selection.c index 9062c606..e34c971d 100644 --- a/selection.c +++ b/selection.c @@ -184,10 +184,12 @@ foreach_selected( { switch (term->selection.kind) { case SELECTION_NORMAL: - return foreach_selected_normal(term, start, end, cb, data); + foreach_selected_normal(term, start, end, cb, data); + return; case SELECTION_BLOCK: - return foreach_selected_block(term, start, end, cb, data); + foreach_selected_block(term, start, end, cb, data); + return; case SELECTION_NONE: assert(false); @@ -1059,7 +1061,8 @@ begin_receive_clipboard(struct terminal *term, int read_fd, { LOG_ERRNO("failed to set O_NONBLOCK"); close(read_fd); - return done(user); + done(user); + return; } struct clipboard_receive *ctx = xmalloc(sizeof(*ctx)); @@ -1082,14 +1085,17 @@ text_from_clipboard(struct seat *seat, struct terminal *term, void (*done)(void *user), void *user) { struct wl_clipboard *clipboard = &seat->clipboard; - if (clipboard->data_offer == NULL) - return done(user); + if (clipboard->data_offer == NULL) { + done(user); + return; + } /* Prepare a pipe the other client can write its selection to us */ int fds[2]; if (pipe2(fds, O_CLOEXEC) == -1) { LOG_ERRNO("failed to create pipe"); - return done(user); + done(user); + return; } int read_fd = fds[0]; @@ -1197,18 +1203,23 @@ text_from_primary( void (*cb)(const char *data, size_t size, void *user), void (*done)(void *user), void *user) { - if (term->wl->primary_selection_device_manager == NULL) - return done(user); + if (term->wl->primary_selection_device_manager == NULL) { + done(user); + return; + } struct wl_primary *primary = &seat->primary; - if (primary->data_offer == NULL) - return done(user); + if (primary->data_offer == NULL){ + done(user); + return; + } /* Prepare a pipe the other client can write its selection to us */ int fds[2]; if (pipe2(fds, O_CLOEXEC) == -1) { LOG_ERRNO("failed to create pipe"); - return done(user); + done(user); + return; } int read_fd = fds[0]; From a5e9ea7c28d1a59e80208226bfd65fcfd91e85cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 23 Aug 2020 09:49:15 +0200 Subject: [PATCH 7/8] meson: build with -pedantic --- meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index b5808ddc..07716979 100644 --- a/meson.build +++ b/meson.build @@ -18,7 +18,8 @@ add_project_arguments( ? ['-D_DEBUG'] : [cc.get_supported_arguments('-fno-asynchronous-unwind-tables')]) + cc.get_supported_arguments( - ['-fstrict-aliasing', + ['-pedantic', + '-fstrict-aliasing', '-Wstrict-aliasing']), language: 'c', ) From 8fb734715021e9e8905ae899bb8cf8409282e456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 25 Aug 2020 18:52:44 +0200 Subject: [PATCH 8/8] meson/pkgbuild: bump tllist requirement to 1.0.4 This is the first version of tllist that compiles with '-pedantic'. --- PKGBUILD | 2 +- meson.build | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index fefc4d60..b567ea80 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -4,7 +4,7 @@ pkgrel=1 arch=('x86_64' 'aarch64') url=https://codeberg.org/dnkl/foot license=(mit) -makedepends=('meson' 'ninja' 'scdoc' 'python' 'ncurses' 'wayland-protocols' 'tllist>=1.0.1') +makedepends=('meson' 'ninja' 'scdoc' 'python' 'ncurses' 'wayland-protocols' 'tllist>=1.0.4') depends=('libxkbcommon' 'wayland' 'pixman' 'fontconfig' 'fcft>=2.2.2') source=() diff --git a/meson.build b/meson.build index 07716979..d5b306a6 100644 --- a/meson.build +++ b/meson.build @@ -61,7 +61,7 @@ wayland_cursor = dependency('wayland-cursor') xkb = dependency('xkbcommon') fontconfig = dependency('fontconfig') -tllist = dependency('tllist', version: '>=1.0.1', fallback: 'tllist') +tllist = dependency('tllist', version: '>=1.0.4', fallback: 'tllist') fcft = dependency('fcft', version: ['>=2.2.2', '<3.0.0'], fallback: 'fcft') wayland_protocols_datadir = wayland_protocols.get_pkgconfig_variable('pkgdatadir')