[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 20/23] libxlu: record line and column number when parsing values
On Fri, Mar 06, 2015 at 11:36:03AM +0000, Ian Jackson wrote: > Wei Liu writes ("[PATCH v6 20/23] libxlu: record line and column number when > parsing values"): > > Originally only setting has line number recorded. Since we're moving to > > more sophisticated API, record line number and column number for > > individual value. They are useful for error reporting. > > This is a good idea. > > Why not use the flex location type in your formal parameters > everywhere ? That would mean plumbing one rather than two values. > Ack. This is how it looks like now. The changes are 1. Use YYLTYPE instead of line and column. 2. Handle empty rule inside list_mk and string_mk (that is when YYLTYPE points to NULL) ---8<--- From 2594d29a21909b8039e0f09001a44035af8f5f5b Mon Sep 17 00:00:00 2001 From: Wei Liu <wei.liu2@xxxxxxxxxx> Date: Mon, 16 Feb 2015 19:01:12 +0000 Subject: [PATCH] libxlu: record line and column number when parsing values Originally only setting has line number recorded. Since we're moving to more sophisticated API, record line number and column number for individual value. They are useful for error reporting. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- Changes in v7: 1. Use YYLTYPE instead of individual line / column values. --- tools/libxl/libxlu_cfg.c | 16 ++++++++++++++-- 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 | 1 + 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c index 611f5ec..0c69573 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,11 @@ XLU_ConfigValue *xlu__cfg_string_mk(CfgParseContext *ctx, char *atom) if (!value) goto xe; value->type = XLU_STRING; value->u.string = atom; + if (loc) { + value->line = loc->first_line; + value->column = loc->first_column; + } else + value->line = value->column = 0; return value; @@ -333,7 +339,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 +357,11 @@ XLU_ConfigValue *xlu__cfg_list_mk(CfgParseContext *ctx, value->u.list.nvalues = 1; value->u.list.avalues = 1; value->u.list.values = values; + if (loc) { + value->line = loc->first_line; + value->column = loc->first_column; + } else + value->line = value->column = 0; 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..7e690d5 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,NULL); } 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..c9437c9 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,NULL); } | 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..73fd85f 100644 --- a/tools/libxl/libxlu_internal.h +++ b/tools/libxl/libxlu_internal.h @@ -44,6 +44,7 @@ struct XLU_ConfigValue { char *string; XLU_ConfigList list; } u; + int line, column; }; typedef struct XLU_ConfigSetting { /* transparent */ -- 1.9.1 > Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |