+static gboolean url_matches_block = 0;
+static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
+
+
+static gboolean
+compile_patterns ()
+{
+ guint i;
+ const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t);
+ for (i = 0; i != pattern_num; ++i) {
+ patterns[i].preg = g_slice_new0 (regex_t);
+
+ /* this should not happen */
+ if (regcomp (patterns[i].preg, patterns[i].regex,
+ REG_ICASE|REG_EXTENDED|REG_NEWLINE) != 0) {
+ g_warning ("%s: error in regexp:\n%s\n", __FUNCTION__, patterns[i].regex);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void
+free_patterns ()
+{
+ guint i;
+ const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t);
+ for (i = 0; i != pattern_num; ++i) {
+ regfree (patterns[i].preg);
+ g_slice_free (regex_t, patterns[i].preg);
+ } /* don't free patterns itself -- it's static */
+}
+
+void
+modest_text_utils_hyperlinkify_begin (void)
+{
+ if (url_matches_block == 0)
+ compile_patterns ();
+ url_matches_block ++;
+}
+
+void
+modest_text_utils_hyperlinkify_end (void)
+{
+ url_matches_block--;
+ if (url_matches_block <= 0)
+ free_patterns ();
+}
+