Mercurial > hg > octave-kai > gnulib-hg
annotate lib/strsignal.c @ 17476:6057744acd2c default tip master
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Fri, 16 Aug 2013 06:32:22 -0700 |
parents | e542fd46ad6f |
children |
rev | line source |
---|---|
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16201
diff
changeset
|
1 /* Copyright (C) 1991, 1994-2002, 2005, 2008-2013 Free Software Foundation, |
12518
b5e42ef33b49
update nearly all FSF copyright year lists to include 2009
Jim Meyering <meyering@redhat.com>
parents:
12421
diff
changeset
|
2 Inc. |
9616 | 3 This file is part of the GNU C Library. |
4 | |
12002
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
5 This program is free software: you can redistribute it and/or modify |
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
7 the Free Software Foundation; either version 3 of the License, or |
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
8 (at your option) any later version. |
9616 | 9 |
12002
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
9616 | 11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
12002
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
13 GNU General Public License for more details. |
9616 | 14 |
12002
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
15 You should have received a copy of the GNU General Public License |
f295924fa612
Use the standard header with GPL copyright.
Bruno Haible <bruno@clisp.org>
parents:
10318
diff
changeset
|
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
9616 | 17 |
18 #ifndef _LIBC | |
19 # include <config.h> | |
20 #endif | |
21 | |
15816
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
22 /* Specification. */ |
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
23 #include <string.h> |
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
24 |
9616 | 25 #include <signal.h> |
26 #include <stdio.h> | |
27 #include <stdlib.h> | |
28 | |
29 #ifdef _LIBC | |
30 # include <libintl.h> | |
31 #else /* !_LIBC */ | |
32 # include "gettext.h" | |
33 # define _(msgid) gettext (msgid) | |
34 # define N_(msgid) gettext_noop (msgid) | |
35 #endif /* _LIBC */ | |
36 | |
37 #ifdef _LIBC | |
38 # include <bits/libc-lock.h> | |
39 #else /* !_LIBC */ | |
10318
8a3539888308
Move the lock and tls source files into a subdirectory.
Bruno Haible <bruno@clisp.org>
parents:
9893
diff
changeset
|
40 # include "glthread/lock.h" |
8a3539888308
Move the lock and tls source files into a subdirectory.
Bruno Haible <bruno@clisp.org>
parents:
9893
diff
changeset
|
41 # include "glthread/tls.h" |
9616 | 42 # define __libc_once_define(CLASS, NAME) gl_once_define (CLASS, NAME) |
43 # define __libc_once(NAME, INIT) gl_once ((NAME), (INIT)) | |
44 # define __libc_key_t gl_tls_key_t | |
45 # define __libc_getspecific(NAME) gl_tls_get ((NAME)) | |
46 # define __libc_setspecific(NAME, POINTER) gl_tls_set ((NAME), (POINTER)) | |
47 # define __snprintf snprintf | |
48 #endif /* _LIBC */ | |
49 | |
50 #ifdef _LIBC | |
51 | |
52 /* Defined in siglist.c. */ | |
53 extern const char *const _sys_siglist[]; | |
54 extern const char *const _sys_siglist_internal[] attribute_hidden; | |
55 | |
56 #else /* !_LIBC */ | |
57 | |
58 /* NetBSD declares sys_siglist in unistd.h. */ | |
15816
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
59 # if HAVE_UNISTD_H |
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
60 # include <unistd.h> |
db340f34e324
glthread/*, strsignal: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
61 # endif |
9616 | 62 |
63 # define INTUSE(x) (x) | |
64 | |
65 # if HAVE_DECL_SYS_SIGLIST | |
66 # undef _sys_siglist | |
67 # define _sys_siglist sys_siglist | |
68 # else /* !HAVE_DECL_SYS_SIGLIST */ | |
69 # ifndef NSIG | |
70 # define NSIG 32 | |
71 # endif /* NSIG */ | |
9893
ec6e90aaf2d7
Fix two compilation errors.
Bruno Haible <bruno@clisp.org>
parents:
9616
diff
changeset
|
72 # if !HAVE_DECL__SYS_SIGLIST |
9616 | 73 static const char *_sys_siglist[NSIG]; |
9893
ec6e90aaf2d7
Fix two compilation errors.
Bruno Haible <bruno@clisp.org>
parents:
9616
diff
changeset
|
74 # endif |
9616 | 75 # endif /* !HAVE_DECL_SYS_SIGLIST */ |
76 | |
77 #endif /* _LIBC */ | |
78 | |
79 static __libc_key_t key; | |
80 | |
81 /* If nonzero the key allocation failed and we should better use a | |
82 static buffer than fail. */ | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
83 #define BUFFERSIZ 100 |
9616 | 84 static char local_buf[BUFFERSIZ]; |
85 static char *static_buf; | |
86 | |
87 /* Destructor for the thread-specific data. */ | |
88 static void init (void); | |
89 static void free_key_mem (void *mem); | |
90 static char *getbuffer (void); | |
91 | |
92 | |
93 /* Return a string describing the meaning of the signal number SIGNUM. */ | |
94 char * | |
95 strsignal (int signum) | |
96 { | |
97 const char *desc; | |
98 __libc_once_define (static, once); | |
99 | |
100 /* If we have not yet initialized the buffer do it now. */ | |
101 __libc_once (once, init); | |
102 | |
103 if ( | |
104 #ifdef SIGRTMIN | |
105 (signum >= SIGRTMIN && signum <= SIGRTMAX) || | |
106 #endif | |
107 signum < 0 || signum >= NSIG | |
108 || (desc = INTUSE(_sys_siglist)[signum]) == NULL) | |
109 { | |
110 char *buffer = getbuffer (); | |
111 int len; | |
112 #ifdef SIGRTMIN | |
113 if (signum >= SIGRTMIN && signum <= SIGRTMAX) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
114 len = __snprintf (buffer, BUFFERSIZ - 1, _("Real-time signal %d"), |
13957
4efda5bffbf3
signal: Document problem with type of SIGRTMIN, SIGRTMAX on OSF/1 5.1.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
115 signum - (int) SIGRTMIN); |
9616 | 116 else |
117 #endif | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
118 len = __snprintf (buffer, BUFFERSIZ - 1, _("Unknown signal %d"), |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
119 signum); |
9616 | 120 if (len >= BUFFERSIZ) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
121 buffer = NULL; |
9616 | 122 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
123 buffer[len] = '\0'; |
9616 | 124 |
125 return buffer; | |
126 } | |
127 | |
128 return (char *) _(desc); | |
129 } | |
130 | |
131 | |
132 /* Initialize buffer. */ | |
133 static void | |
134 init (void) | |
135 { | |
136 #ifdef _LIBC | |
137 if (__libc_key_create (&key, free_key_mem)) | |
138 /* Creating the key failed. This means something really went | |
139 wrong. In any case use a static buffer which is better than | |
140 nothing. */ | |
141 static_buf = local_buf; | |
142 #else /* !_LIBC */ | |
143 gl_tls_key_init (key, free_key_mem); | |
144 | |
145 # if !HAVE_DECL_SYS_SIGLIST | |
146 memset (_sys_siglist, 0, NSIG * sizeof *_sys_siglist); | |
147 | |
148 /* No need to use a do {} while (0) here since init_sig(...) must expand | |
149 to a complete statement. (We cannot use the ISO C99 designated array | |
150 initializer syntax since it is not supported by ANSI C compilers and | |
151 since some signal numbers might exceed NSIG.) */ | |
152 # define init_sig(sig, abbrev, desc) \ | |
153 if (sig >= 0 && sig < NSIG) \ | |
154 _sys_siglist[sig] = desc; | |
155 | |
156 # include "siglist.h" | |
157 | |
158 # undef init_sig | |
159 | |
160 # endif /* !HAVE_DECL_SYS_SIGLIST */ | |
161 #endif /* !_LIBC */ | |
162 } | |
163 | |
164 | |
165 /* Free the thread specific data, this is done if a thread terminates. */ | |
166 static void | |
167 free_key_mem (void *mem) | |
168 { | |
169 free (mem); | |
170 __libc_setspecific (key, NULL); | |
171 } | |
172 | |
173 | |
174 /* Return the buffer to be used. */ | |
175 static char * | |
176 getbuffer (void) | |
177 { | |
178 char *result; | |
179 | |
180 if (static_buf != NULL) | |
181 result = static_buf; | |
182 else | |
183 { | |
184 /* We don't use the static buffer and so we have a key. Use it | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
185 to get the thread-specific buffer. */ |
9616 | 186 result = __libc_getspecific (key); |
187 if (result == NULL) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
188 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
189 /* No buffer allocated so far. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
190 result = malloc (BUFFERSIZ); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
191 if (result == NULL) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
192 /* No more memory available. We use the static buffer. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
193 result = local_buf; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
194 else |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
195 __libc_setspecific (key, result); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
12002
diff
changeset
|
196 } |
9616 | 197 } |
198 | |
199 return result; | |
200 } |