diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/state.c | 1 | ||||
| -rw-r--r-- | core/tokbuf.c | 33 |
2 files changed, 31 insertions, 3 deletions
diff --git a/core/state.c b/core/state.c index 8c8639c..ef9d522 100644 --- a/core/state.c +++ b/core/state.c @@ -48,4 +48,5 @@ state_close(struct cescal_state *state) close(state->in_fd); state->in_fd = -1; ptrbox_destroy(&state->ptrbox); + tokbuf_destroy(&state->tokbuf); } diff --git a/core/tokbuf.c b/core/tokbuf.c index 05e8755..6df5686 100644 --- a/core/tokbuf.c +++ b/core/tokbuf.c @@ -5,6 +5,7 @@ #include <sys/types.h> #include <stdint.h> +#include <stdlib.h> #include <stddef.h> #include <string.h> #include <errno.h> @@ -18,20 +19,33 @@ tokbuf_init(struct tokbuf *tokbuf) return -1; } - memset(tokbuf->buf, 0, sizeof(tokbuf->buf)); tokbuf->head = 0; + tokbuf->cap = TOKBUF_CAP; + tokbuf->buf = malloc(sizeof(struct token) * TOKBUF_CAP); + if (tokbuf->buf == NULL) { + return -1; + } + return 0; } int tokbuf_push(struct tokbuf *tokbuf, struct token *tok) { + void *p; + if (tokbuf == NULL || tok == NULL) { return -1; } - if ((tokbuf->head++) >= TOKBUF_CAP - 1) { - tokbuf->head = 0; + if ((tokbuf->head++) >= tokbuf->cap - 1) { + tokbuf->cap += 8; + p = realloc(tokbuf->buf, sizeof(struct token) * tokbuf->cap); + if (tokbuf->buf == NULL) { + return -1; + } + + tokbuf->buf = p; } tokbuf->buf[tokbuf->head] = *tok; @@ -60,3 +74,16 @@ tokbuf_noff(struct tokbuf *tokbuf, size_t noff, struct token *res) *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; + } +} |
