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