diff options
author | Adrian Thurston <thurston@complang.org> | 2015-06-27 11:56:06 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-06-27 11:56:06 -0400 |
commit | efa48c2c34d3f7b4cfd91ea5c06897531270c69d (patch) | |
tree | d8f5a28beea51e09e51e538e2ee5c49e71c38963 | |
parent | 398879f0284a0a950fc0bec9d3f82d659770c0bf (diff) | |
download | colm-efa48c2c34d3f7b4cfd91ea5c06897531270c69d.tar.gz |
fix for putting back to the compile-time input streams
Need to be able to cross back over buffer boundaries.
-rw-r--r-- | src/ctinput.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/ctinput.cc b/src/ctinput.cc index e7671952..6b22d048 100644 --- a/src/ctinput.cc +++ b/src/ctinput.cc @@ -433,8 +433,23 @@ int inputStreamConsConsumeData( program_t *prg, tree_t **sp, int inputStreamConsUndoConsumeData( struct stream_impl *ss, const char *data, int length ) { - ss->offset -= length; - return length; + int origLen = length; + while ( true ) { + int avail = ss->offset; + + /* Okay to go up to the front of the buffer. */ + if ( length > avail ) { + ss->cons_item= ss->cons_item->prev; + ss->offset = ss->cons_item->data.length(); + length -= avail; + } + else { + ss->offset -= length; + break; + } + } + + return origLen; } stream_funcs replFuncs = |