diff options
author | Lucas De Marchi <lucas.demarchi@intel.com> | 2014-10-11 13:03:21 -0300 |
---|---|---|
committer | Lucas De Marchi <lucas.demarchi@intel.com> | 2014-10-11 13:09:42 -0300 |
commit | b4d1f44af16809e70ac5800c7539875832757679 (patch) | |
tree | 05536e81db5f080032aa20d42c431734964e151d /shared/strbuf.c | |
parent | 4328982058bd6840518ff552a0405bf8f9d73909 (diff) | |
download | kmod-b4d1f44af16809e70ac5800c7539875832757679.tar.gz kmod-b4d1f44af16809e70ac5800c7539875832757679.tar.bz2 kmod-b4d1f44af16809e70ac5800c7539875832757679.zip |
Move strbuf implementation to shared/
Just move the strbuf-like implementation to shared/. No renames were
made yet to avoid cluttering the diff. It will come in a separate patch.
Diffstat (limited to 'shared/strbuf.c')
-rw-r--r-- | shared/strbuf.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/shared/strbuf.c b/shared/strbuf.c new file mode 100644 index 0000000..5974660 --- /dev/null +++ b/shared/strbuf.c @@ -0,0 +1,123 @@ +/* + * libkmod - interface to kernel module operations + * + * Copyright (C) 2011-2013 ProFUSION embedded systems + * Copyright (C) 2014 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <assert.h> +#include <stdbool.h> +#include <stdlib.h> + +#include "util.h" +#include "strbuf.h" + +#define BUF_STEP (2048) + +static bool buf_grow(struct buffer *buf, size_t newsize) +{ + void *tmp; + size_t sz; + + if (newsize % BUF_STEP == 0) + sz = newsize; + else + sz = ((newsize / BUF_STEP) + 1) * BUF_STEP; + + if (buf->size == sz) + return true; + + tmp = realloc(buf->bytes, sz); + if (sz > 0 && tmp == NULL) + return false; + buf->bytes = tmp; + buf->size = sz; + return true; +} + +void buf_init(struct buffer *buf) +{ + buf->bytes = NULL; + buf->size = 0; + buf->used = 0; +} + +void buf_release(struct buffer *buf) +{ + free(buf->bytes); +} + +char *buf_steal(struct buffer *buf) +{ + char *bytes; + + bytes = realloc(buf->bytes, buf->used + 1); + if (!bytes) { + free(buf->bytes); + return NULL; + } + bytes[buf->used] = '\0'; + return bytes; +} + +const char *buf_str(struct buffer *buf) +{ + if (!buf_grow(buf, buf->used + 1)) + return NULL; + buf->bytes[buf->used] = '\0'; + return buf->bytes; +} + +bool buf_pushchar(struct buffer *buf, char ch) +{ + if (!buf_grow(buf, buf->used + 1)) + return false; + buf->bytes[buf->used] = ch; + buf->used++; + return true; +} + +unsigned buf_pushchars(struct buffer *buf, const char *str) +{ + unsigned i = 0; + int ch; + + while ((ch = str[i])) { + buf_pushchar(buf, ch); + i++; + } + + return i; +} + +void buf_popchar(struct buffer *buf) +{ + assert(buf->used > 0); + buf->used--; +} + +void buf_popchars(struct buffer *buf, unsigned n) +{ + assert(buf->used >= n); + buf->used -= n; +} + +void buf_clear(struct buffer *buf) +{ + buf->used = 0; +} + |