1 /*
2  * channel grep feature
3  *
4  * written by Kraig Amador
5  */
6 
7 #include "irc.h"
8 #include "ircaux.h"
9 #include "grep.h"
10 #include "output.h"
11 #include "list.h"
12 #include "dma.h"
13 
14 #include "channels.h"
15 #include "ninja.h"
16 
17 ChanGrep *grep_list = (ChanGrep *) NULL;
18 
19 /*
20  * add/remove channel greps..
21  *
22  * this is intended to be called from edit.c
23  */
24 void
grep(u_char * command,u_char * args,u_char * subargs)25 grep(u_char *command, u_char *args, u_char *subargs)
26 {
27    ChanGrep *channel;
28    u_char *chan;
29 
30    if (!(args && *args) && grep_list)
31      {
32 	put_info("Channel grep list:");
33 	for (channel = grep_list; channel; channel = channel->next)
34 	   put_info("%s: %s",
35 	       channel->channel, channel->words);
36 	return;
37      }
38    else if (!(args && *args) && !grep_list)
39      {
40 	usage("grep", "[-]<channel> <mask1> ... <maskn>");
41 	return;
42      }
43    chan = next_arg(args, &args);
44    if (chan && *chan == '-')
45      {
46 	chan++;
47 	if (*chan)
48 	  {
49 	     channel = (ChanGrep *) find_in_list((List **)&grep_list, make_chan(chan), 0);
50 	     if (!channel)
51 	       {
52 		  put_info("%s is not in your channel grep list.", make_chan(chan));
53 		  return;
54 	       }
55 	     if ((channel = (ChanGrep *) remove_from_list((List **) & grep_list, make_chan(chan))) != NULL)
56 	       {
57 		  dma_Free(&channel->words);
58 		  dma_Free(&channel->channel);
59 		  dma_Free(&channel);
60 	       }
61 	     put_info("%s removed from your channel grep list.",
62 		 make_chan(chan));
63 	     return;
64 	  }
65 	else
66 	  {
67 	     usage("grep", "[-]<channel> <masks1> .. <maskn>");
68 	     return;
69 	  }
70      }
71    else
72      {
73 	channel = (ChanGrep *) find_in_list((List **)&grep_list, make_chan(chan), 0);
74 	if (!channel && args && *args)
75 	  {
76 	     channel = (ChanGrep *) dma_Malloc(sizeof(ChanGrep));
77 	     channel->channel = NULL;
78 	     channel->words = NULL;
79 	     dma_strcpy(&channel->channel, make_chan(chan));
80 	     dma_strcpy(&channel->words, args);
81 	     add_to_list((List **) & (grep_list), (List *) channel);
82 	     put_info("Grep list for %s is: %s", channel->channel, args);
83 	  }
84 	else if (!channel && !(args && *args))
85 	  {
86 	     put_info("%s is not in your channel grep list.", make_chan(chan));
87 	     return;
88 	  }
89 	else if (channel && args && *args)
90 	  {
91 	     dma_strcpy(&channel->words, args);
92 	     put_info("Grep list for %s is: %s",
93 		 channel->channel, args);
94 	  }
95 	else if (channel && !(args && *args))
96 	  {
97 	     put_info("Channel grep list:");
98 	     put_info("%s: %s",
99 		 channel->channel, channel->words);
100 	  }
101      }
102 }
103 
104 /*
105  * see if we are grep'n this channel and if so, see if it matches the grep(s)
106  * returns: 1 (print it)
107  *          0 (don't print it)
108  */
109 int
checkgrep(u_char * chan,u_char * line)110 checkgrep(u_char *chan, u_char *line)
111 {
112    ChanGrep *channel;
113    u_char *ptr, *ptr2 = NULL, *ptr2_free, tmpbuf[1024], tmp2buf[1024];
114 
115    channel = (ChanGrep *) find_in_list((List **)&grep_list, chan, 0);
116    if (channel && !line)
117       return 0;
118    if (!channel)
119       return 1;
120    strncpy(tmpbuf, line, sizeof(tmpbuf)-1);
121    dma_strcpy(&ptr2, channel->words);
122    ptr2_free = ptr2;
123    while ((ptr = my_strsep(&ptr2, " ")))
124      {
125 	if (*ptr)
126 	  {
127 	     snprintf(tmp2buf, sizeof(tmp2buf)-1, "*%s*", ptr);
128 	     if (match(tmp2buf, tmpbuf))
129 	       {
130 		  dma_Free(&ptr2_free);
131 		  return 1;
132 	       }
133 	  }
134      }
135    dma_Free(&ptr2_free);
136    return 0;
137 }
138 
139