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