widl [1/2]: parser_error must append a newline, so write a new function, error_loc

Dan Hipschman dsh at linux.ucla.edu
Tue Oct 23 22:18:18 CDT 2007


This is a fix for this patch:

http://www.winehq.org/pipermail/wine-cvs/2007-October/037168.html

When I looked at that patch before, I had forgotten that parser_error
is actually yyerror (since bison is called with -p parser_).  Hence it
must append a newline or else when it's called by bison-generated code
for syntax errors it won't have one.  However, the idea of consistent
error functions is nice, so this splits off a new function, error_loc
to be used for error messages while parsing (when line info is known).

Hopefully someday someone (maybe me) will stick line numbers in type_t
and all the other necessary structures so we always have line number
info and we can unify these error functions, but I started doing that
once and it turns out to be fairly time consuming (and there are more
important things to work on at the moment).

---
 tools/widl/parser.l |   10 +++++-----
 tools/widl/proxy.c  |    2 +-
 tools/widl/utils.c  |   11 +++++++++++
 tools/widl/utils.h  |    1 +
 4 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index 78ee4b2..d2fd3c1 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -113,14 +113,14 @@ UUID *parse_uuid(const char *u)
                             yy_pop_state();
                             lineno = (int)strtol(yytext, &cptr, 10);
                             if(!lineno)
-                                parser_error("Malformed '#...' line-directive; invalid linenumber\n");
+                                error_loc("Malformed '#...' line-directive; invalid linenumber\n");
                             fname = strchr(cptr, '"');
                             if(!fname)
-                                parser_error("Malformed '#...' line-directive; missing filename\n");
+                                error_loc("Malformed '#...' line-directive; missing filename\n");
                             fname++;
                             cptr = strchr(fname, '"');
                             if(!cptr)
-                                parser_error("Malformed '#...' line-directive; missing terminating \"");
+                                error_loc("Malformed '#...' line-directive; missing terminating \"\n");
                             *cptr = '\0';
                             line_number = lineno - 1;  /* We didn't read the newline */
                             free( input_name );
@@ -414,7 +414,7 @@ int do_import(char *fname)
 	first_import = import;
 
         if (!(path = wpp_find_include( fname, input_name )))
-            parser_error("Unable to open include file %s\n", fname);
+            error_loc("Unable to open include file %s\n", fname);
 
 	import_stack[ptr].temp_name = temp_name;
 	import_stack[ptr].input_name = input_name;
@@ -427,7 +427,7 @@ int do_import(char *fname)
         if (ret) exit(1);
 
 	if((f = fopen(temp_name, "r")) == NULL)
-		parser_error("Unable to open %s\n", temp_name);
+		error_loc("Unable to open %s\n", temp_name);
 
 	import_stack[ptr].state = YY_CURRENT_BUFFER;
 	yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 0255923..3c8d6ef 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -509,7 +509,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
       gen_stub(iface, cur, cname, *proc_offset);
       *proc_offset += get_size_procformatstring_func( cur );
       if (midx == -1) midx = idx;
-      else if (midx != idx) parser_error("method index mismatch in write_proxy\n");
+      else if (midx != idx) error("method index mismatch in write_proxy\n");
       midx++;
     }
   }
diff --git a/tools/widl/utils.c b/tools/widl/utils.c
index 1382597..7dafc10 100644
--- a/tools/widl/utils.c
+++ b/tools/widl/utils.c
@@ -65,16 +65,27 @@ static void generic_msg(const char *s, const char *t, const char *n, va_list ap)
 }
 
 
+/* yyerror:  yacc assumes this is not newline terminated.  */
 int parser_error(const char *s, ...)
 {
 	va_list ap;
 	va_start(ap, s);
 	generic_msg(s, "Error", parser_text, ap);
+	fprintf(stderr, "\n");
 	va_end(ap);
 	exit(1);
 	return 1;
 }
 
+void error_loc(const char *s, ...)
+{
+	va_list ap;
+	va_start(ap, s);
+	generic_msg(s, "Error", parser_text, ap);
+	va_end(ap);
+	exit(1);
+}
+
 int parser_warning(const char *s, ...)
 {
 	va_list ap;
diff --git a/tools/widl/utils.h b/tools/widl/utils.h
index 37f12f0..1ae8e4b 100644
--- a/tools/widl/utils.h
+++ b/tools/widl/utils.h
@@ -35,6 +35,7 @@ char *xstrdup(const char *str);
 
 int parser_error(const char *s, ...) __attribute__((format (printf, 1, 2)));
 int parser_warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
+void error_loc(const char *s, ...);
 void error(const char *s, ...) __attribute__((format (printf, 1, 2)));
 void warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
 void chat(const char *s, ...) __attribute__((format (printf, 1, 2)));



More information about the wine-patches mailing list