diff options
Diffstat (limited to 'subprojects/exess/src/write_utils.h')
-rw-r--r-- | subprojects/exess/src/write_utils.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/subprojects/exess/src/write_utils.h b/subprojects/exess/src/write_utils.h new file mode 100644 index 00000000..ea941743 --- /dev/null +++ b/subprojects/exess/src/write_utils.h @@ -0,0 +1,85 @@ +/* + Copyright 2019-2021 David Robillard <d@drobilla.net> + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef EXESS_WRITE_UTILS_H +#define EXESS_WRITE_UTILS_H + +#include "exess/exess.h" + +#include <stddef.h> +#include <stdint.h> +#include <string.h> + +static inline size_t +write_char(const char c, size_t buf_size, char* const buf, const size_t i) +{ + if (buf && buf_size >= i + 1) { + buf[i] = c; + } + + return 1; +} + +static inline size_t +write_string(const size_t len, + const char* str, + const size_t buf_size, + char* const buf, + const size_t i) +{ + if (buf && buf_size >= i + len + 1) { + memcpy(buf + i, str, len); + buf[i + len] = 0; + } + + return len; +} + +static inline ExessResult +end_write(const ExessStatus status, + const size_t buf_size, + char* const buf, + const size_t i) +{ + ExessResult r = {status, status > EXESS_EXPECTED_END ? 0 : i}; + + if (buf) { + if (!status && i >= buf_size) { + r.status = EXESS_NO_SPACE; + r.count = 0; + } + + if (r.count < buf_size) { + buf[r.count] = '\0'; + } + } + + return r; +} + +ExessResult +write_digits(uint64_t value, size_t buf_size, char* buf, size_t i); + +size_t +write_two_digit_number(uint8_t value, size_t buf_size, char* buf, size_t i); + +ExessResult +write_special(size_t string_length, + const char* string, + size_t buf_size, + char* buf); + +#endif // EXESS_WRITE_UTILS_H |