aboutsummaryrefslogtreecommitdiff
path: root/string/xpg-strerror.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-05-21 16:19:06 -0400
committerUlrich Drepper <drepper@gmail.com>2011-05-21 16:19:06 -0400
commitadcd5c15d2a37794d021104160b425ff61f88219 (patch)
tree15096524f79302f34fe2a37f1c415885276e7385 /string/xpg-strerror.c
parent7ea72f99966a65a56aedba817ee2413ff9b1f23c (diff)
downloadglibc-adcd5c15d2a37794d021104160b425ff61f88219.tar
glibc-adcd5c15d2a37794d021104160b425ff61f88219.tar.gz
glibc-adcd5c15d2a37794d021104160b425ff61f88219.tar.bz2
glibc-adcd5c15d2a37794d021104160b425ff61f88219.zip
Fix last change
And optimize a bit.
Diffstat (limited to 'string/xpg-strerror.c')
-rw-r--r--string/xpg-strerror.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/string/xpg-strerror.c b/string/xpg-strerror.c
index 00256c3dac..10fc1bf99f 100644
--- a/string/xpg-strerror.c
+++ b/string/xpg-strerror.c
@@ -19,20 +19,10 @@
#include <assert.h>
#include <errno.h>
-#include <libintl.h>
#include <stdio.h>
#include <string.h>
#include <sys/param.h>
-#include <stdio-common/_itoa.h>
-/* It is critical here that we always use the `dcgettext' function for
- the message translation. Since <libintl.h> only defines the macro
- `dgettext' to use `dcgettext' for optimizing programs this is not
- always guaranteed. */
-#ifndef dgettext
-# include <locale.h> /* We need LC_MESSAGES. */
-# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES)
-#endif
/* Fill buf with a string describing the errno code in ERRNUM. */
int
@@ -41,13 +31,18 @@ __xpg_strerror_r (int errnum, char *buf, size_t buflen)
const char *estr = __strerror_r (errnum, buf, buflen);
size_t estrlen = strlen (estr);
- if (errnum < 0 || errnum >= _sys_nerr_internal
- || _sys_errlist_internal[errnum] == NULL)
- return EINVAL;
-
- assert (estr != buf);
-/* Terminate the string in any case. */
- *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0';
+ if (estr == buf)
+ {
+ assert (errnum < 0 || errnum >= _sys_nerr_internal
+ || _sys_errlist_internal[errnum] == NULL);
+ return EINVAL;
+ }
+ assert (errnum >= 0 && errnum < _sys_nerr_internal
+ && _sys_errlist_internal[errnum] != NULL);
+
+ /* Terminate the string in any case. */
+ if (buflen > 0)
+ *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0';
return buflen <= estrlen ? ERANGE : 0;
}