shithub: rgbds

Download patch

ref: ae0b95ec6d6df17eec9e31d96ba311c322d9283e
parent: e93d65d736a42f8317370b8e091cefafdc4a665b
author: ISSOtm <[email protected]>
date: Fri Oct 11 13:12:18 EDT 2019

Make linker output error stacks instead of their top level

--- a/include/asm/fstack.h
+++ b/include/asm/fstack.h
@@ -43,6 +43,7 @@
 void fstk_RunMacroArg(int32_t s);
 void fstk_Init(char *s);
 void fstk_Dump(void);
+void fstk_DumpToStr(char *buf, size_t len);
 void fstk_DumpStringExpansions(void);
 void fstk_AddIncludePath(char *s);
 uint32_t fstk_RunMacro(char *s);
--- a/src/asm/fstack.c
+++ b/src/asm/fstack.c
@@ -262,6 +262,38 @@
 	fprintf(stderr, "%s(%d)", tzCurrentFileName, nLineNo);
 }
 
+void fstk_DumpToStr(char *buf, size_t buflen)
+{
+	const struct sContext *pLastFile = pFileStack;
+	int retcode;
+	size_t len = buflen;
+
+	while (pLastFile) {
+		retcode = snprintf(&buf[buflen - len], len, "%s(%d) -> ",
+				   pLastFile->tzFileName, pLastFile->nLine);
+		if (retcode < 0)
+			fatalerror("Failed to dump file stack to string: %s",
+				   strerror(errno));
+		else if (retcode >= len)
+			len = 0;
+		else
+			len -= retcode;
+		pLastFile = pLastFile->pNext;
+	}
+
+	retcode = snprintf(&buf[buflen - len], len, "%s", tzCurrentFileName);
+	if (retcode < 0)
+		fatalerror("Failed to dump file stack to string: %s",
+			   strerror(errno));
+	else if (retcode >= len)
+		len = 0;
+	else
+		len -= retcode;
+
+	if (!len)
+		warning("File stack dump too long, got truncated");
+}
+
 /*
  * Dump the string expansion stack to stderr
  */
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -395,7 +395,7 @@
 
 	pPatch = allocpatch();
 	pPatch->nType = type;
-	strcpy(pPatch->tzFilename, tzCurrentFileName);
+	fstk_DumpToStr(pPatch->tzFilename, sizeof(pPatch->tzFilename));
 	pPatch->nLine = nLineNo;
 	pPatch->nOffset = nPC;