1/* $NetBSD: error.cpp,v 1.1.1.1 2016/01/13 18:41:48 christos Exp $ */ 2 3// -*- C++ -*- 4/* Copyright (C) 1989, 1990, 1991, 1992, 2003 Free Software Foundation, Inc. 5 Written by James Clark (jjc@jclark.com) 6 7This file is part of groff. 8 9groff is free software; you can redistribute it and/or modify it under 10the terms of the GNU General Public License as published by the Free 11Software Foundation; either version 2, or (at your option) any later 12version. 13 14groff is distributed in the hope that it will be useful, but WITHOUT ANY 15WARRANTY; without even the implied warranty of MERCHANTABILITY or 16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17for more details. 18 19You should have received a copy of the GNU General Public License along 20with groff; see the file COPYING. If not, write to the Free Software 21Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include <stdio.h> 24#include <stdlib.h> 25#include <string.h> 26#include "errarg.h" 27#include "error.h" 28 29extern void fatal_error_exit(); 30 31enum error_type { WARNING, ERROR, FATAL }; 32 33static void do_error_with_file_and_line(const char *filename, 34 const char *source_filename, 35 int lineno, 36 error_type type, 37 const char *format, 38 const errarg &arg1, 39 const errarg &arg2, 40 const errarg &arg3) 41{ 42 int need_space = 0; 43 if (program_name) { 44 fprintf(stderr, "%s:", program_name); 45 need_space = 1; 46 } 47 if (lineno >= 0 && filename != 0) { 48 if (strcmp(filename, "-") == 0) 49 filename = "<standard input>"; 50 if (source_filename != 0) 51 fprintf(stderr, "%s (%s):%d:", filename, source_filename, lineno); 52 else 53 fprintf(stderr, "%s:%d:", filename, lineno); 54 need_space = 1; 55 } 56 switch (type) { 57 case FATAL: 58 fputs("fatal error:", stderr); 59 need_space = 1; 60 break; 61 case ERROR: 62 break; 63 case WARNING: 64 fputs("warning:", stderr); 65 need_space = 1; 66 break; 67 } 68 if (need_space) 69 fputc(' ', stderr); 70 errprint(format, arg1, arg2, arg3); 71 fputc('\n', stderr); 72 fflush(stderr); 73 if (type == FATAL) 74 fatal_error_exit(); 75} 76 77 78static void do_error(error_type type, 79 const char *format, 80 const errarg &arg1, 81 const errarg &arg2, 82 const errarg &arg3) 83{ 84 do_error_with_file_and_line(current_filename, current_source_filename, 85 current_lineno, type, format, arg1, arg2, arg3); 86} 87 88 89void error(const char *format, 90 const errarg &arg1, 91 const errarg &arg2, 92 const errarg &arg3) 93{ 94 do_error(ERROR, format, arg1, arg2, arg3); 95} 96 97void warning(const char *format, 98 const errarg &arg1, 99 const errarg &arg2, 100 const errarg &arg3) 101{ 102 do_error(WARNING, format, arg1, arg2, arg3); 103} 104 105void fatal(const char *format, 106 const errarg &arg1, 107 const errarg &arg2, 108 const errarg &arg3) 109{ 110 do_error(FATAL, format, arg1, arg2, arg3); 111} 112 113void error_with_file_and_line(const char *filename, 114 int lineno, 115 const char *format, 116 const errarg &arg1, 117 const errarg &arg2, 118 const errarg &arg3) 119{ 120 do_error_with_file_and_line(filename, 0, lineno, 121 ERROR, format, arg1, arg2, arg3); 122} 123 124void warning_with_file_and_line(const char *filename, 125 int lineno, 126 const char *format, 127 const errarg &arg1, 128 const errarg &arg2, 129 const errarg &arg3) 130{ 131 do_error_with_file_and_line(filename, 0, lineno, 132 WARNING, format, arg1, arg2, arg3); 133} 134 135void fatal_with_file_and_line(const char *filename, 136 int lineno, 137 const char *format, 138 const errarg &arg1, 139 const errarg &arg2, 140 const errarg &arg3) 141{ 142 do_error_with_file_and_line(filename, 0, lineno, 143 FATAL, format, arg1, arg2, arg3); 144} 145