From: Andrew Jones <drjones@redhat.com>
To: Nikos Nikoleris <nikos.nikoleris@arm.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, jade.alglave@arm.com,
alexandru.elisei@arm.com
Subject: Re: [kvm-unit-tests PATCH v2 09/23] lib/printf: Support for precision modifier in printing strings
Date: Thu, 19 May 2022 18:02:00 +0200 [thread overview]
Message-ID: <20220519160200.2shxxux6it63rzz6@gator> (raw)
In-Reply-To: <20220519145233.okvw5no6eduk4yvc@gator>
On Thu, May 19, 2022 at 04:52:33PM +0200, Andrew Jones wrote:
> On Fri, May 06, 2022 at 09:55:51PM +0100, Nikos Nikoleris wrote:
> > This follows the typical format of:
> >
> > printf("%.Ns", *str);
> >
> > Where N might be a decimal digit string or '*'. This feature is used
> > by a future change.
> >
> > See also: man 3 printf
> >
> > Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> > ---
> > lib/printf.c | 84 ++++++++++++++++++++++++++++++++++++++++++++--------
> > 1 file changed, 71 insertions(+), 13 deletions(-)
> >
> > diff --git a/lib/printf.c b/lib/printf.c
> > index 1269723..724befa 100644
> > --- a/lib/printf.c
> > +++ b/lib/printf.c
> > @@ -19,6 +19,7 @@ typedef struct strprops {
> > char pad;
> > int npad;
> > bool alternate;
> > + int precision;
> > } strprops_t;
> >
> > static void addchar(pstream_t *p, char c)
> > @@ -43,7 +44,7 @@ static void print_str(pstream_t *p, const char *s, strprops_t props)
> > }
> > }
> >
> > - while (*s)
> > + while (*s && props.precision--)
> > addchar(p, *s++);
> >
> > if (npad < 0) {
> > @@ -147,9 +148,61 @@ static int fmtnum(const char **fmt)
> > return num;
> > }
> >
> > +static inline int isdigit(int c)
> > +{
> > + return '0' <= c && c <= '9';
> > +}
>
> We desperately need to add ctype to our library. We've already got
> isblank, isalpha, and isalnum local to argv.c and I see later you
> add isspace. I'll post a patch now that introduces ctype.[ch] with
> the ones used by argv. Then, when you respin this series you can
> add your ctype functions there.
>
> > +
> > +/*
> > + * Adapted from drivers/firmware/efi/libstub/vsprintf.c
> > + */
> > +static int skip_atoi(const char **s)
> > +{
> > + int i = 0;
> > +
> > + do {
> > + i = i*10 + *((*s)++) - '0';
> > + } while (isdigit(**s));
> > +
> > + return i;
> > +}
> > +
> > +/*
> > + * Adapted from drivers/firmware/efi/libstub/vsprintf.c
> > + */
> > +static int get_int(const char **fmt, va_list *ap)
> > +{
> > + if (isdigit(**fmt)) {
> > + return skip_atoi(fmt);
> > + }
> > + if (**fmt == '*') {
> > + ++(*fmt);
> > + /* it's the next argument */
> > + return va_arg(*ap, int);
> > + }
> > + return 0;
> > +}
> > +
> > int vsnprintf(char *buf, int size, const char *fmt, va_list va)
> > {
> > pstream_t s;
> > + va_list args;
> > +
> > + /*
> > + * We want to pass our input va_list to helper functions by reference,
> > + * but there's an annoying edge case. If va_list was originally passed
> > + * to us by value, we could just pass &ap down to the helpers. This is
> > + * the case on, for example, X86_32.
> > + * However, on X86_64 (and possibly others), va_list is actually a
> > + * size-1 array containing a structure. Our function parameter ap has
> > + * decayed from T[1] to T*, and &ap has type T** rather than T(*)[1],
> > + * which is what will be expected by a function taking a va_list *
> > + * parameter.
> > + * One standard way to solve this mess is by creating a copy in a local
> > + * variable of type va_list and then passing a pointer to that local
> > + * copy instead, which is what we do here.
> > + */
> > + va_copy(args, va);
> >
> > s.buffer = buf;
> > s.remain = size - 1;
> > @@ -160,6 +213,7 @@ int vsnprintf(char *buf, int size, const char *fmt, va_list va)
> > strprops_t props;
> > memset(&props, 0, sizeof(props));
> > props.pad = ' ';
> > + props.precision = -1;
> >
> > if (f != '%') {
> > addchar(&s, f);
> > @@ -172,11 +226,14 @@ int vsnprintf(char *buf, int size, const char *fmt, va_list va)
> > addchar(&s, '%');
> > break;
> > case 'c':
> > - addchar(&s, va_arg(va, int));
> > + addchar(&s, va_arg(args, int));
> > break;
> > case '\0':
> > --fmt;
> > break;
> > + case '.':
> > + props.precision = get_int(&fmt, &args);
> > + goto morefmt;
> > case '#':
> > props.alternate = true;
> > goto morefmt;
> > @@ -204,54 +261,55 @@ int vsnprintf(char *buf, int size, const char *fmt, va_list va)
> > case 'd':
> > switch (nlong) {
> > case 0:
> > - print_int(&s, va_arg(va, int), 10, props);
> > + print_int(&s, va_arg(args, int), 10, props);
> > break;
> > case 1:
> > - print_int(&s, va_arg(va, long), 10, props);
> > + print_int(&s, va_arg(args, long), 10, props);
> > break;
> > default:
> > - print_int(&s, va_arg(va, long long), 10, props);
> > + print_int(&s, va_arg(args, long long), 10, props);
> > break;
> > }
> > break;
> > case 'u':
> > switch (nlong) {
> > case 0:
> > - print_unsigned(&s, va_arg(va, unsigned), 10, props);
> > + print_unsigned(&s, va_arg(args, unsigned), 10, props);
> > break;
> > case 1:
> > - print_unsigned(&s, va_arg(va, unsigned long), 10, props);
> > + print_unsigned(&s, va_arg(args, unsigned long), 10, props);
> > break;
> > default:
> > - print_unsigned(&s, va_arg(va, unsigned long long), 10, props);
> > + print_unsigned(&s, va_arg(args, unsigned long long), 10, props);
> > break;
> > }
> > break;
> > case 'x':
> > switch (nlong) {
> > case 0:
> > - print_unsigned(&s, va_arg(va, unsigned), 16, props);
> > + print_unsigned(&s, va_arg(args, unsigned), 16, props);
> > break;
> > case 1:
> > - print_unsigned(&s, va_arg(va, unsigned long), 16, props);
> > + print_unsigned(&s, va_arg(args, unsigned long), 16, props);
> > break;
> > default:
> > - print_unsigned(&s, va_arg(va, unsigned long long), 16, props);
> > + print_unsigned(&s, va_arg(args, unsigned long long), 16, props);
> > break;
> > }
> > break;
> > case 'p':
> > props.alternate = true;
> > - print_unsigned(&s, (unsigned long)va_arg(va, void *), 16, props);
> > + print_unsigned(&s, (unsigned long)va_arg(args, void *), 16, props);
> > break;
> > case 's':
> > - print_str(&s, va_arg(va, const char *), props);
> > + print_str(&s, va_arg(args, const char *), props);
> > break;
> > default:
> > addchar(&s, f);
> > break;
> > }
> > }
> > + va_end(args);
> > *s.buffer = 0;
> > return s.added;
> > }
> > --
> > 2.25.1
> >
>
> I think I should also post a patches that finally reformat these older
> files. The tab+4spaces stuff must go!
>
> When we get ctype we'll want to move out isdigit, but otherwise
>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
Actually, I'd prefer we make the feature work correctly for %d/%x/%#
from the beginning. It probably wouldn't take much to ensure precision
acts as a minimum (with zero padding when necessary) for numbers.
Thanks,
drew
next prev parent reply other threads:[~2022-05-19 16:02 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-06 20:55 [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 01/23] lib: Move acpi header and implementation to lib Nikos Nikoleris
2022-05-19 13:21 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 02/23] lib: Ensure all struct definition for ACPI tables are packed Nikos Nikoleris
2022-05-19 13:17 ` Andrew Jones
2022-05-19 15:52 ` Nikos Nikoleris
2022-05-19 17:14 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 03/23] lib: Add support for the XSDT ACPI table Nikos Nikoleris
2022-05-19 13:30 ` Andrew Jones
2022-06-18 0:38 ` Ricardo Koller
2022-06-20 8:53 ` Alexandru Elisei
2022-06-20 11:06 ` Nikos Nikoleris
2022-06-21 12:25 ` Alexandru Elisei
2022-06-21 11:26 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 04/23] lib: Extend the definition of the ACPI table FADT Nikos Nikoleris
2022-05-19 13:42 ` Andrew Jones
2022-06-18 1:00 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 05/23] arm/arm64: Add support for setting up the PSCI conduit through ACPI Nikos Nikoleris
2022-05-19 13:54 ` Andrew Jones
2022-06-21 16:06 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 06/23] arm/arm64: Add support for discovering the UART " Nikos Nikoleris
2022-05-19 13:59 ` Andrew Jones
2022-06-21 16:07 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 07/23] arm/arm64: Add support for timer initialization " Nikos Nikoleris
2022-05-19 14:10 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 08/23] arm/arm64: Add support for cpu " Nikos Nikoleris
2022-05-19 14:23 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 09/23] lib/printf: Support for precision modifier in printing strings Nikos Nikoleris
2022-05-19 14:52 ` Andrew Jones
2022-05-19 16:02 ` Andrew Jones [this message]
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 10/23] lib/printf: Add support for printing wide strings Nikos Nikoleris
2022-06-21 16:11 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 11/23] lib/efi: Add support for getting the cmdline Nikos Nikoleris
2022-06-21 16:33 ` Ricardo Koller
2022-06-27 16:12 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 12/23] arm/arm64: mmu_disable: Clean and invalidate before disabling Nikos Nikoleris
2022-05-13 13:15 ` Alexandru Elisei
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 13/23] arm/arm64: Rename etext to _etext Nikos Nikoleris
2022-06-21 16:42 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 14/23] lib: Avoid ms_abi for calls related to EFI on arm64 Nikos Nikoleris
2022-05-20 14:02 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 15/23] arm64: Add a new type of memory type flag MR_F_RESERVED Nikos Nikoleris
2022-06-21 16:44 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 16/23] arm/arm64: Add a setup sequence for systems that boot through EFI Nikos Nikoleris
2022-05-13 13:31 ` Alexandru Elisei
2022-06-27 16:36 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 17/23] arm64: Copy code from GNU-EFI Nikos Nikoleris
2022-06-21 17:59 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 18/23] arm64: Change gnu-efi imported file to use defined types Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 19/23] arm64: Use code from the gnu-efi when booting with EFI Nikos Nikoleris
2022-06-21 22:32 ` Ricardo Koller
2022-06-27 17:10 ` Nikos Nikoleris
2022-06-30 5:13 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 20/23] lib: Avoid external dependency in libelf Nikos Nikoleris
2022-06-21 22:39 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 21/23] x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile Nikos Nikoleris
2022-06-21 22:45 ` Ricardo Koller
2022-06-22 13:47 ` Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 22/23] arm64: Add support for efi in Makefile Nikos Nikoleris
2022-06-21 22:51 ` Ricardo Koller
2022-06-22 13:52 ` Nikos Nikoleris
2022-06-21 22:52 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 23/23] arm64: Add an efi/run script Nikos Nikoleris
2022-06-21 23:09 ` Ricardo Koller
2022-06-22 14:13 ` Nikos Nikoleris
2022-06-30 5:22 ` Ricardo Koller
2022-05-13 14:09 ` [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Alexandru Elisei
2022-05-18 9:00 ` Nikos Nikoleris
2022-05-20 9:58 ` Alexandru Elisei
2022-05-17 17:56 ` Ricardo Koller
2022-05-18 12:44 ` Nikos Nikoleris
2022-05-18 16:10 ` Ricardo Koller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220519160200.2shxxux6it63rzz6@gator \
--to=drjones@redhat.com \
--cc=alexandru.elisei@arm.com \
--cc=jade.alglave@arm.com \
--cc=kvm@vger.kernel.org \
--cc=nikos.nikoleris@arm.com \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox