Mercurial > hg > nnchat
diff libnnchat.c @ 65:e763ef5cfd53
Move more functions to libnnchat.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 11 Nov 2008 23:57:49 +0200 |
parents | 6a3a917303e4 |
children | 3a23c2adfb78 |
line wrap: on
line diff
--- a/libnnchat.c Tue Nov 11 22:33:35 2008 +0200 +++ b/libnnchat.c Tue Nov 11 23:57:49 2008 +0200 @@ -336,3 +336,145 @@ return sendToSocket(sock, tmpBuf2, strlen(tmpBuf2) + 1); } + +ringbuf_t * newRingBuf(const size_t size) +{ + ringbuf_t *res = th_calloc(1, sizeof(ringbuf_t)); + + res->data = (char **) th_malloc(size * sizeof(char *)); + res->size = size; + res->n = 0; + + return res; +} + + +void freeRingBuf(ringbuf_t *buf) +{ + size_t i; + + for (i = 0; i < buf->n; i++) + th_free(buf->data[i]); + + th_free(buf->data); + th_free(buf); +} + + +void addRingBuf(ringbuf_t *buf, const char *str) +{ + if (buf->n < buf->size) { + buf->data[buf->n] = strdup(str); + buf->n++; + } else { + th_free(buf->data[0]); + memmove(&(buf->data[0]), &(buf->data[1]), buf->size - 1); + buf->data[buf->size - 1] = strdup(str); + } +} + + +int writeBuf(editbuf_t *buf, ssize_t pos, int ch) +{ + /* Check arguments */ + if (buf->len+1 >= buf->size) return -3; + + if (pos < 0) + return -1; + else if (pos >= buf->len) { + buf->data[buf->len++] = ch; + } else { + buf->data[pos] = ch; + } + return 0; +} + + +int insertBuf(editbuf_t *buf, ssize_t pos, int ch) +{ + /* Check arguments */ + if (buf->len+1 >= buf->size) return -3; + + if (pos < 0) + return -1; + else if (pos >= buf->len) { + buf->data[buf->len] = ch; + } else { + memmove(&(buf->data[pos+1]), &(buf->data[pos]), buf->len - pos + 1); + buf->data[pos] = ch; + } + buf->len++; + return 0; +} + + +int deleteBuf(editbuf_t *buf, ssize_t pos) +{ + /* Check arguments */ + if (pos < 0) + return -1; + else if (pos < buf->len) { + memmove(&(buf->data[pos]), &(buf->data[pos+1]), buf->len - pos); + buf->len--; + return 0; + } else + return -2; +} + + +void clearBuf(editbuf_t *buf) +{ + buf->len = 0; + buf->pos = 0; +} + + +editbuf_t * newBuf(ssize_t n) +{ + editbuf_t *res = th_calloc(1, sizeof(editbuf_t)); + + res->data = (char *) th_malloc(n); + res->size = n; + + return res; +} + + +void freeBuf(editbuf_t *buf) +{ + if (buf) { + th_free(buf->data); + th_free(buf); + } +} + + +editbuf_t * copyBuf(editbuf_t *src) +{ + editbuf_t *res; + + assert(src != NULL); + + if (src == NULL) return NULL; + + if ((res = newBuf(src->size)) == NULL) + return NULL; + + memcpy(res->data, src->data, src->size); + res->pos = res->len = src->len; + + return res; +} + + +void setBufPos(editbuf_t *buf, ssize_t pos) +{ + /* Check arguments */ + if (pos < 0) + buf->pos = 0; + else if (pos >= buf->len) + buf->pos = buf->len; + else + buf->pos = pos; +} +