From c7552a1f5bcc620f5a5c5ef51ba091529775adf6 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Wed, 6 Feb 2013 21:37:01 -0500 Subject: 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. --- colm/ctinput.cc | 52 +++++++++++------------------------- colm/input.c | 82 ++++++++++++++++++++++----------------------------------- colm/pdarun.c | 4 +-- 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 ); -- cgit v1.2.1