2007-03-14 20:24:57 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS system libraries
|
2015-09-19 13:50:57 +00:00
|
|
|
* FILE: lib/sdk/crt/mbstring/mbsncat.c
|
2007-03-14 20:24:57 +00:00
|
|
|
* PURPOSE: Concatenate two multi byte string to maximum of n characters or bytes
|
|
|
|
* PROGRAMER: Ariadne
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* 12/04/99: Created
|
|
|
|
*/
|
|
|
|
|
2008-06-06 17:49:24 +00:00
|
|
|
#include <precomp.h>
|
2007-03-14 20:24:57 +00:00
|
|
|
#include <mbstring.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
size_t _mbclen2(const unsigned int s);
|
2008-06-06 17:49:24 +00:00
|
|
|
unsigned char *_mbset (unsigned char *string, int c);
|
2007-03-14 20:24:57 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-06-06 17:49:24 +00:00
|
|
|
unsigned char *_mbsncat (unsigned char *dst, const unsigned char *src, size_t n)
|
2007-03-14 20:24:57 +00:00
|
|
|
{
|
2008-06-06 17:49:24 +00:00
|
|
|
int c;
|
|
|
|
unsigned char *save = dst;
|
2007-03-14 20:24:57 +00:00
|
|
|
|
2008-06-06 17:49:24 +00:00
|
|
|
while ((c = _mbsnextc (dst)))
|
|
|
|
dst = _mbsinc (dst);
|
|
|
|
|
|
|
|
while (n-- > 0 && (c = _mbsnextc (src))) {
|
|
|
|
|
|
|
|
_mbset (dst, c);
|
|
|
|
|
|
|
|
dst = _mbsinc (dst);
|
|
|
|
|
|
|
|
src = _mbsinc ((unsigned char *) src);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
*dst = '\0';
|
|
|
|
|
|
|
|
return save;
|
2007-03-14 20:24:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
unsigned char * _mbsnbcat(unsigned char *dst, const unsigned char *src, size_t n)
|
|
|
|
{
|
|
|
|
unsigned char *d;
|
|
|
|
const unsigned char *s = src;
|
|
|
|
if (n != 0) {
|
|
|
|
d = dst + _mbslen(dst); // get the end of string
|
|
|
|
d += _mbclen2(*d); // move 1 or 2 up
|
|
|
|
|
|
|
|
do {
|
|
|
|
if ((*d++ = *s++) == 0)
|
|
|
|
{
|
|
|
|
while (--n != 0)
|
|
|
|
*d++ = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if ( !(n==1 && _ismbblead(*s)) )
|
|
|
|
n--;
|
|
|
|
} while (n > 0);
|
|
|
|
}
|
|
|
|
return dst;
|
|
|
|
}
|