diff options
author | Rupinder Singh Khokhar <rsk1coder99@gmail.com> | 2014-06-13 05:29:22 +0530 |
---|---|---|
committer | Rupinder Singh Khokhar <rsk1coder99@gmail.com> | 2014-07-09 10:04:21 +0530 |
commit | 3e38a0c246536d064d722bf8c4db40ebf2275f5f (patch) | |
tree | 67e2be138c4368c8a51334ac83a1747aeeca16ed /src | |
parent | 02f5504de388eb69ded0bc9e05361d8db82c2137 (diff) | |
download | libhubbub-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.c | 25 |
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)); |