From 2718dff738dbcb0c2b212178740ce57e6ad68cc4 Mon Sep 17 00:00:00 2001 From: Alex Denes Date: Sat, 31 Oct 2020 11:56:48 +0100 Subject: [PATCH] Housekeeping and namespacing, adding CAP tokenizers and another test for it, change versioning to recommended date versioning --- CMakeLists.txt | 1 + include/helpers.h | 1 + include/mappings.h | 55 +++++++++++++++++++++---------------- include/uirc.h | 2 +- src/assemblers.h | 4 +-- src/helpers.c | 17 ++++++++++++ src/helpers.h | 65 ++------------------------------------------ src/misc.c | 25 +++++++++++++++++ src/misc.h | 4 +-- src/taghelpers.h | 4 +-- src/tokenizers.h | 4 +-- src/validators.h | 6 ++-- tests/CMakeLists.txt | 1 + tests/capbitmask.c | 17 ++++++++++++ tests/timestamp.c | 1 - 15 files changed, 107 insertions(+), 100 deletions(-) create mode 100644 tests/capbitmask.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 90e2382..6665eaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ set(build_FILES if ( BUILD_HELPERS ) message(STATUS "Helper functions are going to be built.") set(build_FILES ${build_FILES} src/helpers.c) + add_compile_definitions(UIRC_HELPERS) if ( BUILD_IRCV3 ) set(build_FILES ${build_FILES} src/taghelpers.c) endif() diff --git a/include/helpers.h b/include/helpers.h index 2064d9e..2b0d005 100644 --- a/include/helpers.h +++ b/include/helpers.h @@ -85,6 +85,7 @@ extern IRC_Message* Assm_cmd_ISON(char* users[]); extern void Tok_cmd_PING(IRC_Message* mesg, char* source, char* target); extern void Tok_FArgOpt(IRC_Message* mesg, char** optarg, char** reqarg); +extern int Tok_CAPS(char* caps); #ifdef UIRC_IRCV3 #define Assm_cmd_CAP_END() Assm_AUTO(CAP, false, (char*[]){"END", NULL}, 0) diff --git a/include/mappings.h b/include/mappings.h index 068a6d1..ea1d64a 100644 --- a/include/mappings.h +++ b/include/mappings.h @@ -16,8 +16,8 @@ * along with uIRC. If not, see . */ -#ifndef UIRC_INCLUDED_ENUMS -#define UIRC_INCLUDED_ENUMS +#ifndef UIRC_INCLUDED_MAPS +#define UIRC_INCLUDED_MAPS #define ERR_UIRC_GENERIC -1 #define ERR_UIRC_NULL_ARGS -2 @@ -27,32 +27,34 @@ #define ERR_UIRC_VAL_FAILED -10 /* Mode bitmask values */ -#define MBMASK_WALLOPS 2 /* 010 */ -#define MBMASK_INVIS 4 /* 100 */ +#define MBMASK_WALLOPS 1 << 1 /* 010 */ +#define MBMASK_INVIS 1 << 2 /* 100 */ -/* IRCv3 Supported features bitmask */ +/* IRCv3 Supported features bits */ #ifdef UIRC_IRCV3 -#define CAP_AWAY_NOTIFY 1 << 3 -#define CAP_BATCH 1 << 4 -#define CAP_CAP_NOTIFY 1 << 5 -#define CAP_CHGHOST 1 << 6 -#define CAP_ECHO_MESSAGE 1 << 7 -#define CAP_EXTENDED_JOIN 1 << 8 -#define CAP_INVITE_NOTIFY 1 << 9 -#define CAP_LABELED_RESPONSE 1 << 10 -#define CAP_MESSAGE_TAGS 1 << 11 -#define CAP_MONITOR 1 << 12 -#define CAP_MULTI_PREFIX 1 << 13 -#define CAP_MULTILINE 1 << 14 -#define CAP_SASL 1 << 15 -#define CAP_SERVER_TIME 1 << 16 -#define CAP_SETNAME 1 << 17 -#define CAP_TLS 1 << 18 -#define CAP_USERHOST_IN_NAMES 1 << 19 +#define CAP_ACCOUNT_NOTIFY 1 +#define CAP_ACCOUNT_TAG 2 +#define CAP_AWAY_NOTIFY 3 +#define CAP_BATCH 4 +#define CAP_CAP_NOTIFY 5 +#define CAP_CHANNEL_RENAME 6 +#define CAP_CHGHOST 7 +#define CAP_ECHO_MESSAGE 8 +#define CAP_EXTENDED_JOIN 9 +#define CAP_INVITE_NOTIFY 10 +#define CAP_LABELED_RESPONSE 11 +#define CAP_MESSAGE_TAGS 12 +#define CAP_MONITOR 13 +#define CAP_MULTI_PREFIX 14 +#define CAP_MULTILINE 15 +#define CAP_SASL 16 +#define CAP_SERVER_TIME 17 +#define CAP_SETNAME 18 +#define CAP_TLS 19 +#define CAP_USERHOST_IN_NAMES 20 +#define CAPBIT(cap) (1 << cap) #endif -extern const char* const IRC_Cmds[]; - #define UIRC_FCMD ADMIN enum commands { ADMIN = 10, @@ -285,3 +287,8 @@ enum commands { #endif +extern const char* const IRC_Cmds[UIRC_LCMD + UIRC_FCMD]; +#ifdef UIRC_IRCV3 +extern const char* const IRC_v3_Caps[CAP_USERHOST_IN_NAMES + 1]; +#endif + diff --git a/include/uirc.h b/include/uirc.h index 414d159..01c4ca5 100644 --- a/include/uirc.h +++ b/include/uirc.h @@ -23,6 +23,6 @@ #ifndef UIRC_INCLUDED #define UIRC_INCLUDED -#define UIRC_VERSION 0.6 +#define UIRC_VERSION 20203110 #endif diff --git a/src/assemblers.h b/src/assemblers.h index a774127..89bf67f 100644 --- a/src/assemblers.h +++ b/src/assemblers.h @@ -23,8 +23,8 @@ #include #include -#ifndef UIRC_INCLUDED_ASSM -#define UIRC_INCLUDED_ASSM +#ifndef UIRC_INCLUDED_PRIVATE_ASSM +#define UIRC_INCLUDED_PRIVATE_ASSM signed long Assm_mesg(char* buf, IRC_Message* in, size_t len); #ifdef UIRC_IRCV3 diff --git a/src/helpers.c b/src/helpers.c index 426cc51..a3b6132 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -146,3 +146,20 @@ void Tok_FArgOpt(IRC_Message* mesg, char** optarg, char** reqarg) *reqarg = (mesg->args[1] != NULL) ? mesg->args[1] : mesg->args[0]; } +int Tok_CAPS(char* caps) +{ + int temp = 0; + char* cur = NULL; + if ((cur = strtok(caps, " ")) != NULL) { + do { + for (int i = 1; (unsigned long)i < (sizeof(IRC_v3_Caps) / sizeof(*IRC_v3_Caps)); i++) { + if (strcmp(IRC_v3_Caps[i], cur) == 0) { + temp |= CAPBIT(i); + break; + } + } + } while ((cur = strtok(NULL, " ")) != NULL); + } + return temp; +} + diff --git a/src/helpers.h b/src/helpers.h index 4b4d068..84bf1f2 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -24,61 +24,13 @@ #include #include -#ifndef UIRC_INCLUDED_ASSM -#define UIRC_INCLUDED_ASSM +#ifndef UIRC_INCLUDED_PRIVATE_HELPERS +#define UIRC_INCLUDED_PRIVATE_HELPERS extern char* RESERVED; void clear_assm(void); IRC_Message* Assm_AUTO(IRC_Command cmd, bool trailing, char** args, int req); -#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_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_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_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) - -/* NOTE: Use a non-NULL address (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_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) - -#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_MODE(nickname, modes, modeparams) Assm_AUTO(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_SERVICE(nickname, distribution, type, info) \ - Assm_AUTO(SERVICE, true, (char*[]){nickname, RESERVED, distribution, "0", RESERVED, info, NULL}, 6) - IRC_Message* Assm_cmd_USER(char* user, char* realname, int modes); IRC_Message* Assm_cmd_LINKS(char* remoteserv, char* servmask); IRC_Message* Assm_cmd_WHO(char* mask, bool oper); @@ -89,19 +41,8 @@ IRC_Message* Assm_cmd_SUMMON(char* user, char* target, char* channel); IRC_Message* Assm_cmd_USERHOST(char* users[]); IRC_Message* Assm_cmd_ISON(char* users[]); -#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_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_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) -#endif - - void Tok_cmd_PING(IRC_Message* mesg, char** source, char** target); void Tok_FArgOpt(IRC_Message* mesg, char** optarg, char** reqarg); +int Tok_CAPS(char* caps); #endif diff --git a/src/misc.c b/src/misc.c index ea3604a..54587fa 100644 --- a/src/misc.c +++ b/src/misc.c @@ -37,6 +37,31 @@ const char* const IRC_Cmds[] = {[ADMIN] = "ADMIN", [AWAY] = "AWAY", [C #endif }; +#ifdef UIRC_IRCV3 +const char* const IRC_v3_Caps[] = { + [CAP_ACCOUNT_NOTIFY] = "account-notify", + [CAP_ACCOUNT_TAG] = "account-tag", + [CAP_AWAY_NOTIFY] = "away-notify", + [CAP_BATCH] = "batch", + [CAP_CAP_NOTIFY] = "cap-notify", + [CAP_CHANNEL_RENAME] = "channel-rename", + [CAP_CHGHOST] = "chghost", + [CAP_ECHO_MESSAGE] = "echo-message", + [CAP_EXTENDED_JOIN] = "extended-join", + [CAP_INVITE_NOTIFY] = "invite-notify", + [CAP_LABELED_RESPONSE] = "labeled-response", + [CAP_MESSAGE_TAGS] = "message-tags", + [CAP_MONITOR] = "monitor", + [CAP_MULTI_PREFIX] = "multi-prefix", + [CAP_MULTILINE] = "multiline", + [CAP_SASL] = "sasl", + [CAP_SERVER_TIME] = "server-time", + [CAP_SETNAME] = "setname", + [CAP_TLS] = "tls", + [CAP_USERHOST_IN_NAMES] = "userhost-in-names", +}; +#endif + signed short Ircmd_stoi(char* str) { if (str == NULL) return ERR_UIRC_NULL_ARGS; diff --git a/src/misc.h b/src/misc.h index 39e67e3..a9d8793 100644 --- a/src/misc.h +++ b/src/misc.h @@ -21,8 +21,8 @@ #include #include -#ifndef UIRC_INCLUDED_MISC -#define UIRC_INCLUDED_MISC +#ifndef UIRC_INCLUDED_PRIVATE_MISC +#define UIRC_INCLUDED_PRIVATE_MISC #ifdef UIRC_IRCV3 struct tagmapping { diff --git a/src/taghelpers.h b/src/taghelpers.h index a04e5fe..6bf36d5 100644 --- a/src/taghelpers.h +++ b/src/taghelpers.h @@ -22,8 +22,8 @@ #include #include -#ifndef UIRC_INCLUDED_TAGASSM -#define UIRC_INCLUDED_TAGASSM +#ifndef UIRC_INCLUDED_PRIVATE_TAGHELPERS +#define UIRC_INCLUDED_PRIVATE_TAGHELPERS size_t Assm_tag_timestamp(char* buf, size_t len, time_t time); #endif diff --git a/src/tokenizers.h b/src/tokenizers.h index 3d9c9e8..5f8cbdc 100644 --- a/src/tokenizers.h +++ b/src/tokenizers.h @@ -24,8 +24,8 @@ #include #include -#ifndef UIRC_INCLUDED_TKNIZ -#define UIRC_INCLUDED_TKNIZ +#ifndef UIRC_INCLUDED_PRIVATE_TKNIZ +#define UIRC_INCLUDED_PRIVATE_TKNIZ signed int Tok_mesg(char* str, IRC_Message* out); #ifdef UIRC_IRCV3 diff --git a/src/validators.h b/src/validators.h index e77920e..14163a8 100644 --- a/src/validators.h +++ b/src/validators.h @@ -21,14 +21,12 @@ #include #include -#ifdef UIRC_VALIDATORS -#ifndef UIRC_INCLUDED_VALIDATORS -#define UIRC_INCLUDED_VALIDATORS +#ifndef UIRC_INCLUDED_PRIVATE_VALIDATORS +#define UIRC_INCLUDED_PRIVATE_VALIDATORS signed int Val_mesg(IRC_Message* mesg); signed int Val_type_nocrlf(char* str); signed int Val_type_nospcl(char* str); signed int Val_type_noblcm(char* str); signed int Val_channame(char* chan); #endif -#endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f6b717f..a592a13 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -20,5 +20,6 @@ if ( BUILD_IRCV3 ) buildtest(TagAssembler tagassm) if ( BUILD_HELPERS ) buildtest(TimestampAssembly timestamp) + buildtest(TagBitMaskTknzr capbitmask) endif() endif() diff --git a/tests/capbitmask.c b/tests/capbitmask.c new file mode 100644 index 0000000..e7a4515 --- /dev/null +++ b/tests/capbitmask.c @@ -0,0 +1,17 @@ +#include "../include/uirc.h" +#include +#include +#include + +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; + char multicaps[] = "sasl echo-message echo-message"; + if ((temp = 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; + return EXIT_SUCCESS; +} + diff --git a/tests/timestamp.c b/tests/timestamp.c index 88545e0..be7dc57 100644 --- a/tests/timestamp.c +++ b/tests/timestamp.c @@ -1,4 +1,3 @@ -#define UIRC_HELPERS #include "../include/uirc.h" #include #include