diff options
Diffstat (limited to 'colm/ctinput.cc')
-rw-r--r-- | colm/ctinput.cc | 96 |
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; |