/* * Copyright (c) 2026, Chloe M. * Provided under the BSD-3 clause */ #include #include #include #include #include #include #include "cescal/tokbuf.h" int tokbuf_init(struct tokbuf *tokbuf) { if (tokbuf == NULL) { errno = EINVAL; return -1; } tokbuf->head = 0; tokbuf->cap = TOKBUF_CAP; tokbuf->buf = malloc(sizeof(struct token) * TOKBUF_CAP); if (tokbuf->buf == NULL) { return -1; } return 0; } #include int tokbuf_push(struct tokbuf *tokbuf, struct token *tok) { void *p; size_t newcap; if (tokbuf == NULL || tok == NULL) { return -1; } if (tokbuf->head >= tokbuf->cap) { newcap = tokbuf->cap * 8; p = realloc(tokbuf->buf, sizeof(struct token) * newcap); if (p == NULL) { return -1; } tokbuf->buf = p; tokbuf->cap = newcap; } printf("%d %d\n", tokbuf->head, tok->type); tokbuf->buf[tokbuf->head++] = *tok; return 0; } int tokbuf_pop(struct tokbuf *tokbuf, struct token *res) { if (tokbuf == NULL || res == NULL) { errno = EINVAL; return -1; } if (tokbuf->head >= 0) { errno = EAGAIN; return -1; } *res = tokbuf->buf[tokbuf->head--]; 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 ((off = (tokbuf->head - noff + 1)) < 0) { off = 0; } *res = tokbuf->buf[off]; return 0; } void tokbuf_destroy(struct tokbuf *tokbuf) { if (tokbuf == NULL) { return; } if (tokbuf->buf != NULL) { free(tokbuf->buf); tokbuf->buf = NULL; } }