From 39c03aac412cce5bbb99f8bfa04522d4fb5d09e1 Mon Sep 17 00:00:00 2001 From: zingaburga Date: Tue, 18 Jan 2011 20:58:46 +1000 Subject: [PATCH] Fix issue in previous commit with not being able to swprintf the the same string. --- src/vsmx.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/vsmx.c b/src/vsmx.c index 3b164e9..828b4e8 100644 --- a/src/vsmx.c +++ b/src/vsmx.c @@ -210,6 +210,30 @@ strwcpy (wchar_t * dest, const char *src, unsigned int maxLen) return dest; } +// similar to wcscat, except it puts the s2 before s1, rather than after +static inline wchar_t * +wcsprecat (wchar_t * dest, const wchar_t *src, unsigned int maxLen) +{ + unsigned int len = wcslen(src); + unsigned int destLen; + if(len >= maxLen) { + wmemcpy (dest, src, maxLen); + dest[maxLen-1] = L'\0'; + return dest; + } + // unfortunately, wcscpy can't have overlapping ranges + destLen = wcslen(dest); + if(len + destLen >= maxLen) + destLen = maxLen - len; + *(dest + len + destLen) = L'\0'; + while(destLen--) { + *(dest + len + destLen) = *(dest + destLen); + } + // wcscpy (dest + len, dest); + wmemcpy (dest, src, len); + return dest; +} + VsmxMem * readVSMX (FILE * fp) { @@ -1375,13 +1399,18 @@ VsmxDecompile (VsmxMem * in, FILE * out) for (j = 0; j < in->code[i].val.u32; j++) { prev = VsmxDecompileStackPop (&stack); - if (j) - SWPRINTF_ITEM (" %ls,%ls", prev->str, item.str); - else + if (j) { + wchar_t tmp[MAX_TEXT_LEN]; + swprintf (tmp, L" %ls,", prev->str); + wcsprecat (item.str, tmp, MAX_TEXT_LEN); + // SWPRINTF_ITEM (" %ls,%ls", prev->str, item.str); + } else SWPRINTF_ITEM (" %ls ", prev->str); free (prev); } - SWPRINTF_ITEM ("[%ls]", item.str); + wcscat (item.str, L"]"); + wcsprecat (item.str, L"[", MAX_TEXT_LEN); + // SWPRINTF_ITEM ("[%ls]", item.str); VsmxDecompileStackPush (&stack, &item); } break; @@ -1649,8 +1678,8 @@ VsmxDecompile (VsmxMem * in, FILE * out) // swprintf(item.str, MAX_TEXT_LEN, L"%s( )", prev->str); SWPRINTF_ITEM ("%ls()", prev->str); } - if(in->code[i].id & 0xFF == VID_CALL_NEW) { - SWPRINTF_ITEM ("new %ls", item.str); + if((in->code[i].id & 0xFF) == VID_CALL_NEW) { + wcsprecat (item.str, L"new ", MAX_TEXT_LEN); } free (prev); VsmxDecompileStackPush (&stack, &item); -- 2.39.5