64fac50ece48848fe46f959064b49eec36e33e72 braney Fri Nov 8 10:54:49 2024 -0800 fix problem with iconv that was barfing on the translation of control codes even if translit was specified. refs #34782 diff --git src/lib/psGfx.c src/lib/psGfx.c index e2e4d94..0bbd78e 100644 --- src/lib/psGfx.c +++ src/lib/psGfx.c @@ -259,47 +259,57 @@ static size_t utf8ToWindows1252(char *text, unsigned char *buffer, size_t nLength) /* Convert UTF-8 string to Unicode string. */ { if (ourIconv == NULL) { ourIconv = iconv_open("WINDOWS-1252//TRANSLIT", "UTF-8"); if (ourIconv == NULL) errAbort("iconv problem errno %d\n",errno); } size_t length = strlen(text); char *newText = (char *)buffer; -int ret = iconv(ourIconv, &text, &length, &newText, &nLength); - -if (ret < 0) +// loop calling iconv until we get through the whole string +int ret; +while((ret = iconv(ourIconv, &text, &length, &newText, &nLength)) < 0) + { + if (errno == EILSEQ) // this means we hit an illegal character. Skip it and put a '?' there, then go back into iconv + { + text++; + *newText++ = '?'; + } + else errAbort("iconv problem errno %d\n",errno); + } -return (newText - (char *)buffer); +// null terminate that puppy +int newLength = newText - (char *)buffer; +buffer[newLength] = 0; +return newLength; } void psTextOutEscaped(struct psGfx *ps, char *text) /* Output post-script-escaped text. * Notice that ps uses escaping similar to C itself.*/ { size_t length = strlen(text); -unsigned char buff[length * 2]; // should be way too much +unsigned char buff[length * 4]; // should be way too much -length = utf8ToWindows1252(text, buff, length * 4); -buff[length] = '\0'; +length = utf8ToWindows1252(text, buff, sizeof(buff)); text = (char *)buff; char c; while ((c = *text++) != 0) { if (c == '(') fprintf(ps->f, "\\("); // left-paren else if (c == ')') fprintf(ps->f, "\\)"); // right-paren else if (c == '\\') fprintf(ps->f, "\\\\"); // back-slash else if (c == '\n') fprintf(ps->f, "\\n"); // new-line else if (c == '\r') fprintf(ps->f, "\\r"); // carriage-return