summaryrefslogtreecommitdiff
path: root/colm/ctinput.cc
diff options
context:
space:
mode:
Diffstat (limited to 'colm/ctinput.cc')
-rw-r--r--colm/ctinput.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/colm/ctinput.cc b/colm/ctinput.cc
index a10d03f5..10f89da9 100644
--- a/colm/ctinput.cc
+++ b/colm/ctinput.cc
@@ -60,6 +60,53 @@ LangEl *inputStreamPatternGetLangEl( StreamImpl *ss, long *bindId, char **data,
return klangEl;
}
+int inputStreamPatternGetParseBlock( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
+{
+ *copied = 0;
+
+ PatternItem *buf = ss->patItem;
+ int offset = ss->offset;
+
+ while ( true ) {
+ if ( buf == 0 )
+ return INPUT_EOD;
+
+ if ( buf->type == PatternItem::FactorType )
+ return INPUT_LANG_EL;
+
+ assert ( buf->type == PatternItem::InputText );
+ int avail = buf->data.length() - offset;
+
+ if ( avail > 0 ) {
+ /* The source data from the current buffer. */
+ char *src = &buf->data[offset];
+ int slen = avail <= length ? avail : length;
+
+ /* Need to skip? */
+ if ( skip > 0 && slen <= skip ) {
+ /* Skipping the the whole source. */
+ skip -= slen;
+ }
+ else {
+ /* Either skip is zero, or less than slen. Skip goes to zero.
+ * Some data left over, copy it. */
+ src += skip;
+ slen -= skip;
+ skip = 0;
+
+ memcpy( dest, src, slen ) ;
+ *copied += slen;
+ break;
+ }
+ }
+
+ buf = buf->next;
+ offset = 0;
+ }
+
+ return INPUT_DATA;
+}
+
int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
{
*copied = 0;
@@ -187,6 +234,7 @@ extern "C" void initPatFuncs()
memset( &patternFuncs, 0, sizeof(StreamFuncs) );
patternFuncs.getData = &inputStreamPatternGetData;
+ patternFuncs.getParseBlock = &inputStreamPatternGetParseBlock;
patternFuncs.consumeData = &inputStreamPatternConsumeData;
patternFuncs.undoConsumeData = &inputStreamPatternUndoConsumeData;
@@ -235,6 +283,53 @@ LangEl *inputStreamConsGetLangEl( StreamImpl *ss, long *bindId, char **data, lon
return klangEl;
}
+int inputStreamConsGetParseBlock( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
+{
+ *copied = 0;
+
+ ConsItem *buf = ss->consItem;
+ int offset = ss->offset;
+
+ while ( true ) {
+ if ( buf == 0 )
+ return INPUT_EOD;
+
+ if ( buf->type == ConsItem::ExprType || buf->type == ConsItem::FactorType )
+ return INPUT_LANG_EL;
+
+ assert ( buf->type == ConsItem::InputText );
+ int avail = buf->data.length() - offset;
+
+ if ( avail > 0 ) {
+ /* The source data from the current buffer. */
+ char *src = &buf->data[offset];
+ int slen = avail <= length ? avail : length;
+
+ /* Need to skip? */
+ if ( skip > 0 && slen <= skip ) {
+ /* Skipping the the whole source. */
+ skip -= slen;
+ }
+ else {
+ /* Either skip is zero, or less than slen. Skip goes to zero.
+ * Some data left over, copy it. */
+ src += skip;
+ slen -= skip;
+ skip = 0;
+
+ memcpy( dest, src, slen ) ;
+ *copied += slen;
+ break;
+ }
+ }
+
+ buf = buf->next;
+ offset = 0;
+ }
+
+ return INPUT_DATA;
+}
+
int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
{
*copied = 0;
@@ -364,6 +459,7 @@ extern "C" void initConsFuncs()
memset( &replFuncs, 0, sizeof(StreamFuncs) );
replFuncs.getData = &inputStreamConsGetData;
+ replFuncs.getParseBlock = &inputStreamConsGetParseBlock;
replFuncs.consumeData = &inputStreamConsConsumeData;
replFuncs.undoConsumeData = &inputStreamConsUndoConsumeData;