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