X-Git-Url: https://pd.if.org/git/?p=pdclib.old;a=blobdiff_plain;f=functions%2Fstring%2Fstrlcat.c;fp=functions%2Fstring%2Fstrlcat.c;h=34a47d4cdbf7906fb28bafb6d7e0a5142e374bab;hp=0000000000000000000000000000000000000000;hb=1088cf7324e77983cbfbd8cab9783408d547882a;hpb=cd6cfe0f578c4f744ddc9a342243aff6b42f8027 diff --git a/functions/string/strlcat.c b/functions/string/strlcat.c new file mode 100644 index 0000000..34a47d4 --- /dev/null +++ b/functions/string/strlcat.c @@ -0,0 +1,60 @@ +/* strlcat( + char *_PDCLIB_restrict _Dst, + const char *_PDCLIB_restict _Src, + size_t _DstSize) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +#pragma weak strlcat = _PDCLIB_strlcat +size_t _PDCLIB_strlcat( + char *restrict dst, + const char *restrict src, + size_t dstsize); + +size_t _PDCLIB_strlcat( + char *restrict dst, + const char *restrict src, + size_t dstsize) +{ + size_t needed = 0; + size_t j = 0; + + while(dst[needed]) needed++; + + while(needed < dstsize && (dst[needed] = src[j])) + needed++, j++; + + while(src[j++]) needed++; + needed++; + + if (needed > dstsize && dstsize) + dst[dstsize - 1] = 0; + + return needed; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char dstbuf[16]; + + strcpy(dstbuf, "hi"); + TESTCASE_NOREG( strlcat(dstbuf, "", 16) == 3 ); + TESTCASE_NOREG( strlcat(dstbuf, "hi", 16) == 5 ); + TESTCASE_NOREG( strlcat(dstbuf, "hello, world", 16) == 17 ); + TESTCASE_NOREG( strlcat(dstbuf, "hi", 16) == 18 ); + TESTCASE_NOREG( strcmp(dstbuf, "hihihello, worl") == 0); + return TEST_RESULTS; +} + +#endif