log: Handle line continuation

When multiple log() calls are used which don't end in newline, the
log prefix is prepended multiple times in the same line. This makes the
output look strange.

Fix this by detecting when the previous log record did not end in newline.
In that case, setting a flag.

Drop the unused BUFFSIZE in the test while we are here.

As an example implementation, update log_console to check the flag and
produce the expected output.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2021-01-20 20:10:53 -07:00
committed by Tom Rini
parent 79d5983b61
commit 9ad7a6c25c
6 changed files with 60 additions and 16 deletions

View File

@@ -15,6 +15,7 @@ DECLARE_GLOBAL_DATA_PTR;
static int log_console_emit(struct log_device *ldev, struct log_rec *rec)
{
int fmt = gd->log_fmt;
bool add_space = false;
/*
* The output format is designed to give someone a fighting chance of
@@ -26,18 +27,21 @@ static int log_console_emit(struct log_device *ldev, struct log_rec *rec)
* - function is an identifier and ends with ()
* - message has a space before it unless it is on its own
*/
if (fmt & BIT(LOGF_LEVEL))
printf("%s.", log_get_level_name(rec->level));
if (fmt & BIT(LOGF_CAT))
printf("%s,", log_get_cat_name(rec->cat));
if (fmt & BIT(LOGF_FILE))
printf("%s:", rec->file);
if (fmt & BIT(LOGF_LINE))
printf("%d-", rec->line);
if (fmt & BIT(LOGF_FUNC))
printf("%s()", rec->func);
if (!(rec->flags & LOGRECF_CONT) && fmt != BIT(LOGF_MSG)) {
add_space = true;
if (fmt & BIT(LOGF_LEVEL))
printf("%s.", log_get_level_name(rec->level));
if (fmt & BIT(LOGF_CAT))
printf("%s,", log_get_cat_name(rec->cat));
if (fmt & BIT(LOGF_FILE))
printf("%s:", rec->file);
if (fmt & BIT(LOGF_LINE))
printf("%d-", rec->line);
if (fmt & BIT(LOGF_FUNC))
printf("%s()", rec->func);
}
if (fmt & BIT(LOGF_MSG))
printf("%s%s", fmt != BIT(LOGF_MSG) ? " " : "", rec->msg);
printf("%s%s", add_space ? " " : "", rec->msg);
return 0;
}