/* * 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; }