poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] pkl: Add support for %% in format string


From: Jose E. Marchesi
Subject: Re: [PATCH] pkl: Add support for %% in format string
Date: Sun, 05 Dec 2021 01:08:40 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

Hi Mohammad.

This is OK for both master and maint/poke-1, provided you also document
the support for %% in doc/poke.texi in both branches.

Thanks!

> 2021-12-04  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>
>       * libpoke/pkl-trans.c (pkl_trans1_ps_format): Add support for `%%`
>       in format string of `printf` and `format`.
>       * testsuite/poke.pkl/printf-36.pk: New test.
>       * testsuite/poke.pkl/format-36.pk: Likewise.
>       * testsuite/Makefile.am (EXTRA_DIST): Update.
> ---
>  ChangeLog                       |   8 +++
>  libpoke/pkl-trans.c             | 119 +++++++++++++++++++-------------
>  testsuite/Makefile.am           |   2 +
>  testsuite/poke.pkl/format-36.pk |   5 ++
>  testsuite/poke.pkl/printf-36.pk |   3 +
>  5 files changed, 88 insertions(+), 49 deletions(-)
>  create mode 100644 testsuite/poke.pkl/format-36.pk
>  create mode 100644 testsuite/poke.pkl/printf-36.pk
>
> diff --git a/ChangeLog b/ChangeLog
> index 7fb5e42c..a3a82394 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,11 @@
> +2021-12-04  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
> +
> +     * libpoke/pkl-trans.c (pkl_trans1_ps_format): Add support for `%%`
> +     in format string of `printf` and `format`.
> +     * testsuite/poke.pkl/printf-36.pk: New test.
> +     * testsuite/poke.pkl/format-36.pk: Likewise.
> +     * testsuite/Makefile.am (EXTRA_DIST): Update.
> +
>  2021-12-04  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>  
>       * libpoke/libpoke.h (pk_map_decl_fn): Add new param (`pk_val value`).
> diff --git a/libpoke/pkl-trans.c b/libpoke/pkl-trans.c
> index 9943e22d..27d8fa73 100644
> --- a/libpoke/pkl-trans.c
> +++ b/libpoke/pkl-trans.c
> @@ -659,6 +659,9 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>  #define MAX_CLASS_TAGS 32
>    int nclasses = 0;
>    char *classes[MAX_CLASS_TAGS];
> +  int add_new_percent_arg_p = 0;
> +  int add_new_style_arg_p = 0;
> +  char *new_style_class = NULL;
>  
>    /* Calculate the number of arguments.  */
>    for (t = args; t; t = PKL_AST_CHAIN (t))
> @@ -692,7 +695,7 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>        int prefix = -1;
>  
>        assert (*p == '%');
> -      if (ntag >= nargs && p[1] != '>' && p[1] != '<')
> +      if (ntag >= nargs && p[1] != '%' && p[1] != '>' && p[1] != '<')
>          {
>            PKL_ERROR (PKL_AST_LOC (format), "not enough format arguments");
>            PKL_TRANS_PAYLOAD->errors++;
> @@ -728,6 +731,10 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>        /* Now process the rest of the tag.  */
>        switch (p[1])
>          {
> +        case '%':
> +          p += 2;
> +          add_new_percent_arg_p = 1;
> +          break;
>          case 'v':
>            p += 2;
>            PKL_AST_FORMAT_ARG_BASE (arg) = 0; /* Arbitrary.  */
> @@ -850,7 +857,6 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>              int end_sc = 0;
>              char *class = xmalloc (strlen (fmt) + 1);
>              size_t j;
> -            pkl_ast_node new_arg;
>  
>              end_sc = (p[1] == '>');
>              p += 2;
> @@ -897,53 +903,9 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>                  class = classes[--nclasses];
>                }
>  
> -            /* Create the new arg and add it to the list of
> -               arguments.  */
> -            new_arg = pkl_ast_make_format_arg (PKL_PASS_AST,
> -                                                   NULL);
> -            PKL_AST_LOC (new_arg) = PKL_AST_LOC (format_fmt);
> -
> -            if (end_sc)
> -              PKL_AST_FORMAT_ARG_END_SC (new_arg) = xstrdup (class);
> -            else
> -              PKL_AST_FORMAT_ARG_BEGIN_SC (new_arg) = class;
> -
> -            if (arg)
> -              {
> -                if (arg == PKL_AST_FORMAT_ARGS (format))
> -                  {
> -                    /* Prepend.  */
> -                    PKL_AST_CHAIN (new_arg) = arg;
> -                    PKL_AST_FORMAT_ARGS (format)
> -                      = ASTREF (new_arg);
> -                  }
> -                else
> -                  {
> -                    /* Add after.  */
> -                    PKL_AST_CHAIN (new_arg) = PKL_AST_CHAIN (prev_arg);
> -                    PKL_AST_CHAIN (prev_arg) = ASTREF (new_arg);
> -                  }
> -              }
> -            else
> -              {
> -                /* Append.  */
> -                if (!PKL_AST_FORMAT_ARGS (format))
> -                  PKL_AST_FORMAT_ARGS (format)
> -                    = ASTREF (new_arg);
> -                else
> -                  PKL_AST_FORMAT_ARGS (format)
> -                    = pkl_ast_chainon (PKL_AST_FORMAT_ARGS (format),
> -                                       new_arg);
> -              }
> -
> -            arg = new_arg;
> -
> -            /* The type corresponding to a styling class format
> -               directive is `void'.  */
> -            atype = pkl_ast_make_void_type (PKL_PASS_AST);
> -            PKL_AST_LOC (atype) = PKL_AST_LOC (format_fmt);
> -            types = pkl_ast_chainon (types, atype);
> -
> +            assert (new_style_class == NULL);
> +            new_style_class = end_sc ? xstrdup (class) : class;
> +            add_new_style_arg_p = 1;
>              break;
>            }
>          default:
> @@ -951,6 +913,65 @@ PKL_PHASE_BEGIN_HANDLER (pkl_trans1_ps_format)
>            goto invalid_tag;
>          }
>  
> +      assert (!(add_new_percent_arg_p && add_new_style_arg_p));
> +      if (add_new_percent_arg_p || add_new_style_arg_p)
> +        {
> +          pkl_ast_node new_arg;
> +
> +          /* Create the new arg and add it to the list of arguments.  */
> +          new_arg = pkl_ast_make_format_arg (PKL_PASS_AST, NULL);
> +          PKL_AST_LOC (new_arg) = PKL_AST_LOC (format_fmt);
> +
> +          if (add_new_percent_arg_p)
> +            PKL_AST_FORMAT_ARG_SUFFIX (new_arg) = xstrdup ("%");
> +          else if (add_new_style_arg_p)
> +            {
> +              int end_sc = p[-1] == '>';
> +
> +              assert (new_style_class != NULL);
> +              if (end_sc)
> +                PKL_AST_FORMAT_ARG_END_SC (new_arg) = new_style_class;
> +              else
> +                PKL_AST_FORMAT_ARG_BEGIN_SC (new_arg) = new_style_class;
> +              new_style_class = NULL;
> +            }
> +
> +          if (arg)
> +            {
> +              if (arg == PKL_AST_FORMAT_ARGS (format))
> +                {
> +                  /* Prepend.  */
> +                  PKL_AST_CHAIN (new_arg) = arg;
> +                  PKL_AST_FORMAT_ARGS (format) = ASTREF (new_arg);
> +                }
> +              else
> +                {
> +                  /* Add after.  */
> +                  PKL_AST_CHAIN (new_arg) = PKL_AST_CHAIN (prev_arg);
> +                  PKL_AST_CHAIN (prev_arg) = ASTREF (new_arg);
> +                }
> +            }
> +          else
> +            {
> +              /* Append.  */
> +              if (!PKL_AST_FORMAT_ARGS (format))
> +                PKL_AST_FORMAT_ARGS (format) = ASTREF (new_arg);
> +              else
> +                PKL_AST_FORMAT_ARGS (format)
> +                  = pkl_ast_chainon (PKL_AST_FORMAT_ARGS (format), new_arg);
> +            }
> +
> +          arg = new_arg;
> +
> +          /* The type corresponding to new arg is `void'.  */
> +          atype = pkl_ast_make_void_type (PKL_PASS_AST);
> +          PKL_AST_LOC (atype) = PKL_AST_LOC (format_fmt);
> +          types = pkl_ast_chainon (types, atype);
> +
> +          add_new_percent_arg_p = 0;
> +          add_new_style_arg_p = 0;
> +        }
> +
>        /* Add the optional suffix to the argument.  */
>        if (*p != '\0' && *p != '%')
>          {
> diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
> index aadbbddd..add9f58c 100644
> --- a/testsuite/Makefile.am
> +++ b/testsuite/Makefile.am
> @@ -1065,6 +1065,7 @@ EXTRA_DIST = \
>    poke.pkl/format-33.pk \
>    poke.pkl/format-34.pk \
>    poke.pkl/format-35.pk \
> +  poke.pkl/format-36.pk \
>    poke.pkl/format-diag-1.pk \
>    poke.pkl/formfeedchar.pk \
>    poke.pkl/fun-types-1.pk \
> @@ -1525,6 +1526,7 @@ EXTRA_DIST = \
>    poke.pkl/printf-33.pk \
>    poke.pkl/printf-34.pk \
>    poke.pkl/printf-35.pk \
> +  poke.pkl/printf-36.pk \
>    poke.pkl/printf-binary-1.pk \
>    poke.pkl/printf-binary-2.pk \
>    poke.pkl/printf-binary-3.pk \
> diff --git a/testsuite/poke.pkl/format-36.pk b/testsuite/poke.pkl/format-36.pk
> new file mode 100644
> index 00000000..b2df3211
> --- /dev/null
> +++ b/testsuite/poke.pkl/format-36.pk
> @@ -0,0 +1,5 @@
> +/* { dg-do run } */
> +
> +/* { dg-command {.set obase 10} } */
> +/* { dg-command {format("%%%i32d%%", 23)} } */
> +/* { dg-output {"%23%"} } */
> diff --git a/testsuite/poke.pkl/printf-36.pk b/testsuite/poke.pkl/printf-36.pk
> new file mode 100644
> index 00000000..c9231abf
> --- /dev/null
> +++ b/testsuite/poke.pkl/printf-36.pk
> @@ -0,0 +1,3 @@
> +/* { dg-do run } */
> +
> +printf "%%%i45o%%", -1;          /* { dg-output "%777777777777777%" } */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]