From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F0AE37107E for ; Sun, 8 Mar 2026 11:37:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969880; cv=none; b=A67OlDIGKAsUpp0VRmjJKKqomv9xrEGZDtUjKZI3exipIC4GECDt11w5q0u/PPmKfh18sgXcJXI4On1yDYa9YP0crtFL5S2Zf3q/Xd/D31oG2PWeXpBB6WGKrxhwEpPUv1OyNeCwDYWEA1UMgwwE6NxihPof25PD2Kis2FpLix8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969880; c=relaxed/simple; bh=f00LHk6oT6dgPHCcoNEUKeShkZ4ZDGi8D+hQAdk7k6M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ApXl1aBR9odkLI2QicJFygAeO/JU/3D6cDupBddsm3iAC04Fple6+x0LVDLQm/yIsCL1z2NAKP6c+TBRIf6WBRlkbFCZqOcQkjQDHNlQ2wdMBAbJ5Ow849GQ3muL1pGM/K9mB+TlJk3XXTX2+jQzkuOq7nuW/aDFxjCPwlitOn8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ri91j+7g; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ri91j+7g" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-48538c5956bso2700825e9.0 for ; Sun, 08 Mar 2026 04:37:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969877; x=1773574677; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c2RplHv3nK+30aGE+l+jlcIcjal0oExhKSQ3agawjmE=; b=Ri91j+7gNHX/U/P9M22bEhM6pZCU5Mq8+IwVdPU7b6TeLCQc9QZVmKUQdzzMIlvy6w zr9EWkjDuPtQP7ZrU5vr3EZqCOVsyzSfQ2EArqavYY4josUPnTYrilnxID3CFw0KOWkw mBQkJhwzvMLqDBA3HoCP9co1I9kdP+pO6SFzOZkBfusNH1T3cGqwAEfp3H7HMohN5E5E MT4N2koi2jWqz6J0vUqkwMzCWfy1pmDLuIkjsIyxb7hg5vkb68/2tNK3j68qSElh+xMY ZLyb5tF7jwqXskwwvVLIsPMK/KzdRxqRuegVO/3Ps2BnQ6K/aDvacPIQX6oqweFW84yQ FSFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969877; x=1773574677; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=c2RplHv3nK+30aGE+l+jlcIcjal0oExhKSQ3agawjmE=; b=GlzXHn+8chxHSE3gXEKwB6RlejNrdIKnf0VkzunsMgI0/MBHYT8cR8c2tLj8wHIqL8 LON4jbebxXGyM04ngtfLit6BjqFzJFbsd6i13qrt3bT6fuI3l8oLT0TsUpaAhL44EEHH HMOUx2iAhKTRV6eqO1nI9hYyb0PLGG+Tri4s0jKnZGX2OPX2H11lOYuKIDsHK8h4aHBY vmA+usk2kvhJWDqC6gwLy1amGRXhBgdTrH4o9SzSLZOakfYc0CEKWXszMdzB4BPY9JCQ QuMKWLpOWnYogiTfPU7O7wTSOR/7BU+lmlPDbK1SRfmG0nwRt9+P/vBFfaJy5RgbX6FR 63lA== X-Forwarded-Encrypted: i=1; AJvYcCV8LGO3IIvtWjKBPzxjRVaBy3BjukVzETVhdDEemhUpL4NsZeBvKfBKDCOH+y27XktPvhTmpRlX8zE8/hc=@vger.kernel.org X-Gm-Message-State: AOJu0YxS/FP2uN7McwxJUsSUdO6fEPL+QbnxvQn0/PHxcsdN4TiBbr80 9DojmOUsRuyN+2x0iU2kuKbyez6EpC77woWQQ+8PRN5w5Red00MlHzgLJfSiOSug X-Gm-Gg: ATEYQzxq7O7PZwWvrc2LYYyWjRApYhJ2CWj85zzJXp6MBl9f1SH4cTSnrrOSBl6pn7o t+P5aOZJ89lHmXOZ02vm3nVkwrBrg1eKlSXKT8mtQf7V6ciEgKismZvt0Hu88ekujfkNQq04Yhz WuuXttF144w/M1v0P6XLivg1h20OqqylsNEmrJJHfrKlqS2R5ucNCV5RENyDLBwTbhnuVjHKvaG da1IRxQltt+ZC3jgH4dPXRXQaQrtm+79EEFKGq1IwCe/k5wY/KCklK/vXaeku+rnDZ75a5hN+4g 8LTpE3j0bCPAT30ytlH7jKTwweZRItJT/IW0ezRQCc7sJ1Mpa9qBfsRBbCL++jsG70VcRInqLaL //xmTYl+5xhwA2KiWbID2XhVYoCPj/atrG21iD2wJOGkUTYUzgIBv5p4mkddrPcCFqwD0fp508e U5Uj2B4M8yM2KlDoBgvm96+QEP9Bto42j4bEd1JBzjZU3LMMNniQ/sWTYjpJtoUBvbYJOAeq+Ou /z27KG86nGA X-Received: by 2002:a05:600c:64c7:b0:47e:e59c:67c5 with SMTP id 5b1f17b1804b1-4852671d9c3mr128900035e9.8.1772969876851; Sun, 08 Mar 2026 04:37:56 -0700 (PDT) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-485237dd017sm63621855e9.2.2026.03.08.04.37.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:56 -0700 (PDT) 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 v5 next 11/17] tools/nolibc/printf: Prepend sign to converted number Date: Sun, 8 Mar 2026 11:37:36 +0000 Message-Id: <20260308113742.12649-12-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260308113742.12649-1-david.laight.linux@gmail.com> References: <20260308113742.12649-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 Instead of appending the converted number to the sign, convert first and then prepend the sign (or "0x"). Use the length returned by u64toh_r() instead of calling strlen(). Needed so that zero padding can be inserted between the sign and digits in an upcoming patch. Acked-by: Willy Tarreau Signed-off-by: David Laight --- v5: - Updated comments w.r.t sign_prefix Changes for v4: - Split from the patch that supported modifiers " +#". tools/include/nolibc/stdio.h | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 40ceb7a0b25a..93fc24238661 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -345,9 +345,10 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list long long signed_v; int written, width, len; unsigned int flags, ch_flag; - char outbuf[21]; + char outbuf[2 + 22 + 1]; char *out; const char *outstr; + unsigned int sign_prefix; written = 0; while (1) { @@ -446,32 +447,49 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list goto do_strlen_output; } - out = outbuf; + /* The 'sign_prefix' can be zero, one or two ("0x") characters. + * Prepended least significant byte first stopping on a zero byte. + */ + sign_prefix = 0; if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i')) { /* "%d" and "%i" - signed decimal numbers. */ if (signed_v < 0) { - *out++ = '-'; + sign_prefix = '-'; v = -(signed_v + 1); v++; } } + /* The value is converted offset into the buffer so that + * the sign/prefix can be added in front. + * The longest digit string is 22 + 1 for octal conversions, the + * space is reserved even though octal isn't currently supported. + */ + out = outbuf + 2; + /* Convert the number to ascii in the required base. */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i', 'u')) { /* Base 10 */ - u64toa_r(v, out); + len = u64toa_r(v, out); } else { /* Base 16 */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p')) { - *(out++) = '0'; - *(out++) = 'x'; + /* "%p" needs "0x" prepending. */ + sign_prefix = '0' << 8 | 'x'; } - u64toh_r(v, out); + len = u64toh_r(v, out); } - outstr = outbuf; - goto do_strlen_output; + /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ + for (; sign_prefix; sign_prefix >>= 8) { + /* Force gcc to increment len inside the loop. */ + _NOLIBC_OPTIMIZER_HIDE_VAR(len); + len++; + *--out = sign_prefix; + } + outstr = out; + goto do_output; } if (ch == 'm') { -- 2.39.5