[Patch, Newlib-nano]Improve printf to support non nul-terminated string
Bin.Cheng
amker.cheng@gmail.com
Thu Nov 6 09:41:00 GMT 2014
On Thu, Nov 6, 2014 at 5:01 PM, Corinna Vinschen <vinschen@redhat.com> wrote:
>
> [Please don't CC me. I'm reading the mailing list anyway. Thanks]
>
> On Nov 6 13:53, Terry Guo wrote:
>> Thanks. Here is updated patch. Is this one OK?
>
> It's fine from my POV. Bin?
Hi,
We don't have write access, please help us apply it. Thanks very much.
Thanks,
bin
>
>
> Corinna
>
>>
>> BR,
>> Terry
>
>> diff --git a/newlib/libc/stdio/nano-vfprintf_i.c b/newlib/libc/stdio/nano-vfprintf_i.c
>> index b1b0d1d..b75a142 100644
>> --- a/newlib/libc/stdio/nano-vfprintf_i.c
>> +++ b/newlib/libc/stdio/nano-vfprintf_i.c
>> @@ -211,15 +211,15 @@ number:
>> case 's':
>> cp = GET_ARG (N, *ap, char_ptr_t);
>> /* Precision gives the maximum number of chars to be written from a
>> - string, and take prec == -1 into consideration. */
>> - if ((u_int)(pdata->size = strlen (cp)) > (u_int)(pdata->prec))
>> - pdata->size = pdata->prec;
>> - /* Below code is kept for reading. The check is redundant because
>> - pdata->prec will be set to pdata->size if it is -1 previously. */
>> -#if 0
>> - if (pdata->prec > pdata->size)
>> -#endif
>> - pdata->prec = pdata->size;
>> + string, and take prec == -1 into consideration.
>> + Use normal Newlib approach here to support case where cp is not
>> + nul-terminated. */
>> + char *p = memchr (cp, 0, pdata->prec);
>> +
>> + if (p != NULL)
>> + pdata->prec = p - cp;
>> +
>> + pdata->size = pdata->prec;
>> goto non_number_nosign;
>> default:
>> /* "%?" prints ?, unless ? is NUL. */
>> diff --git a/newlib/testsuite/newlib.stdio/nulprintf.c b/newlib/testsuite/newlib.stdio/nulprintf.c
>> new file mode 100644
>> index 0000000..5e4131b
>> --- /dev/null
>> +++ b/newlib/testsuite/newlib.stdio/nulprintf.c
>> @@ -0,0 +1,17 @@
>> +/*
>> + * Copyright (C) 2014 by ARM Ltd. All rights reserved.
>> + *
>> + * Permission to use, copy, modify, and distribute this software
>> + * is freely granted, provided that this notice is preserved.
>> + */
>> +
>> +#include <stdio.h>
>> +#include "check.h"
>> +
>> +const char m[8] = {'M','M','M','M','M','M','M','M'};
>> +
>> +int main()
>> +{
>> + printf ("%.*s\n", 8, m);
>> + exit (0);
>> +}
>
>
> --
> Corinna Vinschen
> Cygwin Maintainer
> Red Hat
More information about the Newlib
mailing list