diff --git a/include/memory.h b/include/memory.h index 287e42f..1818177 100644 --- a/include/memory.h +++ b/include/memory.h @@ -23,15 +23,19 @@ #ifndef UIRC_GUARD_PUBLIC_MEMORY #define UIRC_GUARD_PUBLIC_MEMORY +#ifdef UIRC_FEATURE_IRCV3 IRC_Tag* uirc_malloc_tag(const char* key, const char* value); IRC_Capability* uirc_malloc_capability(const char* name); -IRC_User* uirc_malloc_user(const char* nick, const char* user, const char* real, const char* host); -IRC_Message* uirc_malloc_message(const char* command, ...); -IRC_Buffer* uirc_malloc_buffer(const char* name, const char* topic, const char* key); -IRC_Network* uirc_malloc_network(const char* addr, const char* svc, const char* pass, const char* quitmsg); +#endif /* UIRC_FEATURE_IRCV3 */ +IRC_User* uirc_malloc_user(const char* nick, const char* user, const char* real, const char* host); +IRC_Message* uirc_malloc_message(const char* command, ...); +IRC_Buffer* uirc_malloc_buffer(const char* name, const char* topic, const char* key); +IRC_Network* uirc_malloc_network(const char* addr, const char* svc, const char* pass, const char* quitmsg); +#ifdef UIRC_FEATURE_IRCV3 void uirc_free_tag(IRC_Tag* t); void uirc_free_capability(IRC_Capability* c); +#endif /* UIRC_FEATURE_IRCV3 */ void uirc_free_user(IRC_User* u); void uirc_free_message(IRC_Message* m); void uirc_free_buffer(IRC_Buffer* b); diff --git a/src/assemblers/message.c b/src/assemblers/message.c index c60c16f..94b134e 100644 --- a/src/assemblers/message.c +++ b/src/assemblers/message.c @@ -79,14 +79,21 @@ uirc_assembler_message(char* buf, const IRC_Message* m, size_t len) for (unsigned int i = 0; i < IRC_MAXARGS && m->args[i] != NULL; i++) { 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) { + if ((ret = snprintf(buf, len, (i < IRC_MAXARGS - 1 && m->args[i + 1] == NULL && m->trailing) ? ":%s" : "%s ", m->args[i])) >= 0) { buf += (size_t) ret; len -= (size_t) ret; } else return -1; } assert(sv <= buf); - printf("%li\n", buf - sv); + + int ret; + if ((ret = snprintf(buf, len, "\r\n")) >= 0) { + buf += (size_t) ret; + len -= (size_t) ret; + } else + return -1; + assert(sv <= buf); return (ssize_t)(buf - sv); } diff --git a/src/tokenizers/message.c b/src/tokenizers/message.c index d4cd172..aeea449 100644 --- a/src/tokenizers/message.c +++ b/src/tokenizers/message.c @@ -35,9 +35,20 @@ uirc_tokenizer_message(const char* str) { assert(str != NULL); - IRC_Message* m = malloc(sizeof(IRC_Message)); - char* const ws = malloc_string(str, strlen(str)); - char* p = ws; + IRC_Message* m = malloc(sizeof(IRC_Message)); + + size_t len = strlen(str); + // Ignore CRLF at the end, irrelevant for parsing + // NOTE: len can be used directly as it's the lenght of the string without terminating null byte + // this is also the same as the last element in a array (off by one) + if (str[len] == '\n') { + len--; + if (str[len] == '\r') len--; + } + char* const ws = malloc_string(str, len); // NOTE: Some compilers might warn you about modifying contents of p because it points to ws which + // is "immutable". This is safe to ignore and it's purpose is to not use ws for tokenizing + + char* p = ws; if (ws == NULL || m == NULL) { free(ws); @@ -101,6 +112,7 @@ uirc_tokenizer_message(const char* str) } m->args[i] = NULL; } + free(ws); return m; }