diff --git a/CMakeLists.txt b/CMakeLists.txt index f139cf4..a7c22cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,6 @@ set(UIRC_SOURCE set(UIRC_HEADERS src/uirc.h src/ctcp.h - src/errors.h src/modes.h src/replies.h src/types.h diff --git a/src/assemblers/assemblers.h b/src/assemblers/assemblers.h index 4356068..fea5d11 100644 --- a/src/assemblers/assemblers.h +++ b/src/assemblers/assemblers.h @@ -20,16 +20,18 @@ #include "../types.h" // IRC_User IRC_Message -#include // bool -#include // size_t +#include // llist_t +#include // bool +#include // ssize_t ssize_t #ifndef UIRC_GUARD_PUBLIC_ASSEMBLERS #define UIRC_GUARD_PUBLIC_ASSEMBLERS -signed long uirc_assembler_user(char* buf, IRC_User* u, size_t len); +ssize_t uirc_assembler_user(char* buf, const IRC_User* u, size_t len); #ifdef UIRC_FEATURE_IRCV3 -signed long uirc_assembler_tag(char* buf, const IRC_Tag* t, size_t len); +ssize_t uirc_assembler_tag(char* buf, const IRC_Tag* t, size_t len); +ssize_t uirc_assembler_tag_list(char* buf, const llist_t* t, size_t len); #endif /* UIRC_FEATURE_IRCV3*/ /*! @@ -42,6 +44,6 @@ signed long uirc_assembler_tag(char* buf, const IRC_Tag* t, size_t len); * \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 uirc_assembler_message(char* buf, IRC_Message* m, size_t len); +ssize_t uirc_assembler_message(char* buf, const IRC_Message* m, size_t len); #endif /* UIRC_GUARD_PUBLIC_ASSEMBLERS */ diff --git a/src/assemblers/message.c b/src/assemblers/message.c index 6d3bb0c..2629fcc 100644 --- a/src/assemblers/message.c +++ b/src/assemblers/message.c @@ -16,65 +16,40 @@ * along with uIRC. If not, see . */ -#include "../errors.h" // ERR_UIRC_* -#include "../types.h" // IRC_Message -#include "assemblers.h" // Assm_mesg() Assm_tags() Assm_user() +#include "../types.h" // IRC_Message IRC_Tag IRC_User +#include "assemblers.h" // uirc_assembler_* #include // assert() -#include // false #include // NULL, snprintf() -#include // strlen() #include // size_t -signed long -uirc_assembler_message(char* buf, IRC_Message* m, size_t len) +ssize_t +uirc_assembler_message(char* buf, const IRC_Message* m, size_t len) { assert(buf != NULL); assert(m != NULL); - char* const sv = buf; - signed long ret; + const char* const sv = buf; #ifdef UIRC_FEATURE_IRCV3 - if (m->tag_list != NULL && m->tag_list->content != NULL) { - for (llist_t* l = m->tag_list; l != NULL && l->content != NULL && ((IRC_Tag*) l->content)->key != NULL;) { - if (m->tag_list == l) { - if (len > 1) { - *(buf++) = '@'; - len--; - } else - return UIRC_ERR_BUFFER_FULL; - } else { - if (len > 1) { - *(buf++) = ';'; - len--; - } else - return UIRC_ERR_BUFFER_FULL; - } - - if ((ret = uirc_assembler_tag(buf, l->content, len)) >= 0) { - buf += (size_t) ret; - len -= (size_t) ret; - } else - return ret; - - if ((l = l->next) == NULL) { - if (len > 1) { - *(buf++) = ' '; - len--; - } else - return UIRC_ERR_BUFFER_FULL; - } - } + if (m->tag_list != NULL) { + ssize_t ret; + if ((ret = uirc_assembler_tag_list(buf, m->tag_list, len)) >= 0) { + buf += (size_t) ret; + len -= (size_t) ret; + } else + return ret; } + assert(sv <= buf); #endif /* UIRC_FEATURE_IRCV3 */ if (m->source != NULL && (m->source->nick != NULL || m->source->host != NULL)) { if (len > 1) { *(buf++) = ':'; len--; } else - return UIRC_ERR_BUFFER_FULL; + return -1; + ssize_t ret; if ((ret = uirc_assembler_user(buf, m->source, len)) >= 0) { buf += (size_t) ret; len -= (size_t) ret; @@ -85,28 +60,34 @@ uirc_assembler_message(char* buf, IRC_Message* m, size_t len) *(buf++) = ' '; len--; } else - return UIRC_ERR_BUFFER_FULL; + return -1; } + assert(sv <= buf); if (m->command != NULL) { - if (len < 2) return UIRC_ERR_BUFFER_FULL; + if (len < 2) return -1; + int ret; if ((ret = snprintf(buf, len, "%s ", m->command)) >= 0) { buf += (size_t) ret; len -= (size_t) ret; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } else - return UIRC_ERR_INVALID_FORMAT; + return -1; + assert(sv <= buf); for (unsigned int i = 0; i < IRC_MAXARGS && m->args[i] != NULL; i++) { - if (len < 2) return UIRC_ERR_BUFFER_FULL; + if (len < 2) return -1; + int ret; if ((ret = snprintf(buf, len, (i + 1 == IRC_MAXARGS || (m->args[i + 1] == NULL && m->trailing)) ? ":%s" : "%s ", m->args[i])) >= 0) { buf += (size_t) ret; len -= (size_t) ret; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } + assert(sv <= buf); + printf("%li\n", buf - sv); - return (buf += ret) - sv; + return (ssize_t)(buf - sv); } diff --git a/src/assemblers/tag.c b/src/assemblers/tag.c index 5b42455..2daba4e 100644 --- a/src/assemblers/tag.c +++ b/src/assemblers/tag.c @@ -16,49 +16,88 @@ * along with uIRC. If not, see . */ -#include "../errors.h" // ERR_UIRC_* #include "../types.h" // IRC_Tag -#include "assemblers.h" // Assm_user() +#include "assemblers.h" // uirc_assembler_tag_* -#include // assert() -#include // bool -#include // size_t -#include // NULL +#include // assert() +#include // llist_t +#include // NULL +#include // size_t ssize_t -signed long +ssize_t uirc_assembler_tag(char* buf, const IRC_Tag* t, size_t len) { - assert(buf != NULL); assert(t != NULL); + assert(buf != NULL); assert(t->key != NULL); - char* const sv = buf; - int res; + const char* const sv = buf; + int res; if (t->clientbound) { if (len > 1) { *(buf++) = '+'; len--; } else - return UIRC_ERR_BUFFER_FULL; + return -1; } - if (len < 1) return UIRC_ERR_BUFFER_FULL; + if (len < 1) return -1; if ((res = snprintf(buf, len, "%s", t->key)) >= 0) { buf += (size_t) res; len -= (size_t) res; } else - return UIRC_ERR_BUFFER_ERR; + return -1; if (t->value != NULL) { - if (len < 1) return UIRC_ERR_BUFFER_FULL; + if (len < 1) return -1; if ((res = snprintf(buf, len, "=%s", t->value)) >= 0) { buf += (size_t) res; len -= (size_t) res; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } return buf - sv; } +ssize_t +uirc_assembler_tag_list(char* buf, const llist_t* tl, size_t len) +{ + assert(tl != NULL); + assert(buf != NULL); + + const char* const sv = buf; + for (; tl->content != NULL && ((IRC_Tag*) tl->content)->key != NULL;) { + if (buf == sv) { + if (len > 1) { + *(buf++) = '@'; + len--; + } else + return -1; + } else { + if (len > 1) { + *(buf++) = ';'; + len--; + } else + return -1; + } + + ssize_t ret; + if ((ret = uirc_assembler_tag(buf, tl->content, len)) >= 0) { + buf += (size_t) ret; + len -= (size_t) ret; + } else + return -1; + + if ((tl = tl->next) == NULL) { + if (len > 1) { + *(buf++) = ' '; + len--; + } else + return -1; + break; + } + } + return buf - sv; +} diff --git a/src/assemblers/user.c b/src/assemblers/user.c index 2c6f188..fc4e256 100644 --- a/src/assemblers/user.c +++ b/src/assemblers/user.c @@ -16,48 +16,50 @@ * along with uIRC. If not, see . */ -#include "../errors.h" // ERR_UIRC_* #include "../types.h" // IRC_User #include "assemblers.h" // Assm_user() #include // assert() #include // bool -#include // NULL +#include // NULL snprintf() #include // size_t -signed long -uirc_assembler_user(char* buf, IRC_User* u, size_t len) +ssize_t +uirc_assembler_user(char* buf, const IRC_User* u, size_t len) { assert(buf != NULL); assert(u != NULL); - ssize_t res; char* const sv = buf; if (u->nick != NULL) { - if (len < 1) return UIRC_ERR_BUFFER_FULL; + if (len < 1) return -1; + int res; if ((res = snprintf(buf, len, "%s", u->nick)) >= 0) { buf += (size_t) res; len -= (size_t) res; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } if (u->user != NULL) { - if (len < 1) return UIRC_ERR_BUFFER_FULL; + if (len < 1) return -1; + int res; if ((res = snprintf(buf, len, "!%s", u->user)) >= 0) { buf += (size_t) res; len -= (size_t) res; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } if (u->host != NULL) { - if (len < 1) return UIRC_ERR_BUFFER_FULL; + if (len < 1) return -1; + int res; if ((res = snprintf(buf, len, (u->nick != NULL || u->user != NULL) ? "@%s" : "%s", u->host)) >= 0) { buf += (size_t) res; len -= (size_t) res; } else - return UIRC_ERR_BUFFER_ERR; + return -1; } + return buf - sv; }