Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

irc parser in c

Name: Anonymous 2011-06-18 19:24

I've been writting an irc bot in c but I'm stuck trying to parse the irc buffer into an array.

here's my connecting function:


void connecting(int sockfd)
{
        char buf[MAX], temp[MAX];

        while(1)
        {
                recv(sockfd, buf, sizeof(buf), 0);

                printf("%s", buf);

                if (strstr(buf, "Checking Ident") != NULL)
                {
                        sprintf(temp, "USER something something something :something\r\n");
                        send(sockfd, temp, strlen(temp), 0);

                        sprintf(temp, "NICK %s\r\n", NICK);
                        send(sockfd, temp, strlen(temp), 0);

                        sprintf(temp, "JOIN %s\r\n", CHAN);
                        send(sockfd, temp, strlen(temp), 0);
}

                if (strstr(buf, ":!hi"))
                {
                        sprintf(temp, "PRIVMSG %s :Hi bitch\r\n", CHAN);
                        send(sockfd, temp, strlen(temp), 0);
                }


Could somebody write a parse for me or help me out?

Name: Anonymous 2011-06-18 19:51

Use (ir)regular expressions:
(Understanding the regexps and the code and converting it to C is left as an exercise for the reader)

(define nick-regex #px":([][\\`_^{}|[:alpha:]-][][\\`_^{}|[:alnum:]-]*)(?:!([^\\s!@]+))?(?:@([^\\s]+))?")
(define server-regex
#px":(?:(?:[[:alnum:]]+(?:\\.[[:alnum:]-]+)+)|(?:\\d{,3}\\.\\d{,3}\\.\\d{,3}\\.\\d{,3})|(?:(?:[[:xdigit:]]?(?::[[:xdigit:]]?)+)|(?:0:0:0:0:0:(?:0|FFFF):\\d{3}\\.\\d{3}\\.\\d{3}\\.\\d{3})))")
(define message-regex #px"^(?:(:[[:graph:]]+) )?([[:alpha:]]+|[0-9]{3})(?: ((?:[^:\0\\s]\\S* ?){,14}))?(:[^\0\r\n]*)?\r?\n?$")

(struct irc-message (sender command params text))

(define (parse-nick x)
  (cdr (regexp-match nick-regex x)))
(define (parse-server x)
  (regexp-match server-regex x))

(define (parse-sender s)
  (cond ((not s) #f)
        ((or (parse-server s)
             (parse-nick s)) => values)
        (else (error "invalid sender" s))))

(define (parse-message x)
  (regexp-match message-regex x))

(define (make-irc-message s)
  (let ((x (parse-message s)))
    (unless x (error "invalid irc message" s))
    (let ((sender (parse-sender (list-ref x 1)))
          (params (filter (λ (x) (not (string=? "" x))) (regexp-split #rx" " (list-ref x 3))))
          (text (list-ref x 4)))
      (irc-message sender (list-ref x 2)
                   params (and text (substring text 1))))))

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List