// SPDX-License-Identifier: GPL-2.0-or-later // // The bounded string builder. See include/core/sbuf.h for what it is and why it // moved out of kernel/dev/procfs.c. #include "core/types.h" #include "core/sbuf.h" void sb_putc(struct sbuf *sb, char c) { if (sb->len < sb->cap - 1) sb->p[sb->len++] = c; } void sb_puts(struct sbuf *sb, const char *s) { while (*s) sb_putc(sb, *s++); } void sb_pad(struct sbuf *sb, const char *s, int width) { int n = 0; while (s[n]) { sb_putc(sb, s[n]); n++; } while (n++ < width) sb_putc(sb, ' '); } void sb_puthex4(struct sbuf *sb, uint32 v) { static const char hex[] = "0123456789abcdef"; for (int i = 3; i >= 0; i--) sb_putc(sb, hex[(v >> (i * 4)) & 0xF]); } void sb_puthex(struct sbuf *sb, uint64 v, int digits) { static const char hex[] = "0123456789abcdef"; for (int i = digits - 1; i >= 0; i--) sb_putc(sb, hex[(v >> (i * 4)) & 0xF]); } void sb_putu(struct sbuf *sb, uint64 v) { char tmp[24]; int i = 0; if (v == 0) { sb_putc(sb, '0'); return; } while (v && i < (int)sizeof(tmp)) { tmp[i++] = '0' + (v % 10); v /= 10; } while (i--) sb_putc(sb, tmp[i]); } void sb_putu_pad(struct sbuf *sb, uint64 v, int width) { char tmp[24]; int i = 0, n; if (v == 0) { tmp[i++] = '0'; } while (v && i < (int)sizeof(tmp)) { tmp[i++] = '0' + (v % 10); v /= 10; } for (n = i; n < width; n++) sb_putc(sb, ' '); while (i--) sb_putc(sb, tmp[i]); } void sb_kv(struct sbuf *sb, const char *label, uint64 v, const char *unit) { sb_puts(sb, label); sb_putu(sb, v); if (unit && *unit) { sb_putc(sb, ' '); sb_puts(sb, unit); } sb_putc(sb, '\n'); }