blob: 035e2bda9e9518c3f14887e86549e0ce3123aaf5 [file] [log] [blame]
Björn Stenbergb69338f2002-05-30 21:03:17 +00001/*
2FUNCTION
Andree Buschmann0b7dcd62010-02-22 21:24:09 +00003 <<strcpy>>---copy string
Björn Stenbergb69338f2002-05-30 21:03:17 +00004
5INDEX
Andree Buschmann0b7dcd62010-02-22 21:24:09 +00006 strcpy
Björn Stenbergb69338f2002-05-30 21:03:17 +00007
8ANSI_SYNOPSIS
Andree Buschmann0b7dcd62010-02-22 21:24:09 +00009 #include <string.h>
10 char *strcpy(char *<[dst]>, const char *<[src]>);
Björn Stenbergb69338f2002-05-30 21:03:17 +000011
12TRAD_SYNOPSIS
Andree Buschmann0b7dcd62010-02-22 21:24:09 +000013 #include <string.h>
14 char *strcpy(<[dst]>, <[src]>)
15 char *<[dst]>;
16 char *<[src]>;
Björn Stenbergb69338f2002-05-30 21:03:17 +000017
18DESCRIPTION
Andree Buschmann0b7dcd62010-02-22 21:24:09 +000019 <<strcpy>> copies the string pointed to by <[src]>
20 (including the terminating null character) to the array
21 pointed to by <[dst]>.
Björn Stenbergb69338f2002-05-30 21:03:17 +000022
23RETURNS
Andree Buschmann0b7dcd62010-02-22 21:24:09 +000024 This function returns the initial value of <[dst]>.
Björn Stenbergb69338f2002-05-30 21:03:17 +000025
26PORTABILITY
27<<strcpy>> is ANSI C.
28
29<<strcpy>> requires no supporting OS subroutines.
30
31QUICKREF
Andree Buschmann0b7dcd62010-02-22 21:24:09 +000032 strcpy ansi pure
Björn Stenbergb69338f2002-05-30 21:03:17 +000033*/
34
35#include <string.h>
36#include <limits.h>
Thomas Martitzf32bd592010-06-22 18:34:03 +000037#include "_ansi.h" /* for _DEFUN */
Björn Stenbergb69338f2002-05-30 21:03:17 +000038
39/*SUPPRESS 560*/
40/*SUPPRESS 530*/
41
42/* Nonzero if either X or Y is not aligned on a "long" boundary. */
43#define UNALIGNED(X, Y) \
44 (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1)))
45
46#if LONG_MAX == 2147483647L
47#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
48#else
49#if LONG_MAX == 9223372036854775807L
50/* Nonzero if X (a long int) contains a NULL byte. */
51#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
52#else
53#error long int is not a 32bit or 64bit type.
54#endif
55#endif
56
57#ifndef DETECTNULL
58#error long int is not a 32bit or 64bit byte
59#endif
60
61char*
62_DEFUN (strcpy, (dst0, src0),
Andree Buschmann0b7dcd62010-02-22 21:24:09 +000063 char *dst0 _AND
64 _CONST char *src0)
Björn Stenbergb69338f2002-05-30 21:03:17 +000065{
66#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
67 char *s = dst0;
68
Jens Arnold3a432312004-07-27 19:51:05 +000069 while ((*dst0++ = *src0++))
Björn Stenbergb69338f2002-05-30 21:03:17 +000070 ;
71
72 return s;
73#else
74 char *dst = dst0;
75 _CONST char *src = src0;
76 long *aligned_dst;
77 _CONST long *aligned_src;
78
79 /* If SRC or DEST is unaligned, then copy bytes. */
80 if (!UNALIGNED (src, dst))
81 {
82 aligned_dst = (long*)dst;
83 aligned_src = (long*)src;
84
85 /* SRC and DEST are both "long int" aligned, try to do "long int"
86 sized copies. */
87 while (!DETECTNULL(*aligned_src))
88 {
89 *aligned_dst++ = *aligned_src++;
90 }
91
92 dst = (char*)aligned_dst;
93 src = (char*)aligned_src;
94 }
95
96 while ((*dst++ = *src++))
97 ;
98 return dst0;
99#endif /* not PREFER_SIZE_OVER_SPEED */
100}