poke-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] Use non-destructive parsing in pkl_struct_type_traverse


From: Tim Rühsen
Subject: Re: [PATCH] Use non-destructive parsing in pkl_struct_type_traverse
Date: Fri, 10 Apr 2020 18:11:25 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0

Pushed.

On 10.04.20 18:07, Jose E. Marchesi wrote:
> 
> Hi Tim.
> 
>     This removes the need for memory allocations and simplifies code.
>     
>     2020-04-09  Tim Rühsen  <address@hidden>
>     
>             * lib/pkl-ast.c (pkl_struct_type_traverse): Use
>             non-destructive parsing without memory allocations.
> 
> This is OK for master.
> Thanks!
> 
>     ---
>      ChangeLog     |  5 +++++
>      lib/pkl-ast.c | 46 ++++++++++++----------------------------------
>      2 files changed, 17 insertions(+), 34 deletions(-)
>     
>     diff --git a/lib/pkl-ast.c b/lib/pkl-ast.c
>     index 78e7261a..cacc1aa0 100644
>     --- a/lib/pkl-ast.c
>     +++ b/lib/pkl-ast.c
>     @@ -645,35 +645,24 @@ pkl_ast_dup_type (pkl_ast_node type)
>      pkl_ast_node
>      pkl_struct_type_traverse (pkl_ast_node type, const char *path)
>      {
>     -  char *trunk, *sub, *base;
>     +  const char *s, *e;
>     
>        if (PKL_AST_TYPE_CODE (type) != PKL_TYPE_STRUCT)
>          return NULL;
>     
>     -  trunk = strndup (path, strlen (path) - strlen (strrchr (path, '.')));
>     -  base = strtok (trunk, ".");
>     -
>     -  /* Node in the form XX. Check to silence the compiler about base not 
> used */
>     -  if (base == NULL)
>     -    {
>     -      free (trunk);
>     -      return type;
>     -    }
>     -
>     -  while ((sub = strtok (NULL, ".")) != NULL)
>     +  for (s = path, e = s; *e; s = e + 1)
>          {
>     -      pkl_ast_node ename;
>     -      pkl_ast_node etype, t;
>     -      char *field;
>     +      /* Ignore empty entries and ignore last part */
>     +      if ((e = strchrnul (s, ':')) == s || !*e)
>     +        continue;
>     
>     -      etype = NULL;
>     -
>     -      if (PKL_AST_TYPE_CODE (type) != PKL_TYPE_STRUCT)
>     -        goto out;
>     -
>     -      for (t = PKL_AST_TYPE_S_ELEMS (type); t;
>     +      for (pkl_ast_node t = PKL_AST_TYPE_S_ELEMS (type); t;
>                 t = PKL_AST_CHAIN (t))
>              {
>     +          pkl_ast_node ename;
>     +          pkl_ast_node etype;
>     +          const char *field;
>     +
>                if (PKL_AST_CODE (t) != PKL_AST_STRUCT_TYPE_FIELD)
>                  continue;
>     
>     @@ -682,22 +671,11 @@ pkl_struct_type_traverse (pkl_ast_node type, const 
> char *path)
>     
>                field = PKL_AST_IDENTIFIER_POINTER (ename);
>     
>     -          if (STREQ (field, sub))
>     -            {
>     -              type = etype;
>     -              break;
>     -            }
>     +          if (!strncmp (field, s, e - s) && !field[e - s])
>     +            return etype;
>              }
>     -
>     -      if (type != etype)
>     -        goto out;
>          }
>     
>     -  free (trunk);
>     -  return type;
>     -
>     -out:
>     -  free (trunk);
>        return NULL;
>      }
>     
>     --
>     2.26.0
> 

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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