diff options
Diffstat (limited to 'string')
-rw-r--r-- | string/stratcliff.c | 152 | ||||
-rw-r--r-- | string/strsignal.c | 13 |
2 files changed, 159 insertions, 6 deletions
diff --git a/string/stratcliff.c b/string/stratcliff.c new file mode 100644 index 0000000000..5f6a467c15 --- /dev/null +++ b/string/stratcliff.c @@ -0,0 +1,152 @@ +#define _GNU_SOURCE 1 +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/param.h> + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +int +main (int argc, char *argv[]) +{ + size_t size = sysconf (_SC_PAGESIZE); + char *adr; + int result = 0; + + adr = (char *) mmap (NULL, size, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (adr == NULL) + { + if (errno == ENOSYS) + puts ("No test, mmap not available."); + else + { + printf ("mmaping failed: %m"); + result = 1; + } + } + else + { + char dest[size]; + int inner, middle, outer; + + memset (adr, 'T', size); + + /* strlen test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if (strlen (&adr[outer]) != inner - outer) + { + printf ("strlen flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + + /* strchr test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (middle = MAX (outer, size - 64); middle < size; ++middle) + { + for (inner = middle; inner < size; ++inner) + { + char *cp; + adr[middle] = 'V'; + adr[inner] = '\0'; + + cp = strchr (&adr[outer], 'V'); + + if ((inner == middle && cp != NULL) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { + printf ("strchr flunked for outer = %d, middle = %d, " + "inner = %d\n", outer, middle, inner); + result = 1; + } + + adr[inner] = 'T'; + adr[middle] = 'T'; + } + } + } + + /* strrchr test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (middle = MAX (outer, size - 64); middle < size; ++middle) + { + for (inner = middle; inner < size; ++inner) + { + char *cp; + adr[middle] = 'V'; + adr[inner] = '\0'; + + cp = strrchr (&adr[outer], 'V'); + + if ((inner == middle && cp != NULL) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { + printf ("strrchr flunked for outer = %d, middle = %d, " + "inner = %d\n", outer, middle, inner); + result = 1; + } + + adr[inner] = 'T'; + adr[middle] = 'T'; + } + } + } + + /* strcpy test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if (strcpy (dest, &adr[outer]) != dest + || strlen (dest) != inner - outer) + { + printf ("strcpy flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + + /* stpcpy test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if ((stpcpy (dest, &adr[outer]) - dest) != inner - outer) + { + printf ("stpcpy flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + } + + return result; +} diff --git a/string/strsignal.c b/string/strsignal.c index 3a0c6b2e2f..a700a9f804 100644 --- a/string/strsignal.c +++ b/string/strsignal.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <ansidecl.h> #include <signal.h> #include <stdio.h> #include <string.h> @@ -27,14 +26,16 @@ Cambridge, MA 02139, USA. */ #endif /* Defined in siglist.c. */ -extern CONST char *CONST _sys_siglist[]; +extern const char *const _sys_siglist[]; /* Return a string describing the meaning of the signal number SIGNUM. */ char * -DEFUN(strsignal, (signum), int signum) +strsignal (int signum) { - if (signum < 0 || signum > NSIG) + const char *desc; + + if (signum < 0 || signum > NSIG || (desc = _sys_siglist[signum]) == NULL) { static char buf[512]; int len = __snprintf (buf, sizeof buf, _("Unknown signal %d"), signum); @@ -44,5 +45,5 @@ DEFUN(strsignal, (signum), int signum) return buf; } - return (char *) _(_sys_siglist[signum]); + return (char *) _(desc); } |