X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2Fstring%2Fstrncpy.c;h=da1397a93caaf2a7a1b6b3ebf5499f941f1f8236;hb=d865c4403fc91d1f1ac95ba76febcee9f429bb97;hp=31602ec8a9fef4709ce87b2904c821fb6256d2f4;hpb=1a0d9f7faca36f149db3b85c09a72528e0c73a83;p=pdclib diff --git a/functions/string/strncpy.c b/functions/string/strncpy.c index 31602ec..da1397a 100644 --- a/functions/string/strncpy.c +++ b/functions/string/strncpy.c @@ -1,40 +1,41 @@ -/* $Id$ */ - -/* Release $Name$ */ - /* strncpy( char *, const char *, size_t ) This file is part of the Public Domain C Library (PDCLib). Permission is granted to use, modify, and / or redistribute at will. */ -#include <_PDCLIB_aux.h> #include +#ifndef REGTEST + char * strncpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) { char * rc = s1; while ( ( n > 0 ) && ( *s1++ = *s2++ ) ) { /* Cannot do "n--" in the conditional as size_t is unsigned and we have - to check it again for >0 in the next loop. + to check it again for >0 in the next loop below, so we must not risk + underflow. */ --n; } - while ( --n ) + /* Checking against 1 as we missed the last --n in the loop above. */ + while ( n-- > 1 ) { *s1++ = '\0'; } return rc; } +#endif + #ifdef TEST -#include <_PDCLIB_test.h> -int main() +#include "_PDCLIB_test.h" + +int main( void ) { char s[] = "xxxxxxx"; - BEGIN_TESTS; TESTCASE( strncpy( s, "", 1 ) == s ); TESTCASE( s[0] == '\0' ); TESTCASE( s[1] == 'x' ); @@ -45,6 +46,11 @@ int main() TESTCASE( s[6] == 'x' ); TESTCASE( strncpy( s, abcde, 7 ) == s ); TESTCASE( s[6] == '\0' ); + TESTCASE( strncpy( s, "xxxx", 3 ) == s ); + TESTCASE( s[0] == 'x' ); + TESTCASE( s[2] == 'x' ); + TESTCASE( s[3] == 'd' ); return TEST_RESULTS; } + #endif