From 694d2ba1059398e16fa0fb4b54f7e9068f4173da Mon Sep 17 00:00:00 2001 From: Alex Denes Date: Sun, 24 Jan 2021 15:22:51 +0000 Subject: [PATCH] Version 2021.01.24 - Fixes ahead - Explicit types - Fix compiler options - Reformat some code - Fix helper headers --- CMakeLists.txt | 36 +++-------------- src/assemblers.c | 7 +++- src/public/assemblers.h | 90 ++++++++++++++++++++--------------------- src/public/tags.h | 2 +- src/public/tokenizers.h | 3 +- src/tags.c | 2 +- src/tests/capbitmask.c | 7 ++-- src/validators.c | 8 ++-- 8 files changed, 65 insertions(+), 90 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ea32a10..468b804 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.16) project( uIRC - VERSION 2021.01.04 + VERSION 2021.01.24 DESCRIPTION "Simple and lightweight IRC protocol helper" LANGUAGES C ) @@ -122,40 +122,14 @@ add_library(uirc ${UIRC_SOURCE}) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Werror") if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - add_compile_options( - -Wall - -Wextra - -Wformat-overflow=2 - -Wformat-security - -Winit-self - -Wstrict-overflow=2 - -Wstringop-overflow=2 - -Walloc-zero - -Wduplicated-branches - -Wduplicated-cond - -Wtrampolines - -Wfloat-equal - -Wshadow - -Wunsafe-loop-optimizations - -Wparentheses - -fstack-check - -pedantic - ) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat-overflow=2 -Wformat-security -Winit-self -Wstrict-overflow=2 -Wstringop-overflow=2 -Walloc-zero -Wduplicated-branches -Wduplicated-cond -Wtrampolines -Wfloat-equal -Wshadow -Wunsafe-loop-optimizations -Wparentheses -fstack-check -pedantic") if (CODE_ANALYZER) - add_compile_options(-fanalyzer) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fanalyzer") endif() elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") - add_compile_options( - -Weverything - -Wno-padded - -Wno-disabled-macro-expansion - -pedantic - ) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Weverything -Wno-padded -Wno-disabled-macro-expansion -pedantic") if (CODE_COVERAGE) - add_compile_options(-fprofile-instr-generate -fcoverage-mapping) - endif() - if (CODE_ANALYZER) - add_compile_options(--analyze) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-instr-generate -fcoverage-mapping") endif() endif() diff --git a/src/assemblers.c b/src/assemblers.c index 42eba91..0bff421 100644 --- a/src/assemblers.c +++ b/src/assemblers.c @@ -32,6 +32,11 @@ #include #include +#ifdef UIRC_HELPERS +#define RESERVED "*" +void clear_assm(IRC_Message* imassm_mesg); +#endif /* UIRC_HELPERS */ + signed long Assm_user(char* buf, IRC_User* in, size_t len, bool useorig) { @@ -138,8 +143,6 @@ Assm_mesg(char* buf, IRC_Message* in, size_t len) #ifdef UIRC_HELPERS -#define RESERVED "*"; - void clear_assm(IRC_Message* imassm_mesg) { diff --git a/src/public/assemblers.h b/src/public/assemblers.h index 83fe88d..7167d85 100644 --- a/src/public/assemblers.h +++ b/src/public/assemblers.h @@ -54,66 +54,66 @@ IRC_Message* Assm_cmd_PING(IRC_Message* imassm_mesg, char* source, char* target) IRC_Message* Assm_cmd_SUMMON(IRC_Message* imassm_mesg, char* user, char* target, char* channel); IRC_Message* Assm_cmd_USERHOST(IRC_Message* imassm_mesg, char* users[]); IRC_Message* Assm_cmd_ISON(IRC_Message* imassm_mesg, char* users[]); -#endif /* UIRC_HELPERS */ -#define Assm_cmd_REHASH() Assm_AUTO(REHASH, false, (char*[]) { NULL }, 0) -#define Assm_cmd_DIE() Assm_AUTO(DIE, false, (char*[]) { NULL }, 0) -#define Assm_cmd_RESTART() Assm_AUTO(RESTART, false, (char*[]) { NULL }, 0) +#define Assm_cmd_REHASH(mesg) Assm_AUTO(mesg, REHASH, false, (char*[]) { NULL }, 0) +#define Assm_cmd_DIE(mesg) Assm_AUTO(mesg, DIE, false, (char*[]) { NULL }, 0) +#define Assm_cmd_RESTART(mesg) Assm_AUTO(mesg, RESTART, false, (char*[]) { NULL }, 0) -#define Assm_cmd_QUIT(message) Assm_AUTO(QUIT, true, (char*[]) { message, NULL }, 0) -#define Assm_cmd_MOTD(target) Assm_AUTO(MOTD, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_VERSION(target) Assm_AUTO(VERSION, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_TIME(target) Assm_AUTO(TIME, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_TRACE(target) Assm_AUTO(TRACE, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_ADMIN(target) Assm_AUTO(ADMIN, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_INFO(target) Assm_AUTO(INFO, false, (char*[]) { target, NULL }, 0) -#define Assm_cmd_AWAY(message) Assm_AUTO(AWAY, false, (char*[]) { message, NULL }, 0) +#define Assm_cmd_QUIT(mesg, message) Assm_AUTO(mesg, QUIT, true, (char*[]) { message, NULL }, 0) +#define Assm_cmd_MOTD(mesg, target) Assm_AUTO(mesg, MOTD, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_VERSION(mesg, target) Assm_AUTO(mesg, VERSION, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_TIME(mesg, target) Assm_AUTO(mesg, TIME, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_TRACE(mesg, target) Assm_AUTO(mesg, TRACE, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_ADMIN(mesg, target) Assm_AUTO(mesg, ADMIN, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_INFO(mesg, target) Assm_AUTO(mesg, INFO, false, (char*[]) { target, NULL }, 0) +#define Assm_cmd_AWAY(mesg, message) Assm_AUTO(mesg, AWAY, false, (char*[]) { message, NULL }, 0) -#define Assm_cmd_PASS(password) Assm_AUTO(PASS, true, (char*[]) { password, NULL }, 1) -#define Assm_cmd_ERROR(message) Assm_AUTO(ERROR, true, (char*[]) { message, NULL }, 1) -#define Assm_cmd_WALLOPS(text) Assm_AUTO(WALLOPS, true, (char*[]) { text, NULL }, 1) -#define Assm_cmd_NICK(nickname) Assm_AUTO(NICK, false, (char*[]) { nickname, NULL }, 1) -#define Assm_cmd_USERS(target) Assm_AUTO(USERS, false, (char*[]) { target, NULL }, 1) +#define Assm_cmd_PASS(mesg, password) Assm_AUTO(mesg, PASS, true, (char*[]) { password, NULL }, 1) +#define Assm_cmd_ERROR(mesg, message) Assm_AUTO(mesg, ERROR, true, (char*[]) { message, NULL }, 1) +#define Assm_cmd_WALLOPS(mesg, text) Assm_AUTO(mesg, WALLOPS, true, (char*[]) { text, NULL }, 1) +#define Assm_cmd_NICK(mesg, nickname) Assm_AUTO(mesg, NICK, false, (char*[]) { nickname, NULL }, 1) +#define Assm_cmd_USERS(mesg, target) Assm_AUTO(mesg, USERS, false, (char*[]) { target, NULL }, 1) -#define Assm_cmd_NAMES(channels, target) Assm_AUTO(NAMES, false, (char*[]) { channels, target, NULL }, 0) -#define Assm_cmd_LIST(channels, target) Assm_AUTO(LIST, false, (char*[]) { channels, target, NULL }, 0) -#define Assm_cmd_LUSERS(mask, target) Assm_AUTO(LUSERS, false, (char*[]) { mask, target, NULL }, 0) -#define Assm_cmd_STATS(query, target) Assm_AUTO(STATS, false, (char*[]) { query, target, NULL }, 0) -#define Assm_cmd_SERVLIST(mask, type) Assm_AUTO(SERVLIST, false, (char*[]) { mask, type, NULL }, 0) +#define Assm_cmd_NAMES(mesg, channels, target) Assm_AUTO(mesg, NAMES, false, (char*[]) { channels, target, NULL }, 0) +#define Assm_cmd_LIST(mesg, channels, target) Assm_AUTO(mesg, LIST, false, (char*[]) { channels, target, NULL }, 0) +#define Assm_cmd_LUSERS(mesg, mask, target) Assm_AUTO(mesg, LUSERS, false, (char*[]) { mask, target, NULL }, 0) +#define Assm_cmd_STATS(mesg, query, target) Assm_AUTO(mesg, STATS, false, (char*[]) { query, target, NULL }, 0) +#define Assm_cmd_SERVLIST(mesg, mask, type) Assm_AUTO(mesg, SERVLIST, false, (char*[]) { mask, type, NULL }, 0) -#define Assm_cmd_JOIN(channels, keys) Assm_AUTO(JOIN, false, (char*[]) { channels, keys, NULL }, 1) -#define Assm_cmd_PART(channel, message) Assm_AUTO(PART, false, (char*[]) { channel, message, NULL }, 1) -/* NOTE: Use a non-NULL address (pointing at a "\0") as the topic to clear it and use a NULL address to check it +#define Assm_cmd_JOIN(mesg, channels, keys) Assm_AUTO(mesg, JOIN, false, (char*[]) { channels, keys, NULL }, 1) +#define Assm_cmd_PART(mesg, channel, message) Assm_AUTO(mesg, PART, false, (char*[]) { channel, message, NULL }, 1) +/* NOTE: Use a non-NULL address (mesg, pointing at a "\0") as the topic to clear it and use a NULL address to check it * Blame the protocol, not this >:C */ -#define Assm_cmd_TOPIC(channel, topic) Assm_AUTO(TOPIC, true, (char*[]) { channel, topic, NULL }, 1) -#define Assm_cmd_PONG(source, target) Assm_AUTO(PONG, true, (char*[]) { source, target, NULL }, 1) +#define Assm_cmd_TOPIC(mesg, channel, topic) Assm_AUTO(mesg, TOPIC, true, (char*[]) { channel, topic, NULL }, 1) +#define Assm_cmd_PONG(mesg, source, target) Assm_AUTO(mesg, PONG, true, (char*[]) { source, target, NULL }, 1) -#define Assm_cmd_OPER(name, password) Assm_AUTO(OPER, true, (char*[]) { name, password, NULL }, 2) -#define Assm_cmd_SQUIT(server, comment) Assm_AUTO(SQUIT, true, (char*[]) { server, comment, NULL }, 2) -#define Assm_cmd_PRIVMSG(target, message) Assm_AUTO(PRIVMSG, true, (char*[]) { target, message, NULL }, 2) -#define Assm_cmd_NOTICE(target, text) Assm_AUTO(NOTICE, true, (char*[]) { target, text, NULL }, 2) -#define Assm_cmd_SQUERY(servicename, text) Assm_AUTO(SQUERY, true, (char*[]) { servicename, text, NULL }, 2) -#define Assm_cmd_KILL(nick, comment) Assm_AUTO(KILL, true, (char*[]) { nick, comment, NULL }, 2) -#define Assm_cmd_INVITE(nick, channel) Assm_AUTO(INVITE, false, (char*[]) { nick, channel, NULL }, 2) +#define Assm_cmd_OPER(mesg, name, password) Assm_AUTO(mesg, OPER, true, (char*[]) { name, password, NULL }, 2) +#define Assm_cmd_SQUIT(mesg, server, comment) Assm_AUTO(mesg, SQUIT, true, (char*[]) { server, comment, NULL }, 2) +#define Assm_cmd_PRIVMSG(mesg, target, message) Assm_AUTO(mesg, PRIVMSG, true, (char*[]) { target, message, NULL }, 2) +#define Assm_cmd_NOTICE(mesg, target, text) Assm_AUTO(mesg, NOTICE, true, (char*[]) { target, text, NULL }, 2) +#define Assm_cmd_SQUERY(mesg, servicename, text) Assm_AUTO(mesg, SQUERY, true, (char*[]) { servicename, text, NULL }, 2) +#define Assm_cmd_KILL(mesg, nick, comment) Assm_AUTO(mesg, KILL, true, (char*[]) { nick, comment, NULL }, 2) +#define Assm_cmd_INVITE(mesg, nick, channel) Assm_AUTO(mesg, INVITE, false, (char*[]) { nick, channel, NULL }, 2) -#define Assm_cmd_MODE(nickname, modes, modeparams) Assm_AUTO(MODE, false, (char*[]) { nickname, modes, modeparams, NULL }, 1) +#define Assm_cmd_MODE(mesg, nickname, modes, modeparams) Assm_AUTO(mesg, MODE, false, (char*[]) { nickname, modes, modeparams, NULL }, 1) -#define Assm_cmd_KICK(channels, users, comment) Assm_AUTO(KICK, true, (char*[]) { channels, users, comment, NULL }, 2) -#define Assm_cmd_CONNECT(target, port, remote) Assm_AUTO(CONNECT, false, (char*[]) { target, port, remote, NULL }, 2) +#define Assm_cmd_KICK(mesg, channels, users, comment) Assm_AUTO(mesg, KICK, true, (char*[]) { channels, users, comment, NULL }, 2) +#define Assm_cmd_CONNECT(mesg, target, port, remote) Assm_AUTO(mesg, CONNECT, false, (char*[]) { target, port, remote, NULL }, 2) -#define Assm_cmd_SERVICE(nickname, distribution, type, info) \ - Assm_AUTO(SERVICE, true, (char*[]) { nickname, RESERVED, distribution, "0", RESERVED, info, NULL }, 6) +#define Assm_cmd_SERVICE(mesg, nickname, distribution, type, info) \ + Assm_AUTO(mesg, SERVICE, true, (char*[]) { nickname, RESERVED, distribution, "0", RESERVED, info, NULL }, 6) #ifdef UIRC_IRCV3 -#define Assm_cmd_CAP_END() Assm_AUTO(CAP, false, (char*[]) { "END", NULL }, 0) -#define Assm_cmd_CAP_LIST() Assm_AUTO(CAP, false, (char*[]) { "LIST", NULL }, 0) +#define Assm_cmd_CAP_END(mesg) Assm_AUTO(mesg, CAP, false, (char*[]) { "END", NULL }, 0) +#define Assm_cmd_CAP_LIST(mesg) Assm_AUTO(mesg, CAP, false, (char*[]) { "LIST", NULL }, 0) -#define Assm_cmd_CAP_LS(version) Assm_AUTO(CAP, false, (char*[]) { "LS", version, NULL }, 0) -#define Assm_cmd_CAP_REQ(caps) Assm_AUTO(CAP, true, (char*[]) { "REQ", caps, NULL }, 1) +#define Assm_cmd_CAP_LS(mesg, version) Assm_AUTO(mesg, CAP, false, (char*[]) { "LS", version, NULL }, 0) +#define Assm_cmd_CAP_REQ(mesg, caps) Assm_AUTO(mesg, CAP, true, (char*[]) { "REQ", caps, NULL }, 1) -#define Assm_cmd_CAP_NEW(nick, caps) Assm_AUTO(CAP, true, (char*[]) { "NEW", nick, caps, NULL }, 2) -#define Assm_cmd_CAP_DEL(nick, caps) Assm_AUTO(CAP, true, (char*[]) { "DEL", nick, caps, NULL }, 2) +#define Assm_cmd_CAP_NEW(mesg, nick, caps) Assm_AUTO(mesg, CAP, true, (char*[]) { "NEW", nick, caps, NULL }, 2) +#define Assm_cmd_CAP_DEL(mesg, nick, caps) Assm_AUTO(mesg, CAP, true, (char*[]) { "DEL", nick, caps, NULL }, 2) #endif /* UIRC_IRCV3 */ +#endif /* UIRC_HELPERS */ #endif /* UIRC_GUARD_ASSEMBLERS */ diff --git a/src/public/tags.h b/src/public/tags.h index 13a8d98..72fc4ce 100644 --- a/src/public/tags.h +++ b/src/public/tags.h @@ -24,7 +24,7 @@ #define UIRC_GUARD_TAGS #ifdef UIRC_HELPERS -ssize_t Assm_tag_timestamp(char* buf, size_t len, time_t time); +size_t Assm_tag_timestamp(char* buf, size_t len, time_t time); #endif /* UIRC_HELPERS */ #endif /* UIRC_GUARD_TAGS */ diff --git a/src/public/tokenizers.h b/src/public/tokenizers.h index 1e58c12..adaba1c 100644 --- a/src/public/tokenizers.h +++ b/src/public/tokenizers.h @@ -32,7 +32,6 @@ * This function parses IRCv3 tags according to the specification at * \param[in] str String containing a IRC source with or without the ':' prefix * \param[out] out Allocated IRC_User structure - * \param[in] useorig If '\%orig' should be considered in the parsing */ signed int Tok_tags(char* str, IRC_Tags* out); #endif /* UIRC_IRCV3 */ @@ -72,7 +71,7 @@ void Tok_cmd_PING(const IRC_Message* mesg, char** source, char** target); * This function is a private helper for cases where the first argument might be missing but the second isn't * \param[in] mesg IRC_Message struct * \param[out] optarg Optional argument if found or NULL - * \param[out] target Required argument + * \param[out] reqarg Required argument */ void Tok_FArgOpt(const IRC_Message* mesg, char** optarg, char** reqarg); #endif /* UIRC_HELPERS */ diff --git a/src/tags.c b/src/tags.c index 5f473ac..66ea48d 100644 --- a/src/tags.c +++ b/src/tags.c @@ -22,7 +22,7 @@ #include #ifdef UIRC_HELPERS -ssize_t +size_t Assm_tag_timestamp(char* buf, size_t len, time_t time) { assert(buf != NULL); diff --git a/src/tests/capbitmask.c b/src/tests/capbitmask.c index b1d179f..756c286 100644 --- a/src/tests/capbitmask.c +++ b/src/tests/capbitmask.c @@ -25,13 +25,12 @@ int main(void) { - int temp = 0; char wcps[] = "multi-prefix sasl"; - if ((temp = Tok_CAPS(wcps)) != (CAPBIT(CAP_MULTI_PREFIX) | CAPBIT(CAP_SASL))) return EXIT_FAILURE; + if ((Tok_CAPS(wcps)) != (CAPBIT(CAP_MULTI_PREFIX) | CAPBIT(CAP_SASL))) return EXIT_FAILURE; char multicaps[] = "sasl echo-message echo-message"; - if ((temp = Tok_CAPS(multicaps)) != (CAPBIT(CAP_ECHO_MESSAGE) | CAPBIT(CAP_SASL))) return EXIT_FAILURE; + if ((Tok_CAPS(multicaps)) != (CAPBIT(CAP_ECHO_MESSAGE) | CAPBIT(CAP_SASL))) return EXIT_FAILURE; char nocaps[] = "random-cap unknown-cap wow"; - if ((temp = Tok_CAPS(nocaps)) != 0) return EXIT_FAILURE; + if ((Tok_CAPS(nocaps)) != 0) return EXIT_FAILURE; return EXIT_SUCCESS; } diff --git a/src/validators.c b/src/validators.c index 1b32152..59bd700 100644 --- a/src/validators.c +++ b/src/validators.c @@ -33,7 +33,7 @@ Val_type_nocrlf(const char* str) for (; *str; str++) { if (*str == '\r' || *str == '\n') return 0; } - return str - save; + return (size_t)(str - save); } size_t @@ -44,7 +44,7 @@ Val_type_nospcl(const char* str) for (; *str; str++) { if (*str == ' ' || *str == ':') return 0; } - return str - save; + return (size_t)(str - save); } size_t @@ -55,7 +55,7 @@ Val_type_noblcm(const char* str) for (; *str; str++) { if (*str == '\a' || *str == ',') return 0; } - return str - save; + return (size_t)(str - save); } size_t @@ -75,7 +75,7 @@ Val_channame(char* chan) chan = ++clps; } if (Val_type_nospcl(chan) != 1 || Val_type_nocrlf(chan) != 1 || Val_type_noblcm(chan) != 1) return 0; - return save - chan; + return (size_t)(save - chan); } // TODO: Work on the logic for this