Housekeeping and namespacing, adding CAP tokenizers and another test for it, change versioning to recommended date versioning

This commit is contained in:
Alex D. 2020-10-31 11:56:48 +01:00
parent 65161f128c
commit 2718dff738
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
15 changed files with 107 additions and 100 deletions

View File

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

View File

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

View File

@ -16,8 +16,8 @@
* along with uIRC. If not, see <https://www.gnu.org/licenses/>.
*/
#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

View File

@ -23,6 +23,6 @@
#ifndef UIRC_INCLUDED
#define UIRC_INCLUDED
#define UIRC_VERSION 0.6
#define UIRC_VERSION 20203110
#endif

View File

@ -23,8 +23,8 @@
#include <string.h>
#include <time.h>
#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

View File

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

View File

@ -24,61 +24,13 @@
#include <string.h>
#include <time.h>
#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

View File

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

View File

@ -21,8 +21,8 @@
#include <stdio.h>
#include <string.h>
#ifndef UIRC_INCLUDED_MISC
#define UIRC_INCLUDED_MISC
#ifndef UIRC_INCLUDED_PRIVATE_MISC
#define UIRC_INCLUDED_PRIVATE_MISC
#ifdef UIRC_IRCV3
struct tagmapping {

View File

@ -22,8 +22,8 @@
#include <time.h>
#include <unistd.h>
#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

View File

@ -24,8 +24,8 @@
#include <stdlib.h>
#include <string.h>
#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

View File

@ -21,14 +21,12 @@
#include <stdio.h>
#include <string.h>
#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

View File

@ -20,5 +20,6 @@ if ( BUILD_IRCV3 )
buildtest(TagAssembler tagassm)
if ( BUILD_HELPERS )
buildtest(TimestampAssembly timestamp)
buildtest(TagBitMaskTknzr capbitmask)
endif()
endif()

17
tests/capbitmask.c Normal file
View File

@ -0,0 +1,17 @@
#include "../include/uirc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

View File

@ -1,4 +1,3 @@
#define UIRC_HELPERS
#include "../include/uirc.h"
#include <stdio.h>
#include <stdlib.h>