From 6ec86e91c89198f8a8e27eb33b54f68b4659312a Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 16 Mar 2015 09:52:37 +0000 Subject: [PATCH] libxlu: record location when parsing values 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 Cc: Ian Campbell Cc: Ian Jackson Acked-by: Ian Campbell --- tools/libxl/libxlu_cfg.c | 8 ++++++-- 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 | 10 ++++++++++ 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c index 611f5ec695..938ea9611b 100644 --- a/tools/libxl/libxlu_cfg.c +++ b/tools/libxl/libxlu_cfg.c @@ -311,7 +311,8 @@ 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; @@ -321,6 +322,7 @@ XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx, char *atom) if (!value) goto xe; value->type = XLU_STRING; value->u.string = atom; + memcpy(&value->loc, loc, sizeof(*loc)); return value; @@ -333,7 +335,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; @@ -350,6 +353,7 @@ XLU_ConfigValue *xlu__cfg_list_mk(CfgParseContext *ctx, value->u.list.nvalues = 1; value->u.list.avalues = 1; value->u.list.values = values; + 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 11dc33f815..1b59b3312f 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 b05e48bb77..fbfdd0fca0 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 4a5ca3a2ab..a923f7672d 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 092a17ae56..600ff68e94 100644 --- a/tools/libxl/libxlu_internal.h +++ b/tools/libxl/libxlu_internal.h @@ -38,12 +38,22 @@ typedef struct XLU_ConfigList { XLU_ConfigValue **values; } XLU_ConfigList; +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +#define YYLTYPE_IS_DECLARED + struct XLU_ConfigValue { enum XLU_ConfigValueType type; union { char *string; XLU_ConfigList list; } u; + YYLTYPE loc; }; typedef struct XLU_ConfigSetting { /* transparent */ -- 2.39.5