From: "Thomas Arp" <t_arp@stofanet.dk>
> From: "Templar Viper" <templarviper@HOTMAIL.COM>
> > A while ago, I fixed this code together. It checks the argument for
> > cursing (placed in curse_list), and replaces it with a harmless beep. I
> > had to use str_strr, as strstr isn't case sensitive. However, I want to
> > ignore certain characters, such as spaces, full stops and more of those.
>
> I'm a bit unclear on your intent here;
> Do you wish to make sure to catch "CUR SE", too? Or do you mean you have
> 'multiword' curse words ?
Yes, I do want to catch "CUR SE".
> Regardless, your code has a few drawbacks. First, it's slow. The
> implementation
> below will cost something like O(N*N*N*M), where N is the number of words
in
> the curse word list, and M is the length if the string to check.
> Considering that you can have curse word file with perhaps 100+ entries,
> this
> amounts to a lot of cpu time.
>
> Secondly, if you try to catch 'split' curse words, like above, be aware
that
> you'll get a lot of false positives from 'assistent', 'damnation',
> 'as said before', and so on. My example below will remove whitespace
before
> the
> search.
Actually, I made this code with the intent to remove more offensive/sexual
based
cursings. Check the xname file to see what I mean. I don't care about an ass
or
damn every once in a while, but I want the more serious words being beeped
out.
I don't think I will get a lot of false positives, as long as I'm checking
for the really
bad ones :)
> Here's what I suggest:
> download Stephen R. van den Berg's strcasestr() implementation from
>
http://www.uclibc.org/cgi-bin/cvsweb/*checkout*/uClibc/libc/string/Attic/strstr.c?rev=1.6&hideattic=0
> strcasestr() does what your str_strr code does, just at O(N*M), instead of
> O(N*(M*N)) - be aware that strlen() is an expensive function timewise.
Ok, there's one problem - What should VAL() be defined as? Does it compare
ascii values?
> Then, change your code a bit, depending on what you meant above:
>
> > Here is the function:
> >
> > int wordok(char *argument, bool call)
> > {
> > int i;
> > char temp[MAX_INPUT_LENGTH];
> char *p = argument, *q = temp;
> >
> > /* return valid if list doesn't exist */
> > if (!argument || curse_num < 1 || !curse_list)
> > return (1);
> >
> - strlcpy(temp, argument, sizeof(temp));
> /* this loop copies 'argument' into temp without *s */
> + for (; *p && p - argument < sizeof(temp);) {
> + if (*p == ' ' || *p == '\t')
> + continue;
> + *q++ = *p++;
> + }
> + *q = '\0';
This is an infinite loop methinks. When called with a space, circle jumps
to 100% cpu usage and doesn't repond anymore, and needs to be killed.
<Rest of function>
> You didn't send a copy of search_replace(), so I'll not bother with
> that one. This is implementation should run in O(M+(N*N*M)).
Here is search_replace, I didn't write this myself, I found it somewhere
on the developer site instead.
void search_replace(char *string, const char *find, const char *replace)
{
char final[MAX_INPUT_LENGTH], temp[2];
size_t start, end, i;
while (str_strr(string, find) != NULL) { <- str_strr should be strcasestr
final[0] = '\0';
start = str_strr(string, find) - string;
end = start + strlen(find);
temp[1] = '\0';
strncat(final, string, start);
strcat(final, replace);
for (i = end; string[i] != '\0'; i++) {
temp[0] = string[i];
strcat(final, temp);
}
sprintf(string, final);
}
return;
}
Thanks for the attention!
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/26/03 PDT