shadowm

Untitled

Sep 4th, 2011
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.12 KB | None | 0 0
  1. irc_message_t* irc_parse_message(const char *raw)
  2. {
  3.     size_t raw_length = raw ? strlen(raw) : 0;
  4.  
  5.     if(!raw || !raw_length) {
  6.         return NULL;
  7.     }
  8.  
  9.     const char *p;
  10.     const char *d;
  11.  
  12.     char *arg;
  13.  
  14.     irc_message_t *m = irc_create_message();
  15.  
  16.     m->parv = zalloc(2 * sizeof(char*));
  17.     m->parc = 0;
  18.  
  19.     /* FIXME: maybe limit chunks to 512 characters? */
  20.  
  21.     p = raw;
  22.  
  23.     /* 1. Detect prefix */
  24.  
  25.     if(*p == ':') {
  26.         d = strchr(++p, ' ');
  27.         BUG_ON(!d);
  28.         m->sender = strleft(p, d - p);
  29.         p = ++d;
  30.         BUG_ON(!p);
  31.     }
  32.  
  33.     /* 2. Detect command/numeric string */
  34.  
  35.     d = strchr(p, ' ');
  36.     BUG_ON(!p);
  37.     m->command = m->parv[0] = strleft(p, d - p);
  38.     p = ++d;
  39.  
  40.     if(!p) {
  41.         /* FIXME: Command without arguments? */
  42.         BUG();
  43.         return m;
  44.     }
  45.  
  46.     /* 3. Detect and push arguments onto parv */
  47.  
  48.     while(p && *p) {
  49.         if(*p == ':') {
  50.             arg = strdup(++p);
  51.             p = NULL;
  52.         } else {
  53.             d = strchr(p, ' ');
  54.             arg = d ? strleft(p, d - p) : strdup(p);
  55.             p = d ? ++d : NULL;
  56.         }
  57.  
  58.         ++(m->parc);
  59.         m->parv = chkrealloc(m->parv, sizeof(char*) * (2 + m->parc));
  60.  
  61.         m->parv[m->parc] = arg;
  62.         m->parv[1 + m->parc] = NULL;
  63.     }
  64.  
  65.     return m;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment