X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsig2str.c;h=119006af5bf706f94e4b13b5bf482cdae1514f52;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=1edc9f119502d32c079b0b570387f53a96ac7304;hpb=833bf615e55c2c7da116e82558364653766c1dce;p=gnulib.git diff --git a/lib/sig2str.c b/lib/sig2str.c index 1edc9f119..119006af5 100644 --- a/lib/sig2str.c +++ b/lib/sig2str.c @@ -1,11 +1,11 @@ /* sig2str.c -- convert between signal names and numbers - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2006, 2009-2014 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,14 +13,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* Written by Paul Eggert. */ -#if HAVE_CONFIG_H -# include -#endif +#include #include #include @@ -28,13 +25,6 @@ #include #include -#if HAVE_SYS_WAIT_H -# include -#endif -#ifndef WTERMSIG -# define WTERMSIG(s) ((s) & 0x7F) -#endif - #include "sig2str.h" #ifndef SIGRTMIN @@ -51,7 +41,7 @@ static struct numname { int num; char const name[8]; } numname_table[] = { /* Signals required by POSIX 1003.1-2001 base, listed in - traditional numeric order. */ + traditional numeric order where possible. */ #ifdef SIGHUP NUMNAME (HUP), #endif @@ -76,12 +66,14 @@ static struct numname { int num; char const name[8]; } numname_table[] = #ifdef SIGKILL NUMNAME (KILL), #endif -#ifdef SIGBUS - NUMNAME (BUS), -#endif #ifdef SIGSEGV NUMNAME (SEGV), #endif + /* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match + strsignal.c output, so SIGBUS must be listed second. */ +#ifdef SIGBUS + NUMNAME (BUS), +#endif #ifdef SIGPIPE NUMNAME (PIPE), #endif @@ -141,7 +133,7 @@ static struct numname { int num; char const name[8]; } numname_table[] = /* Unix Version 7. */ #ifdef SIGIOT - NUMNAME (IOT), /* Older name for ABRT. */ + NUMNAME (IOT), /* Older name for ABRT. */ #endif #ifdef SIGEMT NUMNAME (EMT), @@ -224,17 +216,17 @@ static struct numname { int num; char const name[8]; } numname_table[] = #endif /* Older AIX versions. */ -#ifdef SIGALRM1 - NUMNAME (ALRM1), /* unknown; taken from Bash 2.05 */ +#ifdef SIGALRM1 + NUMNAME (ALRM1), /* unknown; taken from Bash 2.05 */ #endif #ifdef SIGKAP - NUMNAME (KAP), /* Older name for SIGGRANT. */ + NUMNAME (KAP), /* Older name for SIGGRANT. */ #endif #ifdef SIGVIRT - NUMNAME (VIRT), /* unknown; taken from Bash 2.05 */ + NUMNAME (VIRT), /* unknown; taken from Bash 2.05 */ #endif #ifdef SIGWINDOW - NUMNAME (WINDOW), /* Older name for SIGWINCH. */ + NUMNAME (WINDOW), /* Older name for SIGWINCH. */ #endif /* BeOS */ @@ -254,13 +246,13 @@ static struct numname { int num; char const name[8]; } numname_table[] = #define NUMNAME_ENTRIES (sizeof numname_table / sizeof numname_table[0]) /* ISDIGIT differs from isdigit, as follows: - - Its arg may be any int or unsigned int; it need not be an unsigned char. - - It's guaranteed to evaluate its argument exactly once. + - Its arg may be any int or unsigned int; it need not be an unsigned char + or EOF. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to - ISDIGIT_LOCALE unless it's important to use the locale's definition - of `digit' even when the host does not conform to POSIX. */ -#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) + isdigit unless it's important to use the locale's definition + of "digit" even when the host does not conform to POSIX. */ +#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) /* Convert the signal name SIGNAME to a signal number. Return the signal number if successful, -1 otherwise. */ @@ -273,32 +265,32 @@ str2signum (char const *signame) char *endp; long int n = strtol (signame, &endp, 10); if (! *endp && n <= SIGNUM_BOUND) - return n; + return n; } else { - int i; + unsigned int i; for (i = 0; i < NUMNAME_ENTRIES; i++) - if (strcmp (numname_table[i].name, signame) == 0) - return numname_table[i].num; + if (strcmp (numname_table[i].name, signame) == 0) + return numname_table[i].num; { - char *endp; - int rtmin = SIGRTMIN; - int rtmax = SIGRTMAX; - - if (0 < rtmin && strncmp (signame, "RTMIN", 5) == 0) - { - long int n = strtol (signame + 5, &endp, 10); - if (! *endp && 0 <= n && n <= rtmax - rtmin) - return rtmin + n; - } - else if (0 < rtmax && strncmp (signame, "RTMAX", 5) == 0) - { - long int n = strtol (signame + 5, &endp, 10); - if (! *endp && rtmin - rtmax <= n && n <= 0) - return rtmax + n; - } + char *endp; + int rtmin = SIGRTMIN; + int rtmax = SIGRTMAX; + + if (0 < rtmin && strncmp (signame, "RTMIN", 5) == 0) + { + long int n = strtol (signame + 5, &endp, 10); + if (! *endp && 0 <= n && n <= rtmax - rtmin) + return rtmin + n; + } + else if (0 < rtmax && strncmp (signame, "RTMAX", 5) == 0) + { + long int n = strtol (signame + 5, &endp, 10); + if (! *endp && rtmin - rtmax <= n && n <= 0) + return rtmax + n; + } } } @@ -322,32 +314,36 @@ str2sig (char const *signame, int *signum) int sig2str (int signum, char *signame) { - int i; + unsigned int i; for (i = 0; i < NUMNAME_ENTRIES; i++) if (numname_table[i].num == signum) { - strcpy (signame, numname_table[i].name); - return 0; + strcpy (signame, numname_table[i].name); + return 0; } { int rtmin = SIGRTMIN; int rtmax = SIGRTMAX; + int base, delta; if (! (rtmin <= signum && signum <= rtmax)) return -1; if (signum <= rtmin + (rtmax - rtmin) / 2) { - int delta = signum - rtmin; - sprintf (signame, delta ? "RTMIN+%d" : "RTMIN", delta); + strcpy (signame, "RTMIN"); + base = rtmin; } else { - int delta = rtmax - signum; - sprintf (signame, delta ? "RTMAX-%d" : "RTMAX", delta); + strcpy (signame, "RTMAX"); + base = rtmax; } + delta = signum - base; + if (delta != 0) + sprintf (signame + 5, "%+d", delta); return 0; } }