void _gtk_source_regex_fetch_named_pos (GtkSourceRegex *regex, const gchar *text, const gchar *name, gint *start_pos, /* character offsets */ gint *end_pos) /* character offsets */ { gint byte_start_pos, byte_end_pos; g_assert (regex->resolved); if (!g_match_info_fetch_named_pos (regex->u.regex.match, name, &byte_start_pos, &byte_end_pos)) { if (start_pos != NULL) *start_pos = -1; if (end_pos != NULL) *end_pos = -1; } else { if (start_pos != NULL) *start_pos = g_utf8_pointer_to_offset (text, text + byte_start_pos); if (end_pos != NULL) *end_pos = g_utf8_pointer_to_offset (text, text + byte_end_pos); } }
static VALUE rg_fetch_pos(VALUE self, VALUE rb_match_reference) { gint start_pos = 0; gint end_pos = 0; gboolean fetched = FALSE; switch (TYPE(rb_match_reference)) { case RUBY_T_FIXNUM: { gint match_num; match_num = NUM2INT(rb_match_reference); fetched = g_match_info_fetch_pos(_SELF(self), match_num, &start_pos, &end_pos); } break; case RUBY_T_STRING: case RUBY_T_SYMBOL: { const gchar *match_name; match_name = RVAL2CSTR_ACCEPT_SYMBOL(rb_match_reference); fetched = g_match_info_fetch_named_pos(_SELF(self), match_name, &start_pos, &end_pos); } break; default: rb_raise(rb_eArgError, "Expected a String, a Symbol or an Integer"); break; } if (!fetched) { return Qnil; } return rb_ary_new_from_args(2, INT2NUM(start_pos), INT2NUM(end_pos)); }
/** * rakia_codec_param_parse_generic: * @fmtp: a string value with the parameter description * @out: the parameter map to populate * * Parses parameters formatted as a semicolon separated list of * <replaceable>parameter</replaceable><literal>=</literal><replaceable>value</replaceable> * pairs, as recommended in IETF RFC 4855 Section 3. */ static void rakia_codec_param_parse_generic (const gchar *fmtp, TpMediaStreamType media_type, RakiaSipCodec *codec) { GMatchInfo *match = NULL; gint pos; gint value_start; gint value_end; if (fmtp == NULL) return; pos = 0; /* Fast path for trivial cases, not involving the regex engine */ while (g_ascii_isspace (fmtp[pos])) ++pos; if (!fmtp[pos]) return; g_assert (fmtp_attr_regex != NULL); g_regex_match_full (fmtp_attr_regex, fmtp, -1, pos, G_REGEX_MATCH_ANCHORED, &match, NULL); while (g_match_info_matches (match)) { gchar *name; gchar *value; name = g_match_info_fetch_named (match, FMTP_MATCH_NAME_PARAM); g_match_info_fetch_named_pos (match, FMTP_MATCH_NAME_VALUE, &value_start, &value_end); if (value_end - 1 > value_start && fmtp[value_start] == '\"' && fmtp[value_end - 1] == '\"') { value = rakia_unquote_string (fmtp + value_start, value_end - value_start); } else { value = g_strndup (fmtp + value_start, value_end - value_start); } rakia_sip_codec_add_param (codec, name, value); g_match_info_fetch_pos (match, 0, NULL, &pos); if (!fmtp[pos]) break; g_match_info_next (match, NULL); } g_match_info_free (match); if (fmtp[pos]) MESSAGE ("failed to parse part of format parameters" " as an attribute-value list: %s", &fmtp[pos]); }