summaryrefslogtreecommitdiff
path: root/kernel/lib/buffered_write.c
blob: e948e002e1b6442d293b0c526df8f7cef77a84a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <lib/buffered_write.h>
#include <kmalloc.h>

int buffered_init(struct buffered *ctx, u16 size) {
  ctx->data = kmalloc(size);
  if (NULL == ctx->data) {
    return 0;
  }
  ctx->buffer_size = size;
  ctx->buffer_usage = 0;
  return 1;
}

int buffered_write(struct buffered *ctx, u8 *data, u16 length) {
  if (length + ctx->buffer_usage > ctx->buffer_size) {
    return 0;
  }
  u8 *data_ptr = ctx->data;
  data_ptr += ctx->buffer_usage;

  memcpy(data_ptr, data, length);
  ctx->buffer_usage += length;
  return 1;
}

void buffered_clear(struct buffered *ctx) {
  ctx->buffer_usage = 0;
}

void buffered_free(struct buffered *ctx) {
  kfree(ctx->data);
}