diff --git a/src/common/tvgStr.cpp b/src/common/tvgStr.cpp index eb436f5b..1ebdd41c 100644 --- a/src/common/tvgStr.cpp +++ b/src/common/tvgStr.cpp @@ -219,6 +219,14 @@ char* strDuplicate(const char *str, size_t n) return (char *) memcpy(ret, str, n); } +char* strAppend(char* lhs, const char* rhs, size_t n) +{ + if (!rhs) return lhs; + if (!lhs) return strDuplicate(rhs, n); + lhs = (char*)realloc(lhs, strlen(lhs) + n + 1); + return strncat(lhs, rhs, n); +} + char* strDirname(const char* path) { const char *ptr = strrchr(path, '/'); diff --git a/src/common/tvgStr.h b/src/common/tvgStr.h index 272ff4ac..6b16b4c7 100644 --- a/src/common/tvgStr.h +++ b/src/common/tvgStr.h @@ -30,6 +30,7 @@ namespace tvg float strToFloat(const char *nPtr, char **endPtr); //convert to float char* strDuplicate(const char *str, size_t n); //copy the string +char* strAppend(char* lhs, const char* rhs, size_t n); //append the rhs to the lhs char* strDirname(const char* path); //return the full directory name } diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 66d6b7ff..93457bc3 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -2183,6 +2183,7 @@ static SvgNode* _createTextNode(SvgLoaderData* loader, SvgNode* parent, const ch //TODO: support the def font and size as used in a system? loader->svgParse->node->node.text.fontSize = 10.0f; loader->svgParse->node->node.text.fontFamily = nullptr; + loader->svgParse->node->node.text.text = nullptr; func(buf, bufLength, _attrParseTextNode, loader); @@ -3400,8 +3401,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, static void _svgLoaderParserText(SvgLoaderData* loader, const char* content, unsigned int length) { auto text = &loader->svgParse->node->node.text; - if (text->text) free(text->text); - text->text = strDuplicate(content, length); + text->text = strAppend(text->text, content, length); }