diff options
| author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-08-29 08:41:49 +0100 | 
|---|---|---|
| committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-08-29 08:42:03 +0100 | 
| commit | d73380035c8bbdc966685f30cf91c46d0039cba1 (patch) | |
| tree | 28091aa7d41110c06ba0ca9104986159e3de59cc | |
| parent | 29d245328823b303047e45e11f82fb1513b5638d (diff) | |
| download | alisp-d73380035c8bbdc966685f30cf91c46d0039cba1.tar.gz alisp-d73380035c8bbdc966685f30cf91c46d0039cba1.tar.bz2 alisp-d73380035c8bbdc966685f30cf91c46d0039cba1.zip  | |
Fixed some more issues with streams (stdin/pipe based)
substr didn't work properly, nor did seek.  Just use the same
principle as stream_next
| -rw-r--r-- | stream.c | 30 | 
1 files changed, 16 insertions, 14 deletions
@@ -188,18 +188,18 @@ bool stream_seek(stream_t *stream, i64 offset)  bool stream_seek_forward(stream_t *stream, u64 offset)  { -  if (stream_eos(stream)) +  if (stream_eos(stream) && stream_eoc(stream))      return false; +    switch (stream->type)    {    case STREAM_TYPE_STRING:    { -    if (stream->position + offset < stream->string.size) -    { -      stream->position += offset; -      return true; -    } -    return false; +    if (stream->position + offset >= stream->string.size) +      return false; + +    stream->position += offset; +    return true;    }    case STREAM_TYPE_FILE:    { @@ -219,7 +219,7 @@ bool stream_seek_forward(stream_t *stream, u64 offset)           read_chunk = stream_chunk(stream))        continue; -    // Same principle as the stream_eos(stream) check. +    // Same principle as the stream_eoc(stream) check.      if (stream->position + offset >= stream->pipe.cache.size)        return false;      stream->position += offset; @@ -242,12 +242,15 @@ bool stream_seek_backward(stream_t *stream, u64 offset)  sv_t stream_substr(stream_t *stream, u64 size)  { -  if (stream_eos(stream)) +  if (stream_eos(stream) && stream_eoc(stream))      return SV(NULL, 0); + +  // TODO: this is kinda disgusting, any better way of doing this    u64 current_position = stream->position;    bool successful      = stream_seek_forward(stream, size); -  // In case we did happen to move forward +  // Reset the position in either situation    stream->position = current_position; +    if (!successful)      return SV(NULL, 0); @@ -270,16 +273,15 @@ sv_t stream_substr(stream_t *stream, u64 size)  sv_t stream_substr_abs(stream_t *stream, u64 index, u64 size)  { -    switch (stream->type)    {    case STREAM_TYPE_STRING: -    if (index + size < stream_size(stream)) +    if (index + size <= stream_size(stream))        return SV(stream->string.data + index, size);      return SV(NULL, 0);    case STREAM_TYPE_FILE:    { -    if (index + size < stream_size(stream)) +    if (index + size <= stream_size(stream))        return SV(vec_data(&stream->pipe.cache) + index, size);      // stream_size(stream) <= index + size => try reading chunks      for (bool read_chunk = stream_chunk(stream); @@ -287,7 +289,7 @@ sv_t stream_substr_abs(stream_t *stream, u64 index, u64 size)           read_chunk = stream_chunk(stream))        continue; -    if (index + size >= stream_size(stream)) +    if (index + size > stream_size(stream))        return SV(NULL, 0);      return SV(vec_data(&stream->pipe.cache) + index, size);    }  | 
