summaryrefslogtreecommitdiff
path: root/libmisc/fmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmisc/fmt.c')
-rw-r--r--libmisc/fmt.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/libmisc/fmt.c b/libmisc/fmt.c
index 6cf1d8d..7c18ef5 100644
--- a/libmisc/fmt.c
+++ b/libmisc/fmt.c
@@ -14,6 +14,31 @@ static const char *const hexdig = "0123456789ABCDEF";
/* small/trivial formatters ***************************************************/
+void fmt_print_mem(lo_interface fmt_dest w, const void *_str, size_t size) {
+ const uint8_t *str = _str;
+ while (size--)
+ fmt_print_byte(w, *(str++));
+}
+void fmt_print_str(lo_interface fmt_dest w, const char *str) {
+ while (*str)
+ fmt_print_byte(w, *(str++));
+}
+void fmt_print_strn(lo_interface fmt_dest w, const char *str, size_t size) {
+ while (size-- && *str)
+ fmt_print_byte(w, *(str++));
+}
+
+void fmt_print_hmem(lo_interface fmt_dest w, const void *_str, size_t size) {
+ const uint8_t *str = _str;
+ fmt_print_byte(w, '{');
+ for (size_t i = 0; i < size; i++) {
+ if (i)
+ fmt_print_byte(w, ',');
+ fmt_print_hbyte(w, str[i]);
+ }
+ fmt_print_byte(w, '}');
+}
+
void fmt_print_byte(lo_interface fmt_dest w, uint8_t b) {
LO_CALL(w, putb, b);
}
@@ -46,9 +71,33 @@ void fmt_print_ptr(lo_interface fmt_dest w, void *ptr) {
*/
void fmt_print_qbyte(lo_interface fmt_dest w, uint8_t b) {
fmt_print_byte(w, '\'');
- if (' ' <= b && b <= '~') {
- if (b == '\'' || b == '\\')
- fmt_print_byte(w, '\\');
+ if (b == '\0' ||
+ b == '\b' ||
+ b == '\f' ||
+ b == '\n' ||
+ b == '\r' ||
+ b == '\t' ||
+ b == '\v' ||
+ b == '\\' ||
+ b == '\'' ||
+ b == '"' ||
+ b == '?') {
+ fmt_print_byte(w, '\\');
+ switch (b) {
+ case '\0': fmt_print_byte(w, '0'); break;
+ case '\a': fmt_print_byte(w, 'a'); break;
+ case '\b': fmt_print_byte(w, 'b'); break;
+ case '\f': fmt_print_byte(w, 'f'); break;
+ case '\n': fmt_print_byte(w, 'n'); break;
+ case '\r': fmt_print_byte(w, 'r'); break;
+ case '\t': fmt_print_byte(w, 't'); break;
+ case '\v': fmt_print_byte(w, 'v'); break;
+ case '\\': fmt_print_byte(w, '\\'); break;
+ case '\'': fmt_print_byte(w, '\''); break;
+ case '"': fmt_print_byte(w, '"'); break;
+ case '?': fmt_print_byte(w, '?'); break;
+ }
+ } else if (' ' <= b && b <= '~') {
fmt_print_byte(w, b);
} else {
fmt_print_byte(w, '\\');