[PATCH] Add "%d" support to _dl_debug_vdprintf
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Jun 9 14:39:41 GMT 2020
On 09/06/2020 11:18, Adhemerval Zanella wrote:
>
>
> On 05/06/2020 12:03, H.J. Lu via Libc-alpha wrote:
>> "%d" will be used to print out signed value.
>
> LGTM with some smalls nits below.
>
>> ---
>> elf/dl-misc.c | 31 +++++++++++++++++++++++++++++--
>> 1 file changed, 29 insertions(+), 2 deletions(-)
>>
>> diff --git a/elf/dl-misc.c b/elf/dl-misc.c
>> index ab70481fda..c82c8ae6fa 100644
>> --- a/elf/dl-misc.c
>> +++ b/elf/dl-misc.c
>> @@ -167,6 +167,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
>> switch (*fmt)
>> {
>> /* Integer formatting. */
>> + case 'd':
>> case 'u':
>> case 'x':
>> {
>
> Ok.
>
>> @@ -179,11 +180,34 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
>> #else
>> unsigned long int num = va_arg (arg, unsigned int);
>> #endif
>> + bool negative = false;
>> + if (*fmt == 'd')
>> + {
>> +#if LONG_MAX != INT_MAX
>> + if (long_mod)
>> + {
>> + if ((long) num < 0)
>
> Full type specify on cast.
>
>> + negative = true;
>> + }
>> + else
>> + {
>> + if ((int) num < 0)> + {
>> + num = (unsigned int) num;
>> + negative = true;
>> + }
>> + }
>> +#else
>> + if ((int) num < 0)
>> + negative = true;
>> +#endif
>> + }
>> +
>> /* We use alloca() to allocate the buffer with the most
>> pessimistic guess for the size. Using alloca() allows
>> having more than one integer formatting in a call. */
>> - char *buf = (char *) alloca (3 * sizeof (unsigned long int));
>> - char *endp = &buf[3 * sizeof (unsigned long int)];
>> + char *buf = (char *) alloca (1 + 3 * sizeof (unsigned long int));
>> + char *endp = &buf[1 + 3 * sizeof (unsigned long int)];
>
> I think we can remove alloca here and use INT_STRLEN_BOUND (since the
> string is not '\0' bounded due the writev usage). Something like:
Sigh, you can't actually remove the alloca here.
>
> char buf[INT_STRLEN_BOUND (unsigned long int)];
> char *endp = &buf[INT_STRLEN_BOUND (unsigned long int)];
>
>> char *cp = _itoa (num, endp, *fmt == 'x' ? 16 : 10, 0);
>>
>> /* Pad to the width the user specified. */
>> @@ -191,6 +215,9 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
>> while (endp - cp < width)
>> *--cp = fill;
>>
>> + if (negative)
>> + *--cp = '-';
>> +
>> iov[niov].iov_base = cp;
>> iov[niov].iov_len = endp - cp;
>> ++niov;
>>
>
> Ok.
>
More information about the Libc-alpha
mailing list