New plugin: frotz, a Z-machine interpreter, for playing interactive fiction.
[kugel-rb.git] / firmware / common / strcpy.c
blob0580d88cb8c7dd250365be69084b6d60d4b90a49
1 /*
2 FUNCTION
3 <<strcpy>>---copy string
5 INDEX
6 strcpy
8 ANSI_SYNOPSIS
9 #include <string.h>
10 char *strcpy(char *<[dst]>, const char *<[src]>);
12 TRAD_SYNOPSIS
13 #include <string.h>
14 char *strcpy(<[dst]>, <[src]>)
15 char *<[dst]>;
16 char *<[src]>;
18 DESCRIPTION
19 <<strcpy>> copies the string pointed to by <[src]>
20 (including the terminating null character) to the array
21 pointed to by <[dst]>.
23 RETURNS
24 This function returns the initial value of <[dst]>.
26 PORTABILITY
27 <<strcpy>> is ANSI C.
29 <<strcpy>> requires no supporting OS subroutines.
31 QUICKREF
32 strcpy ansi pure
35 #include <string.h>
36 #include <limits.h>
38 /*SUPPRESS 560*/
39 /*SUPPRESS 530*/
41 /* Nonzero if either X or Y is not aligned on a "long" boundary. */
42 #define UNALIGNED(X, Y) \
43 (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1)))
45 #if LONG_MAX == 2147483647L
46 #define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
47 #else
48 #if LONG_MAX == 9223372036854775807L
49 /* Nonzero if X (a long int) contains a NULL byte. */
50 #define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
51 #else
52 #error long int is not a 32bit or 64bit type.
53 #endif
54 #endif
56 #ifndef DETECTNULL
57 #error long int is not a 32bit or 64bit byte
58 #endif
60 char*
61 _DEFUN (strcpy, (dst0, src0),
62 char *dst0 _AND
63 _CONST char *src0)
65 #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
66 char *s = dst0;
68 while ((*dst0++ = *src0++))
71 return s;
72 #else
73 char *dst = dst0;
74 _CONST char *src = src0;
75 long *aligned_dst;
76 _CONST long *aligned_src;
78 /* If SRC or DEST is unaligned, then copy bytes. */
79 if (!UNALIGNED (src, dst))
81 aligned_dst = (long*)dst;
82 aligned_src = (long*)src;
84 /* SRC and DEST are both "long int" aligned, try to do "long int"
85 sized copies. */
86 while (!DETECTNULL(*aligned_src))
88 *aligned_dst++ = *aligned_src++;
91 dst = (char*)aligned_dst;
92 src = (char*)aligned_src;
95 while ((*dst++ = *src++))
97 return dst0;
98 #endif /* not PREFER_SIZE_OVER_SPEED */