Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- irc_message_t* irc_parse_message(const char *raw)
- {
- size_t raw_length = raw ? strlen(raw) : 0;
- if(!raw || !raw_length) {
- return NULL;
- }
- const char *p;
- const char *d;
- char *arg;
- irc_message_t *m = irc_create_message();
- m->parv = zalloc(2 * sizeof(char*));
- m->parc = 0;
- /* FIXME: maybe limit chunks to 512 characters? */
- p = raw;
- /* 1. Detect prefix */
- if(*p == ':') {
- d = strchr(++p, ' ');
- BUG_ON(!d);
- m->sender = strleft(p, d - p);
- p = ++d;
- BUG_ON(!p);
- }
- /* 2. Detect command/numeric string */
- d = strchr(p, ' ');
- BUG_ON(!p);
- m->command = m->parv[0] = strleft(p, d - p);
- p = ++d;
- if(!p) {
- /* FIXME: Command without arguments? */
- BUG();
- return m;
- }
- /* 3. Detect and push arguments onto parv */
- while(p && *p) {
- if(*p == ':') {
- arg = strdup(++p);
- p = NULL;
- } else {
- d = strchr(p, ' ');
- arg = d ? strleft(p, d - p) : strdup(p);
- p = d ? ++d : NULL;
- }
- ++(m->parc);
- m->parv = chkrealloc(m->parv, sizeof(char*) * (2 + m->parc));
- m->parv[m->parc] = arg;
- m->parv[1 + m->parc] = NULL;
- }
- return m;
- }
Advertisement
Add Comment
Please, Sign In to add comment