X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/e4ea58f8cb4dccaa8e99306a3497de1e37600480..5b1d0032b0eb6f4a347c0c2cfdbe6e4bb4f959ab:/bk_whlp.c diff --git a/bk_whlp.c b/bk_whlp.c index c8a6524..d11fd22 100644 --- 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; }