aboutsummaryrefslogtreecommitdiff
path: root/wcsmbs/wcscpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'wcsmbs/wcscpy.c')
-rw-r--r--wcsmbs/wcscpy.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/wcsmbs/wcscpy.c b/wcsmbs/wcscpy.c
index aeb8abb..2e52a6c 100644
--- a/wcsmbs/wcscpy.c
+++ b/wcsmbs/wcscpy.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -17,10 +17,8 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <wchar.h>
-
-#define __need_ptrdiff_t
#include <stddef.h>
+#include <wchar.h>
/* Copy SRC to DEST. */
@@ -29,16 +27,33 @@ wcscpy (dest, src)
wchar_t *dest;
const wchar_t *src;
{
- wchar_t *wcp = (wchar_t *) src;
wint_t c;
- const ptrdiff_t off = dest - src - 1;
+ wchar_t *wcp;
- do
+ if (__alignof__ (wchar_t) >= sizeof (wchar_t))
+ {
+ const ptrdiff_t off = dest - src - 1;
+
+ wcp = (wchar_t *) src;
+
+ do
+ {
+ c = *wcp++;
+ wcp[off] = c;
+ }
+ while (c != L'\0');
+ }
+ else
{
- c = *wcp++;
- wcp[off] = c;
+ wcp = dest;
+
+ do
+ {
+ c = *src++;
+ *wcp++ = c;
+ }
+ while (c != L'\0');
}
- while (c != L'\0');
return dest;
}