#include "error.h"
#include "builtins/builtins.h"
#include "vars.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <stdarg.h>
static void print_error_message_list(int print_line_number, int errnum, const char *prefix, const char *format, va_list ap)
{
fflush(stdout);
fprintf(stderr, "%s: ", script_name ? : program_invocation_name);
if (print_line_number && print_line_number_on_error)
fprintf(stderr, "line %d: ", line_number);
if (current_builtin)
fprintf(stderr, "%s: ", current_builtin->name);
if (prefix)
fprintf(stderr, "%s: ", prefix);
vfprintf(stderr, format, ap);
if (errnum)
fprintf(stderr, ": %s", strerror(errnum));
fputc('\n', stderr);
}
static void print_error_message_var(int print_line_number, int errnum, const char *prefix, const char *format, ...)
{
va_list ap;
va_start(ap, format);
print_error_message_list(print_line_number, errnum, prefix, format, ap);
va_end(ap);
}
void sys_error(int errnum, const char *format, ...)
{
va_list ap;
va_start(ap, format);
print_error_message_list(0, errnum, NULL, format, ap);
va_end(ap);
}
void fatal_error(const char *format, ...)
{
va_list ap;
va_start(ap, format);
print_error_message_list(0, 0, NULL, format, ap);
va_end(ap);
exit(EXIT_FAILURE);
}
void generic_error(const char *format, ...)
{
va_list ap;
va_start(ap, format);
print_error_message_list(1, 0, NULL, format, ap);
va_end(ap);
}
void syntax_error(const char *format, ...)
{
va_list ap;
va_start(ap, format);
print_error_message_list(1, 0, "Syntax error", format, ap);
va_end(ap);
}
void parse_error(const char *token)
{
print_error_message_var(1, 0, NULL, "Parse error near token `%s'", token);
}
void file_error(int errnum, const char *path)
{
print_error_message_var(1, errnum, NULL, "%s", path);
}
void process_error(int errnum, pid_t pid)
{
print_error_message_var(1, errnum, NULL, "%d", pid);
}
void invalid_option_error(int opt)
{
print_error_message_var(1, 0, NULL, "invalid option -- %c", opt);
}