kmp_msg_t __kmp_msg_format( unsigned id_arg, ... ) { kmp_msg_t msg; va_list args; kmp_str_buf_t buffer; __kmp_str_buf_init( & buffer ); va_start( args, id_arg ); // We use unsigned for the ID argument and explicitly cast it here to the // right enumerator because variadic functions are not compatible with // default promotions. kmp_i18n_id_t id = (kmp_i18n_id_t)id_arg; #if KMP_OS_UNIX // On Linux* OS and OS X*, printf() family functions process parameter numbers, for example: // "%2$s %1$s". __kmp_str_buf_vprint( & buffer, __kmp_i18n_catgets( id ), args ); #elif KMP_OS_WINDOWS // On Winodws, printf() family functions does not recognize GNU style parameter numbers, // so we have to use FormatMessage() instead. It recognizes parameter numbers, e. g.: // "%2!s! "%1!s!". { LPTSTR str = NULL; int len; FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, __kmp_i18n_catgets( id ), 0, 0, (LPTSTR)( & str ), 0, & args ); len = ___strip_crs( str ); __kmp_str_buf_cat( & buffer, str, len ); LocalFree( str ); } #else #error #endif va_end( args ); __kmp_str_buf_detach( & buffer ); msg.type = (kmp_msg_type_t)( id >> 16 ); msg.num = id & 0xFFFF; msg.str = buffer.str; msg.len = buffer.used; return msg; } // __kmp_msg_format
void __kmp_str_buf_print( kmp_str_buf_t * buffer, char const * format, ... ) { va_list args; va_start( args, format ); __kmp_str_buf_vprint( buffer, format, args ); va_end( args ); } // __kmp_str_buf_print