diff options
| -rw-r--r-- | libc/string/cris/strcpy.c | 51 | ||||
| -rw-r--r-- | libc/string/cris/strncpy.c | 61 | 
2 files changed, 112 insertions, 0 deletions
diff --git a/libc/string/cris/strcpy.c b/libc/string/cris/strcpy.c new file mode 100644 index 000000000..0af25253e --- /dev/null +++ b/libc/string/cris/strcpy.c @@ -0,0 +1,51 @@ +/* + * 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(strcpy) +char *strcpy(char *dest, const char *src) +{ +  char *ret = dest; +  unsigned long himagic = 0x80808080L; +  unsigned long lomagic = 0x01010101L; + +  while ((unsigned long)src & (sizeof src - 1)) +  { +    if (!(*dest++ = *src++)) +    { +      return ret; +    } +  } + +  while (1) +  { +    unsigned long value = *(unsigned long*)src; +    unsigned long magic; + +    src += sizeof (unsigned long); + +    if ((magic = (value - lomagic) & himagic)) +    { +      if (magic & ~value) +      { +        break; +      } +    } + +    *(unsigned long*)dest = value; +    dest += sizeof (unsigned long); +  } + +  src -= sizeof (unsigned long); + +  while ((*dest++ = *src++)) +  { +  } + +  return ret; +} +libc_hidden_def(strcpy) diff --git a/libc/string/cris/strncpy.c b/libc/string/cris/strncpy.c new file mode 100644 index 000000000..93a6608bc --- /dev/null +++ b/libc/string/cris/strncpy.c @@ -0,0 +1,61 @@ +/* + * 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)  | 
