Construct a new SignalException object.
sig should be a known signal name, or a signal number.
static VALUE
esignal_init(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
{
int argnum = 1;
VALUE sig = Qnil;
int signo;
const char *signm;
char tmpnm[(sizeof(int)*CHAR_BIT)/3+4];
if (argc > 0) {
sig = argv[0];
if (FIXNUM_P(sig)) argnum = 2;
}
if (argc < 1 || argnum < argc) {
rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
argc, argnum);
}
if (argnum == 2) {
signo = FIX2INT(sig);
if (signo < 0 || signo > NSIG) {
rb_raise(rb_eArgError, "invalid signal number (%d)", signo);
}
if (argc > 1) {
sig = argv[1];
}
else {
signm = signo2signm(signo);
if (signm) {
snprintf(tmpnm, sizeof(tmpnm), "SIG%s", signm);
}
else {
snprintf(tmpnm, sizeof(tmpnm), "SIG%u", signo);
}
sig = rb_str_new2(signm = tmpnm);
}
}
else {
signm = SYMBOL_P(sig) ? rb_id2name(SYM2ID(sig)) : StringValuePtr(sig);
if (strncmp(signm, "SIG", 3) == 0) signm += 3;
signo = signm2signo(signm);
if (!signo) {
rb_raise(rb_eArgError, "unsupported name `SIG%s'", signm);
}
if (SYMBOL_P(sig)) {
sig = rb_str_new2(signm);
}
}
rb_call_super(1, &sig);
rb_iv_set(self, "signo", INT2NUM(signo));
return self;
}