diff --git a/include/asm/fstack.h b/include/asm/fstack.h index b63cd78f..b71bd718 100644 --- a/include/asm/fstack.h +++ b/include/asm/fstack.h @@ -43,6 +43,7 @@ void fstk_RunInclude(char *tzFileName); 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); diff --git a/src/asm/fstack.c b/src/asm/fstack.c index 0d0dd5b9..ae7bfd2c 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -262,6 +262,38 @@ void fstk_Dump(void) 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 */ diff --git a/src/asm/output.c b/src/asm/output.c index 27ed3c51..986674cf 100644 --- a/src/asm/output.c +++ b/src/asm/output.c @@ -395,7 +395,7 @@ void createpatch(uint32_t type, struct Expression *expr) pPatch = allocpatch(); pPatch->nType = type; - strcpy(pPatch->tzFilename, tzCurrentFileName); + fstk_DumpToStr(pPatch->tzFilename, sizeof(pPatch->tzFilename)); pPatch->nLine = nLineNo; pPatch->nOffset = nPC;