[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

-- 
鵜飼文敏