/* SPDX-License-Identifier: BSD-2-Clause */
/*
* COPYRIGHT (c) 1989-2012.
* On-Line Applications Research Corporation (OAR).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if defined(STRING_TO_POINTER)
#define GOOD_VALUE 0x123
#define GOOD_VALUE_STRING "0x123"
#define BAD_VALUE_STRING "xxx"
#elif defined(STRING_TO_INTEGER)
#define GOOD_VALUE 123
#define GOOD_VALUE_STRING "123"
#define BAD_VALUE_STRING "YYY"
#elif defined(STRING_TO_FLOAT)
#define GOOD_VALUE 1.23
#define GOOD_VALUE_STRING "1.23"
#define BAD_VALUE_STRING "zzz"
#else
#error "what type are we testing?"
#endif
/* forward declarations to avoid warnings */
void TEST_STRING_TO_NAME(void);
void TEST_STRING_TO_NAME(void)
{
TEST_STRING_TO_TYPE value;
rtems_status_code status;
char *endptr;
puts( "\nTesting " STRING_TO_NAME_METHOD_STRING );
/* Null pointer for return value */
puts(
STRING_TO_NAME_METHOD_STRING
" - NULL return value - RTEMS_INVALID_ADDRESS"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, NULL, &endptr,
get_base_10_or_16( GOOD_VALUE_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, NULL, &endptr );
#endif
rtems_test_assert( status == RTEMS_INVALID_ADDRESS );
/* Basic conversion works for return value, return end pointer */
puts(
STRING_TO_NAME_METHOD_STRING " - " GOOD_VALUE_STRING
" NULL endptr return value - RTEMS_SUCCESSFUL"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, &value, NULL,
get_base_10_or_16( GOOD_VALUE_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, &value, NULL );
#endif
rtems_test_assert( status == RTEMS_SUCCESSFUL );
rtems_test_assert( value == (TEST_STRING_TO_TYPE)GOOD_VALUE );
#if defined(STRING_TO_MAX)
/* Basic conversion works for return value */
endptr = NULL;
puts(
STRING_TO_NAME_METHOD_STRING " - MAXIMUM VALUE"
" w/endptr return value - RTEMS_SUCCESSFUL"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( STRING_TO_MAX_STRING, &value, &endptr,
get_base_10_or_16( STRING_TO_MAX_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( STRING_TO_MAX_STRING, &value, &endptr );
#endif
rtems_test_assert( status == RTEMS_SUCCESSFUL );
rtems_test_assert( endptr );
rtems_test_assert( value == (TEST_STRING_TO_TYPE)STRING_TO_MAX );
#endif
/* Basic conversion works for return value */
endptr = NULL;
puts(
STRING_TO_NAME_METHOD_STRING " - " GOOD_VALUE_STRING
" w/endptr return value - RTEMS_SUCCESSFUL"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, &value, &endptr,
get_base_10_or_16( GOOD_VALUE_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( GOOD_VALUE_STRING, &value, &endptr );
#endif
rtems_test_assert( status == RTEMS_SUCCESSFUL );
rtems_test_assert( endptr );
rtems_test_assert( value == (TEST_STRING_TO_TYPE)GOOD_VALUE );
/* Bad conversion works for return value */
endptr = NULL;
puts(
STRING_TO_NAME_METHOD_STRING " - " BAD_VALUE_STRING
" w/endptr return value - RTEMS_NOT_DEFINED"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( BAD_VALUE_STRING, &value, &endptr,
get_base_10_or_16( BAD_VALUE_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( BAD_VALUE_STRING, &value, &endptr );
#endif
rtems_test_assert( status == RTEMS_NOT_DEFINED );
rtems_test_assert( endptr );
/* Conversion of empty string */
endptr = NULL;
value = 0;
puts(
STRING_TO_NAME_METHOD_STRING
" - empty string - w/endptr return value - RTEMS_NOT_DEFINED"
);
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( "", &value, &endptr,
get_base_10_or_16( "" ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( "", &value, &endptr );
#endif
rtems_test_assert( status == RTEMS_NOT_DEFINED );
rtems_test_assert( endptr );
rtems_test_assert( value == (TEST_STRING_TO_TYPE)0 );
/* Conversion of number that is too large */
#if defined(TEST_TOO_LARGE_STRING)
endptr = NULL;
value = 0;
puts(
STRING_TO_NAME_METHOD_STRING " - overflow - RTEMS_INVALID_NUMBER" );
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( TEST_TOO_LARGE_STRING, &value, &endptr,
get_base_10_or_16( TEST_TOO_LARGE_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( TEST_TOO_LARGE_STRING, &value, &endptr );
#endif
if ( status != RTEMS_INVALID_NUMBER )
printf( "ERROR = %s\n", rtems_status_text(status) );
rtems_test_assert( status == RTEMS_INVALID_NUMBER );
rtems_test_assert( endptr );
#endif
/* Conversion of number that is too large for unsigned char */
#if defined(TEST_TOO_LARGE_FOR_UCHAR)
endptr = NULL;
value = 0;
puts(
STRING_TO_NAME_METHOD_STRING " - overflow - RTEMS_INVALID_NUMBER" );
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( TEST_TOO_LARGE_FOR_UCHAR, &value,
&endptr, get_base_10_or_16( TEST_TOO_LARGE_FOR_UCHAR ) );
#endif
if ( status != RTEMS_INVALID_NUMBER )
printf( "ERROR = %s\n", rtems_status_text(status) );
rtems_test_assert( status == RTEMS_INVALID_NUMBER );
rtems_test_assert( endptr );
#endif
/* Conversion of number that is too small */
#if defined(TEST_TOO_SMALL_STRING)
endptr = NULL;
value = 0;
puts( STRING_TO_NAME_METHOD_STRING "- RTEMS_INVALID_NUMBER" );
#if defined(STRING_TO_INTEGER)
status = STRING_TO_NAME_METHOD( TEST_TOO_SMALL_STRING, &value, &endptr,
get_base_10_or_16( TEST_TOO_SMALL_STRING ) );
#elif defined(STRING_TO_POINTER) || defined(STRING_TO_FLOAT)
status = STRING_TO_NAME_METHOD( TEST_TOO_SMALL_STRING, &value, &endptr );
#endif
rtems_test_assert( status == RTEMS_INVALID_NUMBER );
rtems_test_assert( endptr );
#endif
}
/* Now undefined everything that instantiates this */
#undef TEST_STRING_TO_TYPE
#undef TEST_STRING_TO_NAME
#undef STRING_TO_NAME_METHOD
#undef STRING_TO_NAME_METHOD_STRING
#undef STRING_TO_INTEGER
#undef STRING_TO_POINTER
#undef STRING_TO_FLOAT
#undef STRING_TO_MAX
#undef STRING_TO_MAX_STRING
#undef GOOD_VALUE
#undef GOOD_VALUE_STRING
#undef BAD_VALUE_STRING
#undef TEST_TOO_LARGE_STRING
#undef TEST_TOO_SMALL_STRING
#undef TEST_TOO_LARGE_FOR_UCHAR