Rob Shearman : widl: Add functions to print an error or warning message using location information to enable these to be printed accurately when a check is done after an element is parsed .

Alexandre Julliard julliard at winehq.org
Mon Apr 14 07:14:30 CDT 2008


Module: wine
Branch: master
Commit: 005359968885b778d271891a08c1b888bcea573d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=005359968885b778d271891a08c1b888bcea573d

Author: Rob Shearman <rob at codeweavers.com>
Date:   Mon Apr 14 11:00:20 2008 +0100

widl: Add functions to print an error or warning message using location information to enable these to be printed accurately when a check is done after an element is parsed.

Add location information to variable automatically, since this is will 
be useful for type checking of arguments.

---

 tools/widl/parser.y    |    3 +++
 tools/widl/utils.c     |   36 +++++++++++++++++++++++++++++-------
 tools/widl/utils.h     |    2 ++
 tools/widl/widltypes.h |   10 ++++++++++
 4 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 81eacba..0e5778d 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -1560,6 +1560,9 @@ static var_t *make_var(char *name)
   v->type = NULL;
   v->attrs = NULL;
   v->eval = NULL;
+  v->loc_info.input_name = input_name ? input_name : "stdin";
+  v->loc_info.line_number = line_number;
+  v->loc_info.near_text = parser_text;
   return v;
 }
 
diff --git a/tools/widl/utils.c b/tools/widl/utils.c
index ed950f6..9c4452f 100644
--- a/tools/widl/utils.c
+++ b/tools/widl/utils.c
@@ -33,6 +33,8 @@
 #include "utils.h"
 #include "parser.h"
 
+#define CURRENT_LOCATION { input_name ? input_name : "stdin", line_number, parser_text }
+
 static const int want_near_indication = 0;
 
 static void make_print(char *str)
@@ -45,17 +47,17 @@ static void make_print(char *str)
 	}
 }
 
-static void generic_msg(const char *s, const char *t, const char *n, va_list ap)
+static void generic_msg(const loc_info_t *loc_info, const char *s, const char *t, va_list ap)
 {
-	fprintf(stderr, "%s:%d: %s: ", input_name ? input_name : "stdin", line_number, t);
+	fprintf(stderr, "%s:%d: %s: ", loc_info->input_name, loc_info->line_number, t);
 	vfprintf(stderr, s, ap);
 
 	if (want_near_indication)
 	{
 		char *cpy;
-		if(n)
+		if(loc_info->near_text)
 		{
-			cpy = xstrdup(n);
+			cpy = xstrdup(loc_info->near_text);
 			make_print(cpy);
 			fprintf(stderr, " near '%s'", cpy);
 			free(cpy);
@@ -67,9 +69,10 @@ 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, ...)
 {
+	loc_info_t cur_location = CURRENT_LOCATION;
 	va_list ap;
 	va_start(ap, s);
-	generic_msg(s, "Error", parser_text, ap);
+	generic_msg(&cur_location, s, "Error", ap);
 	fprintf(stderr, "\n");
 	va_end(ap);
 	exit(1);
@@ -78,18 +81,29 @@ int parser_error(const char *s, ...)
 
 void error_loc(const char *s, ...)
 {
+	loc_info_t cur_loc = CURRENT_LOCATION;
+	va_list ap;
+	va_start(ap, s);
+	generic_msg(&cur_loc, s, "Error", ap);
+	va_end(ap);
+	exit(1);
+}
+
+void error_loc_info(const loc_info_t *loc_info, const char *s, ...)
+{
 	va_list ap;
 	va_start(ap, s);
-	generic_msg(s, "Error", parser_text, ap);
+	generic_msg(loc_info, s, "Error", ap);
 	va_end(ap);
 	exit(1);
 }
 
 int parser_warning(const char *s, ...)
 {
+	loc_info_t cur_loc = CURRENT_LOCATION;
 	va_list ap;
 	va_start(ap, s);
-	generic_msg(s, "Warning", parser_text, ap);
+	generic_msg(&cur_loc, s, "Warning", ap);
 	va_end(ap);
 	return 0;
 }
@@ -113,6 +127,14 @@ void warning(const char *s, ...)
 	va_end(ap);
 }
 
+void warning_loc_info(const loc_info_t *loc_info, const char *s, ...)
+{
+	va_list ap;
+	va_start(ap, s);
+	generic_msg(loc_info, s, "Warning", ap);
+	va_end(ap);
+}
+
 void chat(const char *s, ...)
 {
 	if(debuglevel & DEBUGLEVEL_CHAT)
diff --git a/tools/widl/utils.h b/tools/widl/utils.h
index 7d6ce5c..73adf54 100644
--- a/tools/widl/utils.h
+++ b/tools/widl/utils.h
@@ -37,7 +37,9 @@ 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, ...) __attribute__((format (printf, 1, 2)));
 void error(const char *s, ...) __attribute__((format (printf, 1, 2)));
+void error_loc_info(const loc_info_t *, const char *s, ...) __attribute__((format (printf, 2, 3)));
 void warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
+void warning_loc_info(const loc_info_t *, const char *s, ...) __attribute__((format (printf, 2, 3)));
 void chat(const char *s, ...) __attribute__((format (printf, 1, 2)));
 
 char *dup_basename(const char *name, const char *ext);
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index d046447..89d593a 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -36,6 +36,7 @@ typedef GUID UUID;
 
 #define RPC_FC_FUNCTION 0xfe
 
+typedef struct _loc_info_t loc_info_t;
 typedef struct _attr_t attr_t;
 typedef struct _expr_t expr_t;
 typedef struct _type_t type_t;
@@ -176,6 +177,13 @@ enum type_kind
     TKIND_MAX
 };
 
+struct _loc_info_t
+{
+    const char *input_name;
+    int line_number;
+    const char *near_text;
+};
+
 struct str_list_entry_t
 {
     char *str;
@@ -240,6 +248,8 @@ struct _var_t {
   attr_list_t *attrs;
   expr_t *eval;
 
+  struct _loc_info_t loc_info;
+
   /* parser-internal */
   struct list entry;
 };




More information about the wine-cvs mailing list