mirror of https://github.com/ARMmbed/mbed-os.git
Add mbed_error_puts
This is potentially useful for printing long strings such as filenames from assert messages, avoiding the buffer limit inherent in mbed_error_printf.pull/8441/head
parent
c40d86038c
commit
e20edbdb46
|
@ -56,30 +56,35 @@ void mbed_error_printf(const char *format, ...)
|
|||
|
||||
void mbed_error_vprintf(const char *format, va_list arg)
|
||||
{
|
||||
core_util_critical_section_enter();
|
||||
char buffer[132];
|
||||
int size = vsnprintf(buffer, sizeof buffer, format, arg);
|
||||
if (size >= sizeof buffer) {
|
||||
/* Output was truncated - indicate by overwriting last 4 bytes of buffer
|
||||
* with ellipsis and newline.
|
||||
* (Note that although vsnprintf always leaves a NUL terminator, we
|
||||
* don't need a terminator and can use the entire buffer)
|
||||
/* Output was truncated - indicate by overwriting tail of buffer
|
||||
* with ellipsis, newline and null terminator.
|
||||
*/
|
||||
memcpy(&buffer[sizeof buffer - 4], "...\n", 4);
|
||||
size = sizeof buffer;
|
||||
static const char ellipsis[] = "...\n";
|
||||
memcpy(&buffer[sizeof buffer - sizeof ellipsis], ellipsis, sizeof ellipsis);
|
||||
}
|
||||
if (size > 0) {
|
||||
mbed_error_puts(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void mbed_error_puts(const char *str)
|
||||
{
|
||||
core_util_critical_section_enter();
|
||||
#if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES || MBED_CONF_PLATFORM_STDIO_CONVERT_TTY_NEWLINES
|
||||
char stdio_out_prev = '\0';
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (buffer[i] == '\n' && stdio_out_prev != '\r') {
|
||||
for (; *str != '\0'; str++) {
|
||||
if (*str == '\n' && stdio_out_prev != '\r') {
|
||||
const char cr = '\r';
|
||||
write(STDERR_FILENO, &cr, 1);
|
||||
}
|
||||
write(STDERR_FILENO, &buffer[i], 1);
|
||||
stdio_out_prev = buffer[i];
|
||||
write(STDERR_FILENO, str, 1);
|
||||
stdio_out_prev = *str;
|
||||
}
|
||||
#else
|
||||
write(STDERR_FILENO, buffer, size);
|
||||
write(STDERR_FILENO, str, strlen(str));
|
||||
#endif
|
||||
core_util_critical_section_exit();
|
||||
}
|
||||
|
|
|
@ -127,6 +127,9 @@ void mbed_die(void);
|
|||
* handling a crash.
|
||||
*
|
||||
* @note Synchronization level: Interrupt safe
|
||||
* @note This uses an internal 128-byte buffer to format the string,
|
||||
* so the output may be truncated. If you need to write a potentially
|
||||
* long string, use mbed_error_puts.
|
||||
*
|
||||
* @param format C string that contains data stream to be printed.
|
||||
* Code snippets below show valid format.
|
||||
|
@ -149,6 +152,20 @@ void mbed_error_printf(const char *format, ...);
|
|||
*/
|
||||
void mbed_error_vprintf(const char *format, va_list arg);
|
||||
|
||||
/** Print out an error message. This is typically called when
|
||||
* handling a crash.
|
||||
*
|
||||
* Unlike mbed_error_printf, there is no limit to the maximum output
|
||||
* length. Unlike standard puts, but like standard fputs, this does not
|
||||
* append a '\n' character.
|
||||
*
|
||||
* @note Synchronization level: Interrupt safe
|
||||
*
|
||||
* @param str C string that contains data stream to be printed.
|
||||
*
|
||||
*/
|
||||
void mbed_error_puts(const char *str);
|
||||
|
||||
/** @deprecated Renamed to mbed_error_vprintf to match functionality */
|
||||
MBED_DEPRECATED_SINCE("mbed-os-5.11",
|
||||
"Renamed to mbed_error_vprintf to match functionality.")
|
||||
|
|
Loading…
Reference in New Issue