listing.c: handle multiple error messages on a single line

We may produce an arbitrary number of error messages on a single line;
include all of them in the list file.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin (Intel) 2018-12-12 16:47:04 -08:00
parent bdf017c89c
commit 46016cb368

View File

@ -48,7 +48,7 @@
#include "error.h"
#include "listing.h"
#define LIST_MAX_LEN 216 /* something sensible */
#define LIST_MAX_LEN 256 /* something sensible */
#define LIST_INDENT 40
#define LIST_HEXBIT 18
@ -67,7 +67,11 @@ static char xdigit[] = "0123456789ABCDEF";
static char listline[LIST_MAX_LEN];
static bool listlinep;
static char listerror[LIST_MAX_LEN];
struct list_error {
struct list_error *next;
char str[1];
};
struct list_error *listerr_head, **listerr_tail;
static char listdata[2 * LIST_INDENT]; /* we need less than that actually */
static int32_t listoffset;
@ -85,32 +89,32 @@ static FILE *listfp;
static void list_emit(void)
{
int i;
struct list_error *le, *tmp;
if (!listlinep && !listdata[0])
return;
if (listlinep || *listdata) {
fprintf(listfp, "%6"PRId32" ", listlineno);
fprintf(listfp, "%6"PRId32" ", listlineno);
if (listdata[0])
fprintf(listfp, "%08"PRIX32" %-*s", listoffset, LIST_HEXBIT + 1,
listdata);
else
fprintf(listfp, "%*s", LIST_HEXBIT + 10, "");
if (listdata[0])
fprintf(listfp, "%08"PRIX32" %-*s", listoffset, LIST_HEXBIT + 1,
listdata);
else
fprintf(listfp, "%*s", LIST_HEXBIT + 10, "");
if (listlevel_e)
fprintf(listfp, "%s<%d>", (listlevel < 10 ? " " : ""),
listlevel_e);
else if (listlinep)
fprintf(listfp, " ");
if (listlevel_e)
fprintf(listfp, "%s<%d>", (listlevel < 10 ? " " : ""),
listlevel_e);
else if (listlinep)
fprintf(listfp, " ");
if (listlinep)
fprintf(listfp, " %s", listline);
if (listlinep)
fprintf(listfp, " %s", listline);
putc('\n', listfp);
listlinep = false;
listdata[0] = '\0';
}
putc('\n', listfp);
listlinep = false;
listdata[0] = '\0';
if (listerror[0]) {
list_for_each_safe(le, tmp, listerr_head) {
fprintf(listfp, "%6"PRId32" ", listlineno);
for (i = 0; i < LIST_HEXBIT; i++)
putc('*', listfp);
@ -121,9 +125,10 @@ static void list_emit(void)
else
fprintf(listfp, " ");
fprintf(listfp, " %s\n", listerror);
listerror[0] = '\0';
fprintf(listfp, " %s\n", le->str);
nasm_free(le);
}
listerr_tail = &listerr_head;
}
static void list_init(const char *fname)
@ -142,7 +147,8 @@ static void list_init(const char *fname)
*listline = '\0';
listlineno = 0;
*listerror = '\0';
listerr_head = NULL;
listerr_tail = &listerr_head;
listp = true;
listlevel = 0;
suppress = 0;
@ -327,10 +333,27 @@ static void list_downlevel(int type)
static void list_error(int severity, const char *pfx, const char *msg)
{
size_t l1, l2;
struct list_error *le;
char *p;
if (!listfp)
return;
snprintf(listerror, sizeof listerror, "%s%s", pfx, msg);
l1 = strlen(pfx);
l2 = strlen(msg);
/* sizeof(*le) already accounts for the final NULL */
le = nasm_malloc(sizeof(*le) + l1 + l2);
le->next = NULL;
p = le->str;
p = mempcpy(p, pfx, l1);
p = mempcpy(p, msg, l2);
*p = '\0';
*listerr_tail = le;
listerr_tail = &le->next;
if ((severity & ERR_MASK) >= ERR_FATAL)
list_emit();