tried to fix parse_lines
[NeonServV5.git] / IRCParser.c
1
2 #include "IRCParser.h"
3 #include "ClientSocket.h"
4
5 struct irc_cmd *irc_commands = NULL;
6
7 static void parse_line(struct ClientSocket *client, char *line);
8 static void register_irc_function(char *command, irc_cmd_t *func);
9 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc);
10
11 int parse_lines(struct ClientSocket *client, char *lines, int len) {
12     int i, startpos = 0;
13     for(i = 0; i < len; i++) {
14         if(lines[i] == '\r') //just zero it out :D
15             lines[i] = 0;
16         if(lines[i] == '\n') {
17             lines[i] = 0;
18             parse_line(client, lines);
19             lines += i-startpos;
20             startpos = i+1;
21         }
22     }
23     return startpos;
24 }
25
26 static void parse_line(struct ClientSocket *client, char *line) {
27     int i = 0, argc = 0;
28     char *argv[MAXNUMPARAMS];
29     printf("[recv %lu] %s\n", (unsigned long) strlen(line), line);
30     if(line[0] == ':')
31         i = 1;
32     else
33         argv[argc++] = NULL;
34     while(*line) {
35         //skip leading spaces
36         while (*line == ' ')
37             *line++ = 0;
38         if (*line == ':') {
39            //the rest is a single parameter
40            argv[argc++] = line + 1;
41         }
42         argv[argc++] = line;
43         if (argc >= MAXNUMPARAMS)
44             break;
45         while (*line != ' ' && *line)
46             line++;
47     }
48     if(argc >= 2) {
49         parse_raw(client, argv[0], argv[1], argv+2, argc-2);
50     }
51 }
52
53 static void register_irc_function(char *command, irc_cmd_t *func) {
54     struct irc_cmd *irc_cmd = malloc(sizeof(*irc_cmd));
55     if (!irc_cmd)
56     {
57         perror("malloc() failed");
58         return;
59     }
60     irc_cmd->cmd = command;
61     irc_cmd->func = func;
62     irc_cmd->next = irc_commands;
63     irc_commands = irc_cmd;
64 }
65
66 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
67     struct irc_cmd *irc_cmd;
68     for(irc_cmd = irc_commands; irc_cmd; irc_cmd = irc_cmd->next) {
69         if(!stricmp(irc_cmd->cmd, cmd)) {
70             irc_cmd->func(client, from, argv, argc);
71             break;
72         }
73     }
74 }
75
76 static IRC_CMD(raw_001) {
77     client->flags |= SOCKET_FLAG_READY;
78     putsock(client, "PRIVMSG Watchcat :hi");
79     return 1;
80 }
81
82 static IRC_CMD(raw_ping) {
83     if(argc == 0) return 0;
84     putsock(client, "POMG :%s", argv[0]);
85     return 1;
86 }
87
88 void parser_init() {
89     //all the raws we receive...
90     register_irc_function("001", raw_001);
91     register_irc_function("PING", raw_ping);
92 }