+ int i, ret = 0;
+
+ /*
+ * In the platform-independent parts of the code, font_codepage
+ * is used only for system DBCS support - which we don't
+ * support at all. So we set this to something which will never
+ * be used.
+ */
+ ucsdata->font_codepage = -1;
+
+ /*
+ * If utf8_override is set and the POSIX locale settings
+ * dictate a UTF-8 character set, then just go straight for
+ * UTF-8.
+ */
+ ucsdata->line_codepage = CS_NONE;
+ if (utf8_override) {
+ const char *s;
+ if (((s = getenv("LC_ALL")) && *s) ||
+ ((s = getenv("LC_CTYPE")) && *s) ||
+ ((s = getenv("LANG")) && *s)) {
+ if (strstr(s, "UTF-8"))
+ ucsdata->line_codepage = CS_UTF8;
+ }
+ }
+
+ /*
+ * Failing that, line_codepage should be decoded from the
+ * specification in cfg.
+ */
+ if (ucsdata->line_codepage == CS_NONE)
+ ucsdata->line_codepage = decode_codepage(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
+ * in the line codepage into Unicode.
+ */
+ for (i = 0; i < 256; i++) {
+ char c[1], *p;
+ wchar_t wc[1];
+ int len;
+ c[0] = i;
+ p = c;
+ len = 1;
+ 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
+ ucsdata->unitab_line[i] = 0xFFFD;
+ }
+
+ /*
+ * Set up unitab_xterm. This is the same as unitab_line except
+ * in the line-drawing regions, where it follows the Unicode
+ * encoding.
+ *
+ * (Note that the strange X encoding of line-drawing characters
+ * in the bottom 32 glyphs of ISO8859-1 fonts is taken care of
+ * by the font encoding, which will spot such a font and act as
+ * if it were in a variant encoding of ISO8859-1.)
+ */
+ for (i = 0; i < 256; i++) {
+ static const wchar_t unitab_xterm_std[32] = {
+ 0x2666, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
+ 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba,
+ 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
+ 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x0020
+ };
+ static const wchar_t unitab_xterm_poorman[32] =
+ L"*#****o~**+++++-----++++|****L. ";
+
+ const wchar_t *ptr;
+
+ if (vtmode == VT_POORMAN)
+ ptr = unitab_xterm_poorman;