2009-05-21 19:01:41 +00:00
|
|
|
#include "rocklibc.h"
|
|
|
|
|
|
|
|
/* gcc is broken and has a non-SUSv2 compliant internal prototype.
|
|
|
|
* This causes it to warn about a type mismatch here. Ignore it. */
|
|
|
|
char *strncat(char *s, const char *t, size_t n) {
|
|
|
|
char *dest=s;
|
|
|
|
register char *max;
|
|
|
|
s+=strlen(s);
|
|
|
|
if (__unlikely((max=s+n)==s)) goto fini;
|
|
|
|
for (;;) {
|
2016-08-12 13:33:28 +00:00
|
|
|
if (__unlikely(!(*s = *t)))
|
|
|
|
break;
|
|
|
|
if (__unlikely(++s==max))
|
|
|
|
break;
|
|
|
|
++t;
|
2009-05-21 19:01:41 +00:00
|
|
|
#ifndef WANT_SMALL_STRING_ROUTINES
|
2016-08-12 13:33:28 +00:00
|
|
|
if (__unlikely(!(*s = *t)))
|
|
|
|
break;
|
|
|
|
if (__unlikely(++s==max))
|
|
|
|
break;
|
|
|
|
++t;
|
|
|
|
if (__unlikely(!(*s = *t)))
|
|
|
|
break;
|
|
|
|
if (__unlikely(++s==max))
|
|
|
|
break;
|
|
|
|
++t;
|
|
|
|
if (__unlikely(!(*s = *t)))
|
|
|
|
break;
|
|
|
|
if (__unlikely(++s==max))
|
|
|
|
break;
|
|
|
|
++t;
|
2009-05-21 19:01:41 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
*s=0;
|
|
|
|
fini:
|
|
|
|
return dest;
|
|
|
|
}
|