diff options
Diffstat (limited to 'message.c')
| -rw-r--r-- | message.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/message.c b/message.c new file mode 100644 index 0000000..f394ff7 --- /dev/null +++ b/message.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2026 Nakidai Perumenei <nakidai at disroot dot org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ircd.h" + +#include <stddef.h> +#include <string.h> + + +int +parse_message(char *buf, struct Message *msg) +{ + char *t, *next; + size_t i; + + memset(msg, 0, sizeof(*msg)); + + if (*buf == ':') + { + t = ++buf; + next = strchr(buf, ' '); + if (!next) + return 1; + *next++ = 0; + buf = next; + + next = strchr(t, '@'); + if (next) + { + *next++ = 0; + if (!*t) + return 1; + + msg->nick = t; + t = next; + + next = strchr(msg->nick, '!'); + if (next) + { + *next++ = 0; + if (!*msg->nick || !*next) + return 1; + msg->user = next; + } + } + if (!*t) + return 1; + msg->host = t; + } + + msg->command = buf; + t = strstr(buf, " :"); + if (t) + *((t += 2) - 2) = 0; + for (i = 0; i < PARAM_MAX - !!t; ++i, buf = next) + { + next = strchr(buf, ' '); + if (!next) + break; + *next++ = 0; + msg->params[i] = next; + } + if (strchr(buf, ' ')) + return 1; + if (t) + msg->params[i] = t; + return 0; +} |