Create new and use new print_error that uses printf style formatting.
PATCH 1/1 Create new and use new print_error that uses printf style formatting.
yyerror is meant to be called by the parser internal code, and it's interface is limited. Instead create and call a new error message routine that allows formatted strings to be used.
yyerror uses the new routine so error formatting remains consistent.
---
Here's my second attempt at this. The goal is to provide a way to display better error mesasges to help the dts writer.
- John
dtc-parser.y | 26 ++++++++++++++++++-------- srcpos.c | 21 +++++++++++++-------- srcpos.h | 2 ++ 3 files changed, 33 insertions(+), 16 deletions(-)
dtc-parser.y +18 -8
@@ -27,6 +27,7 @@ YYLTYPE yylloc; extern int yylex(void); +extern void print_error(char const *fmt, ...); extern void yyerror(char const *s); extern struct boot_info *the_boot_info;
@@ -136,8 +137,8 @@ devicetree: if (target) merge_nodes(target, $3); else - yyerror("label does not exist in " - " node redefinition"); + print_error("label, '%s' does not exist in" + " node extension", $2); $$ = $1; } ;
@@ -295,7 +296,7 @@ subnodes: } | subnode propdef { - yyerror("syntax error: properties must precede subnodes"); + print_error("syntax error: properties must precede subnodes"); YYERROR; } ;
@@ -314,12 +315,21 @@ subnode: %% -void yyerror(char const *s) +void print_error(char const *fmt, ...) { - srcpos_error(&yylloc, "%s", s); + va_list va; + + va_start(va, fmt); + srcpos_verror(&yylloc, fmt, va); + va_end(va); + treesource_error = 1; } +void yyerror(char const *s) { + print_error("%s", s); +} + static unsigned long long eval_literal(const char *s, int base, int bits) { unsigned long long val;
@@ -328,11 +338,11 @@ static unsigned long long eval_literal(const char *s, int base, int bits) errno = 0; val = strtoull(s, &e, base); if (*e) - yyerror("bad characters in literal"); + print_error("bad characters in literal"); else if ((errno == ERANGE) || ((bits < 64) && (val >= (1ULL << bits)))) - yyerror("literal out of range"); + print_error("literal out of range"); else if (errno != 0) - yyerror("bad literal"); + print_error("bad literal"); return val; }
srcpos.c +13 -8
@@ -208,20 +208,25 @@ srcpos_string(struct srcpos *pos)return pos_str; } +void +srcpos_verror (struct srcpos *pos,char const *fmt,va_list va) +{ +const char *srcstr; + + srcstr =srcpos_string (pos); + +fprintf (stdout,"Error: %s " , srcstr); +vfprintf (stdout, fmt, va); +fprintf (stdout,"\n" ); +}void srcpos_error (struct srcpos *pos,char const *fmt, ...) { -const char *srcstr;va_list va; -va_start (va, fmt); - - srcstr =srcpos_string (pos); - -fprintf (stderr,"Error: %s " , srcstr); -vfprintf (stderr, fmt, va); -fprintf (stderr,"\n" ); +va_start (va, fmt); +srcpos_verror (pos, fmt, va);va_end (va); }
srcpos.h +2 -0
@@ -76,6 +76,8 @@ extern struct srcpos *srcpos_copy(struct srcpos *pos);extern char *srcpos_string (struct srcpos *pos);extern void srcpos_dump (struct srcpos *pos); +extern void srcpos_verror (struct srcpos *pos,char const *,va_list va) + __attribute__((format (printf,2 ,0 )));extern void srcpos_error (struct srcpos *pos,char const *, ...) __attribute__((format (printf,2 ,3 )));extern void srcpos_warn (struct srcpos *pos,char const *, ...)
Quoted 7 lines · John Bonesio
yyerror is meant to be called by the parser internal code, and it's interface is limited. Instead create and call a new error message routine that allows formatted strings to be used.
yyerror uses the new routine so error formatting remains consistent.
Signed-of-by John Bonesio <bones-s3s/[email protected]>
The name doesn't really capture the difference between print_error() and srcpos_error(), but that's a footling detail we can fix some other time.
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson