safwstr.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 446 行 · 第 1/2 页
C
446 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: Non-exhaustive test of the C library safe wide string functions.
*
*******************************************************************************/
#define __STDC_WANT_LIB_EXT1__ 1 // Enable Safer C interfaces
#include <wchar.h>
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#ifdef __SW_BW
#include <wdefwin.h>
#endif
#define VERIFY( exp ) if( !(exp) ) { \
printf( "%s: ***FAILURE*** at line %d of %s.\n",\
ProgramName, __LINE__, \
strlwr(__FILE__) ); \
NumErrors++; \
exit( -1 ); \
}
#define ARRAYCOUNT( array ) ( sizeof( array ) / sizeof( array[ 0 ] ) )
char ProgramName[128]; /* executable filename */
int NumErrors = 0; /* number of errors */
int NumViolations = 0; /* runtime-constraint violation counter */
/* Runtime-constraint handler for tests; doesn't abort program. */
void my_constraint_handler( const char *msg, void *ptr, errno_t error )
{
fprintf( stderr, "Runtime-constraint in %s", msg );
++NumViolations;
}
/* Test wmemcpy_s(), wmemmove_s() */
/* Test wcscpy_s(), wcscat_s(), wcsnlen_s(), wcsncpy_s(), wcsncat_s() */
/* Test wcstok_s() */
void TestMove_s( void )
{
wchar_t buf[128];
wchar_t s2[] = L"VALUE";
wchar_t str[] = L"VALUE";
wchar_t src1[100] = L"hello";
wchar_t src2[7] = L"goodbye";
wchar_t dst1[6], dst2[5], dst3[5];
wchar_t sc1[100] = L"good";
wchar_t sc2[6] = L"hello";
wchar_t sc3[6] = L"hello";
wchar_t sc4[7] = L"abc";
wchar_t sc5[1000] = L"bye";
int violations = NumViolations;
/* wcstok_s */
static wchar_t str1[] = L"?a???b,,,#c";
static wchar_t str2[] = L"\t \t";
static wchar_t str3[] = L"?a???b,,,#c";
wchar_t *t, *ptr1, *ptr2, *ptr3;
rsize_t max1 = ARRAYCOUNT( str1 );
rsize_t max2 = ARRAYCOUNT( str2 );
rsize_t max3 = ARRAYCOUNT( str3 );
/***********************************************************************/
/* set constraint-handler */
/***********************************************************************/
set_constraint_handler_s( my_constraint_handler );
/***********************************************************************/
/* memcpy_s */
/***********************************************************************/
// printf( "Test memcpys (%s).\n", ProgramName );
/* Test the "good" case */
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), s2, 0 ) == 0 );
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), s2, 1 + wcslen( s2 ) ) == 0 );
VERIFY( wmemcpy_s( buf, wcslen( s2 ) + 2, s2, 1 + wcslen( s2 ) ) == 0 );
VERIFY( wcslen( buf ) == wcslen( L"VALUE" ) );
VERIFY( wcscmp( buf, L"VALUE" ) == 0 );
VERIFY( NumViolations == violations );
/* Test various failing cases */
/* Test runtime-constraint violations */
VERIFY( wmemcpy_s( buf, 3, s2, wcslen( s2 ) ) != 0 );
VERIFY( buf[0] == L'\0' );
VERIFY( NumViolations == ++violations );
VERIFY( wmemcpy_s( NULL, ARRAYCOUNT( buf ), s2, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), NULL, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), s2, sizeof( buf ) / sizeof( buf[0] )+ 1 ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), buf + 1, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
#if RSIZE_MAX != SIZE_MAX
VERIFY( wmemcpy_s( buf, ARRAYCOUNT( buf ), s2, ~0 ) != 0 );
VERIFY( NumViolations == ++violations );
#endif
/***********************************************************************/
/* memmove_s */
/***********************************************************************/
// printf( "Test memmove (%s).\n", ProgramName );
/* Test the "good" cases */
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), s2, 0 ) == 0 );
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), s2, 1 + wcslen( s2 ) ) == 0 );
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), buf + 1, 1 + wcslen( s2 ) ) == 0 );
VERIFY( wmemmove_s( buf, 1 + wcslen( s2 ), s2, 1 + wcslen( s2 ) ) == 0 );
VERIFY( wcslen( buf ) == wcslen( L"VALUE" ) );
VERIFY( wcscmp( buf, L"VALUE" ) == 0 );
VERIFY( NumViolations == violations );
/* Test various failing cases */
/* Test runtime-constraint violations */
VERIFY( wmemmove_s( buf, 3, s2, wcslen( s2 ) ) != 0 );
VERIFY( buf[0] == L'\0' );
VERIFY( NumViolations == ++violations );
VERIFY( wmemmove_s( NULL, ARRAYCOUNT( buf ), s2, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), NULL, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), s2, ARRAYCOUNT( buf ) + 1 ) != 0 );
VERIFY( NumViolations == ++violations );
#if RSIZE_MAX != SIZE_MAX
VERIFY( wmemmove_s( buf, ~0, s2, wcslen( s2 ) ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wmemmove_s( buf, ARRAYCOUNT( buf ), s2, ~0 ) != 0 );
VERIFY( NumViolations == ++violations );
#endif
/***********************************************************************/
/* wcscpy_s */
/***********************************************************************/
// printf( "Test memcpy (%s).\n", ProgramName );
/* Test the "good" cases */
VERIFY( wcscpy_s( buf, ARRAYCOUNT( buf ), s2 ) == 0 );
VERIFY( wcscpy_s( buf, ARRAYCOUNT( buf ), s2 ) == 0 );
VERIFY( wcscpy_s( buf, wcslen( s2 ) + 1, s2 ) == 0 );
VERIFY( wcslen( buf ) == wcslen( L"VALUE" ) );
VERIFY( wcscmp( buf, L"VALUE" ) == 0 );
VERIFY( NumViolations == violations );
/* Test various failing cases */
/* Test runtime-constraint violations */
VERIFY( wcscpy_s( buf, 3, s2 ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( buf[0] == L'\0' );
VERIFY( wcscpy_s( NULL, ARRAYCOUNT( buf ), s2 ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wcscpy_s( buf, ARRAYCOUNT( buf ), NULL ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wcscpy_s( buf, 5, s2 ) != 0 );
VERIFY( NumViolations == ++violations );
VERIFY( wcscpy_s( buf, ARRAYCOUNT( buf ), buf + 1 ) != 0 );
VERIFY( NumViolations == ++violations );
#if RSIZE_MAX != SIZE_MAX
VERIFY( wcscpy_s( buf, ~0, s2 ) != 0 );
VERIFY( NumViolations == ++violations );
#endif
/***********************************************************************/
/* wcscat_s */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?