Alex 'AdUser' Z
4 years ago
4 changed files with 139 additions and 0 deletions
@ -0,0 +1,74 @@ |
|||||||
|
#include "common.h" |
||||||
|
#include "buf.h" |
||||||
|
|
||||||
|
bool |
||||||
|
f2b_buf_alloc(f2b_buf_t *buf, size_t size) { |
||||||
|
assert(buf != NULL); |
||||||
|
assert(size > 0); |
||||||
|
|
||||||
|
memset(buf, 0x0, sizeof(f2b_buf_t)); |
||||||
|
if ((buf->data = malloc(size)) == NULL) |
||||||
|
return false; /* can't allocate memory */ |
||||||
|
|
||||||
|
buf->size = size; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
f2b_buf_free(f2b_buf_t *buf) { |
||||||
|
assert(buf != NULL); |
||||||
|
|
||||||
|
free(buf->data); |
||||||
|
memset(buf, 0x0, sizeof(f2b_buf_t)); |
||||||
|
} |
||||||
|
|
||||||
|
bool |
||||||
|
f2b_buf_append(f2b_buf_t *buf, const char *str, size_t len) { |
||||||
|
|
||||||
|
assert(buf != NULL); |
||||||
|
assert(str != NULL); |
||||||
|
|
||||||
|
if (len == 0) |
||||||
|
len = strlen(str); |
||||||
|
if (buf->size < (buf->used + len)) |
||||||
|
return false; /* not enough space */ |
||||||
|
|
||||||
|
memcpy(&buf->data[buf->used], str, len); |
||||||
|
buf->used += len; |
||||||
|
buf->data[buf->used] = '\0'; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extracts line terminated by '\r', '\n' |
||||||
|
* @return Pointer to extracted string on success or NULL otherwise |
||||||
|
* @note Use only with 'read' buffer type |
||||||
|
*/ |
||||||
|
char * |
||||||
|
f2b_buf_extract(f2b_buf_t *buf, const char *end) { |
||||||
|
char *s = NULL; |
||||||
|
size_t len = 0; |
||||||
|
|
||||||
|
assert(buf != NULL); |
||||||
|
assert(end != NULL); |
||||||
|
|
||||||
|
if (buf->data == NULL || buf->used == 0) |
||||||
|
return NULL; /* no data */ |
||||||
|
|
||||||
|
if ((s = strstr(buf->data, end)) == NULL) |
||||||
|
return NULL; /* not found */ |
||||||
|
|
||||||
|
/* copy the data before modifying buffer */ |
||||||
|
len = s - buf->data; |
||||||
|
if ((s = strndup(buf->data, len)) == NULL) |
||||||
|
return NULL; /* malloc error */ |
||||||
|
|
||||||
|
/* shift data inside buffer */ |
||||||
|
len += strlen(end); |
||||||
|
assert(buf->used >= len); |
||||||
|
buf->used -= len, |
||||||
|
memmove(buf->data, &buf->data[len], buf->used); |
||||||
|
buf->data[buf->used] = '\0'; |
||||||
|
|
||||||
|
return s; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
#ifndef F2B_BUF_H_ |
||||||
|
#define F2B_BUF_H_ |
||||||
|
|
||||||
|
typedef struct f2b_buf_t { |
||||||
|
size_t used; /**< bytes used in buffer */ |
||||||
|
size_t size; /**< available size in data */ |
||||||
|
char *data; /**< allocated buffer */ |
||||||
|
} f2b_buf_t; |
||||||
|
|
||||||
|
bool f2b_buf_alloc(f2b_buf_t *buf, size_t max); |
||||||
|
void f2b_buf_free(f2b_buf_t *buf); |
||||||
|
bool f2b_buf_append(f2b_buf_t *buf, const char *str, size_t size); |
||||||
|
char * f2b_buf_extract(f2b_buf_t *buf, const char *end); |
||||||
|
|
||||||
|
#endif /* F2B_BUF_H_ */ |
@ -0,0 +1,48 @@ |
|||||||
|
#include "../src/common.h" |
||||||
|
#include "../src/buf.h" |
||||||
|
|
||||||
|
int main() { |
||||||
|
f2b_buf_t buf; |
||||||
|
char *line; |
||||||
|
bool ret; |
||||||
|
|
||||||
|
memset(&buf, 0x0, sizeof(buf)); |
||||||
|
|
||||||
|
ret = f2b_buf_alloc(&buf, 512); |
||||||
|
assert(ret = true); |
||||||
|
assert(buf.used == 0); |
||||||
|
assert(buf.size == 512); |
||||||
|
|
||||||
|
ret = f2b_buf_append(&buf, "test ", 0); |
||||||
|
assert(ret == true); |
||||||
|
assert(buf.used == 5); |
||||||
|
|
||||||
|
line = f2b_buf_extract(&buf, "\n"); |
||||||
|
assert(line == NULL); |
||||||
|
|
||||||
|
ret = f2b_buf_append(&buf, "test2\n", 0); |
||||||
|
assert(ret == true); |
||||||
|
assert(buf.used == 11); |
||||||
|
|
||||||
|
ret = f2b_buf_append(&buf, "test3\n", 0); |
||||||
|
assert(ret == true); |
||||||
|
assert(buf.used == 17); |
||||||
|
|
||||||
|
line = f2b_buf_extract(&buf, "\n"); |
||||||
|
assert(line != NULL); |
||||||
|
assert(strcmp(line, "test test2") == 0); |
||||||
|
assert(buf.used == 6); |
||||||
|
free(line); |
||||||
|
|
||||||
|
line = f2b_buf_extract(&buf, "\n"); |
||||||
|
assert(line != NULL); |
||||||
|
assert(buf.used == 0); |
||||||
|
free(line); |
||||||
|
|
||||||
|
f2b_buf_free(&buf); |
||||||
|
assert(buf.used == 0); |
||||||
|
assert(buf.size == 0); |
||||||
|
assert(buf.data == NULL); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue