[3/5] dtc: Cleanup yyerrorf() function

David Gibson david at gibson.dropbear.id.au
Fri Oct 3 00:06:52 EST 2008


Currently, we put the source file name into the yylloc variable, but
never use the stored value.  Instead the yyerrorf() function directly
accesses srcpos_file to get the input file name.

That works in practice, but is likely not to always be correct if we
ever re-enable the glr-parser option.  Even now, its correctness
relies on the exact point in time bison executes the semantic rules
w.r.t. to the lexing rules, which is probably correct but not
obviously correct, which is far from ideal.

So, this patch replaces yyerrorf() with a srcpos_error() function
which pulls the filename information out of the yylloc variable, which
bison is explicitly supposed to get right for us.

Signed-off-by: David Gibson <david at gibson.dropbear.id.au>

---
 dtc-parser.y |   32 ++++++++++----------------------
 srcpos.c     |   13 +++++++++++++
 srcpos.h     |    6 ++----
 3 files changed, 25 insertions(+), 26 deletions(-)

Index: dtc/dtc-parser.y
===================================================================
--- dtc.orig/dtc-parser.y	2008-10-03 00:03:38.000000000 +1000
+++ dtc/dtc-parser.y	2008-10-03 00:03:57.000000000 +1000
@@ -30,6 +30,7 @@ extern int yylex(void);
 extern struct boot_info *the_boot_info;
 extern int treesource_error;
 
+static void yyerror(char const *s);
 static unsigned long long eval_literal(const char *s, int base, int bits);
 %}
 
@@ -206,10 +207,13 @@ propdata:
 			struct data d = empty_data;
 
 			if ($6 != 0)
-				if (fseek(file->file, $6, SEEK_SET) != 0)
-					yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
-						 (unsigned long long)$6,
-						 $4.val, strerror(errno));
+				if (fseek(file->file, $6, SEEK_SET) != 0) {
+					srcpos_error(&yylloc, "Couldn't seek to"
+						     " offset %llu in \"%s\": %s",
+						     (unsigned long long)$6,
+						     $4.val, strerror(errno));
+					treesource_error = 1;
+				}
 
 			d = data_copy_file(file->file, $8);
 
@@ -338,26 +342,10 @@ label:
 
 %%
 
-void yyerrorf(char const *s, ...)
+static void yyerror(char const *s)
 {
-	const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
-	va_list va;
-	va_start(va, s);
-
-	if (strcmp(fname, "-") == 0)
-		fname = "stdin";
-
-	fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
-	vfprintf(stderr, s, va);
-	fprintf(stderr, "\n");
-
+	srcpos_error(&yylloc, "%s", s);
 	treesource_error = 1;
-	va_end(va);
-}
-
-void yyerror (char const *s)
-{
-	yyerrorf("%s", s);
 }
 
 static unsigned long long eval_literal(const char *s, int base, int bits)
Index: dtc/srcpos.c
===================================================================
--- dtc.orig/srcpos.c	2008-10-03 00:03:38.000000000 +1000
+++ dtc/srcpos.c	2008-10-03 00:03:57.000000000 +1000
@@ -29,6 +29,19 @@ char *xstrdup(const char *s)
 	return dup;
 }
 
+void srcpos_error(YYLTYPE *loc, char const *fmt, ...)
+{
+	va_list va;
+	va_start(va, fmt);
+
+	fprintf(stderr, "%s:%d ", loc->file->name, loc->first_line);
+
+	vfprintf(stderr, fmt, va);
+	fprintf(stderr, "\n");
+
+	va_end(va);
+}
+
 /*
  * Like yylineno, this is the current open file pos.
  */
Index: dtc/srcpos.h
===================================================================
--- dtc.orig/srcpos.h	2008-10-03 00:03:38.000000000 +1000
+++ dtc/srcpos.h	2008-10-03 00:03:57.000000000 +1000
@@ -72,10 +72,8 @@ typedef struct YYLTYPE {
 	}								\
     while (YYID (0))
 
-
-
-extern void yyerror(char const *);
-extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2)));
+void srcpos_error(YYLTYPE *loc, char const *fmt, ...)
+	__attribute__((format(printf, 2, 3)));
 
 extern struct dtc_file *srcpos_file;
 


-- 
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



More information about the devicetree-discuss mailing list