X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcstrutil.c;h=1133c88dbf87814b3ea9b8f8e20e9267d5d9dfe4;hb=e9374395ec9747bddd3ea0bfd3e5a17717e97b31;hp=d4df969324d2ff855a74b72ee93761c8836e85c1;hpb=8fd8212bcd16f2b53fbedff2a9b9a4e8c15b9695;p=silc.git diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index d4df9693..1133c88d 100644 --- a/lib/silcutil/silcstrutil.c +++ b/lib/silcutil/silcstrutil.c @@ -314,3 +314,112 @@ char **silc_string_split(const char *string, char ch, int *ret_count) return splitted; } + +/* Inspects the `string' for wildcards and returns regex string that can + be used by the GNU regex library. A comma (`,') in the `string' means + that the string is list. */ + +char *silc_string_regexify(const char *string) +{ + int i, len, count; + char *regex; + + if (!string) + return NULL; + + len = strlen(string); + count = 4; + for (i = 0; i < len; i++) { + if (string[i] == '*' || string[i] == '?') + count++; /* Will add '.' */ + if (string[i] == ',') + count += 2; /* Will add '|' and '^' */ + } + + regex = silc_calloc(len + count + 1, sizeof(*regex)); + if (!regex) + return NULL; + + count = 0; + regex[count++] = '('; + regex[count++] = '^'; + + for (i = 0; i < len; i++) { + if (string[i] == '*' || string[i] == '?') { + regex[count] = '.'; + count++; + } else if (string[i] == ',') { + if (i + 2 == len) + continue; + regex[count++] = '|'; + regex[count++] = '^'; + continue; + } + + regex[count++] = string[i]; + } + + regex[count++] = ')'; + regex[count] = '$'; + + return regex; +} + +/* Combines two regex strings into one regex string so that they can be + used as one by the GNU regex library. The `string2' is combine into + the `string1'. */ + +char *silc_string_regex_combine(const char *string1, const char *string2) +{ + char *tmp; + int len1, len2; + + if (!string1 || !string2) + return NULL; + + len1 = strlen(string1); + len2 = strlen(string2); + + tmp = silc_calloc(2 + len1 + len2, sizeof(*tmp)); + strncat(tmp, string1, len1 - 2); + strncat(tmp, "|", 1); + strncat(tmp, string2 + 1, len2 - 1); + + return tmp; +} + +/* Matches the two strings and returns TRUE if the strings match. */ + +int silc_string_regex_match(const char *regex, const char *string) +{ + regex_t preg; + int ret = FALSE; + + if (regcomp(&preg, regex, REG_NOSUB | REG_EXTENDED) != 0) + return FALSE; + + if (regexec(&preg, string, 0, NULL, 0) == 0) + ret = TRUE; + + regfree(&preg); + + return ret; +} + +/* Do regex match to the two strings `string1' and `string2'. If the + `string2' matches the `string1' this returns TRUE. */ + +int silc_string_match(const char *string1, const char *string2) +{ + char *s1; + int ret = FALSE; + + if (!string1 || !string2) + return ret; + + s1 = silc_string_regexify(string1); + ret = silc_string_regex_match(s1, string2); + silc_free(s1); + + return ret; +}