summaryrefslogtreecommitdiff
path: root/libc/string/strsignal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/string/strsignal.c')
-rw-r--r--libc/string/strsignal.c75
1 files changed, 63 insertions, 12 deletions
diff --git a/libc/string/strsignal.c b/libc/string/strsignal.c
index 4cadb144a..1a0a6ca47 100644
--- a/libc/string/strsignal.c
+++ b/libc/string/strsignal.c
@@ -4,11 +4,25 @@
* GNU Library General Public License.
*/
+/*
+ * Manuel Novoa III Dec 2000
+ *
+ * Converted to use my new (un)signed long (long) to string routines, which
+ * are smaller than the previous functions and don't require static buffers.
+ * Removed dependence on strcat in the process.
+ *
+ * Also fixed a bug in the signal name lookup code. While the table is
+ * declared with dimension > 60, there are currently on 32 signals listed.
+ *
+ * Also appended a test routine ( -DSTRSIGNAL_TEST ) to allow a quick check
+ * on the buffer length when the sys_errorlist is modified.
+ */
+
#include <string.h>
#include <malloc.h>
#include <signal.h>
-extern char *itoa(int i);
+extern char *__ltostr(char *buf, long uval, int base, int uppercase);
const char *const sys_siglist[] = {
"Unknown signal",
@@ -46,26 +60,63 @@ const char *const sys_siglist[] = {
NULL
};
+#include <limits.h>
+
+#if (INT_MAX >> 31)
+/* We're set up for 32 bit ints */
+#error need to check size allocation for static buffer 'retbuf'
+#endif
+
/********************** Function strsignal ************************************/
char *strsignal(int sig)
{
- static char retbuf[80];
+ static char retbuf[28]; /* 28 is sufficient for 32 bit ints */
+ static const char unknown_signal[] = "Unknown Signal:";
+ char *pos;
- if (sys_siglist) {
- if (sig < 0 || sig >= _NSIG)
- goto unknown;
+ /* if ((sig >= 0) && (sig < _NSIG)) { */
+ if ((sig >= 0) && (sig < 32)) { /* WARNING!!! NOT ALL _NSIG DEFINED!!! */
strcpy(retbuf, sys_siglist[sig]);
return retbuf;
}
- if (sig <= 0)
- goto unknown;
-
- unknown:
- strcpy(retbuf, "Unknown Signal: ");
- strcat(retbuf, (char *) itoa(sig));
- return retbuf;
+ pos = __ltostr(retbuf + sizeof(unknown_signal) + 1, sig, 10, 0)
+ - sizeof(unknown_signal);
+ strcpy(pos, unknown_signal);
+ *(pos + sizeof(unknown_signal) - 1) = ' ';
+ return pos;
}
/********************** THE END ********************************************/
+
+#if STRSIGNAL_TEST
+/* quick way to check for sufficient buffer length */
+#include <stdio.h>
+#include <stdlib.h>
+int main(void)
+{
+ int max = 0;
+ int i, j;
+ const char *p;
+
+ printf("_NSIG = %d from headers\n", _NSIG);
+ for ( i=0 ; i < _NSIG ; i++ ) {
+ p = sys_siglist[i];
+ if (!p) {
+ printf("Warning! I only count %d signals!\n", i);
+ break;
+ }
+ j = strlen(sys_siglist[i])+1;
+ if (j > max) max = j;
+ }
+ printf("max len = %i\n", j);
+
+ p = strsignal(INT_MIN);
+ printf("<%s> %d\n", p, strlen(p)+1);
+
+ p = strsignal(i-1);
+ printf("last signal %d is %s\n", i-1, p);
+ return EXIT_SUCCESS;
+}
+#endif