diff options
Diffstat (limited to 'libc/string/strsignal.c')
| -rw-r--r-- | libc/string/strsignal.c | 75 | 
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  | 
