diff options
-rw-r--r-- | dtc-parser.y | 28 | ||||
-rw-r--r-- | srcpos.c | 21 | ||||
-rw-r--r-- | srcpos.h | 2 |
3 files changed, 33 insertions, 18 deletions
diff --git a/dtc-parser.y b/dtc-parser.y index 0aaf8e8..b58ba8e 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -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,7 @@ devicetree: if (target) merge_nodes(target, $3); else - yyerror("label does not exist in " - " node redefinition"); + print_error("label, '%s' not found", $2); $$ = $1; } ; @@ -200,8 +200,7 @@ propdata: if ($6 != 0) if (fseek(f, $6, SEEK_SET) != 0) - srcpos_error(&yylloc, - "Couldn't seek to offset %llu in \"%s\": %s", + print_error("Couldn't seek to offset %llu in \"%s\": %s", (unsigned long long)$6, $4.val, strerror(errno)); @@ -295,7 +294,7 @@ subnodes: } | subnode propdef { - yyerror("syntax error: properties must precede subnodes"); + print_error("syntax error: properties must precede subnodes"); YYERROR; } ; @@ -314,12 +313,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 +336,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; } @@ -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); } @@ -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 *, ...) |