12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /*
- * Copyright (C) 2006-2007 Axis Communications AB
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
- #include <string.h>
- libc_hidden_proto(memset)
- libc_hidden_proto(strncpy)
- char *strncpy(char *dest, const char *src, size_t count)
- {
- char *ret = dest;
- unsigned long himagic = 0x80808080L;
- unsigned long lomagic = 0x01010101L;
- while (count && (unsigned long)src & (sizeof src - 1))
- {
- count--;
- if (!(*dest++ = *src++))
- {
- goto finalize;
- }
- }
- while (count >= sizeof (unsigned long))
- {
- unsigned long value = *(unsigned long*)src;
- unsigned long magic;
- if ((magic = (value - lomagic) & himagic))
- {
- if (magic & ~value)
- {
- break;
- }
- }
- *(unsigned long*)dest = value;
- dest += sizeof (unsigned long);
- src += sizeof (unsigned long);
- count -= sizeof (unsigned long);
- }
- while (count)
- {
- count--;
- if (!(*dest++ = *src++))
- break;
- }
- finalize:
- if (count)
- {
- memset(dest, '\0', count);
- }
- return ret;
- }
- libc_hidden_def(strncpy)
|