From 6fc8a69dff014fd78cc0473857dd4db364db9e7f Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 27 Nov 2019 22:02:39 +0100 Subject: [PATCH] Fixed: [xpath_tree2cbuf() changes integers into floating point representations #99](https://github.com/clicon/clixon/issues/99) --- CHANGELOG.md | 3 +- lib/clixon/clixon_xpath.h | 1 + lib/src/clixon_xpath | Bin 25708 -> 0 bytes lib/src/clixon_xpath.c | 8 +-- lib/src/clixon_xpath_parse.l | 2 +- lib/src/clixon_xpath_parse.y | 98 +++++++++++++++++++---------------- 6 files changed, 61 insertions(+), 51 deletions(-) delete mode 100644 lib/src/clixon_xpath diff --git a/CHANGELOG.md b/CHANGELOG.md index bd58463e..d92916e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,12 +14,13 @@ ### API changes on existing features (you may need to change your code) * Yang files reorganized into three classes: clixon, mandatory, optional (previous "standard" split into mandatory and optional). * Clixon and mandatory yang spec are always installed - * Optional yang files are loaded only if configured with `--enable-optyangs` (flipped lofgic and changed from `disable-stdyangs`). NOTE: you must do this to run examples and tests. + * Optional yang files are loaded only if configured with `--enable-optyangs` (flipped logic and changed from `disable-stdyangs`). NOTE: you must do this to run examples and tests. * Optional yang files can be installed in a separate dir with `--with-opt-yang-installdir=DIR` (renamed from `with-std-yang-installdir`) * The multi-namespace augment state may rearrange the XML namespace attributes. * Main example yang changed to incorporate augmented state, new revision is 2019-11-15. ### Corrected Bugs +* [xpath_tree2cbuf() changes integers into floating point representations #99](https://github.com/clicon/clixon/issues/99) * [xml_parse_string() is slow for a long XML string #96](https://github.com/clicon/clixon/issues/96) * Mandatory variables can no longer be deleted. * [Add missing includes](https://github.com/clicon/clixon/pulls) diff --git a/lib/clixon/clixon_xpath.h b/lib/clixon/clixon_xpath.h index 0998da16..338dc002 100644 --- a/lib/clixon/clixon_xpath.h +++ b/lib/clixon/clixon_xpath.h @@ -106,6 +106,7 @@ struct xpath_tree{ enum xp_type xs_type; int xs_int; /* step-> axis-type */ double xs_double; + char *xs_strnr; /* original string xs_double: numeric value */ char *xs_s0; char *xs_s1; struct xpath_tree *xs_c0; /* child 0 */ diff --git a/lib/src/clixon_xpath b/lib/src/clixon_xpath deleted file mode 100644 index 472df3d5d30e5620c9625a568090f163f158d92c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25708 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ΜYBu-j{vzkL4h|Nm}q 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 X${f%P9Jo9K2VF@Ks$$5LA*vVvgsp2$ diff --git a/lib/src/clixon_xpath.c b/lib/src/clixon_xpath.c index 33b094f9..3a9b48d0 100644 --- a/lib/src/clixon_xpath.c +++ b/lib/src/clixon_xpath.c @@ -180,8 +180,8 @@ xpath_tree_print0(cbuf *cb, cprintf(cb, "%d ", xs->xs_int); break; } - if (xs->xs_double) - cprintf(cb,"%lf ", xs->xs_double); + if (xs->xs_strnr) + cprintf(cb,"%s ", xs->xs_strnr); cprintf(cb, "\n"); if (xs->xs_c0) xpath_tree_print0(cb, xs->xs_c0,level+1); @@ -253,7 +253,7 @@ xpath_tree2cbuf(xpath_tree *xs, cprintf(xcb, "'%s'", xs->xs_s0); break; case XP_PRIME_NR: - cprintf(xcb, "%lf", xs->xs_double); + cprintf(xcb, "%s", xs->xs_strnr?xs->xs_strnr:"0"); break; case XP_STEP: switch (xs->xs_int){ @@ -313,6 +313,8 @@ xpath_tree2cbuf(xpath_tree *xs, int xpath_tree_free(xpath_tree *xs) { + if (xs->xs_strnr) + free(xs->xs_strnr); if (xs->xs_s0) free(xs->xs_s0); if (xs->xs_s1) diff --git a/lib/src/clixon_xpath_parse.l b/lib/src/clixon_xpath_parse.l index 31699443..8676b9d1 100644 --- a/lib/src/clixon_xpath_parse.l +++ b/lib/src/clixon_xpath_parse.l @@ -140,7 +140,7 @@ real ({digit}+[.]{digit}*)|({digit}*[.]{digit}+) \" { BEGIN(QLITERAL); return QUOTE; } \' { BEGIN(ALITERAL); return APOST; } -\-?({integer}|{real}) { sscanf(yytext,"%lf",&clixon_xpath_parselval.dval); return NUMBER;} +\-?({integer}|{real}) { clixon_xpath_parselval.string = strdup(yytext); return NUMBER; } [0-9A-Za-z_\-]+ { clixon_xpath_parselval.string = strdup(yytext); return NAME; /* rather be catch-all */ } diff --git a/lib/src/clixon_xpath_parse.y b/lib/src/clixon_xpath_parse.y index 0fdeac5e..a5050aaa 100644 --- a/lib/src/clixon_xpath_parse.y +++ b/lib/src/clixon_xpath_parse.y @@ -44,7 +44,6 @@ %union { int intval; - double dval; char *string; void *stack; /* xpath_tree */ } @@ -54,8 +53,7 @@ %token ADDOP %token RELOP -%token NUMBER - +%token NUMBER %token X_EOF %token QUOTE %token APOST @@ -161,13 +159,13 @@ xpath_parse_exit(struct clicon_xpath_yacc_arg *xy) static xpath_tree * xp_new(enum xp_type type, int i0, - double d0, + char *numstr, char *s0, char *s1, xpath_tree *c0, xpath_tree *c1) { - xpath_tree *xs = NULL; + xpath_tree *xs = NULL; if ((xs = malloc(sizeof(xpath_tree))) == NULL){ clicon_err(OE_XML, errno, "malloc"); @@ -176,7 +174,15 @@ xp_new(enum xp_type type, memset(xs, 0, sizeof(*xs)); xs->xs_type = type; xs->xs_int = i0; - xs->xs_double = d0; + if (numstr){ + xs->xs_strnr = numstr; + if (sscanf(numstr, "%lf", &xs->xs_double) == EOF){ + clicon_err(OE_XML, errno, "sscanf"); + goto done; + } + } + else + xs->xs_double = 0.0; xs->xs_s0 = s0; xs->xs_s1 = s1; xs->xs_c0 = c0; @@ -196,50 +202,50 @@ start : expr X_EOF { _XY->xy_top=$1;clicon_debug(2,"start->expr"); | locationpath X_EOF { _XY->xy_top=$1;clicon_debug(2,"start->locationpath"); YYACCEPT; } ; -expr : expr LOGOP andexpr { $$=xp_new(XP_EXP,$2,0.0,NULL,NULL,$1, $3);clicon_debug(2,"expr->expr or andexpr"); } - | andexpr { $$=xp_new(XP_EXP,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"expr-> andexpr"); } +expr : expr LOGOP andexpr { $$=xp_new(XP_EXP,$2,NULL,NULL,NULL,$1, $3);clicon_debug(2,"expr->expr or andexpr"); } + | andexpr { $$=xp_new(XP_EXP,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"expr-> andexpr"); } ; -andexpr : andexpr LOGOP relexpr { $$=xp_new(XP_AND,$2,0.0,NULL,NULL,$1, $3);clicon_debug(2,"andexpr-> andexpr and relexpr"); } - | relexpr { $$=xp_new(XP_AND,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"andexpr-> relexpr"); } +andexpr : andexpr LOGOP relexpr { $$=xp_new(XP_AND,$2,NULL,NULL,NULL,$1, $3);clicon_debug(2,"andexpr-> andexpr and relexpr"); } + | relexpr { $$=xp_new(XP_AND,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"andexpr-> relexpr"); } ; -relexpr : relexpr RELOP addexpr { $$=xp_new(XP_RELEX,$2,0.0,NULL,NULL,$1, $3);clicon_debug(2,"relexpr-> relexpr relop addexpr"); } - | addexpr { $$=xp_new(XP_RELEX,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"relexpr-> addexpr"); } +relexpr : relexpr RELOP addexpr { $$=xp_new(XP_RELEX,$2,NULL,NULL,NULL,$1, $3);clicon_debug(2,"relexpr-> relexpr relop addexpr"); } + | addexpr { $$=xp_new(XP_RELEX,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"relexpr-> addexpr"); } ; -addexpr : addexpr ADDOP unionexpr { $$=xp_new(XP_ADD,$2,0.0,NULL,NULL,$1, $3);clicon_debug(2,"addexpr-> addexpr ADDOP unionexpr"); } - | unionexpr { $$=xp_new(XP_ADD,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"addexpr-> unionexpr"); } +addexpr : addexpr ADDOP unionexpr { $$=xp_new(XP_ADD,$2,NULL,NULL,NULL,$1, $3);clicon_debug(2,"addexpr-> addexpr ADDOP unionexpr"); } + | unionexpr { $$=xp_new(XP_ADD,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"addexpr-> unionexpr"); } ; /* node-set */ -unionexpr : unionexpr '|' pathexpr { $$=xp_new(XP_UNION,A_NAN,0.0,NULL,NULL,$1, $3);clicon_debug(2,"unionexpr-> unionexpr | pathexpr"); } - | pathexpr { $$=xp_new(XP_UNION,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"unionexpr-> pathexpr"); } +unionexpr : unionexpr '|' pathexpr { $$=xp_new(XP_UNION,A_NAN,NULL,NULL,NULL,$1, $3);clicon_debug(2,"unionexpr-> unionexpr | pathexpr"); } + | pathexpr { $$=xp_new(XP_UNION,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"unionexpr-> pathexpr"); } ; -pathexpr : locationpath { $$=xp_new(XP_PATHEXPR,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"pathexpr-> locationpath"); } - | primaryexpr { $$=xp_new(XP_PATHEXPR,A_NAN,0.0,NULL,NULL,$1, NULL);clicon_debug(2,"pathexpr-> primaryexpr"); } +pathexpr : locationpath { $$=xp_new(XP_PATHEXPR,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"pathexpr-> locationpath"); } + | primaryexpr { $$=xp_new(XP_PATHEXPR,A_NAN,NULL,NULL,NULL,$1, NULL);clicon_debug(2,"pathexpr-> primaryexpr"); } ; /* location path returns a node-set */ -locationpath : rellocpath { $$=xp_new(XP_LOCPATH,A_NAN,0.0,NULL,NULL,$1, NULL); clicon_debug(2,"locationpath-> rellocpath"); } - | abslocpath { $$=xp_new(XP_LOCPATH,A_NAN,0.0,NULL,NULL,$1, NULL); clicon_debug(2,"locationpath-> abslocpath"); } +locationpath : rellocpath { $$=xp_new(XP_LOCPATH,A_NAN,NULL,NULL,NULL,$1, NULL); clicon_debug(2,"locationpath-> rellocpath"); } + | abslocpath { $$=xp_new(XP_LOCPATH,A_NAN,NULL,NULL,NULL,$1, NULL); clicon_debug(2,"locationpath-> abslocpath"); } ; -abslocpath : '/' { $$=xp_new(XP_ABSPATH,A_ROOT,0.0,NULL,NULL,NULL, NULL);clicon_debug(2,"abslocpath-> /"); } - | '/' rellocpath { $$=xp_new(XP_ABSPATH,A_ROOT,0.0,NULL,NULL,$2, NULL);clicon_debug(2,"abslocpath->/ rellocpath");} +abslocpath : '/' { $$=xp_new(XP_ABSPATH,A_ROOT,NULL,NULL,NULL,NULL, NULL);clicon_debug(2,"abslocpath-> /"); } + | '/' rellocpath { $$=xp_new(XP_ABSPATH,A_ROOT,NULL,NULL,NULL,$2, NULL);clicon_debug(2,"abslocpath->/ rellocpath");} /* // is short for /descendant-or-self::node()/ */ - | DOUBLESLASH rellocpath {$$=xp_new(XP_ABSPATH,A_DESCENDANT_OR_SELF,0.0,NULL,NULL,$2, NULL); clicon_debug(2,"abslocpath-> // rellocpath"); } + | DOUBLESLASH rellocpath {$$=xp_new(XP_ABSPATH,A_DESCENDANT_OR_SELF,NULL,NULL,NULL,$2, NULL); clicon_debug(2,"abslocpath-> // rellocpath"); } ; -rellocpath : step { $$=xp_new(XP_RELLOCPATH,A_NAN,0.0,NULL,NULL,$1, NULL); clicon_debug(2,"rellocpath-> step"); } - | rellocpath '/' step { $$=xp_new(XP_RELLOCPATH,A_NAN,0.0,NULL,NULL,$1, $3);clicon_debug(2,"rellocpath-> rellocpath / step"); } - | rellocpath DOUBLESLASH step { $$=xp_new(XP_RELLOCPATH,A_DESCENDANT_OR_SELF,0.0,NULL,NULL,$1, $3); clicon_debug(2,"rellocpath-> rellocpath // step"); } +rellocpath : step { $$=xp_new(XP_RELLOCPATH,A_NAN,NULL,NULL,NULL,$1, NULL); clicon_debug(2,"rellocpath-> step"); } + | rellocpath '/' step { $$=xp_new(XP_RELLOCPATH,A_NAN,NULL,NULL,NULL,$1, $3);clicon_debug(2,"rellocpath-> rellocpath / step"); } + | rellocpath DOUBLESLASH step { $$=xp_new(XP_RELLOCPATH,A_DESCENDANT_OR_SELF,NULL,NULL,NULL,$1, $3); clicon_debug(2,"rellocpath-> rellocpath // step"); } ; -step : axisspec nodetest predicates {$$=xp_new(XP_STEP,$1,0.0, NULL, NULL, $2, $3);clicon_debug(2,"step->axisspec(%d) nodetest", $1); } - | '.' predicates { $$=xp_new(XP_STEP,A_SELF, 0.0,NULL, NULL, NULL, $2); clicon_debug(2,"step-> ."); } - | DOUBLEDOT predicates { $$=xp_new(XP_STEP, A_PARENT, 0.0,NULL, NULL, NULL, $2); clicon_debug(2,"step-> .."); } +step : axisspec nodetest predicates {$$=xp_new(XP_STEP,$1,NULL, NULL, NULL, $2, $3);clicon_debug(2,"step->axisspec(%d) nodetest", $1); } + | '.' predicates { $$=xp_new(XP_STEP,A_SELF, NULL,NULL, NULL, NULL, $2); clicon_debug(2,"step-> ."); } + | DOUBLEDOT predicates { $$=xp_new(XP_STEP, A_PARENT, NULL,NULL, NULL, NULL, $2); clicon_debug(2,"step-> .."); } ; axisspec : AXISNAME { clicon_debug(2,"axisspec-> AXISNAME(%d) ::", $1); $$=$1;} @@ -247,31 +253,31 @@ axisspec : AXISNAME { clicon_debug(2,"axisspec-> AXISNAME(%d) ::", $1); $$=$1 | { clicon_debug(2,"axisspec-> "); $$=A_CHILD;} ; -nodetest : '*' { $$=xp_new(XP_NODE,A_NAN,0.0, NULL, NULL, NULL, NULL); clicon_debug(2,"nodetest-> *"); } - | NAME { $$=xp_new(XP_NODE,A_NAN,0.0, NULL, $1, NULL, NULL); clicon_debug(2,"nodetest-> name(%s)",$1); } - | NAME ':' NAME { $$=xp_new(XP_NODE,A_NAN,0.0, $1, $3, NULL, NULL);clicon_debug(2,"nodetest-> name(%s) : name(%s)", $1, $3); } - | NAME ':' '*' { $$=xp_new(XP_NODE,A_NAN,0.0, $1, NULL, NULL, NULL);clicon_debug(2,"nodetest-> name(%s) : *", $1); } - | NODETYPE '(' ')' { $$=xp_new(XP_NODE_FN,A_NAN,0.0, $1, NULL, NULL, NULL); clicon_debug(1,"nodetest-> nodetype():%s", $1); } +nodetest : '*' { $$=xp_new(XP_NODE,A_NAN,NULL, NULL, NULL, NULL, NULL); clicon_debug(2,"nodetest-> *"); } + | NAME { $$=xp_new(XP_NODE,A_NAN,NULL, NULL, $1, NULL, NULL); clicon_debug(2,"nodetest-> name(%s)",$1); } + | NAME ':' NAME { $$=xp_new(XP_NODE,A_NAN,NULL, $1, $3, NULL, NULL);clicon_debug(2,"nodetest-> name(%s) : name(%s)", $1, $3); } + | NAME ':' '*' { $$=xp_new(XP_NODE,A_NAN,NULL, $1, NULL, NULL, NULL);clicon_debug(2,"nodetest-> name(%s) : *", $1); } + | NODETYPE '(' ')' { $$=xp_new(XP_NODE_FN,A_NAN,NULL, $1, NULL, NULL, NULL); clicon_debug(1,"nodetest-> nodetype():%s", $1); } ; /* evaluates to boolean */ -predicates : predicates '[' expr ']' { $$=xp_new(XP_PRED,A_NAN,0.0, NULL, NULL, $1, $3); clicon_debug(2,"predicates-> [ expr ]"); } - | { $$=xp_new(XP_PRED,A_NAN,0.0, NULL, NULL, NULL, NULL); clicon_debug(2,"predicates->"); } +predicates : predicates '[' expr ']' { $$=xp_new(XP_PRED,A_NAN,NULL, NULL, NULL, $1, $3); clicon_debug(2,"predicates-> [ expr ]"); } + | { $$=xp_new(XP_PRED,A_NAN,NULL, NULL, NULL, NULL, NULL); clicon_debug(2,"predicates->"); } ; -primaryexpr : '(' expr ')' { $$=xp_new(XP_PRI0,A_NAN,0.0, NULL, NULL, $2, NULL); clicon_debug(2,"primaryexpr-> ( expr )"); } - | NUMBER { $$=xp_new(XP_PRIME_NR,A_NAN, $1, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> NUMBER(%lf)", $1); } - | QUOTE string QUOTE { $$=xp_new(XP_PRIME_STR,A_NAN,0.0, $2, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> \" string \""); } - | QUOTE QUOTE { $$=xp_new(XP_PRIME_STR,A_NAN,0.0, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> \" \""); } - | APOST string APOST { $$=xp_new(XP_PRIME_STR,A_NAN,0.0, $2, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> ' string '"); } - | APOST APOST { $$=xp_new(XP_PRIME_STR,A_NAN,0.0, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> ' '"); } - | FUNCTIONNAME '(' ')' { $$=xp_new(XP_PRIME_FN,A_NAN,0.0, $1, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> functionname ( arguments )"); } - | FUNCTIONNAME '(' args ')' { $$=xp_new(XP_PRIME_FN,A_NAN,0.0, $1, NULL, $3, NULL);clicon_debug(2,"primaryexpr-> functionname ( arguments )"); } +primaryexpr : '(' expr ')' { $$=xp_new(XP_PRI0,A_NAN,NULL, NULL, NULL, $2, NULL); clicon_debug(2,"primaryexpr-> ( expr )"); } + | NUMBER { $$=xp_new(XP_PRIME_NR,A_NAN, $1, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> NUMBER(%s)", $1); /*XXX*/} + | QUOTE string QUOTE { $$=xp_new(XP_PRIME_STR,A_NAN,NULL, $2, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> \" string \""); } + | QUOTE QUOTE { $$=xp_new(XP_PRIME_STR,A_NAN,NULL, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> \" \""); } + | APOST string APOST { $$=xp_new(XP_PRIME_STR,A_NAN,NULL, $2, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> ' string '"); } + | APOST APOST { $$=xp_new(XP_PRIME_STR,A_NAN,NULL, NULL, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> ' '"); } + | FUNCTIONNAME '(' ')' { $$=xp_new(XP_PRIME_FN,A_NAN,NULL, $1, NULL, NULL, NULL);clicon_debug(2,"primaryexpr-> functionname ( arguments )"); } + | FUNCTIONNAME '(' args ')' { $$=xp_new(XP_PRIME_FN,A_NAN,NULL, $1, NULL, $3, NULL);clicon_debug(2,"primaryexpr-> functionname ( arguments )"); } ; -args : args ',' expr { $$=xp_new(XP_EXP,A_NAN,0.0,NULL,NULL,$1, $3); +args : args ',' expr { $$=xp_new(XP_EXP,A_NAN,NULL,NULL,NULL,$1, $3); clicon_debug(2,"args -> args expr");} - | expr { $$=xp_new(XP_EXP,A_NAN,0.0,NULL,NULL,$1, NULL); + | expr { $$=xp_new(XP_EXP,A_NAN,NULL,NULL,NULL,$1, NULL); clicon_debug(2,"args -> expr "); } ;