The Windows Help backend now uses libcharset to the maximum extent
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 20 Apr 2004 19:06:10 +0000 (19:06 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 20 Apr 2004 19:06:10 +0000 (19:06 +0000)
it can. (Which isn't much, since I currently don't know how to
indicate that a help file is encoded in anything other than Win1252,
and so the only use I found for libcharset was to replace the
previous pathetic 8859-1 conversion so that extra things like the
trademark sign are supported.)

git-svn-id: svn://svn.tartarus.org/sgt/halibut@4102 cda61777-01e9-0310-a592-d414129be87e

bk_whlp.c

index c8a6524..d11fd22 100644 (file)
--- a/bk_whlp.c
+++ b/bk_whlp.c
@@ -676,45 +676,49 @@ static void whlp_rdaddwc(rdstringc *rs, word *text) {
  */
 static int whlp_convert(wchar_t *s, int maxlen,
                        char **result, int hard_spaces) {
+    wchar_t *s2;
+    char *ret;
+    int ok;
+
     /*
-     * FIXME. Currently this is ISO8859-1 only.
+     * Enforce maxlen.
      */
-    int doing = (result != 0);
-    int ok = TRUE;
-    char *p = NULL;
-    int plen = 0, psize = 0;
-
-    if (maxlen <= 0)
-       maxlen = -1;
-
-    for (; *s && maxlen != 0; s++, maxlen--) {
-       wchar_t c = *s;
-       char outc;
-
-       if ((c >= 32 && c <= 126) ||
-           (c >= 160 && c <= 255)) {
-           /* Char is OK. */
-           if (c == 32 && hard_spaces)
-               outc = '\240';
-           else
-               outc = (char)c;
-       } else {
-           /* Char is not OK. */
-           ok = FALSE;
-           outc = 0xBF;               /* approximate the good old DEC `uh?' */
-       }
-       if (doing) {
-           if (plen >= psize) {
-               psize = plen + 256;
-               p = resize(p, psize);
-           }
-           p[plen++] = outc;
-       }
-    }
-    if (doing) {
-       p = resize(p, plen+1);
-       p[plen] = '\0';
-       *result = p;
+    if (maxlen > 0 && ustrlen(s) > maxlen) {
+       s2 = mknewa(wchar_t, maxlen+1);
+       memcpy(s2, s, maxlen * sizeof(wchar_t));
+       s2[maxlen] = L'\0';
+       s = s2;
+    } else
+       s2 = NULL;
+
+    /*
+     * We currently only support Win1252 in Windows Help files,
+     * because I don't know how to fiddle the character set
+     * designation in the |SYSTEM file to indicate anything else.
+     */
+
+    ret = utoa_careful_dup(s, CS_CP1252);
+    if (!ret) {
+       ok = FALSE;
+       ret = utoa_dup(s, CS_CP1252);
+    } else
+       ok = TRUE;
+
+    /*
+     * Enforce hard_spaces.
+     */
+    if (hard_spaces) {
+       char *p;
+
+       for (p = ret; *p; p++)
+           if (*p == ' ')
+               *p = '\240';
     }
+
+    if (s2)
+       sfree(s2);
+
+    *result = ret;
+
     return ok;
 }