diff options
author | Matthias Clasen <matthiasc@src.gnome.org> | 2002-02-09 22:08:10 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2002-02-09 22:08:10 +0000 |
commit | b08db9f35e67f5fe6eb5e9f889d185975fc8ecd8 (patch) | |
tree | 24e9db1427b481187a1b3ad49bc25cb88e5eb134 /glib/gmarkup.c | |
parent | 6715999ca120887c199cb024c0c2518fdc71145e (diff) | |
download | glib-b08db9f35e67f5fe6eb5e9f889d185975fc8ecd8.tar.gz |
Test attribute value delimiters.
* tests/markups/valid-4.gmarkup: Test attribute value delimiters.
* glib/gmarkup.c (g_markup_parse_context_parse): Support
' and " as attribute value delimiters. (#70677)
Diffstat (limited to 'glib/gmarkup.c')
-rw-r--r-- | glib/gmarkup.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/glib/gmarkup.c b/glib/gmarkup.c index 4381bdb3d..4386b0455 100644 --- a/glib/gmarkup.c +++ b/glib/gmarkup.c @@ -48,7 +48,8 @@ typedef enum STATE_INSIDE_ATTRIBUTE_NAME, STATE_BETWEEN_ATTRIBUTES, STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, - STATE_INSIDE_ATTRIBUTE_VALUE, + STATE_INSIDE_ATTRIBUTE_VALUE_SQ, + STATE_INSIDE_ATTRIBUTE_VALUE_DQ, STATE_INSIDE_TEXT, STATE_AFTER_CLOSE_TAG_SLASH, STATE_INSIDE_CLOSE_TAG_NAME, @@ -1213,11 +1214,17 @@ g_markup_parse_context_parse (GMarkupParseContext *context, break; case STATE_AFTER_ATTRIBUTE_EQUALS_SIGN: - /* Possible next state: INSIDE_ATTRIBUTE_VALUE */ + /* Possible next state: INSIDE_ATTRIBUTE_VALUE_[SQ/DQ] */ if (*context->iter == '"') { advance_char (context); - context->state = STATE_INSIDE_ATTRIBUTE_VALUE; + context->state = STATE_INSIDE_ATTRIBUTE_VALUE_DQ; + context->start = context->iter; + } + else if (*context->iter == '\'') + { + advance_char (context); + context->state = STATE_INSIDE_ATTRIBUTE_VALUE_SQ; context->start = context->iter; } else @@ -1235,15 +1242,28 @@ g_markup_parse_context_parse (GMarkupParseContext *context, } break; - case STATE_INSIDE_ATTRIBUTE_VALUE: + case STATE_INSIDE_ATTRIBUTE_VALUE_SQ: + case STATE_INSIDE_ATTRIBUTE_VALUE_DQ: /* Possible next states: BETWEEN_ATTRIBUTES */ - do - { - if (*context->iter == '"') - break; - } - while (advance_char (context)); - + { + gchar delim; + + if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ) + { + delim = '\''; + } + else + { + delim = '"'; + } + + do + { + if (*context->iter == delim) + break; + } + while (advance_char (context)); + } if (context->iter == context->current_text_end) { /* The value hasn't necessarily ended. Merge with @@ -1599,7 +1619,8 @@ g_markup_parse_context_end_parse (GMarkupParseContext *context, "following an attribute name; no attribute value")); break; - case STATE_INSIDE_ATTRIBUTE_VALUE: + case STATE_INSIDE_ATTRIBUTE_VALUE_SQ: + case STATE_INSIDE_ATTRIBUTE_VALUE_DQ: set_error (context, error, G_MARKUP_ERROR_PARSE, _("Document ended unexpectedly while inside an attribute " "value")); |