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.l...@citrix.com> Cc: Ian Campbell <ian.campb...@citrix.com> Cc: Ian Jackson <ian.jack...@eu.citrix.com> --- Changes in v8: 1. Define YYLTYPE in libxl_internal.h and get rid of my hack. Changes in v7: 1. Use yylloc in empty rule. 1. Use YYLTYPE instead of individual line / column values. --- 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 611f5ec..938ea96 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 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..600ff68 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 */ -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel