setlocale(LC_CTYPE, "C");
return n;
+ } else if (codepage == CS_NONE) {
+ int n = 0;
+
+ while (mblen > 0) {
+ wcstr[n] = 0xD800 | (mbstr[0] & 0xFF);
+ n++;
+ mbstr++;
+ mblen--;
+ }
+
+ return n;
} else
return charset_to_unicode(&mbstr, &mblen, wcstr, wclen, codepage,
NULL, NULL, 0);
}
int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
- char *mbstr, int mblen, char *defchr, int *defused)
+ char *mbstr, int mblen, char *defchr, int *defused,
+ struct unicode_data *ucsdata)
{
/* FIXME: we should remove the defused param completely... */
if (defused)
setlocale(LC_CTYPE, "C");
return n;
- } else
+ } else if (codepage == CS_NONE) {
+ int n = 0;
+ while (wclen > 0 && n < mblen) {
+ if (*wcstr >= 0xD800 && *wcstr < 0xD900)
+ mbstr[n++] = (*wcstr & 0xFF);
+ else if (defchr)
+ mbstr[n++] = *defchr;
+ wcstr++;
+ wclen--;
+ }
+ return n;
+ } else {
return charset_from_unicode(&wcstr, &wclen, mbstr, mblen, codepage,
- NULL, NULL, 0);
+ NULL, defchr?defchr:NULL, defchr?1:0);
+ }
}
-void init_ucs(void)
+/*
+ * Return value is TRUE if pterm is to run in direct-to-font mode.
+ */
+int init_ucs(struct unicode_data *ucsdata,
+ char *linecharset, int font_charset)
{
- int i;
+ int i, ret = 0;
/*
* In the platform-independent parts of the code, font_codepage
* support at all. So we set this to something which will never
* be used.
*/
- font_codepage = -1;
+ ucsdata->font_codepage = -1;
/*
* line_codepage should be decoded from the specification in
* cfg.
*/
- line_codepage = charset_from_mimeenc(cfg.line_codepage);
- if (line_codepage == CS_NONE)
- line_codepage = charset_from_xenc(cfg.line_codepage);
- /* If it's still CS_NONE, we should assume direct-to-font. */
-
- /* FIXME: this is a hack. Currently fonts with incomprehensible
- * encodings are dealt with by pretending they're 8859-1. It's
- * ugly, but it's good enough to stop things crashing. Should do
- * something better here. */
- if (line_codepage == CS_NONE)
- line_codepage = CS_ISO8859_1;
+ ucsdata->line_codepage = charset_from_mimeenc(linecharset);
+ if (ucsdata->line_codepage == CS_NONE)
+ ucsdata->line_codepage = charset_from_xenc(linecharset);
+
+ /*
+ * If line_codepage is _still_ CS_NONE, we assume we're using
+ * the font's own encoding. This has been passed in to us, so
+ * we use that. If it's still CS_NONE after _that_ - i.e. the
+ * font we were given had an incomprehensible charset - then we
+ * fall back to using the D800 page.
+ */
+ if (ucsdata->line_codepage == CS_NONE)
+ ucsdata->line_codepage = font_charset;
+
+ if (ucsdata->line_codepage == CS_NONE)
+ ret = 1;
/*
* Set up unitab_line, by translating each individual character
c[0] = i;
p = c;
len = 1;
- if (1 == charset_to_unicode(&p,&len,wc,1,line_codepage,NULL,L"",0))
- unitab_line[i] = wc[0];
+ if (ucsdata->line_codepage == CS_NONE)
+ ucsdata->unitab_line[i] = 0xD800 | i;
+ else if (1 == charset_to_unicode(&p, &len, wc, 1,
+ ucsdata->line_codepage,
+ NULL, L"", 0))
+ ucsdata->unitab_line[i] = wc[0];
else
- unitab_line[i] = 0xFFFD;
+ ucsdata->unitab_line[i] = 0xFFFD;
}
/*
0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x0020
};
if (i >= 0x5F && i < 0x7F)
- unitab_xterm[i] = unitab_xterm_std[i & 0x1F];
+ ucsdata->unitab_xterm[i] = unitab_xterm_std[i & 0x1F];
else
- unitab_xterm[i] = unitab_line[i];
+ ucsdata->unitab_xterm[i] = ucsdata->unitab_line[i];
}
/*
c[0] = i;
p = c;
len = 1;
- if (1 == charset_to_unicode(&p,&len,wc,1,CS_CP437,NULL,L"",0))
- unitab_scoacs[i] = wc[0];
+ if (1 == charset_to_unicode(&p, &len, wc, 1, CS_CP437, NULL, L"", 0))
+ ucsdata->unitab_scoacs[i] = wc[0];
else
- unitab_scoacs[i] = 0xFFFD;
+ ucsdata->unitab_scoacs[i] = 0xFFFD;
}
- /* Find the line control characters. */
- for (i = 0; i < 256; i++)
- if (unitab_line[i] < ' '
- || (unitab_line[i] >= 0x7F && unitab_line[i] < 0xA0))
- unitab_ctrl[i] = i;
+ /*
+ * Find the control characters in the line codepage. For
+ * direct-to-font mode using the D800 hack, we assume 00-1F and
+ * 7F are controls, but allow 80-9F through. (It's as good a
+ * guess as anything; and my bet is that half the weird fonts
+ * used in this way will be IBM or MS code pages anyway.)
+ */
+ for (i = 0; i < 256; i++) {
+ int lineval = ucsdata->unitab_line[i];
+ if (lineval < ' ' || (lineval >= 0x7F && lineval < 0xA0) ||
+ (lineval >= 0xD800 && lineval < 0xD820) || (lineval == 0xD87F))
+ ucsdata->unitab_ctrl[i] = i;
else
- unitab_ctrl[i] = 0xFF;
+ ucsdata->unitab_ctrl[i] = 0xFF;
+ }
+
+ return ret;
}