summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-06-13 05:29:22 +0530
committerRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-07-09 10:04:21 +0530
commit3e38a0c246536d064d722bf8c4db40ebf2275f5f (patch)
tree67e2be138c4368c8a51334ac83a1747aeeca16ed /src
parent02f5504de388eb69ded0bc9e05361d8db82c2137 (diff)
downloadlibhubbub-3e38a0c246536d064d722bf8c4db40ebf2275f5f.tar.gz
libhubbub-3e38a0c246536d064d722bf8c4db40ebf2275f5f.tar.bz2
Adding the COMMENT_END_BANG state for test3.dat
Diffstat (limited to 'src')
-rw-r--r--src/tokeniser/tokeniser.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index d108490..71cf35e 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -78,6 +78,7 @@ typedef enum hubbub_tokeniser_state {
STATE_COMMENT,
STATE_COMMENT_END_DASH,
STATE_COMMENT_END,
+ STATE_COMMENT_END_BANG,
STATE_MATCH_DOCTYPE,
STATE_DOCTYPE,
STATE_BEFORE_DOCTYPE_NAME,
@@ -539,6 +540,7 @@ hubbub_error hubbub_tokeniser_run(hubbub_tokeniser *tokeniser)
case STATE_COMMENT_START:
case STATE_COMMENT_START_DASH:
case STATE_COMMENT:
+ case STATE_COMMENT_END_BANG:
case STATE_COMMENT_END_DASH:
case STATE_COMMENT_END:
cont = hubbub_tokeniser_handle_comment(tokeniser);
@@ -1894,7 +1896,8 @@ hubbub_error hubbub_tokeniser_handle_comment(hubbub_tokeniser *tokeniser)
if (c == '>' && (tokeniser->state == STATE_COMMENT_START_DASH ||
tokeniser->state == STATE_COMMENT_START ||
- tokeniser->state == STATE_COMMENT_END)) {
+ tokeniser->state == STATE_COMMENT_END ||
+ tokeniser->state == STATE_COMMENT_END_BANG)) {
tokeniser->context.pending += len;
/** \todo parse error if state != COMMENT_END */
@@ -1916,9 +1919,21 @@ hubbub_error hubbub_tokeniser_handle_comment(hubbub_tokeniser *tokeniser)
return hubbub_error_from_parserutils_error(
error);
}
+ } else if (tokeniser->state == STATE_COMMENT_END_BANG) {
+ error = parserutils_buffer_append(tokeniser->buffer,
+ (uint8_t *) "--!", SLEN("--!"));
+ if (error != PARSERUTILS_OK) {
+ return hubbub_error_from_parserutils_error(
+ error);
+ }
+ tokeniser->state = STATE_COMMENT_END_DASH;
}
tokeniser->context.pending += len;
+ } else if (c == '!' && tokeniser->state == STATE_COMMENT_END) {
+ tokeniser->state = STATE_COMMENT_END_BANG;
+ tokeniser->context.pending += len;
+ return HUBBUB_OK;
} else {
if (tokeniser->state == STATE_COMMENT_START_DASH ||
tokeniser->state == STATE_COMMENT_END_DASH) {
@@ -1935,8 +1950,16 @@ hubbub_error hubbub_tokeniser_handle_comment(hubbub_tokeniser *tokeniser)
return hubbub_error_from_parserutils_error(
error);
}
+ } else if (tokeniser->state == STATE_COMMENT_END_BANG) {
+ error = parserutils_buffer_append(tokeniser->buffer,
+ (uint8_t *) "--!", SLEN("--!"));
+ if (error != PARSERUTILS_OK) {
+ return hubbub_error_from_parserutils_error(
+ error);
+ }
}
+
if (c == '\0') {
error = parserutils_buffer_append(tokeniser->buffer,
u_fffd, sizeof(u_fffd));