static gchar * expand_regex (ParserState *parser_state, gchar *regex, GRegexCompileFlags flags, gboolean do_expand_vars, gboolean insert_parentheses, GError **error) { gchar *tmp_regex; GString *expanded_regex; static GRegex *backref_re = NULL; g_assert (parser_state != NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (regex == NULL) return NULL; if (backref_re == NULL) backref_re = g_regex_new ("(?<!\\\\)(\\\\\\\\)*\\\\[0-9]", G_REGEX_OPTIMIZE | G_REGEX_NEWLINE_LF, 0, NULL); if (g_regex_match (backref_re, regex, 0, NULL)) { /* This may be a backreference, or it may be an octal character */ GRegex *compiled; compiled = g_regex_new (regex, flags | G_REGEX_NEWLINE_LF, 0, error); if (compiled == NULL) return NULL; if (g_regex_get_max_backref (compiled) > 0) { g_set_error (error, PARSER_ERROR, PARSER_ERROR_MALFORMED_REGEX, _("in regex '%s': backreferences are not supported"), regex); g_regex_unref (compiled); return NULL; } g_regex_unref (compiled); } if (do_expand_vars) { tmp_regex = expand_regex_vars (parser_state, regex, -1, error); if (tmp_regex == NULL) return NULL; } else { tmp_regex = g_strdup (regex); } regex = tmp_regex; tmp_regex = expand_regex_delimiters (parser_state, regex, -1); g_free (regex); /* Set the options and add not capturing parentheses if * insert_parentheses is TRUE (this is needed for included * regular expressions.) */ expanded_regex = g_string_new (""); if (insert_parentheses) g_string_append (expanded_regex, "(?:"); g_string_append (expanded_regex, "(?"); if (flags != 0) { if (flags & G_REGEX_CASELESS) g_string_append (expanded_regex, "i"); if (flags & G_REGEX_EXTENDED) g_string_append (expanded_regex, "x"); /* J is added here if it's used, but -J isn't added * below */ if (flags & G_REGEX_DUPNAMES) g_string_append (expanded_regex, "J"); } if ((flags & (G_REGEX_CASELESS | G_REGEX_EXTENDED)) != (G_REGEX_CASELESS | G_REGEX_EXTENDED)) { g_string_append (expanded_regex, "-"); if (!(flags & G_REGEX_CASELESS)) g_string_append (expanded_regex, "i"); if (!(flags & G_REGEX_EXTENDED)) g_string_append (expanded_regex, "x"); } g_string_append (expanded_regex, ")"); g_string_append (expanded_regex, tmp_regex); if (insert_parentheses) { /* The '\n' is needed otherwise, if the regex is "extended" * and it ends with a comment, the ')' is appended inside the * comment itself */ if (flags & G_REGEX_EXTENDED) g_string_append (expanded_regex, "\n"); /* FIXME: if the regex is not extended this doesn't works */ g_string_append (expanded_regex, ")"); } g_free (tmp_regex); return g_string_free (expanded_regex, FALSE); }
static VALUE rg_max_backref(VALUE self) { return INT2NUM(g_regex_get_max_backref(_SELF(self))); }