From nobody Thu Apr 9 16:23:17 2026 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: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Acked-by: Willy Tarreau --- 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 *st= ate, const char *fmt, va_list fmt++; /* Output characters from the format string. */ len =3D fmt - outstr; - } else { - /* we're in a format sequence */ + goto do_output; + } =20 - ch =3D *fmt++; + /* we're in a format sequence */ =20 - /* width */ - while (ch >=3D '0' && ch <=3D '9') { - width *=3D 10; - width +=3D ch - '0'; + ch =3D *fmt++; =20 - ch =3D *fmt++; - } + /* width */ + while (ch >=3D '0' && ch <=3D '9') { + width *=3D 10; + width +=3D ch - '0'; + + ch =3D *fmt++; + } =20 - /* Length modifiers */ + /* Length modifiers */ + if (ch =3D=3D 'l') { + lpref =3D 1; + ch =3D *fmt++; if (ch =3D=3D 'l') { - lpref =3D 1; - ch =3D *fmt++; - if (ch =3D=3D 'l') { - lpref =3D 2; - ch =3D *fmt++; - } - } else if (ch =3D=3D 'j') { - /* intmax_t is long long */ lpref =3D 2; ch =3D *fmt++; - } else { - lpref =3D 0; } + } else if (ch =3D=3D 'j') { + /* intmax_t is long long */ + lpref =3D 2; + ch =3D *fmt++; + } else { + lpref =3D 0; + } =20 - if (ch =3D=3D 'c' || ch =3D=3D 'd' || ch =3D=3D 'u' || ch =3D=3D 'x' ||= ch =3D=3D 'p') { - char *out =3D outbuf; + if (ch =3D=3D 'c' || ch =3D=3D 'd' || ch =3D=3D 'u' || ch =3D=3D 'x' || = ch =3D=3D 'p') { + char *out =3D outbuf; =20 - if (ch =3D=3D 'p') + if (ch =3D=3D 'p') + v =3D va_arg(args, unsigned long); + else if (lpref) { + if (lpref > 1) + v =3D va_arg(args, unsigned long long); + else v =3D va_arg(args, unsigned long); - else if (lpref) { - if (lpref > 1) - v =3D va_arg(args, unsigned long long); - else - v =3D va_arg(args, unsigned long); - } else - v =3D va_arg(args, unsigned int); - - if (ch =3D=3D 'd') { - /* sign-extend the value */ - if (lpref =3D=3D 0) - v =3D (long long)(int)v; - else if (lpref =3D=3D 1) - v =3D (long long)(long)v; - } + } else + v =3D va_arg(args, unsigned int); =20 - switch (ch) { - case 'c': - out[0] =3D v; - out[1] =3D 0; - break; - case 'd': - i64toa_r(v, out); - break; - case 'u': - u64toa_r(v, out); - break; - case 'p': - *(out++) =3D '0'; - *(out++) =3D 'x'; - __nolibc_fallthrough; - default: /* 'x' and 'p' above */ - u64toh_r(v, out); - break; - } - outstr =3D outbuf; + if (ch =3D=3D 'd') { + /* sign-extend the value */ + if (lpref =3D=3D 0) + v =3D (long long)(int)v; + else if (lpref =3D=3D 1) + v =3D (long long)(long)v; } - else if (ch =3D=3D 's') { - outstr =3D va_arg(args, char *); - if (!outstr) - outstr=3D"(null)"; + + switch (ch) { + case 'c': + out[0] =3D v; + out[1] =3D 0; + break; + case 'd': + i64toa_r(v, out); + break; + case 'u': + u64toa_r(v, out); + break; + case 'p': + *(out++) =3D '0'; + *(out++) =3D 'x'; + __nolibc_fallthrough; + default: /* 'x' and 'p' above */ + u64toh_r(v, out); + break; } - else if (ch =3D=3D 'm') { + outstr =3D outbuf; + goto do_strlen_output; + } + + if (ch =3D=3D 's') { + outstr =3D va_arg(args, char *); + if (!outstr) + outstr=3D"(null)"; + goto do_strlen_output; + } + + if (ch =3D=3D 'm') { #ifdef NOLIBC_IGNORE_ERRNO - outstr =3D "unknown error"; + outstr =3D "unknown error"; #else - outstr =3D strerror(errno); + outstr =3D strerror(errno); #endif /* NOLIBC_IGNORE_ERRNO */ - } else { - if (ch !=3D '%') { - /* Invalid format: back up to output the format characters */ - fmt =3D outstr + 1; - /* and output a '%' now. */ - } - /* %% is documented as a 'conversion specifier'. - * Any flags, precision or length modifier are ignored. - */ - width =3D 0; - outstr =3D "%"; - } - len =3D strlen(outstr); + goto do_strlen_output; } =20 + if (ch !=3D '%') { + /* Invalid format: back up to output the format characters */ + fmt =3D outstr + 1; + /* and output a '%' now. */ + } + /* %% is documented as a 'conversion specifier'. + * Any flags, precision or length modifier are ignored. + */ + len =3D 1; + width =3D 0; + outstr =3D fmt - 1; + goto do_output; + +do_strlen_output: + /* Open coded strlen() (slightly smaller). */ + for (len =3D 0;; len++) + if (!outstr[len]) + break; + +do_output: written +=3D len; =20 width -=3D len; --=20 2.39.5