diff --git a/CMakeLists.txt b/CMakeLists.txt
index 56a7039..ea32a10 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -102,10 +102,15 @@ if(BUILD_DOCS)
find_package(Doxygen REQUIRED)
if (DOXYGEN_FOUND)
set(DOXYGEN_SOURCE_BROWSER YES)
- set(DOXYGEN_EXTRACT_ALL YES)
set(DOXYGEN_MACRO_EXPANSION YES)
+ set(DOXYGEN_EXPAND_ONLY_PREDEF YES)
+ set(DOXYGEN_PREDEFINED
+ "UIRC_HELPERS"
+ "UIRC_IRCV3"
+ )
doxygen_add_docs(docgen
- ${UIRC_HEADERS}
+ src/public
+ src/doc/main.doc
README.md
ALL
)
diff --git a/README.md b/README.md
index 382fe8f..8e9c0f9 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ Example for **make**:
make -C build
```
-You now should have the library built at `build/libuirc.so` *(or your build output path)*
+You now should have the library built at `build/libuirc.a` or `build/libuirc.so.VERSION`
## License
diff --git a/src/assemblers.c b/src/assemblers.c
index fdd56aa..42eba91 100644
--- a/src/assemblers.c
+++ b/src/assemblers.c
@@ -39,20 +39,20 @@ Assm_user(char* buf, IRC_User* in, size_t len, bool useorig)
assert(in != NULL);
char* pos = buf;
if (in->nick == NULL && in->host != NULL) {
- if (!safe_strcpy(&pos, in->host, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, in->host, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
} else if (in->nick != NULL) {
- if (!safe_strcpy(&pos, in->nick, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, in->nick, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
if (in->user != NULL) {
- if (!safe_charcpy(&pos, '!', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
- if (!safe_strcpy(&pos, in->user, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '!', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, in->user, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
if (useorig && in->orig != NULL) {
- if (!safe_charcpy(&pos, '%', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
- if (!safe_strcpy(&pos, in->orig, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '%', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, in->orig, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
if (in->host != NULL) {
- if (!safe_charcpy(&pos, '@', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
- if (!safe_strcpy(&pos, in->host, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '@', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, in->host, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
} else
return ERR_UIRC_INVALID_FORMAT;
@@ -74,17 +74,17 @@ Assm_tags(char* buf, IRC_Tags* in, size_t len)
for (unsigned int i = 0; i < sizeof(tagmps) / sizeof(struct tagmapping); i++) {
if ((*tagmps[i].assg).value != NULL) {
if (pos == buf) {
- if (!safe_charcpy(&pos, '@', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '@', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
} else {
- if (!safe_charcpy(&pos, ';', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, ';', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
if ((*tagmps[i].assg).clientbound) {
- if (!safe_charcpy(&pos, '+', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '+', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
- if (!safe_strcpy(&pos, tagmps[i].name, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, tagmps[i].name, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
if (*(*tagmps[i].assg).value != '\0') {
- if (!safe_charcpy(&pos, '=', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
- if (!safe_strcpy(&pos, (*tagmps[i].assg).value, len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, '=', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, (*tagmps[i].assg).value, len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
}
}
@@ -100,18 +100,18 @@ Assm_mesg(char* buf, IRC_Message* in, size_t len)
char* pos = buf;
signed long cnt, ret;
#ifdef UIRC_IRCV3
- if ((ret = Assm_tags(pos, &in->tags, len - (unsigned long) (pos - buf))) < 0) return ret;
+ if ((ret = Assm_tags(pos, &in->tags, len - (size_t)(pos - buf))) < 0) return ret;
else if (ret != 0) {
pos += ret;
- if (!safe_charcpy(&pos, ' ', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, ' ', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
#endif /* UIRC_IRCV3 */
if (in->name.nick != NULL || in->name.host != NULL) {
- if (!safe_charcpy(&pos, ':', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
- if ((ret = Assm_user(pos, &in->name, len - (unsigned long) (pos - buf), false)) <= 0) return ret;
+ if (!safe_charcpy(&pos, ':', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if ((ret = Assm_user(pos, &in->name, len - (size_t)(pos - buf), false)) <= 0) return ret;
else
pos += ret;
- if (!safe_charcpy(&pos, ' ', len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_charcpy(&pos, ' ', len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
}
if (in->cmd < UIRC_FCMD || in->cmd > UIRC_LCMD) {
if ((cnt = snprintf(pos, 4, "%.3i", in->cmd)) == 3) pos += cnt;
@@ -120,155 +120,152 @@ Assm_mesg(char* buf, IRC_Message* in, size_t len)
} else {
if (IRC_Cmds[in->cmd] != NULL) {
size_t cmdlen = strlen(IRC_Cmds[in->cmd]);
- if (len - (unsigned long) (pos - buf) > cmdlen && strcpy(pos, IRC_Cmds[in->cmd]) != NULL) pos += cmdlen;
+ if (len - (size_t)(pos - buf) > cmdlen && strcpy(pos, IRC_Cmds[in->cmd]) != NULL) pos += cmdlen;
else
return ERR_UIRC_UNKNOWN_TOKEN;
}
}
for (unsigned int i = 0; in->args[i] != NULL; i++) {
- if (len - (unsigned long) (pos - buf) > strlen(in->args[i]) + 2
- && (cnt =
- snprintf(pos, len - (unsigned long) (pos - buf), (in->args[i + 1] == NULL && in->trailing) ? " :%s" : " %s", in->args[i]))
- > 0)
+ if (len - (size_t)(pos - buf) > strlen(in->args[i]) + 2
+ && (cnt = snprintf(pos, len - (size_t)(pos - buf), (in->args[i + 1] == NULL && in->trailing) ? " :%s" : " %s", in->args[i])) > 0)
pos += cnt;
else
return ERR_UIRC_BUFFER_ERR;
}
- if (!safe_strcpy(&pos, "\r\n", len - (unsigned long) (pos - buf))) return ERR_UIRC_BUFFER_ERR;
+ if (!safe_strcpy(&pos, "\r\n", len - (size_t)(pos - buf))) return ERR_UIRC_BUFFER_ERR;
return pos - buf;
}
#ifdef UIRC_HELPERS
-static IRC_Message imassm_mesg;
#define RESERVED "*";
void
-clear_assm(void)
+clear_assm(IRC_Message* imassm_mesg)
{
- memset((void*) &imassm_mesg, '\0', sizeof(IRC_Message));
+ memset((void*) imassm_mesg, '\0', sizeof(IRC_Message));
}
IRC_Message*
-Assm_AUTO(IRC_Command cmd, bool trailing, char** args, int req)
+Assm_AUTO(IRC_Message* imassm_mesg, IRC_Command cmd, bool trailing, char** args, int req)
{
- clear_assm();
+ clear_assm(imassm_mesg);
int i;
- for (i = 0; args[i] != NULL && i < 15; i++) { imassm_mesg.args[i] = args[i]; }
+ for (i = 0; args[i] != NULL && i < 15; i++) { imassm_mesg->args[i] = args[i]; }
if (i < req) return NULL;
- imassm_mesg.trailing = trailing;
- imassm_mesg.cmd = cmd;
- return &imassm_mesg;
+ imassm_mesg->trailing = trailing;
+ imassm_mesg->cmd = cmd;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_USER(char* user, char* realname, int modes)
+Assm_cmd_USER(IRC_Message* imassm_mesg, char* user, char* realname, int modes)
{
if (user == NULL || modes < 0 || modes > (MBMASK_INVIS | MBMASK_WALLOPS)) return NULL;
- clear_assm();
+ clear_assm(imassm_mesg);
static char local_mode[2];
snprintf(local_mode, 2, "%i", modes);
- imassm_mesg.args[0] = user;
- imassm_mesg.args[1] = local_mode;
- imassm_mesg.args[2] = RESERVED;
- imassm_mesg.args[3] = realname;
- imassm_mesg.trailing = true;
- imassm_mesg.cmd = USER;
- return &imassm_mesg;
+ imassm_mesg->args[0] = user;
+ imassm_mesg->args[1] = local_mode;
+ imassm_mesg->args[2] = RESERVED;
+ imassm_mesg->args[3] = realname;
+ imassm_mesg->trailing = true;
+ imassm_mesg->cmd = USER;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_LINKS(char* remoteserv, char* servmask)
+Assm_cmd_LINKS(IRC_Message* imassm_mesg, char* remoteserv, char* servmask)
{
if (remoteserv != NULL && servmask == NULL) return NULL;
- clear_assm();
- imassm_mesg.args[0] = (remoteserv == NULL) ? servmask : remoteserv;
- imassm_mesg.args[1] = (remoteserv == NULL) ? NULL : servmask;
- imassm_mesg.cmd = LINKS;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = (remoteserv == NULL) ? servmask : remoteserv;
+ imassm_mesg->args[1] = (remoteserv == NULL) ? NULL : servmask;
+ imassm_mesg->cmd = LINKS;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_WHO(char* mask, bool oper)
+Assm_cmd_WHO(IRC_Message* imassm_mesg, char* mask, bool oper)
{
static char* operator= "o";
if (oper && mask == NULL) return NULL;
- clear_assm();
- imassm_mesg.args[0] = mask;
- imassm_mesg.args[1] = (oper) ? operator: NULL;
- imassm_mesg.cmd = WHO;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = mask;
+ imassm_mesg->args[1] = (oper) ? operator: NULL;
+ imassm_mesg->cmd = WHO;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_WHOIS(char* target, char* mask)
+Assm_cmd_WHOIS(IRC_Message* imassm_mesg, char* target, char* mask)
{
if (mask == NULL) return NULL;
- clear_assm();
- imassm_mesg.args[0] = (target == NULL) ? mask : target;
- imassm_mesg.args[1] = (target == NULL) ? NULL : mask;
- imassm_mesg.cmd = WHOIS;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = (target == NULL) ? mask : target;
+ imassm_mesg->args[1] = (target == NULL) ? NULL : mask;
+ imassm_mesg->cmd = WHOIS;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_WHOWAS(char* nick, char* count, char* target)
+Assm_cmd_WHOWAS(IRC_Message* imassm_mesg, char* nick, char* count, char* target)
{
if (nick == NULL || (target != NULL && count == NULL)) return NULL;
- clear_assm();
- imassm_mesg.args[0] = nick;
- imassm_mesg.args[1] = count;
- imassm_mesg.args[2] = target;
- imassm_mesg.cmd = WHOWAS;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = nick;
+ imassm_mesg->args[1] = count;
+ imassm_mesg->args[2] = target;
+ imassm_mesg->cmd = WHOWAS;
+ return imassm_mesg;
}
/* NOTE: This is what implementation you have to live with
* I would've just used the prefix to set the source but whatever
*/
IRC_Message*
-Assm_cmd_PING(char* source, char* target)
+Assm_cmd_PING(IRC_Message* imassm_mesg, char* source, char* target)
{
if (source == NULL && target == NULL) return NULL;
- clear_assm();
- imassm_mesg.args[0] = (source != NULL) ? source : target;
- imassm_mesg.args[1] = (source != NULL && target != NULL) ? target : NULL;
- imassm_mesg.trailing = (source != NULL && target == NULL) ? true : false;
- imassm_mesg.cmd = PING;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = (source != NULL) ? source : target;
+ imassm_mesg->args[1] = (source != NULL && target != NULL) ? target : NULL;
+ imassm_mesg->trailing = (source != NULL && target == NULL) ? true : false;
+ imassm_mesg->cmd = PING;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_SUMMON(char* user, char* target, char* channel)
+Assm_cmd_SUMMON(IRC_Message* imassm_mesg, char* user, char* target, char* channel)
{
if (user == NULL || (channel != NULL && target == NULL)) return NULL;
- clear_assm();
- imassm_mesg.args[0] = user;
- imassm_mesg.args[1] = target;
- imassm_mesg.args[2] = channel;
- imassm_mesg.cmd = SUMMON;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ imassm_mesg->args[0] = user;
+ imassm_mesg->args[1] = target;
+ imassm_mesg->args[2] = channel;
+ imassm_mesg->cmd = SUMMON;
+ return imassm_mesg;
}
IRC_Message*
-Assm_cmd_USERHOST(char* users[])
+Assm_cmd_USERHOST(IRC_Message* imassm_mesg, char* users[])
{
if (users[0] == NULL) return NULL;
- clear_assm();
- for (unsigned int i = 0; i < 5 && users[i] != NULL; i++) imassm_mesg.args[i] = users[i];
- imassm_mesg.cmd = USERHOST;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ for (unsigned int i = 0; i < 5 && users[i] != NULL; i++) imassm_mesg->args[i] = users[i];
+ imassm_mesg->cmd = USERHOST;
+ return imassm_mesg;
}
/* NOTE: Limited to 14 nicks per command */
IRC_Message*
-Assm_cmd_ISON(char* users[])
+Assm_cmd_ISON(IRC_Message* imassm_mesg, char* users[])
{
if (users[0] == NULL) return NULL;
- clear_assm();
- for (unsigned int i = 0; i < 14 && users[i] != NULL; i++) { imassm_mesg.args[i] = users[i]; }
- imassm_mesg.cmd = ISON;
- return &imassm_mesg;
+ clear_assm(imassm_mesg);
+ for (unsigned int i = 0; i < 14 && users[i] != NULL; i++) { imassm_mesg->args[i] = users[i]; }
+ imassm_mesg->cmd = ISON;
+ return imassm_mesg;
}
#endif /* UIRC_HELPERS */
diff --git a/src/doc/main.doc b/src/doc/main.doc
new file mode 100644
index 0000000..895b39f
--- /dev/null
+++ b/src/doc/main.doc
@@ -0,0 +1,30 @@
+/// ***************************************************************************
+/// @mainpage MicroIRC library
+///
+/// @section Core
+/// @subsection Assemblers
+/// Assemblers are a quick way to convert structs to a string representation
+///
+/// - \ref Assm_mesg
+/// - \ref Assm_user
+///
+/// @subsection Tokenizers
+/// Tokenizers tokenize and point struct elements to the matching substrings in the string given
+///
+/// - \ref Tok_mesg
+/// - \ref Tok_user
+///
+/// @section Additions
+///
+/// @subsection Validators
+/// - \ref Val_mesg
+///
+/// @subsection IRCv3
+/// @subsubsection Tags
+/// - \ref Assm_tags
+/// - \ref Tok_tags
+///
+/// @subsubsection Capabilities
+///
+///
+/// ***************************************************************************
diff --git a/src/public/assemblers.h b/src/public/assemblers.h
index 408982d..83fe88d 100644
--- a/src/public/assemblers.h
+++ b/src/public/assemblers.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#include "types.h"
#include
@@ -29,22 +31,29 @@ signed long Assm_user(char* buf, IRC_User* in, size_t len, bool useorig);
signed long Assm_tags(char* buf, IRC_Tags* in, size_t len);
#endif /* UIRC_IRCV3*/
+/*!
+ * \brief IRC_Message to string converter
+ *
+ * This assembles a IRC_Message struct to a string representation of a most size len
+ * The return value is either the lenght of the string or any of the uirc_errors errors
+ * \param[in] in IRC_Message struct that contains at least a command
+ * \param[in] len Maximum lenght of string
+ * \param[out] buf String representation of message (if successful)
+ * \warning in and buf SHOULD NOT be NULL, this will trigger a ASSERT so it's required to check it where needed
+ */
signed long Assm_mesg(char* buf, IRC_Message* in, size_t len);
#ifdef UIRC_HELPERS
-static IRC_Message imassm_mesg;
-void clear_assm(void);
-
-IRC_Message* Assm_AUTO(IRC_Command cmd, bool trailing, char** args, int req);
-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);
-IRC_Message* Assm_cmd_WHOIS(char* target, char* mask);
-IRC_Message* Assm_cmd_WHOWAS(char* nick, char* count, char* target);
-IRC_Message* Assm_cmd_PING(char* source, char* target);
-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[]);
+IRC_Message* Assm_AUTO(IRC_Message* imassm_mesg, IRC_Command cmd, bool trailing, char** args, int req);
+IRC_Message* Assm_cmd_USER(IRC_Message* imassm_mesg, char* user, char* realname, int modes);
+IRC_Message* Assm_cmd_LINKS(IRC_Message* imassm_mesg, char* remoteserv, char* servmask);
+IRC_Message* Assm_cmd_WHO(IRC_Message* imassm_mesg, char* mask, bool oper);
+IRC_Message* Assm_cmd_WHOIS(IRC_Message* imassm_mesg, char* target, char* mask);
+IRC_Message* Assm_cmd_WHOWAS(IRC_Message* imassm_mesg, char* nick, char* count, char* target);
+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)
diff --git a/src/public/capabilities.h b/src/public/capabilities.h
index 0333bb6..731af18 100644
--- a/src/public/capabilities.h
+++ b/src/public/capabilities.h
@@ -16,9 +16,18 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_CAPABILITIES
#define UIRC_GUARD_CAPABILITIES
+/*!
+ * \brief Converts capability to bitmask value
+ *
+ * \param[in] cap Capability bit from \link caps \endlink
+ */
+#define CAPBIT(cap) (1 << (cap))
+
/*!
* \brief List of capabilities to be used as a bitmask
*
@@ -26,34 +35,27 @@
* \sa https://ircv3.net/registry#capabilities
*/
enum caps {
- CAP_ACCOUNT_NOTIFY = 1,
- CAP_ACCOUNT_TAG = 2,
- CAP_AWAY_NOTIFY = 3,
- CAP_BATCH = 4,
- CAP_CAP_NOTIFY = 5,
- CAP_CHANNEL_RENAME = 6,
- CAP_CHGHOST = 7,
- CAP_ECHO_MESSAGE = 8,
- CAP_EXTENDED_JOIN = 9,
- CAP_INVITE_NOTIFY = 10,
- CAP_LABELED_RESPONSE = 11,
- CAP_MESSAGE_TAGS = 12,
- CAP_MONITOR = 13,
- CAP_MULTI_PREFIX = 14,
- CAP_MULTILINE = 15,
- CAP_SASL = 16,
- CAP_SERVER_TIME = 17,
- CAP_SETNAME = 18,
- CAP_TLS = 19,
- CAP_USERHOST_IN_NAMES = 20,
+ CAP_ACCOUNT_NOTIFY,
+ CAP_ACCOUNT_TAG,
+ CAP_AWAY_NOTIFY,
+ CAP_BATCH,
+ CAP_CAP_NOTIFY,
+ CAP_CHANNEL_RENAME,
+ CAP_CHGHOST,
+ CAP_ECHO_MESSAGE,
+ CAP_EXTENDED_JOIN,
+ CAP_INVITE_NOTIFY,
+ CAP_LABELED_RESPONSE,
+ CAP_MESSAGE_TAGS,
+ CAP_MONITOR,
+ CAP_MULTI_PREFIX,
+ CAP_MULTILINE,
+ CAP_SASL,
+ CAP_SERVER_TIME,
+ CAP_SETNAME,
+ CAP_TLS,
+ CAP_USERHOST_IN_NAMES,
};
-/*!
- * \brief Converts capability to bitmask value
- *
- * \param[in] cap Capability bit from \link caps \endlink
- */
-#define CAPBIT(cap) (1 << (cap))
-
#ifdef UIRC_HELPERS
/*!
* \brief Converts a string of capabilities to a bitmask
diff --git a/src/public/commands.h b/src/public/commands.h
index 7ac4b7f..030c3f5 100644
--- a/src/public/commands.h
+++ b/src/public/commands.h
@@ -16,36 +16,74 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_COMMANDS
#define UIRC_GUARD_COMMANDS
#define UIRC_FCMD ADMIN
+/*!
+ * \brief List of possible string commands
+ *
+ * This contains all the commands defined by RFC2812 (LIST, TIME, NAMES, QUIT ...) and extra ones defined by submodules
+ * It is used for mapping string commands to integers instead of storing them as strings
+ */
enum commands {
+ /*! Used to find information about the administrator of the given server, or current server */
ADMIN = 10,
+ /*! Clients can set an automatic reply string for any PRIVMSG commands directed at them */
AWAY,
+ /*! Used to request a server to try to establish a new connection to another server immediately */
CONNECT,
+ /*! Shutdown the server */
DIE,
+ /*! Used by servers when reporting a serious or fatal error to its peers */
ERROR,
+ /*! Return information describing the server */
INFO,
+ /*! Invite a user to a channel */
INVITE,
+ /*! Checks whether a given nickname is currently on IRC */
ISON,
+ /*! Request to start listening to the specific channel */
JOIN,
+ /*! Request the forced removal of a user from a channel */
KICK,
+ /*! Closes client-server connection */
KILL,
+ /*! List all servernames */
LINKS,
+ /*! List channels and their topics */
LIST,
+ /*! Get statistics about the size of the IRC network */
LUSERS,
+ /*! Query and change the characteristics of a channel */
MODE,
+ /*! Get the "Message Of The Day" of the given server */
MOTD,
+ /*! List all nicknames that are visible to him */
NAMES,
+ /*! Give user a nickname or change the existing one */
NICK,
+ /*! Similar to PRIVMSG but without automatic replies
+ * \sa PRIVMSG */
NOTICE,
+ /*! Obtain operator privileges */
OPER,
+ /*! User sending the message is removed from the list of active members */
PART,
+ /*! Set connection password */
PASS,
+ /*! Test the presence of an active client or server at the other end of the connection
+ * \sa PING */
PING,
+ /*! Reply to ping message
+ * \sa PONG */
PONG,
+ /*! Send private messages between users or channels
+ * \sa NOTICE */
PRIVMSG,
+ // TODO: Document the lines below
QUIT,
REHASH,
RESTART,
@@ -68,21 +106,36 @@ enum commands {
WHOIS,
WHOWAS,
#ifdef UIRC_IRCV3
- ACC, /* https://github.com/ircv3/ircv3-specifications/pull/276 */
- ACCOUNT, /* https://ircv3.net/specs/extensions/account-notify-3.1 */
- ACK, /* https://ircv3.net/specs/extensions/labeled-response */
- AUTHENTICATE, /* https://ircv3.net/specs/extensions/sasl-3.1 */
- BATCH, /* https://ircv3.net/specs/extensions/batch-3.2 */
- CAP, /* https://ircv3.net/specs/core/capability-negotiation */
- CHGHOST, /* https://ircv3.net/specs/extensions/chghost-3.2 */
- FAIL, /* https://ircv3.net/specs/extensions/standard-replies */
- MONITOR, /* https://ircv3.net/specs/core/monitor-3.2 */
- NOTE, /* https://ircv3.net/specs/extensions/standard-replies */
- RENAME, /* https://github.com/ircv3/ircv3-specifications/pull/420 */
- RESUME, /* https://github.com/ircv3/ircv3-specifications/pull/306 */
- SETNAME, /* https://ircv3.net/specs/extensions/setname */
- WARN, /* https://ircv3.net/specs/extensions/standard-replies */
- WEBIRC, /* https://ircv3.net/specs/extensions/webirc */
+ /*! \sa https://github.com/ircv3/ircv3-specifications/pull/276 */
+ ACC,
+ /*! \sa https://ircv3.net/specs/extensions/account-notify-3.1 */
+ ACCOUNT,
+ /*! \sa https://ircv3.net/specs/extensions/labeled-response */
+ ACK,
+ /*! \sa https://ircv3.net/specs/extensions/sasl-3.1 */
+ AUTHENTICATE,
+ /*! \sa https://ircv3.net/specs/extensions/batch-3.2 */
+ BATCH,
+ /*! \sa https://ircv3.net/specs/core/capability-negotiation */
+ CAP,
+ /*! \sa https://ircv3.net/specs/extensions/chghost-3.2 */
+ CHGHOST,
+ /*! \sa https://ircv3.net/specs/extensions/standard-replies */
+ FAIL,
+ /*! \sa https://ircv3.net/specs/core/monitor-3.2 */
+ MONITOR,
+ /*! \sa https://ircv3.net/specs/extensions/standard-replies */
+ NOTE,
+ /*! \sa https://github.com/ircv3/ircv3-specifications/pull/420 */
+ RENAME,
+ /*! \sa https://github.com/ircv3/ircv3-specifications/pull/306 */
+ RESUME,
+ /*! \sa https://ircv3.net/specs/extensions/setname */
+ SETNAME,
+ /*! \sa https://ircv3.net/specs/extensions/standard-replies */
+ WARN,
+ /*! \sa https://ircv3.net/specs/extensions/webirc */
+ WEBIRC,
#define UIRC_LCMD WEBIRC
#else /* UIRC_IRCV3 */
#define UIRC_LCMD WHOWAS
diff --git a/src/public/converters.h b/src/public/converters.h
index 522cd62..63f4135 100644
--- a/src/public/converters.h
+++ b/src/public/converters.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_CONVERTERS
#define UIRC_GUARD_CONVERTERS
diff --git a/src/public/errors.h b/src/public/errors.h
index cafd68a..beb04e7 100644
--- a/src/public/errors.h
+++ b/src/public/errors.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_ERRORS
#define UIRC_GUARD_ERRORS
diff --git a/src/public/modes.h b/src/public/modes.h
index ab62e5e..a67877c 100644
--- a/src/public/modes.h
+++ b/src/public/modes.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_MODES
#define UIRC_GUARD_MODES
diff --git a/src/public/replies.h b/src/public/replies.h
index af3b8e5..757a979 100644
--- a/src/public/replies.h
+++ b/src/public/replies.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#ifndef UIRC_GUARD_REPLIES
#define UIRC_GUARD_REPLIES
diff --git a/src/public/tags.h b/src/public/tags.h
index 687c6a9..13a8d98 100644
--- a/src/public/tags.h
+++ b/src/public/tags.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#include
#ifndef UIRC_GUARD_TAGS
diff --git a/src/public/tokenizers.h b/src/public/tokenizers.h
index 256904e..1e58c12 100644
--- a/src/public/tokenizers.h
+++ b/src/public/tokenizers.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#include "types.h"
#include
@@ -39,9 +41,9 @@ signed int Tok_tags(char* str, IRC_Tags* out);
* \brief Tokenize a IRC message source.
*
* This function takes the source part of a message, pointing struct elements to parts of it.
- * \param[in] str String containing a IRC source with or without the ':' prefix
+ * \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
+ * \param[in] useorig If '\%orig' should be considered in the parsing
*/
signed int Tok_user(char* str, IRC_User* out, bool useorig);
@@ -49,7 +51,7 @@ signed int Tok_user(char* str, IRC_User* out, bool useorig);
* \brief Tokenize a IRC message string.
*
* This function takes a IRC Message and attempts to tokenize/parse it, pointing every element found to it's respective struct element
- * \param[in] str String containing a IRC message without the ending '\\r\\n'
+ * \param[in] str String containing a IRC message without the ending '\\r\\n'
* \param[out] out Allocated IRC_Message structure
*/
signed int Tok_mesg(char* str, IRC_Message* out);
@@ -59,7 +61,7 @@ signed int Tok_mesg(char* str, IRC_Message* out);
* \brief A PING tokenizer/parser
*
* This function is a simple helper to get the source and target of a PING since the RFC has a "interesting" implementation
- * \param[in] mesg IRC_Message struct containing the PING message
+ * \param[in] mesg IRC_Message struct containing the PING message
* \param[out] source Source of the PING (server)
* \param[out] target Target of the PING (server or client)
*/
@@ -68,7 +70,7 @@ void Tok_cmd_PING(const IRC_Message* mesg, char** source, char** target);
* \brief Tokenizer for cases where the first argument is optional
*
* 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[in] mesg IRC_Message struct
* \param[out] optarg Optional argument if found or NULL
* \param[out] target Required argument
*/
diff --git a/src/public/types.h b/src/public/types.h
index ae9c18d..35fa1fc 100644
--- a/src/public/types.h
+++ b/src/public/types.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#include
#ifndef UIRC_GUARD_TYPES
diff --git a/src/public/validators.h b/src/public/validators.h
index 0b2e8c4..2608022 100644
--- a/src/public/validators.h
+++ b/src/public/validators.h
@@ -16,6 +16,8 @@
* along with uIRC. If not, see .
*/
+/*! \file */
+
#include "types.h"
#include
diff --git a/src/tokenizers.c b/src/tokenizers.c
index 64b506e..99065ef 100644
--- a/src/tokenizers.c
+++ b/src/tokenizers.c
@@ -81,7 +81,7 @@ Tok_user(char* str, IRC_User* out, bool useorig)
if (useorig && (out->orig = strchr(pos, '%')) != NULL) *(out->orig++) = '\0';
if ((out->user = strchr(pos, '!'))
!= NULL) /* RFC2812 says this cannot be here without the host but RFC1459 says it can, we accept both options */
- *((char*) out->user++) = '\0';
+ *(out->user++) = '\0';
if (!*(out->nick = pos)) return ERR_UIRC_INVALID_FORMAT;
/* NOTE: De-facto standard below
* This assumes that every prefix without a '@host' and '!user' is itself a host prefix only