diff --git a/circbuf.c b/circbuf.c index b9d2892..764c2ae 100644 --- a/circbuf.c +++ b/circbuf.c @@ -103,12 +103,30 @@ bool cbuf_write_n(CircularBuffer *inst, const uint8_t *b, uint16_t count) } +uint16_t cbuf_write_partial(CircularBuffer *inst, const uint8_t *b, uint16_t max) +{ + uint16_t i; + for (i = 0; i < max; i++) { + if (cbuf_empty(inst)) break; + cbuf_write(inst, *(b + i)); + } + + return i; +} + + bool cbuf_write_string(CircularBuffer *inst, const char *str) { return cbuf_write_n(inst, (uint8_t *) str, strlen(str)); } +uint16_t cbuf_write_string_partial(CircularBuffer *inst, const char *str) +{ + return cbuf_write_partial(inst, (uint8_t *) str, strlen(str)); +} + + bool cbuf_read_n(CircularBuffer *inst, uint8_t *buf, uint16_t len) { if (cbuf_data_size(inst) < len) return false; @@ -132,7 +150,7 @@ bool cbuf_read_string(CircularBuffer *inst, char *str, uint16_t len) } -uint16_t cbuf_read_upto(CircularBuffer *inst, uint8_t *buf, uint16_t max) +uint16_t cbuf_read_partial(CircularBuffer *inst, uint8_t *buf, uint16_t max) { uint16_t i; for (i = 0; i < max; i++) { @@ -144,9 +162,9 @@ uint16_t cbuf_read_upto(CircularBuffer *inst, uint8_t *buf, uint16_t max) } -uint16_t cbuf_read_string_upto(CircularBuffer *inst, char *str, uint16_t max) +uint16_t cbuf_read_string_partial(CircularBuffer *inst, char *str, uint16_t max) { - uint16_t cnt = cbuf_read_upto(inst, (uint8_t *) str, max); + uint16_t cnt = cbuf_read_partial(inst, (uint8_t *) str, max); str[cnt] = 0; return cnt; } diff --git a/circbuf.h b/circbuf.h index e54d152..63340f7 100644 --- a/circbuf.h +++ b/circbuf.h @@ -31,7 +31,10 @@ bool cbuf_write(CircularBuffer *inst, uint8_t b); bool cbuf_read(CircularBuffer *inst, uint8_t *b); -/** Get byte at the read cursor, without incrementing it. False on empty. */ +/** + * Get byte at the read cursor, without incrementing it. + * False on empty. + */ bool cbuf_peek(CircularBuffer *inst, uint8_t *b); @@ -47,37 +50,51 @@ uint16_t cbuf_free_space(CircularBuffer *inst); void cbuf_clear(CircularBuffer *inst); -/** Write N bytes. Returns success */ +/** Write N bytes, or none. Returns success */ bool cbuf_write_n(CircularBuffer *inst, const uint8_t *b, uint16_t count); -/** Write a string (without \0) */ +/** Try to write N bytes. Returns actual number of bytes written. */ +uint16_t cbuf_write_partial(CircularBuffer *inst, const uint8_t *b, uint16_t max); + + +/** Write a string (excluding \0) - or nothing. */ bool cbuf_write_string(CircularBuffer *inst, const char *str); -/** Read N bytes, if available. Returns success. */ -bool cbuf_read_n(CircularBuffer *inst, uint8_t *buf, uint16_t len); +/** + * Try to write string (excluding \0). + * Returns actual number of chars written. + */ +uint16_t cbuf_write_string_partial(CircularBuffer *inst, const char *str); -/** Read string of given length, append \0. `str` must be len+1 long */ -bool cbuf_read_string(CircularBuffer *inst, char *str, uint16_t len); +/** Read N bytes, or none. Returns success. */ +bool cbuf_read_n(CircularBuffer *inst, uint8_t *buf, uint16_t len); /** Read up to N bytes. Returns byte count */ -uint16_t cbuf_read_upto(CircularBuffer *inst, uint8_t *buf, uint16_t max); +uint16_t cbuf_read_partial(CircularBuffer *inst, uint8_t *buf, uint16_t max); + + +/** Read string of given length, append \0. `str` must be len+1 long */ +bool cbuf_read_string(CircularBuffer *inst, char *str, uint16_t len); -/** Read string up to N chars long, append \0. `str` must be max+1 long */ -uint16_t cbuf_read_string_upto(CircularBuffer *inst, char *str, uint16_t max); +/** + * Read string up to N chars long, append \0. + * `str` must be max+1 long + */ +uint16_t cbuf_read_string_partial(CircularBuffer *inst, char *str, uint16_t max); /** * Search buffer and return position of the first occurence * of the given byte (position relative to read_pos). - * - * The returned value is zero-based, add 1 to get string + * + * The returned value is zero-based, add 1 to get string * length including the delimiter. - * + * * Returns -1 if not found. */ int32_t cbuf_find(CircularBuffer *inst, uint8_t b);