From 7ca45808939579b427f32641b0dcb9cb585b8e80 Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Sat, 23 May 2026 02:57:50 -0400 Subject: core: Add token buffer Signed-off-by: Chloe M. --- core/tokbuf.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core/tokbuf.c (limited to 'core/tokbuf.c') diff --git a/core/tokbuf.c b/core/tokbuf.c new file mode 100644 index 0000000..e880c15 --- /dev/null +++ b/core/tokbuf.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause + */ + +#include +#include +#include +#include +#include +#include "cescal/tokbuf.h" + +int +tokbuf_init(struct tokbuf *tokbuf) +{ + if (tokbuf == NULL) { + errno = EINVAL; + return -1; + } + + memset(tokbuf->buf, 0, sizeof(tokbuf->buf)); + tokbuf->head = 0; + return 0; +} + +int +tokbuf_push(struct tokbuf *tokbuf, struct token *tok) +{ + if (tokbuf == NULL || tok == NULL) { + return -1; + } + + if ((tokbuf->head++) >= TOKBUF_CAP) { + tokbuf->head = 0; + } + + tokbuf->buf[tokbuf->head] = *tok; + return 0; +} + +int +tokbuf_noff(struct tokbuf *tokbuf, size_t noff, struct token *res) +{ + ssize_t off; + + if (tokbuf == NULL || res == NULL) { + errno = EINVAL; + return -1; + } + + if (noff == 0) { + *res = tokbuf->buf[tokbuf->head + 1]; + return 0; + } + + if ((off = (tokbuf->head - noff + 1)) < 0) { + off = 0; + } + + *res = tokbuf->buf[off]; + return 0; +} -- cgit v1.2.3