From: Pekka Riikonen Date: Tue, 1 May 2007 11:22:01 +0000 (+0000) Subject: Moved regex routines to silcstrutil.[ch] from silcutil/unix/. X-Git-Tag: silc.toolkit.1.1.beta1~12 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=b7e04896b1db8142640dfd4da147d7638e8d0a32 Moved regex routines to silcstrutil.[ch] from silcutil/unix/. --- diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index d4df9693..0bf94f2d 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) + reeturn 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; +} diff --git a/lib/silcutil/silcstrutil.h b/lib/silcutil/silcstrutil.h index 490f8dd5..0860bb3a 100644 --- a/lib/silcutil/silcstrutil.h +++ b/lib/silcutil/silcstrutil.h @@ -141,8 +141,6 @@ char *silc_strncat(char *dest, SilcUInt32 dest_size, * be used by the GNU regex library. A comma (`,') in the `string' means * that the string is list. * - * This function is system dependant. - * ***/ char *silc_string_regexify(const char *string); @@ -156,8 +154,6 @@ char *silc_string_regexify(const char *string); * * Matches the two strings and returns TRUE if the strings match. * - * This function is system dependant. - * ***/ int silc_string_regex_match(const char *regex, const char *string); @@ -172,8 +168,6 @@ int silc_string_regex_match(const char *regex, const char *string); * Do regex match to the two strings `string1' and `string2'. If the * `string2' matches the `string1' this returns TRUE. * - * This function is system dependant. - * ***/ int silc_string_match(const char *string1, const char *string2);