From 379fde98409617ac4a094ccdd319a55943820d2a Mon Sep 17 00:00:00 2001 From: Mohamed Aslan Date: Fri, 3 Nov 2017 17:41:37 -0600 Subject: [PATCH] implement missing function in buffer.c --- buffer.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- regress/buf.c | 32 ++++++++++++++++++++++++++------ 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/buffer.c b/buffer.c index 3f2cab6..a3ff83b 100644 --- a/buffer.c +++ b/buffer.c @@ -23,14 +23,18 @@ struct rbuffer * rbuffer_new(size_t capacity) { - struct rbuffer *rbuf = malloc(sizeof(struct rbuffer)); + struct rbuffer *rbuf; + rbuf = malloc(sizeof(struct rbuffer)); if (rbuf == NULL) goto ret; - rbuf->rb_capacity = capacity > 0 ? capacity : BUFSIZ; rbuf->rb_len = 0; rbuf->rb_data = reallocarray(NULL, rbuf->rb_capacity, sizeof(char)); + if (rbuf->rb_data == NULL) { + free(rbuf); + goto ret; + } rbuf->rb_wp = rbuf->rb_data; rbuf->rb_rp = rbuf->rb_data; ret: @@ -108,4 +112,41 @@ rbuffer_read(struct rbuffer *rbuf, size_t len) return str; } +static int +rbuffer_find(struct rbuffer *rbuf, char ch, size_t *len) +{ + char *ptr = rbuf->rb_rp; + size_t n, m; + + n = MIN(rbuf->rb_len, (rbuf->rb_data + rbuf->rb_capacity) - rbuf->rb_rp); + m = rbuf->rb_len - n; + for (ptr = rbuf->rb_rp ; n-- ; ptr++) { + if (*ptr == ch) { + *len = rbuf->rb_len - n - m; + return 1; + } + } + for (ptr = rbuf->rb_data ; m-- ; ptr++) { + if (*ptr == ch) { + *len = rbuf->rb_len - m; + return 1; + } + } + return 0; +} +char * +rbuffer_readline(struct rbuffer *rbuf) +{ + char *str; + size_t n; + + if (!rbuf->rb_len) + return NULL; + if (rbuffer_find(rbuf, '\n', &n)) { + str = rbuffer_read(rbuf, n); + str[n - 1] = '\0'; + return str; + } + return NULL; +} diff --git a/regress/buf.c b/regress/buf.c index c1db5df..1ee41cb 100644 --- a/regress/buf.c +++ b/regress/buf.c @@ -25,15 +25,12 @@ main(int argc, char **argv) { struct rbuffer *rb; char *str; - char *str1 = "1234567890XY"; - char *str2 = "ABCDEFGHI"; - char *str3 = "J"; int i; rb = rbuffer_new(10); if (rb == NULL) return 1; - rbuffer_write(rb, str1, strlen(str1)); + rbuffer_write(rb, "1234567890XY", 12); /* test: insertion */ if (strncmp(rb->rb_data, "XY34567890", 10)) { @@ -44,7 +41,7 @@ main(int argc, char **argv) return 1; } - rbuffer_write(rb, str2, strlen(str2)); + rbuffer_write(rb, "ABCDEFGHI", 9); if (strncmp(rb->rb_data, "IYABCDEFGH", 10)) { printf("FAILED: "); for (i = 0 ; i < rb->rb_capacity ; i++) @@ -53,7 +50,7 @@ main(int argc, char **argv) return 1; } - rbuffer_write(rb, str3, strlen(str3)); + rbuffer_write(rb, "J", 1); if (strncmp(rb->rb_data, "IJABCDEFGH", 10)) { printf("FAILED: "); for (i = 0 ; i < rb->rb_capacity ; i++) @@ -106,6 +103,29 @@ main(int argc, char **argv) } free(str); + /* test: readline */ + rbuffer_write(rb, "QWERTYUIOP\n", 11); + str = rbuffer_readline(rb); + if (str == NULL) + return 1; + if (strncmp(str, "WERTYUIOP", 10)) { + printf("FAILED: "); + for (i = 0 ; i < 10 ; i++) + printf("%c ", str[i]); + printf("\n"); + return 1; + } + free(str); + + rbuffer_write(rb, "\n", 1); + str = rbuffer_readline(rb); + if (str == NULL) + return 1; + if (strcmp(str, "")) { + printf("FAILED\n"); + return 1; + } + rbuffer_free(rb); return 0; -- 2.11.4.GIT