Module Name: src Committed By: rillig Date: Sat Feb 24 12:44:11 UTC 2024
Modified Files: src/common/lib/libutil: snprintb.c Log Message: snprintb: clean up Use consistent data types for buffer positions and lengths, to avoid type casts. To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/common/lib/libutil/snprintb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libutil/snprintb.c diff -u src/common/lib/libutil/snprintb.c:1.40 src/common/lib/libutil/snprintb.c:1.41 --- src/common/lib/libutil/snprintb.c:1.40 Sat Feb 24 12:40:00 2024 +++ src/common/lib/libutil/snprintb.c Sat Feb 24 12:44:11 2024 @@ -1,7 +1,7 @@ -/* $NetBSD: snprintb.c,v 1.40 2024/02/24 12:40:00 rillig Exp $ */ +/* $NetBSD: snprintb.c,v 1.41 2024/02/24 12:44:11 rillig Exp $ */ /*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. + * Copyright (c) 2002, 2024 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,12 +26,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -/* - * snprintb: print an interpreted bitmask to a buffer - * - * => returns the length of the buffer that would be required to print the - * string minus the terminating NUL. - */ #ifndef _STANDALONE # ifndef _KERNEL @@ -40,8 +34,8 @@ # endif # include <sys/cdefs.h> -# if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: snprintb.c,v 1.40 2024/02/24 12:40:00 rillig Exp $"); +# if defined(LIBC_SCCS) +__RCSID("$NetBSD: snprintb.c,v 1.41 2024/02/24 12:44:11 rillig Exp $"); # endif # include <sys/types.h> @@ -51,7 +45,7 @@ __RCSID("$NetBSD: snprintb.c,v 1.40 2024 # include <errno.h> # else /* ! _KERNEL */ # include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: snprintb.c,v 1.40 2024/02/24 12:40:00 rillig Exp $"); +__KERNEL_RCSID(0, "$NetBSD: snprintb.c,v 1.41 2024/02/24 12:44:11 rillig Exp $"); # include <sys/param.h> # include <sys/inttypes.h> # include <sys/systm.h> @@ -67,10 +61,10 @@ typedef struct { size_t const line_max; const char *const num_fmt; - unsigned total_len; - unsigned line_pos; - unsigned comma_pos; - char sep; + size_t total_len; + size_t line_pos; + size_t comma_pos; + int in_angle_brackets; } state; static void @@ -94,39 +88,39 @@ store_num(state *s, const char *fmt, uin } static void -put_eol(state *s) +store_eol(state *s) { if (s->total_len - s->line_pos > s->line_max) { - s->total_len = (unsigned)(s->line_pos + s->line_max - 1); + s->total_len = s->line_pos + s->line_max - 1; store(s, '#'); } store(s, '\0'); s->line_pos = s->total_len; s->comma_pos = 0; - s->sep = '<'; + s->in_angle_brackets = 0; } static void -put_sep(state *s) +store_delimiter(state *s) { - if (s->sep == ',') { + if (s->in_angle_brackets) { s->comma_pos = s->total_len; store(s, ','); } else { store(s, '<'); - s->sep = ','; + s->in_angle_brackets = 1; } } static void -wrap_if_necessary(state *s, const char *bitfmt) +maybe_wrap_line(state *s, const char *bitfmt) { if (s->line_max > 0 && s->comma_pos > 0 && s->total_len - s->line_pos >= s->line_max) { s->total_len = s->comma_pos; store(s, '>'); - put_eol(s); + store_eol(s); store_num(s, s->num_fmt, s->val); s->bitfmt = bitfmt; } @@ -141,10 +135,10 @@ old_style(state *s) if (bit > ' ') return -1; if (s->val & (1U << (bit - 1))) { - put_sep(s); + store_delimiter(s); while ((uint8_t)*++s->bitfmt > ' ') store(s, *s->bitfmt); - wrap_if_necessary(s, cur_bitfmt); + maybe_wrap_line(s, cur_bitfmt); } else while ((uint8_t)*++s->bitfmt > ' ') continue; @@ -170,10 +164,10 @@ new_style(state *s) s->bitfmt += 2; if (((s->val >> b_bit) & 1) == 0) goto skip_description; - put_sep(s); + store_delimiter(s); while (*s->bitfmt++ != '\0') store(s, s->bitfmt[-1]); - wrap_if_necessary(s, cur_bitfmt); + maybe_wrap_line(s, cur_bitfmt); break; case 'f': case 'F': @@ -189,14 +183,14 @@ new_style(state *s) if (f_width < 64) field &= ((uint64_t) 1 << f_width) - 1; s->bitfmt += 3; - put_sep(s); + store_delimiter(s); if (kind == 'F') goto skip_description; while (*s->bitfmt++ != '\0') store(s, s->bitfmt[-1]); store(s, '='); store_num(s, s->num_fmt, field); - wrap_if_necessary(s, cur_bitfmt); + maybe_wrap_line(s, cur_bitfmt); break; case '=': case ':': @@ -209,7 +203,7 @@ new_style(state *s) store(s, '='); while (*s->bitfmt++ != '\0') store(s, s->bitfmt[-1]); - wrap_if_necessary(s, prev_bitfmt); + maybe_wrap_line(s, prev_bitfmt); break; case '*': s->bitfmt++; @@ -218,7 +212,7 @@ new_style(state *s) matched = 1; if (store_num(s, s->bitfmt, field) < 0) return -1; - wrap_if_necessary(s, prev_bitfmt); + maybe_wrap_line(s, prev_bitfmt); goto skip_description; default: s->bitfmt += 2; @@ -235,7 +229,7 @@ static void finish_buffer(state *s) { if (s->line_max > 0) { - put_eol(s); + store_eol(s); if (s->bufsize >= 2 && s->total_len > s->bufsize - 2) s->buf[s->bufsize - 2] = '\0'; } @@ -251,7 +245,7 @@ snprintb_m(char *buf, size_t bufsize, co #ifdef _KERNEL /* * For safety; no other *s*printf() do this, but in the kernel - * we don't usually check the return value + * we don't usually check the return value. */ if (bufsize > 0) (void)memset(buf, 0, bufsize); @@ -282,9 +276,7 @@ snprintb_m(char *buf, size_t bufsize, co .bitfmt = bitfmt, .val = val, .line_max = line_max, - .num_fmt = num_fmt, - .sep = '<', }; if (num_fmt == NULL) goto internal; @@ -294,7 +286,7 @@ snprintb_m(char *buf, size_t bufsize, co if ((old ? old_style(&s) : new_style(&s)) < 0) goto internal; - if (s.sep != '<') + if (s.in_angle_brackets) store(&s, '>'); finish_buffer(&s); return (int)(s.total_len - 1);