stream: stream_sv and stream_sv_abs
Just straight string views into the current stream content - obviously may not be stable. Helpful when analysing a non-moving stream.
This commit is contained in:
@@ -70,6 +70,12 @@ u64 stream_seek(stream_t *, i64);
|
|||||||
u64 stream_seek_forward(stream_t *, u64);
|
u64 stream_seek_forward(stream_t *, u64);
|
||||||
u64 stream_seek_backward(stream_t *, u64);
|
u64 stream_seek_backward(stream_t *, u64);
|
||||||
|
|
||||||
|
// Return a string view to stream data relative to the current position of the
|
||||||
|
// stream
|
||||||
|
sv_t stream_sv(stream_t *);
|
||||||
|
// Return a string view to data from the start of the stream
|
||||||
|
sv_t stream_sv_abs(stream_t *);
|
||||||
|
|
||||||
// Return a relative substring of a given size
|
// Return a relative substring of a given size
|
||||||
sv_t stream_substr(stream_t *, u64);
|
sv_t stream_substr(stream_t *, u64);
|
||||||
// Return an absolute substring at given index and of given size.
|
// Return an absolute substring at given index and of given size.
|
||||||
|
|||||||
43
src/stream.c
43
src/stream.c
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#include <alisp/base.h>
|
#include <alisp/base.h>
|
||||||
#include <alisp/stream.h>
|
#include <alisp/stream.h>
|
||||||
|
#include <alisp/sv.h>
|
||||||
|
#include <alisp/vec.h>
|
||||||
|
|
||||||
const char *stream_err_to_cstr(stream_err_t err)
|
const char *stream_err_to_cstr(stream_err_t err)
|
||||||
{
|
{
|
||||||
@@ -310,6 +312,32 @@ u64 stream_seek_backward(stream_t *stream, u64 offset)
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sv_t stream_sv(stream_t *stream)
|
||||||
|
{
|
||||||
|
return sv_chop_left(stream_sv_abs(stream), stream->position);
|
||||||
|
}
|
||||||
|
|
||||||
|
sv_t stream_sv_abs(stream_t *stream)
|
||||||
|
{
|
||||||
|
if (!stream)
|
||||||
|
return SV(NULL, 0);
|
||||||
|
sv_t sv = {0};
|
||||||
|
switch (stream->type)
|
||||||
|
{
|
||||||
|
case STREAM_TYPE_STRING:
|
||||||
|
sv = stream->string;
|
||||||
|
break;
|
||||||
|
case STREAM_TYPE_PIPE:
|
||||||
|
case STREAM_TYPE_FILE:
|
||||||
|
sv = SV((char *)vec_data(&stream->pipe.cache), stream_size(stream));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FAIL("Unreachable");
|
||||||
|
return SV(NULL, 0);
|
||||||
|
}
|
||||||
|
return sv;
|
||||||
|
}
|
||||||
|
|
||||||
sv_t stream_substr(stream_t *stream, u64 size)
|
sv_t stream_substr(stream_t *stream, u64 size)
|
||||||
{
|
{
|
||||||
if (stream_eoc(stream))
|
if (stream_eoc(stream))
|
||||||
@@ -324,21 +352,6 @@ sv_t stream_substr(stream_t *stream, u64 size)
|
|||||||
if (successful != size)
|
if (successful != size)
|
||||||
return SV(NULL, 0);
|
return SV(NULL, 0);
|
||||||
|
|
||||||
char *ptr = NULL;
|
|
||||||
switch (stream->type)
|
|
||||||
{
|
|
||||||
case STREAM_TYPE_STRING:
|
|
||||||
ptr = stream->string.data;
|
|
||||||
break;
|
|
||||||
case STREAM_TYPE_PIPE:
|
|
||||||
case STREAM_TYPE_FILE:
|
|
||||||
ptr = (char *)vec_data(&stream->pipe.cache);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
FAIL("Unreachable");
|
|
||||||
return SV(NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return SV(ptr + stream->position, size);
|
return SV(ptr + stream->position, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user