Sync to wine-0.9.60:
[reactos.git] / reactos / tools / widl / utils.c
index ed950f6..9c4452f 100644 (file)
@@ -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);
@@ -77,19 +80,30 @@ 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)