diff -ub --recursive links-0.95.orig/charsets.c links-0.95/charsets.c --- links-0.95.orig/charsets.c Sun Dec 31 14:26:52 2000 +++ links-0.95/charsets.c Sun Apr 7 21:28:37 2002 @@ -140,6 +140,25 @@ return utf_buffer; } +/* this slow and ugly code is used by the terminal utf_8_hack */ +unsigned char *cp2utf_8(int from, int c) +{ + int j; + int u = 0xFFFD; /* No Character */ + + if ((c < 128) || codepages[from].table == table_utf_8) + { + return strings[c]; + } + for (j = 0; codepages[from].table[j].c; j++) { + if (codepages[from].table[j].c == c) + { + u = codepages[from].table[j].u; + } + } + return encode_utf_8(u); +} + void add_utf_8(struct conv_table *ct, int u, unsigned char *str) { unsigned char *p = encode_utf_8(u); diff -ub --recursive links-0.95.orig/default.c links-0.95/default.c --- links-0.95.orig/default.c Sun Dec 31 14:26:52 2000 +++ links-0.95/default.c Sun Apr 7 17:07:40 2002 @@ -556,6 +556,7 @@ } } +/* terminal NAME(str) MODE(0-3) M11_HACK(0-1) BLOCK_CURSOR.RESTRICT_852.COL(0-7) CHARSET(str) [ UTF_8_HACK("utf-8") ]*/ unsigned char *term_rd(struct option *o, unsigned char *c) { struct term_spec *ts; @@ -566,6 +567,7 @@ mem_free(w); goto end; } + ts->utf_8_hack = 0; mem_free(w); if (!(w = get_token(&c))) goto err; if (strlen(w) != 1 || w[0] < '0' || w[0] > '3') goto err_f; @@ -585,6 +587,9 @@ if ((i = get_cp_index(w)) == -1) goto err_f; ts->charset = i; mem_free(w); + if (!(w = get_token(&c))) goto end; + if (!(strcasecmp(w, "utf-8"))) ts->utf_8_hack = 1; + mem_free(w); end: return NULL; err_f: @@ -593,6 +598,7 @@ return "Error reading terminal specification"; } +/* terminal2 NAME(str) MODE(0-3) M11_HACK(0-1) RESTRICT_852(0-1) COL(0-1) CHARSET(str) [ UTF_8_HACK("utf-8") ]*/ unsigned char *term2_rd(struct option *o, unsigned char *c) { struct term_spec *ts; @@ -603,6 +609,7 @@ mem_free(w); goto end; } + ts->utf_8_hack = 0; mem_free(w); if (!(w = get_token(&c))) goto err; if (strlen(w) != 1 || w[0] < '0' || w[0] > '3') goto err_f; @@ -624,6 +631,9 @@ if ((i = get_cp_index(w)) == -1) goto err_f; ts->charset = i; mem_free(w); + if (!(w = get_token(&c))) goto end; + if (!(strcmp(w, "utf-8"))) ts->utf_8_hack = 1; + mem_free(w); end: return NULL; err_f: @@ -646,6 +656,10 @@ add_num_to_str(s, l, !!ts->col + !!ts->restrict_852 * 2 + !!ts->block_cursor * 4); add_to_str(s, l, " "); add_to_str(s, l, get_cp_mime_name(ts->charset)); + if (ts->utf_8_hack) + { + add_to_str(s, l, " utf-8"); + } } } --- links-0.95.orig/intl/english.lng Tue Jan 2 04:01:56 2001 +++ links-0.95/intl/english.lng Sun Apr 7 17:07:45 2002 @@ -48,6 +48,7 @@ T_LINUX_OR_OS2_FRAMES, "Linux or OS/2 frames", T_KOI8R_FRAMES, "KOI8-R frames", T_USE_11M, "Use ^[[11m", +T_UTF_8_HACK, "UTF-8 Hack", T_RESTRICT_FRAMES_IN_CP850_852, "Restrict frames in cp850/852", T_BLOCK_CURSOR, "Block cursor", T_COLOR, "Color", diff -ub --recursive links-0.95.orig/links.h links-0.95/links.h --- links-0.95.orig/links.h Sun Dec 31 14:26:52 2000 +++ links-0.95/links.h Sun Apr 7 20:44:39 2002 @@ -981,6 +981,7 @@ unsigned char term[MAX_TERM_LEN]; int mode; int m11_hack; + int utf_8_hack; int restrict_852; int block_cursor; int col; @@ -1698,6 +1699,7 @@ unsigned char *get_cp_mime_name(int); int is_cp_special(int); void free_conv_table(); +unsigned char *cp2utf_8(int, int); /* view.c */ diff -ub --recursive links-0.95.orig/menu.c links-0.95/menu.c --- links-0.95.orig/menu.c Sun Dec 31 14:26:52 2000 +++ links-0.95/menu.c Sun Apr 7 17:07:40 2002 @@ -377,15 +377,15 @@ cls_redraw_all_terminals(); } -unsigned char *td_labels[] = { TEXT(T_NO_FRAMES), TEXT(T_VT_100_FRAMES), TEXT(T_LINUX_OR_OS2_FRAMES), TEXT(T_KOI8R_FRAMES), TEXT(T_USE_11M), TEXT(T_RESTRICT_FRAMES_IN_CP850_852), TEXT(T_BLOCK_CURSOR), TEXT(T_COLOR), NULL }; +unsigned char *td_labels[] = { TEXT(T_NO_FRAMES), TEXT(T_VT_100_FRAMES), TEXT(T_LINUX_OR_OS2_FRAMES), TEXT(T_KOI8R_FRAMES), TEXT(T_USE_11M), TEXT(T_RESTRICT_FRAMES_IN_CP850_852), TEXT(T_BLOCK_CURSOR), TEXT(T_COLOR), TEXT(T_UTF_8_HACK), NULL }; void terminal_options(struct terminal *term, void *xxx, struct session *ses) { struct dialog *d; struct term_spec *ts = new_term_spec(term->term); if (!ts) return; - if (!(d = mem_alloc(sizeof(struct dialog) + 11 * sizeof(struct dialog_item)))) return; - memset(d, 0, sizeof(struct dialog) + 11 * sizeof(struct dialog_item)); + if (!(d = mem_alloc(sizeof(struct dialog) + 12 * sizeof(struct dialog_item)))) return; + memset(d, 0, sizeof(struct dialog) + 12 * sizeof(struct dialog_item)); d->title = TEXT(T_TERMINAL_OPTIONS); d->fn = checkbox_list_fn; d->udata = td_labels; @@ -426,15 +426,19 @@ d->items[7].gid = 0; d->items[7].dlen = sizeof(int); d->items[7].data = (void *)&ts->col; - d->items[8].type = D_BUTTON; - d->items[8].gid = B_ENTER; - d->items[8].fn = ok_dialog; - d->items[8].text = TEXT(T_OK); + d->items[8].type = D_CHECKBOX; + d->items[8].gid = 0; + d->items[8].dlen = sizeof(int); + d->items[8].data = (void *)&ts->utf_8_hack; d->items[9].type = D_BUTTON; - d->items[9].gid = B_ESC; - d->items[9].fn = cancel_dialog; - d->items[9].text = TEXT(T_CANCEL); - d->items[10].type = D_END; + d->items[9].gid = B_ENTER; + d->items[9].fn = ok_dialog; + d->items[9].text = TEXT(T_OK); + d->items[10].type = D_BUTTON; + d->items[10].gid = B_ESC; + d->items[10].fn = cancel_dialog; + d->items[10].text = TEXT(T_CANCEL); + d->items[11].type = D_END; do_dialog(term, d, getml(d, NULL)); } diff -ub --recursive links-0.95.orig/terminal.c links-0.95/terminal.c --- links-0.95.orig/terminal.c Sun Dec 31 14:26:52 2000 +++ links-0.95/terminal.c Sun Apr 7 20:50:38 2002 @@ -479,7 +479,17 @@ if (attrib & 0100) add_to_str(&a, &l, ";1"); \ add_to_str(&a, &l, "m"); \ } \ - if (c >= ' ' && c != 127/* && c != 155*/) add_chr_to_str(&a, &l, c); \ + if (c >= ' ' && c != 127/* && c != 155*/) { \ + if (s->utf_8_hack) { \ + unsigned char *mp = cp2utf_8(s->charset, c); \ + while (*mp) \ + { \ + add_chr_to_str(&a, &l, *mp); \ + mp++; \ + } \ + } \ + else add_chr_to_str(&a, &l, c); \ + } \ else if (!c || c == 1) add_chr_to_str(&a, &l, ' '); \ else add_chr_to_str(&a, &l, '.'); \ cx++; \