#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)
}
}
-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);
/* 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);
}
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;
}
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)