public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: Alejandro Colomar <alx.manpages@gmail.com>, libc-alpha@sourceware.org
Subject: Re: [PATCH] stdio-common/printf-prs.c: Simplify test
Date: Mon, 29 Mar 2021 16:32:41 -0300	[thread overview]
Message-ID: <0a435dd4-2ea3-952e-d8bf-72cf3a7b6105@linaro.org> (raw)
In-Reply-To: <20210324180718.28006-1-alx.manpages@gmail.com>



On 24/03/2021 15:07, Alejandro Colomar via Libc-alpha wrote:
> The test was being repeated for all the remaining code in the for loop.
> Test once, and 'continue' to next iteration if necessary, so that the
> following code can assume that the necessary condition is met.
> 
> Minor changes: fix some mixed tabs & spaces to use spaces only.
> 
> Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>

We do not use SCO, but rather Copyright assignment.  And I think we will
need to add a testcase for this change, this simple program below shows
a complete different result with this patch applied:

---

x86_64-linux-gnu$ cat test.c
#include <stdio.h>
#include <printf.h>
#include <sys/param.h>

static void
print_argtype (int argtype)
{
  if ((argtype & ~PA_FLAG_MASK) == PA_INT)
    printf ("PA_INT");
  else if ((argtype & ~PA_FLAG_MASK) == PA_CHAR)
    printf ("PA_CHAR");
  else if ((argtype & ~PA_FLAG_MASK) == PA_STRING)
    printf ("PA_STRING");
  else if ((argtype & ~PA_FLAG_MASK) == PA_POINTER)
    printf ("PA_POINTER");
  else if ((argtype & ~PA_FLAG_MASK) == PA_FLOAT)
    printf ("PA_FLOAT");
  else if ((argtype & ~PA_FLAG_MASK) == PA_DOUBLE)
    printf ("PA_DOUBLE");
  else
    printf ("UNKNOWN");

  if ((argtype & PA_FLAG_MASK) == PA_FLAG_PTR)
    printf ("| PA_FLAG_PTR");
  if ((argtype & PA_FLAG_MASK) == PA_FLAG_SHORT)
    printf ("| PA_FLAG_SHORT");
  if ((argtype & PA_FLAG_MASK) == PA_FLAG_LONG)
    printf (" | PA_FLAG_LONG");
  if ((argtype & PA_FLAG_MASK) == PA_FLAG_LONG_LONG)
    printf (" | PA_FLAG_LONG_LONG");
  if ((argtype & PA_FLAG_MASK) == PA_FLAG_LONG_DOUBLE)
    printf (" | PA_FLAG_LONG_DOUBLE");

  printf ("\n");
}

static void
test_parse_printf_format (int maxsize)
{
  int argtypes[maxsize];
  size_t argtypes_s = sizeof (argtypes) / sizeof (argtypes[0]);
  size_t s = parse_printf_format (
    "%10u foo %% %+2.3f %ld %s %lld %jd %zu %ld",
    argtypes_s, argtypes);

  for (int i = 0; i < MIN (s, argtypes_s); i++)
    print_argtype (argtypes[i]);
  printf ("\n");
}

int main (int argc, char *argv[])
{
  test_parse_printf_format (4);
  test_parse_printf_format (20);

  return 0;
}
x86_64-linux-gnu$ gcc -Wall test.c -o test
x86_64-linux-gnu$ ./test
PA_INT
PA_DOUBLE
PA_INT | PA_FLAG_LONG
PA_STRING

PA_INT
PA_DOUBLE
PA_INT | PA_FLAG_LONG
PA_STRING
PA_INT | PA_FLAG_LONG
PA_INT | PA_FLAG_LONG
PA_INT | PA_FLAG_LONG
PA_INT | PA_FLAG_LONG

x86_64-linux-gnu$ ./testrun.sh ./test
PA_INT
PA_INT
PA_INT
PA_INT

UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN



> ---
>  stdio-common/printf-prs.c | 44 ++++++++++++++++++++-------------------
>  1 file changed, 23 insertions(+), 21 deletions(-)
> 
> diff --git a/stdio-common/printf-prs.c b/stdio-common/printf-prs.c
> index 1d4e00553d..a0c5c5487b 100644
> --- a/stdio-common/printf-prs.c
> +++ b/stdio-common/printf-prs.c
> @@ -72,30 +72,32 @@ parse_printf_format (const char *fmt, size_t n, int *argtypes)
>        /* Parse this spec.  */
>        nargs += __parse_one_specmb (f, nargs, &spec, &max_ref_arg);
>  
> +      if ((size_t) spec.width_arg >= n)
> +        continue;
> +
>        /* If the width is determined by an argument this is an int.  */
> -      if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
> -	argtypes[spec.width_arg] = PA_INT;
> +      if (spec.width_arg != -1)
> +        argtypes[spec.width_arg] = PA_INT;
>  
>        /* If the precision is determined by an argument this is an int.  */
> -      if (spec.prec_arg != -1 && (size_t) spec.prec_arg < n)
> -	argtypes[spec.prec_arg] = PA_INT;
> -
> -      if ((size_t) spec.data_arg < n)
> -	switch (spec.ndata_args)
> -	  {
> -	  case 0:		/* No arguments.  */
> -	    break;
> -	  case 1:		/* One argument; we already have the type.  */
> -	    argtypes[spec.data_arg] = spec.data_arg_type;
> -	    break;
> -	  default:
> -	    /* We have more than one argument for this format spec.  We must
> -               call the arginfo function again to determine all the types.  */
> -	    (void) (*__printf_arginfo_table[spec.info.spec])
> -	      (&spec.info, n - spec.data_arg, &argtypes[spec.data_arg],
> -	       &spec.size);
> -	    break;
> -	  }
> +      if (spec.prec_arg != -1)
> +        argtypes[spec.prec_arg] = PA_INT;
> +
> +      switch (spec.ndata_args)
> +        {
> +        case 0:		/* No arguments.  */
> +          break;
> +        case 1:		/* One argument; we already have the type.  */
> +          argtypes[spec.data_arg] = spec.data_arg_type;
> +          break;
> +        default:
> +          /* We have more than one argument for this format spec.  We must
> +             call the arginfo function again to determine all the types.  */
> +          (void) (*__printf_arginfo_table[spec.info.spec])
> +            (&spec.info, n - spec.data_arg, &argtypes[spec.data_arg],
> +             &spec.size);
> +          break;
> +        }
>      }
>  
>    return MAX (nargs, max_ref_arg);
> 

  reply	other threads:[~2021-03-29 19:32 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-24 18:07 Alejandro Colomar
2021-03-29 19:32 ` Adhemerval Zanella [this message]
2021-03-29 20:35   ` Alejandro Colomar (man-pages)
2021-03-29 20:43     ` Adhemerval Zanella

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=0a435dd4-2ea3-952e-d8bf-72cf3a7b6105@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=alx.manpages@gmail.com \
    --cc=libc-alpha@sourceware.org \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).