OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib-1.10.0/] [newlib/] [libc/] [string/] [strncat.c] - Diff between revs 1010 and 1765

Only display areas with differences | Details | Blame | View Log

Rev 1010 Rev 1765
/*
/*
FUNCTION
FUNCTION
        <<strncat>>---concatenate strings
        <<strncat>>---concatenate strings
 
 
INDEX
INDEX
        strncat
        strncat
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <string.h>
        #include <string.h>
        char *strncat(char *<[dst]>, const char *<[src]>, size_t <[length]>);
        char *strncat(char *<[dst]>, const char *<[src]>, size_t <[length]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <string.h>
        #include <string.h>
        char *strncat(<[dst]>, <[src]>, <[length]>)
        char *strncat(<[dst]>, <[src]>, <[length]>)
        char *<[dst]>;
        char *<[dst]>;
        char *<[src]>;
        char *<[src]>;
        size_t <[length]>;
        size_t <[length]>;
 
 
DESCRIPTION
DESCRIPTION
        <<strncat>> appends not more than <[length]> characters from
        <<strncat>> appends not more than <[length]> characters from
        the string pointed to by <[src]> (including the terminating
        the string pointed to by <[src]> (including the terminating
        null character) to the end of the string pointed to by
        null character) to the end of the string pointed to by
        <[dst]>.  The initial character of <[src]> overwrites the null
        <[dst]>.  The initial character of <[src]> overwrites the null
        character at the end of <[dst]>.  A terminating null character
        character at the end of <[dst]>.  A terminating null character
        is always appended to the result
        is always appended to the result
 
 
WARNINGS
WARNINGS
        Note that a null is always appended, so that if the copy is
        Note that a null is always appended, so that if the copy is
        limited by the <[length]> argument, the number of characters
        limited by the <[length]> argument, the number of characters
        appended to <[dst]> is <<n + 1>>.
        appended to <[dst]> is <<n + 1>>.
 
 
 
 
RETURNS
RETURNS
        This function returns the initial value of <[dst]>
        This function returns the initial value of <[dst]>
 
 
PORTABILITY
PORTABILITY
<<strncat>> is ANSI C.
<<strncat>> is ANSI C.
 
 
<<strncat>> requires no supporting OS subroutines.
<<strncat>> requires no supporting OS subroutines.
 
 
QUICKREF
QUICKREF
        strncat ansi pure
        strncat ansi pure
*/
*/
 
 
#include <string.h>
#include <string.h>
#include <limits.h>
#include <limits.h>
 
 
/* Nonzero if X is aligned on a "long" boundary.  */
/* Nonzero if X is aligned on a "long" boundary.  */
#define ALIGNED(X) \
#define ALIGNED(X) \
  (((long)X & (sizeof (long) - 1)) == 0)
  (((long)X & (sizeof (long) - 1)) == 0)
 
 
#if LONG_MAX == 2147483647L
#if LONG_MAX == 2147483647L
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
#else
#else
#if LONG_MAX == 9223372036854775807L
#if LONG_MAX == 9223372036854775807L
/* Nonzero if X (a long int) contains a NULL byte. */
/* Nonzero if X (a long int) contains a NULL byte. */
#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
#else
#else
#error long int is not a 32bit or 64bit type.
#error long int is not a 32bit or 64bit type.
#endif
#endif
#endif
#endif
 
 
#ifndef DETECTNULL
#ifndef DETECTNULL
#error long int is not a 32bit or 64bit byte
#error long int is not a 32bit or 64bit byte
#endif
#endif
 
 
char *
char *
_DEFUN (strncat, (s1, s2, n),
_DEFUN (strncat, (s1, s2, n),
        char *s1 _AND
        char *s1 _AND
        _CONST char *s2 _AND
        _CONST char *s2 _AND
        size_t n)
        size_t n)
{
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
  char *s = s1;
  char *s = s1;
 
 
  while (*s1)
  while (*s1)
    s1++;
    s1++;
  while (n-- != 0 && (*s1++ = *s2++))
  while (n-- != 0 && (*s1++ = *s2++))
    {
    {
      if (n == 0)
      if (n == 0)
        *s1 = '\0';
        *s1 = '\0';
    }
    }
 
 
  return s;
  return s;
#else
#else
  char *s = s1;
  char *s = s1;
 
 
  /* Skip over the data in s1 as quickly as possible.  */
  /* Skip over the data in s1 as quickly as possible.  */
  if (ALIGNED (s1))
  if (ALIGNED (s1))
    {
    {
      unsigned long *aligned_s1 = (unsigned long *)s1;
      unsigned long *aligned_s1 = (unsigned long *)s1;
      while (!DETECTNULL (*aligned_s1))
      while (!DETECTNULL (*aligned_s1))
        aligned_s1++;
        aligned_s1++;
 
 
      s1 = (char *)aligned_s1;
      s1 = (char *)aligned_s1;
    }
    }
 
 
  while (*s1)
  while (*s1)
    s1++;
    s1++;
 
 
  /* s1 now points to the its trailing null character, now copy
  /* s1 now points to the its trailing null character, now copy
     up to N bytes from S2 into S1 stopping if a NULL is encountered
     up to N bytes from S2 into S1 stopping if a NULL is encountered
     in S2.
     in S2.
 
 
     It is not safe to use strncpy here since it copies EXACTLY N
     It is not safe to use strncpy here since it copies EXACTLY N
     characters, NULL padding if necessary.  */
     characters, NULL padding if necessary.  */
  while (n-- != 0 && (*s1++ = *s2++))
  while (n-- != 0 && (*s1++ = *s2++))
    {
    {
      if (n == 0)
      if (n == 0)
        *s1 = '\0';
        *s1 = '\0';
    }
    }
 
 
  return s;
  return s;
#endif /* not PREFER_SIZE_OVER_SPEED */
#endif /* not PREFER_SIZE_OVER_SPEED */
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.