Update #2858. --- cpukit/score/include/rtems/score/objectimpl.h | 21 +++++++ cpukit/score/src/objectgetnameasstring.c | 85 ++++++++++++++++++--------- 2 files changed, 79 insertions(+), 27 deletions(-)
diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h index a00aa22..1ec688a 100644 --- a/cpukit/score/include/rtems/score/objectimpl.h +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -655,6 +655,27 @@ char *_Objects_Get_name_as_string( ); /** + * @brief Converts the specified object name to a text representation. + * + * Non-printable characters according to isprint() are converted to '*'. + * + * @param[in] name The object name. + * @param[in] is_string Indicates if the object name is a string or a four + * character array (32-bit unsigned integer). + * @param[in] buffer The string buffer for the text representation. + * @param[in] buffer_size The buffer size in characters. + * + * @retval The length of the text representation. May be greater than or equal + * to the buffer size if truncation occurred. + */ +size_t _Objects_Name_to_string( + Objects_Name name, + bool is_string, + char *buffer, + size_t buffer_size +); + +/** * @brief Set objects name. * * This method sets the object name to either a copy of a string diff --git a/cpukit/score/src/objectgetnameasstring.c b/cpukit/score/src/objectgetnameasstring.c index ca6e1f4..7a6177a 100644 --- a/cpukit/score/src/objectgetnameasstring.c +++ b/cpukit/score/src/objectgetnameasstring.c @@ -23,6 +23,54 @@ #include <ctype.h> +size_t _Objects_Name_to_string( + Objects_Name name, + bool is_string, + char *buffer, + size_t buffer_size +) +{ + char lname[ 5 ]; + const char *s; + char *d; + size_t i; + +#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) + if ( is_string ) { + s = name.name_p; + } else +#endif + { + lname[ 0 ] = (name.name_u32 >> 24) & 0xff; + lname[ 1 ] = (name.name_u32 >> 16) & 0xff; + lname[ 2 ] = (name.name_u32 >> 8) & 0xff; + lname[ 3 ] = (name.name_u32 >> 0) & 0xff; + lname[ 4 ] = '\0'; + s = lname; + } + + d = buffer; + i = 1; + + if ( s != NULL ) { + while ( *s != '\0' ) { + if ( i < buffer_size ) { + *d = isprint((unsigned char) *s) ? *s : '*'; + ++d; + } + + ++s; + ++i; + } + } + + if ( buffer_size > 0 ) { + *d = '\0'; + } + + return i - 1; +} + /* * This method objects the name of an object and returns its name * in the form of a C string. It attempts to be careful about @@ -36,10 +84,6 @@ char *_Objects_Get_name_as_string( ) { Objects_Information *information; - const char *s; - char *d; - uint32_t i; - char lname[5]; Objects_Control *the_object; ISR_lock_Context lock_context; Objects_Id tmpId; @@ -61,29 +105,16 @@ char *_Objects_Get_name_as_string( return NULL; } - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - if ( information->is_string ) { - s = the_object->name.name_p; - } else - #endif - { - uint32_t u32_name = (uint32_t) the_object->name.name_u32; - - lname[ 0 ] = (u32_name >> 24) & 0xff; - lname[ 1 ] = (u32_name >> 16) & 0xff; - lname[ 2 ] = (u32_name >> 8) & 0xff; - lname[ 3 ] = (u32_name >> 0) & 0xff; - lname[ 4 ] = '\0'; - s = lname; - } - - d = name; - if ( s ) { - for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) { - *d = (isprint((unsigned char)*s)) ? *s : '*'; - } - } - *d = '\0'; + _Objects_Name_to_string( + the_object->name, +#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) + information->is_string, +#else + false, +#endif + name, + length + ); _ISR_lock_ISR_enable( &lock_context ); return name; -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel