diff --git a/core/stream.c b/core/stream.c index 0880c50..536642e 100644 --- a/core/stream.c +++ b/core/stream.c @@ -9,7 +9,7 @@ #define IDX_STDOUT 1 #define IDX_STDERR 2 -static b_status stdio_read( +static enum b_status stdio_read( struct b_stream *stream, unsigned char *out, size_t max, size_t *nr_read) { FILE *fp = stream->s_ptr; @@ -25,7 +25,7 @@ static b_status stdio_read( return status; } -static b_status stdio_write( +static enum b_status stdio_write( struct b_stream *stream, const unsigned char *data, size_t count, size_t *nr_written) { @@ -41,20 +41,50 @@ static b_status stdio_write( return status; } +static enum b_status stdio_seek( + struct b_stream *stream, long long offset, b_stream_seek_origin origin) +{ + FILE *fp = stream->s_ptr; + int whence = 0; + switch (origin) { + case B_STREAM_SEEK_START: + whence = SEEK_SET; + break; + case B_STREAM_SEEK_CURRENT: + whence = SEEK_CUR; + break; + case B_STREAM_SEEK_END: + whence = SEEK_END; + break; + default: + return B_ERR_INVALID_ARGUMENT; + } + + int ret = fseek(fp, offset, whence); + if (ret != 0) { + return B_ERR_NOT_SUPPORTED; + } + + return B_SUCCESS; +} + static struct b_stream stdio[] = { [IDX_STDIN] = { .s_mode = B_STREAM_READ, .s_read = stdio_read, + .s_seek = stdio_seek, .s_ptr = NULL, /* set to stdin (stdio.h) at runtime */ }, [IDX_STDOUT] = { .s_mode = B_STREAM_WRITE, .s_write = stdio_write, + .s_seek = stdio_seek, .s_ptr = NULL, /* set to stdout (stdio.h) at runtime */ }, [IDX_STDERR] = { .s_mode = B_STREAM_WRITE, .s_write = stdio_write, + .s_seek = stdio_seek, .s_ptr = NULL, /* set to stderr (stdio.h) at runtime */ }, }; @@ -138,6 +168,7 @@ struct b_stream *b_stream_open_fp(FILE *fp) stream->s_ptr = fp; stream->s_read = stdio_read; stream->s_write = stdio_write; + stream->s_seek = stdio_seek; return stream; }