看libc里面实现的strcpy
说明一下,这个libc代码的来源貌似比较复杂,有来自BSD的,有来自GNU,还有一些其他的
#define UNALIGNED(x,y) (((unsigned long)x & (sizeof (unsigned long)-1)) ^ ((unsigned long)y & (sizeof (unsigned long)-1)))
#define STRALIGN(x) (((unsigned long)x&3)?4-((unsigned long)x&3):0)
# define MKW(x) (x|x<<8|x<<16|x<<24)
# define GFC(x) ((x)&0xff)
# define INCSTR(x) do { x >>= 8; } while (0);
char *
strcpy (char *s1, const char *s2)
{
char *res = s1;
#ifdef WANT_SMALL_STRING_ROUTINES
while ((*s1++ = *s2++));
return (res);
#else
int tmp;
unsigned long l;
if (UNALIGNED(s1, s2)) {
while ((*s1++ = *s2++));
return (res);
}
if ((tmp = STRALIGN(s1))) {
while (tmp-- && (*s1++ = *s2++));
if (tmp != -1) return (res);
}
while (1) {
l = *(const unsigned long *) s2;
if (((l - MKW(0