- regmatch_t rm;
- guint rv, i, offset = 0;
- GSList *match_list = NULL;
-
- static UrlMatchPattern patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
- const size_t pattern_num = sizeof(patterns)/sizeof(UrlMatchPattern);
-
- /* initalize the regexps */
- for (i = 0; i != pattern_num; ++i) {
- patterns[i].preg = g_new0 (regex_t,1);
- g_assert(regcomp (patterns[i].preg, patterns[i].regex,
- REG_ICASE|REG_EXTENDED|REG_NEWLINE) == 0);
- }
- /* find all the matches */
- for (i = 0; i != pattern_num; ++i) {
- offset = 0;
- while (1) {
- int test_offset;
- if ((rv = regexec (patterns[i].preg, txt->str + offset, 1, &rm, 0)) != 0) {
- g_assert (rv == REG_NOMATCH); /* this should not happen */
- break; /* try next regexp */
- }
- if (rm.rm_so == -1)
- break;
-
- /* FIXME: optimize this */
- /* to avoid partial matches on something that was already found... */
- /* check_partial_match will put -1 in the data ptr if that is the case */
- test_offset = offset + rm.rm_so;
- g_slist_foreach (match_list, (GFunc)chk_partial_match, &test_offset);
-
- /* make a list of our matches (<offset, len, prefix> tupels)*/
- if (test_offset != -1) {
- url_match_t *match = g_new (url_match_t,1);
- match->offset = offset + rm.rm_so;
- match->len = rm.rm_eo - rm.rm_so;
- match->prefix = patterns[i].prefix;
- match_list = g_slist_prepend (match_list, match);
- }
- offset += rm.rm_eo;
- }
- }
-
- for (i = 0; i != pattern_num; ++i) {
- regfree (patterns[i].preg);
- g_free (patterns[i].preg);
- } /* don't free patterns itself -- it's static */
-
- /* now sort the list, so the matches are in reverse order of occurence.
- * that way, we can do the replacements starting from the end, so we don't need
- * to recalculate the offsets
- */
- match_list = g_slist_sort (match_list,
- (GCompareFunc)cmp_offsets_reverse);
- return match_list;