chiark / gitweb /
Import upstream sources.
[cparse] / log.c
1 /*
2  * This file is part of Cmarsh
3  * Copyright (C) 2004 Richard Kettlewell
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA
19  */
20
21 #include "cparse.h"
22 #include <stdarg.h>
23
24 void (*exiter)(int) = exit;
25
26 static int suppress;
27
28 static void verror(const char *prefix_,
29                    int errno_value, const char *msg, va_list ap) {
30   fprintf(stderr, "%s: ", prefix_);
31   vfprintf(stderr, msg, ap);
32   if(errno_value)
33     fprintf(stderr, ": %s\n", strerror(errno_value));
34   else
35     fputc('\n', stderr);
36 }
37
38 void fatal(int errno_value, const char *msg, ...) {
39   va_list ap;
40
41   va_start(ap, msg);
42   verror("FATAL", errno_value, msg, ap);
43   exit(1);
44 }
45
46 void error(int errno_value, const char *msg, ...) {
47   va_list ap;
48
49   va_start(ap, msg);
50   verror("ERROR", errno_value, msg, ap);
51   va_end(ap);
52 }
53
54 void inputerror(const struct location *l,
55                 const char *msg, ...) {
56   if(!suppress) {
57     va_list ap;
58     
59     if(fprintf(stderr, "%s:%d: error: ",
60                l ? l->path : path, l ? l->line : line) < 0)
61       exit(-1);
62     va_start(ap, msg);
63     if(vfprintf(stderr, msg, ap) < 0) exit(-1);
64     va_end(ap);
65     if(fputc('\n', stderr) < 0) exit(-1);
66     ++errors;
67   }
68 }
69
70 void inputwarning(const struct location *l,
71                   enum warning_category attribute((unused)) cat,
72                   const char *msg, ...) {
73   if(!suppress) {
74     /* XXX implement warning categories */
75     va_list ap;
76     
77     if(fprintf(stderr, "%s:%d: warning: ",
78                l ? l->path : path, l ? l->line : line) < 0)
79       exit(-1);
80     va_start(ap, msg);
81     if(vfprintf(stderr, msg, ap) < 0) exit(-1);
82     va_end(ap);
83     if(fputc('\n', stderr) < 0) exit(-1);
84   }
85 }
86
87 int yyerror(const char *msg) {
88   inputerror(0, "%s", msg);
89   return 0;
90 }
91
92 void suppress_errors(void) {
93   ++suppress;
94 }
95
96 void restore_errors(void) {
97   --suppress;
98 }
99
100 /*
101 Local Variables:
102 c-basic-offset:2
103 comment-column:40
104 End:
105 */