From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailtransmit05.runbox.com (mailtransmit05.runbox.com [185.226.149.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 161AF396D2C for ; Mon, 2 Mar 2026 10:18:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.226.149.38 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772446742; cv=none; b=p7IMdCkpWrNCETFnJKL/Wzl0vd/jlehw7iypxhJKS5pqTANTP8EZmx71IWHp4z809TrXjeogUyxv2cgdEjRNcZZJdGPJHD2J0ADzg/Y9eCAyK41yri2WJY5r2crl2Zymx56kzp8huHU3qWk7zpdnk3wT0FdDE6r6A7nFbE4SCJw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772446742; c=relaxed/simple; bh=A+FpVaz84CooP3MBMg61Dqa8C3RslGxdPeyRIFOUPI4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kV5FJhhbySQ/DNnlXAPiIbQyQ099N2uhIfYDvObnA/V7G1yVhffg1m2cdl0Wid+gDurtDMliyO9goK0suT61Y1/XCDlXUcQmjFQ7kDxGssk5qa+QY5TN/4pHvnuVL3gfXosy5vyBQTpbvUHNjac0WbwJo0cxpyfUZ/5h3L4we0o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=runbox.com; dkim=pass (2048-bit key) header.d=runbox.com header.i=@runbox.com header.b=CYHFZh9Q; arc=none smtp.client-ip=185.226.149.38 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=runbox.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=runbox.com header.i=@runbox.com header.b="CYHFZh9Q" Received: from mailtransmit03.runbox ([10.9.9.163] helo=aibo.runbox.com) by mailtransmit05.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1vx0MW-003BcX-CP; Mon, 02 Mar 2026 11:18:52 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=runbox.com; s=selector2; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To :Message-Id:Date:Subject:Cc:To:From; bh=zFxnpaQvNzT51FlHrNI+KR5pzDWELCZtOj1K3JgcKBg=; b=CYHFZh9QIsptG4aigLLflWZ13p umR3BRIhPNDR0Ma4Ennd4tj6YrnzaohiG42z1Fdm7b/FsX7aeeh9HZgGzQ7jzoGkmBY2X9nyNDl7p xBM7VsgJ3Ap7LM45udW92JRNtDJhFj+iSNwjR7KZ3WQiOno8eix9xrW5qcSSUd1mojzm481guoptN sLFW9QguLZ9hzIISldFDhHIMBEnZha+y17UTQBHmGnytx4Wcu/P6PvFQ0FyJw9Zts0oBdjnvI95+0 vN02xMZqgHnBUimypwYGBv3VumeU+egUeTZahCKJ9lxztaHUTjp8HbeVyKvW12Iw13RY9en6tHrVm 3cjzbqew==; Received: from [10.9.9.72] (helo=submission01.runbox) by mailtransmit03.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1vx0MW-0002yj-3F; Mon, 02 Mar 2026 11:18:52 +0100 Received: by submission01.runbox with esmtpsa [Authenticated ID (1493616)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1vx0MB-006y7o-P5; Mon, 02 Mar 2026 11:18:31 +0100 From: david.laight.linux@gmail.com To: Willy Tarreau , =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= , linux-kernel@vger.kernel.org, Cheng Li Cc: David Laight Subject: [PATCH v4 next 13/23] tools/nolibc/printf: Use goto and reduce indentation Date: Mon, 2 Mar 2026 10:18:05 +0000 Message-Id: <20260302101815.3043-14-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260302101815.3043-1-david.laight.linux@gmail.com> References: <20260302101815.3043-1-david.laight.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: David Laight Upcoming changes will need to use goto to jump to the code that outputs characters. Use 'goto do_output' to output a known number of characters. Use 'goto do_strlen_output' to output a '\0' terminated string. Removes a level of indentation from the format processing code. Signed-off-by: David Laight --- For v4: - Output a single '%' from the format string. New patch for v3. Makes the final code look better and there is less to change if done early. tools/include/nolibc/stdio.h | 170 +++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 78 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index e0b7ff537b14..13fe6c4d7f58 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -329,103 +329,117 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list fmt++; /* Output characters from the format string. */ len = fmt - outstr; - } else { - /* we're in a format sequence */ + goto do_output; + } - ch = *fmt++; + /* we're in a format sequence */ - /* width */ - while (ch >= '0' && ch <= '9') { - width *= 10; - width += ch - '0'; + ch = *fmt++; - ch = *fmt++; - } + /* width */ + while (ch >= '0' && ch <= '9') { + width *= 10; + width += ch - '0'; + + ch = *fmt++; + } - /* Length modifiers */ + /* Length modifiers */ + if (ch == 'l') { + lpref = 1; + ch = *fmt++; if (ch == 'l') { - lpref = 1; - ch = *fmt++; - if (ch == 'l') { - lpref = 2; - ch = *fmt++; - } - } else if (ch == 'j') { - /* intmax_t is long long */ lpref = 2; ch = *fmt++; - } else { - lpref = 0; } + } else if (ch == 'j') { + /* intmax_t is long long */ + lpref = 2; + ch = *fmt++; + } else { + lpref = 0; + } - if (ch == 'c' || ch == 'd' || ch == 'u' || ch == 'x' || ch == 'p') { - char *out = outbuf; + if (ch == 'c' || ch == 'd' || ch == 'u' || ch == 'x' || ch == 'p') { + char *out = outbuf; - if (ch == 'p') + if (ch == 'p') + v = va_arg(args, unsigned long); + else if (lpref) { + if (lpref > 1) + v = va_arg(args, unsigned long long); + else v = va_arg(args, unsigned long); - else if (lpref) { - if (lpref > 1) - v = va_arg(args, unsigned long long); - else - v = va_arg(args, unsigned long); - } else - v = va_arg(args, unsigned int); - - if (ch == 'd') { - /* sign-extend the value */ - if (lpref == 0) - v = (long long)(int)v; - else if (lpref == 1) - v = (long long)(long)v; - } + } else + v = va_arg(args, unsigned int); - switch (ch) { - case 'c': - out[0] = v; - out[1] = 0; - break; - case 'd': - i64toa_r(v, out); - break; - case 'u': - u64toa_r(v, out); - break; - case 'p': - *(out++) = '0'; - *(out++) = 'x'; - __nolibc_fallthrough; - default: /* 'x' and 'p' above */ - u64toh_r(v, out); - break; - } - outstr = outbuf; + if (ch == 'd') { + /* sign-extend the value */ + if (lpref == 0) + v = (long long)(int)v; + else if (lpref == 1) + v = (long long)(long)v; } - else if (ch == 's') { - outstr = va_arg(args, char *); - if (!outstr) - outstr="(null)"; + + switch (ch) { + case 'c': + out[0] = v; + out[1] = 0; + break; + case 'd': + i64toa_r(v, out); + break; + case 'u': + u64toa_r(v, out); + break; + case 'p': + *(out++) = '0'; + *(out++) = 'x'; + __nolibc_fallthrough; + default: /* 'x' and 'p' above */ + u64toh_r(v, out); + break; } - else if (ch == 'm') { + outstr = outbuf; + goto do_strlen_output; + } + + if (ch == 's') { + outstr = va_arg(args, char *); + if (!outstr) + outstr="(null)"; + goto do_strlen_output; + } + + if (ch == 'm') { #ifdef NOLIBC_IGNORE_ERRNO - outstr = "unknown error"; + outstr = "unknown error"; #else - outstr = strerror(errno); + outstr = strerror(errno); #endif /* NOLIBC_IGNORE_ERRNO */ - } else { - if (ch != '%') { - /* Invalid format: back up to output the format characters */ - fmt = outstr + 1; - /* and output a '%' now. */ - } - /* %% is documented as a 'conversion specifier'. - * Any flags, precision or length modifier are ignored. - */ - width = 0; - outstr = "%"; - } - len = strlen(outstr); + goto do_strlen_output; } + if (ch != '%') { + /* Invalid format: back up to output the format characters */ + fmt = outstr + 1; + /* and output a '%' now. */ + } + /* %% is documented as a 'conversion specifier'. + * Any flags, precision or length modifier are ignored. + */ + len = 1; + width = 0; + outstr = fmt - 1; + goto do_output; + +do_strlen_output: + /* Open coded strlen() (slightly smaller). */ + for (len = 0;; len++) + if (!outstr[len]) + break; + +do_output: written += len; width -= len; -- 2.39.5