Skip to content
Snippets Groups Projects
Commit 5b359484 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Allow '*' pattern character to be used mid-string (not just beg or end)

Previously, the '*' matching pattern character could only be used as the beginning or ending character of a pattern string; for any other use, it was treated just as any other exact-match character.

Now, you can have exact-match characters on both the left and right sides of the '*', so pattern matching like the following is possible:

<*@gmail.com>
digital*man

Multiple '*'s are still not treated special (only the first/left-most '*" is), so, for example, "*blah*" will not likely produce the desired matching effect (use "blah~" instead for this case).
parent 51e08342
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #2396 passed
...@@ -244,64 +244,68 @@ char* strip_char(const char* str, char* dest, char ch) ...@@ -244,64 +244,68 @@ char* strip_char(const char* str, char* dest, char ch)
} }
/****************************************************************************/ /****************************************************************************/
/* Pattern matching string search of 'insearchof' in 'string'. */ /* Pattern matching string search of 'insearchof' in 'pattern'. */
/****************************************************************************/ /* pattern matching is case-insensitive */
BOOL findstr_in_string(const char* insearchof, char* string) /* patterns beginning with ';' are comments (never match) */
{ /* patterns beginning with '!' are reverse-matched (returns FALSE if match) */
/* patterns ending in '~' will match string anywhere (sub-string search) */
/* patterns ending in '^' will match left string fragment only */
/* patterns including '*' must match both left and right string fragments */
/* all other patterns are exact-match checking */
/****************************************************************************/
BOOL findstr_in_string(const char* search, const char* pattern)
{
char buf[256];
char* p; char* p;
char str[256]; char* last;
char search[81]; const char* splat;
int c; size_t len;
int i;
BOOL found = FALSE; BOOL found = FALSE;
if(string==NULL || insearchof==NULL) if(pattern == NULL || search == NULL)
return(FALSE); return FALSE;
SAFECOPY(search,insearchof);
strupr(search);
SAFECOPY(str,string);
p=str; SAFECOPY(buf, pattern);
// SKIP_WHITESPACE(p); p = buf;
if(*p == ';') /* comment */ if(*p == ';') /* comment */
return(FALSE); return FALSE;
if(*p=='!') { /* !match */ if(*p == '!') { /* reverse-match */
found = TRUE; found = TRUE;
p++; p++;
} }
truncsp(p); truncsp(p);
c=strlen(p); len = strlen(p);
if(c) { if(len > 0) {
c--; last = p + len - 1;
strupr(p); if(*last == '~') {
if(p[c]=='~') { *last = '\0';
p[c]=0; if(strcasestr(search, p) != NULL)
if(strstr(search,p))
found = !found; found = !found;
} }
else if(p[c]=='^' || p[c]=='*') { else if(*last == '^') {
p[c]=0; if(strnicmp(p, search, len - 1) == 0)
if(!strncmp(p,search,c))
found = !found; found = !found;
} }
else if(p[0]=='*') { else if((splat = strchr(p, '*')) != NULL) {
i=strlen(search); int left = splat - p;
if(i<c) int right = len - (left + 1);
return(found); int slen = strlen(search);
if(!strncmp(p+1,search+(i-c),c)) if(slen < left + right)
return found;
if(strnicmp(search, p, left) == 0
&& strnicmp(p + left + 1, search + (slen - right), right) == 0)
found = !found; found = !found;
} }
else if(!strcmp(p,search)) else if(stricmp(p, search) == 0)
found = !found; found = !found;
} }
return(found); return found;
} }
static uint32_t encode_ipv4_address(unsigned int byte[]) static uint32_t encode_ipv4_address(unsigned int byte[])
......
...@@ -46,7 +46,7 @@ DLLEXPORT char * replace_named_values(const char* src ,char* buf, size_t bufl ...@@ -46,7 +46,7 @@ DLLEXPORT char * replace_named_values(const char* src ,char* buf, size_t bufl
DLLEXPORT char * condense_whitespace(char* str); DLLEXPORT char * condense_whitespace(char* str);
DLLEXPORT char exascii_to_ascii_char(uchar ch); DLLEXPORT char exascii_to_ascii_char(uchar ch);
DLLEXPORT BOOL findstr(const char *insearch, const char *fname); DLLEXPORT BOOL findstr(const char *insearch, const char *fname);
DLLEXPORT BOOL findstr_in_string(const char* insearchof, char* string); DLLEXPORT BOOL findstr_in_string(const char* insearchof, const char* pattern);
DLLEXPORT BOOL findstr_in_list(const char* insearchof, str_list_t list); DLLEXPORT BOOL findstr_in_list(const char* insearchof, str_list_t list);
DLLEXPORT str_list_t findstr_list(const char* fname); DLLEXPORT str_list_t findstr_list(const char* fname);
DLLEXPORT BOOL trashcan(scfg_t* cfg, const char *insearch, const char *name); DLLEXPORT BOOL trashcan(scfg_t* cfg, const char *insearch, const char *name);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment