summaryrefslogtreecommitdiff
path: root/colm/ctinput.cc
diff options
context:
space:
mode:
Diffstat (limited to 'colm/ctinput.cc')
-rw-r--r--colm/ctinput.cc98
1 files changed, 85 insertions, 13 deletions
diff --git a/colm/ctinput.cc b/colm/ctinput.cc
index bde9f424..285e1faf 100644
--- a/colm/ctinput.cc
+++ b/colm/ctinput.cc
@@ -22,7 +22,6 @@
#include "parsedata.h"
#include "parsetree.h"
#include "input.h"
-#include "fsmrun.h"
#include "debug.h"
#include "pool.h"
@@ -60,15 +59,13 @@ LangEl *inputStreamPatternGetLangEl( StreamImpl *ss, long *bindId, char **data,
return klangEl;
}
-int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
+int inputStreamPatternGetParseBlock( StreamImpl *ss, int skip, char **pdp, int *copied )
{
*copied = 0;
PatternItem *buf = ss->patItem;
int offset = ss->offset;
- attachStream( fsmRun, ss );
-
while ( true ) {
if ( buf == 0 )
return INPUT_EOD;
@@ -82,7 +79,7 @@ int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *d
if ( avail > 0 ) {
/* The source data from the current buffer. */
char *src = &buf->data[offset];
- int slen = avail <= length ? avail : length;
+ int slen = avail;
/* Need to skip? */
if ( skip > 0 && slen <= skip ) {
@@ -96,7 +93,7 @@ int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *d
slen -= skip;
skip = 0;
- memcpy( dest, src, slen ) ;
+ *pdp = src;
*copied += slen;
break;
}
@@ -109,6 +106,43 @@ int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *d
return INPUT_DATA;
}
+int inputStreamPatternGetData( StreamImpl *ss, char *dest, int length )
+{
+ int copied = 0;
+
+ PatternItem *buf = ss->patItem;
+ int offset = ss->offset;
+
+ while ( true ) {
+ if ( buf == 0 )
+ break;
+
+ if ( buf->type == PatternItem::FactorType )
+ break;
+
+ 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;
+
+ memcpy( dest+copied, src, slen ) ;
+ copied += slen;
+ length -= slen;
+ }
+
+ if ( length == 0 )
+ break;
+
+ buf = buf->next;
+ offset = 0;
+ }
+
+ return copied;
+}
+
void inputStreamPatternBackup( StreamImpl *ss )
{
if ( ss->patItem == 0 )
@@ -178,7 +212,7 @@ int inputStreamPatternConsumeData( StreamImpl *ss, int length )
return consumed;
}
-int inputStreamPatternUndoConsumeData( FsmRun *fsmRun, StreamImpl *ss, const char *data, int length )
+int inputStreamPatternUndoConsumeData( StreamImpl *ss, const char *data, int length )
{
ss->offset -= length;
return length;
@@ -189,6 +223,7 @@ extern "C" void initPatFuncs()
memset( &patternFuncs, 0, sizeof(StreamFuncs) );
patternFuncs.getData = &inputStreamPatternGetData;
+ patternFuncs.getParseBlock = &inputStreamPatternGetParseBlock;
patternFuncs.consumeData = &inputStreamPatternConsumeData;
patternFuncs.undoConsumeData = &inputStreamPatternUndoConsumeData;
@@ -237,15 +272,14 @@ LangEl *inputStreamConsGetLangEl( StreamImpl *ss, long *bindId, char **data, lon
return klangEl;
}
-int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length, int *copied )
+int inputStreamConsGetParseBlock( StreamImpl *ss,
+ int skip, char **pdp, int *copied )
{
*copied = 0;
ConsItem *buf = ss->consItem;
int offset = ss->offset;
- attachStream( fsmRun, ss );
-
while ( true ) {
if ( buf == 0 )
return INPUT_EOD;
@@ -259,7 +293,7 @@ int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest
if ( avail > 0 ) {
/* The source data from the current buffer. */
char *src = &buf->data[offset];
- int slen = avail <= length ? avail : length;
+ int slen = avail;
/* Need to skip? */
if ( skip > 0 && slen <= skip ) {
@@ -273,7 +307,7 @@ int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest
slen -= skip;
skip = 0;
- memcpy( dest, src, slen ) ;
+ *pdp = src;
*copied += slen;
break;
}
@@ -286,6 +320,43 @@ int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest
return INPUT_DATA;
}
+int inputStreamConsGetData( StreamImpl *ss, char *dest, int length )
+{
+ int copied = 0;
+
+ ConsItem *buf = ss->consItem;
+ int offset = ss->offset;
+
+ while ( true ) {
+ if ( buf == 0 )
+ break;
+
+ if ( buf->type == ConsItem::ExprType || buf->type == ConsItem::FactorType )
+ break;
+
+ 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;
+
+ memcpy( dest+copied, src, slen ) ;
+ copied += slen;
+ length -= slen;
+ }
+
+ if ( length == 0 )
+ break;
+
+ buf = buf->next;
+ offset = 0;
+ }
+
+ return copied;
+}
+
void inputStreamConsBackup( StreamImpl *ss )
{
if ( ss->consItem == 0 )
@@ -357,7 +428,7 @@ int inputStreamConsConsumeData( StreamImpl *ss, int length )
return consumed;
}
-int inputStreamConsUndoConsumeData( FsmRun *fsmRun, StreamImpl *ss, const char *data, int length )
+int inputStreamConsUndoConsumeData( StreamImpl *ss, const char *data, int length )
{
ss->offset -= length;
return length;
@@ -368,6 +439,7 @@ extern "C" void initConsFuncs()
memset( &replFuncs, 0, sizeof(StreamFuncs) );
replFuncs.getData = &inputStreamConsGetData;
+ replFuncs.getParseBlock = &inputStreamConsGetParseBlock;
replFuncs.consumeData = &inputStreamConsConsumeData;
replFuncs.undoConsumeData = &inputStreamConsUndoConsumeData;