summaryrefslogtreecommitdiff
path: root/src/tokeniser
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2012-07-10 11:23:57 -0600
committerVincent Sanders <vince@netsurf-browser.org>2012-07-10 11:23:57 -0600
commitbdff981eef4a7434291941e6bca662357498bc59 (patch)
tree08a4e4d525f31b7ba87c21404e7e1edef4b01654 /src/tokeniser
parentca1f136faae71cd063a264cf45195fb47cdba2ba (diff)
downloadlibhubbub-bdff981eef4a7434291941e6bca662357498bc59.tar.gz
libhubbub-bdff981eef4a7434291941e6bca662357498bc59.tar.bz2
Add ability to pause tokenisation
Diffstat (limited to 'src/tokeniser')
-rw-r--r--src/tokeniser/tokeniser.c24
-rw-r--r--src/tokeniser/tokeniser.h5
2 files changed, 27 insertions, 2 deletions
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 549a89a..04f4ea7 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 */
@@ -372,6 +375,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 +395,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 +448,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 +3433,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;
}
diff --git a/src/tokeniser/tokeniser.h b/src/tokeniser/tokeniser.h
index e13a03a..ed46d60 100644
--- a/src/tokeniser/tokeniser.h
+++ b/src/tokeniser/tokeniser.h
@@ -26,7 +26,8 @@ typedef enum hubbub_tokeniser_opttype {
HUBBUB_TOKENISER_TOKEN_HANDLER,
HUBBUB_TOKENISER_ERROR_HANDLER,
HUBBUB_TOKENISER_CONTENT_MODEL,
- HUBBUB_TOKENISER_PROCESS_CDATA
+ HUBBUB_TOKENISER_PROCESS_CDATA,
+ HUBBUB_TOKENISER_PAUSE
} hubbub_tokeniser_opttype;
/**
@@ -48,6 +49,8 @@ typedef union hubbub_tokeniser_optparams {
} content_model; /**< Current content model */
bool process_cdata; /**< Whether to process CDATA sections*/
+
+ bool pause_parse; /**< Pause parsing */
} hubbub_tokeniser_optparams;
/* Create a hubbub tokeniser */