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