Version 2021.01.24 - Fixes ahead

- Explicit types
- Fix compiler options
- Reformat some code
- Fix helper headers
This commit is contained in:
Alex D. 2021-01-24 15:22:51 +00:00
parent 2949d02516
commit 694d2ba105
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
8 changed files with 65 additions and 90 deletions

View File

@ -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()

View File

@ -32,6 +32,11 @@
#include <string.h>
#include <sys/types.h>
#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)
{

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -22,7 +22,7 @@
#include <time.h>
#ifdef UIRC_HELPERS
ssize_t
size_t
Assm_tag_timestamp(char* buf, size_t len, time_t time)
{
assert(buf != NULL);

View File

@ -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;
}

View File

@ -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