4.4BSD/usr/src/contrib/rc-1.4/mksignal

#!/bin/sh
# generate rc's internal signal table from signal.h

exec > sigmsgs.c

echo '#include "sigmsgs.h"'
echo
echo 'Sigmsgs signals[] = {'

sed '	s/\/\*[ 	]*//
	s/[ 	]*\*\///
	s/([@*+!]) //
	s/[ 	]*([a-zA-Z,->& ]*)[ 	]*//
	s/^[ 	]*\#[ 	]*define/\#define/
	s/[ 	]*signal$//' $1 |
awk '
	BEGIN {
		# assign to nomesg["SIGNAME"] to suppress a long message
		nomesg["SIGINT"] = 1
		nomesg["SIGPIPE"] = 1
		# assign to mesg["SIGNAME"] to override a message
		mesg["SIGHUP"] = "hangup"
		mesg["SIGKILL"] = "killed"
		mesg["SIGQUIT"] = "quit"
		mesg["SIGTERM"] = "terminated"
		mesg["SIGURG"] = "urgent condition on i/o channel"
		mesg["SIGSTOP"] = "stop signal not from tty"
		mesg["SIGTSTP"] = "stopped"
		mesg["SIGCONT"] = "continue"
		mesg["SIGCHLD"] = "child stop or exit"
		mesg["SIGTTIN"] = "background tty read"
		mesg["SIGTTOU"] = "background tty write"
		# assign to ignore["SIGNAME"] to explicitly ignore a named signal
		ignore["SIGMAX"] = 1
	}
	$1 == "#define" && $2 == "NSIG" && $3 ~ /^[0-9]+$/ { nsig = $3 }
	$1 == "#define" && $2 ~ /^SIG/ && $3 ~ /^[0-9]+$/ && sig[$3] == "" && ignore[$2] == 0 {
		sig[$3] = $2
		if ($3 > max)
			max = $3
		if (mesg[$2] == "" && nomesg[$2] == 0) {
			str = $4
			for (i = 5; i <= NF; i++)
				str = str " " $i
			mesg[$2] = str
		}
	}
	END {
		if (nsig == 0)
			nsig = max + 1
		printf "	{!!,		!!},\n"
		for (i = 1; i < nsig; i++) {
			if (sig[i] == "")
				printf "	{!!,		!!},\n"
			else
				printf "	{!%s!,	!%s!},\n", sig[i], mesg[sig[i]]
		}
	}
' |
tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!' 'abcdefghijklmnopqrstuvwxyz"'

echo '};'

exec > sigmsgs.h

echo 'typedef struct {'
echo '	char *name, *msg;'
echo '} Sigmsgs;'
echo 'extern Sigmsgs signals[];'

grep '^	' sigmsgs.c |		# the thing in quotes is ^<tab>
awk '
		{ sum = sum + 1; }
	END	{ print "#define NUMOFSIGNALS", sum }
'