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 ?
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.
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.
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';
>
> if (call) {
> /* Does the desired name contain a string in the curse list? */
> for (i = 0; i < curse_num; i++)
- if (str_strr(temp, curse_list[i]))
+ if (strcasestr(temp, curse_list[i]))
> return (0);
> } else
> for (i = 0; i < curse_num; i++)
> search_replace(argument, curse_list[i], "*beep*");
>
>
> return (1);
> }
<snip of str_strr()>
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)).
Welcor
--
+---------------------------------------------------------------+
| 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