static gboolean criteria_test_match (GnmValue const *x, GnmCriteria *crit) { if (!crit->has_rx) return FALSE; // Only strings are matched if (!VALUE_IS_STRING (x)) return FALSE; return go_regexec (&crit->rx, value_peek_string (x), 0, NULL, 0) == GO_REG_OK; }
gboolean go_search_match_string (GOSearchReplace *sr, const char *src) { int flags = 0; g_return_val_if_fail (sr, FALSE); if (!sr->comp_search) { go_search_replace_compile (sr); g_return_val_if_fail (sr->comp_search, FALSE); } while (1) { GORegmatch match; int ret = go_regexec (sr->comp_search, src, 1, &match, flags); switch (ret) { case 0: if (!sr->match_words) return TRUE; if (match_is_word (src, &match, (flags & GO_REG_NOTBOL) != 0)) return TRUE; /* * We had a match, but it's not a word. Pretend we saw * a one-character match and continue after that. */ flags |= GO_REG_NOTBOL; src = g_utf8_next_char (src + match.rm_so); break; case GO_REG_NOMATCH: return FALSE; default: g_error ("Unexpected error code from regexec: %d.", ret); return FALSE; } } }
/* * Returns NULL if nothing changed, or a g_malloc string otherwise. */ char * go_search_replace_string (GOSearchReplace *sr, const char *src) { int nmatch; GORegmatch *pmatch; GString *res = NULL; int ret; int flags = 0; g_return_val_if_fail (sr, NULL); g_return_val_if_fail (sr->replace_text, NULL); if (!sr->comp_search) { go_search_replace_compile (sr); g_return_val_if_fail (sr->comp_search, NULL); } nmatch = 1 + sr->comp_search->re_nsub; pmatch = g_new (GORegmatch, nmatch); while ((ret = go_regexec (sr->comp_search, src, nmatch, pmatch, flags)) == 0) { if (!res) { /* The size here is a bit arbitrary. */ int size = strlen (src) + 10 * strlen (sr->replace_text); res = g_string_sized_new (size); } if (pmatch[0].rm_so > 0) { g_string_append_len (res, src, pmatch[0].rm_so); } if (sr->match_words && !match_is_word (src, pmatch, (flags & GO_REG_NOTBOL) != 0)) { /* We saw a fake match. */ if (pmatch[0].rm_so < pmatch[0].rm_eo) { const char *p = src + pmatch[0].rm_so; gunichar c = g_utf8_get_char (p); g_string_append_unichar (res, c); /* Pretend we saw a one-character match. */ pmatch[0].rm_eo = pmatch[0].rm_so + (g_utf8_next_char (p) - p); } } else { char *replacement = calculate_replacement (sr, src, pmatch); g_string_append (res, replacement); g_free (replacement); if (src[pmatch[0].rm_eo] == 0) { /* * We matched and replaced the last character * of the string. Do not continue as we might * then match the empty string at the end and * re-add the replacement. This would happen, * for example, if you searched for ".*". */ src = ""; break; } } if (pmatch[0].rm_eo > 0) { src += pmatch[0].rm_eo; flags |= GO_REG_NOTBOL; } if (pmatch[0].rm_so == pmatch[0].rm_eo) { /* * We have matched a null string at the current point. * This might happen searching for just an anchor, for * example. Don't loop forever... */ break; } } g_free (pmatch); if (res) { if (*src) g_string_append (res, src); return g_string_free (res, FALSE); } else { return NULL; } }