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

Re: [Xen-devel] [PATCH v7 18/21] libxlu: record location when parsing values



On Mon, 2015-03-09 at 12:51 +0000, Wei Liu wrote:
> Originally only setting has line number recorded. Since we're moving to
> more sophisticated API, record the location for individual value. It is
> useful for error reporting.
> 
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>

I'm leaving this one to Ian.

Do we need to rerun something (bison/flex?) on commit?

> ---
> Changes in v7:
> 1. Use yylloc in empty rule.
> 1. Use YYLTYPE instead of individual line / column values.
> ---
>  tools/libxl/libxlu_cfg.c      | 14 ++++++++++----
>  tools/libxl/libxlu_cfg_i.h    |  5 +++--
>  tools/libxl/libxlu_cfg_y.c    |  6 +++---
>  tools/libxl/libxlu_cfg_y.y    |  6 +++---
>  tools/libxl/libxlu_internal.h |  2 ++
>  5 files changed, 21 insertions(+), 12 deletions(-)
> 
> diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c
> index 611f5ec..858f894 100644
> --- a/tools/libxl/libxlu_cfg.c
> +++ b/tools/libxl/libxlu_cfg.c
> @@ -311,16 +311,19 @@ const char *xlu_cfg_get_listitem(const XLU_ConfigList 
> *list, int entry) {
>  }
>  
> 
> -XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx, char *atom)
> +XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx, char *atom,
> +                                    YYLTYPE *loc)
>  {
>      XLU_ConfigValue *value = NULL;
>  
>      if (ctx->err) goto x;
>  
> -    value = malloc(sizeof(*value));
> +    value = malloc(sizeof(*value)+sizeof(*loc));
>      if (!value) goto xe;
>      value->type = XLU_STRING;
>      value->u.string = atom;
> +    value->loc = (YYLTYPE *)(value+1);
> +    memcpy(value->loc, loc, sizeof(*loc));
>  
>      return value;
>  
> @@ -333,7 +336,8 @@ XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx, 
> char *atom)
>  }
>  
>  XLU_ConfigValue *xlu__cfg_list_mk(CfgParseContext *ctx,
> -                                  XLU_ConfigValue *val)
> +                                  XLU_ConfigValue *val,
> +                                  YYLTYPE *loc)
>  {
>      XLU_ConfigValue *value = NULL;
>      XLU_ConfigValue **values = NULL;
> @@ -344,12 +348,14 @@ XLU_ConfigValue *xlu__cfg_list_mk(CfgParseContext *ctx,
>      if (!values) goto xe;
>      values[0] = val;
>  
> -    value = malloc(sizeof(*value));
> +    value = malloc(sizeof(*value)+sizeof(*loc));
>      if (!value) goto xe;
>      value->type = XLU_LIST;
>      value->u.list.nvalues = 1;
>      value->u.list.avalues = 1;
>      value->u.list.values = values;
> +    value->loc = (YYLTYPE *)(value+1);
> +    memcpy(value->loc, loc, sizeof(*loc));
>  
>      return value;
>  
> diff --git a/tools/libxl/libxlu_cfg_i.h b/tools/libxl/libxlu_cfg_i.h
> index 11dc33f..1b59b33 100644
> --- a/tools/libxl/libxlu_cfg_i.h
> +++ b/tools/libxl/libxlu_cfg_i.h
> @@ -26,9 +26,10 @@ void xlu__cfg_set_free(XLU_ConfigSetting *set);
>  void xlu__cfg_set_store(CfgParseContext*, char *name,
>                          XLU_ConfigValue *val, int lineno);
>  XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx,
> -                                    char *atom);
> +                                    char *atom, YYLTYPE *loc);
>  XLU_ConfigValue *xlu__cfg_list_mk(CfgParseContext *ctx,
> -                                  XLU_ConfigValue *val);
> +                                  XLU_ConfigValue *val,
> +                                  YYLTYPE *loc);
>  void xlu__cfg_list_append(CfgParseContext *ctx,
>                            XLU_ConfigValue *list,
>                            XLU_ConfigValue *val);
> diff --git a/tools/libxl/libxlu_cfg_y.c b/tools/libxl/libxlu_cfg_y.c
> index b05e48b..fbfdd0f 100644
> --- a/tools/libxl/libxlu_cfg_y.c
> +++ b/tools/libxl/libxlu_cfg_y.c
> @@ -1515,7 +1515,7 @@ yyreduce:
>  
>  /* Line 1806 of yacc.c  */
>  #line 62 "libxlu_cfg_y.y"
> -    { (yyval.value)= xlu__cfg_string_mk(ctx,(yyvsp[(1) - (1)].string)); }
> +    { (yyval.value)= xlu__cfg_string_mk(ctx,(yyvsp[(1) - 
> (1)].string),&(yylsp[(1) - (1)])); }
>      break;
>  
>    case 13:
> @@ -1543,7 +1543,7 @@ yyreduce:
>  
>  /* Line 1806 of yacc.c  */
>  #line 68 "libxlu_cfg_y.y"
> -    { (yyval.value)= xlu__cfg_list_mk(ctx,NULL); }
> +    { (yyval.value)= xlu__cfg_list_mk(ctx,NULL,&yylloc); }
>      break;
>  
>    case 17:
> @@ -1564,7 +1564,7 @@ yyreduce:
>  
>  /* Line 1806 of yacc.c  */
>  #line 72 "libxlu_cfg_y.y"
> -    { (yyval.value)= xlu__cfg_list_mk(ctx,(yyvsp[(1) - (2)].value)); }
> +    { (yyval.value)= xlu__cfg_list_mk(ctx,(yyvsp[(1) - 
> (2)].value),&(yylsp[(1) - (2)])); }
>      break;
>  
>    case 20:
> diff --git a/tools/libxl/libxlu_cfg_y.y b/tools/libxl/libxlu_cfg_y.y
> index 4a5ca3a..a923f76 100644
> --- a/tools/libxl/libxlu_cfg_y.y
> +++ b/tools/libxl/libxlu_cfg_y.y
> @@ -59,17 +59,17 @@ assignment: IDENT '=' value { 
> xlu__cfg_set_store(ctx,$1,$3,@3.first_line); }
>  endstmt: NEWLINE
>   |      ';'
>  
> -value:  atom                         { $$= xlu__cfg_string_mk(ctx,$1); }
> +value:  atom                         { $$= xlu__cfg_string_mk(ctx,$1,&@1); }
>   |      '[' nlok valuelist ']'       { $$= $3; }
>  
>  atom:   STRING                   { $$= $1; }
>   |      NUMBER                   { $$= $1; }
>  
> -valuelist: /* empty */           { $$= xlu__cfg_list_mk(ctx,NULL); }
> +valuelist: /* empty */           { $$= xlu__cfg_list_mk(ctx,NULL,&yylloc); }
>   |      values                  { $$= $1; }
>   |      values ',' nlok         { $$= $1; }
>  
> -values: value nlok                  { $$= xlu__cfg_list_mk(ctx,$1); }
> +values: value nlok                  { $$= xlu__cfg_list_mk(ctx,$1,&@1); }
>   |      values ',' nlok value nlok  { xlu__cfg_list_append(ctx,$1,$4); $$= 
> $1; }
>  
>  nlok:
> diff --git a/tools/libxl/libxlu_internal.h b/tools/libxl/libxlu_internal.h
> index 092a17a..cc1d400 100644
> --- a/tools/libxl/libxlu_internal.h
> +++ b/tools/libxl/libxlu_internal.h
> @@ -38,12 +38,14 @@ typedef struct XLU_ConfigList {
>      XLU_ConfigValue **values;
>  } XLU_ConfigList;
>  
> +typedef struct YYLTYPE YYLTYPE;
>  struct XLU_ConfigValue {
>      enum XLU_ConfigValueType type;
>      union {
>          char *string;
>          XLU_ConfigList list;
>      } u;
> +    YYLTYPE *loc;
>  };
>  
>  typedef struct XLU_ConfigSetting { /* transparent */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.