|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |