/**
 * Information in this module is taken from the GNU core-utils 
 * manual, process control section.
 *
 *   http://www.gnu.org/manual/coreutils-4.5.4/coreutils.html
 */
module system/posix/signal

signature
  constructors
    Signal:        String * Int * String -> Signal
    UnknownSignal: Int -> Signal
    
strategies    

  // :: Int -> Signal
  signal-from-number = ?i;
    ( <fetch-elem(?Signal(_, i, _))> AllSignals()
    <+ !UnknownSignal(i))
    
  // :: Signal -> Int    
  number-from-signal :
    Signal(_, i, _) -> i   
    
  number-from-signal :    
    UnknownSignal(i) -> i  
    
  // :: Signal -> String
  signal-to-descr :
    Signal(n, i, s) -> <concat-strings> [n, " (", <int-to-string> i, "): ", s]
    
  signal-to-descr :
    UnknownSignal(i) -> <concat-strings> ["Unknown signal (", <int-to-string> i, ")"]
    
overlays

 /**
  * Table containing all signals.
  */
  AllSignals = 
    [ SIGHUP(),  SIGINT(),  SIGQUIT(), SIGABRT(), SIGKILL(),   SIGALRM(), SIGTERM()
    , SIGBUS(),  SIGCHLD(), SIGCONT(), SIGFPE(),  SIGILL(),    SIGPIPE(), SIGSEGV() 
    , SIGSTOP(), SIGTSTP(), SIGTTIN(), SIGTTOU(), SIGURG(),    SIGUSR1(), SIGUSR2()
    , SIGPOLL(), SIGPROF(), SIGSYS(),  SIGTRAP(), SIGVTALRM(), SIGXCPU(), SIGXFSZ()
    ]

/**
 * POSIX
 */
overlays
  SIGHUP  = Signal("HUP",   1, "Hangup")
  SIGINT  = Signal("INT",   2, "Terminal interrupt")
  SIGQUIT = Signal("QUIT",  3, "Terminal quit")
  SIGABRT = Signal("ABRT",  6, "Process abort")
  SIGKILL = Signal("KILL",  9, "Kill")
  SIGALRM = Signal("ALRM", 14, "Alarm Clock")
  SIGTERM = Signal("TERM", 15, "Termination")
  
/**
 * POSIX 1003.1-2001
 */
overlays
  SIGBUS  = Signal("BUS",   7, "Access to an undefined portion of a memory object")
  SIGCHLD = Signal("CHLD", 17, "Child process terminated, stopped, or continued")
  SIGCONT = Signal("CONT", 18, "Continue executing, if stopped") 
  SIGFPE  = Signal("FPE",   8, "Erroneous arithmetic operation")
  SIGILL  = Signal("ILL",   4, "Illegal Instruction")
  SIGPIPE = Signal("PIPE", 13, "Write on a pipe with no one to read it")
  SIGSEGV = Signal("SEGV", 11, "Invalid memory reference")
  SIGSTOP = Signal("STOP", 19, "Stop executing")
  SIGTSTP = Signal("TSTP", 20, "Terminal stop")
  SIGTTIN = Signal("TTIN", 21, "Background process attempting read")
  SIGTTOU = Signal("TTOU", 22, "Background process attempting write")
  SIGURG  = Signal("URG",  23, "High bandwidth data is available at a socket")
  SIGUSR1 = Signal("USR1", 10, "User-defined signal 1")
  SIGUSR2 = Signal("USR2", 12, "User-defined signal 2")
  
/**
 * POSIX 1003.1-2001, XSI extension
 */
overlays
  SIGPOLL   = Signal("POLL",    29, "Pollable event")
  SIGPROF   = Signal("PROF",    27, "Profiling timer expired")
  SIGSYS    = Signal("SYS",     31, "Bad system call")
  SIGTRAP   = Signal("TRAP",     5, "Trace/breakpoint trap")
  SIGVTALRM = Signal("VTALRM",  26, "Virtual timer expired")
  SIGXCPU   = Signal("XCPU",    24, "CPU time limit exceeded")
  SIGXFSZ   = Signal("XFSZ",    25, "File size limit exceeded")