summaryrefslogtreecommitdiff
path: root/src/tokeniser/tokeniser.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2012-07-19 10:22:44 +0100
committerChris Young <chris@unsatisfactorysoftware.co.uk>2012-07-19 10:22:44 +0100
commitd6807c519ae65d5ad58cace15f10359862969f89 (patch)
tree68a56298d5b7d7fe3f9f01a6210eed191767b030 /src/tokeniser/tokeniser.c
parentb7c12eff5456726f36cc1bf29e0bacaec3028877 (diff)
parentf6953cb68e18521361e18b6b7d504742263998ea (diff)
downloadlibhubbub-d6807c519ae65d5ad58cace15f10359862969f89.tar.gz
libhubbub-d6807c519ae65d5ad58cace15f10359862969f89.tar.bz2
Merge branch 'master' of git://git.netsurf-browser.org/libhubbub into chris/amiga-libchris/amiga-lib
Diffstat (limited to 'src/tokeniser/tokeniser.c')
-rw-r--r--src/tokeniser/tokeniser.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 549a89a..2fff50d 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -16,6 +16,7 @@
#include "utils/parserutilserror.h"
#include "utils/utils.h"
+#include "hubbub/errors.h"
#include "tokeniser/entities.h"
#include "tokeniser/tokeniser.h"
@@ -155,6 +156,7 @@ typedef struct hubbub_tokeniser_context {
} position; /**< Position in source data */
uint32_t allowed_char; /**< Used for quote matching */
+
} hubbub_tokeniser_context;
/**
@@ -166,6 +168,7 @@ struct hubbub_tokeniser {
* model flag */
bool escape_flag; /**< Escape flag **/
bool process_cdata_section; /**< Whether to process CDATA sections*/
+ bool paused; /**< flag for if parsing is currently paused */
parserutils_inputstream *input; /**< Input stream */
parserutils_buffer *buffer; /**< Input buffer */
@@ -317,6 +320,8 @@ hubbub_error hubbub_tokeniser_create(parserutils_inputstream *input,
tok->escape_flag = false;
tok->process_cdata_section = false;
+ tok->paused = false;
+
tok->input = input;
tok->token_handler = NULL;
@@ -372,6 +377,8 @@ hubbub_error hubbub_tokeniser_setopt(hubbub_tokeniser *tokeniser,
hubbub_tokeniser_opttype type,
hubbub_tokeniser_optparams *params)
{
+ hubbub_error err = HUBBUB_OK;
+
if (tokeniser == NULL || params == NULL)
return HUBBUB_BADPARM;
@@ -390,9 +397,18 @@ hubbub_error hubbub_tokeniser_setopt(hubbub_tokeniser *tokeniser,
case HUBBUB_TOKENISER_PROCESS_CDATA:
tokeniser->process_cdata_section = params->process_cdata;
break;
+ case HUBBUB_TOKENISER_PAUSE:
+ if (params->pause_parse == true) {
+ tokeniser->paused = true;
+ } else {
+ if (tokeniser->paused == true) {
+ tokeniser->paused = false;
+ err = hubbub_tokeniser_run(tokeniser);
+ }
+ }
}
- return HUBBUB_OK;
+ return err;
}
/**
@@ -434,6 +450,9 @@ hubbub_error hubbub_tokeniser_run(hubbub_tokeniser *tokeniser)
if (tokeniser == NULL)
return HUBBUB_BADPARM;
+ if (tokeniser->paused == true)
+ return HUBBUB_PAUSED;
+
#if 0
#define state(x) \
case x: \
@@ -3416,5 +3435,10 @@ hubbub_error hubbub_tokeniser_emit_token(hubbub_tokeniser *tokeniser,
tokeniser->insert_buf->length);
}
+ /* Ensure callback can pause the tokenise */
+ if (err == HUBBUB_PAUSED) {
+ tokeniser->paused = true;
+ }
+
return err;
}