diff --git a/include/ircaux.h b/include/ircaux.h index 73b60e9..1b30bdc 100644 --- a/include/ircaux.h +++ b/include/ircaux.h @@ -132,12 +132,12 @@ char * base64_encode (const void *data, size_t size); /* From words.c */ #define SOS -32767 #define EOS 32767 -char *BX_strsearch (register char *, char *, char *, int); -char *BX_move_to_word (const char *, int); -char *BX_move_word_rel (const char *, char **, int); -char *BX_extract (char *, int, int); -char *BX_extract2 (const char *, int, int); -int BX_wild_match (const char *, const char *); +char *BX_strsearch(const char *, const char *, const char *, int); +char *BX_move_to_word(const char *, int); +char *BX_move_word_rel(const char *, char **, int); +char *BX_extract(char *, int, int); +char *BX_extract2(const char *, int, int); +int BX_wild_match(const char *, const char *); /* Used for connect_by_number */ #define SERVICE_SERVER 0 diff --git a/include/modval.h b/include/modval.h index 0a1760e..be59a1f 100644 --- a/include/modval.h +++ b/include/modval.h @@ -199,7 +199,7 @@ extern Function_ptr *global; /* words.c reg.c */ -#define strsearch (*(char *(*)(char *, char *, char *, int ))global[STRSEARCH]) +#define strsearch (*(char *(*)(const char *, const char *, const char *, int ))global[STRSEARCH]) #define move_to_word (*(char *(*)(const char *, int))global[MOVE_TO_WORD]) #define move_word_rel (*(char *(*)(const char *, char **, int ))global[MOVE_WORD_REL]) #define extract (*(char *(*)(char *, int , int ))global[EXTRACT]) diff --git a/source/words.c b/source/words.c index 951ce42..ba7b9b5 100644 --- a/source/words.c +++ b/source/words.c @@ -15,36 +15,45 @@ CVS_REVISION(words_c) #include "ircaux.h" #include "modval.h" -/* - * search() looks for a character forward or backward from mark +/* strsearch() + * + * If how > 0, returns a pointer to the how'th matching character forwards + * from mark, in the string starting at start. + * If how < 0, returns a pointer to the -how'th matching character backwards + * from mark, in the string starting at start. + * If how == 0, returns NULL. + * + * NULL mark begins the search at start. + * + * A matching character is any character in chars, unless chars starts with ^, + * in which case a matching character is any character NOT in chars. + * + * If there are insufficient matching characters, NULL is returned. */ -extern char *BX_strsearch(register char *start, char *mark, char *chars, int how) +extern char *BX_strsearch(const char *start, const char *mark, const char *chars, int how) { - if (!mark) - mark = start; + const char *ptr = NULL; - if (how > 0) /* forward search */ - { - mark = sindex(mark, chars); - how--; - for (; how > 0 && mark && *mark; how--) - mark = sindex(mark + 1, chars); - } + if (!mark) + mark = start; - else if (how == 0) - return NULL; - - else /* how < 0 */ + if (how > 0) /* forward search */ { - mark = rsindex(mark, start, chars, -how); -#if 0 - how++; - for (;(how < 0) && *mark && **mark;how++) - *mark = rsindex(*mark-1, start, chars); -#endif + for (; how > 0 && mark; how--) + { + ptr = sindex(mark, chars); + if (ptr) + mark = ptr + 1; + else + mark = NULL; + } + } + else if (how < 0) + { + ptr = rsindex(mark, start, chars, -how); } - return mark; + return (char *)ptr; } /* move_to_word()