From nobody Sun Feb 8 01:30:50 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 C103031D725 for ; Tue, 3 Feb 2026 10:30:12 +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=1770114614; cv=none; b=uqTqyKCYiygbxB8XfL8vuYNQ1VxJeYW0YSz2ZQTnWS7m190HBMB0XSc7DJkj4x3pEI/LwvYurPwiHlC+uudzoUx4mYihrVQcD/0ry2+Yj2DSh9QtEZIAQrdd5e79zuByxadRU8v8FUZm2I8EdgBhhxqvFzC3aroGU+/b2r3cR3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114614; c=relaxed/simple; bh=GnI0GY9dJ2+EEzk58xOtNj1SDKqcRI+2curOvTuH8eY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ddR+O1D2KzTxXMc2TeDp2zmE1Lu+w83KJd2TnmMfbi8vd3rjW75MNGm1p+ByjV6d9FN8DuVfayYkVVytCBd9XPf/F5U/fvGARglznOP/UKBIFNeiyU9JfQep9iVy5+K35nh0iiySwxAM2PEeM0w/B9Fq+U/8iu/ZU46P9CsldFk= 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=NwKoqPvS; 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="NwKoqPvS" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-432d2c96215so5177742f8f.3 for ; Tue, 03 Feb 2026 02:30:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114611; x=1770719411; 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=Sql9jJ4+QSjDChfJwwawiEfQbaUcvQt+K3oDgm5ti1M=; b=NwKoqPvSUs3gaF2bWbYrfi5+uEYWwWmw6xZ9YKou8+U90OmotLj2aixqkcVlKyVpOm oGCtEc+dHBjFtbrDLFgHbEpEEUxSdm64nMvy/pSn1LEKfl1b5u6HXY8hbHX4AZb8q6Xx G+2cVrNwjf2JUn7oZHqNPoJZj6SdPuqTSI+vIssuj7XP07uxk/ykrviyiqjCdeiFyJRT trPMU799ZQpIFmtCIGSy4vpRwF+Zk2v6Q4hp+FPsI8bhlWCTsfB3UXNDJnonCXHIrsE5 BEl/U3QmlfST/YyuGwTs6/9yx3UMvgCWeDasdal2gAV5ws4E5L6c7eAJ9d5paIEBP8Mw ywOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114611; x=1770719411; 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=Sql9jJ4+QSjDChfJwwawiEfQbaUcvQt+K3oDgm5ti1M=; b=iCrr6msHvGTzc5GhPPPWk1oeSZ6NDv3EnkzsfFGK350aV4tvfXsp45OUEfdONrMRAB LYtvazuL9MU4MYG7drE9+oZTQr2dZrHDjZqOurSG883I63qscAF2CaeHJhqxegRLra/Q YFVOI6veh90HtvXYmylGpDkZd6e5iIIWE7aaMe3lz9mji+JjRO36LUswuwbzY6rhfHrw 8COJRy0LHqL0gUGFdhORM1hjZfoc9Qnf3Q7Euv2H/dq3E4H5f1MXgAuIo+hfXNc9DaPL ypu16+mQxnsTeY1ZjqdWTASEzrhsO5A2+opvkgac/UUESfGs/zUA9unnpt1Zvv38E915 Bddg== X-Forwarded-Encrypted: i=1; AJvYcCXzBhU2g69opCj3t5qO5aGXE1zDJG5sFfpN53M4gG/6ZbIw+j8H125+PLjFuAzcRKS2YzRZ6fiTP9eTTUw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2gtf/N97/gzdk+rACrYzevCH3gqxs42YZ2w003bi1KymmAWvK x10lyuAt9fN12Su2TT4RqxmsPOlHxz76OTSWLO/yyXzr4QfCY8zucfTp X-Gm-Gg: AZuq6aLf/nbGxkazqCZLrArrxhdN4hyNhX1q9aaq+Ynokh7eLZ5cC+K9So4k9WX40UA lnp3OMI9nledPP7nUjAe2BN9gDEdfl7GBr/1byWhsgOxnfO8mNoMq6zZIIhQbWytLSWpyUZsNK3 LL92YjQHYTBug1LZ1KpIGdKTlt1x7fvGBIBl+jHv38aHd0B/0Ca+lN6muXNcxKyx6ic4qpaJ+IX 0OCVBaxswQvxrusScJNGiLTwHv9Ic2VuJVgTrBd62jc7SQ9LRGXw1GEsS8gOAVMxZqqiumfJU9R 7LwB9DCoOLGzqylz1Ys4yVeFPHIEwc9HoUjI7/BZ52Z1EWeXm/o0opgEqBkVOtftQGPgas/5jsj RnJ+sNzzHEEkF+b7Z5gqV2ISuFZK97UQnFxgEM8pAPtAkrp1Ek+wZlShZH0pg26QTQLRWHXmf13 NAw7RYsAKgigAy1viv95dGkF13hFXinm1LWw6JVNEJ8FlGtuzT5Ce0AsOP+KSU/nDtAvlydqJvz QIQlxv1ELQ= X-Received: by 2002:a05:6000:184f:b0:435:ad52:31e0 with SMTP id ffacd0b85a97d-435f3a7b7e6mr21555166f8f.16.1770114610889; Tue, 03 Feb 2026 02:30:10 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:10 -0800 (PST) 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 next 01/12] tools/nolibc/printf: Move length check to snprintf callback Date: Tue, 3 Feb 2026 10:29:49 +0000 Message-Id: <20260203103000.20206-2-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 output truncation to the snprintf() callback. This simplifies the main code and ensures the truncation will be correct when left-alignment is added. Add a zero length callback to 'finalise' the buffer rather than doing it in snprintf() itself. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 66 +++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 1f16dab2ac88..6c8fa41dbc01 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -245,15 +245,15 @@ char *fgets(char *s, int size, FILE *stream) * - %s * - unknown modifiers are ignored. */ -typedef int (*__nolibc_printf_cb)(intptr_t state, const char *buf, size_t = size); +typedef int (*__nolibc_printf_cb)(void *state, const char *buf, size_t siz= e); =20 -static __attribute__((unused, format(printf, 4, 0))) -int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const= char *fmt, va_list 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 escape, lpref, c; unsigned long long v; unsigned int written, width; - size_t len, ofs, w; + size_t len, ofs; char tmpbuf[21]; const char *outstr; =20 @@ -355,17 +355,13 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t s= tate, size_t n, const char outstr =3D fmt; len =3D ofs - 1; flush_str: - if (n) { - w =3D len < n ? len : n; - n -=3D w; - while (width-- > w) { - if (cb(state, " ", 1) !=3D 0) - return -1; - written +=3D 1; - } - if (cb(state, outstr, w) !=3D 0) + while (width-- > len) { + if (cb(state, " ", 1) !=3D 0) return -1; + written +=3D 1; } + if (cb(state, outstr, len) !=3D 0) + return -1; =20 written +=3D len; do_escape: @@ -378,18 +374,22 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t s= tate, size_t n, const char =20 /* literal char, just queue it */ } + + if (cb(state, NULL, 0) !=3D 0) + return -1; + return written; } =20 -static int __nolibc_fprintf_cb(intptr_t state, const char *buf, size_t siz= e) +static int __nolibc_fprintf_cb(void *stream, const char *buf, size_t size) { - return _fwrite(buf, size, (FILE *)state); + return size ? _fwrite(buf, size, stream) : 0; } =20 static __attribute__((unused, format(printf, 2, 0))) int vfprintf(FILE *stream, const char *fmt, va_list args) { - return __nolibc_printf(__nolibc_fprintf_cb, (intptr_t)stream, SIZE_MAX, f= mt, args); + return __nolibc_printf(__nolibc_fprintf_cb, stream, fmt, args); } =20 static __attribute__((unused, format(printf, 1, 0))) @@ -447,26 +447,38 @@ int dprintf(int fd, const char *fmt, ...) return ret; } =20 -static int __nolibc_sprintf_cb(intptr_t _state, const char *buf, size_t si= ze) +struct __nolibc_sprintf_cb_state { + char *buf; + size_t size; +}; + +static int __nolibc_sprintf_cb(void *v_state, const char *buf, size_t size) { - char **state =3D (char **)_state; + struct __nolibc_sprintf_cb_state *state =3D v_state; + char *tgt; =20 - memcpy(*state, buf, size); - *state +=3D size; + if (size >=3D state->size) { + if (state->size <=3D 1) + return 0; + size =3D state->size - 1; + } + tgt =3D state->buf; + if (size) { + state->size -=3D size; + state->buf =3D tgt + size; + memcpy(tgt, buf, size); + } else { + *tgt =3D '\0'; + } return 0; } =20 static __attribute__((unused, format(printf, 3, 0))) int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) { - char *state =3D buf; - int ret; + struct __nolibc_sprintf_cb_state state =3D { .buf =3D buf, .size =3D size= }; =20 - ret =3D __nolibc_printf(__nolibc_sprintf_cb, (intptr_t)&state, size, fmt,= args); - if (ret < 0) - return ret; - buf[(size_t)ret < size ? (size_t)ret : size - 1] =3D '\0'; - return ret; + return __nolibc_printf(__nolibc_sprintf_cb, &state, fmt, args); } =20 static __attribute__((unused, format(printf, 3, 4))) --=20 2.39.5 From nobody Sun Feb 8 01:30:50 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 E63F3320CA9 for ; Tue, 3 Feb 2026 10:30:12 +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=1770114614; cv=none; b=SOjEy2Sl1BBN4ribOMglhfrdfSflY7WvdVhbooi951Rs4dAZ4lIj/biexAfz475ICNeXBl0tWoV5ziPkOdK9vnFd8hO4gr98Lz5I4fypkz+togfjo6lyeJPlggTwRCoikC1jHpHMoNlWOsyn+HGkbAasPPltbCugkgUZ402no7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114614; c=relaxed/simple; bh=neT8lO755voJMGxMVzYkk//vb6OqJjD7qoRGhYArAWw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=s3388WhgHvMYV1NC30JHUMpvY7T2ilQldKahWAM8c+H+lgye4iyEGQrziylMWnbneWQICj5j4ve3bAVJavLUOffmuGuRTC7Vuf9xIU6mS2fPCRDNOZjDiNjff7MWf1V8zL49Mt4Jq7jEwB7ByTgJk8A+ucsbRinugeEBwoAu3go= 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=g+drZHAS; 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="g+drZHAS" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-47fedb7c68dso55435225e9.2 for ; Tue, 03 Feb 2026 02:30:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114611; x=1770719411; 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=bHKF35rgduIXryq8iyoVCS15Hn5/OcfLPncoO1eDa7s=; b=g+drZHASmTcl21OlEHjAV2EvuSoXulkmn38MnqeqC0T3hDcDxhkmVm/Lw39/b814nV GET37jLWFxqtEAPmmsO4KWXvK4LrgoRk7ZML/shdTQAbtPo3p5kBFckWyLkL86MUaYu4 EQGgcSXDhMBeBMpTs7Ae+d5I+vjI1OwddsPQLaIwCYkxlbCX8pznZeUy+Ho0RLyjs5DR XojdjZBv1MJqs33GY77PSrXqAdJhAxyCzcMdEPWRbZtnmmj9h0bXfumqfVAVYQcEbz8N RBi2Mo4KMhwSdfCk/tahBiGk+2lBoI6Rj15xljhWZesYLGsaKnfHPvPA8z75url6xtGg w13A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114611; x=1770719411; 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=bHKF35rgduIXryq8iyoVCS15Hn5/OcfLPncoO1eDa7s=; b=dHi6jdb+3m3DOzc2BS2kyrnwpyQ1WkSVxHdtfOqOxdeaQe+SaSMbduDGkOnsCILERN 7/b9rZrVpzj2MJp+Mtm1FQu2+o/SRtbowS1JcDS8jodM+rDrdauKS5H3aAw0K2f26gXJ CbS8B+vFLm/3MsNC1IsMhjEkul0JHEH3m0W7t6vndg2/PYIqdnc6on6QdA4ecBdl/xBt w22pJqEEnq6gjxJoIqrwCvfN52IY2DHWIgMUz07RNI+PgUPighpxX3Q2o/uNkqLeA5QK QCVwg9tghPKJge1iq+h+n2qR+4A9W5gnp6IuosNQv9Ill2bs5sNScByX/yiScQ1BP+YJ iovA== X-Forwarded-Encrypted: i=1; AJvYcCVhPuYJ4sYkaCvQkfgr5Sl5Kho/LDr56N1NYLboTFSYNuSQtgHh7j1myqW9YtZ1g+xrK7wmWn1PgVjHotg=@vger.kernel.org X-Gm-Message-State: AOJu0Yyiedl2fXB58iybrLzvF6Lw/d6C9fyWf11xWCUu5H5QMCTuDfmW THpjqeT8pk9NQyT6FZQbEQqA5bxXQoVTNK81efkdElZTKHJNqVY9iWka X-Gm-Gg: AZuq6aK5cMjQTNm4j9q1e91vvc4Jjyl+yzS88Z6VGVIGxvE6ZMiHwzxtv0vA4SMtxBq uDCDJ71odVRKOTVD3fUnc6/Zp/0bgeMg6gxvukqkNJIHq3Oo0OXymM5zVb6ZMCTEFYVwLemXdJY pzIq2KJ5ewfDseWl59iUiGD4eMCauYHCl2Jpf0XZDYgeCPoE0Q2Dn8YYYcMPAJiOP/0IG5EK66l xbo4hpekwznBWDZUjTBGb60ej8Pj/PHZcm4Ey6WYkA3GdnZfywJC0+xmtRGYnihWzhvhXkn21J4 1h5UnbcYP3ARqUZOjELu+TZY0zQuRZnZCsWIAh1j7tS5fYqnIvGzi5SwRfJlfPhrseeeVnsbYH/ hu6Xhxm2QBFw9D4bHgAnrnhWeXLNuGln+KgICZKJ3PFMWjQCSjDabihD3qptzVrSinvRA6GF+/S MeZ0VyNEHc3GaM++IxdyxospxmjXCRXOOUkxbCZ8tOhQxUnTE3JL3qJBhPImOR7ezWwwE5WbBLm 8pENrfeKj4= X-Received: by 2002:a05:600c:1da8:b0:480:3a71:92b2 with SMTP id 5b1f17b1804b1-482db498227mr179296045e9.26.1770114611336; Tue, 03 Feb 2026 02:30:11 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:11 -0800 (PST) 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 next 02/12] tools/nolibc/printf: Add buffering to vfprintf() callback. Date: Tue, 3 Feb 2026 10:29:50 +0000 Message-Id: <20260203103000.20206-3-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 Add per-call buffering to the vprintf() callback. While this adds some extra code it will speed things up and makes a massive difference to anyone looking at strace output. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 6c8fa41dbc01..985e10d747db 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -381,15 +381,41 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list return written; } =20 -static int __nolibc_fprintf_cb(void *stream, const char *buf, size_t size) +struct __nolibc_fprintf_cb_state { + FILE *stream; + unsigned int buf_offset; + char buf[128]; +}; + +static int __nolibc_fprintf_cb(void *v_state, const char *buf, size_t size) { - return size ? _fwrite(buf, size, stream) : 0; + struct __nolibc_fprintf_cb_state *state =3D v_state; + unsigned int off =3D state->buf_offset; + + if (off + size > sizeof(state->buf) || buf =3D=3D NULL) { + state->buf_offset =3D 0; + if (off && _fwrite(state->buf, off, state->stream)) + return -1; + if (size > sizeof(state->buf)) + return _fwrite(buf, size, state->stream); + off =3D 0; + } + + if (size) { + state->buf_offset =3D off + size; + memcpy(state->buf + off, buf, size); + } + return 0; } =20 static __attribute__((unused, format(printf, 2, 0))) int vfprintf(FILE *stream, const char *fmt, va_list args) { - return __nolibc_printf(__nolibc_fprintf_cb, stream, fmt, args); + struct __nolibc_fprintf_cb_state state; + + state.stream =3D stream; + state.buf_offset =3D 0; + return __nolibc_printf(__nolibc_fprintf_cb, &state, fmt, args); } =20 static __attribute__((unused, format(printf, 1, 0))) --=20 2.39.5 From nobody Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (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 5EA2D31ED8A for ; Tue, 3 Feb 2026 10:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114614; cv=none; b=g1t1ByKwYhKbMkf4Ylez3wBOp9zte/3BM6eNsmSE+mNcFvPDjyc13T4kYesw2AZJqeTXR2iXxaAM1brAhbn132CEqt4EqsUmzKXS+nga1fWF7aXE2waSnyufysZlzzbjTCWiHIvWO3G/YA5HPR8ED1KTnP4sfOMSZ6I07ZOPNFg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114614; c=relaxed/simple; bh=jcawETE8QcvzGRMU8yPYSZDoDRrefo/HeyOHPunFuhM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LDOiBlvy3p8yD36hY4FxyvUA8PrMxYT31J37mlNOcW9CZzSd1058gedqMrjXp2GcV12OMiLTaBybPc5Jp99CWas+xDtPXZJi816jO7UCCnQyPwsaupU3PFFQdwrVgf1ZItAKriN2xJ08+Z1mZMXI0Mf3nuPDWQtePmjUPQbdZJk= 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=UV3wjU9n; arc=none smtp.client-ip=209.85.221.49 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="UV3wjU9n" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-42fb2314eb0so4444974f8f.2 for ; Tue, 03 Feb 2026 02:30:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114612; x=1770719412; 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=jjMnBQW7i+LTVGCu5MdaTAvxIezekUmwpIZZqmZVH4k=; b=UV3wjU9n6XbelHB7Uj9SPBvqg5blBiCdMuNOGvKvmGjcJqqO7AOfByBlv355j17KZb Z/fp1Q+7wVlYvVJz4tPowW9URQtZEFwWW9Gc3f5kB2QLEuN4sdYyqJkyD70nMxWeTPV8 i9SvTMi33OsT0uuDcsoAA6SMu5wgA6vxvJihPhJsbqFnEfMDDqPfXOn57mG9cqXgtApb ZYZuM1fhBeaKZ0VLF3tSW9g5uOfIcC0Ck1nrh41Ydvw4qyAR6Zk2xQR6GeHLDEvNoCW8 IAYQN1RhNlizoYEtH0yn27yemTzRhudgTKmMAzxHu8jfzt2MP8CnZOFWaSOiDMO8hKjJ LRhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114612; x=1770719412; 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=jjMnBQW7i+LTVGCu5MdaTAvxIezekUmwpIZZqmZVH4k=; b=NOH2xKQiBTEhNLO7tB+2fEYUmZWgXLFdvuTMo2SKJxTdPgFWr8uGl+Z3KSRlGVObf/ vIRd8YjYoazacex+rYfjzhU1GVAIzE49Dw9oVN5Jv3bOAfu0kJItOWOufyvkAOtoDeXA YRYJ8/WOnt7CeD8KoAO8s7ickDT1DY8dzCFXjchwP8uha99JhnGpgUoVdhY06zAqyLsP i1BiTH77LdGixnZJo9pZa/FWGB0iAx59NoLnoJmzbuFx1PtRR5YZXYGZe693GqKRRH/N DaTiwnEYXrPDa9XSntuWn9+c6QBKlWbwQQIiLM9kN774tQCEfLKX98VIH0Sh7HUhtBJF 3avQ== X-Forwarded-Encrypted: i=1; AJvYcCV5mhfyqxop6aoPNsOS9Ksxb9S1oua2t4FZvgKPaEjDjMWCKB0L6NjcV4WC+Vt9sRb9puKNWTVyuY0GKlg=@vger.kernel.org X-Gm-Message-State: AOJu0YxgUQ1S+kvjhzqyYw/oB39oXgITz4Gy68Y+hn1JaSoNhmMnplhx dxUkaB1Gxwdfx1w5fTfG8zqzF0rJs0Dz3qp8hcxpQkfr9Pe6ANJl9+IH X-Gm-Gg: AZuq6aIV2kMwH6CzdkmegK7XdaMuVQ4GefJe4SgaFshQSWKrP1dzIALQDnCwgriu/4V DlQJhUVRGj0Tg9yFHql0bGjDCUBzMhZpmnISrOpJfHxKlmoll2ZfeqIOeOgBEgANrQdgkwz6XLg 3NkKJJF0R7l1A3cofVRB0nd1nnVhnjThhziMy52B9Syvy0OONEF/yA+M6yjsVvncbtSYWQrZvsM M5FO07tkEZarUf+laEfRan9f8f3XcVkdMlkymFwnvt/lsUnA1dDoIXb9CErYpoNnF8eec16Bhdf Wvsg7ZOqnxaYoUSE38/kan0Dw3GhYspqGh3rfels96DSuBFQyNdd2S6PIVO357cWtqPt6ryt9cZ 5LK/Bp3D+CZX6oGYVBiuJSz8keTlbTjUwwxgqiCkyhYRLNLKVK+wnu9Y2dxgW2StQCtLsS+shGt y9gnFw4UyxCTQ81ZzrVerXDEYvlmY50w1G1KCoqAIDdFO5R5kQcCrzx1V4NgkmteUS2kNe9mIB X-Received: by 2002:a5d:5d84:0:b0:432:b951:ea00 with SMTP id ffacd0b85a97d-435f3aacce5mr20862851f8f.51.1770114611740; Tue, 03 Feb 2026 02:30:11 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:11 -0800 (PST) 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 next 03/12] tools/nolibc/printf: output pad spaces in 16 byte chunks Date: Tue, 3 Feb 2026 10:29:51 +0000 Message-Id: <20260203103000.20206-4-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 985e10d747db..52cb516ea3db 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -355,10 +355,12 @@ 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) + while (width > len) { + unsigned int pad_len =3D ((width - len - 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 Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.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 DB846320CBE for ; Tue, 3 Feb 2026 10:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114615; cv=none; b=OyEZrLnJsuoBvPOIJuv8d5zNzSFZtBXPjPjgUjsDPY3zgLGxAvUwLZcwnsVIlfrTgHhYuIKrsU+GDaK3hyvE5JTdA2qL6A1KIuwbrvTSCwWN39hSg3gNTzNcaQC5x7mYB7x/H4L2rw3+AFFsPaKw7HE17jer/ENADmBXSwpMKD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114615; c=relaxed/simple; bh=V5Kgbu8KWduZOz1IPzijcL+R0EtvKaaz5UOiV2qyt+w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KdP+lyzgbo+I5U3ply0jstDByRdFlVLiFyVu0WckIdTBMzVklCDKWEKPCXp4JoyY44qDdVWXCbfF431l7jNyXgbqj422mvVxsUksu9wpMeT1cNyEwTXn5cj0MfZ680YlhplfNIPqkmaoUG4fbBj2aVmQuJsdRUQl9AyiD0vXBis= 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=UEv1R2V9; arc=none smtp.client-ip=209.85.221.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="UEv1R2V9" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-43596062728so371901f8f.1 for ; Tue, 03 Feb 2026 02:30:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114612; x=1770719412; 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=d1YB/VeDMJ7msRHf0d0Q6uzpeZSh9PcvIzZ+rmHr5yE=; b=UEv1R2V9QmzICr7SdqAz3LAd5o5o6mSs2dXI5uvah5If89Q3mWM1xjC2KrCNOzXOfq 91pH9kustCt0VYeKFNC9cKr9LqyPaFwDC0GtzZN0RBP/VuCKdJ9rIg9IrNEAfy9thBr6 EvU+6ze4/vTc/B5pX/GIkOvW8+I72e5XwzCFc53S/Z3cSQjcqYqyNOqF59UEjTS7e6d+ PmJh4TrWzv2f5ImwhETRTIpRtYAXCdOwSJo7emwvTee8RzXQOyrSK4ne4pGeyg34DMy+ GXTmb+qZQ/kdm0sANITJ3PhnWH3ikBf91lUsndsbPKX8yBzVZm8NOMp/sU5QNpr7nC5d zJjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114612; x=1770719412; 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=d1YB/VeDMJ7msRHf0d0Q6uzpeZSh9PcvIzZ+rmHr5yE=; b=IcNMLRXCh9MO7qg/Tax77o/v1gF+7XsD67qWgM/xiRCUR63iEuBnlFROkelZOxpwSk jDH740hMCu3SNLrcTS4PFD+evu/5AsEpQSWV1Xiv7s0A/2yZ5LDWuOuKAJTORQfR7PH/ 9bWE8JJNsgU3U6Mj9fe5vDz4OdeHUxkmTx8FIwQHVxgOh4Oz0zTMUOpJASfriv4Ddntk vxIEqqfCGbCxlgnRRkKzzyYIyxicEC+Zg4oopmTWshJTNAiFM4Oo3e16feqfvnzMiDik dysOSlP/RHLwdvroz4FchvdVBY2o7x02Ss8aF1LCBUwCj0b7lMjaKrEXptlq730FuAcA fQlg== X-Forwarded-Encrypted: i=1; AJvYcCWhc4BaqsKfKRn18C82WTRQyZ/oz9kEdy+a2jvWZTNCcNjSyRSZ7ok6V7gyUmRHk5hwftv2+c8PF18yl50=@vger.kernel.org X-Gm-Message-State: AOJu0YwNoCCy/qrjUPK8RPWatG8XNjW/OoU4TL5pf+IiZ1jMuf3Rrqgw H+ySmPdgajCQxMJuOIojNzqEsYJPZySOTN+hdywQFaqj5BjuYVXRHsD5gwPHQQ== X-Gm-Gg: AZuq6aJNEIl/A8UEzt77nhWx8YaqWO0kzan14S5Acpucjl6DSDBjg81lDB9424TKJ/i RhaidZ/ewYK/jw28qokHy+I3ZnbOIrkfqxClZ1Jcj5hHnVWF2fO0NVFdlTUSuHngJL8ZtsGRaoc 9osfl9g5GnYddkPUNdW9RbrfeJWUqvV/XIco8zfwGhKKk5S/5yz+yefKWgwB2LWA91FxW//avY3 mibpff4Vcj93rY2m/PEhUMFyC2M5S3/1JvBwMolj4gdDJZeBE9mhbnLJHWgT88wNDLs74WpBXJP DeR+WIFU0vh03XlFDGVMkFwjNfsOXBx6jLXXPFQ98/OT7P6toiSMeNoMzgbHANn6yMDXRyKC8J/ V518IY6Pnr6XGgSBuKpROr9NlcsEXpQXd83ut4602tIf99YHtwX95EizJeZVm3iq4a2/k1MHo/Q zUkvDiosOC27h+er8FTGZSYRkR62y69aRS3zMo9oZMH0zaYIDtHJwONN2PU8XFvBCyT4skk6s9 X-Received: by 2002:a05:6000:2284:b0:435:9635:2943 with SMTP id ffacd0b85a97d-436114218eamr4682445f8f.17.1770114612162; Tue, 03 Feb 2026 02:30:12 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:11 -0800 (PST) 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 next 04/12] selftests/nolibc: Improve reporting of vfprintf() errors Date: Tue, 3 Feb 2026 10:29:52 +0000 Message-Id: <20260203103000.20206-5-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 Check the string matches before checking the returned length. Only print the string once when it matches. Normally the length is that of the expected string, make it easier to write tests by treating a length of zero as being that of the expected output. Additionally check that nothing beyond the end is written. Signed-off-by: David Laight --- tools/testing/selftests/nolibc/nolibc-test.c | 27 ++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 3c5a226dad3a..9378a1f26c34 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1567,28 +1567,45 @@ int run_stdlib(int min, int max) =20 static int expect_vfprintf(int llen, int c, const char *expected, const ch= ar *fmt, ...) { + unsigned int i; char buf[100]; va_list args; ssize_t w; int ret; =20 + for (i =3D 0; i < sizeof(buf); i++) + buf[i] =3D i; =20 va_start(args, fmt); - /* Only allow writing 21 bytes, to test truncation */ + /* Only allow writing 20 bytes, to test truncation */ w =3D vsnprintf(buf, 21, fmt, args); va_end(args); =20 + llen +=3D printf(" \"%s\"", buf); + ret =3D strcmp(expected, buf); + if (ret) { + llen +=3D printf(" should be \"%s\"", expected); + result(llen, FAIL); + return 1; + } + if (!c) + c =3D strlen(expected); if (w !=3D c) { llen +=3D printf(" written(%d) !=3D %d", (int)w, c); result(llen, FAIL); return 1; } =20 - llen +=3D printf(" \"%s\" =3D \"%s\"", expected, buf); - ret =3D strncmp(expected, buf, c); + for (i =3D c + 1; i < sizeof(buf); i++) { + if (buf[i] - i) { + llen +=3D printf(" overwrote buf[%d] with 0x%x", i, buf[i]); + result(llen, FAIL); + return 1; + } + } =20 - result(llen, ret ? FAIL : OK); - return ret; + result(llen, OK); + return 0; } =20 static int test_scanf(void) --=20 2.39.5 From nobody Sun Feb 8 01:30:50 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 64B6A329378 for ; Tue, 3 Feb 2026 10:30:14 +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=1770114616; cv=none; b=r6e9IbMSDonCo5ReeLiK7B4T2rP7/mrT5dHYiRPENlI6EhDTJjkSEb5dFMW/TCKe7tEX+f4yy0y7npfdW7XxwumAzMuUn3TOIf3iu5rbLzNh3sFC4BEGbSqLSgihfND2W9/cMnn7wuYauxgEP6n7BfWCRPDjoY15M6HkFW6r4HE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114616; c=relaxed/simple; bh=pY6QLuTb6W+U1hT+gHDfF907P5ccENx8g8w9kJbBkpA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RdYf654oTZCgFw6zXKYDvbCeYYMuHbS2tq14qJ2TWAD1n6NMznbDdFi6oWVA5pUjsCDfjBiwloUkw7GKjDd/pu2axTTyL51vj+pOJSp9yV1GWZnBuRrK8WlM3R8UfubU+3K6S5oeewmaWlz4S08W4a6GUT8AWUe6yt7VyEvquGY= 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=YA1aMHZa; 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="YA1aMHZa" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4801bc32725so41733345e9.0 for ; Tue, 03 Feb 2026 02:30:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114613; x=1770719413; 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=7iDeq5WaIax/ojpbnczyOMmbdNehWZNWQp2thw5Kwn4=; b=YA1aMHZan2LBaDtohx6WBk4v6me6aXMSqSX2Af2VG1HrMhkEfc6m0zE0Ntf9lU0Hdc szVHnw/05+M4qhXPDU7VMVVwPBp6mZo+zckzIJgLU1q1pbhOfpcgxgcsQdIGxBSFY2fG KC5ciFMnQtdkH+7v0xhGMwOX8vYHs7NI3NFjAKzjCtuHn8pkzxk6hlBEo1Rk5/n4RHwa twZrywpbNb9OXooJTLrMdT1rYhMywBqOSMvxIZtWF0vBOfjfJYO35a/jANAzhHSQs9GH qYujrZWsE/9f3q8EgiTiOzfIa2fhDMmhlnJV6gJ2Dw97nRb9e+WSKwDQEcpxtO1o5CJL Xj+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114613; x=1770719413; 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=7iDeq5WaIax/ojpbnczyOMmbdNehWZNWQp2thw5Kwn4=; b=c1dkOAhQaivHxUiYVfG3RHVU6u1rl1VroP7JFJHbw4qh8dskLiIjMengm5d+hZHURK eOAxYfwEiTvd+66M4eoAuZp/BHIaNwvE9ZvYMlHFtZpV8Hgq/i7PhmrzTL3sWZiUP3Zs E96yV+Img5kWokPjounpIUJYqrtNqWDCeMNirmfFqP23BvXsY6v4Dd//Rc9pxNAcjdF/ kBnGZKkT5fysZtlcmiXDqCBCBcXjYJ6W00h/KctWWJ2dI6n6v8awyirMub7HFUTVVWC3 usFybonr8pRmryyKJuDHeUpOHkAKs+8Ad1L0fNv2LnKD53tKpKT3ngwnHHmFdMEdWSxH +N5A== X-Forwarded-Encrypted: i=1; AJvYcCUc22yMUf6TEbV6wCUTF8S+8YNfhmrl7DKVHBnxet1etQ2542rY2pzY3OSTwHL1CZSs1IWs9FQos7seTqA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxi6mVTMDo+lOacwrbm3XlxcVHFeNCtLv8Eou9UzxDNaFzN50Wy DTlkd7chWRfTzh942C7fOQSAj9/Wbch9PPPDTN7B/D8DUfs1m+b/+d6ojWDhVQ== X-Gm-Gg: AZuq6aIH56P+4j4c0ahMvAV4XPJm4cDV80Gj5h9HYrzJre/SUGn37a4F5Azf/rXuL1r b7utoAsIlJoLcnVOXxvsQUXkvmQqHBcS26sSmhXIwtf5GJo2ifZw6mCkZ2YAYhFOkRruiNl45vI LQFGmkPdZn+qVL5ufkd7JVDtSw5SIP3tSlAp65LT4jLrE4OiCr4jx3mTIU44Etqs01fpghgJpjl CcHvgOM1KdWwJjTLisrdsjloOS2NaS4LnwysYrodppYw1CLK/sAReOesEU/aT1nYBJ+RX3fEFfE dBjlJCknnSTE4fbcItxiEZvOHsACv/AF0zqV1HKXftXuPPeVpsn60BEpig7CILPJabr1D6xLdnq UrF6719oN3pR0FRcjY/wCfpXqoOMtb68iBll6d8W3ZqInPsuOA/Bz2LLo14hH10Kid4l3zZICpw M+jpWD12TvBZT4KcPmMEkRpYhjs7en2Okojv7cJDlyAlZy3CmjcHi6HkS/y6LQiAyEsMzRLdUB X-Received: by 2002:a05:600c:4684:b0:47e:e946:3a57 with SMTP id 5b1f17b1804b1-482db4b4f5dmr172450175e9.36.1770114612635; Tue, 03 Feb 2026 02:30:12 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:12 -0800 (PST) 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 next 05/12] tools/nolibc/printf: Simplify __nolibc_printf() Date: Tue, 3 Feb 2026 10:29:53 +0000 Message-Id: <20260203103000.20206-6-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 100 +++++++++++++++++------------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 52cb516ea3db..164d2384978e 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -250,28 +250,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, c; + char lpref, c; unsigned long long v; unsigned int written, width; - size_t len, ofs; + size_t len; char tmpbuf[21]; const char *outstr; =20 - written =3D ofs =3D escape =3D lpref =3D 0; + written =3D 0; while (1) { - c =3D fmt[ofs++]; + outstr =3D fmt; + c =3D *fmt++; + if (!c) + break; + width =3D 0; + if (c !=3D '%') { + while (*fmt && *fmt !=3D '%') + fmt++; + 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; + c =3D *fmt++; =20 /* width */ while (c >=3D '0' && c <=3D '9') { width *=3D 10; width +=3D c - '0'; =20 - c =3D fmt[ofs++]; + c =3D *fmt++; + } + + /* Length modifiers */ + if (c =3D=3D 'l') { + lpref =3D 1; + c =3D *fmt++; + if (c =3D=3D 'l') { + lpref =3D 2; + c =3D *fmt++; + } + } else if (c =3D=3D 'j') { + /* intmax_t is long long */ + lpref =3D 2; + c =3D *fmt++; + } else { + lpref =3D 0; } =20 if (c =3D=3D 'c' || c =3D=3D 'd' || c =3D=3D 'u' || c =3D=3D 'x' || c = =3D=3D 'p') { @@ -327,54 +351,30 @@ 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 (c =3D=3D '%') { - /* queue it verbatim */ - continue; - } - else { - /* modifiers or final 0 */ - if (c =3D=3D 'l') { - /* long format prefix, maintain the escape */ - lpref++; - } else if (c =3D=3D 'j') { - lpref =3D 2; - } - escape =3D 1; - goto do_escape; + } else { + if (c !=3D '%') + /* Invalid format, output the format string */ + fmt =3D outstr + 1; + /* %% 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 (c =3D=3D 0 || c =3D=3D '%') { - /* flush pending data on escape or end */ - escape =3D 1; - lpref =3D 0; - outstr =3D fmt; - len =3D ofs - 1; - flush_str: - while (width > len) { - unsigned int pad_len =3D ((width - len - 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 (c =3D=3D 0) - break; - fmt +=3D ofs; - ofs =3D 0; - continue; + while (width > len) { + unsigned int pad_len =3D ((width - len - 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 if (cb(state, NULL, 0) !=3D 0) --=20 2.39.5 From nobody Sun Feb 8 01:30:50 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 B5EC832E72C for ; Tue, 3 Feb 2026 10:30:14 +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=1770114616; cv=none; b=Fr4t/u88v08Nm6BJo7xt41l3SN8/lDE1/MiC2zJTvI7yvwp0plsaoyVdtaZ+5dT/P7AHTRW4cclowSZuygiig8dJEcsWwpBhZShZdlfjW9R684WvO1mH/hbf4P9eSnuhCoi7pyVj/Oy7SEKPCkShOhIV3DI0qIy3Ny0QFJW1uxU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114616; c=relaxed/simple; bh=4jetbA/VxAZeSNU7MMJqqCXP0XvvvWVVTgPuEqk5rMk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PRcbiT6/ja6AIWlSne3Bo3ksaoUTrB7guABwtrcyvToWAWDUVrC3MwGwg7nDS0MF4CQ0j3HI4WYuGyP3T1N07R/tJ8YagWk5LHjC1/bCUQCH2prT1ESAAebbWh2GgWTXVFpb9C+cN0qOVBby0buPWaGKh45TVB4uwos/65HJ7sU= 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=k7N1cHjm; 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="k7N1cHjm" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-47ee2715254so29369215e9.3 for ; Tue, 03 Feb 2026 02:30:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114613; x=1770719413; 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=wFeIp1vF1JyAtC2s6vug6Vrx9pGp1vtozQFiewIAUGg=; b=k7N1cHjmXonB/ojY1eOeKwnIzHcjpUjBIaQXtBEjIw2ah9RgYZpRyCBquDYLJf7x3X qY7+k81P3nQYcXRTveBNBNDEfK+utj4KymrgU12+Ju1j3c08rOq/yDC4x26i3eU+sfOq 7lTkK4ee215J5CMgJ7NwudKa2Yu8278oT6Wx3f/Epc1QoqhL7UaJb/vPyYD9L5YxbvT+ QPlq7SgnHglBDu8H3QjmWYj+KOm+VdFDGCTfxdgrn5Z8/H5FJav1kWs5gBqLqDdiIjej xGS2n1eC31Qu4ym56g4DNfAO587m1qmWdMFcw+20CTYGx559Ohz5/ly2O3CnYj27GuZh lyPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114613; x=1770719413; 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=wFeIp1vF1JyAtC2s6vug6Vrx9pGp1vtozQFiewIAUGg=; b=IW+htC9iUnUiu476ZVj7G/GP5hrTvLcIdhNp+2Xg1uawuZLXou1ngw0jWz4mX0Tyw/ 31XpV0KwHk4Ou3adHXDjLWKVvdUUmJOyBxCYC3Tt7UTXsGe3BYMHh08YWna8vDT2aFmh LoP0Ky8/O2DVFgO8RggGvEo3qkDaMDuErNcFrn9VQ2ITbyBnWGuB1i8fim0Odq9pIArJ SDH36WFEfc77uI/m29nX+loM2afk8yhYYAJO5rUQTaXotgqJwkmMSYKWOqUn50g4LK56 YdZYvWLU1BSRQDDSB14DhuRJFAngzLmWb4xiIvHyi2zVPSRtTxGVRQwlf4wSeIIHjJRa 35Fw== X-Forwarded-Encrypted: i=1; AJvYcCVS7QdvJvwasNz27pOcVD705V++DmKw/Ww5D1yZzlkkqujGtFXiKXc0wfXNtuu8heYIxVOn0atooH0hSv4=@vger.kernel.org X-Gm-Message-State: AOJu0Yxw6LcWril9piQYZZk5uIoPC/ZAzJtNMwQL/OKYrtGDWW5k79Wv vHMlwDfboDsBxQM1sL4Pi37sRuFAC8KHbOicmZ0SM/7kb+aR+2yJX1Nl X-Gm-Gg: AZuq6aIdie61UPpOsS8qy96DUps6uQpBkZdxkBI/0yWBF+W6EiB0shos28oXehapYB6 DsQgC0SUc3PGDjU+Sqd5snYwjsmVcb+fO52AUtYSHzhJvCBim2gnuqG8zCLe7urV71pgQoUXx79 MclkSYYRvzXVGMeVejbsTkXCG94B9MGteFyQSQLRq3FMrGtQ/qdhAqC9fUrYUNeioU+xN+mxoEV 2K/+J6dLVlhUR3gwvAgYcGAOVI1mP+fKN7pCA4t0zHDY/frHH/LYTkLMPq7tGmd8y58VrwaabrY THO2vOi/zO2czMN0r/b3gMV56AxdbnXeTaQ7rnThw+b0wqQr0NL//8gZRMCkRT9pt9d/MniaihP Gufx5LgfstlBnQ+WrR49saRGFhkmGMA70e6aLz7lLuxAXvUs9zRsu6PCDBvKsCvWxTATYN4jOxb AErQsqaHddpZGqcSeVxMtrfqXxjZ1lMIoNXVdBgVaj6c+eSZOl/OY09wOIEKJ/AQWgA4eGrVtM X-Received: by 2002:a05:6000:1a8d:b0:435:db9b:5883 with SMTP id ffacd0b85a97d-435f3a820f0mr19870798f8f.2.1770114613062; Tue, 03 Feb 2026 02:30:13 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:12 -0800 (PST) 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 next 06/12] tools/nolibc/printf: Add support for left alignment and %[tzLq]d" Date: Tue, 3 Feb 2026 10:29:54 +0000 Message-Id: <20260203103000.20206-7-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 a single 'flags' variable to hold both format flags and length modifier= s. Use (1u << (c & 31)) for the flag bits to reduce code complexity. Add support for left justifying fields. Add support for length modifiers 't' and 'z' (both long) and 'q' and 'L' (both long long). Unconditionall generate the signed values (for %d) to remove a second set of checks for the size. Use 'signed int' for the lengths to make the pad test simpler. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 88 ++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 164d2384978e..1ce4d357a802 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -240,20 +240,20 @@ char *fgets(char *s, int size, FILE *stream) } =20 =20 -/* minimal printf(). It supports the following formats: - * - %[l*]{d,u,c,x,p} - * - %s - * - unknown modifiers are ignored. +/* simple printf(). It supports the following formats: + * - %[-][width][{l,t,z,ll,L,j,q}]{d,u,c,x,p,s,m} + * - %% + * - invalid formats are copied to the output buffer */ typedef int (*__nolibc_printf_cb)(void *state, const char *buf, size_t siz= e); =20 +#define __PF_FLAG(c) (1u << ((c) & 0x1f)) 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, c; - unsigned long long v; - unsigned int written, width; - size_t len; + char c; + int len, written, width; + unsigned int flags; char tmpbuf[21]; const char *outstr; =20 @@ -265,6 +265,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list break; =20 width =3D 0; + flags =3D 0; if (c !=3D '%') { while (*fmt && *fmt !=3D '%') fmt++; @@ -274,6 +275,13 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list =20 c =3D *fmt++; =20 + /* Flag characters */ + for (; c >=3D 0x20 && c <=3D 0x3f; c =3D *fmt++) { + if ((__PF_FLAG(c) & (__PF_FLAG('-'))) =3D=3D 0) + break; + flags |=3D __PF_FLAG(c); + } + /* width */ while (c >=3D '0' && c <=3D '9') { width *=3D 10; @@ -282,41 +290,34 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list c =3D *fmt++; } =20 - /* Length modifiers */ - if (c =3D=3D 'l') { - lpref =3D 1; - c =3D *fmt++; - if (c =3D=3D 'l') { - lpref =3D 2; + /* Length modifiers are lower case except 'L' which is the same a 'q' */ + if ((c >=3D 'a' && c <=3D 'z') || (c =3D=3D 'L' && (c =3D 'q'))) { + if (__PF_FLAG(c) & (__PF_FLAG('l') | __PF_FLAG('t') | __PF_FLAG('z') | + __PF_FLAG('j') | __PF_FLAG('q'))) { + if (c =3D=3D 'l' && fmt[0] =3D=3D 'l') { + fmt++; + c =3D 'q'; + } + /* These all miss "# -0+" */ + flags |=3D __PF_FLAG(c); c =3D *fmt++; } - } else if (c =3D=3D 'j') { - /* intmax_t is long long */ - lpref =3D 2; - c =3D *fmt++; - } else { - lpref =3D 0; } =20 if (c =3D=3D 'c' || c =3D=3D 'd' || c =3D=3D 'u' || c =3D=3D 'x' || c = =3D=3D 'p') { + unsigned long long v; + long long signed_v; char *out =3D tmpbuf; =20 - if (c =3D=3D 'p') + if ((c =3D=3D 'p') || (flags & (__PF_FLAG('l') | __PF_FLAG('t') | __PF= _FLAG('z')))) { 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 (flags & (__PF_FLAG('j') | __PF_FLAG('q'))) { + v =3D va_arg(args, unsigned long long); + signed_v =3D v; + } else { v =3D va_arg(args, unsigned int); - - if (c =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; + signed_v =3D (int)v; } =20 switch (c) { @@ -325,7 +326,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list out[1] =3D 0; break; case 'd': - i64toa_r(v, out); + i64toa_r(signed_v, out); break; case 'u': u64toa_r(v, out); @@ -366,14 +367,24 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list =20 written +=3D len; =20 - while (width > len) { - unsigned int pad_len =3D ((width - len - 1) & 15) + 1; + /* An OPTIMIZER_HIDE_VAR() seems to stop gcc back-merging = this + * code into one of the conditionals above. + */ + __asm__ volatile("" : "=3Dr"(len) : "0"(len)); + + /* Output 'left pad', 'value' then 'right pad'. */ + flags &=3D __PF_FLAG('-'); + width -=3D len; + if (flags && cb(state, outstr, len) !=3D 0) + return -1; + while (width > 0) { + 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) + if (!flags && cb(state, outstr, len) !=3D 0) return -1; } =20 @@ -382,6 +393,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list =20 return written; } +#undef _PF_FLAG =20 struct __nolibc_fprintf_cb_state { FILE *stream; --=20 2.39.5 From nobody Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.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 86F053161B7 for ; Tue, 3 Feb 2026 10:30:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114617; cv=none; b=Ii9+0ZEr2f/jEMy/1td4y99fHKdv/oEsr2AmGtV4oeoYen698qiwRW7XM6tm+da+ForEs1BFZlNRScxkREFjf5yddjJLkBWS7FCHiDamdhYZSqUnmog1qsduPrR0U+wTsh+cGEuRh0AXE0tNMCyIwzNJWSyBV0up2QIs7uGle+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114617; c=relaxed/simple; bh=g8FrJ6NJb6AjcSuOiYC6P1trEyYgSXg8wpn+F0rtBWs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=q7g7lGUE40aSVoI2Lo5qlkl65pRZ5V8Iw3vPoPEyz/HiKbeAAWsp0XIMYL5GEGjwJTp1J155Y/VJAJnKC9q193asn5Jz+H0XJs5kuAwlwg1mBKKgFf/R8xggxPEnqB8tYySM0Lm9mLwL3GKuFvu2ZrP58iTLddjnwKoCs+GyrJM= 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=O1062QKa; arc=none smtp.client-ip=209.85.221.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="O1062QKa" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-435a11957f6so4237404f8f.0 for ; Tue, 03 Feb 2026 02:30:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114614; x=1770719414; 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=dYUj2waGe1QmChrS+uH0vzofAtMYKXD/E3j6y4nI4Z8=; b=O1062QKaq+v1CaMOTxuPv524NeIPAgIcTxep9JfwqaOMCFqQSqoOAViusCNGJdV3bB 5azUN+gNwXGrG4XhJ/pnaina4g77V+PpnMMTH2uPrTKQX1vx7l164Oc3pvKI4leWlnmt VNgke23DsI2BdE7qK5dO0AvlNPds0ymmTOckwWoCsr6oXANYMrIh34fwoDae6Vy81j+v ny4p+h8TLH9O38My5fUZd9TYAX6qr3T296kPVXiGjkCNit8xfPPnhvUtM/QTUzoJ7qDe dqBx0On9eqh3SpV8h/4NzWIOAiMuY+nIXirfhnR/B9SvS+maVLbWJRvavMA1Jk7pD3z5 P48w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114614; x=1770719414; 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=dYUj2waGe1QmChrS+uH0vzofAtMYKXD/E3j6y4nI4Z8=; b=NWPaSyoXN6HD+ahkZJOlv7zYHWqUOzCY+ZLlgFmg/blJGcc34TntHXNjVaqym+Ejhy 6VELNaOc84aUaeSMtYJZWxiGc7n4fVr1O4KzR2HmHw7hAFXaHy9rs7ZqZ0oGYrXMjRcO cUqQCXhR3HUg3hYDHsuxvsRFDAdCaZJN4XCg4aeh6hsKCuSkFYocmdqBcMdQECUY0RTF LXqEPT9esQ5mArBoNNCYnogiSQzRAKO2wyVBZNY0atlQNEFAKFYErdLtu8hXZ5bnVBZE xky8zMW7cndBAcuWHAoNLBxGG6MhNc/HXgZg8au9NoVdjeeteLmiavP+dScb1k6Cvpla RxoA== X-Forwarded-Encrypted: i=1; AJvYcCXySz1iRzl8DXdTtF3I13TtQwgDIacSG3DcPzwOejnNCTaanTv8P1Retoa5AqiQgt474nW3mWcf8k/5wh0=@vger.kernel.org X-Gm-Message-State: AOJu0YwKbrF5KQ2CS4CMmvfTfsssZyI6YtD073XY16wcH9nnCrxW2a9w 3uFZ3D+uCDrrxhhasts8dbLOXEItwTBqqQ1Rrrzs2IBJ7Ag4ge8HJl87 X-Gm-Gg: AZuq6aLzOQ8aWC/frpcN0eeqegJ19rd1irb1DlPkOPsMxBlf3FYUY27Xd5MTW6+12mp UWyoIgsAP9g/NJN+ksvnynLjXDjHOf55UE+ZaCSB1zk9B1l7vVWGpIT5mmm7LLH90p+4kFgKHbV rtVbalDBv+4fgqHKETeXrwBSTJ169w+F3LY1YZzbtkf/gLgiY3zk9TPfBRAdzMKiDN32FJ/KI57 FlmfKmpo/w17Nh3gbD2E08EVqDUR1804A6D5AALDOeBjJva0dQznfU5Pp4/NMKGz6BUu79KcvsZ pYe4ZKalppZz/+vCuKTMyoZBsvJaRp8xgNwedoG1zF13uS96YfiqDX/1QOft9Nt2NlMHLHly/6O GkgJNwOPV3rWde3S9XjBMg9cg4RBgOVZ1CldiUjNJPvHNalAUW4UY8IrNfFUn0/Yv82EMabFze6 iGtBh6jpefprubtCbziX3FLOSr49mXz3EEEPfZu9h4nKDh53jN/I9rDM6KZFm/YAqPOsyI/RRH3 fFQvC0MEG4= X-Received: by 2002:a05:6000:2c01:b0:435:a0ca:bdce with SMTP id ffacd0b85a97d-435f3aba7ecmr22579837f8f.63.1770114613615; Tue, 03 Feb 2026 02:30:13 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:13 -0800 (PST) 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 next 07/12] tools/nolibc/printf: Prepend the sign after a numeric conversion Date: Tue, 3 Feb 2026 10:29:55 +0000 Message-Id: <20260203103000.20206-8-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 so that zero can be correctly padded. Add support for the "+ " modifiers for non-negative integers. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 37 ++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 1ce4d357a802..e4792625c1ec 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -241,7 +241,7 @@ char *fgets(char *s, int size, FILE *stream) =20 =20 /* simple printf(). It supports the following formats: - * - %[-][width][{l,t,z,ll,L,j,q}]{d,u,c,x,p,s,m} + * - %[-+ ][width][{l,t,z,ll,L,j,q}]{d,u,c,x,p,s,m} * - %% * - invalid formats are copied to the output buffer */ @@ -254,7 +254,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list char c; int len, written, width; unsigned int flags; - char tmpbuf[21]; + char tmpbuf[64]; const char *outstr; =20 written =3D 0; @@ -277,7 +277,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list =20 /* Flag characters */ for (; c >=3D 0x20 && c <=3D 0x3f; c =3D *fmt++) { - if ((__PF_FLAG(c) & (__PF_FLAG('-'))) =3D=3D 0) + if ((__PF_FLAG(c) & (__PF_FLAG('-') | __PF_FLAG(' ') | __PF_FLAG('+'))= ) =3D=3D 0) break; flags |=3D __PF_FLAG(c); } @@ -307,7 +307,8 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list if (c =3D=3D 'c' || c =3D=3D 'd' || c =3D=3D 'u' || c =3D=3D 'x' || c = =3D=3D 'p') { unsigned long long v; long long signed_v; - char *out =3D tmpbuf; + char *out =3D tmpbuf + 32; + int sign =3D 0; =20 if ((c =3D=3D 'p') || (flags & (__PF_FLAG('l') | __PF_FLAG('t') | __PF= _FLAG('z')))) { v =3D va_arg(args, unsigned long); @@ -322,24 +323,35 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list =20 switch (c) { case 'c': - out[0] =3D v; - out[1] =3D 0; - break; + tmpbuf[0] =3D v; + len =3D 1; + outstr =3D tmpbuf; + goto do_output; case 'd': - i64toa_r(signed_v, out); - break; + if (signed_v < 0) { + sign =3D '-'; + v =3D -(signed_v + 1); + v++; + } else if (flags & __PF_FLAG('+')) { + sign =3D '+'; + } else if (flags & __PF_FLAG(' ')) { + sign =3D ' '; + } + __nolibc_fallthrough; case 'u': u64toa_r(v, out); break; case 'p': - *(out++) =3D '0'; - *(out++) =3D 'x'; + sign =3D 'x' | '0' << 8; __nolibc_fallthrough; default: /* 'x' and 'p' above */ u64toh_r(v, out); break; } - outstr =3D tmpbuf; + for (; sign; sign >>=3D 8) { + *--out =3D sign; + } + outstr =3D out; } else if (c =3D=3D 's') { outstr =3D va_arg(args, char *); @@ -365,6 +377,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list len =3D strlen(outstr); } =20 +do_output: written +=3D len; =20 /* An OPTIMIZER_HIDE_VAR() seems to stop gcc back-merging = this --=20 2.39.5 From nobody Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.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 AE42B31ED7D for ; Tue, 3 Feb 2026 10:30:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114617; cv=none; b=Xv5g9fbdmBIZL487WehksqRi7+aedreTKHt/nR6eHWpYvOy9BkUuk4sVXJdfDbBpFBoi8WhDic3kGw/akAwOk/cdVq7f+XWYoHnDdxOjuVOH5pSRl5Gi94os4Xi7ByKI9pHpVr6wzNnhysQC5TkeOhzYx1q4RgPItPUqklKM3aQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114617; c=relaxed/simple; bh=PGPm65/1UoWH1nmCQlgvw2dZ1rdGkvTiai0BhRjA6Es=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HeFb7zYxWUS9uIrmJnZA3D2HM+Rb4OWebTzt9PEZwtDTD2n9JTEg7wxjw2ZkfACORmXN9LLmm1lcPcIn9JmxO3txiJnoGKlX+BGMS5kJtxdYLlIM6hTz0KTWOgZvjMjFNImlkzG2AxaBvJTZXYppB1VJAdOdn6HU9aR6xC2tTy0= 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=DCGwot6E; arc=none smtp.client-ip=209.85.221.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="DCGwot6E" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-42fbbc3df8fso4200800f8f.2 for ; Tue, 03 Feb 2026 02:30:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114614; x=1770719414; 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=APMPpqUZiaMbLSbT7dc83L/LEfHonfnk3WgoEj+uSkk=; b=DCGwot6EEIvgOOykns73Qqqx6IBGg9yELtq/x0b47evrL/S0Sld1mEsoUntrPSXolC zknk2fng2Vb7TXliSZL9kV+PCKEVXM2lZaPTf1igNfGf1Yh+rI7ZsneK3RT82aXRLxw7 mWELb24L2hBwt1Nl7Yb3ZKhqQCVGgszeBDnF4o7BOMzP3JXTuW3gmqrsQ9OI3qEPLFUl JvycXOQYDor4Qp9X2o7UW4falzHdS2fISDyScGSIA9rrVE5TDSQb8/VCjbriNZbdwbcV 5oSKHfmsY93DAOKkqLMyZVeAvHoGYMtMF/P7MC5iJXRY9FFuRbJInrElyHjc7AttEaCt uIIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114614; x=1770719414; 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=APMPpqUZiaMbLSbT7dc83L/LEfHonfnk3WgoEj+uSkk=; b=OAmd5wwboMipfSAWpXFN6BAH1gkQWAQKdZLcBeZjYeevV83bGe1hBeJmHl2f3zwIVr wjRir4mdW9ArDUXRrJscndsrSO85P8SZB7RsH1qQIQunYGSfcAAX6F/wtmdO9UwX3eQt HrVr7IkKEbRxa6TKkZ3iJy11n46/O1BCB7mpc26qp2CXLIzNi98pHtzWCpiwlEd45XpE aqcW3XtxxBpYQeY4zsOyKOFQZpnDApT42E0D+6CG1ovLsKLTE9S1ZdF2uxu9nM+1Ne4i Ts809toIYaAgyvYl+78Bsw8eir2EHUEXlVPEc3CyvZm1MkH/BrNGZ0WvGVIwo6w6eqk6 /NCw== X-Forwarded-Encrypted: i=1; AJvYcCX3tvUPxb+vngOlY1+wLGW9CD6oty/DOVPD3aExcFyS9o0h7ptW/+wALUxrB3QNCHayCQdTu4MwvKIgdc4=@vger.kernel.org X-Gm-Message-State: AOJu0YygGrpJENR8dAHQArnkrWRiAiqAjYQu8aXmmbkFz2wurFCocNtk hJ/q4RLkYk1Jt8KdwiVkhyOCmjgIzaE2+pDmqvfGANOkmwouKyFARem0 X-Gm-Gg: AZuq6aKTcLiLoJkxPSw/HaOd/7SFOWnSDhiqF3hYNiB6OlHWt3mA14cgU/3jEFNVKil WdmGTF6O7myP6mn4qb+lORGxKd1a9gBR//H1I3L3B1EJn853TUohN3itAKrukCrSIirHardXZ+y cpspKUQOEeNugT2jfI5uUNKGLaWTfJAAWi+y9mw9yJ1LtdEMQfKsp/ZBvLRJbWHBppMmCEWBZI/ TIon4PgHBp7MW29ZlKNS1V0xSaR0tpgFaRQ0uGHdU5xHfz1qVbnM79TLKQ4YAzObCNTD30/DEbR xrytnJWflG7owKqy+IKfcNTbZDN2rhE0IiKSqTD1GZsVNhnckbbKPxrryI26Yl/lEBhIABrNuIK i0PiI9SfEsWZlK6grkB/PeJr7c43pwe2N/OoFcG5UXnaZcEb2siGZ71z0XfNaJRFbMFYZfMzJG6 w/QcPVUSysPQe1bpVwmjSDS0XGpFv7OG/70wk/YXo6faPhPjBfhbCJCQTi9BmD/gFq00AThEAF X-Received: by 2002:a05:6000:2883:b0:430:f742:fbb4 with SMTP id ffacd0b85a97d-435f3aaea5bmr21679211f8f.43.1770114614087; Tue, 03 Feb 2026 02:30:14 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:13 -0800 (PST) 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 next 08/12] tools/nolibc/printf: use bit-match to detect valid conversion characters Date: Tue, 3 Feb 2026 10:29:56 +0000 Message-Id: <20260203103000.20206-9-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 %s inside the numeric block to optimise away one va_arg() call. Add support for %i, an alias for %d. Add support for %X, as an alias for %x (works but lower case A..F). Use the length returned by u64toa_r() to avoid strlen() for everything except %s and %m. Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 44 +++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index e4792625c1ec..d8b6184ff0f3 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -241,7 +241,7 @@ char *fgets(char *s, int size, FILE *stream) =20 =20 /* simple printf(). It supports the following formats: - * - %[-+ ][width][{l,t,z,ll,L,j,q}]{d,u,c,x,p,s,m} + * - %[-+ ][width][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m} * - %% * - invalid formats are copied to the output buffer */ @@ -254,7 +254,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list char c; int len, written, width; unsigned int flags; - char tmpbuf[64]; + char tmpbuf[32 + 24]; const char *outstr; =20 written =3D 0; @@ -304,13 +304,21 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } } =20 - if (c =3D=3D 'c' || c =3D=3D 'd' || c =3D=3D 'u' || c =3D=3D 'x' || c = =3D=3D 'p') { + /* Conversion specifiers are lower case except 'X' treated as 'x' */ + if (!((c >=3D 'a' && c <=3D 'z') || (c =3D=3D 'X' && (c =3D 'x')))) + goto bad_conversion_specifier; + + /* Conversion specifiers */ + if (__PF_FLAG(c) & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | = __PF_FLAG('u') | + __PF_FLAG('x') | __PF_FLAG('p') | __PF_FLAG('s'))) { unsigned long long v; long long signed_v; char *out =3D tmpbuf + 32; int sign =3D 0; =20 - if ((c =3D=3D 'p') || (flags & (__PF_FLAG('l') | __PF_FLAG('t') | __PF= _FLAG('z')))) { + /* Annoying 'p' =3D=3D=3D '0' so mask from flags */ + if ((__PF_FLAG(c) | (flags & ~__PF_FLAG('p'))) & + (__PF_FLAG('p') | __PF_FLAG('s') | __PF_FLAG('l') | __PF_FLAG('t')= | __PF_FLAG('z'))) { v =3D va_arg(args, unsigned long); signed_v =3D (long)v; } else if (flags & (__PF_FLAG('j') | __PF_FLAG('q'))) { @@ -327,7 +335,18 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list len =3D 1; outstr =3D tmpbuf; goto do_output; + case 's': + if (!v) { + outstr =3D "(null)"; + len =3D 6; + goto do_output; + } + outstr =3D (void *)v; +do_strnlen_output: + len =3D strnlen(outstr, INT_MAX); + goto do_output; case 'd': + case 'i': if (signed_v < 0) { sign =3D '-'; v =3D -(signed_v + 1); @@ -339,42 +358,41 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } __nolibc_fallthrough; case 'u': - u64toa_r(v, out); + len =3D u64toa_r(v, out); break; case 'p': sign =3D 'x' | '0' << 8; __nolibc_fallthrough; default: /* 'x' and 'p' above */ - u64toh_r(v, out); + len =3D u64toh_r(v, out); break; } for (; sign; sign >>=3D 8) { + len++; *--out =3D sign; } outstr =3D out; } - else if (c =3D=3D 's') { - outstr =3D va_arg(args, char *); - if (!outstr) - outstr=3D"(null)"; - } else if (c =3D=3D 'm') { #ifdef NOLIBC_IGNORE_ERRNO outstr =3D "unknown error"; + len =3D __builtin_strlen(outstr); #else outstr =3D strerror(errno); + goto do_strnlen_output; #endif /* NOLIBC_IGNORE_ERRNO */ } else { +bad_conversion_specifier: if (c !=3D '%') /* Invalid format, output the format string */ fmt =3D outstr + 1; /* %% is documented as a 'conversion specifier'. * Any flags, precision or length modifier are ignored. */ + outstr =3D fmt - 1; + len =3D 1; width =3D 0; - outstr =3D "%"; } - len =3D strlen(outstr); } =20 do_output: --=20 2.39.5 From nobody Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (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 6F0B8323417 for ; Tue, 3 Feb 2026 10:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114618; cv=none; b=oMcfKkzf5T05L6+DgIhahgfegh/oztE40sCNSmMKuSJyblcNNQJPuCopDAZXs6kK9ZWffTT/xfjRgcdXWsV4JFt9RSaYqWRseMyhIsWk4wHRFpFonvbxCcWtl0/GRLr1U0+wBMqs3unFnm83YE867IWiqqt4Np8G4k3rBejHK8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114618; c=relaxed/simple; bh=ujBYucnDXjrVtjPgeaqWCWuXeZOpHx5TUjvONb2SkJA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=g6xokp/bWac31pl1crJz7YFs5+LsptGno5gRdXFJNjFXtFxI55QUEN1Y9xqC4n50OaLTCGFRhHoMDpWNrFW/5v77qjbyC0hr4ft5ILVwfPNi6dv1Es9yPjrJx/7O64OuuhrWgeluGNKfj3JiykvwkpZ6tvLR3sBiH5Pn8q45BQE= 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=eJRqN5x6; arc=none smtp.client-ip=209.85.221.49 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="eJRqN5x6" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-43246af170aso395383f8f.0 for ; Tue, 03 Feb 2026 02:30:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114615; x=1770719415; 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=k02e3d4dWbP0eABJFgF611l+mJke5v79RIA2KwX/geA=; b=eJRqN5x6HjB+a/KNNjZKcwN21J5iyeUwdleKNT6s/zh2uZN9dJraWZrZfLSrgykUXh 3DP46jX47Ml3VevcqPABywTrWFLHtUQVOGbjufbpiwXqyKgYWaxACNSQx3FdwfPZKNPe IkGGEYQnjbviwdVpLc+Yk/kHdRPay2sZkTJgfgjmiV18kkNCSpC3dDCBGduEEZs1RyEy +wiMFoptnw696v71iN9XTJsqFtBG9VQdeBumciPA8QSaRs0RrIcz5tlrxNE3wvt0QsJ9 ppoNNGhINsfYQYhKN+Qr+TaDgQqnGVEifs49/OOzeeihY0/ElRKfOiRd9pJE91QS1Y5y IB+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114615; x=1770719415; 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=k02e3d4dWbP0eABJFgF611l+mJke5v79RIA2KwX/geA=; b=qxFFvXCnSYTo/OpeykQiVBKvryjnJ02m7qRxkcJyQdWFd4wsUg/7LrKP2z54Yoe3hN kpVpKW8cDBrRR32n0I+azxeWBX4rcAqZTZePTC93WxnJrfXhRTz2d3xE3NFYjdxsJiD0 vzWEHNgs17vNVuJOiMw2W87Wl4W+qhOmX44JhalZmaVFyBxjTF2gedb1WPFM3k0v1S8M pIpu4/oP+dBIVRK7CTTOG4zANBKgTiJYTB2PjXlWNJFyfA48k7Azi7hwVCyI9lPqqJI0 JL4dmI2341KbqBZCEUrDQtH4bqVZwokCcEW5NlJVCUDBolJ+0uniC+hEjTJwguZ91N+n h16Q== X-Forwarded-Encrypted: i=1; AJvYcCV69U03Bqm+QkpyapVKNGVuLCRbYWAoryIvba9Zrl9pJsyirMlk/seoFAi4GDWiDZ7aGVI4HD62aATvSTQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwpMtSS/ksOAGmxEF/RIRiI+cSWKEGH7MORqN+ttXZS7EuKg623 zxA6F1GWLtyJhQofTnZoCZV7gc/FFXSvFrHjKWZ4gZO6DsfRBZaWMDYqrrljVg== X-Gm-Gg: AZuq6aJjpYWYAkL/umk87Pri9tX7pSEHqrVSIsmLprzhV7pyzjuWyXfXY44vwC39pHk dvUjejFIUcJxmXfiO/Jcj37PKlxw70QU4jtYZ3RgW+OS56za+l+OsRMHGQTSZGbx2AMhoj3Qj6O LAiSoq2Yn6QI64rtEGu+M1EnofTJw1iyLte1E5MRyTev0pw0e6bAWgHaucbCwYhkLt8fu6LfpRd olv5ilq5Kv2FdXATpChtAumPzey6yq/tKIXvkCw3X4IPECZI0K7TiiIIeco4ZUbrUv/jV2QZNQ3 YbT/dpbEiPOK3tJSXazm+SDsizVdFBGA1di1NyqTjOZo3MaHL8qxB0XtJo5BlWF2rxOfVcP+y8y 3t32jBlKYgV48+ZpMXpF9TA2rNAcHa+FGd1GnQY4TBkfK1qg3xrUvWM++WqLg5ltPnf+WSkWBXu kFw5YnjRzzVZmCiufz08dlX33QGnMyNcv1MO4fK4d3B/aQI6ornMPDAOrzuw7V0GA/bd6vinVK X-Received: by 2002:a05:6000:4027:b0:430:fdc8:8bd6 with SMTP id ffacd0b85a97d-43611439846mr4147479f8f.31.1770114614507; Tue, 03 Feb 2026 02:30:14 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:14 -0800 (PST) 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 next 09/12] tools/nolibc/printf: support precision and zero padding Date: Tue, 3 Feb 2026 10:29:57 +0000 Message-Id: <20260203103000.20206-10-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 Support '*' for both length and precision. Output "(nil)" for NULL pointers (matches glibc). Output "0" not "0x0" for printf("%#x", 0). Output no digits for printf("%.0d", 0). Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 114 +++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 25 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index d8b6184ff0f3..bad528921590 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -240,10 +240,15 @@ char *fgets(char *s, int size, FILE *stream) } =20 =20 -/* simple printf(). It supports the following formats: - * - %[-+ ][width][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m} - * - %% - * - invalid formats are copied to the output buffer +/* printf(). Supports most of the normal integer and string formats. + * - %[#0-+ ][width|*[.precision|*]][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m} + * - %% generates a single % + * - %m outputs strerror(errno). + * - # only affects %x and prepends 0x to non-zero values. + * - %o (octal) isn't supported. + * - %X outputs a..f the same as %x. + * - No support for wide characters. + * - invalid formats are copied to the output buffer. */ typedef int (*__nolibc_printf_cb)(void *state, const char *buf, size_t siz= e); =20 @@ -252,7 +257,7 @@ static __attribute__((unused, format(printf, 3, 0))) int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, v= a_list args) { char c; - int len, written, width; + int len, written, width, precision; unsigned int flags; char tmpbuf[32 + 24]; const char *outstr; @@ -277,17 +282,30 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list =20 /* Flag characters */ for (; c >=3D 0x20 && c <=3D 0x3f; c =3D *fmt++) { - if ((__PF_FLAG(c) & (__PF_FLAG('-') | __PF_FLAG(' ') | __PF_FLAG('+'))= ) =3D=3D 0) + if ((__PF_FLAG(c) & (__PF_FLAG('-') | __PF_FLAG(' ') | __PF_FLAG('+') | + __PF_FLAG('#') | __PF_FLAG('0'))) =3D=3D 0) break; flags |=3D __PF_FLAG(c); } =20 - /* width */ - while (c >=3D '0' && c <=3D '9') { - width *=3D 10; - width +=3D c - '0'; - - c =3D *fmt++; + /* width and precision */ + for (;; c =3D *fmt++) { + if (c =3D=3D '*') { + precision =3D va_arg(args, unsigned int); + c =3D *fmt++; + } else { + for (precision =3D 0; c >=3D '0' && c <=3D '9'; c =3D *fmt++) + precision =3D precision * 10 + (c - '0'); + } + if (flags & __PF_FLAG('.')) + break; + width =3D precision; + if (c !=3D '.') { + /* Default precision for strings */ + precision =3D INT_MAX; + break; + } + flags |=3D __PF_FLAG('.'); } =20 /* Length modifiers are lower case except 'L' which is the same a 'q' */ @@ -308,7 +326,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list if (!((c >=3D 'a' && c <=3D 'z') || (c =3D=3D 'X' && (c =3D 'x')))) goto bad_conversion_specifier; =20 - /* Conversion specifiers */ + /* Numeric and pointer conversion specifiers */ if (__PF_FLAG(c) & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | = __PF_FLAG('u') | __PF_FLAG('x') | __PF_FLAG('p') | __PF_FLAG('s'))) { unsigned long long v; @@ -338,12 +356,13 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list case 's': if (!v) { outstr =3D "(null)"; - len =3D 6; + /* Match glibc, nothing output if precision too small */ + len =3D precision >=3D 6 ? 6 : 0; goto do_output; } outstr =3D (void *)v; do_strnlen_output: - len =3D strnlen(outstr, INT_MAX); + len =3D strnlen(outstr, precision); goto do_output; case 'd': case 'i': @@ -356,17 +375,62 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } else if (flags & __PF_FLAG(' ')) { sign =3D ' '; } - __nolibc_fallthrough; - case 'u': - len =3D u64toa_r(v, out); - break; - case 'p': - sign =3D 'x' | '0' << 8; - __nolibc_fallthrough; - default: /* 'x' and 'p' above */ - len =3D u64toh_r(v, out); - break; + c =3D 'u'; + } + + if (v =3D=3D 0) { + /* There are special rules for zero. */ + if (c =3D=3D 'p') { + /* match glibc, precision is ignored */ + outstr =3D "(nil)"; + len =3D 5; + goto do_output; + } + if (!precision) { + /* Explicit %nn.0d, no digits output */ + len =3D 0; + goto prepend_sign; + } + /* "#x" should output "0" not "0x0" */ + *out =3D '0'; + len =3D 1; + } else { + if (c =3D=3D 'u') { + len =3D u64toa_r(v, out); + } else { + len =3D u64toh_r(v, out); + if (c =3D=3D 'p' || (flags & __PF_FLAG('#'))) + sign =3D 'x' | '0' << 8; + } } + + /* Add zero padding */ + if (flags & (__PF_FLAG('0') | __PF_FLAG('.'))) { + if (!(flags & __PF_FLAG('.'))) { + if (flags & __PF_FLAG('-')) + /* Left justify overrides zero pad */ + goto prepend_sign; + /* Zero pad to field width less sign */ + precision =3D width; + if (sign) { + precision--; + if (sign >=3D 256) + precision--; + } + } + if (precision > 30) + /* Don't run off the start of tmpbuf[] */ + precision =3D 30; + for (; len < precision; len++) { + /* Stop gcc generating horrid code and memset(). + * This is OPTIMIZER_HIDE_VAR() from compiler.h. + */ + __asm__ volatile("" : "=3Dr"(len) : "0"(len)); + *--out =3D '0'; + } + } + +prepend_sign: for (; sign; sign >>=3D 8) { len++; *--out =3D sign; --=20 2.39.5 From nobody Sun Feb 8 01:30:50 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 A35BC3246EC for ; Tue, 3 Feb 2026 10:30:16 +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=1770114618; cv=none; b=nj1lUUwt3BMjA8l1a1OExA10+xADcNYo8oaIZQ4vl9qWp15c3DoOXCx01p1KjqBen/6qwJQrgEeChEOJsw0FdfKn3V0LTxP4/QvfsldEsPWX1SUSMrQlE7H++cn4i1e59G+cFjWYRHlMuf21gN3DApK53Rp0T4kymFT8wx/WWB0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114618; c=relaxed/simple; bh=frM8mpM62krA7/yGtOgE8jZ0mrpDlC5OeRDxyJLbNS4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HoArdzRNw7lFMcy031Epa+gtmPyJFGwMxkF/jY8DKlmjZtunZfP8Rh6qaKxuTSLWoqdcIZ5NxJy21ro3MrFH5iF8VJGEHTS/Cxyg8R3796EXrOGQ9IC6NFHyT8HRmdD6PbazCs3qjsqrkETiIbzB+rz+r+BHr3rQlDCqaHwfUc8= 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=O9sLKYHa; 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="O9sLKYHa" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-430f3ef2d37so4689376f8f.3 for ; Tue, 03 Feb 2026 02:30:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114615; x=1770719415; 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=j5pSmti+eAXEULK/8/Hmh9E/QurwC7O3QBA6/81Tie4=; b=O9sLKYHaH15YM5cTYVMoZa6WS5VdThcuz/w/Ah42C57Zawz+zlQvK24tqB5DYCEHzz PYTsUETbT2xFmls7pWESgsYVjeuD+qfOV5nRXHtvNI+JRtmFuBOTqrgom8SaVvGvqjQa BTeA8MvZ39B+v9Stmcvo/Pn5bFf7jpxs8cAe2Kko312y1ZoU+pr0/Jx7ccfQlfcsUIth aF3sF2uSWE7lCvAi7Exqj58w30+8x3V9g2P43tz1Ffvsx63XJC4Z+9rBJ6oF17z0PFjS 6SiuUKq7xzQ1YfMRLAN3q+1Gl2B0jOKvZNmRoafxuPVQ4Ue87XQugEvQrwY4jMMEhTbp wi/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114615; x=1770719415; 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=j5pSmti+eAXEULK/8/Hmh9E/QurwC7O3QBA6/81Tie4=; b=wp0fQvpm5d2c5FbITs4FzgBBoIzEKNInQ4R8Nb4CYv71zLLiwgSw6avUhi8qTH59Tk ROvX24nPYZRULKBwx8kOGOaBhN4D38nsobGpw9ozVNJzilrMsiyXFx/GR2MWze0aHdcG eZKu28FNeeBv7kgbaWN+Ct4UvpGXArtzw4SH72pmXb2oNk7PwWGV5nfzm1/+ychXyrFN NFw6YRl4tsA8Ia2cxsRAbflaWpsqbIZ0pEKdn8mea6o3hE7gcYbhXzTem7CoqLXq9fpk fbiozpLOw2F0iKepaSFbgQKZVwGLB2DuGP9SbZe1iPDWoE/jzmEc3ycMhFaCE0qUmLVr 4k7Q== X-Forwarded-Encrypted: i=1; AJvYcCUXC3GFLCNneeOauuYjcPj2DcTIEVOOwdiP2245sLBmyFf8tyCEdgl29styXql6h8/xLr79Pruy/liD9Gs=@vger.kernel.org X-Gm-Message-State: AOJu0YxIVQUGUEfSapE3Mq3mKUfadpO6BHIHN1azetFufvPFeKQEYH4c ARjSwcrRCvMHCc/axcXrmf5t3VAi4VxJp4Oo+1IbqFzc/OysU3bqs2HA X-Gm-Gg: AZuq6aJWiQALL4W7h3MkZkEwiaUTNeC1gWTVBV/57l7f1v0kI/N2bWXvlgVYsPf1knb aBjbnnyk3/YCFIzw54LYMxc6R2Ewek+BMWlPpz0yWh2TfRrLLVp9FUFz3aHwkry+IWkNguzTMam yZzHeieIZ4ZeS3KNzBa83nrzBZ4ti5S5wJMuu+xdWphgNjh/r/P+koqTK99MxI5UEidyL7V45TA EqWjxUtsufIVmHj7w7PshF8vgscwUPv/zGBOjNsM8TJtailaSlHxtDjmbosDGkCbTPMkMOv57ml d/f98yEYrmXrpe/BKUd2eeazxqvefPGasYSCJP/BnEeQ/6FDAa5HAvkh+mMxw2Zk+vjf1Zgf3iK 7dsa9NAkOi8O+FdJkN8nnZLIyZUwOqgL8A3QhXE/ayS6GVMUJUwDokPecg1iJ+a4oTtqFqYM2KP EMfw/HAKDZfddXVa14/D2ghbBvyg0S45HjScwsYth9s2a2rNh6qAF5noOhsJ7sVKmMZWkPaYc2 X-Received: by 2002:a5d:4e8e:0:b0:436:b45:749c with SMTP id ffacd0b85a97d-4360b4574a2mr5481727f8f.6.1770114614959; Tue, 03 Feb 2026 02:30:14 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:14 -0800 (PST) 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 next 10/12] tools/nolibc/printf: Use bit-pattern for integral formats Date: Tue, 3 Feb 2026 10:29:58 +0000 Message-Id: <20260203103000.20206-11-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 Generates better code when code is common for multiple formats. In particular it stops two calls to u64toa_r(). Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index bad528921590..23fe8b8e7767 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -241,7 +241,7 @@ char *fgets(char *s, int size, FILE *stream) =20 =20 /* printf(). Supports most of the normal integer and string formats. - * - %[#0-+ ][width|*[.precision|*]][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m} + * - %[#0-+ ][width|*[.precision|*]][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m,= %} * - %% generates a single % * - %m outputs strerror(errno). * - # only affects %x and prepends 0x to non-zero values. @@ -258,7 +258,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list { char c; int len, written, width, precision; - unsigned int flags; + unsigned int flags, c_flag; char tmpbuf[32 + 24]; const char *outstr; =20 @@ -326,8 +326,12 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list if (!((c >=3D 'a' && c <=3D 'z') || (c =3D=3D 'X' && (c =3D 'x')))) goto bad_conversion_specifier; =20 - /* Numeric and pointer conversion specifiers */ - if (__PF_FLAG(c) & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | = __PF_FLAG('u') | + /* Numeric and pointer conversion specifiers. + * We need to check for "%p" or "%#x" later, merging here gives better = code. + * But '#' collides with 'c' so shift right. + */ + c_flag =3D __PF_FLAG(c) | (flags & __PF_FLAG('#')) >> 1; + if (c_flag & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | __PF_F= LAG('u') | __PF_FLAG('x') | __PF_FLAG('p') | __PF_FLAG('s'))) { unsigned long long v; long long signed_v; @@ -335,7 +339,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list int sign =3D 0; =20 /* Annoying 'p' =3D=3D=3D '0' so mask from flags */ - if ((__PF_FLAG(c) | (flags & ~__PF_FLAG('p'))) & + if ((c_flag | (flags & ~__PF_FLAG('p'))) & (__PF_FLAG('p') | __PF_FLAG('s') | __PF_FLAG('l') | __PF_FLAG('t')= | __PF_FLAG('z'))) { v =3D va_arg(args, unsigned long); signed_v =3D (long)v; @@ -347,13 +351,14 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list signed_v =3D (int)v; } =20 - switch (c) { - case 'c': + if (c_flag & __PF_FLAG('c')) { tmpbuf[0] =3D v; len =3D 1; outstr =3D tmpbuf; goto do_output; - case 's': + } + + if (c_flag & __PF_FLAG('s')) { if (!v) { outstr =3D "(null)"; /* Match glibc, nothing output if precision too small */ @@ -364,8 +369,9 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list do_strnlen_output: len =3D strnlen(outstr, precision); goto do_output; - case 'd': - case 'i': + } + + if (c_flag & (__PF_FLAG('d') | __PF_FLAG('i'))) { if (signed_v < 0) { sign =3D '-'; v =3D -(signed_v + 1); @@ -375,12 +381,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } else if (flags & __PF_FLAG(' ')) { sign =3D ' '; } - c =3D 'u'; } =20 if (v =3D=3D 0) { /* There are special rules for zero. */ - if (c =3D=3D 'p') { + if (c_flag & __PF_FLAG('p')) { /* match glibc, precision is ignored */ outstr =3D "(nil)"; len =3D 5; @@ -395,11 +400,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list *out =3D '0'; len =3D 1; } else { - if (c =3D=3D 'u') { + if (c_flag & (__PF_FLAG('d') | __PF_FLAG('i') | __PF_FLAG('u'))) { len =3D u64toa_r(v, out); } else { len =3D u64toh_r(v, out); - if (c =3D=3D 'p' || (flags & __PF_FLAG('#'))) + if (c_flag & (__PF_FLAG('p') | __PF_FLAG('#' - 1))) sign =3D 'x' | '0' << 8; } } --=20 2.39.5 From nobody Sun Feb 8 01:30:50 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.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 583A8326944 for ; Tue, 3 Feb 2026 10:30:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114619; cv=none; b=c5o/2VERSTsbStnp7GUQAtE8D4G9YVp5LQJ7ACAyNMXKJe/43B5GenFp5pIgcE0fpYdllgjHSOd2SnYaWva/j0kFc3jRvORDXbRaeYaLiNCUIElcRJElBxeRC+VwV6RdiZrZktMSbRLeHy5HuMhc4jhV4f5gKHljrmAKAZc7ZUo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114619; c=relaxed/simple; bh=Nb6SGradxm+Xw60Yibm6ldNdCRfsd4JckIeme/aDbJ4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=r6NtC4P7ECZ7OsYAA1Qwa4/QEGJpgRc3eLhdBbDwhNYLGeeOTXkAVDrZjZ4ebxhqjDLslVhXXf9sHEY3boBBDSCRT8j3xI3GOSrA5MyXEmFYYhDcIF8PHROcIfZQKMWdCur8ih5J7ptF/mnUeouIwrrxrrBF+226DXVrd764HFY= 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=KxQcnMrz; arc=none smtp.client-ip=209.85.221.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="KxQcnMrz" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-43590777e22so3386912f8f.3 for ; Tue, 03 Feb 2026 02:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114616; x=1770719416; 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=Q4cr5VXld/nVdCeB0tYPtpicTkNHYMBhdh7AGuddQzc=; b=KxQcnMrzQd65UGMo00GS2RVyPCwpeUkdQpXKSahS+LYya6Hk8oJkBUbxzcFgZnzNTa qwnGN7hW1zJ7LbMrSTGKBonvP5Hh8sbgl662dhWEYrmiWjGJEeI3whWtqFWLfrVQWJ65 h0mJHpqWXvSIJO6Gi04MYkqCVL/NmWmjcAHDjt5OApFquERUVW0T0zA4M6ktj87Xq1vk GrPfiB9FQ6DeV3y4QbY1vo5VlBqnANq7h08Bk0kE1yenZOvRN0mXlHqnFnxA5ojXdXI7 LSJ3w1lN57NTWia8du8hR1Ras3uyyv5e46G47GoarLdAUQ1ztkAGAWNn11cy0b7RULh7 JEmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114616; x=1770719416; 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=Q4cr5VXld/nVdCeB0tYPtpicTkNHYMBhdh7AGuddQzc=; b=tcMXnSSzDeOphOC/qSqE7nTfhyooNwDfc/IOp1zaE+72d/J+8UHEiPdbbGcSahjpKx YrEUaD2T6F8E2yxKv40z6ggyNvxBfy7tF1JCUDz8KPm5bv0VXkOC6OoGndsDvGorJPD6 IR7TVPWhTkebWWBWMxlDnBnX7R+BCQp1mmzQJJN84fSFvAler5SjrnxSS+YnLVDrwE9S WXFBrwvOANfgaVMwRMFEbf6TGUaU750tZIyogbVgn5MQiARYvZuj93MxUEJvSZ+fQ09O SDLFk4qHWkNaZFYYeBLWBcwWGlifkeoq3XPtxYcrp2uWOKV6nt/vX1wnWyd2ef5GUBMg aUOQ== X-Forwarded-Encrypted: i=1; AJvYcCW/yeh/6m5QyaQhoNYi9wRQNPpHAb4IrPejA/Ujb1h55iIj0v1drgqxwcrylkfwleWAqrD/2xwEQB1qAfA=@vger.kernel.org X-Gm-Message-State: AOJu0YyrUj0F08f/uKnG1/3O3E3qGZ56kWOhpmXx+xjF40MMYH1e8QEc knQ+dAvNo7nz1pnq83qFIglsyrubA/Fe8ytIc3Xipde+anClACTQDMyK X-Gm-Gg: AZuq6aIKNkYEGjf8XejdCZQl9neCQnzpgj1taZmX9MK5DL783LDSt0Y1iqmoW6ltzA7 MkpjPSp8az67YkUK/LayxdD1W+upKmhKZaV0nIX1lmKN7MG021cNOtDVbghGlm9k6aAVT/dWO1Q Iffdp/q77ZNmuu/6hqBnXbl05CagLrY0Vgix+6Ia8aCzzDDuBK9T6pAIkizUPP3y36KPkvlEEpO yQgXEsHXimSdRf/XGENGXcI9fMHhodY3MRLZzEDtlv8SEWbGJSom5Xh5Z5iaKolPsJBlaBe7z38 sNoyFym81phF00FG6uzkns3uDZyuNesiGjHhsurFJzX/s7pCS60V5BXwpcLCXMhNFZi5Ey6Yc83 QwFzaishdWFe4GDe79B7opHEP7N4SbnGEvnn41CoJE4tdPDozYFqB/TFE91PAJOQK0D4Dvhcqrf UMK5V0wJxbSo83IKLCbVeoEoOkGR+D2ivnAJgLxSEvNwCQ9PnS4u+P4DKZ2ctNZcbfI3RXCzRN X-Received: by 2002:a05:6000:200e:b0:431:8f8:7f1a with SMTP id ffacd0b85a97d-435f3aa90a1mr22186011f8f.31.1770114615515; Tue, 03 Feb 2026 02:30:15 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:15 -0800 (PST) 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 11/12] selftests/nolibc: Increase coverage of printf format tests Date: Tue, 3 Feb 2026 10:29:59 +0000 Message-Id: <20260203103000.20206-12-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 Extra tests include: - %%, including ignored modifiers. - Invalid formats copied to output buffer (matches glibc). - Left aligned output "%-..." - Zero padding "%0...". - "(nil)" for NULL pointers (matches glibc). - Alternate form "%#x" (prepends 0x in non-zero). - Field precision as well as width, printf("%.0d", 0) is "". - Variable length width and precision "%*.*d". - Length qualifiers L and ll. - Conversion specifiers i and X. - More 'corner' cases. There are no explicit tests of long (l, t or z) because they would have to differ between 32bit and 64bit. Set the expected length to zero for all the non-truncating tests. (Annoying when a test is changed.) Signed-off-by: David Laight --- tools/testing/selftests/nolibc/nolibc-test.c | 48 +++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 9378a1f26c34..bf92b9046175 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1565,6 +1565,7 @@ int run_stdlib(int min, int max) #define EXPECT_VFPRINTF(c, expected, fmt, ...) \ ret +=3D expect_vfprintf(llen, c, expected, fmt, ##__VA_ARGS__) =20 +__attribute__((mat(printf, 3, 0))) static int expect_vfprintf(int llen, int c, const char *expected, const ch= ar *fmt, ...) { unsigned int i; @@ -1727,20 +1728,43 @@ static int run_printf(int min, int max) */ switch (test + __LINE__ + 1) { CASE_TEST(empty); EXPECT_VFPRINTF(0, "", ""); break; - CASE_TEST(simple); EXPECT_VFPRINTF(3, "foo", "foo"); break; - CASE_TEST(string); EXPECT_VFPRINTF(3, "foo", "%s", "foo"); break; - CASE_TEST(number); EXPECT_VFPRINTF(4, "1234", "%d", 1234); break; - CASE_TEST(negnumber); EXPECT_VFPRINTF(5, "-1234", "%d", -1234); break; - CASE_TEST(unsigned); EXPECT_VFPRINTF(5, "12345", "%u", 12345); break; - CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; - CASE_TEST(hex); EXPECT_VFPRINTF(1, "f", "%x", 0xf); break; - CASE_TEST(pointer); EXPECT_VFPRINTF(3, "0x1", "%p", (void *) 0x1); = break; - CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%j= u", 0xffffffffffffffffULL); break; - CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%j= d", 0x8000000000000001LL); break; + CASE_TEST(simple); EXPECT_VFPRINTF(0, "foo", "foo"); break; + CASE_TEST(string); EXPECT_VFPRINTF(0, "foo", "%s", "foo"); break; + CASE_TEST(number); EXPECT_VFPRINTF(0, "1234", "%d", 1234); break; + CASE_TEST(negnumber); EXPECT_VFPRINTF(0, "-1234", "%d", -1234); break; + CASE_TEST(unsigned); EXPECT_VFPRINTF(0, "12345", "%u", 12345); break; + CASE_TEST(signed_max); EXPECT_VFPRINTF(0, "2147483647", "%i", ~0u >> 1= ); break; + CASE_TEST(signed_min); EXPECT_VFPRINTF(0, "-2147483648", "%i", (~0u >>= 1) + 1); break; + CASE_TEST(unsigned_max); EXPECT_VFPRINTF(0, "4294967295", "%u", ~0u); br= eak; + CASE_TEST(char); EXPECT_VFPRINTF(0, "|c|d| e|", "|%c|%.0c|%4c|= ", 'c', 'd', 'e'); break; + CASE_TEST(hex); EXPECT_VFPRINTF(0, "|f|d|", "|%x|%X|", 0xf, 0xd= ); break; + CASE_TEST(pointer); EXPECT_VFPRINTF(0, "0x1", "%p", (void *) 0x1); = break; + CASE_TEST(pointer_NULL); EXPECT_VFPRINTF(0, "|(nil)|(nil)|", "|%p|%.4p|"= , (void *)0, (void *)0); break; + CASE_TEST(string_NULL); EXPECT_VFPRINTF(0, "|(null)||(null)|", "|%s|%.5= s|%.6s|", (void *)0, (void *)0, (void *)0); break; + CASE_TEST(percent); EXPECT_VFPRINTF(0, "a%d42%69%", "a%%d%d%%%d%%",= 42, 69); break; + CASE_TEST(perc_qual); EXPECT_VFPRINTF(0, "a%d2", "a%-14l%d%d", 2); br= eak; + CASE_TEST(invalid); EXPECT_VFPRINTF(0, "a%12yx3%y42%y", "a%12yx%d%y= %d%y", 3, 42); break; + CASE_TEST(intmax_max); EXPECT_VFPRINTF(0, "9223372036854775807", "%lld= ", ~0ULL >> 1); break; + CASE_TEST(intmax_min); EXPECT_VFPRINTF(0, "-9223372036854775808", "%Li= ", (~0ULL >> 1) + 1); break; + CASE_TEST(uintmax_max); EXPECT_VFPRINTF(0, "18446744073709551615", "%ju= ", ~0ULL); break; CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s= ", "0123456789012345678901234"); break; - CASE_TEST(string_width); EXPECT_VFPRINTF(10, " 1", "%10s", "1");= break; - CASE_TEST(number_width); EXPECT_VFPRINTF(10, " 1", "%10d", 1); b= reak; + CASE_TEST(string_width); EXPECT_VFPRINTF(0, " 1", "%10s", "1"); = break; + CASE_TEST(string_trunc); EXPECT_VFPRINTF(0, " 12345", "%10.5s", "123= 4567890"); break; + CASE_TEST(number_width); EXPECT_VFPRINTF(0, " 1", "%10d", 1); br= eak; + CASE_TEST(number_left); EXPECT_VFPRINTF(0, "|-5 |", "|%-8d|", -5);= break; + CASE_TEST(string_align); EXPECT_VFPRINTF(0, "|foo |", "|%-8s|", "foo= "); break; CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%2= 5d", 1); break; + CASE_TEST(width_tr_lft); EXPECT_VFPRINTF(25, "1 ", "%-= 25d", 1); break; + CASE_TEST(number_pad); EXPECT_VFPRINTF(0, "0000000005", "%010d", 5); b= reak; + CASE_TEST(num_pad_neg); EXPECT_VFPRINTF(0, "-000000005", "%010d", -5); = break; + CASE_TEST(num_pad_hex); EXPECT_VFPRINTF(0, "00fffffffb", "%010x", -5); = break; + CASE_TEST(number_prec); EXPECT_VFPRINTF(0, " 00005", "%10.5d", 5); = break; + CASE_TEST(num_prec_neg); EXPECT_VFPRINTF(0, " -00005", "%10.5d", -5);= break; + CASE_TEST(num_prec_var); EXPECT_VFPRINTF(0, " -00005", "%*.*d", 10, 5= , -5); break; + CASE_TEST(num_0_prec_0); EXPECT_VFPRINTF(0, "|| |+||||", "|%.0d|% .0d|%+= .0d|%.0u|%.0x|%#.0x|", 0, 0, 0, 0, 0, 0); break; + CASE_TEST(hex_alt); EXPECT_VFPRINTF(0, "|0x1|0x01| 0x02|", "|%#x|%#= 04x|%#5.2x|", 1, 1, 2); break; + CASE_TEST(hex_0_alt); EXPECT_VFPRINTF(0, "|0|0000| 00|", "|%#x|%#04= x|%#5.2x|", 0, 0, 0); break; + CASE_TEST(dec_alt); EXPECT_VFPRINTF(0, "|1|0001| 02|", "|%#d|%#04= d|%#5.2d|", 1, 1, 2); break; /* '#' is ignored */ 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; --=20 2.39.5 From nobody Sun Feb 8 01:30:50 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 C2455328631 for ; Tue, 3 Feb 2026 10:30:17 +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=1770114619; cv=none; b=tyUPSjL4bte2dEuxGVeeEPcPtGnow1B4mAJIJa40LgYbtAZhsFfTQ48b0JetZsKKuhILdbPEwgjlx9VISJGe6r4Eq5n3EZD93iQS2JfZz2VNXOpeyPw6q/83NHc93gpQvJ7bZvqMXxNvly4MqKoKOv2f+uKn14LoH5WspOsoCjk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114619; c=relaxed/simple; bh=Kx0H3FAvKCxSt6zX6LBy8TEMSIQA04kqD5H56e7s99M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HVz03IXpfIM4NeeeYZV5mM7X99to3QBor3U8RGe9Fweh3cfO6/AxNdj/iZE4LVhlycThyqgjKlu1u1X5HQOqEsb2h1QSxnmKZBfPMk5q6J6pis++dZqAyhzcTS7GC/aRNYzz3EBpzgDra66y8LMGNxG6RKmoR4HCoun505Ktzqo= 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=W0YvnVeM; 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="W0YvnVeM" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-47fedb7c68dso55436175e9.2 for ; Tue, 03 Feb 2026 02:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114616; x=1770719416; 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=5okqp6XgDQKPrgM1NG99uddTVMkO110nAchvuk6UDW8=; b=W0YvnVeMlhmU6u8HIyyJK8JDbWuc9ixiPLXK3R7UzEj/CqP/LxBXhD1oZPTEA1Frta evuQVOW5aNOL1nbZJH9DSAYFPGLuw0BYv5WcqT3DMFn+EU2J6fMtnG4Lzj3hjYyGoK4V GtrtoXzkg2pzWfAH7zr1dy+30AXi1mG5RVX5KMI1wfHvQ7nILDFMCruvG6J3fPwXmEJk lLBJdj/pGuZID/CfvgIuBKsRni77cNbMhpX5Rr7tPe/FvVfwhyC8CBQLBb6CzAuLDFiJ hkL13iVLkCch/0wGqlfTRj5S3zWN6gYA0pF2I3heVCqB7WDBBp+Sn5dp5oHk9sBTWCng HPTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114616; x=1770719416; 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=5okqp6XgDQKPrgM1NG99uddTVMkO110nAchvuk6UDW8=; b=K/pDIXBXIUXGZBhZS+E+SwpyIa57lFSfVio4aJUCkD8qiu/lpbjxQLfshqvkyfgTfI WIw/GcGl4aTw6BsyP7NbFL19cc705mc30pvr8Ezj/paKKDwXxYWgnrf2wqRR2VVdBTtN IzxigBZiDQdnKblMHzVmVyvyMeY6qlQFtHdr976NoH27h6v9XheG/28Mh+VPO92zjvf/ XcgHJyX0FNIlOJ0tFU+nFvU4Xaq6MWcVRYywmP3+afwk76fNy8rHAtt+h5lofxBxvOVT +Ugi9tLEUAKYX7dJMCpqGK6H8FMP0uJfm1CU5kQYfbR8iXwN83UsihLODX5lLX+4TQl4 J0SA== X-Forwarded-Encrypted: i=1; AJvYcCV0Rl3/CUlJj58y2AtTzJI+PgYpNs5ERPxbdkXHW9itIN8UysBIdlMsL9HjF3hV97Y+TZMJxVBo1rFGCcE=@vger.kernel.org X-Gm-Message-State: AOJu0YwBCnROIdfpTqOuKWxoEEPms1nnPZPYLtWeZOrIgHNfcGUZfhhc koNExJROzZv9sykr3SpFsacjt6v3T/XJIwm8xu2f+jprzLx2hNUyAkbA X-Gm-Gg: AZuq6aJq6YbjCIl/RDuL7BgXs5WDzSGyxLKL0s3awqQXmyu+eGbZ4wUf9xoNNGjKy/l Na08vU0kWVKWSPiRpIREAwx50nbT1GEyDVGkhJprwA3MhSMCpQq8P70xRcSwYNjqB+stHWMwU2J +pTeEdJ4Dhtpfs/AzsV+aEUkhLnUyLWAG13Ucur/B7hHlSAL157vcOnDHEkN1Vq/lJ2xCzrQml6 kD76MftPKtoS2+lWEK5JcoraSw0QENMhWZAguNS7qpkUYvJ1yV9GlQ8v567Ou58+9xh6RlqMdFR qQfZJGFsCqwNW4OJq/rvqd1MLiRRXMciPpj5aIflMpmxzrpl8gE7cp7VUEsuarUfPQlwaDWIhke qGvG4Sulf/KmFgEC0zLAUkF0zI3/QexnIsJnqFZ0poly83NL3q+Z4N/YyQZSR5r1NWrI5KngF8B hSgXPCICrSOXabTfM9HXFa/MTzwDlQxfxMuv5cEOdEMo0BxhxJ/nHgBGupOyFtIUmE7D+bq6r3 X-Received: by 2002:a05:6000:18a7:b0:430:fdc8:8be3 with SMTP id ffacd0b85a97d-435f3aafd25mr23547704f8f.29.1770114616012; Tue, 03 Feb 2026 02:30:16 -0800 (PST) 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 ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:15 -0800 (PST) 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 12/12] selftests/nolibc: Use printf("%.*s", n, "") to align output Date: Tue, 3 Feb 2026 10:30:00 +0000 Message-Id: <20260203103000.20206-13-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-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 it can be used to align the "[OK]" strings in the output. Signed-off-by: David Laight --- tools/testing/selftests/nolibc/nolibc-test.c | 21 ++++---------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index bf92b9046175..1b0cfd77145a 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -141,21 +141,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, @@ -173,8 +158,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 --=20 2.39.5