summaryrefslogtreecommitdiff
path: root/glib/gmarkup.c
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2002-02-09 22:08:10 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2002-02-09 22:08:10 +0000
commitb08db9f35e67f5fe6eb5e9f889d185975fc8ecd8 (patch)
tree24e9db1427b481187a1b3ad49bc25cb88e5eb134 /glib/gmarkup.c
parent6715999ca120887c199cb024c0c2518fdc71145e (diff)
downloadglib-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.c45
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"));