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*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
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 * Glenn Fowler
25 * AT&T Research
26 *
27 * generate signal features
28 */
29
30#include "FEATURE/standards"
31
32#define strsignal	______strsignal
33
34#include <signal.h>
35
36#undef	strsignal
37
38struct _m_
39{
40	char*		text;
41	char*		name;
42	int		value;
43};
44
45#define elementsof(x)	(sizeof(x)/sizeof(x[0]))
46
47static struct _m_ map[] =
48{
49#ifdef SIGABRT
50#define HAD_SIGABRT	1
51"Abort",			"ABRT",		SIGABRT,
52#endif
53#ifdef SIGAIO
54#define HAD_SIGAIO	1
55"Asynchronous I/O",		"AIO",		SIGAIO,
56#endif
57#ifdef SIGALRM
58#define HAD_SIGALRM	1
59"Alarm call",			"ALRM",		SIGALRM,
60#endif
61#ifdef SIGAPOLLO
62#define HAD_SIGAPOLLO	1
63"Apollo",			"APOLLO",	SIGAPOLLO,
64#endif
65#ifdef SIGBUS
66#define HAD_SIGBUS	1
67"Bus error",			"BUS",		SIGBUS,
68#endif
69#ifdef SIGCHLD
70#define HAD_SIGCHLD	1
71"Child status change",		"CHLD",		SIGCHLD,
72#endif
73#ifdef SIGCLD
74#define HAD_SIGCLD	1
75"Death of child", 		"CLD",		SIGCLD,
76#endif
77#ifdef SIGCONT
78#define HAD_SIGCONT	1
79"Stopped process continued",	"CONT",		SIGCONT,
80#endif
81#ifdef SIGDANGER
82#define HAD_SIGDANGER	1
83"System crash soon",		"DANGER",	SIGDANGER,
84#endif
85#ifdef SIGDEBUG
86#define HAD_SIGDEBUG	1
87"Debug trap",			"DEBUG",	SIGDEBUG,
88#endif
89#ifdef SIGDIL
90#define HAD_SIGDIL	1
91"DIL trap",			"DIL",		SIGDIL,
92#endif
93#ifdef SIGEMT
94#define HAD_SIGEMT	1
95"EMT trap",			"EMT",		SIGEMT,
96#endif
97#ifdef SIGERR
98#define HAD_SIGERR	1
99"ERR trap",			"ERR",		SIGERR,
100#endif
101#ifdef SIGEXIT
102#define HAD_SIGEXIT	1
103"Exit",				"EXIT",		SIGEXIT,
104#endif
105#ifdef SIGFPE
106#define HAD_SIGFPE	1
107"Floating exception",		"FPE",		SIGFPE,
108#endif
109#ifdef SIGFREEZE
110#define HAD_SIGFREEZE	1
111"CPR freeze",			"FREEZE",	SIGFREEZE,
112#endif
113#ifdef SIGHUP
114#define HAD_SIGHUP	1
115"Hangup",			"HUP",		SIGHUP,
116#endif
117#ifdef SIGILL
118#define HAD_SIGILL	1
119"Illegal instruction",		"ILL",		SIGILL,
120#endif
121#ifdef SIGINT
122#define HAD_SIGINT	1
123"Interrupt",			"INT",		SIGINT,
124#endif
125#ifdef SIGIO
126#define HAD_SIGIO	1
127"IO possible",			"IO",		SIGIO,
128#endif
129#ifdef SIGIOT
130#define HAD_SIGIOT	1
131"IOT trap",			"IOT",		SIGIOT,
132#endif
133#ifdef SIGKILL
134#define HAD_SIGKILL	1
135"Killed",			"KILL",		SIGKILL,
136#endif
137#ifdef SIGLAB
138#define HAD_SIGLAB	1
139"Security label changed",	"LAB",		SIGLAB,
140#endif
141#ifdef SIGLOST
142#define HAD_SIGLOST	1
143"Resources lost",		"LOST",		SIGLOST,
144#endif
145#ifdef SIGLWP
146#define HAD_SIGLWP	1
147"Thread event",			"LWP",		SIGLWP,
148#endif
149#ifdef SIGMIGRATE
150#define HAD_SIGMIGRATE	1
151"Migrate process",		"MIGRATE",	SIGMIGRATE,
152#endif
153#ifdef SIGPHONE
154#define HAD_SIGPHONE	1
155"Phone status change",		"PHONE",	SIGPHONE,
156#endif
157#ifdef SIGPIPE
158#define HAD_SIGPIPE	1
159"Broken pipe",			"PIPE",		SIGPIPE,
160#endif
161#ifdef SIGPOLL
162#define HAD_SIGPOLL	1
163"Poll event",			"POLL",		SIGPOLL,
164#endif
165#ifdef SIGPROF
166#define HAD_SIGPROF	1
167"Profile timer alarm",		"PROF",		SIGPROF,
168#endif
169#ifdef SIGPWR
170#define HAD_SIGPWR	1
171"Power fail",			"PWR",		SIGPWR,
172#endif
173#ifdef SIGQUIT
174#define HAD_SIGQUIT	1
175"Quit",				"QUIT",		SIGQUIT,
176#endif
177#ifdef SIGSEGV
178#define HAD_SIGSEGV	1
179"Memory fault",			"SEGV",		SIGSEGV,
180#endif
181#ifdef SIGSOUND
182#define HAD_SIGSOUND	1
183"Sound completed",		"SOUND",	SIGSOUND,
184#endif
185#ifdef SIGSSTOP
186#define HAD_SIGSSTOP	1
187"Sendable stop",		"SSTOP",	SIGSSTOP,
188#endif
189#ifdef gould
190#define HAD_gould	1
191"Stack overflow",		"STKOV",	28,
192#endif
193#ifdef SIGSTOP
194#define HAD_SIGSTOP	1
195"Stopped (signal)",		"STOP",		SIGSTOP,
196#endif
197#ifdef SIGSYS
198#define HAD_SIGSYS	1
199"Bad system call", 		"SYS",		SIGSYS,
200#endif
201#ifdef SIGTERM
202#define HAD_SIGTERM	1
203"Terminated",			"TERM",		SIGTERM,
204#endif
205#ifdef SIGTHAW
206#define HAD_SIGTHAW	1
207"CPR thaw",			"THAW",		SIGTHAW,
208#endif
209#ifdef SIGTINT
210#define HAD_SIGTINT	1
211"Interrupt (terminal)",		"TINT",		SIGTINT,
212#endif
213#ifdef SIGTRAP
214#define HAD_SIGTRAP	1
215"Trace trap",			"TRAP",		SIGTRAP,
216#endif
217#ifdef SIGTSTP
218#define HAD_SIGTSTP	1
219"Stopped",			"TSTP",		SIGTSTP,
220#endif
221#ifdef SIGTTIN
222#define HAD_SIGTTIN	1
223"Stopped (tty input)",		"TTIN",		SIGTTIN,
224#endif
225#ifdef SIGTTOU
226#define HAD_SIGTTOU	1
227"Stopped (tty output)",		"TTOU",		SIGTTOU,
228#endif
229#ifdef SIGURG
230#define HAD_SIGURG	1
231"Urgent IO",			"URG",		SIGURG,
232#endif
233#ifdef SIGUSR1
234#define HAD_SIGUSR1	1
235"User signal 1",		"USR1",		SIGUSR1,
236#endif
237#ifdef SIGUSR2
238#define HAD_SIGUSR2	1
239"User signal 2",		"USR2",		SIGUSR2,
240#endif
241#ifdef SIGVTALRM
242#define HAD_SIGVTALRM	1
243"Virtual timer alarm",		"VTALRM",	SIGVTALRM,
244#endif
245#ifdef SIGWAITING
246#define HAD_SIGWAITING	1
247"All threads blocked",		"WAITING",	SIGWAITING,
248#endif
249#ifdef SIGWINCH
250#define HAD_SIGWINCH	1
251"Window change", 		"WINCH",	SIGWINCH,
252#endif
253#ifdef SIGWIND
254#define HAD_SIGWIND	1
255"Window change",		"WIND",		SIGWIND,
256#endif
257#ifdef SIGWINDOW
258#define HAD_SIGWINDOW	1
259"Window change",		"WINDOW",	SIGWINDOW,
260#endif
261#ifdef SIGXCPU
262#define HAD_SIGXCPU	1
263"CPU time limit",		"XCPU",		SIGXCPU,
264#endif
265#ifdef SIGXFSZ
266#define HAD_SIGXFSZ	1
267"File size limit",		"XFSZ",		SIGXFSZ,
268#endif
269#include "FEATURE/siglist"
2700
271};
272
273#define RANGE_MIN	(1<<14)
274#define RANGE_MAX	(1<<13)
275#define RANGE_RT	(1<<12)
276
277#define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
278
279static int		mapindex[1024];
280
281#if _lib_strsignal
282extern char*		strsignal(int);
283#endif
284
285int
286main()
287{
288	register int	i;
289	register int	j;
290	register int	k;
291	int		m;
292	int		n;
293#if _lib_strsignal
294	char*		s;
295#endif
296
297	k = 0;
298	for (i = 0; map[i].name; i++)
299		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
300		{
301			if (j > k)
302				k = j;
303			mapindex[j] = i;
304		}
305#ifdef SIGRTMIN
306	i = SIGRTMIN;
307#ifdef SIGRTMAX
308	j = SIGRTMAX;
309#else
310	j = i;
311#endif
312	if (j >= elementsof(mapindex))
313		j = elementsof(mapindex) - 1;
314	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
315	{
316		if (j > k)
317			k = j;
318		mapindex[i] = RANGE_MIN | RANGE_RT;
319		n = 1;
320		while (++i < j)
321			mapindex[i] = RANGE_RT | n++;
322		mapindex[j] = RANGE_MAX | RANGE_RT | n;
323	}
324#endif
325	printf("#pragma prototyped\n");
326	printf("#define SIG_MAX	%d\n", k);
327	printf("\n");
328	printf("static const char* const	sig_name[] =\n");
329	printf("{\n");
330	for (i = 0; i <= k; i++)
331		if (!(j = mapindex[i]))
332			printf("	\"%d\",\n", i);
333		else if (j & RANGE_RT)
334		{
335			if (j & RANGE_MIN)
336				printf("	\"RTMIN\",\n");
337			else if (j & RANGE_MAX)
338				printf("	\"RTMAX\",\n");
339			else
340			{
341				m = j & RANGE_SIG;
342				if (m > n / 2)
343					printf("	\"RTMAX-%d\",\n", n - m);
344				else
345					printf("	\"RTMIN+%d\",\n", m);
346			}
347		}
348		else
349			printf("	\"%s\",\n", map[j].name);
350	printf("	0\n");
351	printf("};\n");
352	printf("\n");
353	printf("static const char* const	sig_text[] =\n");
354	printf("{\n");
355	for (i = 0; i <= k; i++)
356		if (!(j = mapindex[i]))
357			printf("	\"Signal %d\",\n", i);
358		else if (j & RANGE_RT)
359			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
360		else if (map[j].text)
361			printf("	\"%s\",\n", map[j].text);
362#if _lib_strsignal
363		else if (s = strsignal(i))
364			printf("	\"%s\",\n", s);
365#endif
366		else
367			printf("	\"Signal %d\",\n", i);
368	printf("	0\n");
369	printf("};\n");
370	return 0;
371}
372