summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-02-06 21:37:01 -0500
committerAdrian Thurston <thurston@complang.org>2013-02-06 21:37:01 -0500
commitc7552a1f5bcc620f5a5c5ef51ba091529775adf6 (patch)
tree8ad6ff22ab11fe210268b9231310e75361688caa
parent6cee3af74110755e5a4a71f56dc1fdd6980a5443 (diff)
downloadcolm-c7552a1f5bcc620f5a5c5ef51ba091529775adf6.tar.gz
getData continues until length data is copied
The getData function now continues to fetch data until length data is copied or there is no more data. Don't need to call it in a loop, or pass in a skip argument.
-rw-r--r--colm/ctinput.cc52
-rw-r--r--colm/input.c82
-rw-r--r--colm/pdarun.c4
3 files changed, 48 insertions, 90 deletions
diff --git a/colm/ctinput.cc b/colm/ctinput.cc
index 90e794bd..624f88b0 100644
--- a/colm/ctinput.cc
+++ b/colm/ctinput.cc
@@ -117,10 +117,10 @@ int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *d
while ( true ) {
if ( buf == 0 )
- return 0;
+ break;
if ( buf->type == PatternItem::FactorType )
- return 0;
+ break;
assert ( buf->type == PatternItem::InputText );
int avail = buf->data.length() - offset;
@@ -130,24 +130,14 @@ int inputStreamPatternGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *d
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;
- }
+ memcpy( dest+copied, src, slen ) ;
+ copied += slen;
+ length -= slen;
}
+ if ( length == 0 )
+ break;
+
buf = buf->next;
offset = 0;
}
@@ -341,10 +331,10 @@ int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest
while ( true ) {
if ( buf == 0 )
- return 0;
+ break;
if ( buf->type == ConsItem::ExprType || buf->type == ConsItem::FactorType )
- return 0;
+ break;
assert ( buf->type == ConsItem::InputText );
int avail = buf->data.length() - offset;
@@ -354,24 +344,14 @@ int inputStreamConsGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest
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;
- }
+ memcpy( dest+copied, src, slen ) ;
+ copied += slen;
+ length -= slen;
}
+ if ( length == 0 )
+ break;
+
buf = buf->next;
offset = 0;
}
diff --git a/colm/input.c b/colm/input.c
index 9084b21e..3ce576b6 100644
--- a/colm/input.c
+++ b/colm/input.c
@@ -220,15 +220,11 @@ int fdGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length
RunBuf *runBuf = newRunBuf();
sourceStreamAppend( ss, runBuf );
int received = ss->funcs->getDataSource( ss, runBuf->data, FSM_BUFSIZE );
- if ( received == 0 ) {
- break;
- }
runBuf->length = received;
+ if ( received == 0 )
+ break;
- int slen = received < length ? received : length;
- memcpy( dest, runBuf->data, slen );
- copied = slen;
- break;
+ buf = runBuf;
}
int avail = buf->length - buf->offset;
@@ -238,23 +234,15 @@ int fdGetData( FsmRun *fsmRun, StreamImpl *ss, int skip, char *dest, int length
/* The source data from the current buffer. */
char *src = &buf->data[buf->offset];
- /* Need to skip? */
- if ( skip > 0 && skip >= avail ) {
- /* Skipping the the whole source. */
- skip -= avail;
- }
- else {
- /* Either skip is zero, or less than slen. Skip goes to zero.
- * Some data left over, copy it. */
- src += skip;
- avail -= skip;
- skip = 0;
+ int slen = avail < length ? avail : length;
+ memcpy( dest+copied, src, slen ) ;
+ copied += slen;
+ length -= slen;
+ }
- int slen = avail < length ? avail : length;
- memcpy( dest, src, slen ) ;
- copied += slen;
- break;
- }
+ if ( length == 0 ) {
+ debug( REALM_INPUT, "exiting get data\n", length );
+ break;
}
buf = buf->next;
@@ -588,50 +576,42 @@ static int _getData( FsmRun *fsmRun, StreamImpl *is, int skip, char *dest, int l
if ( buf->type == RunBufSourceType ) {
Stream *stream = (Stream*)buf->tree;
- copied += stream->in->funcs->getData( fsmRun, stream->in, skip, dest, length );
+ int glen = stream->in->funcs->getData( fsmRun, stream->in, 0, dest+copied, length );
- if ( copied == 0 ) {
+ if ( glen == 0 ) {
debug( REALM_INPUT, "skipping over input\n" );
buf = buf->next;
continue;
}
- //ret = type;
- break;
+ copied += glen;
+ length -= glen;
}
-
- if ( buf->type == RunBufTokenType )
+ else if ( buf->type == RunBufTokenType )
break;
-
- if ( buf->type == RunBufIgnoreType )
+ else if ( buf->type == RunBufIgnoreType )
break;
+ else {
+ int avail = buf->length - buf->offset;
- int avail = buf->length - buf->offset;
-
- /* Anything available in the current buffer. */
- if ( avail > 0 ) {
- /* The source data from the current buffer. */
- char *src = &buf->data[buf->offset];
-
- /* Need to skip? */
- if ( skip > 0 && skip >= avail ) {
- /* Skipping the the whole source. */
- skip -= avail;
- }
- else {
- /* Either skip is zero, or less than slen. Skip goes to zero.
- * Some data left over, copy it. */
- src += skip;
- avail -= skip;
- skip = 0;
+ /* Anything available in the current buffer. */
+ if ( avail > 0 ) {
+ /* The source data from the current buffer. */
+ char *src = &buf->data[buf->offset];
int slen = avail <= length ? avail : length;
- memcpy( dest, src, slen ) ;
+ memcpy( dest+copied, src, slen ) ;
+
copied += slen;
- break;
+ length -= slen;
}
}
+ if ( length == 0 ) {
+ debug( REALM_INPUT, "exiting get data\n", length );
+ break;
+ }
+
buf = buf->next;
}
diff --git a/colm/pdarun.c b/colm/pdarun.c
index d5fab334..39ee60c3 100644
--- a/colm/pdarun.c
+++ b/colm/pdarun.c
@@ -792,9 +792,7 @@ Head *extractMatch( Program *prg, FsmRun *fsmRun, StreamImpl *is )
runBuf->next = fsmRun->consumeBuf;
fsmRun->consumeBuf = runBuf;
- int total = is->funcs->getData( fsmRun, is, 0, runBuf->data, length );
- while ( total < length )
- total += is->funcs->getData( fsmRun, is, total, runBuf->data+total, length-total );
+ is->funcs->getData( fsmRun, is, 0, runBuf->data, length );
is->funcs->consumeData( is, length );