]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add method to create regexp from a glob pattern
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 18 Dec 2016 14:53:13 +0000 (14:53 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 18 Dec 2016 14:53:13 +0000 (14:53 +0000)
src/libutil/regexp.c
src/libutil/regexp.h

index c5a574f6fa38133fd9756c859a4621b54c351923..e0f7b2340c53045d4d1421306ef725dcbf70c5dd 100644 (file)
@@ -1142,3 +1142,119 @@ rspamd_regexp_set_class (rspamd_regexp_t *re, gpointer re_class)
 
        return old_class;
 }
+
+rspamd_regexp_t *
+rspamd_regexp_from_glob (const gchar *gl, gsize sz, GError **err)
+{
+       GString *out;
+       rspamd_regexp_t *re;
+       const gchar *end;
+       gboolean escaping = FALSE;
+       gint nbraces = 0;
+
+       g_assert (gl != NULL);
+
+       if (sz == 0) {
+               sz = strlen (gl);
+       }
+
+       end = gl + sz;
+       out = g_string_sized_new (sz + 2);
+       g_string_append_c (out, '^');
+
+       while (gl < end) {
+               switch (*gl) {
+               case '*':
+                       if (escaping) {
+                               g_string_append (out, "\\*");
+                       }
+                       else {
+                               g_string_append (out, ".*");
+                       }
+
+                       escaping = FALSE;
+                       break;
+               case '?':
+                       if (escaping) {
+                               g_string_append (out, "\\?");
+                       }
+                       else {
+                               g_string_append (out, ".");
+                       }
+
+                       escaping = FALSE;
+                       break;
+               case '.':
+               case '(':
+               case ')':
+               case '+':
+               case '|':
+               case '^':
+               case '$':
+               case '@':
+               case '%':
+                       g_string_append_c (out, '\\');
+                       g_string_append_c (out, *gl);
+                       escaping = FALSE;
+                       break;
+               case '\\':
+                       if (escaping) {
+                               g_string_append (out, "\\\\");
+                               escaping = FALSE;
+                       }
+                       else {
+                               escaping = TRUE;
+                       }
+                       break;
+               case '{':
+                       if (escaping) {
+                               g_string_append (out, "\\{");
+                       }
+                       else {
+                               g_string_append_c (out, '(');
+                               nbraces++;
+                       }
+
+                       escaping = FALSE;
+                       break;
+               case '}':
+                       if (nbraces > 0 && !escaping) {
+                               g_string_append_c (out, ')');
+                               nbraces--;
+                       }
+                       else if (escaping) {
+                               g_string_append (out, "\\}");
+                       }
+                       else {
+                               g_string_append (out, "}");
+                       }
+
+                       escaping = FALSE;
+                       break;
+               case ',':
+                       if (nbraces > 0 && !escaping) {
+                               g_string_append_c (out, '|');
+                       }
+                       else if (escaping) {
+                               g_string_append (out, "\\,");
+                       }
+                       else {
+                               g_string_append_c (out, ',');
+                       }
+
+                       break;
+               default:
+                       escaping = FALSE;
+                       g_string_append_c (out, *gl);
+                       break;
+               }
+
+               gl ++;
+       }
+
+       g_string_append_c (out, '$');
+       re = rspamd_regexp_new (out->str, "i", err);
+       g_string_free (out, TRUE);
+
+       return re;
+}
index d130dea2ba629647a2840b62acafb206a5308436..c85276b710475dc42b2a748a185842aa2a9fe11a 100644 (file)
@@ -257,4 +257,12 @@ void rspamd_regexp_library_init (void);
  */
 void rspamd_regexp_library_finalize (void);
 
+/**
+ * Create regexp from glob
+ * @param gl
+ * @param err
+ * @return
+ */
+rspamd_regexp_t *rspamd_regexp_from_glob (const gchar *gl, gsize sz, GError **err);
+
 #endif /* REGEXP_H_ */