summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-06-27 11:56:06 -0400
committerAdrian Thurston <thurston@complang.org>2015-06-27 11:56:06 -0400
commitefa48c2c34d3f7b4cfd91ea5c06897531270c69d (patch)
treed8f5a28beea51e09e51e538e2ee5c49e71c38963
parent398879f0284a0a950fc0bec9d3f82d659770c0bf (diff)
downloadcolm-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.cc19
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 =