[alt.sources] make_siglist.c

tml@hemuli.atk.vtt.fi (Tor Lillqvist) (06/07/89)

With all the SysV/BSD hybrids out there, one cannot assume anything
about the values of the SIG* macros.  Another problem is that
sys_siglist isn't available on many systems.

This program generates a file that defines the BSD-style sys_siglist
array and a signal_names array.

It is easy to add more exotic signals.

/*
 * make_siglist -- create a file defining sys_siglist and signal_names
 *
 */

#include <stdio.h>
#include <sys/signal.h>

char *sys_siglist[NSIG];
char *signal_names[NSIG];

void
setup_siglist()
{
  int i;
  for (i = 0; i < NSIG; i++)
    sys_siglist[i] = NULL, signal_names[i] = NULL;

  sys_siglist[0] = "No signal";
  signal_names[0] = "ON_EXIT";
  sys_siglist[SIGHUP] = "Hangup";
  signal_names[SIGHUP] = "SIGHUP";
  sys_siglist[SIGINT] = "Interrupt";
  signal_names[SIGINT] = "SIGINT";
  sys_siglist[SIGQUIT] = "Quit";
  signal_names[SIGQUIT] = "SIGQUIT";
  sys_siglist[SIGILL] = "Illegal instruction";
  signal_names[SIGILL] = "SIGILL";
  sys_siglist[SIGTRAP] = "Trace trap";
  signal_names[SIGTRAP] = "SIGTRAP";
#ifdef SIGABRT
  sys_siglist[SIGABRT] = "Abnormal termination";
  signal_names[SIGABRT] = "SIGABRT";
#endif
#if defined(SIGIOT) && (!defined(SIGABRT) || SIGIOT != SIGABRT)
  sys_siglist[SIGIOT] = "IOT instruction";
  signal_names[SIGIOT] = "SIGIOT";
#endif
#ifdef SIGEMT
  sys_siglist[SIGEMT] = "EMT instruction";
  signal_names[SIGEMT] = "SIGEMT";
#endif
#ifdef SIGFPE
  sys_siglist[SIGFPE] = "Floating point exception";
  signal_names[SIGFPE] = "SIGFPE";
#endif
  sys_siglist[SIGKILL] = "Killed";
  signal_names[SIGKILL] = "SIGKILL";
  sys_siglist[SIGBUS] = "Bus error";
  signal_names[SIGBUS] = "SIGBUS";
  sys_siglist[SIGSEGV] = "Segmentation violation";
  signal_names[SIGSEGV] = "SIGSEG";
#ifdef SIGSYS
  sys_siglist[SIGSYS] = "Bad argument to system call";
  signal_names[SIGSYS] = "SIGSYS";
#endif
  sys_siglist[SIGPIPE] = "Write on pipe with no one reading";
  signal_names[SIGPIPE] = "SIGPIPE";
  sys_siglist[SIGALRM] = "Alarm clock";
  signal_names[SIGALRM] = "SIGALRM";
  sys_siglist[SIGTERM] = "Software termination";
  signal_names[SIGTERM] = "SIGTERM";
#ifdef SIGUSR1
  sys_siglist[SIGUSR1] = "User defined signal 1";
  signal_names[SIGUSR1] = "SIGUSR1";
#endif
#ifdef SIGUSR2
  sys_siglist[SIGUSR2] = "User defined signal 2";
  signal_names[SIGUSR2] = "SIGUSR2";
#endif
#ifdef SIGCLD
  sys_siglist[SIGCLD] = "Death of child";
  signal_names[SIGCLD] = "SIGCLD";
#endif
#if defined(SIGCHLD) && (!defined(SIGCLD) || SIGCHLD != SIGCLD)
  sys_siglist[SIGCHLD] = "Death of child";
  signal_names[SIGCHLD] = "SIGCHLD";
#endif
#ifdef SIGPWR
  sys_siglist[SIGPWR] = "Power fail restart";
  signal_names[SIGPWR] = "SIGPWR";
#endif
#ifdef SIGVTALRM
  sys_siglist[SIGVTALRM] = "Virtual timer alarm clock";
  signal_names[SIGVTALRM] = "SIGVTALRM";
#endif
#ifdef SIGPROF
  sys_siglist[SIGPROF] = "Profiling timer alarm clock";
  signal_names[SIGPROF] = "SIGPROF";
#endif
#ifdef SIGIO
  sys_siglist[SIGIO] = "Asynchronous I/O";
  signal_names[SIGIO] = "SIGIO";
#endif
#ifdef SIGWINDOW
  sys_siglist[SIGWINDOW] = "Window changed";
  signal_names[SIGWINDOW] = "SIGWINDOW";
#endif
#ifdef SIGWINCH
  sys_siglist[SIGWINCH] = "Window changed";
  signal_names[SIGWINCH] = "SIGWINCH";
#endif
#ifdef SIGSTOP
  sys_siglist[SIGSTOP] = "Stopped";
  signal_names[SIGSTOP] = "SIGSTOP";
#endif
#ifdef SIGTSTP
  sys_siglist[SIGTSTP] = "Stopped from keyboard";
  signal_names[SIGTSTP] = "SIGTSTP";
#endif
#ifdef SIGCONT
  sys_siglist[SIGCONT] = "Continued";
  signal_names[SIGCONT] = "SIGCONT";
#endif
#ifdef SIGTTIN
  sys_siglist[SIGTTIN] = "Attempted background read";
  signal_names[SIGTTIN] = "SIGTTIN";
#endif
#ifdef SIGTTOU
  sys_siglist[SIGTTOU] = "Attempted background write";
  signal_names[SIGTTOU] = "SIGTTOU";
#endif
#ifdef SIGURG
  sys_siglist[SIGURG] = "Urgent data";
  signal_names[SIGURG] = "SIGURG";
#endif
#ifdef SIGXCPU
  sys_siglist[SIGXCPU] = "CPU quota exceeded";
  signal_names[SIGXCPU] = "SIGXCPU";
#endif
#ifdef SIGXFSZ
  sys_siglist[SIGXFSZ] = "File space quota exceeded";
  signal_names[SIGXFSZ] = "SIGXFSZ";
#endif
#ifdef SIGLOST
  sys_siglist[SIGLOST] = "Resource lost";
  signal_names[SIGLOST] = "SIGLOST";
#endif
}

main()
{
  int i;

  setup_siglist();
  
  printf("/* This file was produced by running make_siglist.  Don't edit. */\n\
\n\
char *sys_siglist[] = {\n");
  for (i = 0; i < NSIG; i++) {
    sys_siglist[i] ?
      printf("  \"%s\"", sys_siglist[i]) :
	printf("  \"Signal %d\"", i);
    if (i < NSIG-1)
      putchar(',');
    putchar('\n');
  }
    
  printf("};\n\n");

  printf("char *signal_names[] = {\n");
  for (i = 0; i < NSIG; i++) {
    signal_names[i] ?
      printf(" \"%s\"", signal_names[i]) :
	printf("  \"0\"");
    if (i < NSIG-1)
      putchar(',');
    putchar('\n');
  }
  printf("};\n");

  exit(0);
}

-- 
Tor Lillqvist
Technical Research Centre of Finland, Computing Services (VTT/ATK)
tml@hemuli.atk.vtt.fi [130.188.52.2]

tml@hemuli.atk.vtt.fi (Tor Lillqvist) (06/09/89)

In article <3999@hemuli.atk.vtt.fi> I write:
>With all the SysV/BSD hybrids out there, one cannot assume anything
>about the values of the SIG* macros.  Another problem is that
>sys_siglist isn't available on many systems.
>
>This program generates a file that defines the BSD-style sys_siglist
>array and a signal_names array.

Well, it seems as ULTRIX 2.0 is so brain-damaged that it does:

#define SIGPWR -1

So, here is a revised version of the make_siglist program:

/*
 * make_siglist -- create a file defining sys_siglist and signal_names
 *
 */

#include <stdio.h>
#include <sys/signal.h>

char *sys_siglist[NSIG];
char *signal_names[NSIG];

void
setup_siglist()
{
  int i;
  for (i = 0; i < NSIG; i++)
    sys_siglist[i] = NULL, signal_names[i] = NULL;

  sys_siglist[0] = "No signal";
  signal_names[0] = "ON_EXIT";
#if defined(SIGHUP) && SIGHUP > 0
  sys_siglist[SIGHUP] = "Hangup";
  signal_names[SIGHUP] = "SIGHUP";
#endif
#if defined(SIGINT) && SIGINT > 0
  sys_siglist[SIGINT] = "Interrupt";
  signal_names[SIGINT] = "SIGINT";
#endif
#if defined(SIGQUIT) && SIGQUIT > 0
  sys_siglist[SIGQUIT] = "Quit";
  signal_names[SIGQUIT] = "SIGQUIT";
#endif
#if defined(SIGILL) && SIGILL > 0
  sys_siglist[SIGILL] = "Illegal instruction";
  signal_names[SIGILL] = "SIGILL";
#endif
#if defined(SIGTRAP) && SIGTRAP > 0
  sys_siglist[SIGTRAP] = "Trace trap";
  signal_names[SIGTRAP] = "SIGTRAP";
#endif
#if defined(SIGABRT) && SIGABRT > 0
  sys_siglist[SIGABRT] = "Abnormal termination";
  signal_names[SIGABRT] = "SIGABRT";
#endif
#if defined(SIGIOT) && SIGIOT > 0 && (!defined(SIGABRT) || SIGIOT != SIGABRT)
  sys_siglist[SIGIOT] = "IOT instruction";
  signal_names[SIGIOT] = "SIGIOT";
#endif
#if defined(SIGEMT) && SIGEMT > 0
  sys_siglist[SIGEMT] = "EMT instruction";
  signal_names[SIGEMT] = "SIGEMT";
#endif
#if defined(SIGFPE) && SIGFPE > 0
  sys_siglist[SIGFPE] = "Floating point exception";
  signal_names[SIGFPE] = "SIGFPE";
#endif
#if defined(SIGKILL) && SIGKILL > 0
  sys_siglist[SIGKILL] = "Killed";
  signal_names[SIGKILL] = "SIGKILL";
#endif
#if defined(SIGBUS) && SIGBUS > 0
  sys_siglist[SIGBUS] = "Bus error";
  signal_names[SIGBUS] = "SIGBUS";
#endif
#if defined(SIGSEGV) && SIGSEGV > 0
  sys_siglist[SIGSEGV] = "Segmentation violation";
  signal_names[SIGSEGV] = "SIGSEG";
#endif
#if defined(SIGSYS) && SIGSYS > 0
  sys_siglist[SIGSYS] = "Bad argument to system call";
  signal_names[SIGSYS] = "SIGSYS";
#endif
#if defined(SIGPIPE) && SIGPIPE > 0
  sys_siglist[SIGPIPE] = "Write on pipe with no one reading";
  signal_names[SIGPIPE] = "SIGPIPE";
#endif
#if defined(SIGALRM) && SIGALRM > 0
  sys_siglist[SIGALRM] = "Alarm clock";
  signal_names[SIGALRM] = "SIGALRM";
#endif
#if defined(SIGTERM) && SIGTERM > 0
  sys_siglist[SIGTERM] = "Software termination";
  signal_names[SIGTERM] = "SIGTERM";
#endif
#if defined(SIGUSR1) && SIGUSR1 > 0
  sys_siglist[SIGUSR1] = "User defined signal 1";
  signal_names[SIGUSR1] = "SIGUSR1";
#endif
#if defined(SIGUSR2) && SIGUSR2 > 0
  sys_siglist[SIGUSR2] = "User defined signal 2";
  signal_names[SIGUSR2] = "SIGUSR2";
#endif
#if defined(SIGCLD) && SIGCLD > 0
  sys_siglist[SIGCLD] = "Death of child";
  signal_names[SIGCLD] = "SIGCLD";
#endif
#if defined(SIGCHLD) && SIGCHLD > 0 && (!defined(SIGCLD) || SIGCHLD != SIGCLD)
  sys_siglist[SIGCHLD] = "Death of child";
  signal_names[SIGCHLD] = "SIGCHLD";
#endif
#if defined(SIGPWR) && SIGPWR > 0
  sys_siglist[SIGPWR] = "Power fail restart";
  signal_names[SIGPWR] = "SIGPWR";
#endif
#if defined(SIGVTALRM) && SIGVTALRM > 0
  sys_siglist[SIGVTALRM] = "Virtual timer alarm clock";
  signal_names[SIGVTALRM] = "SIGVTALRM";
#endif
#if defined(SIGPROF) && SIGPROF > 0
  sys_siglist[SIGPROF] = "Profiling timer alarm clock";
  signal_names[SIGPROF] = "SIGPROF";
#endif
#if defined(SIGIO) && SIGIO > 0
  sys_siglist[SIGIO] = "Asynchronous I/O";
  signal_names[SIGIO] = "SIGIO";
#endif
#if defined(SIGWINDOW) && SIGWINDOW > 0
  sys_siglist[SIGWINDOW] = "Window changed";
  signal_names[SIGWINDOW] = "SIGWINDOW";
#endif
#if defined(SIGWINCH) && SIGWINCH > 0
  sys_siglist[SIGWINCH] = "Window changed";
  signal_names[SIGWINCH] = "SIGWINCH";
#endif
#if defined(SIGSTOP) && SIGSTOP > 0
  sys_siglist[SIGSTOP] = "Stopped";
  signal_names[SIGSTOP] = "SIGSTOP";
#endif
#if defined(SIGTSTP) && SIGTSTP > 0
  sys_siglist[SIGTSTP] = "Stopped from keyboard";
  signal_names[SIGTSTP] = "SIGTSTP";
#endif
#if defined(SIGCONT) && SIGCONT > 0
  sys_siglist[SIGCONT] = "Continued";
  signal_names[SIGCONT] = "SIGCONT";
#endif
#if defined(SIGTTIN) && SIGTTIN > 0
  sys_siglist[SIGTTIN] = "Attempted background read";
  signal_names[SIGTTIN] = "SIGTTIN";
#endif
#if defined(SIGTTOU) && SIGTTOU > 0
  sys_siglist[SIGTTOU] = "Attempted background write";
  signal_names[SIGTTOU] = "SIGTTOU";
#endif
#if defined(SIGURG) && SIGURG > 0
  sys_siglist[SIGURG] = "Urgent data";
  signal_names[SIGURG] = "SIGURG";
#endif
#if defined(SIGXCPU) && SIGXCPU > 0
  sys_siglist[SIGXCPU] = "CPU quota exceeded";
  signal_names[SIGXCPU] = "SIGXCPU";
#endif
#if defined(SIGXFSZ) && SIGXFSZ > 0
  sys_siglist[SIGXFSZ] = "File space quota exceeded";
  signal_names[SIGXFSZ] = "SIGXFSZ";
#endif
#if defined(SIGLOST) && SIGLOST > 0
  sys_siglist[SIGLOST] = "Resource lost";
  signal_names[SIGLOST] = "SIGLOST";
#endif
}

main()
{
  int i;

  setup_siglist();
  
  printf("/* This file was produced by running make_siglist.  Don't edit. */\n\
\n\
char *sys_siglist[] = {\n");
  for (i = 0; i < NSIG; i++) {
    sys_siglist[i] ?
      printf("  \"%s\"", sys_siglist[i]) :
	printf("  \"Signal %d\"", i);
    if (i < NSIG-1)
      putchar(',');
    putchar('\n');
  }
    
  printf("};\n\n");

  printf("char *signal_names[] = {\n");
  for (i = 0; i < NSIG; i++) {
    signal_names[i] ?
      printf("  \"%s\"", signal_names[i]) :
	printf("  \"0\"");
    if (i < NSIG-1)
      putchar(',');
    putchar('\n');
  }
  printf("};\n");

  exit(0);
}

-- 
Tor Lillqvist
Technical Research Centre of Finland, Computing Services (VTT/ATK)
tml@hemuli.atk.vtt.fi [130.188.52.2]