[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-devel:13032] Re: jgroff patch handling on latin1 (Re: linuxdoc-tools: no Korean .txt output!)
At Fri, 13 Oct 2000 14:18:27 +0900,
Fumitoshi UKAI <ukai@debian.or.jp> wrote:
> setlocale()して mbtowc()使って読みこんでいくようにすれば
> いいはずです。
まずは現状がどうなってるか見てみました。
project/experimental/groff_1.16-1から NIPPON関係をぬきだしただけですが
このメモをもとに誰かまっとうなコードを書いてくれる人はいませんかね…
* eucmac.h の書きかえ
wchar => wchar_t を使うべき?
不要? ↓
static const int EUCMASK = 0x8080;
inline int is_euc_code(wchar wc) => wcwidth()?
inline int is_euc_byte(unsigned char c) => ???
先頭 byte のチェック、2 byte目のチェックにも使っている
ある 1 byte をもってきた時それが multibyte char の一部かどうか
判定するのは難しい(?)
UTF-8 なら簡単か?
char *s が入力の時なら mbrtowc()すればいいが getc()で読んでる
場合は mbrtowc()してみて return value が (size_t)-2 かどうかで
判断?
inline wchar make_euc_code(unsigned char ubyte, unsigned char lbyte)
=> mbrtowc()?
inline unsigned int euc_ubyte(wchar wc)
inline unsigned int euc_lbyte(wchar wc)
=> wcrtomb()?
static const int WCTABLE_OFFSET = 0xa1;
static const int WCTABLE_SIZE = 94;
inline wchar calc_euccode(int ku, int ten)
=> 句点->EUC への処理 font::load_font() でEUC全範囲を処理するのに
句点コードで loop しているだけ
-> 不要? そのような情報は外部ファイルで持つ?
* char / wchar を併用している
例)
wchar c = ci->get_euc_code();
if (c == '\0')
c = ci->get_ascii_code();
=> wchar_t に統一した方がよさげ
* src/devices/grotty/tty.cc における WCHAR_MODE の導入は不要?
if (WCHAR_MODE)
__\b\bあ とか あ\b\bあ
else
_\bA とか A\bA
しかしこの WCHAR_MODE の処理は必要ない
_\bあ とか あ\bあ で ok のはず (jless, lv, w3m を使えば, more はダメ)
* 禁則処理などは iswctype(3)を活用すべきなのではないだろうか?
-> 可能なのか?
そのためのテーブルを groff が /usr/lib/groff/* あたりに持つべき?
* src/roff/troff/node.cc では get_node_type()をみて条件分岐を
しているが、これはOO的にナニ
* fontname<->fonttype の判定が混乱ぎみ?
* subfont?
src/devices/grodvi/dvi.cc:
struct output_font
new member: const char *sf; /* sub font */
subfont handling
src/devices/grohtml/boh.html.cc:
font type check: "G" treated as "?B"
src/devices/grohtml/boh_html.h:
#ifndef NIPPON typedef unsigned char wchar
-> should use wchar_t
src/devices/grohtml/html.cc:
char -> wchar
font type check: "G" treated as "?B"
src/devices/grohtml/html.h:
add: simple_output &put_string(const wchar *, int);
src/devices/grops/ps.cc:
char -> wchar
src/devices/grops/ps.h:
char -> wchar
src/devices/grotty/tty.cc:
add: WCHAR_MODE
putchar() output wchar instead of char
f->mode: 5?
tty_printer::set_char()
eliminate w != font:hor check
if (WCHAR_MODE)
__\b\bあ とか あ\b\bあ
else
_\bA とか A\bA
src/include/eucmac.h:
XXX: should be rewritten!!
src/include/font.h:
class font
new method:
get_subfont_name()
kuten_to_index()
new member
lowerchar
wcharkern
on_demand_fonts
src/include/lib.h:
eucmac.h, is_euc_byte()
src/include/printer.h:
eucmac.h
class printer
new method:
set_euc_char()
src/libs/libdriver/input.cc:
new: unget_char()
do_file()
is_euc_byte()
src/libs/libdriver/printer.cc:
printer::set_euc_char()
src/libs/libgroff/font.cc:
font_char_metric
new member: char *subfont_name;
font::get_subfont_name(c)
"fixedkanji"
"..:.." -> subfont ?
"lowerwchar"
"wcharkern"
font:load_desc()
"ondemand"
src/libs/libgroff/fontfile.cc:
lowerwchar
wcharkern
on_demand_fonts
src/libs/libgroff/nametoindex.cc:
class character_indexer
new method:
euc_char_index()
new member
int euc_index[WCTABLE_SIZE][WCTABLE_SIZE]
font::kuten_to_index()
src/preproc/eqn/lex.cc:
if_euc_byte()
src/preproc/eqn/text.cc:
class char_box
new member:
wchar wc
new method
char_box(unsigned char wchar)
src/roff/troff/charinfo.h:
class charinfo
member: unsigned char flags -> unsigned short flags
new member: wchar euc_code
method: void set_flags(unsigned char -> unsigned short);
new method:
wchar get_euc_code();
void set_euc_code(wchar);
int pre_kinsoku();
int post_kinsoku();
int get_kinsoku();
PRE_KINSOKU, POST_KINSOKU
src/roff/troff/env.cc:
font.h
get_euc_code()
void environment::change_curfont(symbol nm)
void environment::change_curfont(int n)
void stretch_threshold_request()
init_request("stt", stretch_threshold_request);
src/roff/troff/env.h:
class environment
new member
int stretch_threshold;
int pre_wchar_kinsoku_mode;
int pre_char_is_ascii;
int enable_wcharkern;
int met_with_kword_space;
hunits hwkern;
vunits vlower;
new method:
void change_curfont(int);
void change_curfont(symbol);
src/roff/troff/input.cc:
charinfo *wcharset_table[WCTABLE_SIZE][WCTABLE_SIZE];
charinfo *wcharset_table_entry(wchar wc)
static int mount_on_demand(const char *font_name)
is_euc_byte()
token::TOKEN_WCHAR
charinfo::PRE_KINSOKU
src/roff/troff/node.cc:
friend is_boldfont()
char -> wchar
class troff_output_file
new method: void put(const wchar wc);
class glyph_node
new method: node_type get_node_type();
static char *boldfont_list[]
int is_boldfont(int fontno)
src/roff/troff/node.h:
enum node_type {NODE_GLYPH, NODE_KWORD_SPACE,
NODE_NEWLINE_SPACE, NODE_ANOTHER};
struct node
new method: virtual node_type get_node_type();
class kword_space_node : public word_space_node
class newline_space_node : public word_space_node
is_boldfont()
src/roff/troff/token.h:
class token
new member: wchar wc
TOKEN_WCHAR
src/xditview/DviChar.c:
eucmac.h
is_euc_byte()
static DviCharNameMap JISX0208_1983_0_map
DviRegisterMap (&JISX0208_1983_0_map);
src/xditview/DviP.h:
XTextItem -> XTextItem16
char -> XChar2b
src/xditview/draw.c:
eucmac.h
XDrawText -> XDrawText16
int charWidth()
is_euc_byte()
XTextItem -> XTextItem16
src/xditview/parse.c:
eucmac.h
is_euc_byte()
src/xditview/xtotroff.c:
if (fi->min_byte1 != 0 || fi->max_byte1 != 0)
#include "eucmac.h"の追加のみ
src/include/driver.h
src/libs/libbib/index.cc
src/libs/libbib/linear.cc
src/libs/libbib/search.cc:
src/libs/libgroff/illegal.cc
src/libs/libgroff/macropath.cc
src/libs/libgroff/searchpath.cc
src/libs/libgroff/string.cc
src/libs/libgroff/tmpfile.cc
src/preproc/eqn/eqn.h
src/preproc/eqn/eqn.y
src/preproc/pic/pic.h
src/preproc/refer/refer.h
src/preproc/soelim/soelim.cc
src/preproc/tbl/table.h
src/roff/groff/groff.cc
src/roff/troff/troff.h
src/utils/addftinfo/addftinfo.cc
src/utils/hpftodit/hpftodit.cc
src/utils/indxbib/indxbib.cc
src/utils/lkbib/lkbib.cc
src/utils/lookbib/lookbib.cc
src/utils/tfmtodit/tfmtodit.cc
autoconfむけ変更
aclocal.m4:
configure.in:
Makefile.in:
comment only
--
鵜飼文敏