舞鳴BBSテスト版 注:書き込んだ内容が勝手に変換される場合があります(笑)
新規の話題を投稿すりゅトップページに戻りゅ表掲示板に行きゅ

Back to normal view.

Lynxのbuild成功かなぁ  [この話題にコメント]

投稿者:chagrin 投稿日:2004年12月12日 00時28分46秒

苦節1年以上のさぼり(苦労してないってか)の末に,ようやっとLynxの
Configureがまともに通るようになったようですの.ふぅ...
makeのほうではまだ苦労がつづいていて,utf-8対応(実験機能)に必要な
libiconv組み込みが失敗しちゃうみたいですの.
畠山さんとこから貰ってきたのを使おうとしているのですが,
iconv を呼び出すコードがコンパイル中にWarning吐いて,その通り正しくない結果に
なるらしく,coreゲロ吐いて落ちるんだよなぁ.みゅ〜〜
gcc -S でアセンブラリストを出せる... らしいですのね.ぼちぼち調べてみますですの.

#1:iconv.dll呼び出しは正しそうだが?

投稿者:chagrin 投稿日:2005年02月19日 23時55分48秒

sourceとdestinationが逆向きで見慣れない表現のアセンブラリストを
見た感ぢでは,warning出ちているところは,正ちいコードになっている
ようでちゅ,ちゃんと,ポインタのポインタになってるよ.
utf-8でないページを見ても,何か条件が整えばゲロ吐いてくれまちゅ.
configure --enable-japanese-utf8 と EMX gcc の組み合わしぇで,
iconv.dllとは別の箇所に問題がある気がちてきまちた...
が,しょれが何処だか,trace on ちてみてもしゃっぱりわかんないよ.

#2:trap in iconv.dll

投稿者:chagrin 投稿日:2005年06月07日 03時16分12秒

lynx 2.8.6 dev.12 が出たので,試してみたわ.
やはり,iconv.dll 呼び出しで落ちてしまいまーす☆.
-trace 付きで起動すると,ちゃんと popuplog.os2 に記録が残るわ.
↓こんなの.iconv.dll は巨大なので,xda にかける気がしませんだよ☆.

06-07-2005 03:02:41 SYS3175 PID 3832 TID 0001 Slot 0058
D:\LYNX\LYNX.EXE
c0000005
1e2238c0
P1=00000001 P2=00000003 P3=XXXXXXXX P4=XXXXXXXX
EAX=0297f238 EBX=00130ec8 ECX=0297f294 EDX=00001403
ESI=0000003c EDI=ffffffff
DS=0053 DSACC=d0f3 DSLIM=3fffffff
ES=0053 ESACC=d0f3 ESLIM=3fffffff
FS=150b FSACC=00f3 FSLIM=00000030
GS=0000 GSACC=**** GSLIM=********
CS:EIP=005b:1e2238c0 CSACC=d0df CSLIM=3fffffff
SS:ESP=0053:0297f1cc SSACC=d0f3 SSLIM=3fffffff
EBP=0297f248 FLG=00012202

ICONV.DLL 0001:000838c0

#3:warning

投稿者:あちゃいん 投稿日:2005年06月07日 19時14分06秒

>iconv を呼び出すコードがコンパイル中にWarning吐いて,

のWarningメッセージを提示してもらうのが良いようにゃ気がしますにゃ.

#4:warning message related to iconv.dll

投稿者:chagrin 投稿日:2005年06月07日 23時42分30秒

warning message だけどにゃ,.\src の UCdomap.c で出ますにゃ.こんにゃの.

gcc -I/emx/ncurses/include -I/emx/ncurses/include/ncurses -D__ST_MT_ERRNO__ -D__ST_MT_ERRNO__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -DHAVE_CONFIG_H -DLOCALEDIR=\"/usr/local/share/locale\" -I. -I.. -Ichrtrans -I./chrtrans -I.. -I../src -I../WWW/Library/Implementation -O2 -Zmt -Zmt -c ./UCdomap.c
./UCdomap.c: In function `UCTransUniCharStr':
./UCdomap.c:950: warning: passing arg 2 of `libiconv' from incompatible pointer type

ちにゃみに,lynx の source は http://lynx.isc.org/current/ から入手できるにゃ.
しばらく更新が止まっていたのに,すぐさま dev.13 が出てるよ.MAC OSX がらみかにゃ.

#5:warning

投稿者:あちゃいん 投稿日:2005年06月08日 01時21分03秒

ちょいと見てみましたにゃ.

>./UCdomap.c:950: warning: passing arg 2 of `libiconv' from incompatible pointer type

 rc = iconv(cd, &pin, &inleft, &pout, &outleft);

このpinの部分が[char **]型であるのに対して,iconv.hでの定義は

 ... iconv (iconv_t cd, const char* * inbuf ...

と[const char **]型を要求しているので,warningが出ますにゃ.
でもこのままで問題にゃいにゃい.どうしてもwarningを止めたいにゃらば

 rc = iconv(cd, (const char**)&pin, &inleft, &pout, &outleft);

とpinをキャストしてあげればOKだと思いますにゃ.
(warningは止まりますが根本的にゃ解決ではありませんから気休めだにゃ〜)

で,実際の動作エラーのほうにゃんだけどにゃ,ICONV.DLLの中でエラーしているのは
popuplogから間違いにゃいとして,そうするとiconv()の前の行の

 cd = iconv_open(LYCharSet_UC[charset_out].MIMEname, "UTF-16BE//TRANSLIT");

が成功しているのかどうかが気ににゃりますにゃ.
この関数の戻り値cdが-1ににゃってたりする予感.
# 「"UTF-16BE//TRANSLIT"」って有効にゃのかにゃぁ….

何を疑っているのかというと,iconv()によるコード変換の流れ

1. iconv_open()でコンバージョンテーブルを用意
2. iconv()が用意されたにゃテーブルでコード変換
3. iconv_close()で後始末

の1が失敗してテーブルが用意出来にゃかったにもかかわらず
そのまま2に突入してあぼーんしているんじゃにゃいかってことだにゃ〜.
畠山さんのqpのソースコードkconv.cにゃんかは真面目にエラーチェックしてまして,

1. iconv_open()でコンバージョンテーブルを用意
2-a. テーブルが用意できたらiconv()でコード変換
2-b. テーブルが用意できにゃかったらstrcpyで変換無しにまるごとコピー
...

という風ににゃってるにょ.

#6:iconv_open failure

投稿者:chagrin 投稿日:2005年06月08日 04時41分33秒

const の意味するところを知りませんが,アセンブラリストをみる限りでは
ちゃんとポインタのポインタになっているので,とりあえず放置しておくーみたいなー.

> cd = iconv_open(LYCharSet_UC[charset_out].MIMEname,
>"UTF-16BE//TRANSLIT");
>が成功しているのかどうかが気ににゃりますにゃ.

cd = iconv_open(LYCharSet_UC[charset_out].MIMEname,
"UTF-16BE//TRANSLIT");
CTRACE((tfp,
"iconv.dll translate table pointer is (%ld).\n", cd));
rc = iconv(cd, &pin, &inleft, &pout, &outleft);

こう変更して,-trace 付きで試してみましたみたいなー.で,Lynx.trace の末尾.
iconv.dll translate table pointer is (-1).
う〜みゅ,大正解ですねぇ.
さて,どうすると良いのでしょうって感じー? 単純に"UTF-16BE"とかって感じー?

#7:i-昆布

投稿者:あちゃいん 投稿日:2005年06月08日 09時53分10秒

>う〜みゅ,大正解ですねぇ.

う〜みゅ,さすがオレ(笑)

えと,畠山さんのlibiconvバイナリって1.4でしたよにゃ.
最新のlibiconv 1.9.2を拾ってきてChangelogを見てみたんですけど,
「//TRANSLIT」の対応は2000/11/18つまりlibiconv 1.4のリリース後に
盛り込まれてるにゃ.つまりLynxはそれ以降のlibiconvを想定していると.

にゃので対策としては
1. 新しいlibiconvを自分でビルドして使う
2. 「//TRANSLIT」を削って古いlibiconvでも使えるようにする
のいずれかににゃると思いますにゃ.

あとlibiconv/2関係でUnicodeを扱うときに注意しにゃいといけにゃい点として,
変換できにゃい字にぶち当たったにゃ場合の配慮が必要にゃことだにゃ〜.
丸付き数字にゃどはもちろん,「~」にゃども変換に失敗しますにゃ.
# 畠山さんのqp 2.4における変更履歴を参照
この場合iconv()はその手前の文字までを変換したところで中断され,
関数値として-1を返すようだにゃ〜.にゃので,畠山さんがqpで採ったにゃ作戦のように

rc = iconv(cd, &pin, &inleft, &pout, &outleft);

の部分を

while (*pin != '\0') { /* 文字列の終端までiconvを繰り返す */
  if (iconv(cd, &pin, &inleft, &pout, &outleft) == -1) {
    /* 変換不可能にゃ文字はそのままコピー */
    *pout++ = *pin++ ;
    inleft -= 1 ;
    outleft -= 1 ;
  }
}

のようにしてやる必要があるようにゃ気がしますにゃ.

#8:i昆布の出汁取れた

投稿者:chagrin 投稿日:2005年06月08日 18時36分11秒

utf-8なぺえじが表示できるようになりましたみたいなー!
ありがとうございまーすみたいなー,あちゃいんさま.
詳しい報告はまたみたいなー後で...

#9:ctermid problem of lynx 2.8.6dev14

投稿者:chagrin 投稿日:2005年10月18日 23時52分11秒

Lynx 2.8.dev.14 が出たので,早速 configure & make したのですが.
make の最終段,link で失敗してしまいますですの.

意訳:「ctermid がライブラリに見つかりませんですの」そうですの.
標準入力から制御する機能が入ったらしげで,その関連コードなのでしょう.
emx gcc では,普通にコンパイルは通る(簡単なテストコードでも試しましたですの)が,
リンクすることは出来ませんですの.

とりあえず,そこはコメントアウトしてお茶を濁してありますですの.
| term_name = ctermid(NULL)
emx の環境設定が悪いのか,そういうものなのか...
OS/2 だと /dev/con か con を返しそうなものですが...

LYUtils.c 1533 にて使われていますですの.う〜みゅ.

#10:ctermid

投稿者:あちゃいん 投稿日:2005年10月19日 14時49分41秒

emx/gccのinclude\stdio.hを開いて"ctermid"を検索してみてくださいにゃ.
コメントアウトされてますでしょ.つまりemx/gccではctermid()は未サポート.
gcc355も同様.

にゃので,解決法方としては
 1. ctermid()を使わにゃいようにする
 2. ダミーのctermid()を自前で用意する
しかにゃいのだけどにゃ,コードを見る限り問題の部分は #ifdef HAVE_TTYNAME 〜 #endif
で囲われているので,このLynxに関してはおそらくconfigureで「1.使わにゃい」
設定を行うのが筋にゃんだろうと想像しますにゃ.あたしゃconfigureについては無知にゃので
よく分かりませんが,config.hinを見るに,lynx_cfg.hてにゃファイルが作成されてて
その中に #define HAVE_TTYNAME にゃんて行があったりしませんかにゃ〜?


ちにゃみにLYUtils.cのコンパイルが通ってリンクでエラーするのは,
Cはそういうものだから…ってことで.(C++はもちっとマシ)
Cでは未定義の関数を呼び出すだけにゃらエラーににゃらにゃいんす.
たとえば
==== test.c ========
int main()
{
  chagrin();
}
==== test.c ========
にゃんてファイルをコンパイル (gcc -c test.c) しても通っちゃいますにゃ.
コンパイル段階では勝手に「きっとどこかに int chagrin() という関数の
実体があるのだろう」と看做してくれちゃうわけだにゃ〜.
んでいざリンク時 (gcc -o test.exe test.o) に初めて「どこかにあるだろうと
思っていたが,やっぱり無かったにゃ」つーわけでエラーににゃりますにゃ.

#11

投稿者:chagrin 投稿日:2005年10月19日 20時18分04秒

うきゅ〜☆int chagrin(); /* 何が返ってくるのだろう(笑) */
stdio.h をみて,変だなぁとは思いましたですぅ.

Because "ctermid" function is not supported undex emx/gcc,
LYUtils.c is compiled successful, fails to link with "unknown name" error.

lynx_cfg.h に #define HAVE_TTYNAME 1 が設定されていますぅ.
ちゃんと,configure の時に ttyname が使えるかぁ調べていたですぅ気がしますぅ.
数ある方法の内どれかで,標準入力のハンドルを知ることが出来ればいい,
ように見えるので,解決方法はこんなところでしょうかぁ.

What should I do is that I send a request to establish a new keyword
like "HAVE_CTERMID" to check at the configuration time,
in order to avoid linkage failure under OS/2 emx/gcc.

で,これをMLに向けて流すのかぁ... はぁ,がんばってみますぅ.
再び,有り難うございましたですぅ.

#12:いちど

投稿者:あちゃいん 投稿日:2005年10月20日 02時35分56秒

澤田石さんあたりに相談してみてはにゃ〜?
うにににっくす系につおい燭砲稷にゃら「そのばやいはこうすべし」
とか的確にゃ回答を持ってそうにゃ気がしますにゃ.

おいらは澤田石さんの移植したにゃソフトのドキュメントすら
理解不能にゃうにににっくす難民だにゃ〜(汗)


Back to normal view.
MyNARI BBS version 1.0.1 (C)2003-2007 Achain