From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 1809E2DAFDD for ; Sun, 8 Mar 2026 11:37:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969874; cv=none; b=aoeeeTpNH34rOUHOX89QsJznyScDWAna+Pf8amrAwvctlrzejR+EonbLOevavqE3eDt0RGZ6pGwx2CA3Asvb6auIy9yCh4ifJBvok0wtNdeAddjxISCU67YgZ4kIed49Cs8ksMg9FQqK+exrh5CPGj7NLkKkSuvRqaJBApJpE1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969874; c=relaxed/simple; bh=V8dyYys2y8bxTJAB96T8OMlnV2RlUGNZKcFsEX9fsw4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gd+VuQsAFJuSehcCpll4z9ybNhcchdHbisCZ7HHoa67x7X2zjX27+GIacE40jcRmMbvq3aV1bs7bQCHG8eJMXV3FrJSvNHfRjhK0UshGRGdKh5IoHSUVulQjFmHYJ9+w2zeF0EMaTrFpniKbF+UiSPwZILH248jSePsvU3pRZM0= 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=FsW3IdiW; arc=none smtp.client-ip=209.85.128.46 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="FsW3IdiW" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48370174e18so65329355e9.2 for ; Sun, 08 Mar 2026 04:37:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969871; x=1773574671; 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=d6s6M/C1522AwwOi7H/s6ZTN3cdn8qi5Yy0MAJjMUuw=; b=FsW3IdiWu7F3ZY3jmhCYZzlIU+PT233r0DKFoA/+XcLBzwpC7PjeA91weWbZocNR1v ICUUvPvbV/VYs2t257cLRTObiKJx4wQHA9l/P42/H4jVBdROO0XFGkrZRUIChn7KnR7l PKX4GQY3ilyT4AN+MbszE54se+cYF5QrwEbgD6w3zxqOyCFTYGuM8Q911RxIV5bdtvWM L8wUIujhbT3+AO/T4mdRYdlGRgM6Bu40bU/6yqBQzagCPW7WJ8E9Lmlct/7uiaYntTB2 zuRK86tuZ4KGo8c3eOwEDJl0Ys4vtZ+XRuKNbUlqFNxESadF9AHx2BSpyEj5UKTHQuiO YWlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969871; x=1773574671; 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=d6s6M/C1522AwwOi7H/s6ZTN3cdn8qi5Yy0MAJjMUuw=; b=VzpKtdp3Mw7VF//mW8NwCLYDF829/MYz/BVDZin5PGzvRLeJj6oSrxQ7LV5LgHFdpT Ux8dDJlzKLTrT9OHliNwMYLUblJ/yCQfLQ1qt1pYdtZg9l9gpWbxF/FXbEjF7sZ/R2a0 ZClKv3MQY2NNHRYahJtN8IE/msWSoz4OyBeyY4Wx05dR6mNEzMIw1br8Vi08Ppn6ErzV lUroRq+Z8MvaZFIYVXTnzZB4NvXaQzqqBGVWHfhPAmGTS5Vioqu3/yEWgy/CWkdr5kjo 9qSrKZkz+Va3kuvlScDyEcXCQNebIX5rJOVrHHTxmIG9QrveagstdRx0tm1L+gEZIsAS u49Q== X-Forwarded-Encrypted: i=1; AJvYcCU38COrK1I5tJqmWVzPY1I9ZEdmjy2X2u3TickNahQWr8Su6iJs9mloNkz847jpB17JJbNIohSzMrtI5gY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5SITOOfYP2WsxJARF9cov86R8/VXUTTA20BneUSSbTYNGZk48 jh3e2FWHoOf2/M0Rh83oljQTxG8u+TgWk58tdfKE2PrVdzEsz9WhMTLM X-Gm-Gg: ATEYQzw4QTPzMdZCGl+rAm9BlsExkDSRkzMFEfX7HQgDgexkNDFhHEg1WPIyOFK1qMt YqEvpWccbGa3STuFkITg0fs2txvMbgDc73v3wYfdJZ/g5ReMOK4UPr75t9F8aL8SwVORjh3sdNn IuI64LSAFSUD2J7+TjgvLZTFZ4NNI8EcHL3Z8RU6TxN9IOxOIsXljtBXS5k+DWMmCDe6mFj+WRG houzH57NdUpCtpK/riUtPdX8UDap33afzqwRwQLFFN6oDBOWldp+tSU7IOTt6HN40X0RKFFoC1Z llu6zBuvtHeMFIGZeq5umZQ2CsqMmNQFbjDt02XTORrlI2e5S/vQetjT/Q0m8Fa5oCAiqXd/73p 1T4dClRt1HWrnC2F95ACwSL/bNfnpkiWwc4VIK3sUJMebBXsBCMcJCwweC0PWXznWZj273Rj7N0 4eRyNK1eAdqjtMEqg2/enp7avH9DePLltthZ0+G10pPKtJANceTHaH9suhB0lR431ymVj8yvPLb sEKq/jnEe80 X-Received: by 2002:a05:600c:a00a:b0:485:2fc5:39e with SMTP id 5b1f17b1804b1-4852fc50624mr65281605e9.27.1772969871225; Sun, 08 Mar 2026 04:37:51 -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.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:51 -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 01/17] tools/nolibc: Add _NOLIBC_OPTIMIZER_HIDE_VAR() to compiler.h Date: Sun, 8 Mar 2026 11:37:26 +0000 Message-Id: <20260308113742.12649-2-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Needed to stop compiler 'optimisations' bloating code. Equivalent to the definition in include/linux/compiler.h Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. Changes for v4: - Remove #if guard tools/include/nolibc/compiler.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/include/nolibc/compiler.h b/tools/include/nolibc/compile= r.h index a8c7619dcdde..f03f84cfadce 100644 --- a/tools/include/nolibc/compiler.h +++ b/tools/include/nolibc/compiler.h @@ -71,4 +71,7 @@ # define __nolibc_static_assert(_t) #endif =20 +/* Make the optimizer believe the variable can be manipulated arbitrarily.= */ +#define _NOLIBC_OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "+r" (var)) + #endif /* _NOLIBC_COMPILER_H */ --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 937332EF66B for ; Sun, 8 Mar 2026 11:37:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; cv=none; b=b4zr2UnoLTPXAX5LM/AqSBUq1mOGX6kgNHTPYDILwTJqmX9JOswb1IZto7bYdXTGxN1mqCLs/WvJ128/4KVrei0cb4o/iiRhs5ckGyCKdUaqu4qaIaZwedUKsiOqvKrJtp2dDPr0hNNj+a1bdHKNHEV7tkBzPTmRyHkWHAVyVdE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; c=relaxed/simple; bh=UpCgBy34KvA2JWv93HoS24zOhzq55YUFCMFxLDBgFd8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Qtvq8vk6wEyO5Eh2QHfiO4WzM19pOQOmUBmpVOWA9BQptAO1lmnTruj/YHeQYPIrsGSeBEXiHixnK1hDoTGZvCHEQFELeScdYaLLxnZSOL4uJwDrpU7zeuKkQqgbJeLHBlBJ10cU1mg9rvUZsF9UcaaDCUEqAXyZrKt8z/A9muk= 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=DCvD4Swg; arc=none smtp.client-ip=209.85.128.52 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="DCvD4Swg" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-482f454be5bso108554855e9.0 for ; Sun, 08 Mar 2026 04:37:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969872; x=1773574672; 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=5GdelJ4IRIzFOd+nDjI98DTLHMXak5+QVr1z57eoXTM=; b=DCvD4SwgB2N4Y4MG+Hu8QZoLnOhcZQWPL1ibwW0THoH0o0tBK8upUDk4qvRumrPygO nCFr0BBFn6usge5mq87sJ3AJfPrENRCIZhGKTRGrZ4Ld3enLsgEoMJAovjyHDFDajHiK sy7NnMpTh+/omQepIarfAJ5EZYW0tASojr7Us1hvex4w8HnXkigAJeML7ZIVo7T1ibA0 +2O6qldCz/O6eCCGs4MJPFKzQANnVMzsm8M17CNRHtxCecq0VrspynvpztewiCfO/YXb KJLxtUhgpOJc+uV5mpVHwHQM3/YzzQu3r86S2ItVPKGCTDMUeI88s1F+bWSQB07eaKNL WJJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969872; x=1773574672; 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=5GdelJ4IRIzFOd+nDjI98DTLHMXak5+QVr1z57eoXTM=; b=teGwdFxw3zrJZtTqTVN+dCGahsLitbSeaCCVJ34IWWU6lEZ2R5sRnOpDMu9uKeCZmX 1edewB+qJPZo9UATGssgW+7Spi1DEfq6EuQ/BzEDZwu3ui389sk9ys56YuLx3sRY4N68 YQt9CWBM4VQ0Fuav7HpuEKMsdmRaF0y4vxceM9ioBhNBHHnKv9Ahftu3gLxFaPMSwjMc o9TiSnrTQH5m9nQED9bE7RohhlyO4H5Ai/4TXtF1Sv++ptxSDfiYtHZk2Quy32FtMdYK GiUhvz1LJejtAjLa4DKrPH0kIZU3i2yGD4RgK6tyWwrw2nbX8SsTVO2ib8gk4P6L+EZj OTxQ== X-Forwarded-Encrypted: i=1; AJvYcCXVglgomBVYUtSiLMaUqpW80Bn4xBWjCYxXMbWWm/oovcwN2tV7LwiSYGGjPHRhReAxIhJpITcVhQMVRbI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0hi2IWul96coyS1hQHPYsDqG/gVl/FFHPMy07/MClOrTWgawE BS4/p3vWNQ2O+P+oyOLAkIXqIUVDetnG2XvMIDMzMhW85cX53G5RnRTb X-Gm-Gg: ATEYQzwVkoOVQBKPHTxs0w88gX6HN5dY7hBpru2hq9HxAf7DqiAmqGSv/cbrx4lTcBj 5TvPuPIIUVG/M4+4SXPVE5TKNhnx4VP2lxx0HVqf/IDY55mxg1WVOeoFWcHPBjDdk8TfYB1EUFF hWhoHhfzpgsAH8jE6Ihqis8S18l04G5A6gjTK0QkPWKSxAzjfQOtM+iSSxQsk9UUndLPF99z+iW PKEk5fCrgYGvQ9Xx9ukWRPkk3omt/zRu6Yrz5FJawNv1f1ajbuYTg/2DbEZxVGrcIFoHlhHDLPG mDHkypavVK50Gr/OtZXvevT28eYjURgPWObgOZFANqlQScTQJ+rORDDcGBuH6MmbN3LLBEx092d 4NtF9ZcfSH/QD9vuJdtt6E29SyonXBsLdwZvWtFcXFVfctAUgdEMNtnf04x8ZoDIKHN2uaLiJHw ePfJIiTEdxr0RYebIavVlY+zPhO9YipnnUQtHw4EpNqLKeoDja5lXzqTIXXFcGhV3x1YN/ODUbU rA+T8IMTudl X-Received: by 2002:a05:600c:19c9:b0:485:3b33:f4b6 with SMTP id 5b1f17b1804b1-4853b33f723mr683925e9.0.1772969871817; Sun, 08 Mar 2026 04:37:51 -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.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:51 -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 02/17] selftests/nolibc: Rename w to written in expect_vfprintf() Date: Sun, 8 Mar 2026 11:37:27 +0000 Message-Id: <20260308113742.12649-3-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Single character variable names don't make code easy to read. Rename 'w' (used for the return value from snprintf()) 'written'. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. V4: Split out from patch 4. tools/testing/selftests/nolibc/nolibc-test.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 51390b709af1..9ebebe4ff253 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1669,7 +1669,7 @@ static int expect_vfprintf(int llen, const char *expe= cted, const char *fmt, ...) char buf[VFPRINTF_LEN + 80]; unsigned int cmp_len; va_list args; - ssize_t w, expected_len; + ssize_t written, expected_len; =20 /* Fill and terminate buf[] to check for overlong/absent writes */ memset(buf, 0xa5, sizeof(buf) - 1); @@ -1677,7 +1677,7 @@ static int expect_vfprintf(int llen, const char *expe= cted, const char *fmt, ...) =20 va_start(args, fmt); /* Limit buffer length to test truncation */ - w =3D vsnprintf(buf, VFPRINTF_LEN + 1, fmt, args); + written =3D vsnprintf(buf, VFPRINTF_LEN + 1, fmt, args); va_end(args); =20 llen +=3D printf(" \"%s\"", buf); @@ -1700,8 +1700,8 @@ static int expect_vfprintf(int llen, const char *expe= cted, const char *fmt, ...) return 1; } =20 - if (w !=3D expected_len) { - llen +=3D printf(" written(%d) !=3D %d", (int)w, (int)expected_len); + if (written !=3D expected_len) { + llen +=3D printf(" written(%d) !=3D %d", (int)written, (int)expected_len= ); result(llen, FAIL); return 1; } --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (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 DFF532F659F for ; Sun, 8 Mar 2026 11:37:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; cv=none; b=hP2ZoUc+VKGTQauGyzzHaD8JX9FDxVYO2mxEnak6tfPoTNiD0UoGRtl/LvrXtNXIyb17Shq1oJQg9uWqTcbKB26nanw1TSItFN0MozIjV9s8vzT+v5LPwMyphZvVtZGPiu4LnppknLhWFjA4qElrndUR7ZKwmZBUXiOZj+mgz3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; c=relaxed/simple; bh=PXQaEe0fmSCOAJq6izJx3WPw7rKKNks8Z3ateh/yx80=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=O7S6ENnUlgf+6V8599b5sUapB+PMfl5lz2uLgAUnQ0yggieV+PwziPEyTE7jcd/XIjeCLqeDXYTbMq7z2h1vPoxNNa3VIn/kI1TuSf0IErsKx7+k5+1WORIO74UCtWH/ob06uaGf337occ/cpUCjD95plO94wjtEq3M/IzGTF7E= 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=JW0UYn8S; arc=none smtp.client-ip=209.85.221.44 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="JW0UYn8S" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-439c9eb5d36so3921331f8f.2 for ; Sun, 08 Mar 2026 04:37:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969872; x=1773574672; 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=SQ++kaR9otGJoykKyOnnTuQdcMyQbk/tZXUrcc3Q2eE=; b=JW0UYn8SIq5R80q/XNisXJBuZGEvucKHP/sZx7x3oy/wnJRqQOgCxncHRJlkzGLqcQ bR9F4NeSej9M+6xyd4fX11CVTKfiwJMgm08X9TjbeqLd1TzRzOOm6Ve2TwDA0JPfhtp4 ORzlyd31ClDDGvSQY1b3Q6jCaWimzXRGRJZ5JqsRcThB+sVILvAFqZPpwKlCU4KU/52v jFibXP+lcso1VsO9081ssEKLogMVTDpk8/k7G7PKkDX7mMeVQsNHiFil9AOMWbJImUjK TyKEd9e3Ny9ITcUAYIE10a1rAQ8pSYT44bEHI/2KpB7ANzaDyLw9JLBm3MOzFRD/yO7v My2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969872; x=1773574672; 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=SQ++kaR9otGJoykKyOnnTuQdcMyQbk/tZXUrcc3Q2eE=; b=tPFQ4mRbmvBnM/ZfsuIBbGbfr6FXQ9+ixy95lRzxZYcV9WK3/wdENuMovwS5YBhyq6 1GkR9jTEzA0iG93YI9QlHWAwMDrzedDkbJuydRpLaYZ55o8AfxA77PEq90/SmkCDPsOk MAFR/ERDlV6IFNikE8TkkS993Fsd7vu+kzMeL6Vi7KwAnaiq1qTsYDn8bI2TdhEB+xV0 aM3Ish0CYFId9IjdV4Hp8g+ObZ9i4EICVSzvVEBDZ74SfiL64ZSYU8IYELsBKU3UGFbR p6FGZQPWnD0YOGZ3JoKwR/1knH6dwzdKCiOfv+2l0hu2CX9ZCiaT67yynTzJAxT6oQvO gkJQ== X-Forwarded-Encrypted: i=1; AJvYcCVnB/l18WKudEz7zWbeXeWsGiXThL4w6s5mApqIY3NduzqXXdIrFrUp8gpZ5p2WhwY4PxSCUzbv14+GDQY=@vger.kernel.org X-Gm-Message-State: AOJu0YzfZkh1O1nVWh8FXeHa3px1ZxiVNV6n+zVW+AfbJsVyxt4bnKJR yB/Hhc2RUsdTIlAsElq7N4gCdtCu/VNzQYLhKfmc72MqzA4WG4Kxd95S X-Gm-Gg: ATEYQzzTXywvs2wXouuhwxzNWjpNm8LxnmSa6c/ekaL14wbn5ak5gi9w53BFmD4ZhiZ 4HGOjr6FmScBTsIk62KNvA6dIfOTeyt03R+cC5B/nUy2FwOFge1ATo5VQxSFXJD2IysV09k9AAR LMbFbjgGHnuCbOfpXCVh6BKCiZ5fPsEWKmgiGcwU+VKfJCEsyFrINQqTGcIX37dzKoSLqEDHxkM BnYjR25g9Wa4avF52mVydZOSqjXNevWR9NeqXbEk/nuMCzhG7/yP38T3M9mvo+eVA1JNKxRS+AI xOhwmfzAvW2ZMoqPZDGRW7RJTBNO5KHt+uBTiLY8dNy+5s5NGf9TdvVEOoLsbmVsCYDG5776kTv FK+UG0O/4y+JoILko1T5JcIaYTytRNZx2c1h5oMjRvwxIOGz5Vq1YbnEUDtnrvF8geb3xChguQJ DCQaHuagubf8c1dS/ECbEwK/050R7IxJrHA/1g+6IQxsDbgHCATlCKTGyCSmBiKUORBQn2F0I7b DM72HrFFYgK X-Received: by 2002:a05:600c:a413:b0:485:2fe9:336f with SMTP id 5b1f17b1804b1-4852fe93699mr50702485e9.30.1772969872211; Sun, 08 Mar 2026 04:37:52 -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.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:52 -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 03/17] tools/nolibc: Implement strerror() in terms of strerror_r() Date: Sun, 8 Mar 2026 11:37:28 +0000 Message-Id: <20260308113742.12649-4-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight strerror() can be the only part of a program that has a .data section. This requres 4k in the program file. Add a simple implementation of strerror_r() and use that in strerror() so that the "errno=3D" string is copied at run-time. Use __builtin_memcpy() because that optimises away the input string and just writes the required constants to the target buffer. Code size change largely depends on whether the inlining decision for strerror() changes. Change the tests to use the normal EXPECT_VFPRINTF() when testing %m. Skip the tests when !is_nolibc. Acked-by: Willy Tarreau Signed-off-by: David Laight --- v5: - strerror_r() needs to return 0 on success. - Return ERANGE if the buffer is too short to contain the longest possible output. v4: - Leave the NOLIBC_IGNORE_ERRNO check in __nolibc_printf(). - Don't rename the errno parameter to strerror() in this patch. tools/include/nolibc/stdio.h | 22 +++++++++++++++++--- tools/testing/selftests/nolibc/nolibc-test.c | 20 ++---------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index a4df72d9a2d3..af2d5be47aa3 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -722,14 +722,30 @@ int setvbuf(FILE *stream __attribute__((unused)), return 0; } =20 +static __attribute__((unused,)) +int strerror_r(int errnum, char *buf, size_t buflen) +{ + if (buflen < 18) + return ERANGE; + + __builtin_memcpy(buf, "errno=3D", 6); + i64toa_r(errnum, buf + 6); + return 0; +} + static __attribute__((unused)) const char *strerror(int errno) { - static char buf[18] =3D "errno=3D"; + static char buf[18]; + char *b =3D buf; + + /* Force gcc to use 'register offset' to access buf[]. */ + _NOLIBC_OPTIMIZER_HIDE_VAR(b); =20 - i64toa_r(errno, &buf[6]); + /* Use strerror_r() to avoid having the only .data in small programs. */ + strerror_r(errno, b, sizeof(buf)); =20 - return buf; + return b; } =20 #endif /* _NOLIBC_STDIO_H */ diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 9ebebe4ff253..638f18fc5123 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1786,23 +1786,6 @@ static int test_scanf(void) return 0; } =20 -int test_strerror(void) -{ - char buf[100]; - ssize_t ret; - - memset(buf, 'A', sizeof(buf)); - - errno =3D EINVAL; - ret =3D snprintf(buf, sizeof(buf), "%m"); - if (is_nolibc) { - if (ret < 6 || memcmp(buf, "errno=3D", 6)) - return 1; - } - - return 0; -} - static int test_printf_error(void) { int fd, ret, saved_errno; @@ -1852,8 +1835,9 @@ static int run_printf(int min, int max) CASE_TEST(string_width); EXPECT_VFPRINTF(1, " 1", "%10s", "1"); = break; CASE_TEST(number_width); EXPECT_VFPRINTF(1, " 1", "%10d", 1); br= eak; CASE_TEST(width_trunc); EXPECT_VFPRINTF(1, " 1",= "%25d", 1); break; + CASE_TEST(errno); errno =3D 22; EXPECT_VFPRINTF(is_nolibc, "errno= =3D22", "%m"); break; + CASE_TEST(errno-neg); errno =3D -22; EXPECT_VFPRINTF(is_nolibc, " e= rrno=3D-22", "%12m"); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; - CASE_TEST(strerror); EXPECT_ZR(1, test_strerror()); break; CASE_TEST(printf_error); EXPECT_ZR(1, test_printf_error()); break; case __LINE__: return ret; /* must be last */ --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 50407308F2A for ; Sun, 8 Mar 2026 11:37:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; cv=none; b=nvb3Vj0H1oZUNwv/237TGfunwMgCz35+4TsTIP/qFiYNeUWtvVriQaz/o6p9BBhABg3jE9AqaR7gPCVk0s2Plr0s1gwl50oRGYqiz/Cd6uRJQ5bkhYqUZSyhYTITNfgDwZHCyJFxygQ+ZcqqOM6L43fgjFMmn5dStQ8HeT0xTrk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969875; c=relaxed/simple; bh=5X0ZbcWnKK4zYCQj6h4mXs+PjDBEhKDzInKggpYW4XE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tKqO3Y5tHyQdU0a3YiFfxs19k/5n1OfQzqAzxxrNcSw2Kgl68gtZLyVXOP4ogwPqOltkKoyUL6GeplMY5lGUW4UASfod7buOgBVP/t8qgMsiKaiKIVAuH2alKCSofi+9hBjJ4BLxNTHOSfGzDmxkWwx0JumBdM2fvrx7v9+7Oh0= 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=jPdeDtJK; arc=none smtp.client-ip=209.85.128.45 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="jPdeDtJK" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4852f8ac7e9so13328165e9.1 for ; Sun, 08 Mar 2026 04:37:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969873; x=1773574673; 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=6cRvG+fCYYqrFxwl+w2SBmZvpZ+ot+O4U1NohTFTxk0=; b=jPdeDtJKX0GWvNqAH5WO/qHRtYRCcI0u3Spf1d4fF8hfzQeiHTUuhUMxomMHo2EA8t VwMGrDWfI/Ytb50lBplPofwEc++plSis71EP6oAkHe54Ww4/gxpeM6Hg3Q9afvX8sxZO fGnZdRRB0f8tm6XEOsHVvrIIaWT6jcZeLzS4Y5B4LAmAq6HQUHd/rHAsq8ViQvjfLowI mA9/gpRD23/gnMzEW76KOAEBuvkAQOCcANkC/bS7ksfwg1tGPDHuFmIXb4lTmJyeuyJT UW4G0UKHQVeZWFBJIjamgLqp0ww5c8kzLFTch4GZLOztMZolozne2C8p7CcCy8cRGRTA WOog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969873; x=1773574673; 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=6cRvG+fCYYqrFxwl+w2SBmZvpZ+ot+O4U1NohTFTxk0=; b=CER8D/+L77XkgdtRi76FZ0F1e+jeaJgP1hsS1oQWQwYn7qcEkwtAtpluCNlxUW+EzY esBGw2KnXIWsEB3JHLY3IqHSp9bOGfJgtxFbiksQZuhoZZmnx2pN74cF+hNi4DFVqHuc uhbVGUITyQ5q8TU0BPE0nAA5qVpsFE/V848e2zx0PUqMA5fKdSoCQEg7JmI6vYlheKDB T7g6CTsP2nfNkJ6cobNnWIwRkH4Wi1JNP+1xW9fee5KMDIO4wA8cP78/zFUQoz0ZmWXt kOfvFEZTSelZiUO+NN+lCpz/jeaHm1ilFG498se5wTnuAoVN9iIc2JT7T0sYOJMoKezi ZhYw== X-Forwarded-Encrypted: i=1; AJvYcCXN3ZsdZLpoQzqsibD/dtD2tmuTqWYqc7lFBNQbvGLqiA555ZLdHov5v2Dupwm8ZF/Hr4F9KcHBmYlQNHo=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6dOQSLThOakzt+dN2yHz2qutN40vNefcMBobd6vKYD9lZjdAH 3cHyzkNqlI/6zMD5LKmMl1mlBjtCavGvVn3OkvUSLMMi3hhl9tdOVriw X-Gm-Gg: ATEYQzwOuvaSFCeP1IeOYX4mil1oZeJ6l7F8jnl5Y8VNvEbNWLAqSvnxBVKx7pmfJip aG9EDAU6Pntpep1aWnPJybXHQ6z/9QnDaq+86NdtZi9832DQ95AQ5w1n+xqJDg+pAPCL4KrZ6EZ lGRsi+Wajfkyd08jgz4q37GmJeOTjycCD57lXl7jf4N1FP4cI+aqsFZBO0vHZJGu/zDz6S3Ev1Z 26m78gtf+JcXpwMEA2PLEIAeqiXJzP7Ijo6zvRJdGawrWXCSDhMrOM7VVWS2HZUMZ1pvUxmh9BR D1tHxrGIeaiDMgA6NTDq7saR00cHMyfFAle3PI3JAby/2LPPzMAwUQzvhsSJweH5OkX8Q/HWWHz dUy9c2P8cZHNPgC/Gh2xNZKO/e+RA96/FFyQiF9J7ZL4fCypdE1h1ue+67l0Pvsgu3oOYH/7b0J x5YR262qG1L7oCRpX0OL38vlcKrRHjRxRxl1qXIuZgzre0DYd8UlN7XWG6kjY0XmkfY/B5Q6nRJ 0CFZFxo5PSR X-Received: by 2002:a05:600c:3b0c:b0:477:7b16:5fb1 with SMTP id 5b1f17b1804b1-48526918939mr137506175e9.7.1772969872565; Sun, 08 Mar 2026 04:37:52 -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.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:52 -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 04/17] tools/nolibc: Rename the 'errnum' parameter to strerror() Date: Sun, 8 Mar 2026 11:37:29 +0000 Message-Id: <20260308113742.12649-5-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Change the parameter variable name from 'errno' to 'errnum'. Matches any documentation and avoids any issues that might happen if errno is actually a #define (which is not uncommon). Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. v4: - split from the previous patch. tools/include/nolibc/stdio.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index af2d5be47aa3..17ca206f77fe 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -734,7 +734,7 @@ int strerror_r(int errnum, char *buf, size_t buflen) } =20 static __attribute__((unused)) -const char *strerror(int errno) +const char *strerror(int errnum) { static char buf[18]; char *b =3D buf; @@ -743,7 +743,7 @@ const char *strerror(int errno) _NOLIBC_OPTIMIZER_HIDE_VAR(b); =20 /* Use strerror_r() to avoid having the only .data in small programs. */ - strerror_r(errno, b, sizeof(buf)); + strerror_r(errnum, b, sizeof(buf)); =20 return b; } --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 B38D531B828 for ; Sun, 8 Mar 2026 11:37:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969876; cv=none; b=cQXl1+n2c7LBhzD+P0L0mAhNmznfZ7MbH5ngGJ2CPoPNhuprBU1Aq+Ffm/rzPG0WXwof8Zbd7WeuklDeSjJRlWP8DLmW04sUd8ARDRQzX137L/aOr7lmudjBF1LaK5rrWF+PRkqwbf7mEEMD96wsko62m7/pOPtBd/fClrrQC8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969876; c=relaxed/simple; bh=irKcCVblMfGu+H4cwX8KZpR06oUo3CuLBPkFM1t3lZo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ETRHuX6W2/O07q9LElBLlYWb3ZNaXiXyUiFWYWnzUSKoZV+ZNqwzfK2j1THw97Yw8vw07+C5ji7wsTAKjUxCAkiVxb4DpeadzVKkcLS6o2mfP7Q0sJV/+lUApdxomTOXIdzrr9R9GIiabaVnP/uEYtr0Hienyb/5l4AfbPbRuiE= 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=GH+1nVY/; arc=none smtp.client-ip=209.85.128.45 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="GH+1nVY/" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-483abed83b6so87920505e9.0 for ; Sun, 08 Mar 2026 04:37:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969873; x=1773574673; 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=z98FnCAQC9fQD/5hj8Ds3y0k291Y2chEyf8+4YWZ+i4=; b=GH+1nVY/nRfVAgeh/FYUatAj6q+5mtEN0bKoHOw01vCcynf9EmJmPoWnUcp/QZIMYn eTyUJJvpIt/xlzpGOQeq4O+r7GYKBQeFJ9VJ8piSrZgkdbS907AJd+yaZHf/+a5kdTP5 0DxTdlBXmsoBrs/WmGYi8LqwBE5GsQO1fMNsbz57JAp4tAb+XaZCg+bwuKDLwFDIRShZ xKmEgJ0eWH9+FEl+/CF1CLo80Am+0mYCXKpwT4DH8GRODWf20CCIpmNCJWfzCmzGq1dP QtPujcOpOOObzl4M6NBMLF/1LOWmSI4ewtkbTCu0R6gGP7Lr5f+FxTzT9evHQU3Jbd9U TFTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969873; x=1773574673; 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=z98FnCAQC9fQD/5hj8Ds3y0k291Y2chEyf8+4YWZ+i4=; b=GtpW1ZsebcA+QWEUlZ1eQvEu5PHxE1V0fXyBdrpQH5ysoiSSUISTO9BfQkT+/l+mCZ c1r1UR3ChEXda67mPy4rejJYmghZEXflVQTZcQfuPCLyKoiy4/GXQCafYqvgDzLE0B/2 aj1IKivL/XsCwU6iLDWrFnoULFR7Oy26FwNYOG+9GLkaZA8UZSQ5/gROFY+qE8gWbTM/ GK7J8n9zHp3TSRhfnIuCaHTQhZsJhKm2//OdvOL6MBRXKW8mXUHsnr6iT0uDaf5yNOn4 NtBPgAUoRxPdhkA3O9LhLUWaB6XQQZMW+rIX0LdiRlQfjBxEpLk2RjaQyyfoZVLElVX/ ZPXw== X-Forwarded-Encrypted: i=1; AJvYcCXxL+NWnFmK459kgydXqWGWuM7P2vnV5teRvSKHphThsz7h4jHgLLhnUK6pqsubmGmfz212TlPHw+4RC1Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwXpfqTTr46rMbFZlxuhKbuGdjWOEvzwzBZW3Pom9Zynmqkren0 +TSnyOQ/q01Bdnj54NknhOgj2KXXcIzk3gjqKwgSYYNIJHFoXxW3j3R8aokPdr24 X-Gm-Gg: ATEYQzzqcoCqZvrgFxkhCXa4Sj4ByulwVVVEStnvrZsB5mYoOr6bAjY6AHG3XfQusst dXzD4bQzfprwdsc/65FwdRDn5RypA5tvs7c14toV/vNj+iXWTkfVhidpkzg07FDOGSW24mb0a+Z xcWGKTLgWqk4v7RJeRI40n15li+wn1ELCoLUCgFCEsSels7molSMUlqMAQip3eSfqFaz2n6VoWg W/+Do7QpATxXXIrsUlD+VUzdd6Tkti074nqZ4A3hB+xLDsP2TJcz9fSw5W/kRrwmMGPR1XbAXps CSAM/xZnqYmO11QSWZamVmxXXZMkAwrcZfunk8DsX93zRf37jgDJEMNlBQKK6j0PjtVHsQC6rWx 0kJLQdN31GIgLeEPkDv8SfO5VYqKEfA+/RoG1/3ECiQhIYLmCcXupWY6vF0DzyBoHFkPFBDKgMM Z2CfjFqAbREJqT/LbiaSt4CwagpXm6i3nfnhjVLgUhWyo1LECErrQIdrABQaAAZ8khuy0rIH7tH mdrmZMjRjEN X-Received: by 2002:a05:600c:37c9:b0:483:612d:7a9a with SMTP id 5b1f17b1804b1-485268bf171mr127719145e9.0.1772969873094; Sun, 08 Mar 2026 04:37:53 -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.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:52 -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 05/17] tools/nolibc/printf: Output pad characters in 16 byte chunks Date: Sun, 8 Mar 2026 11:37:30 +0000 Message-Id: <20260308113742.12649-6-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Simple to do and saves calls to the callback function. Change variables written, width and len to 'signed int' to get better code. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v4 and v5. For v3: - Change to signed variables here rather than a later patch. tools/include/nolibc/stdio.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 17ca206f77fe..c6d5d075f012 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -312,8 +312,8 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list { char escape, lpref, ch; unsigned long long v; - unsigned int written, width; - size_t len, ofs; + int written, width, len; + size_t ofs; char outbuf[21]; const char *outstr; =20 @@ -415,10 +415,14 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list outstr =3D fmt; len =3D ofs - 1; flush_str: - while (width-- > len) { - if (cb(state, " ", 1) !=3D 0) + width -=3D len; + while (width > 0) { + /* Output pad in 16 byte blocks with the small block first. */ + int pad_len =3D ((width - 1) & 15) + 1; + width -=3D pad_len; + written +=3D pad_len; + if (cb(state, " ", pad_len) !=3D 0) return -1; - written +=3D 1; } if (cb(state, outstr, len) !=3D 0) return -1; --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 85DCE36D4E1 for ; Sun, 8 Mar 2026 11:37:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969877; cv=none; b=GRO5HSdfX7yXkS958npGQdIbOKFF7ezx8N0o9v8MbMvgw7aNBDPby+eySpygw9MkvzCuvpj+XUg3TwQesgkMX1xYzR5okTmFw4c/rPjdqL0eg95A00oP9uPXvgMR1vYUnE5z2aNWHUQKTFyWDJYxQi8lxif8r/4A7EBNVsuSjro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969877; c=relaxed/simple; bh=mQgFGwZjNvWzXWAPbcmUAKsDXOojzwYc3Guo0+OAJ/U=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=S/3mRHlytlgueAHy7yqdI8GHbLa0BaWTrUiFaKv6Fo6xzt6GuuEkpkqY5yd+m6xeqUnRmpNTmS91gYV9rbYQkspb26GtC2gSxgFjC9jldDFuFviMVRyGP4CKV7RgzGX8TfBiR5/MUuFc4QaCHNGmxAjfEiqvsD4UXfx/YsTg9ak= 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=helkUsnD; arc=none smtp.client-ip=209.85.128.48 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="helkUsnD" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4853510b4f3so6184985e9.0 for ; Sun, 08 Mar 2026 04:37:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969874; x=1773574674; 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=IaIYyPCgZxopQGmoMQuP53IISO9sbx5leX51cpyI1nA=; b=helkUsnDSbpF7G+YIVFGKh571fXRb/KkT+hTXDRHQBHltpcmMvqY+nNEzlSaRo2rbt 6tvxBdvGgpfWUYyEdROF+nO5AeI0fl4gJNPwFWSEeEj2F4Z9282kDCNZlpOMUjx7zEyQ 2QuSY9mS4uRZRcR7lI9qwBZhTeFp47t14CeyynSQt16ZPlK09wYqlsldnhpmcuRbaE6Y 77mNftBYaz0lgWW2UY6eVfr5qy7bqTPI5PP3ZW5uhJ4PAgNcHwzezSArSUKBqi1LhuK6 8qXDComNOfcJxDlRDiffnIu8rKOIqfDzogeJKWMLtHayt8UZI2YZbm8qoF/nqrgGp4te tdZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969874; x=1773574674; 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=IaIYyPCgZxopQGmoMQuP53IISO9sbx5leX51cpyI1nA=; b=SVhYIJj+OdBMdgBqwiaEo3I/CE9iQhaHr/OCNMKJIJIbwaTQcnj6zsfvkpBLDlYcZx T9NaMDZA14FPibkdKQXIVy9/ltIgr1vPC8iJIZGHWfth+NFVlmeM/s30M1Y9v0FUeBcr drLo7HzCFQ3icWo8+At4LmrkCHYyNaENm7oPxM3wr7uVEUKp8oxlWZWXv42SDtM4pSxR 9/1dkiy/z9M57Cr4wkJPaZDkGDa3MLNHfYaKlYj3nqMc4Pc9btEsLuPh8v3hcd34esBZ v356vy+YTE/2c5E5eX0DnhTn4Wg/CTTIg5eAbqZIwUPtYukzCB+3qSc9zLZOZ8rGVoes Up+Q== X-Forwarded-Encrypted: i=1; AJvYcCUwEcXOl/m98IVuxyse0b7v/Yk9TrScxOuhSmakiPX7vrHrsxGDUv+0u80V6AFO+HpjQFRk9YmL+Hkuu6s=@vger.kernel.org X-Gm-Message-State: AOJu0YwF9IOPM3VxF4UYZt8yAdhBu/0Tg/ccinlcXPmJGzlHo1u+Vwtx n8c+My/excGLgjv+KtIMhhuKVIvZ1l+Fazs33r0aLLXIZTTaL8Z+91qN X-Gm-Gg: ATEYQzxRv0cIgpaqi5iTAfagrpAhR5L+IAxJ6+RPdI+2h7tyIGkh+SB+yhXpa1114b3 h/sSX37uCoXNBIsMaFpoWageLDijEXzPr+cNHqoqhBxZgAsMYJR5Q4vUQLp1Vik2m2p/3Lz/ygX o7CX06Xek3XLx840rLMdnrdnJ2yvdgqWPSch6KJ3d1zGiEdxAPFB3auOQRDEEP9Up1x3h+shUcr oBEL7V3yKHvTaXdhrKDYvtNRYaVVV03rHja+ro5cT1jjK93tWCKk/h75KrTqKPxd6C+ZqmvMSPp mbfHr2Gc7FOrni/ZL1gtumMX9V77gsj+LxZV1D/8z4CbgImo89DXuSyXm+ddngqSq1GBUtBViB1 6Zb8yO0OtOOe8C6NyyWlQ9NBqo/ZUcQqqKQFFNWbRawTBy6EI1dn2EW0KD7mMdmYmuOau0gm2T2 2yBZJQe9ivde0d1RRdE3byHDLXZAMd0QEKvsWnrEn1mBo6HGCMncwfvJ+JTOH5XNsbhsi2wcqU3 q9q/gm+PKvb X-Received: by 2002:a05:600c:1e88:b0:477:6d96:b3e5 with SMTP id 5b1f17b1804b1-48526916beamr154065155e9.7.1772969873810; Sun, 08 Mar 2026 04:37:53 -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.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:53 -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 06/17] tools/nolibc/printf: Simplify __nolibc_printf() Date: Sun, 8 Mar 2026 11:37:31 +0000 Message-Id: <20260308113742.12649-7-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Move the check for the length modifiers into the format processing between the field width and conversion specifier. This lets the loop be simplified and a 'fast scan' for a format start used. If an error is detected (eg an invalid conversion specifier) then copy the invalid format to the output buffer. Reduces code size by about 10% on x86-64. Some versions of gcc bloat this version by generating a jump table. All goes away in the later patches. Acked-By; Willy Tarreau Signed-off-by: David Laight Acked-By; Willy Tarreau --- No change for v3, v4 or v5. tools/include/nolibc/stdio.h | 104 ++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index c6d5d075f012..b3cfed162eb6 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -310,28 +310,52 @@ typedef int (*__nolibc_printf_cb)(void *state, const = char *buf, size_t size); static __attribute__((unused, format(printf, 3, 0))) int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, v= a_list args) { - char escape, lpref, ch; + char lpref, ch; unsigned long long v; int written, width, len; - size_t ofs; char outbuf[21]; const char *outstr; =20 - written =3D ofs =3D escape =3D lpref =3D 0; + written =3D 0; while (1) { - ch =3D fmt[ofs++]; + outstr =3D fmt; + ch =3D *fmt++; + if (!ch) + break; + width =3D 0; + if (ch !=3D '%') { + while (*fmt && *fmt !=3D '%') + fmt++; + /* Output characters from the format string. */ + len =3D fmt - outstr; + } else { + /* we're in a format sequence */ =20 - if (escape) { - /* we're in an escape sequence, ofs =3D=3D 1 */ - escape =3D 0; + ch =3D *fmt++; =20 /* width */ while (ch >=3D '0' && ch <=3D '9') { width *=3D 10; width +=3D ch - '0'; =20 - ch =3D fmt[ofs++]; + ch =3D *fmt++; + } + + /* Length modifiers */ + 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; } =20 if (ch =3D=3D 'c' || ch =3D=3D 'd' || ch =3D=3D 'u' || ch =3D=3D 'x' ||= ch =3D=3D 'p') { @@ -387,56 +411,34 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list #else outstr =3D strerror(errno); #endif /* NOLIBC_IGNORE_ERRNO */ - } - else if (ch =3D=3D '%') { - /* queue it verbatim */ - continue; - } - else { - /* modifiers or final 0 */ - if (ch =3D=3D 'l') { - /* long format prefix, maintain the escape */ - lpref++; - } else if (ch =3D=3D 'j') { - lpref =3D 2; + } else { + if (ch !=3D '%') { + /* Invalid format: back up to output the format characters */ + fmt =3D outstr + 1; + /* and output a '%' now. */ } - escape =3D 1; - goto do_escape; + /* %% is documented as a 'conversion specifier'. + * Any flags, precision or length modifier are ignored. + */ + width =3D 0; + outstr =3D "%"; } len =3D strlen(outstr); - goto flush_str; } =20 - /* not an escape sequence */ - if (ch =3D=3D 0 || ch =3D=3D '%') { - /* flush pending data on escape or end */ - escape =3D 1; - lpref =3D 0; - outstr =3D fmt; - len =3D ofs - 1; - flush_str: - width -=3D len; - while (width > 0) { - /* Output pad in 16 byte blocks with the small block first. */ - int pad_len =3D ((width - 1) & 15) + 1; - width -=3D pad_len; - written +=3D pad_len; - if (cb(state, " ", pad_len) !=3D 0) - return -1; - } - if (cb(state, outstr, len) !=3D 0) - return -1; + written +=3D len; =20 - written +=3D len; - do_escape: - if (ch =3D=3D 0) - break; - fmt +=3D ofs; - ofs =3D 0; - continue; + width -=3D len; + while (width > 0) { + /* Output pad in 16 byte blocks with the small block first. */ + int pad_len =3D ((width - 1) & 15) + 1; + width -=3D pad_len; + written +=3D pad_len; + if (cb(state, " ", pad_len) !=3D 0) + return -1; } - - /* literal char, just queue it */ + if (cb(state, outstr, len) !=3D 0) + return -1; } =20 /* Request a final '\0' be added to the snprintf() output. --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 4DC4236EA8F for ; Sun, 8 Mar 2026 11:37:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969877; cv=none; b=p3DMZeogMPGTmNk68a1zOz/McyXRyqyrJtOh5t65Tc6hPdO1rOq30R7INysiFaiJBJrM0oKJ7CiNM5w3xiPmLI2PREEVAqe4hWYk/zjnDVAzR0FrUzSRJwDK2uUEn4IrMCDjTLNwNNAHQbzYlQQHGLuD/GiHLruj7Yko0xJluNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969877; c=relaxed/simple; bh=q3W7SSSz1AN1X8znuW2LGwr0PxR1H+nRFpftRLklxCU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=E5pM/wX6rnBqr99WwhWWcd3xpsTQKGvSbzR8x0ObHHjf28YOjwoUEjpZjYfksEouZh4ylGBermMU8ocNr9MbiSVK6gBXEZoY9DPPX37ZFNmK79vHjHOPpcGlVGIgQniX9tQZcbwfDscjlpso8+CLTrCu5SjJuuJGwJ7I9pqdBzc= 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=QclnimMc; arc=none smtp.client-ip=209.85.128.51 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="QclnimMc" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4853510b4f3so6185055e9.0 for ; Sun, 08 Mar 2026 04:37:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969875; x=1773574675; 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=7/3sJaQW9mdlB3Ci3VcFKBs5+56i7sSWzFPv2EDoFbw=; b=QclnimMcAvwIcbvf6iuHe6Ib/JfE13ZLS5VtoKzUJD7bt2f3q3JrEpd1bGuWv7OZdT /MqXc62zZ9nKn6asND4Qids02xpTmVaPNehu8iw/FhPu3rZSm1RfLDg3XSq8YWsVIP28 CT+0n2DpzQWQQTIZWU25FkK5+dLUYVdi3ONEfSmj0XEc+xcR721pgMCwc61uC9CCInMf I/aG47WDhrkTD8gU27LChErIR+u3741V7sq0jgxWAnQ01B9x29iZ1kUMDflZq1uhgUpk K/7tlNTk+eJaSoEpwncGPvhpwk0Wrytu9xnZgorYB93GEqQ1sveDpNCR4C70ylmnwANH F7XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969875; x=1773574675; 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=7/3sJaQW9mdlB3Ci3VcFKBs5+56i7sSWzFPv2EDoFbw=; b=vGEjc6exm8Icw6CWHPd7fH+k/9gixWlgNrQLH5whIZ92q6rs9iJNKhSuUx3NDNYS1U /WKJoCTil6ZZqOqbgLIWjZ0J27h3zCI7t9K0hFLbktPfM6X3/hNJKUVcnuXdV0BBgUn+ RFHC/XEbtZQUJoMdVZd83Ri8kJEIWUg1/BaoSyOpFL/qJZYiWPZjrnWhDypn4Tqjy9Zv uwmCMXXDh0+7e1gmSUvn2xauiM/1z5jtJTw+Mw66waxQOWkG8XaIsNF1XYQCBMHOahrN z6cMW/fYDxjjA5aMiZj1akCZCUzWI+lvQFShAk8H1Hcz7SG34SZX4ozoMp9AVZ8uzqvb /ugQ== X-Forwarded-Encrypted: i=1; AJvYcCXaEjpw5tWn0Y4yLVxRPUzDPBg7znWdiAP0i8XtckPQtmxCoBBqsZq69fCftvGy3Gc7cK1ZOI9ZJx5+3u8=@vger.kernel.org X-Gm-Message-State: AOJu0YzW12fCMRawMPp0ZEuNBdXk9eIV5yt35YnRRxVTZB/jcOTzRwgF QAGWRoB7+NegAuHpYxFaT//o0WoE+tcew3pO8c9uls2A236RH7da8Pr1 X-Gm-Gg: ATEYQzw8QK/dWK/0DX7DoCfn5sQoD21gcmGaigRrqov8x1D1JkVBJrvNnowUCmGsKTa tfHkLBJZiOKn2qQXQaTwsPmrH8JwTlPgQs03+x8wy+5MaKFydHVKmrCYlA+Of3XrkuCxTtgf98E rbxRb/zpZjkFrSTBAlrxk2inbOyrfTCBiFhf1Lgic8gc+8Wvbyzna4VOXZetga0Wclk7DbhXmkA xNm4cFiKp0roiMIE8M0VLTVsJdwRq8TqpN6Ac0YoQ8QgtekWa7ydGNEGmJrkK8mY4mOZQaY2pdc KTjJBqzHVxHobV8nyNc7aH24dmWPOUwoTlVpDAfD226VLXmtgcDq6YqMppborbV8KtBmWpPaX4j qK9R1G3eSAiEJv7t1YZRMVQdbOfaIr93kdGwfctRa7+G7r/Wk0LZnGQurqXUlZN6cAN4cX0raJo 4kyTJ4kw8la5uEVGJXRbyJ4iuqn73g7BXEwkb6UzKnvP3Yfwd8LZr+myz1LNy+9TO0N+x8WeghL SAurmkYccsk X-Received: by 2002:a05:600c:c4a3:b0:483:9139:4c1d with SMTP id 5b1f17b1804b1-4852692c943mr137749125e9.14.1772969874423; Sun, 08 Mar 2026 04:37:54 -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.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:54 -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 07/17] tools/nolibc/printf: Use goto and reduce indentation Date: Sun, 8 Mar 2026 11:37:32 +0000 Message-Id: <20260308113742.12649-8-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: 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. The change is best reviewed using 'git diff -b' after applying it. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. 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 b3cfed162eb6..710a4bce5e81 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 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 C1B7C36EAAA for ; Sun, 8 Mar 2026 11:37:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969878; cv=none; b=F/rqJ/lFJZ1O3GmGCV/xQr17x3xuqzDCnOklLU9JnRYptK1FXe+xHKgx1owjGWGRSHnbHOkm0ZjaD2iF6pIQwebRK09uBbqG3Mhlads58bdQRkuutvFV0C5XZbGNF4FwXAYtnOxtjnmA/+B4YLfYN4wfseMGRP+/s2ZrDRTxhQg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969878; c=relaxed/simple; bh=5JmH7QKemZwHNtPIwue6l92xhZH+hDUVDue3JFPAhsY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cUBBCvtNoEqv+VGHdgy/5dGi3bql2SzbFuYg45E0C2urE6SjBE0rB/e2vPxVIzeBAF9wsJLj345YKMgYfuYGt1B8AhPFS9HrRq95i85LXY1y11XXlT6ZwnfGyXkQKO2ShD8rJjQMZwmFEDIL4ZYcqmmfzcf+gWFoaLyeWB4whEk= 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=gfgEm+0r; arc=none smtp.client-ip=209.85.128.54 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="gfgEm+0r" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4852b81c73aso10988795e9.3 for ; Sun, 08 Mar 2026 04:37:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969875; x=1773574675; 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=VeTG18GBPVvO0QvKS52Zil72nuKVCdy49QFRXQMOmXI=; b=gfgEm+0rwviFv79GlwJ9DzjpLTjEQLPsLSJRECxFhwMcaclwQU/GOIg5Lm5C03oZt/ cae/KEq5VTvj//ZKwEzEwZ82cqiuiSaf3AuQ88IR/NXAZs6zZXgqDlNipW2kkHY3Usqi 1X1C0cpAjZgAKX403FBR+n+kutV/4BZFmZI/spaNVFS8HPij8ZNWXyLbff+1BGe+JIcz EYt1a5LA5+xIA249idPCbo2uFzkUDqslFlMtD/1Y9azLhyVoV+QK7lLdbObTtnSn1ggr Cj2LG6J1y1rqDfrmmL4Cp6gLSiLQDnkJh16mDubC/3wDFi7/VmvMVtBmROai4S/3+zgF ZVqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969875; x=1773574675; 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=VeTG18GBPVvO0QvKS52Zil72nuKVCdy49QFRXQMOmXI=; b=MEPZX0d60zWOiKeBxKfeIXilL6tkE9ezHJBE3VP/Sf7WD6RnbRLyqJQmDJrc+dK/9J +N1hjHjczlsQMNe43WQ8AibPWiDlOBqTisPGikh72++R8blFRH4etUL+dbDMWrzehuG2 2GivpIepMWrS81fxT0prnG0uEBSFni1KJoRdlFBjTlRbHqvxIQb9k4CIvop6u54PcH5V fA4VBOaXvZQnY4CYqB6HbTTfO1Gu2RFfE1VAdIFBJ4v26Bg5fUeMBBQyiuxaZ5lRgYoh 85iwYALKmQmeRSVlIaJGSzpyLvQFDWInC39T9prJ7zFTBPHTR6h7tX2XRVztWCXslV2/ ASOQ== X-Forwarded-Encrypted: i=1; AJvYcCVSKlNavlAxqreHDSEdK1qbnzjt3Vw/2kbfubL6K789kZoQ26h7nDKRloSwgk2P8iGmG+ChyhSDQ74evYE=@vger.kernel.org X-Gm-Message-State: AOJu0YxvkVscKd4WVVjmNnaKjT37KiRy6AcOI8czLYUS55OWbIEcvBT/ xcoBr0R6QCiqupBOqObkzyd03oBa4oAQO0hirKLZN7yVU1HO1B2POaK+ X-Gm-Gg: ATEYQzzitPRHX/arJss6sPrjTdRdwHuFL2S2RXzIqH+JlG9cFfkuvcKSRKJFd9kwK+v Y84o+3eRwlYXl1zc1cH60Z88KK0OwY+zzX9NFG+I/vzSEpr40++PeY4aBGVkocrcC61GJpHg/HG ReE0AmCRjP37thPAKywMyoqRDIoVPY1EZxbz9+Tb2rkCbFdyw6ZP7J5mBLI2R61lXCmhM1PsEKF 28uxIOGcIHjfDi6oLPHA69HOHznVc9AoxDFhcVYEyEb8LPbVY2/vFWUiUiA/0Aj+TB7/RKfJ7Yo ExBGK6GxnneAaNPaf6QjfnLY9/eiTmyynMMnVjPa8siBUxqbY6+jnXZMUUkCT9c7cFBD4Sbzgyg MtWhn6yFZnG3HOjzJ6qquUMdPVKTy1TzjPDFeeB+08efAEYRSjnELeFpAC4JlkKir76h9O8ZNXC pxAkOOuFXySmypddXxKqarNIm5v5NSEEPEcRS3e92pgH0ZjOBVN0VUOeHOnH8HdnHR2OabYIE1V tWfKEYnWFSV X-Received: by 2002:a05:600c:3b83:b0:485:35d3:ce57 with SMTP id 5b1f17b1804b1-48535d3cf0cmr35609995e9.34.1772969875064; Sun, 08 Mar 2026 04:37:55 -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.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:54 -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 08/17] tools/nolibc/printf: Use bit-masks to hold requested flag, length and conversion chars Date: Sun, 8 Mar 2026 11:37:33 +0000 Message-Id: <20260308113742.12649-9-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Use flags bits (1u << (ch & 31)) for the flags, length modifiers, and conversion specifiers. This makes it easy to test for multiple values at once. Detect the conversion flags " #+-0" although they are currently all ignored. Unconditionally generate the signed values (for %d) to remove a second set of checks for the size. Separate out the formatting of single characters from numbers. Output the sign for negative values then negate and treat as unsigned. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. Changes for v4: - Move the support for length modifiers t, j, q, L and formats i and X to the next patch. - Convert ll to j (not q) since q isn't added until the next patch. Changes for v3: - Patch 6 in v2. - Move all the variable definitions to the top of the function. The loop body is a bit long to hide definitions at its top. - Avoid -Wtype-limits validating format characters. - Include changes to the selftests. Changes for v2: - Use #defines to make the code a lot more readable. - Include the changes from the old patch 10 that used masks for the conversion specifiers. - Detect all the valid flag characters even though they are not implemented. - Support for left justifying field is moved to patch 7. tools/include/nolibc/stdio.h | 157 ++++++++++++++++++++++++----------- 1 file changed, 108 insertions(+), 49 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 710a4bce5e81..1c2b2cf9a1f3 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -291,10 +291,14 @@ int fseek(FILE *stream, long offset, int whence) } =20 =20 -/* minimal printf(). It supports the following formats: - * - %[l*]{d,u,c,x,p} - * - %s - * - unknown modifiers are ignored. +/* printf(). Supports the following integer and string formats. + * - %[#-+ 0][width][{l,ll,j}]{c,d,u,x,p,s,m,%} + * - %% generates a single % + * - %m outputs strerror(errno). + * - The modifiers [#-+ 0] are currently ignored. + * - No support for precision or variable widths. + * - No support for floating point or wide characters. + * - Invalid formats are copied to the output buffer. * * Called by vfprintf() and snprintf() to do the actual formatting. * The callers provide a callback function to save the formatted data. @@ -305,15 +309,43 @@ int fseek(FILE *stream, long offset, int whence) * - with (NULL, 0) at the end of the __nolibc_printf. * If the callback returns non-zero __nolibc_printf() immediately returns = -1. */ + typedef int (*__nolibc_printf_cb)(void *state, const char *buf, size_t siz= e); =20 +/* This code uses 'flag' variables that are indexed by the low 6 bits + * of characters to optimise checks for multiple characters. + * + * _NOLIBC_PF_FLAGS_CONTAIN(flags, 'a', 'b'. ...) + * returns non-zero if the bit for any of the specified characters is set. + * + * _NOLIBC_PF_CHAR_IS_ONE_OF(ch, 'a', 'b'. ...) + * returns the flag bit for ch if it is one of the specified characters. + * All the characters must be in the same 32 character block (non-alphabet= ic, + * upper case, or lower case) of the ASCII character set. + */ +#define _NOLIBC_PF_FLAG(ch) (1u << ((ch) & 0x1f)) +#define _NOLIBC_PF_FLAG_NZ(ch) ((ch) ? _NOLIBC_PF_FLAG(ch) : 0) +#define _NOLIBC_PF_FLAG8(cmp_1, cmp_2, cmp_3, cmp_4, cmp_5, cmp_6, cmp_7, = cmp_8, ...) \ + (_NOLIBC_PF_FLAG_NZ(cmp_1) | _NOLIBC_PF_FLAG_NZ(cmp_2) | \ + _NOLIBC_PF_FLAG_NZ(cmp_3) | _NOLIBC_PF_FLAG_NZ(cmp_4) | \ + _NOLIBC_PF_FLAG_NZ(cmp_5) | _NOLIBC_PF_FLAG_NZ(cmp_6) | \ + _NOLIBC_PF_FLAG_NZ(cmp_7) | _NOLIBC_PF_FLAG_NZ(cmp_8)) +#define _NOLIBC_PF_FLAGS_CONTAIN(flags, ...) \ + ((flags) & _NOLIBC_PF_FLAG8(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0)) +#define _NOLIBC_PF_CHAR_IS_ONE_OF(ch, cmp_1, ...) \ + ((unsigned int)(ch) - (cmp_1 & 0xe0) > 0x1f ? 0 : \ + _NOLIBC_PF_FLAGS_CONTAIN(_NOLIBC_PF_FLAG(ch), cmp_1, __VA_ARGS__)) + static __attribute__((unused, format(printf, 3, 0))) int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, v= a_list args) { - char lpref, ch; + char ch; unsigned long long v; + long long signed_v; int written, width, len; + unsigned int flags, ch_flag; char outbuf[21]; + char *out; const char *outstr; =20 written =3D 0; @@ -324,6 +356,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list break; =20 width =3D 0; + flags =3D 0; if (ch !=3D '%') { while (*fmt && *fmt !=3D '%') fmt++; @@ -334,7 +367,14 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list =20 /* we're in a format sequence */ =20 - ch =3D *fmt++; + /* Conversion flag characters */ + while (1) { + ch =3D *fmt++; + ch_flag =3D _NOLIBC_PF_CHAR_IS_ONE_OF(ch, ' ', '#', '+', '-', '0'); + if (!ch_flag) + break; + flags |=3D ch_flag; + } =20 /* width */ while (ch >=3D '0' && ch <=3D '9') { @@ -344,62 +384,78 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list ch =3D *fmt++; } =20 - /* Length modifiers */ - if (ch =3D=3D 'l') { - lpref =3D 1; - ch =3D *fmt++; - if (ch =3D=3D 'l') { - lpref =3D 2; - ch =3D *fmt++; + /* Length modifier. + * They miss the conversion flags characters " #+-0" so can go into flag= s. + * Change ll to j (both always 64bits). + */ + ch_flag =3D _NOLIBC_PF_CHAR_IS_ONE_OF(ch, 'l', 'j'); + if (ch_flag !=3D 0) { + if (ch =3D=3D 'l' && fmt[0] =3D=3D 'l') { + fmt++; + ch_flag =3D _NOLIBC_PF_FLAG('j'); } - } else if (ch =3D=3D 'j') { - /* intmax_t is long long */ - lpref =3D 2; + flags |=3D ch_flag; 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; + /* Conversion specifiers. */ =20 - if (ch =3D=3D 'p') + /* Numeric and pointer conversion specifiers. + * + * Use an explicit bound check (rather than _NOLIBC_PF_CHAR_IS_ONE_OF()) + * so ch_flag can be used later. + */ + ch_flag =3D _NOLIBC_PF_FLAG(ch); + if ((ch >=3D 'a' && ch <=3D 'z') && + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'u', 'x', 'p')) { + /* 'long' is needed for pointer conversions and ltz lengths. + * A single test can be used provided 'p' (the same bit as '0') + * is masked from flags. + */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag | (flags & ~_NOLIBC_PF_FLAG('p')), + 'p', 'l')) { 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 + signed_v =3D (long)v; + } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, 'j')) { + v =3D va_arg(args, unsigned long long); + signed_v =3D v; + } else { v =3D va_arg(args, unsigned int); + signed_v =3D (int)v; + } =20 - 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; + if (ch =3D=3D 'c') { + /* "%c" - single character. */ + outbuf[0] =3D v; + len =3D 1; + outstr =3D outbuf; + goto do_output; } =20 - switch (ch) { - case 'c': - out[0] =3D v; - out[1] =3D 0; - break; - case 'd': - i64toa_r(v, out); - break; - case 'u': + out =3D outbuf; + + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd')) { + /* "%d" and "%i" - signed decimal numbers. */ + if (signed_v < 0) { + *out++ =3D '-'; + v =3D -(signed_v + 1); + v++; + } + } + + /* Convert the number to ascii in the required base. */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'u')) { + /* Base 10 */ u64toa_r(v, out); - break; - case 'p': - *(out++) =3D '0'; - *(out++) =3D 'x'; - __nolibc_fallthrough; - default: /* 'x' and 'p' above */ + } else { + /* Base 16 */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p')) { + *(out++) =3D '0'; + *(out++) =3D 'x'; + } u64toh_r(v, out); - break; } + outstr =3D outbuf; goto do_strlen_output; } @@ -442,6 +498,9 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list do_output: written +=3D len; =20 + /* Stop gcc back-merging this code into one of the conditionals above. */ + _NOLIBC_OPTIMIZER_HIDE_VAR(len); + width -=3D len; while (width > 0) { /* Output pad in 16 byte blocks with the small block first. */ --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 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 8CB9236F42D for ; Sun, 8 Mar 2026 11:37:57 +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=1772969879; cv=none; b=XWFOaJhS2OiG5X+rQu7/DqNpc2HSaZktyIXbyYyL6cKrlcK6Knsx7Ay5yOBVY9QLH+HmIzp9JSrF23yGNXn8EuLiHlUr/YMWA4qHKTrzH8179fv0ZgU/f2mQjLUs3CREOm1ggKZoeei4L6sgs7hiqCMUjPYFJJZX4UC+psc7s1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969879; c=relaxed/simple; bh=KyuJ3dWnfj3RgRZ6sf9fKPO4K68KJWCYW+Byf4qltIY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XIt+dr89A+BS3dXAZz3pcd/+H230tNn8xMVg+LjlL1urpM5Z6Dt++RhVvuEl/na/CeGrkbP8NAtkgxptrFJfJpCa3Nuwd0AAj8KIstmyBVwHZ6+7CimuBV3CnJs+uo/uWcH65yzC5r9zy29LKupv0mb8W1aYdlC3bJt+ZWIvBaA= 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=N98KkXkA; 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="N98KkXkA" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-480706554beso118567175e9.1 for ; Sun, 08 Mar 2026 04:37:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969876; x=1773574676; 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=Uvdn2bDxR04dT2S2AcDdcV/ROWnGvI/QubES48OT7eE=; b=N98KkXkACetxvmowpqILHXGY8qqDb1u5TVjNW1svasP0ccCHN4meEZKlx+pZvHiBLs oFE6eSHVc7fX/l2lajaNaWjvONbjlIk+BWFMyPIZ71U2UQm5uDYB//EMKySD+n2115ow /PjEfmY1+cq7r2weCEAT+cVzXJ3pJ+smrhedwL2nq1mKTwHKW5SZQTTzYGWj+74zTt8A gO/tVShSuihWmfPB9xTZ5+P2y+/mlKRix5zripxa5LxrPE69GDj6//s5akQKLjIJR51/ jq7lVRXe7QlNBvckbH85mzgku036uFKk3/86D6Mp4G36ADtFu6+w8Su2/kbxpFUMpCLN TaRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969876; x=1773574676; 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=Uvdn2bDxR04dT2S2AcDdcV/ROWnGvI/QubES48OT7eE=; b=KnFN9YYozvKwV0Y0WZfGXC/JVp38svqa3REYnQfE9hVLkUC0iWSgIIrs4BvVmtcUIb HQE+gCU+YyJii9vZQWIpQgrL98NYwo6ecDl1EE3rSgIbeRDXGsdgpiZTyr5lRDKdAySk 2+FsR5rCxKwGsn0Q+yjWintoaf76qQUBddXGk2FqxGFJxl20sjpJivviZJMwpz8YCYLi DW1ElUqU4wce52hvRxshNZ+0SuenduBoTaWudfg+v5pH9+r6qavrNDYA3gJEwFX60J8k krJYVAruvj6OBNJTtJfjjEbsA6X/L7jrqTq7sI1xbuMkh0oA7dHeKxL5edTz3SWi7uSJ wWdA== X-Forwarded-Encrypted: i=1; AJvYcCUoZeJaab2l0GK0PjMUn3kdfRk6JpGJYUZjpxqqKda5Vssbu6EuSDFaABALEnIsc1Ioys8mAg/dbHXi5Ng=@vger.kernel.org X-Gm-Message-State: AOJu0Yw901s+jRKxqBwCk9LWPqdC1+8N+3a2EY2psP3LtVWjcQlCz6jB s66ln0ZDCQ/OMQOS8m90rKsfUrTGwaRcIsdQE+Q6oJN3YpZXyBR6dxffEqnFO3nV X-Gm-Gg: ATEYQzyCIgSJo7AOtjxejjn478I3e7Jo3h8DdtNTT3sm/je4iuYRNjJAHW3nHOHI+NE AXBwtIxdJ9VdKxvDv0GAA5cBplxL//Zr+B/uqFkscz36p3GwVxR57Z9R59akmCDcSuUQ3H2n42L doUZvB+9Ki2DsCLFPv2YOC6TgeA13p4zC54h8YOcp5GX4mUjH9yxUpkvyKzSfPZHdT5PBtPg348 JHoguxdvvZYfZplsG7TqJwu+LonpwVK9ZvEy/ARYulSGPxYEdmJq81DJxbdu5MjfQozB/VMqQQ4 YdttQXJndLb+oatVkKAKaRx1Fv/YMVJ57wH867I2QCtO0XtZpLeq4jkr1j3Dp5oItfxAaSILyRs eJ+ENO8ynw9IB/cKohu2WDRZE9yxizx0QQ9Q6UC6UJdgSjToTk0K06wVx5ZtGSPXq4vizNwiG0m +9B0cOwOiTwgRn2lmGos/AMGsnw2D0w+BfxrgC2jtMU6bwh3rbLlhqSYVh2K/+8oTevr3U4RQi+ GiktrhuWVCa7ZAOOIb5jT4= X-Received: by 2002:a05:600c:6085:b0:483:71f7:2797 with SMTP id 5b1f17b1804b1-48526930d9dmr132717785e9.14.1772969875775; Sun, 08 Mar 2026 04:37:55 -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.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:55 -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 09/17] tools/nolibc/printf: Add support for length modifiers tzqL and formats iX Date: Sun, 8 Mar 2026 11:37:34 +0000 Message-Id: <20260308113742.12649-10-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Length modifiers t (ptrdiff_t) and z (size_t) are aliases for l (long), q and L are 64bit the same as j (intmax). Format i is an alias for d and X similar to x but uppper case. Supporting them is mostly just adding the relavant bit to the bit pattern used for maching characters. Although %X is detected the output will be lower case. Change/add tests to use conversions i and X, and length modifiers L and ll. Use the correct minimum value for "%Li". Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. v4: Split from the previous patch. tools/include/nolibc/stdio.h | 27 ++++++++++++-------- tools/testing/selftests/nolibc/nolibc-test.c | 14 +++++++--- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 1c2b2cf9a1f3..09ea2e0c392f 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -291,10 +291,11 @@ int fseek(FILE *stream, long offset, int whence) } =20 =20 -/* printf(). Supports the following integer and string formats. - * - %[#-+ 0][width][{l,ll,j}]{c,d,u,x,p,s,m,%} +/* printf(). Supports most of the normal integer and string formats. + * - %[#-+ 0][width][{l,t,z,ll,L,j,q}]{c,d,i,u,x,X,p,s,m,%} * - %% generates a single % * - %m outputs strerror(errno). + * - %X outputs a..f the same as %x. * - The modifiers [#-+ 0] are currently ignored. * - No support for precision or variable widths. * - No support for floating point or wide characters. @@ -386,9 +387,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list =20 /* Length modifier. * They miss the conversion flags characters " #+-0" so can go into flag= s. - * Change ll to j (both always 64bits). + * Change both L and ll to j (all alwys 64bit). */ - ch_flag =3D _NOLIBC_PF_CHAR_IS_ONE_OF(ch, 'l', 'j'); + if (ch =3D=3D 'L') + ch =3D 'j'; + ch_flag =3D _NOLIBC_PF_CHAR_IS_ONE_OF(ch, 'l', 't', 'z', 'j', 'q'); if (ch_flag !=3D 0) { if (ch =3D=3D 'l' && fmt[0] =3D=3D 'l') { fmt++; @@ -403,20 +406,22 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list /* Numeric and pointer conversion specifiers. * * Use an explicit bound check (rather than _NOLIBC_PF_CHAR_IS_ONE_OF()) - * so ch_flag can be used later. + * so that 'X' can be allowed through. + * 'X' gets treated and 'x' because _NOLIBC_PF_FLAG() returns the same + * value for both. */ ch_flag =3D _NOLIBC_PF_FLAG(ch); - if ((ch >=3D 'a' && ch <=3D 'z') && - _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'u', 'x', 'p')) { + if (((ch >=3D 'a' && ch <=3D 'z') || ch =3D=3D 'X') && + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p')) { /* 'long' is needed for pointer conversions and ltz lengths. * A single test can be used provided 'p' (the same bit as '0') * is masked from flags. */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag | (flags & ~_NOLIBC_PF_FLAG('p')), - 'p', 'l')) { + 'p', 'l', 't', 'z')) { v =3D va_arg(args, unsigned long); signed_v =3D (long)v; - } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, 'j')) { + } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, 'j', 'q')) { v =3D va_arg(args, unsigned long long); signed_v =3D v; } else { @@ -434,7 +439,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list =20 out =3D outbuf; =20 - if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd')) { + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i')) { /* "%d" and "%i" - signed decimal numbers. */ if (signed_v < 0) { *out++ =3D '-'; @@ -444,7 +449,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list } =20 /* Convert the number to ascii in the required base. */ - if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'u')) { + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i', 'u')) { /* Base 10 */ u64toa_r(v, out); } else { diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 638f18fc5123..a140c54e4d72 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1826,11 +1826,19 @@ static int run_printf(int min, int max) CASE_TEST(number); EXPECT_VFPRINTF(1, "1234", "%d", 1234); break; CASE_TEST(negnumber); EXPECT_VFPRINTF(1, "-1234", "%d", -1234); break; CASE_TEST(unsigned); EXPECT_VFPRINTF(1, "12345", "%u", 12345); break; + CASE_TEST(signed_max); EXPECT_VFPRINTF(1, "2147483647", "%i", ~0u >> 1= ); break; + CASE_TEST(signed_min); EXPECT_VFPRINTF(1, "-2147483648", "%i", (~0u >>= 1) + 1); break; + CASE_TEST(unsigned_max); EXPECT_VFPRINTF(1, "4294967295", "%u", ~0u); br= eak; CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; - CASE_TEST(hex); EXPECT_VFPRINTF(1, "f", "%x", 0xf); break; + CASE_TEST(hex_nolibc); EXPECT_VFPRINTF(is_nolibc, "|f|d|", "|%x|%X|", = 0xf, 0xd); break; + CASE_TEST(hex_libc); EXPECT_VFPRINTF(!is_nolibc, "|f|D|", "|%x|%X|",= 0xf, 0xd); break; CASE_TEST(pointer); EXPECT_VFPRINTF(1, "0x1", "%p", (void *) 0x1); = break; - CASE_TEST(uintmax_t); EXPECT_VFPRINTF(1, "18446744073709551615", "%ju= ", 0xffffffffffffffffULL); break; - CASE_TEST(intmax_t); EXPECT_VFPRINTF(1, "-9223372036854775807", "%jd= ", 0x8000000000000001LL); break; + CASE_TEST(percent); EXPECT_VFPRINTF(1, "a%d42%69%", "a%%d%d%%%d%%",= 42, 69); break; + CASE_TEST(perc_qual); EXPECT_VFPRINTF(1, "a%d2", "a%-14l%d%d", 2); br= eak; + CASE_TEST(invalid); EXPECT_VFPRINTF(1, "a%12yx3%y42%P", "a%12yx%d%y= %d%P", 3, 42); break; + CASE_TEST(intmax_max); EXPECT_VFPRINTF(1, "9223372036854775807", "%lld= ", ~0ULL >> 1); break; + CASE_TEST(intmax_min); EXPECT_VFPRINTF(1, "-9223372036854775808", "%Li= ", (~0ULL >> 1) + 1); break; + CASE_TEST(uintmax_max); EXPECT_VFPRINTF(1, "18446744073709551615", "%ju= ", ~0ULL); break; CASE_TEST(truncation); EXPECT_VFPRINTF(1, "0123456789012345678901234",= "%s", "0123456789012345678901234"); break; CASE_TEST(string_width); EXPECT_VFPRINTF(1, " 1", "%10s", "1"); = break; CASE_TEST(number_width); EXPECT_VFPRINTF(1, " 1", "%10d", 1); br= eak; --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.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 F08FF371046 for ; Sun, 8 Mar 2026 11:37:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969879; cv=none; b=h77GfLpIMUSIPraTXbnR/VB3MEj4GK1CE+S2JXsR5XQK+gGjkzVP0ng8gB6vIrosEp9TknuU/8+aTJQEqx7vjpCuqMrsSqac1xK4xQysKlpgPHDzi79mel3Hf6AuUIzgYarvM89xbjkSrDjlN6hXpEcxvTi55clLs1pGXocEW80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969879; c=relaxed/simple; bh=/utv3YkMMEdn4ERcUD93/hL0dKTeQRq2cCB4DOb6YiY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=upKxsp6vu45hBh4j+zWDgwtuv7Zr8N9eL8Ufc37oMhOYR1ym1RgLkhxjFCsmoZiK7MlMtDV9OkR/exBcQb1kiWW5S+KarAwYEyrj0jAHJUzCIfKZYODwqjAH/3i7saJcksc3IcG+t5dx+b+UQzlDau7yD7Uf3BGKAcwwPCr/d1A= 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=hzt5dxY6; arc=none smtp.client-ip=209.85.221.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="hzt5dxY6" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-439b94a19fdso6599531f8f.0 for ; Sun, 08 Mar 2026 04:37:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969876; x=1773574676; 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=6OCV8pAy1RSi3pKBg5RAu3JfiIqk7cJW6y9lOdmAdOI=; b=hzt5dxY6hCc1Wtcv/DpXScXc/oTvSgdenQHOCUe3Sjh2JNwneS1rWbbtdi61Xc6p4V c17R5LO0czMGUrsz2I3Flzy4vqRoXOtOhjG6TOKOXgcc1karXJN906ErpR8xl+LBjLai EDfqUChdQj1MxXu3TGWv4Z7on4u074+bEH+FV3CbwIO3pPWNLsmnOgSqxFHeezHysPIv Yc2hTUP0+1wItWHVlyyCPiU9CyjQGQ/Q5Z21B7PPquWBnv7MOaOQBHZbPJ08LnI0rMcr Haq7KqC51LrnnCGws+SN9OxCSsi09o+Q1UwgOVttLlgp2ogb1d9GXh7ypuiXNqyNhf0I fTxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969876; x=1773574676; 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=6OCV8pAy1RSi3pKBg5RAu3JfiIqk7cJW6y9lOdmAdOI=; b=hvOxxhH12V3j2on931Qkyq62XUM0ew4ocnQQPNBvhJJD+0wlmoJDAJiE4fKuag9ZaB u7fL/CGzUoyBV0/BZhkmKRYElP7ffCdUI+kMNlzJNUxkK0VyMLWhJ4t6e5PZHdUfFcnc lSqpDWVPi2Fsvp4cB6u6Lg3xN3twNqVwUzt/UKBTGwOCkwCSuvoxU2nbiztpAr3z+6en PlMhOcGL0eVwyOdf00+aByvd+DrCXSFjnj5By1nZuP4z4uz6tbL2JbN6aXh/BMh28MOq kHtlbOAjFETBwPqeC3Sy8Khmlifl2huude7ax/AFLjc+ccKkpXZYGp5PUW5bm1kbHAE3 Dx9A== X-Forwarded-Encrypted: i=1; AJvYcCVIRMgSM4cAWtpuBZxOcd3F+j0qGti9o5vGxJIZs92QcDhvBGy/I1X94EvvBs0rIHocVVD/J8dshtui6hU=@vger.kernel.org X-Gm-Message-State: AOJu0YyVRTkfN5WPtu7CJNB8WtkcWF0GOXs09b/KqwYJl1/174leIV5B PsRRrFpXiG8N0ZiONtkOZJ+MuwnNbxx/M6QoU93Mg8rlftkSdKOGSt1m X-Gm-Gg: ATEYQzwkILu0bB0qtkDDaZz09IO6bkamEwn4wPG3sP9yb77x+KL3/CwXysP2mYER15C 2caNdhVyJq813YOZc0dM1zU61FdSegeDsaccKkaUZx+zhdrt7OB3j6imeWHk87pwA7ClNa/zwyy s2cOSc8KmXk82aRoFEagZWb4zbf6eXlr04mmC4fYLwnEfUSauKfi/enkvPklsMj4vS7pRvqIleU Xmpmr7PPa+D01c8DfpjprfBO5WC7xy1/8j8VnEK0zbFP87gzWEdA72FCqhtjkUfil8tYyw3Ztu7 NTuDoQ1hGz6OV04NJXbb9/0avxcsIlQbCPvdBlXPgwh0+V1Zy2H2zD7Ztbeq8KNo0qQBi9ahD7W hDCRz32sDuehARUm7osGq7sxgJ5Fpn4Fy8qcYdpEk2xrifM4D7Flb3cnRgwZ8Tl6lANIdZoEChk HXnlRol5bAe2+otNgHroFUv+4vWOmmMA46LSE1mlxl9pPIVeRLXJEsFTKI3nY3DM9RTK3Mjv0oi fX3fXZISs5I X-Received: by 2002:a05:600c:820c:b0:485:383b:d5bb with SMTP id 5b1f17b1804b1-485383bd752mr23459605e9.27.1772969876180; 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.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:55 -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 10/17] tools/nolibc/printf: Handle "%s" with the numeric formats Date: Sun, 8 Mar 2026 11:37:35 +0000 Message-Id: <20260308113742.12649-11-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Avoids the extra va_arg() call with is non-trivial on a lot of modern ABI. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanched for v4 and v5. Changes for v3: - Moved to its own patch (part of patch 7 in v2).. - Fix 32bit compile. tools/include/nolibc/stdio.h | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 09ea2e0c392f..40ceb7a0b25a 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -412,13 +412,13 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list */ ch_flag =3D _NOLIBC_PF_FLAG(ch); if (((ch >=3D 'a' && ch <=3D 'z') || ch =3D=3D 'X') && - _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p')) { - /* 'long' is needed for pointer conversions and ltz lengths. + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p', 's')= ) { + /* 'long' is needed for pointer/string conversions and ltz lengths. * A single test can be used provided 'p' (the same bit as '0') * is masked from flags. */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag | (flags & ~_NOLIBC_PF_FLAG('p')), - 'p', 'l', 't', 'z')) { + 'p', 's', 'l', 't', 'z')) { v =3D va_arg(args, unsigned long); signed_v =3D (long)v; } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, 'j', 'q')) { @@ -437,6 +437,15 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list goto do_output; } =20 + if (ch =3D=3D 's') { + /* "%s" - character string. */ + outstr =3D (const char *)(uintptr_t)v; + if (!outstr) { + outstr =3D "(null)"; + } + goto do_strlen_output; + } + out =3D outbuf; =20 if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i')) { @@ -465,13 +474,6 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list goto do_strlen_output; } =20 - 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"; --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 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: quoted-printable Content-Type: text/plain; charset="utf-8" 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; =20 written =3D 0; while (1) { @@ -446,32 +447,49 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list goto do_strlen_output; } =20 - out =3D outbuf; + /* The 'sign_prefix' can be zero, one or two ("0x") characters. + * Prepended least significant byte first stopping on a zero byte. + */ + sign_prefix =3D 0; =20 if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i')) { /* "%d" and "%i" - signed decimal numbers. */ if (signed_v < 0) { - *out++ =3D '-'; + sign_prefix =3D '-'; v =3D -(signed_v + 1); v++; } } =20 + /* 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 =3D 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 =3D u64toa_r(v, out); } else { /* Base 16 */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p')) { - *(out++) =3D '0'; - *(out++) =3D 'x'; + /* "%p" needs "0x" prepending. */ + sign_prefix =3D '0' << 8 | 'x'; } - u64toh_r(v, out); + len =3D u64toh_r(v, out); } =20 - outstr =3D outbuf; - goto do_strlen_output; + /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ + for (; sign_prefix; sign_prefix >>=3D 8) { + /* Force gcc to increment len inside the loop. */ + _NOLIBC_OPTIMIZER_HIDE_VAR(len); + len++; + *--out =3D sign_prefix; + } + outstr =3D out; + goto do_output; } =20 if (ch =3D=3D 'm') { --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (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 E6656371CEC for ; Sun, 8 Mar 2026 11:37:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969880; cv=none; b=hRwvLNk07xxl9RlAaEQay/jp6PVKVcNZvR5pyFVF72q+rdO1Ax3tKglIWkhVyBu1Ag09Z3W160strr+3to4Z/yIk50zFAIJDxVrnd/pW3m6KYSoB1I/bI+2bjYwsKKHyvnQu71t4G+s59BNOV+TqRltOyyUV6gjMielTAvDCE2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969880; c=relaxed/simple; bh=Z2y1RmQSFq2dJoCCC1pCOBe6AyVzaMRv+MoaVQF20WQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WuqGNVMD4pgFkTVkaS4pfn+of0evU8lU/r84PBmRqAX7oCnVPbNzFzMDbZLpdxmy/+fZvTHq421KmT1YrvAPIlIM+ogwoRrKiTqLU915m5wq6MZMBq3Zz/H3xQZ0JkYXolGLDqz7G7uW1Ug0BDLri9/bNm1W/W1D/Ui8YjOPstU= 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=JLCSbTMX; arc=none smtp.client-ip=209.85.128.41 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="JLCSbTMX" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-485345e1013so3520055e9.1 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=PAxHnOgaD0CySHoQmZgpFpX61kgpnhxbeXQ2r0r5r5A=; b=JLCSbTMXomm4MrH0iCOUSPKI1cn0rwiZsOuWJEczj/wFKDxKMcM7KTf7S3qRCBUGlu REuokw5Z8cqD5CCjJbBwrb6wt/qNN+O8v93cWolT1MUaywGhOiXwQRvGvr3CyFBw2W5w A/SYw0ehduJRFFeL7Ur2K063PsRs8ffI3N2Pj9WiqVD5nL8pL/h0YwIehPAfSkU1xnjx 23ThIi7rLX5yiiAVMW4oK8FQppTjDH2XqpWHz9LrS/mV4AnkBC1cbosMhMQVcAvW6Qyw NPfLZs98uef6/iHkZTlZABEY3QOxaQwp9PXqGI5G/Y0IWk4YPG+yiMqkU5VbBifJKLff /kgw== 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=PAxHnOgaD0CySHoQmZgpFpX61kgpnhxbeXQ2r0r5r5A=; b=neGoDiaFJTxYytBjz6hZlfLQppwU/OKwCMzPTdNW58yKQKEXV4q9gWE/vXhT2wDOdu 2DOHtfHF+rIHSoqk9V2yPPN8EcwiqkF76aV2SlvBZlE3TlpDNQTTn24Vc1MA8lJow9WT yLN8jNbJfOkTRf4oRz45c1PbWz62ktUiNFFqZ0CPWIzcCnh7u0aXrin980r+FugjG1it 4NBLpEjCrBnLqY64hfxtpA3vXzA7FVD4qy1zIafo6Iy1t/8uLc9CzDdclfdVmKfq3/Bu K+kjiG3yZnimTIuK/tBwVXgZYxpVV70WKngLw5uqehPK9/2vcG31fX1FyojmhL6guXOX TkRw== X-Forwarded-Encrypted: i=1; AJvYcCV3cC3oquR6URN89ntoVKYWuib6zYItFANex/XMjAFOTlN1OtqNm8+q/rgdzmG1qIRc9Norn4InWHGlBvE=@vger.kernel.org X-Gm-Message-State: AOJu0Ywsiw1/dH2FNxJ9UCTnbuW5nVtd7v/x449HTs/mmgm/sYX/wAFU dsPAo1vCOqDK48On9C/zqJBKDqug0ZdHYtsNXrGnaEy/PBBADc6mJBIR X-Gm-Gg: ATEYQzws1kdFgpjTC2tLeyCBTqX5uijPppWi6CfEbNhPVLzV0v7AlP5UIChKWPTWUP2 Kp7ZQEVFrZrhGj8SCxqlLCncdpnNMaJbXJ9djb1OZm3HUpI+RjA8XjSk699+YviEx4S930kH355 rYOeRL98lYA22lLAqQj4lQmj2DTs56I23pnOoAW9m2n7sLsn0y3ox2p42pPxbUZu6ZdBJHEWld4 FJDvfB3n/E18nfEXTL/9jgsmPFculzW3mbX8ZQfMJLmNwayY4ot7j6lr2ZB/BD+Jdc68ZdeTlAV aWhyL6v7YGMyVhLdHmRuWxE9jXHKHY+3R7MOORBJwZxGMIsVgaGxfJIhTYmAK0XFKL6l/kYL5Nl S8o+jtI9UL3iSQwLqnNoaJ7npUnQFtUq4FNGPN/ecZkMNXhAhYA9FA3U3BpHTPVwcLtHgBAew6C Ijm7xG8ParQWzd1EiT8kjeaQg7MoBhYzYPmsuXQyTD/Ws278fV84LGbQgjw+KiOGqJ4C0DNwDOh ZwQhvKORzbY X-Received: by 2002:a05:600c:4e43:b0:475:ddad:c3a9 with SMTP id 5b1f17b1804b1-48526759b11mr142326245e9.13.1772969877254; Sun, 08 Mar 2026 04:37:57 -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:57 -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 12/17] tools/nolibc/printf: Add support for conversion flags space and plus Date: Sun, 8 Mar 2026 11:37:37 +0000 Message-Id: <20260308113742.12649-13-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Flags ' ' and '+' are sign characters for positive numbers. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. v4: Split from the previous patch and support for the # flag. tools/include/nolibc/stdio.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 93fc24238661..8b003a9bd268 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -296,7 +296,7 @@ int fseek(FILE *stream, long offset, int whence) * - %% generates a single % * - %m outputs strerror(errno). * - %X outputs a..f the same as %x. - * - The modifiers [#-+ 0] are currently ignored. + * - The modifiers [#-0] are currently ignored. * - No support for precision or variable widths. * - No support for floating point or wide characters. * - Invalid formats are copied to the output buffer. @@ -458,6 +458,10 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list sign_prefix =3D '-'; v =3D -(signed_v + 1); v++; + } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, '+')) { + sign_prefix =3D '+'; + } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, ' ')) { + sign_prefix =3D ' '; } } =20 --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 81C91372691 for ; Sun, 8 Mar 2026 11:37:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969881; cv=none; b=biHfKtbTbmyVR++HcXwFk285jKXzQK2CN4UZLpjPapK1/tVBZUV09FiBWER9XdQD1Wut6vebVY+VE+4B+XAU7kcT5Qd3k4MonKuWcCPkbsvxd9vVGGbCaMAMMlWpkFJgaW3dq9qgyLyiWn34wzu1IY3J7qYx83HDRGAdTr0K4Ck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969881; c=relaxed/simple; bh=qsEWONNMvZqKT1OWGy+42jBCKjkqW+g3qyrUYgUN/XU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F2kWtOKeg33tJas4i/61Ztu4ew3b1XwTjg9NliT/N+WQrc4i6OUy5ueY+KgtXt9xYhTe7VgPhmGnfwt7hvHx5HV0AcZWnioBzKA92B0WOZ6R+YNyOyS64tHALFsMNl47gkrgVi/bL/wlJhDBdhxUyIbWi+7LjfwOlhuMT5LEB1Q= 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=FaoGafKR; arc=none smtp.client-ip=209.85.128.43 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="FaoGafKR" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4852e9ca034so9324855e9.2 for ; Sun, 08 Mar 2026 04:37:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969878; x=1773574678; 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=1zVJsivfApwL/Jqd/aaXYkOzxin8n7iYCbtQ+ZZBqRE=; b=FaoGafKRcjTFiGKrQbAlDnUx9iGY36Sp10/cW114qkMd7lJe5DgfeVskaaKljJw4aP 0e1k2gwa9hhUVloj9Mjikd5IPpNvoVzmXtCTTusD7Lw7N8BLP36QKDkyBQhNsBBQpdSP mp5xPXZKJNf1ddxbMtKtfTS2dWYur2YUpFeSQZMgybkq3Ztt6BUJVRPUI/pcyBMLjzr2 3hlXE4Kavb3LoUywOY+S6vzEekl2uBCw5qhB2vZRiWyxI1YS6b+INo3GAtXjL4TMR0kz iaUJ9Ln2NSxik0EgjH3stu4YAtC0zjc1/KbkpGXiokpC6hmjgbO1rnklIC+mQ10AtyAF yJuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969878; x=1773574678; 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=1zVJsivfApwL/Jqd/aaXYkOzxin8n7iYCbtQ+ZZBqRE=; b=Fr8xmynxquvKE+NFKI+RTRhzuiM/W3p3FN97tW3zuZKjb/pDwqxs4G43clP2q7Vn3P vOKNHKMCc3uO0wqsS7Tgotbl2Qf/gNFfs9uAhdcErpyGRYrx12TCWuGe4Txq3+GHEMg9 tzVWuqKGSQHfXg1SEOoq3EUDT9qt0KiRPNMx/z7uaM+3uVc5v5tbINS1X2327ixb+d7+ 3P16WRJZE8m+ybB5QHbzNa58h9SCPwgZFdVQKRICG6bjrehFcPev8ia2BHhoy0to/PPy csuPaCe9E/wrPPx66Jl54ig8Ih0PgaDGetaUFq+8HwBBE014TJQpiJxELqN5FLKUjavY Cv9A== X-Forwarded-Encrypted: i=1; AJvYcCXJqSzymTn/skjTnmqSI94p+v1+yj83hc52T0XazS6RXAZoiR8PONHhkkCFNyucGTjEKJiwCOnQiV+9sHI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxch9rsMYH4Om69BJmmKHBvBev/7+u4/wWHLXP40k/AztgnIuQR TqzIsi9N3IpsnRFRNxDkoBzqRf+A9t4NEjmmcPlbVfoF6gVtOm1bE9ylHMndFu89 X-Gm-Gg: ATEYQzwbF6e9gK3LeivHjvSYJ30wAA/3SEaVQknrbSqCckH3IrjXCIFaoie0LthuttX MlUcWl4LYkfdaT5FCkIOP0mESnxXr1NESV4FV+adsitzDRnL8XOFel9wncu/j895RihT68RzbI1 maV/CvFH7POqRoq4frKPU7BQUztf7tNCGhJfNhtc4a+MeY4jrBCgTYRViqq0fjK+ndAtP5nC/H/ hZEItOQ+5kkMqyGIcOZLDFm0gyMvWiBHDQBSwQuDWJXgdnzHz8q8C/NmH3U37nYOeuUkhPyl0iH lDgo0TEWZdujgokU88GyG75ZETutdCT9LUUmPl4qMw9W1dzVYlfBTEBNNOydbsQ9mBDbz+1zzQ5 Qwnj7QARjrawpjYi5cbLytWL/gIy/m1Ett3Ovf+998uNruA6ROJODyKnlfKM+eEQ0FhwEch5XO4 WUfSqzBXPi7vp2wTE90XAPzA5qEs5LFdusLpbsLkCwls5F73fVRXLae5L3Fv6s0rpuGVHuF8JWo LIzLaysctMD X-Received: by 2002:a05:600d:644e:10b0:485:2af3:3f82 with SMTP id 5b1f17b1804b1-4852af3405fmr74865435e9.7.1772969877861; Sun, 08 Mar 2026 04:37:57 -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.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:57 -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 13/17] tools/nolibc/printf: Special case 0 and add support for %#x Date: Sun, 8 Mar 2026 11:37:38 +0000 Message-Id: <20260308113742.12649-14-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight The output for %#x is almost the same as that for %p, both output in hexadecimal with a leading "0x". However for zero %#x should just output "0" (the same as decimal and ocal). For %p match glibc and output "(nil)" rather than "0x0" or "0". Add tests for "%#x", "% d", "%+d" and passing NULL to "%p". Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. v4: Split into its' own patch. tools/include/nolibc/stdio.h | 38 ++++++++++++++------ tools/testing/selftests/nolibc/nolibc-test.c | 3 ++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 8b003a9bd268..4bb4d08d834e 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -296,7 +296,7 @@ int fseek(FILE *stream, long offset, int whence) * - %% generates a single % * - %m outputs strerror(errno). * - %X outputs a..f the same as %x. - * - The modifiers [#-0] are currently ignored. + * - The modifiers [-0] are currently ignored. * - No support for precision or variable widths. * - No support for floating point or wide characters. * - Invalid formats are copied to the output buffer. @@ -410,8 +410,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list * so that 'X' can be allowed through. * 'X' gets treated and 'x' because _NOLIBC_PF_FLAG() returns the same * value for both. + * + * We need to check for "%p" or "%#x" later, merging here gives better c= ode. + * But '#' collides with 'c' so shift right. */ - ch_flag =3D _NOLIBC_PF_FLAG(ch); + ch_flag =3D _NOLIBC_PF_FLAG(ch) | (flags & _NOLIBC_PF_FLAG('#')) >> 1; if (((ch >=3D 'a' && ch <=3D 'z') || ch =3D=3D 'X') && _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p', 's')= ) { /* 'long' is needed for pointer/string conversions and ltz lengths. @@ -472,17 +475,30 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list */ out =3D outbuf + 2; =20 - /* Convert the number to ascii in the required base. */ - if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i', 'u')) { - /* Base 10 */ - len =3D u64toa_r(v, out); - } else { - /* Base 16 */ + if (v =3D=3D 0) { + /* There are special rules for zero. */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p')) { - /* "%p" needs "0x" prepending. */ - sign_prefix =3D '0' << 8 | 'x'; + /* "%p" match glibc, precision is ignored */ + outstr =3D "(nil)"; + len =3D 5; + goto do_output; + } + /* All other formats (including "%#x") just output "0". */ + out[0] =3D '0'; + len =3D 1; + } else { + /* Convert the number to ascii in the required base. */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i', 'u')) { + /* Base 10 */ + len =3D u64toa_r(v, out); + } else { + /* Base 16 */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p', '#' - 1)) { + /* "%p" and "%#x" need "0x" prepending. */ + sign_prefix =3D '0' << 8 | 'x'; + } + len =3D u64toh_r(v, out); } - len =3D u64toh_r(v, out); } =20 /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index a140c54e4d72..4267c69ec37c 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1825,6 +1825,7 @@ static int run_printf(int min, int max) CASE_TEST(string); EXPECT_VFPRINTF(1, "foo", "%s", "foo"); break; CASE_TEST(number); EXPECT_VFPRINTF(1, "1234", "%d", 1234); break; CASE_TEST(negnumber); EXPECT_VFPRINTF(1, "-1234", "%d", -1234); break; + CASE_TEST(num_sign); EXPECT_VFPRINTF(1, "| 1|+2|+3|+4|5|", "|% d|%+d= |% +d|%+ d|%#d|", 1, 2, 3, 4, 5); break; CASE_TEST(unsigned); EXPECT_VFPRINTF(1, "12345", "%u", 12345); break; CASE_TEST(signed_max); EXPECT_VFPRINTF(1, "2147483647", "%i", ~0u >> 1= ); break; CASE_TEST(signed_min); EXPECT_VFPRINTF(1, "-2147483648", "%i", (~0u >>= 1) + 1); break; @@ -1832,7 +1833,9 @@ static int run_printf(int min, int max) CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; CASE_TEST(hex_nolibc); EXPECT_VFPRINTF(is_nolibc, "|f|d|", "|%x|%X|", = 0xf, 0xd); break; CASE_TEST(hex_libc); EXPECT_VFPRINTF(!is_nolibc, "|f|D|", "|%x|%X|",= 0xf, 0xd); break; + CASE_TEST(hex_alt); EXPECT_VFPRINTF(1, "|0x1| 0x2| 0|", "|%#x|%= #5x|%#5x|", 1, 2, 0); break; CASE_TEST(pointer); EXPECT_VFPRINTF(1, "0x1", "%p", (void *) 0x1); = break; + CASE_TEST(pointer_NULL); EXPECT_VFPRINTF(1, "(nil)", "%p", (void *)0); b= reak; CASE_TEST(percent); EXPECT_VFPRINTF(1, "a%d42%69%", "a%%d%d%%%d%%",= 42, 69); break; CASE_TEST(perc_qual); EXPECT_VFPRINTF(1, "a%d2", "a%-14l%d%d", 2); br= eak; CASE_TEST(invalid); EXPECT_VFPRINTF(1, "a%12yx3%y42%P", "a%12yx%d%y= %d%P", 3, 42); break; --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 2171C372B55 for ; Sun, 8 Mar 2026 11:38:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969881; cv=none; b=R8vI0TKa/G2GTDQoDKn0hyY/uGywU4/bxDFN/WBMLJzsxN1FWte5EppIlJNpPcBgcVKsro4xwm+GlLehW6tW4PVAt2fjzA7Z9Zis+UoaJSvv+TR28C4VC44rkFvUThlcEbzbKchoIm6flIYeZ7MhW3xVne4KgCWaCM48SEUV7Cg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969881; c=relaxed/simple; bh=k30EcAPsqOQ7YyGnLrLWTEpHtNLKbAjEHMJ5VI9D6hI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZNHKBVPVrfPak6UADo+Lu1nZQ30aTLeV2odGHUZILgFbs//gixSoLRSdCcGcp+rCbclJV/QWZJIHlIULqpf16WO1Svs6Wpx+iQTXrFrd2cM1VQhqJ2Tv8rZVr9E7yJEc4/LRwiQZAniFOu9eCO0KYZGQjFUQid3OC2SSzqFPgxQ= 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=FxyNGdEp; arc=none smtp.client-ip=209.85.128.46 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="FxyNGdEp" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48374014a77so127684665e9.3 for ; Sun, 08 Mar 2026 04:37:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969878; x=1773574678; 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=EeouF7RE8WbLplU0H/YiLqlmPfzJu6B4+hEQMjYnszc=; b=FxyNGdEpT3ZXpqewooPw3eOqRaNDVbtNloylnaKb25dig8YjC9Bpq43ejiwgBF9rSR dCCqZr7jMlVgbqgzVnDGnQ61o6VQw9KFYG32HC2MYJwIUR57UeKkW/m8LASC1I/vzQFg Tvtb0v6/ZpZvcVucPkzKksLjTrVKCxWcLJL/t2Tikl7HJo8BpPEnJU2O7gZ8JVtjFGjb surdeFAjbCVBoCnbDuMu5eO1sEWE/uGG8mvsTtp5NHNevFDtb4nFORFTk+H7+66+XAMB 6LgcVdaoPvTyMDqlkDZQFudcWJjPfIj9S28hT6zKdedb4e/Ua3eR5gcxDXYVwsncbBiv Kbzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969878; x=1773574678; 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=EeouF7RE8WbLplU0H/YiLqlmPfzJu6B4+hEQMjYnszc=; b=Di+8FKWK2JTeOswsiHquO0HA3o7zAyw9xK7xT0V4v1jc38Qp+1OzxkLVtLZElq0Qpc uAA88I7013eyYyPr9y5O07bhseY1IaKJyvCgSmQkdP5bvDnTnf3VZBrfl9YyAcyDIlty e3SSdiZSkt0q7Uw0nJwBlGVjUv3mAgFObnIHXzVJATzIVelDuxRd1WnDmAA6zmR2+yDP nZfieGK3gk9KT127P0xdGNwtzGBqVrbN1jDKF+GRKGU8aLubByyo2Yc2DO+CjOyhov11 qtpxiKEvKXqtoUW6sT0l+J0VNtDajzlKEvj6wEYqV6mgsCagor2Na/ZAGYeIcN5Xmpuo aJ0A== X-Forwarded-Encrypted: i=1; AJvYcCWC/b2m0al5fNZYBap/qFG9gQ7/MDWuocQR/+t+XJSYjBTl4G2nsxiv5BKnS8CFPKuFwdWAAJhz20YZ9fk=@vger.kernel.org X-Gm-Message-State: AOJu0YwYbbGKE48NqMW6/UYT7RZRoEBmvag6Kk2d3REG+7psrB3ZP3xi lsjdpFAHBtQD7/GruS84Exbu0WO512NJ2ikbfFlla+v333dWk64WK2lH X-Gm-Gg: ATEYQzzxUfawC0WnI5X6hdKiCnDTul7F7M2pXI1vXaYYdIh7mLO9zn9ulgHA3Gv51VT 8XiQZFBmysWlGNR8X0OTApUsEigOd5ozEHuLdLneIQCl9PCv7b48d0aXuAJpZ7ngBg4WBoXW+Bf YOzH11EfsZ8H3PTK/SsjVT/JxWO39m6PQRjWcF8iDa+MOTkC7PEVxHDOo6tMGfepcyrmXXXCxTV aDvQJBENvtXZrIf3wSSnEuzD3IFCQaxLZg6IbeoeZkLolosFJQOVouYv0lEpJzoc4l12/w17vcx dG6L6iUfqKjMQANKhFFRV/kBDsBD2ISPF7lM/nIKDEa2vEAfMD96ikurq7AelVfpQtKZqs/+RIu nfJYaYFfeJWIMlVoJiY53mFBx91HmlNj/28Vz6HSRCrLENyssjAicpia9MzCHuBwudoqbznsiv7 ufQryT9LV6s4HfIlEp+DAw9mjIf1cVAFwkTtnSNPw8NjxuaqomkHLdaIwbMgAwDMYvh6VmZWodV Y/cycy9dxV5 X-Received: by 2002:a05:600c:a117:b0:483:7eea:b185 with SMTP id 5b1f17b1804b1-4852695aedemr101938895e9.16.1772969878449; Sun, 08 Mar 2026 04:37:58 -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.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:58 -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 14/17] tools/nolibc/printf: Add support for left aligning fields Date: Sun, 8 Mar 2026 11:37:39 +0000 Message-Id: <20260308113742.12649-15-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Output the characters before or after the pad - writing the pad takes more = code. Include additional/changed tests Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v4 and v5. Changes for v3: - Formally part of patch 7. tools/include/nolibc/stdio.h | 6 +++++- tools/testing/selftests/nolibc/nolibc-test.c | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 4bb4d08d834e..fccc8a2d9b8a 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -546,7 +546,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list /* Stop gcc back-merging this code into one of the conditionals above. */ _NOLIBC_OPTIMIZER_HIDE_VAR(len); =20 + /* Output the characters on the required side of any padding. */ width -=3D len; + flags =3D _NOLIBC_PF_FLAGS_CONTAIN(flags, '-'); + if (flags && cb(state, outstr, len) !=3D 0) + return -1; while (width > 0) { /* Output pad in 16 byte blocks with the small block first. */ int pad_len =3D ((width - 1) & 15) + 1; @@ -555,7 +559,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list if (cb(state, " ", pad_len) !=3D 0) return -1; } - if (cb(state, outstr, len) !=3D 0) + if (!flags && cb(state, outstr, len) !=3D 0) return -1; } =20 diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 4267c69ec37c..89ded1dd7318 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1845,9 +1845,11 @@ static int run_printf(int min, int max) CASE_TEST(truncation); EXPECT_VFPRINTF(1, "0123456789012345678901234",= "%s", "0123456789012345678901234"); break; CASE_TEST(string_width); EXPECT_VFPRINTF(1, " 1", "%10s", "1"); = break; CASE_TEST(number_width); EXPECT_VFPRINTF(1, " 1", "%10d", 1); br= eak; + CASE_TEST(number_left); EXPECT_VFPRINTF(1, "|-5 |", "|%-8d|", -5);= break; + CASE_TEST(string_align); EXPECT_VFPRINTF(1, "|foo |", "|%-8s|", "foo= "); break; CASE_TEST(width_trunc); EXPECT_VFPRINTF(1, " 1",= "%25d", 1); break; CASE_TEST(errno); errno =3D 22; EXPECT_VFPRINTF(is_nolibc, "errno= =3D22", "%m"); break; - CASE_TEST(errno-neg); errno =3D -22; EXPECT_VFPRINTF(is_nolibc, " e= rrno=3D-22", "%12m"); break; + CASE_TEST(errno-neg); errno =3D -22; EXPECT_VFPRINTF(is_nolibc, "errn= o=3D-22 ", "%-12m"); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; CASE_TEST(printf_error); EXPECT_ZR(1, test_printf_error()); break; case __LINE__: --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (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 AA4AE374180 for ; Sun, 8 Mar 2026 11:38:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969882; cv=none; b=MFW8AOljQHLP6OKfecrDoYAg0O6zAcGESliXYVwZtJvPFzMVd5z5Bh5HPu1ZfWRWDzS2Py/ExyzM6hYQH0sFIEmMqZ5s6vtm/lVUU+yP7bJ6MlkydNBJCSnb6kp2jsKhOKiJRDV2N8BsPdvdvDH0P5SvJK9LNYuIkbmU38rviMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969882; c=relaxed/simple; bh=t2ve8PKaytGeQ2t/TCPMTgcz/SwW84qmRjX+uJuXG+0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Cv/LEMpA5icpwGuYloGLf77Eso/q7xhOte5cpbYpBRRqkldRxnNc99zac08jJZuJJ9K1XRlUukk/FnbuUrhNGETGfnfkKtkMjiFrfgK9Lw3Md6GYdULtxDDOr6vZBHAIU7j1Um4NouDbsXr0Pi9f77nhLpok3SNRBt/cdDz0jY4= 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=h5+nlT5i; arc=none smtp.client-ip=209.85.128.41 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="h5+nlT5i" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4806f3fc50bso116638775e9.0 for ; Sun, 08 Mar 2026 04:38:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969879; x=1773574679; 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=RMKr+si20BbKDBd5m1MsUVaLFCe2Mb71pelEywASkwE=; b=h5+nlT5idIcI0SYFyelLWBBwl0BpJdKUbjA/IcDJpSL1HmetXn1GJwwTP9IVQDzPX8 7ZwFUqwIkIUgnm5lrlxGCXd5qN1rX+FiZ5061xCnkp1YqvbPQ5RulB5USgMEvycO5bQF FjzSEzTH+l0TRZWjinnQgvHx5Uc8VYfNHmiknfJgE4drN3I/yMmQgdBmhsRNNghVQL/Z GKJkbn8sp0K7H7eCAzvB2eMafDPVc5cmWdPuXWe+OXc0tD8AVL93t2GHl3vi36MEh3vH c4fT79LaW9WgJpl8i2vo/AqqREATLhDagUF5vSdqoBr1N1CD1x+gLnweZi2YeDBJ68Tu UKQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969879; x=1773574679; 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=RMKr+si20BbKDBd5m1MsUVaLFCe2Mb71pelEywASkwE=; b=xS58msB5dexmFi5drQfbASIh6y2sqEBmrs3F9Jk81glds73CseAnuR2uUV3RZ2+ytQ EIgLP1+hx+78MMlgFil43Td4r9+WIFfVvhJSLeQ2TbOrhA94ShejePebhhGx6jE42Mkp rIx0qe+YMKvZYsB3sseBRdF4iZaVlHIX22AE3PjaFX4oG5pFUhDAq//LOrpEKzuqWUAb kjREO/YEBfltMf0c0mikpOSk8dmNCK22MkCv5oVUt5moR6gxYHNTc9ZnHb5TVB7nBKn8 Rglue34hVJCof1GHsYovgs5enCs7iGw6oNqzINPLyB++HFU0GuVbe+8UINNf1foCzCaJ Jo+Q== X-Forwarded-Encrypted: i=1; AJvYcCWw8gChRkWToRzqrsCySV7zZh+z/EaeWK+hmuKlz9Pjmcdq3LE8zIqRs9gT50h1dqeJnOqPg9FNo1TpJa8=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+XQHiddXN29NMWnFzKEI+fF7bXuxQJtDVll9VvPEKEKEYASDH ksbBSjL71qlQfv863EoOY2Tordceeg/rCfnhhiQQyCS/nVayi8gSwT9q X-Gm-Gg: ATEYQzyu2tMNStEcqmTzDhX2GAKyMYYAKP9Y8bazygVpQwlygKWw1//BL3k1B+5/sre X2focMvUW+gO55Q2KW5MY9/ysFw6as1t+rLnFDHpPcIyJGcv/akciqD83TAwk2syzVuKNZaKd+x IZOg8yKvbSAWkvGURHdrdQ/v39sh2OjLAokifNG6a+TigpGjVrY8+KNzz99awtIOzXdqcQ2dqSJ 7+iwNmQyAZDMgi6DG8ZyoWywX9Bx2kFOfE3zpNTGDfiTdNWmYCkw7s0NlntVhoY845g9GuMayAP E1k50qcPRXWi2z/6jgWg/hoLMmd41KHNgxvNGBjjIBRUC4aRkFUZzQRR9jv4J64mk6UKt/377Du qj1dG0KM1H3QLGDbtodXjEYv7HKRQQdhfIbOpQGc/IhlntfzGY6YHjW+T/bQCLkRUBkgQFZi3Y3 riR92U0OTerOa1ELMw0hAxSyB/vrg3ghvb9nvespekH7I/EA5uE25IIphSSCVWkBg4SpZxuHAPU F4Juu4ZhmppXUWnG0qe+kA= X-Received: by 2002:a05:600c:500d:b0:47e:e48b:506d with SMTP id 5b1f17b1804b1-4852695b9f7mr133237045e9.16.1772969878901; Sun, 08 Mar 2026 04:37:58 -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.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:58 -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 15/17] tools/nolibc/printf: Add support for zero padding and field precision Date: Sun, 8 Mar 2026 11:37:40 +0000 Message-Id: <20260308113742.12649-16-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Includes support for variable field widths (eg "%*.*d"). Zero padding is limited to 31 zero characters. This is wider than the largest numeric field so shouldn't be a problem. All the standard printf formats are now supported except octal and floating point. Add tests for new features Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v4 and v5. Changes for v3: - Formerly patch 8 - Extra comments. - Adjust offsets in outbuf[], support adding 31 '0' digits while still allowing enough room for octal support to be added and keeping outbuf[] at a nice round 56 bytes. Changes for v2: - These changes were previously in patch 9. However you need to apply the old patch 10 to get anything like the same source. The files then more of less match apart from 'c' being renamed 'ch' and the 'magic' #defines. --- tools/include/nolibc/stdio.h | 77 ++++++++++++++++---- tools/testing/selftests/nolibc/nolibc-test.c | 19 ++++- 2 files changed, 79 insertions(+), 17 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index fccc8a2d9b8a..3b2a5613f603 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -292,12 +292,10 @@ int fseek(FILE *stream, long offset, int whence) =20 =20 /* printf(). Supports most of the normal integer and string formats. - * - %[#-+ 0][width][{l,t,z,ll,L,j,q}]{c,d,i,u,x,X,p,s,m,%} + * - %[#0-+ ][width|*[.precision|*}][{l,t,z,ll,L,j,q}]{c,d,i,u,x,X,p,s,m,= %} * - %% generates a single % * - %m outputs strerror(errno). * - %X outputs a..f the same as %x. - * - The modifiers [-0] are currently ignored. - * - No support for precision or variable widths. * - No support for floating point or wide characters. * - Invalid formats are copied to the output buffer. * @@ -343,9 +341,9 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list char ch; unsigned long long v; long long signed_v; - int written, width, len; + int written, width, precision, len; unsigned int flags, ch_flag; - char outbuf[2 + 22 + 1]; + char outbuf[2 + 31 + 22 + 1]; char *out; const char *outstr; unsigned int sign_prefix; @@ -378,12 +376,24 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list flags |=3D ch_flag; } =20 - /* width */ - while (ch >=3D '0' && ch <=3D '9') { - width *=3D 10; - width +=3D ch - '0'; - - ch =3D *fmt++; + /* Width and precision */ + for (;; ch =3D *fmt++) { + if (ch =3D=3D '*') { + precision =3D va_arg(args, unsigned int); + ch =3D *fmt++; + } else { + for (precision =3D 0; ch >=3D '0' && ch <=3D '9'; ch =3D *fmt++) + precision =3D precision * 10 + (ch - '0'); + } + if (_NOLIBC_PF_FLAGS_CONTAIN(flags, '.')) + break; + width =3D precision; + if (ch !=3D '.') { + /* Default precision for strings */ + precision =3D INT_MAX; + break; + } + flags |=3D _NOLIBC_PF_FLAG('.'); } =20 /* Length modifier. @@ -446,6 +456,9 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list outstr =3D (const char *)(uintptr_t)v; if (!outstr) { outstr =3D "(null)"; + /* Match glibc, nothing output if precision too small */ + len =3D precision >=3D 6 ? 6 : 0; + goto do_output; } goto do_strlen_output; } @@ -469,11 +482,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } =20 /* The value is converted offset into the buffer so that - * the sign/prefix can be added in front. + * 31 zero pad characters and 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 =3D outbuf + 2; + out =3D outbuf + 2 + 31; =20 if (v =3D=3D 0) { /* There are special rules for zero. */ @@ -483,6 +496,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list len =3D 5; goto do_output; } + if (!precision) { + /* Explicit %nn.0d, no digits output */ + len =3D 0; + goto prepend_sign; + } /* All other formats (including "%#x") just output "0". */ out[0] =3D '0'; len =3D 1; @@ -501,6 +519,35 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list } } =20 + /* Add zero padding */ + if (_NOLIBC_PF_FLAGS_CONTAIN(flags, '0', '.')) { + if (!_NOLIBC_PF_FLAGS_CONTAIN(flags, '.')) { + if (_NOLIBC_PF_FLAGS_CONTAIN(flags, '-')) + /* Left justify overrides zero pad */ + goto prepend_sign; + /* eg "%05d", Zero pad to field width less sign. + * Note that precision can end up negative so all + * the variables have to be 'signed int'. + */ + precision =3D width; + if (sign_prefix) { + precision--; + if (sign_prefix >=3D 256) + precision--; + } + } + if (precision > 31) + /* Don't run off the start of outbuf[], arbitrary limit + * longer than the longest number field. */ + precision =3D 31; + for (; len < precision; len++) { + /* Stop gcc generating horrid code and memset(). */ + _NOLIBC_OPTIMIZER_HIDE_VAR(len); + *--out =3D '0'; + } + } + +prepend_sign: /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ for (; sign_prefix; sign_prefix >>=3D 8) { /* Force gcc to increment len inside the loop. */ @@ -535,8 +582,8 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list goto do_output; =20 do_strlen_output: - /* Open coded strlen() (slightly smaller). */ - for (len =3D 0;; len++) + /* Open coded strnlen() (slightly smaller). */ + for (len =3D 0; len < precision; len++) if (!outstr[len]) break; =20 diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 89ded1dd7318..7398827fa08b 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1830,12 +1830,15 @@ static int run_printf(int min, int max) CASE_TEST(signed_max); EXPECT_VFPRINTF(1, "2147483647", "%i", ~0u >> 1= ); break; CASE_TEST(signed_min); EXPECT_VFPRINTF(1, "-2147483648", "%i", (~0u >>= 1) + 1); break; CASE_TEST(unsigned_max); EXPECT_VFPRINTF(1, "4294967295", "%u", ~0u); br= eak; - CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; + CASE_TEST(char); EXPECT_VFPRINTF(1, "|c|d| e|", "|%c|%.0c|%4c|= ", 'c', 'd', 'e'); break; CASE_TEST(hex_nolibc); EXPECT_VFPRINTF(is_nolibc, "|f|d|", "|%x|%X|", = 0xf, 0xd); break; CASE_TEST(hex_libc); EXPECT_VFPRINTF(!is_nolibc, "|f|D|", "|%x|%X|",= 0xf, 0xd); break; CASE_TEST(hex_alt); EXPECT_VFPRINTF(1, "|0x1| 0x2| 0|", "|%#x|%= #5x|%#5x|", 1, 2, 0); break; + CASE_TEST(hex_alt_prec); EXPECT_VFPRINTF(1, "| 0x02|0x03| 0x123|", "|%#5= .2x|%#04x|%#6.2x|", 2, 3, 0x123); break; + CASE_TEST(hex_0_alt); EXPECT_VFPRINTF(1, "|0|0000| 00|", "|%#x|%#04= x|%#5.2x|", 0, 0, 0); break; CASE_TEST(pointer); EXPECT_VFPRINTF(1, "0x1", "%p", (void *) 0x1); = break; - CASE_TEST(pointer_NULL); EXPECT_VFPRINTF(1, "(nil)", "%p", (void *)0); b= reak; + CASE_TEST(pointer_NULL); EXPECT_VFPRINTF(1, "|(nil)|(nil)|", "|%p|%.4p|"= , (void *)0, (void *)0); break; + CASE_TEST(string_NULL); EXPECT_VFPRINTF(1, "|(null)||(null)|", "|%s|%.5= s|%.6s|", (void *)0, (void *)0, (void *)0); break; CASE_TEST(percent); EXPECT_VFPRINTF(1, "a%d42%69%", "a%%d%d%%%d%%",= 42, 69); break; CASE_TEST(perc_qual); EXPECT_VFPRINTF(1, "a%d2", "a%-14l%d%d", 2); br= eak; CASE_TEST(invalid); EXPECT_VFPRINTF(1, "a%12yx3%y42%P", "a%12yx%d%y= %d%P", 3, 42); break; @@ -1844,10 +1847,22 @@ static int run_printf(int min, int max) CASE_TEST(uintmax_max); EXPECT_VFPRINTF(1, "18446744073709551615", "%ju= ", ~0ULL); break; CASE_TEST(truncation); EXPECT_VFPRINTF(1, "0123456789012345678901234",= "%s", "0123456789012345678901234"); break; CASE_TEST(string_width); EXPECT_VFPRINTF(1, " 1", "%10s", "1"); = break; + CASE_TEST(string_trunc); EXPECT_VFPRINTF(1, " 12345", "%10.5s", "123= 4567890"); break; CASE_TEST(number_width); EXPECT_VFPRINTF(1, " 1", "%10d", 1); br= eak; CASE_TEST(number_left); EXPECT_VFPRINTF(1, "|-5 |", "|%-8d|", -5);= break; CASE_TEST(string_align); EXPECT_VFPRINTF(1, "|foo |", "|%-8s|", "foo= "); break; CASE_TEST(width_trunc); EXPECT_VFPRINTF(1, " 1",= "%25d", 1); break; + CASE_TEST(width_tr_lft); EXPECT_VFPRINTF(1, "1 = ", "%-30d", 1); break; + CASE_TEST(number_pad); EXPECT_VFPRINTF(1, "0000000005", "%010d", 5); b= reak; + CASE_TEST(number_pad); EXPECT_VFPRINTF(1, "|0000000005|0x1234|", "|%01= 0d|%#01x|", 5, 0x1234); break; + CASE_TEST(num_pad_neg); EXPECT_VFPRINTF(1, "-000000005", "%010d", -5); = break; + CASE_TEST(num_pad_hex); EXPECT_VFPRINTF(1, "00fffffffb", "%010x", -5); = break; + CASE_TEST(num_pad_trunc);EXPECT_VFPRINTF(is_nolibc, " 000000000000000= 0000000000000005", "%035d", 5); break; /* max 31 '0' can be added */ + CASE_TEST(num_p_tr_libc);EXPECT_VFPRINTF(!is_nolibc, "000000000000000000= 00000000000000005", "%035d", 5); break; + CASE_TEST(number_prec); EXPECT_VFPRINTF(1, " 00005", "%10.5d", 5); = break; + CASE_TEST(num_prec_neg); EXPECT_VFPRINTF(1, " -00005", "%10.5d", -5);= break; + CASE_TEST(num_prec_var); EXPECT_VFPRINTF(1, " -00005", "%*.*d", 10, 5= , -5); break; + CASE_TEST(num_0_prec_0); EXPECT_VFPRINTF(1, "|| |+||||", "|%.0d|% .0d|%+= .0d|%.0u|%.0x|%#.0x|", 0, 0, 0, 0, 0, 0); break; CASE_TEST(errno); errno =3D 22; EXPECT_VFPRINTF(is_nolibc, "errno= =3D22", "%m"); break; CASE_TEST(errno-neg); errno =3D -22; EXPECT_VFPRINTF(is_nolibc, "errn= o=3D-22 ", "%-12m"); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; --=20 2.39.5 From nobody Thu Apr 9 13:22:32 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 55167374733 for ; Sun, 8 Mar 2026 11:38:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969883; cv=none; b=Q6JtUm1zAWDSkimrmxy5X/ig6bLMa8viC7+vs2V66qT+y80c9HmZHnI77CGxJRSXdYwIPAmvpSB9x3A0jLPo7ECI8o6RHTYILUwS+kofRpZ6CtAKvk6cXOIzr/naSkIoaoLhtjzk10t9Tt0ygmfZX8S/X3eWR36S5exSelK94FQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969883; c=relaxed/simple; bh=rzMQwR9rp40fDHuR59lC/aHZD8yao456I6VbfsO4Tl0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=YnJSe56MBaDI4x70J17z/r0jlEdM1bB+Vg3MydfLM9m/m1rWF+Qtkz3bF5Q0+Gduv4lPe/9SYrwijUUa390PhhzWNC9nJc2WB3LEvVKELZ5ZDZmIOFguLW2WRim63EHuMXHg/kRA1iRipocOdsBUKJyuGogVEeeqOT1abrvQlNg= 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=CN1hmfij; arc=none smtp.client-ip=209.85.128.50 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="CN1hmfij" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4853aec185aso532025e9.1 for ; Sun, 08 Mar 2026 04:38:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969880; x=1773574680; 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=1ZwkrmbppLeWWqEUnrh/KzJg2rgy/xfAqoFTtZYOv+g=; b=CN1hmfijfnULgUgPsyC+4N8c7ySsTpl0vNvaH8Js6LDXBoCa+R0MuFpBBPNS/2BqU3 F8ZCWz1FlrN7J6yyKl4ocW5pAiEYWqRM2o7Y6SAdTGsiASuKxoRGc7P0gS1ySzucMMhY p/Dpw03PE3/28zwoDbD6q477eSf8gMSFiO453KjUdfGRIIxE01r0mYTII9SbtHyZRFd2 bTAjwY225khygAJcQ+GsekbVScBw/vUhn6dpbVAvVMzXl+rn6TsCKT/VZqqBc575KRsS 7/3DdcdJ+JGzV7bHl9m9VJ20N5/e0yYLyd0yFCvQsGS+oJEGYp4E/f3xweJimZiCrmzM pYng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969880; x=1773574680; 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=1ZwkrmbppLeWWqEUnrh/KzJg2rgy/xfAqoFTtZYOv+g=; b=aSGZnd5XQRVdNtmToB8GQqxUZ56+RIyY4hnYH+XSUNZFNpzWHFuRnZX/iIgKzxaMgO 2OrD3fOr1tIPMgPxWr4FppJUowMeXKcLCjWu9tOncA1vAh7bA0LZJXxzVDRZwn4V40ho +9lmKzBcnVHCLR16Wm7RjquwDPznb/AYpdj6r0ijYtLB8auebeJr9WSW2MG4WZ3jLDfv 5Z9GitcCbqhjy7vnT5+GOsG8b/rBExaOG6LEVT9UC3ko+dnRXYLisjCFIZ1wBl69j/4R 1gaItmiz1S2p4KUGwdS50mqF/P29gHXcYGykUo58oQcQmGz/BvXB7/5RVkT/inxPOtN/ hPEA== X-Forwarded-Encrypted: i=1; AJvYcCUarxs+F8cMdyYs9/ylGI6sDWA5Mrk8ahOm45vToXPKRUTMKa0GwsliYeOxHtPV/txpge/9DdrPNL/edVw=@vger.kernel.org X-Gm-Message-State: AOJu0YxQWBtdLNSUjCHwuS6ffoRgli7ib0JHEDi+vd+uNjlsHjk74bvq JuiDZdd2yHHP+/++C5foIy1pCixrT0h3ggKXuvXiIzNHtqxFpxE3sA/5 X-Gm-Gg: ATEYQzzLiAngxOdKw/n1vqdPvpkEqeRor0sgRboBV8+3alWNcVIR/IIHU6XtlP9nfll s0hheY1H7MW3aQv839MG70NswMRhQftgngSC0KULhF5T3UsfKxZTiAsu6uS83WJH3Ao+bfSLDWZ sTnXraut1npbHlz/iSU+lurKD1G4sn9C/am112GxoztFQN+TICDv0eYatjOCuBMATVpZI8LLoVA m79+hg4Hyw9XzkMwypHO+XOpBzv/maNJl+agW7kdJI2SyQmnfTrsWJ5T6LxEqm06TvbqmW+BXhq 1YyHDr3FrHkHLcBcb96UcFbtQ239E3zeI8UcNDCANUE12f/8YiKfcaXB+qUHfEpb7kq7TGw7ROe Wdmv8W1TIbKMd8erjF3oTEGcmJCBSSv6UGE7f4Bt7f5VfJJA60bxG7gw8AyoZBsXozuO/hWE1I1 OnwHEYzCkeZmWpMSy4u/xCW4Nkzm2xuGZgKX96hLH2AbmtykbwqBB1snLPPOoFVMEbElsQQn4cn AuDHGF/iDpK X-Received: by 2002:a05:600c:8b27:b0:483:abeb:7a5c with SMTP id 5b1f17b1804b1-48526923bfdmr130429805e9.12.1772969879541; Sun, 08 Mar 2026 04:37:59 -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.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:59 -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 16/17] tools/nolibc/printf: Add support for octal output Date: Sun, 8 Mar 2026 11:37:41 +0000 Message-Id: <20260308113742.12649-17-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Octal output isn't often used, but adding it costs very little. Supporting "%#o" is mildly annoying, it has to add a leading '0' if there isn't one present. In simple cases this is the same as adding a sign of '0' - but that adds an extra '0' in a few places. So you need 3 tests, %o, # and no leading '0' (which can only be checked after the zero pad for precision). If all the test are deferred until after zero padding then too many values are 'live' across the call to _nolibc_u64toa_base() and get spilled to stac= k. Hence the check that ignores the 'sign' if it is the same as the first character of the output string. Add tests for octal output. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v5. v4: - Increase VFPRINTF_LEN to 25 to that 64bit octal output isn't truncated. Change truncation tests to match. (Was done earlier in v3.) New patch for v3. Relies on the changes to u64toa_r() etc in stdlib.h (patch 2). tools/include/nolibc/stdio.h | 50 ++++++++++++++------ tools/testing/selftests/nolibc/nolibc-test.c | 9 ++-- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 3b2a5613f603..10c48b88fcbe 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -292,7 +292,7 @@ int fseek(FILE *stream, long offset, int whence) =20 =20 /* printf(). Supports most of the normal integer and string formats. - * - %[#0-+ ][width|*[.precision|*}][{l,t,z,ll,L,j,q}]{c,d,i,u,x,X,p,s,m,= %} + * - %[#0-+ ][width|*[.precision|*}][{l,t,z,ll,L,j,q}]{c,d,i,u,o,x,X,p,s,= m,%} * - %% generates a single % * - %m outputs strerror(errno). * - %X outputs a..f the same as %x. @@ -426,7 +426,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list */ ch_flag =3D _NOLIBC_PF_FLAG(ch) | (flags & _NOLIBC_PF_FLAG('#')) >> 1; if (((ch >=3D 'a' && ch <=3D 'z') || ch =3D=3D 'X') && - _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p', 's')= ) { + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'o', 'x', 'p',= 's')) { /* 'long' is needed for pointer/string conversions and ltz lengths. * A single test can be used provided 'p' (the same bit as '0') * is masked from flags. @@ -479,12 +479,19 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, ' ')) { sign_prefix =3D ' '; } + } else { + /* "#o" requires that the output always starts with a '0'. + * This needs another check after any zero padding to avoid + * adding an extra leading '0'. + */ + if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'o') && + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, '#' - 1)) + sign_prefix =3D '0'; } =20 /* The value is converted offset into the buffer so that * 31 zero pad characters and 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. + * The longest digit string is 22 + 1 for octal conversions. */ out =3D outbuf + 2 + 31; =20 @@ -497,7 +504,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list goto do_output; } if (!precision) { - /* Explicit %nn.0d, no digits output */ + /* Explicit %nn.0d, no digits output (except for %#.0o) */ len =3D 0; goto prepend_sign; } @@ -506,17 +513,23 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list len =3D 1; } else { /* Convert the number to ascii in the required base. */ + unsigned long long recip; + unsigned int base; if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i', 'u')) { - /* Base 10 */ - len =3D u64toa_r(v, out); + base =3D 10; + recip =3D _NOLIBC_U64TOA_RECIP(10); + } else if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'o')) { + base =3D 8; + recip =3D _NOLIBC_U64TOA_RECIP(8); } else { - /* Base 16 */ + base =3D 16; + recip =3D _NOLIBC_U64TOA_RECIP(16); if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'p', '#' - 1)) { /* "%p" and "%#x" need "0x" prepending. */ sign_prefix =3D '0' << 8 | 'x'; } - len =3D u64toh_r(v, out); } + len =3D _nolibc_u64toa_base(v, out, base, recip); } =20 /* Add zero padding */ @@ -547,13 +560,20 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } } =20 + /* %#o has set sign_prefix to '0', but we don't want so add an extra + * leading zero here. + * Since the only other byte values of sign_prefix are ' ', '+' and '-' + * it is enough to check that out[] doesn't already start with sign_pre= fix. + */ + if (sign_prefix !=3D *out) { prepend_sign: - /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ - for (; sign_prefix; sign_prefix >>=3D 8) { - /* Force gcc to increment len inside the loop. */ - _NOLIBC_OPTIMIZER_HIDE_VAR(len); - len++; - *--out =3D sign_prefix; + /* Add the 0, 1 or 2 ("0x") sign/prefix characters at the front. */ + for (; sign_prefix; sign_prefix >>=3D 8) { + /* Force gcc to increment len inside the loop. */ + _NOLIBC_OPTIMIZER_HIDE_VAR(len); + len++; + *--out =3D sign_prefix; + } } outstr =3D out; goto do_output; diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 7398827fa08b..ebeb7245005c 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1663,7 +1663,7 @@ int run_stdlib(int min, int max) #define EXPECT_VFPRINTF(cond, expected, fmt, ...) \ do { if (!(cond)) result(llen, SKIPPED); else ret +=3D expect_vfprintf(ll= en, expected, fmt, ##__VA_ARGS__); } while (0) =20 -#define VFPRINTF_LEN 20 +#define VFPRINTF_LEN 25 static int expect_vfprintf(int llen, const char *expected, const char *fmt= , ...) { char buf[VFPRINTF_LEN + 80]; @@ -1831,6 +1831,9 @@ static int run_printf(int min, int max) CASE_TEST(signed_min); EXPECT_VFPRINTF(1, "-2147483648", "%i", (~0u >>= 1) + 1); break; CASE_TEST(unsigned_max); EXPECT_VFPRINTF(1, "4294967295", "%u", ~0u); br= eak; CASE_TEST(char); EXPECT_VFPRINTF(1, "|c|d| e|", "|%c|%.0c|%4c|= ", 'c', 'd', 'e'); break; + CASE_TEST(octal); EXPECT_VFPRINTF(1, "|17| 0033||", "|%o|%6.4o|%= .0o|", 017, 033, 0); break; + CASE_TEST(octal_max); EXPECT_VFPRINTF(1, "1777777777777777777777", "%= llo", ~0ULL); break; + CASE_TEST(octal_alt); EXPECT_VFPRINTF(1, "|0|01|02|034|0|", "|%#o|%#o= |%#02o|%#02o|%#.0o|", 0, 1, 2, 034, 0); break; CASE_TEST(hex_nolibc); EXPECT_VFPRINTF(is_nolibc, "|f|d|", "|%x|%X|", = 0xf, 0xd); break; CASE_TEST(hex_libc); EXPECT_VFPRINTF(!is_nolibc, "|f|D|", "|%x|%X|",= 0xf, 0xd); break; CASE_TEST(hex_alt); EXPECT_VFPRINTF(1, "|0x1| 0x2| 0|", "|%#x|%= #5x|%#5x|", 1, 2, 0); break; @@ -1845,13 +1848,13 @@ static int run_printf(int min, int max) CASE_TEST(intmax_max); EXPECT_VFPRINTF(1, "9223372036854775807", "%lld= ", ~0ULL >> 1); break; CASE_TEST(intmax_min); EXPECT_VFPRINTF(1, "-9223372036854775808", "%Li= ", (~0ULL >> 1) + 1); break; CASE_TEST(uintmax_max); EXPECT_VFPRINTF(1, "18446744073709551615", "%ju= ", ~0ULL); break; - CASE_TEST(truncation); EXPECT_VFPRINTF(1, "0123456789012345678901234",= "%s", "0123456789012345678901234"); break; + CASE_TEST(truncation); EXPECT_VFPRINTF(1, "012345678901234567890123456= 789", "%s", "012345678901234567890123456789"); break; CASE_TEST(string_width); EXPECT_VFPRINTF(1, " 1", "%10s", "1"); = break; CASE_TEST(string_trunc); EXPECT_VFPRINTF(1, " 12345", "%10.5s", "123= 4567890"); break; CASE_TEST(number_width); EXPECT_VFPRINTF(1, " 1", "%10d", 1); br= eak; CASE_TEST(number_left); EXPECT_VFPRINTF(1, "|-5 |", "|%-8d|", -5);= break; CASE_TEST(string_align); EXPECT_VFPRINTF(1, "|foo |", "|%-8s|", "foo= "); break; - CASE_TEST(width_trunc); EXPECT_VFPRINTF(1, " 1",= "%25d", 1); break; + CASE_TEST(width_trunc); EXPECT_VFPRINTF(1, " = 1", "%30d", 1); break; CASE_TEST(width_tr_lft); EXPECT_VFPRINTF(1, "1 = ", "%-30d", 1); break; CASE_TEST(number_pad); EXPECT_VFPRINTF(1, "0000000005", "%010d", 5); b= reak; CASE_TEST(number_pad); EXPECT_VFPRINTF(1, "|0000000005|0x1234|", "|%01= 0d|%#01x|", 5, 0x1234); break; --=20 2.39.5 From nobody Thu Apr 9 13:22:33 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 8159E37474A for ; Sun, 8 Mar 2026 11:38:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969883; cv=none; b=U7zhLpx8PkfKlUrdK9ZZL0c+lux7AlnFZAc9suAGk8M3HLq+cm6vOP5jhYgACw0r/pdMj4LWSwIZPa66EqAEhHt+tYAN0afazELffQzSFSL3SGk7qSPi3RJiTCWCY8ypZweC2xe5p9Iazu7nDVR935Ti65hMNt1sIZoQFDiJD4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772969883; c=relaxed/simple; bh=UpI856BcickOH7Nhmk3qf+vAZCHkOeTuJ7ERNbqRwY4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OaJAs97chDRs4ZyFdlNxShFhwFQU+Q6oQ0XmCGr5IqboxRFUBIhcy2/c8h7SbTHURYJWtf9D9L79ha3/49VfpewFQinoeszGEG24A3/I7zDzYMEVY4qlf/SEwW2Utj5AJm4IrAoPXb6TI0mCZRi3rJK78RiVMqBmVLqfld5n5aE= 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=iczPEjE+; arc=none smtp.client-ip=209.85.128.43 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="iczPEjE+" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4852ff06541so9863595e9.2 for ; Sun, 08 Mar 2026 04:38:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772969880; x=1773574680; 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=llKLrjTwR/6Q0b7fsMdG+suf790guerBXeDyUTBKjgc=; b=iczPEjE+UFQ/KiitAvpzqYBYVxfOt+UMwVwpuQHUiaCRcIQqEgRnQEmshLIEBEevwH NVBw6vPCeMGQBmFXrIXTUkWLsu3HvgysXCiHR2mhC1dRYvLhLvV6ggJBYp5drnukdsBf 44W8rHURcNIZ7Jpg2jf6F0DVS/ASdBkY9Jh9QaEbogHu9TbgdONMDOBmCwAwUuRFS/m5 FT++mKHUQZyuIb+kbzUazsGKHgT+2lopXWW0NUGS9nL2wnGgOmOECSECiMCILx0kqBZX wYgd7rT+OsYeqbHYlrKyB1hKeA/g4vNk4hiMudTB/K+l7dinVHVKYK6GHtcmfl1Cd9sD 0qtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772969880; x=1773574680; 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=llKLrjTwR/6Q0b7fsMdG+suf790guerBXeDyUTBKjgc=; b=X4fQKLADjY/68OpMScQzSGR7aj2eGBcjpQmi5fBcrxnvXnwgqQdjK1pseKTNFL1ypY OLhDeR36+hVorjT5INb9mRu07TSDEqoglrSU7AAUoKCHfKwmGCDUPLBVtEBtkdeo31wL AOr82oN8PGT7PEcs1zxBZZAf4zPqCJO7AVKM+PvuPi3xm7REVp+O7gZ672sMK62qwgVf /HcO52DlyUDxWWincWUQ5QJwv7j4/RSw80veXcD+67dAmgQ7lyBd2iTDgImlxHHBvIqm rXrsstuG6XK6u10ZNCyGhOMKjzlUAZmfTiE5yBrR2qNMbzjW24p3HYU8G194Icu0pd6c amSw== X-Forwarded-Encrypted: i=1; AJvYcCW/A+DUHlfAuiUpAwErtp8zFnmqB77vNnKq6lIlrHrXdjDxwAqyDegAZyaYhODlT0z8kuRZ2IRkv9vkKc8=@vger.kernel.org X-Gm-Message-State: AOJu0YxMNxq/+FO6NlXKts+hJlYNc6bvkDlUHJ/s7PKrYT+qpEvckVTE zxT1fHFjPSnveFIEuvrtVj8hjR+I25SVJI+cQ4U2hRxMBZXkZN2izIla X-Gm-Gg: ATEYQzxrhwOd+5zufNPtlVwUGbN3z5bL9F5MLwvpWMvzcf8bknH+eFUgWxOQAPjPf8n +ff3kXOuIG2oJAAOM3Qal7KJ4zdhKkuw8SrxzjxZozhYLDFoljdaPT5xjtZD762XpcofbGLcNMX r6Vi3fEwEfYkiljvTp6irCj/lsdINPJefgnbbBUQvjHtaYVnhlr2QIfqL/zANxFArEYw7RELa5x CjvGNrcLOzNzOyJ/xYS5Anb6l6h0DH+r9d05VE2pVugH4bxCtFvO1uRoRDBlRJT64fRwItWR0Pf wt88P4Q38WM46wrOLiXiB7xFxRw0p1QkLwVsv2OrovCQNRiKt9UUTe3I6gSyMToOgyxe7blbs6d /F0seWXHV4A7v9NDfBaiZerwqGuAem2CkgHk5RRpUn7SUaLEthY/vrmnCLBKZ/gvCyfJQlp0bKc agfBgm347WqzLGKRaeAwtkCh76mXDzTRK3wLL4RPnQ8ll22cENWthcLG3Q+9klSXdLblqT5nvd2 5tLEVKzyrjI X-Received: by 2002:a05:600c:3b0c:b0:477:5b0a:e616 with SMTP id 5b1f17b1804b1-485269188admr134003965e9.5.1772969879944; Sun, 08 Mar 2026 04:37:59 -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.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 04:37:59 -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 17/17] selftests/nolibc: Use printf variable field widths and precisions Date: Sun, 8 Mar 2026 11:37:42 +0000 Message-Id: <20260308113742.12649-18-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: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Now that printf supports '*' for field widths and precisions then can be used to simplify the test output. - aligning the "[OK]" strings. - reporting the expected sprintf() output when there is a mismatch. Acked-by: Willy Tarreau Signed-off-by: David Laight --- Unchanged for v4 and v5. tools/testing/selftests/nolibc/nolibc-test.c | 26 ++++---------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index ebeb7245005c..180611aabbfb 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -156,21 +156,6 @@ static const char *errorname(int err) } } =20 -static void align_result(size_t llen) -{ - const size_t align =3D 64; - char buf[align]; - size_t n; - - if (llen >=3D align) - return; - - n =3D align - llen; - memset(buf, ' ', n); - buf[n] =3D '\0'; - fputs(buf, stdout); -} - enum RESULT { OK, FAIL, @@ -188,8 +173,10 @@ static void result(int llen, enum RESULT r) else msg =3D " [FAIL]"; =20 - align_result(llen); - puts(msg); + llen =3D 64 - llen; + if (llen < 0) + llen =3D 0; + printf("%*s%s\n", llen, "", msg); } =20 /* The tests below are intended to be used by the macroes, which evaluate @@ -1692,10 +1679,7 @@ static int expect_vfprintf(int llen, const char *exp= ected, const char *fmt, ...) } =20 if (memcmp(expected, buf, cmp_len) || buf[cmp_len]) { - /* Copy and truncate until "%.*s" supported */ - memcpy(buf, expected, cmp_len); - buf[cmp_len] =3D 0; - llen +=3D printf(" should be \"%s\"", buf); + llen +=3D printf(" should be \"%.*s\"", VFPRINTF_LEN, expected); result(llen, FAIL); return 1; } --=20 2.39.5