1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                 Eclipse Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*          http://www.eclipse.org/org/documents/epl-v10.html           *
11*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 * standalone mini error implementation
25 */
26
27#include <ast.h>
28#include <error.h>
29
30Error_info_t	error_info;
31
32void
33errorv(const char* id, int level, va_list ap)
34{
35	char*	a;
36	char*	s;
37	int	flags;
38
39	if (level < 0)
40		flags = 0;
41	else
42	{
43		flags = level & ~ERROR_LEVEL;
44		level &= ERROR_LEVEL;
45	}
46	a = va_arg(ap, char*);
47	if (level && ((s = error_info.id) || (s = (char*)id)))
48	{
49		if (!(flags & ERROR_USAGE))
50			sfprintf(sfstderr, "%s: ", s);
51		else if (strcmp(a, "%s"))
52			sfprintf(sfstderr, "Usage: %s ", s);
53	}
54	if (flags & ERROR_USAGE)
55		/*nop*/;
56	else if (level < 0)
57		sfprintf(sfstderr, "debug%d: ", level);
58	else if (level)
59	{
60		if (level == ERROR_WARNING)
61		{
62			sfprintf(sfstderr, "warning: ");
63			error_info.warnings++;
64		}
65		else
66		{
67			error_info.errors++;
68			if (level == ERROR_PANIC)
69				sfprintf(sfstderr, "panic: ");
70		}
71		if (error_info.line)
72		{
73			if (error_info.file && *error_info.file)
74				sfprintf(sfstderr, "\"%s\", ", error_info.file);
75			sfprintf(sfstderr, "line %d: ", error_info.line);
76		}
77	}
78	sfvprintf(sfstderr, a, ap);
79	sfprintf(sfstderr, "\n");
80	if (level >= ERROR_FATAL)
81		exit(level - ERROR_FATAL + 1);
82}
83
84void
85error(int level, ...)
86{
87	va_list	ap;
88
89	va_start(ap, level);
90	errorv(NiL, level, ap);
91	va_end(ap);
92}
93
94int
95errorf(void* handle, void* discipline, int level, ...)
96{
97	va_list	ap;
98
99	va_start(ap, level);
100	errorv((discipline && handle) ? *((char**)handle) : (char*)handle, level, ap);
101	va_end(ap);
102	return 0;
103}
104