namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

patch for kakasi-2.2.5 on OS/2 (and Win32)



清水@住友林業です。

掲題の件ですが、OS/2 では標準でシンボリックリンクなどという高級な
機能がなく、また、UNIX と違って「ドライブレター」という概念があり
ます。このため、kanwadict / itaijidict のファイル位置を

 /usr/local/lib/kakasi/kanwadict

などとハードコーディングしたままだと、kakaksi の実行時のカレント
ドライブ上に

 \usr\local\lib\kakasi\kanwadict

という位置に辞書を置くか、あるいは kakasi のオプションでフルパス
で位置を指定する必要があります。

で、OS/2 のユーザーってのは、たいてい、FAT のドライブと HPFS の
ドライブを使い分ける(DOS / Windows * とデータを共用するため)
傾向がありまして、カレントドライブがどこであっても、特定のドライ
ブにある辞書ファイルを参照するようになっていると、非常に嬉しい事
になります。(さもなくば、使い勝手があまりよくない)

これは、たぶん Win32 環境でも同じだと思います。

# うーみゅ、前置きが長い :-)

で、発想が安直ですが、辞書ファイルの位置を環境変数から取得できる
ようにしてみました。参照順は、

  1. 環境変数 KANWADICTPATH / ITAIJIDICTPATH
  2. 環境変数 KANWADICT     / ITAIJIDICT
  3. make 時に指定された位置

となっています。最後に オリジナルの dict.c / itaiji.c との diff を
付けます。OS/2 では、これで make された kakasi.exe を path の通った
ディレクトリに置いておけば、ドライブレターやカレントディレクトリを
気にすることなく、どこからでも kakasi を起動できるようになりました。

ちなみに、OS/2 の emx gcc でコンパイルした場合には、

  SET KANWADICTPATH=d:/usr/local/lib/kakasi/kanwadict
  SET KANWADICTPATH=d:\usr\local\lib\kakasi\kanwadict

のどちらの設定でもOKでした。

たぶん Win32 でも getenv まわりの書式が同じであればそのまま使えるの
ではないかと思います。

興味がある方は on your own risk でご利用ください。

----

%diff -c src.orig/dict.c os2src/dict.c
*** src.orig/dict.c	Sun Jun 19 17:05:46 1994
--- os2src/dict.c	Mon Feb 23 12:13:06 1998
***************
*** 28,34 ****
--- 28,38 ----
  #include <stdio.h>
  #include <ctype.h>
  #include <string.h>
+ #ifdef emx
+ #include <stdlib.h>
+ #else
  #include <malloc.h>
+ #endif
  #include "kakasi.h"
  #include "J2.h"
  
***************
*** 181,187 ****
      int tail;
      extern char *ialloc();
  
!     if ((jisyo_fp = fopen(filename, "r")) == NULL) {
  	perror(filename);
  	exit(0);
      }
--- 185,191 ----
      int tail;
      extern char *ialloc();
  
!     if ((jisyo_fp = fopen(filename, "rb")) == NULL) {
  	perror(filename);
  	exit(0);
      }
***************
*** 246,259 ****
  void init_kanwa()
  {
      int i, j;
      
!     if ((kanwadict = fopen(KANWADICT,"r")) == NULL) {
! 	perror(KANWADICT);
  	exit(2);
      }
  
      if (fread((char *)kanwa, sizeof kanwa, 1, kanwadict) != 1) {
! 	perror(KANWADICT);
      }
  
      for (i = 0; i < 0x80; ++ i)
--- 250,271 ----
  void init_kanwa()
  {
      int i, j;
+ 
+     char *kanwadictpath;
+     
+     kanwadictpath = getenv("KANWADICTPATH");
+     if (kanwadictpath == NULL)
+         kanwadictpath = getenv("KANWADICT");
+     if (kanwadictpath == NULL)
+ 	kanwadictpath = KANWADICT;
      
!     if ((kanwadict = fopen(kanwadictpath,"rb")) == NULL) {
! 	perror(kanwadictpath);
  	exit(2);
      }
  
      if (fread((char *)kanwa, sizeof kanwa, 1, kanwadict) != 1) {
! 	perror(kanwadictpath);
      }
  
      for (i = 0; i < 0x80; ++ i)

%diff -c src.orig/itaiji.c os2src/itaiji.c
*** src.orig/itaiji.c	Sun Jun 19 17:05:32 1994
--- os2src/itaiji.c	Mon Feb 23 12:13:00 1998
***************
*** 43,54 ****
      int i, j;
      char buffer[BUFSIZE];
      unsigned char n1, n2, o1, o2;
      
!     if ((fp = fopen(ITAIJIDICT, "r")) == NULL) {
  	fprintf(stderr, "Can't open Kanji itaijidict file ");
! 	perror(ITAIJIDICT);
  	exit(0);
      }
      for (i = 0; i < 0x80; ++ i) {
  	for (j = 0; j < 0x80; ++ j) {
  	    ittbl1[i][j] = i | 0x80;
--- 43,63 ----
      int i, j;
      char buffer[BUFSIZE];
      unsigned char n1, n2, o1, o2;
+ 
+     char *itaijidictpath;
      
!     itaijidictpath = getenv("ITAIJIDICTPATH");
!     if (itaijidictpath == NULL)
!         itaijidictpath = getenv("ITAIJIDICT");
!     if (itaijidictpath == NULL)
! 	itaijidictpath = ITAIJIDICT;
! 
!     if ((fp = fopen(itaijidictpath, "rb")) == NULL) {
  	fprintf(stderr, "Can't open Kanji itaijidict file ");
! 	perror(itaijidictpath);
  	exit(0);
      }
+ 
      for (i = 0; i < 0x80; ++ i) {
  	for (j = 0; j < 0x80; ++ j) {
  	    ittbl1[i][j] = i | 0x80;


--
  住友林業株式会社  情報システム部   清水 和佳
 
  TEL: +81-3-5322-6672  FAX: +81-3-5322-6658  Niftyserve: XLW01034
  e-mail: <kshimz@xxxxxxxxx>