diff options
Diffstat (limited to 'kernel/lib/sb.c')
-rw-r--r-- | kernel/lib/sb.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/lib/sb.c b/kernel/lib/sb.c index 6f716ac..ca302f7 100644 --- a/kernel/lib/sb.c +++ b/kernel/lib/sb.c @@ -11,6 +11,7 @@ void sb_init(struct sb *ctx) { } int sb_init_capacity(struct sb *ctx, size_t starting_capacity) { + ctx->to_ignore = 0; ctx->length = 0; ctx->prebuffer = 0; ctx->string = kmalloc(starting_capacity); @@ -27,6 +28,7 @@ void sb_init_buffer(struct sb *ctx, char *buffer, size_t size) { ctx->capacity = size; ctx->length = 0; ctx->prebuffer = 1; + ctx->to_ignore = 0; } void sb_free(struct sb *ctx) { @@ -40,8 +42,13 @@ void sb_free(struct sb *ctx) { ctx->string = NULL; } +void sb_set_ignore(struct sb *ctx, size_t n) { + ctx->to_ignore = n; +} + void sb_reset(struct sb *ctx) { ctx->length = 0; + ctx->to_ignore = 0; } int sb_isempty(const struct sb *ctx) { @@ -64,6 +71,10 @@ int sb_increase_buffer(struct sb *ctx, size_t min) { } int sb_append_char(struct sb *ctx, char c) { + if (ctx->to_ignore > 0) { + ctx->to_ignore--; + return 1; + } if (1 > ctx->capacity - ctx->length) { if (!sb_increase_buffer(ctx, 1)) { return 0; @@ -82,6 +93,13 @@ int sb_delete_right(struct sb *ctx, size_t n) { int sb_append(struct sb *ctx, const char *s) { size_t l = strlen(s); + if (ctx->to_ignore >= l) { + ctx->to_ignore -= l; + return 1; + } + l -= ctx->to_ignore; + s += ctx->to_ignore; + ctx->to_ignore = 0; if (l > ctx->capacity - ctx->length) { if (!sb_increase_buffer(ctx, l)) { return 0; @@ -97,6 +115,13 @@ int sb_prepend_sv(struct sb *ctx, struct sv sv) { } int sb_prepend_buffer(struct sb *ctx, const char *buffer, size_t length) { + if (ctx->to_ignore >= length) { + ctx->to_ignore -= length; + return 1; + } + length -= ctx->to_ignore; + buffer += ctx->to_ignore; + ctx->to_ignore = 0; if (length > ctx->capacity - ctx->length) { if (!sb_increase_buffer(ctx, length)) { return 0; @@ -109,6 +134,13 @@ int sb_prepend_buffer(struct sb *ctx, const char *buffer, size_t length) { } int sb_append_buffer(struct sb *ctx, const char *buffer, size_t length) { + if (ctx->to_ignore >= length) { + ctx->to_ignore -= length; + return 1; + } + length -= ctx->to_ignore; + buffer += ctx->to_ignore; + ctx->to_ignore = 0; if (length > ctx->capacity - ctx->length) { if (!sb_increase_buffer(ctx, length)) { return 0; |