diff options
| -rw-r--r-- | src/chunk.h | 92 | 
1 files changed, 92 insertions, 0 deletions
| diff --git a/src/chunk.h b/src/chunk.h new file mode 100644 index 0000000..f3841ed --- /dev/null +++ b/src/chunk.h @@ -0,0 +1,92 @@ +#ifndef _CHUNK_H_ +#define _CHUNK_H_ + +#include <string.h> +#include <ctype.h> +#include <stdlib.h> +#include <assert.h> +#include "buffer.h" + +typedef struct { +	const unsigned char *data; +	int len; +	int alloc; +} chunk; + +static inline void chunk_free(chunk *c) +{ +	if (c->alloc) +		free((char *)c->data); + +	c->data = NULL; +	c->alloc = 0; +	c->len = 0; +} + +static inline void chunk_ltrim(chunk *c) +{ +	assert(!c->alloc); + +	while (c->len && isspace(c->data[0])) { +		c->data++; +		c->len--; +	} +} + +static inline void chunk_rtrim(chunk *c) +{ +	while (c->len > 0) { +		if (!isspace(c->data[c->len - 1])) +			break; + +		c->len--; +	} +} + +static inline void chunk_trim(chunk *c) +{ +	chunk_ltrim(c); +	chunk_rtrim(c); +} + +static inline int chunk_strchr(chunk *ch, int c, int offset) +{ +	const unsigned char *p = memchr(ch->data + offset, c, ch->len - offset); +	return p ? (int)(p - ch->data) : ch->len; +} + +static inline unsigned char *chunk_to_cstr(chunk *c) +{ +	unsigned char *str; + +	str = malloc(c->len + 1); +	memcpy(str, c->data, c->len); +	str[c->len] = 0; + +	return str; +} + +static inline chunk chunk_literal(const char *data) +{ +	chunk c = {(const unsigned char *)data, data ? strlen(data) : 0, 0}; +	return c; +} + +static inline chunk chunk_dup(const chunk *ch, int pos, int len) +{ +	chunk c = {ch->data + pos, len, 0}; +	return c; +} + +static inline chunk chunk_buf_detach(gh_buf *buf) +{ +	chunk c; + +	c.len = buf->size; +	c.data = gh_buf_detach(buf); +	c.alloc = 1; + +	return c; +} + +#endif | 
