From: "NARUSE, Yui" Date: 2007-12-24T15:30:18+09:00 Subject: [ruby-dev:32701] Re: ISO-2022-JP output for transcode This is a multi-part message in MIME format. --------------010102010008060805020602 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 成瀬です。 ISO-2022-JP の入力を加えたパッチです。これもまだすべて transcode.c に つっこんでいます。 Martin Duerst wrote: > At 13:04 07/12/24, Nobuyoshi Nakada wrote: >> At Mon, 24 Dec 2007 10:10:28 +0900, >> NARUSE, Yui wrote in [ruby-dev:32695]: >>> transcode を ISO-2022-JP の出力に対応させるパッチを書いてみました。同様 >>> に preprocessor で入力にも対応できますし、ISO-2022-JP 以外の ISO/IEC >>> 2022 シリーズにも対応できるようになっています。 >> できれば、transcode_data_japanese.cのほうにお願いしたいです。 > > これは自動的に作成しているので、余り好ましくないです。でも > (下のようにたいてありますように) 未だ変更する予定なので、 > こちらでもいいです。 transcode_data_japanese.c は自動生成な気がしたのと、transcode.c の構造体 に依存しているので、下手に分けずにとりあえず transcode.c に入れておきま した。 transcoding と transcoder を transcode_data.h いれればいいのですかね。作 業しつつとりあえずこの状態で投稿しておきます。 >>> とりあえずクリ >>> スマスリリースに入れる程度の品質は出ると思いますがいかがでしょう。 > > リリースにいれていいですが、明日とか明後日当たりで HEAD でまだ取り出し、 > 違う方針でよかったらいいですよ。 とりあえず 1.9.1 でも ISO-2022-JP が動いてほしかったからなので、それで結 構です。 >> # transcode_data_one_byte.cという名前はわかりにくいので、 >> # japanese.cと同じ伝でいえばeuropean.cかなぁと思ったりしますが。 > > こちらでもそう思いましたが、iso-8859-6 はアラビア語で、iso-8859-8 > はヘブライ語で、iso-8859-11 はタイ語で、どちらともヨーロッパと > 縁が薄いです。しばらくそのままいいではないでしょうか。 iso_8859.c じゃないかなぁと。 >> * MAX_TRANSCODERSの制限をなくす >> # というか、このパッチだとオーバーしてませんか? > > 外してもいいですが、余り大きな変更はしない方がいいと思います。 オーバーしていますね。 >> * transcode_data_*.cを拡張ライブラリ形式にする。 >> 必要な構造体とプロトタイプをヘッダに入れて、各transcoderでは >> Init関数を追加することになります。 > > こちらでは次のように考えました: > - transcoder の登録を transcode.c に残す。 > - 登録の際、ファイル名も登録する。 > (例: > register_transcoder("ISO-8859-1", "UTF-8", &rb_from_ISO_8859_1, 2, 0); > の変わり > register_transcoder("ISO-8859-1", "UTF-8", &rb_from_ISO_8859_1, 2, 0, "transcode_data_one_byte"); > - transcoder が呼ばれたら、データのファイルをロードする。 一応参考までに他の実装ですが、 Citrus iconv は 文字コードの一覧を # EUC EUC-CN EUC/EUC-CN.esdb EUC-JP EUC/EUC-JP.esdb EUC-JP-MS EUC/EUC-JP-MS.esdb EUC-KR EUC/EUC-KR.esdb EUC-TW EUC/EUC-TW.esdb という形で持っておいて、呼ばれたら読みに行っていたような。 Perl/Encode は拡張ライブラリ方式でした。ある拡張ライブラリを読み込むと、 それが対応している文字コードの変換がサポートされます。そして、デフォルト で読み込む、文字コード変換拡張ライブラリをいくつか登録されていました。 (デフォルトで読み込む文字コード変換ライブラリはユーザが後で追加可能) Martin さんが考えていらっしゃるのはおそらく Citrus に近い方式で、なかだ さんが考えていらっしゃるのは Perl/Encode に近い方式でしょうか。Citrus 方 式だと各変換を最適化しやすく、Perl/Encode はモジュールの追加がしやすかっ たように記憶しています。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA --------------010102010008060805020602 Content-Type: text/plain; name="iso_2022_jp.r2.txt" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="iso_2022_jp.r2.txt" SW5kZXg6IHRyYW5zY29kZS5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gdHJhbnNjb2RlLmMJKIOK g3KDV4OHg5MgMTQ1NzYpDQorKysgdHJhbnNjb2RlLmMJKI3si8aDUoNzgVspDQpAQCAtNjMs MTkgKzYzLDMxIEBADQogDQogLyogZGVjbGFyYXRpb25zIHByb2JhYmx5IG5lZWQgdG8gZ28g aW50byBzZXBhcmF0ZSBoZWFkZXIgZmlsZSwgZS5nLiB0cmFuc2NvZGUuaCAqLw0KIA0KKy8q IGR5bmFtaWMgc3RydWN0dXJlLCBvbmUgcGVyIGNvbnZlcnNpb24gKHNpbWlsYXIgdG8gaWNv bnZfdCkgKi8NCisvKiBtYXkgY2FycnkgY29udmVyc2lvbiBzdGF0ZSAoZS5nLiBmb3IgaXNv LTIwMjItanApICovDQordHlwZWRlZiBzdHJ1Y3QgdHJhbnNjb2Rpbmcgew0KKyAgICBWQUxV RSBydWJ5X3N0cmluZ19kZXN0OyAvKiB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlIGNvbnZlcnNp b24gZGVzdGluYXRpb24sDQorCQkJICAgICAgIG9yIE5VTEwgaWYgc29tZXRoaW5nIGVsc2Ug aXMgYmVpbmcgY29udmVydGVkICovDQorICAgIGNoYXIgKigqZmx1c2hfZnVuYykoc3RydWN0 IHRyYW5zY29kaW5nKiwgaW50LCBpbnQpOw0KK30gdHJhbnNjb2Rpbmc7DQorDQogLyogc3Rh dGljIHN0cnVjdHVyZSwgb25lIHBlciBzdXBwb3J0ZWQgZW5jb2RpbmcgcGFpciAqLw0KLXR5 cGVkZWYgc3RydWN0IHsNCit0eXBlZGVmIHN0cnVjdCB0cmFuc2NvZGVyX3N0ew0KICAgICBj b25zdCBjaGFyICpmcm9tX2VuY29kaW5nOw0KICAgICBjb25zdCBjaGFyICp0b19lbmNvZGlu ZzsNCiAgICAgY29uc3QgQllURV9MT09LVVAgKmNvbnZfdHJlZV9zdGFydDsNCiAgICAgaW50 IG1heF9vdXRwdXQ7DQogICAgIGludCBmcm9tX3V0Zjg7DQorICAgIHZvaWQgKCpwcmVwcm9j ZXNzb3IpKGNoYXIqKiwgY2hhcioqLCBjaGFyKiwgY2hhciosDQorCQkJCXN0cnVjdCB0cmFu c2NvZGVyX3N0ICp0cmFuc2NvZGVyLCBzdHJ1Y3QgdHJhbnNjb2RpbmcqKTsNCisgICAgdm9p ZCAoKnBvc3Rwcm9jZXNzb3IpKGNoYXIqKiwgY2hhcioqLCBjaGFyKiwgY2hhciosDQorCQkJ CSBzdHJ1Y3QgdHJhbnNjb2Rlcl9zdCAqdHJhbnNjb2Rlciwgc3RydWN0IHRyYW5zY29kaW5n Kik7DQogfSB0cmFuc2NvZGVyOw0KIA0KIC8qIHRvZG86IGR5bmFtaWMgc3RydWN0dXJlLCBv bmUgcGVyIGNvbnZlcnNpb24gKHN0cmVhbSkgKi8NCiANCiAvKiBpbiB0aGUgZnV0dXJlLCBh ZGQgc29tZSBtZWNoYW5pc20gZm9yIGR5bmFtaWNhbGx5IGFkZGluZyBzdHVmZiBoZXJlICov DQotI2RlZmluZSBNQVhfVFJBTlNDT0RFUlMgMzMgIC8qIHRvZG86IGZpeDogdGhpcyBudW1i ZXIgaGFzIHRvIGJlIGFkanVzdGVkIGJ5IGhhbmQgKi8NCisjZGVmaW5lIE1BWF9UUkFOU0NP REVSUyAzNSAgLyogdG9kbzogZml4OiB0aGlzIG51bWJlciBoYXMgdG8gYmUgYWRqdXN0ZWQg YnkgaGFuZCAqLw0KIHN0YXRpYyB0cmFuc2NvZGVyIHRyYW5zY29kZXJfdGFibGVbTUFYX1RS QU5TQ09ERVJTXTsNCiANCiAvKiBub3Qgc3VyZSB3aHkgaXQncyBub3QgcG9zc2libGUgdG8g ZG8gcmVsb2NhdGFibGUgaW5pdGlhbGl6YXRpb25zICovDQpAQCAtMTAwLDYgKzExMiwyMzYg QEANCiB9DQogDQogc3RhdGljIHZvaWQNCityZWdpc3Rlcl9mdW5jdGlvbmFsX3RyYW5zY29k ZXIoY29uc3QgY2hhciAqZnJvbV9lLCBjb25zdCBjaGFyICp0b19lLA0KKyAgICBjb25zdCBC WVRFX0xPT0tVUCAqdHJlZV9zdGFydCwgaW50IG1heF9vdXRwdXQsIGludCBmcm9tX3V0Zjgs DQorICAgIHZvaWQgKCpwcmVwcm9jZXNzb3IpKGNoYXIqKiwgY2hhcioqLCBjaGFyKiwgY2hh ciosIHRyYW5zY29kZXIqLCB0cmFuc2NvZGluZyopLA0KKyAgICB2b2lkICgqcG9zdHByb2Nl c3NvcikoY2hhcioqLCBjaGFyKiosIGNoYXIqLCBjaGFyKiwgdHJhbnNjb2RlciosIHRyYW5z Y29kaW5nKikpDQorew0KKyAgICBzdGF0aWMgaW50IG4gPSAwOw0KKyAgICBpZiAobiA+PSBN QVhfVFJBTlNDT0RFUlMpIHsNCisJLyogd2UgYXJlIGluaXRpYWxpemluZywgaXMgaXQgb2th eSB0byB1c2UgcmJfcmFpc2UgaGVyZT8gKi8NCisJcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJv ciAvKmNoYW5nZSBleGNlcHRpb24qLywgIm5vdCBlbm91Z2ggdHJhbnNjb2RlciBzbG90cyIp Ow0KKyAgICB9DQorICAgIHRyYW5zY29kZXJfdGFibGVbbl0uZnJvbV9lbmNvZGluZyA9IGZy b21fZTsNCisgICAgdHJhbnNjb2Rlcl90YWJsZVtuXS50b19lbmNvZGluZyA9IHRvX2U7DQor ICAgIHRyYW5zY29kZXJfdGFibGVbbl0uY29udl90cmVlX3N0YXJ0ID0gdHJlZV9zdGFydDsN CisgICAgdHJhbnNjb2Rlcl90YWJsZVtuXS5tYXhfb3V0cHV0ID0gbWF4X291dHB1dDsNCisg ICAgdHJhbnNjb2Rlcl90YWJsZVtuXS5mcm9tX3V0ZjggPSBmcm9tX3V0Zjg7DQorICAgIHRy YW5zY29kZXJfdGFibGVbbl0uY29udl90cmVlX3N0YXJ0ID0gdHJlZV9zdGFydDsNCisgICAg dHJhbnNjb2Rlcl90YWJsZVtuXS5wcmVwcm9jZXNzb3IgPSBwcmVwcm9jZXNzb3I7DQorICAg IHRyYW5zY29kZXJfdGFibGVbbl0ucG9zdHByb2Nlc3NvciA9IHBvc3Rwcm9jZXNzb3I7DQor DQorICAgIG4rKzsNCit9DQorDQorI2RlZmluZSBJU09fMjAyMl9FTkNPRElORyhlc2NzZXEs IGJ5dGUpICgoZXNjc2VxPDw4KXxieXRlKQ0KK2VudW0gSVNPXzIwMjJfRVNDU0VRIHsNCisg ICAgSVNPXzIwMjJfQ1pEICAgPSAnIScsDQorICAgIElTT18yMDIyX0MxRCAgID0gJyInLA0K KyAgICBJU09fMjAyMl9HWkQ0ICA9ICcoJywNCisgICAgSVNPXzIwMjJfRzFENCAgPSAnKScs DQorICAgIElTT18yMDIyX0cyRDQgID0gJyonLA0KKyAgICBJU09fMjAyMl9HM0Q0ICA9ICcr JywNCisgICAgSVNPXzIwMjJfRzFENiAgPSAnLScsDQorICAgIElTT18yMDIyX0cyRDYgID0g Jy4nLA0KKyAgICBJU09fMjAyMl9HM0Q2ICA9ICcvJywNCisgICAgSVNPXzIwMjJfR1pETTQg PSBJU09fMjAyMl9FTkNPRElORygnJCcsJygnKSwNCisgICAgSVNPXzIwMjJfRzFETTQgPSBJ U09fMjAyMl9FTkNPRElORygnJCcsJyknKSwNCisgICAgSVNPXzIwMjJfRzJETTQgPSBJU09f MjAyMl9FTkNPRElORygnJCcsJyonKSwNCisgICAgSVNPXzIwMjJfRzNETTQgPSBJU09fMjAy Ml9FTkNPRElORygnJCcsJysnKSwNCisgICAgSVNPXzIwMjJfRzFETTYgPSBJU09fMjAyMl9F TkNPRElORygnJCcsJy0nKSwNCisgICAgSVNPXzIwMjJfRzJETTYgPSBJU09fMjAyMl9FTkNP RElORygnJCcsJy4nKSwNCisgICAgSVNPXzIwMjJfRzNETTYgPSBJU09fMjAyMl9FTkNPRElO RygnJCcsJy8nKSwNCisgICAgSVNPXzIwMjJfRE9DUyAgPSBJU09fMjAyMl9FTkNPRElORygn JScsJ0knKSwNCisgICAgSVNPXzIwMjJfSVJSICAgPSAnJicNCit9Ow0KKw0KKw0KKyNkZWZp bmUgSVNPXzIwMjJfR1pfQVNDSUkJCQlJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkQ0 LCAnQicpDQorI2RlZmluZSBJU09fMjAyMl9HWl9KSVNfWF8wMjAxX0thdGFrYW5hCQlJU09f MjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkQ0LCAnSScpDQorI2RlZmluZSBJU09fMjAyMl9H Wl9KSVNfWF8wMjAxX1JvbWFuCQlJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkQ0LCAn SicpDQorI2RlZmluZSBJU09fMjAyMl9HWl9KSVNfQ182MjI2XzE5NzgJCUlTT18yMDIyX0VO Q09ESU5HKElTT18yMDIyX0daRE00LCdAJykNCisjZGVmaW5lIElTT18yMDIyX0daX0pJU19Y XzAyMDhfMTk4MwkJSVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pETTQsJ0InKQ0KKyNk ZWZpbmUgSVNPXzIwMjJfR1pfSklTX1hfMDIxMl8xOTkwCQlJU09fMjAyMl9FTkNPRElORyhJ U09fMjAyMl9HWkRNNCwnRCcpDQorI2RlZmluZSBJU09fMjAyMl9HWl9KSVNfWF8wMjEzXzIw MDBfMQkJSVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pETTQsJ08nKQ0KKyNkZWZpbmUg SVNPXzIwMjJfR1pfSklTX1hfMDIxM18yMDAwXzIJCUlTT18yMDIyX0VOQ09ESU5HKElTT18y MDIyX0daRE00LCdQJykNCisjZGVmaW5lIElTT18yMDIyX0daX0pJU19YXzAyMTNfMjAwNF8x CQlJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkRNNCwnUScpDQorDQorc3RhdGljIGlu dA0KK2dldF9pc29fMjAyMl9tb2RlKGNoYXIgKippbl9wb3MpDQorew0KKyAgICBpbnQgbmV3 X21vZGU7DQorICAgIGNoYXIgKmluX3AgPSAqaW5fcG9zOw0KKyAgICBzd2l0Y2ggKCppbl9w KyspDQorICAgIHsNCisgICAgY2FzZSAnKCc6DQorCXN3aXRjaCAoKmluX3ArKykNCisJew0K KwljYXNlICdCJzogY2FzZSAnSSc6IGNhc2UgJ0onOg0KKwkgICAgbmV3X21vZGUgPSBJU09f MjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkQ0LCAqKGluX3AtMSkpOw0KKwkgICAgYnJlYWs7 DQorCWRlZmF1bHQ6DQorCSAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yIC8qY2hhbmdl IGV4Y2VwdGlvbiovLCAidGhpcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgKEVTQyAoICVjKSIs ICooaW5fcC0xKSk7DQorCSAgICBicmVhazsNCisJfQ0KKwlicmVhazsNCisgICAgY2FzZSAn JCc6DQorCXN3aXRjaCAoKmluX3ArKykNCisJew0KKwljYXNlICdAJzogY2FzZSAnQSc6IGNh c2UgJ0InOg0KKwkgICAgbmV3X21vZGUgPSBJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9H WkRNNCwgKihpbl9wLTEpKTsNCisJICAgIGJyZWFrOw0KKwljYXNlICcoJzoNCisJICAgIHN3 aXRjaCAoKmluX3ArKykNCisJICAgIHsNCisJICAgIGNhc2UgJ0QnOiBjYXNlICdPJzogY2Fz ZSAnUCc6IGNhc2UgJ1EnOg0KKwkJbmV3X21vZGUgPSBJU09fMjAyMl9FTkNPRElORyhJU09f MjAyMl9HWkRNNCwgKihpbl9wLTEpKTsNCisJCWJyZWFrOw0KKwkgICAgZGVmYXVsdDoNCisJ CXJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IgLypjaGFuZ2UgZXhjZXB0aW9uKi8sICJ0aGlz IG1vZGUgaXMgbm90IHN1cHBvcnRlZCAoRVNDICQgKCAlYykiLCAqKGluX3AtMSkpOw0KKwkJ YnJlYWs7DQorCSAgICB9DQorCSAgICBicmVhazsNCisJZGVmYXVsdDoNCisJICAgIHJiX3Jh aXNlKHJiX2VSdW50aW1lRXJyb3IgLypjaGFuZ2UgZXhjZXB0aW9uKi8sICJ0aGlzIG1vZGUg aXMgbm90IHN1cHBvcnRlZCAoRVNDICQgJWMpIiwgKihpbl9wLTEpKTsNCisJICAgIGJyZWFr Ow0KKwl9DQorCWJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKwkgICAgcmJfcmFpc2UocmJfZVJ1 bnRpbWVFcnJvciAvKmNoYW5nZSBleGNlcHRpb24qLywgInRoaXMgbW9kZSBpcyBub3Qgc3Vw cG9ydGVkIChFU0MgJWMpIiwgKihpbl9wLTEpKTsNCisJYnJlYWs7DQorICAgIH0NCisgICAg KmluX3BvcyA9IGluX3A7DQorICAgIHJldHVybiBuZXdfbW9kZTsNCit9DQorDQorc3RhdGlj IHZvaWQNCitmcm9tX2lzb18yMDIyX2pwX3RyYW5zY29kZXJfcHJlcHJvY2Vzc29yKGNoYXIg Kippbl9wb3MsIGNoYXIgKipvdXRfcG9zLA0KKwkJCQkgICAgIGNoYXIgKmluX3N0b3AsIGNo YXIgKm91dF9zdG9wLA0KKwkJCQkgICAgIHRyYW5zY29kZXIgKm15X3RyYW5zY29kZXIsDQor CQkJCSAgICAgdHJhbnNjb2RpbmcgKm15X3RyYW5zY29kaW5nKQ0KK3sNCisgICAgY2hhciAq aW5fcCA9ICppbl9wb3MsICpvdXRfcCA9ICpvdXRfcG9zOw0KKyAgICBpbnQgY3VyX21vZGUg PSBJU09fMjAyMl9HWl9BU0NJSTsNCisgICAgdW5zaWduZWQgY2hhciBjMTsNCisgICAgY2hh ciAqb3V0X3MgPSBvdXRfc3RvcCAtIG15X3RyYW5zY29kZXItPm1heF9vdXRwdXQgKyAxOw0K KyAgICB3aGlsZSAoaW5fcCA8IGluX3N0b3ApIHsNCisJaWYgKG91dF9wID49IG91dF9zKSB7 DQorCSAgICBpbnQgbGVuID0gKG91dF9wIC0gKm91dF9wb3MpOw0KKwkgICAgaW50IG5ld19s ZW4gPSAobGVuICsgbXlfdHJhbnNjb2Rlci0+bWF4X291dHB1dCkgKiAyOw0KKwkgICAgKm91 dF9wb3MgPSAoKm15X3RyYW5zY29kaW5nLT5mbHVzaF9mdW5jKShteV90cmFuc2NvZGluZywg bGVuLCBuZXdfbGVuKTsNCisJICAgIG91dF9wID0gKm91dF9wb3MgKyBsZW47DQorCSAgICBv dXRfcyA9ICpvdXRfcG9zICsgbmV3X2xlbiAtIG15X3RyYW5zY29kZXItPm1heF9vdXRwdXQ7 DQorCX0NCisJYzEgPSAqaW5fcCsrOw0KKwlpZiAoYzEgPT0gMHgxQikgew0KKwkgICAgY3Vy X21vZGUgPSBnZXRfaXNvXzIwMjJfbW9kZSgmaW5fcCk7DQorCX0gZWxzZSBpZiAoYzEgPT0g MHgxRSB8fCBjMSA9PSAweDFGKSB7DQorCSAgICAvKiBTSElGVCAqLw0KKwkgICAgcmJfcmFp c2UocmJfZVJ1bnRpbWVFcnJvciAvKmNoYW5nZSBleGNlcHRpb24qLywgInNoaWZ0IGlzIG5v dCBzdXBwb3J0ZWQiKTsNCisJfSBlbHNlIGlmIChjMSA+PSAweDgwKSB7DQorCSAgICByYl9y YWlzZShyYl9lUnVudGltZUVycm9yIC8qY2hhbmdlIGV4Y2VwdGlvbiovLCAiaWxsZWdhbCBi eXRlIHNlcXVlbmNlIik7DQorCX0gZWxzZSB7DQorCSAgICBzd2l0Y2ggKGN1cl9tb2RlKSB7 DQorCSAgICBjYXNlIElTT18yMDIyX0daX0FTQ0lJOg0KKwkgICAgY2FzZSBJU09fMjAyMl9H Wl9KSVNfWF8wMjAxX1JvbWFuOg0KKwkJKm91dF9wKysgPSBjMTsNCisJCWJyZWFrOw0KKwkg ICAgY2FzZSBJU09fMjAyMl9HWl9KSVNfWF8wMjAxX0thdGFrYW5hOg0KKwkJKm91dF9wKysg PSAweDhFOw0KKwkJKm91dF9wKysgPSBjMSB8IDB4ODA7DQorCQlicmVhazsNCisJICAgIGNh c2UgSVNPXzIwMjJfR1pfSklTX1hfMDIxMl8xOTkwOg0KKwkJKm91dF9wKysgPSAweDhGOw0K KwkgICAgY2FzZSBJU09fMjAyMl9HWl9KSVNfQ182MjI2XzE5Nzg6DQorCSAgICBjYXNlIElT T18yMDIyX0daX0pJU19YXzAyMDhfMTk4MzoNCisJCSpvdXRfcCsrID0gYzEgfCAweDgwOw0K KwkJKm91dF9wKysgPSAqaW5fcCsrIHwgMHg4MDsNCisJCWJyZWFrOw0KKwkgICAgfQ0KKwl9 DQorICAgIH0NCisgICAgLyogY2xlYW51cCAqLw0KKyAgICAqaW5fcG9zICA9IGluX3A7DQor ICAgICpvdXRfcG9zID0gb3V0X3A7DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitzZWxlY3RfaXNv XzIwMjJfbW9kZShjaGFyICoqb3V0X3BvcywgaW50IG5ld19tb2RlKQ0KK3sNCisgICAgY2hh ciAqb3V0X3AgPSAqb3V0X3BvczsNCisgICAgKm91dF9wKysgPSAnXGUnOw0KKyAgICBzd2l0 Y2ggKG5ld19tb2RlPj44KQ0KKyAgICB7DQorICAgIGNhc2UgSVNPXzIwMjJfR1pENDoNCisJ Km91dF9wKysgPSBuZXdfbW9kZSA+PiA4Ow0KKwkqb3V0X3ArKyA9IG5ld19tb2RlICYgMHg3 RjsNCisJYnJlYWs7DQorICAgIGNhc2UgSVNPXzIwMjJfR1pETTQ6DQorCSpvdXRfcCsrID0g bmV3X21vZGUgPj4gMTY7DQorCWlmICgobmV3X21vZGUgJiAweDdGKSAhPSAnQCcgJiYNCisJ ICAgIChuZXdfbW9kZSAmIDB4N0YpICE9ICdBJyAmJg0KKwkgICAgKG5ld19tb2RlICYgMHg3 RikgIT0gJ0InKQ0KKwl7DQorCSAgICAqb3V0X3ArKyA9IChuZXdfbW9kZT4+OCkgJiAweDdG Ow0KKwl9DQorCSpvdXRfcCsrID0gbmV3X21vZGUgJiAweDdGOw0KKwlicmVhazsNCisgICAg ZGVmYXVsdDoNCisJcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciAvKmNoYW5nZSBleGNlcHRp b24qLywgInRoaXMgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLiIpOw0KKwlicmVhazsNCisgICAg fQ0KKyAgICAqb3V0X3BvcyA9IG91dF9wOw0KKyAgICByZXR1cm4gbmV3X21vZGU7DQorfQ0K Kw0KK3N0YXRpYyB2b2lkDQordG9faXNvXzIwMjJfanBfdHJhbnNjb2Rlcl9wb3N0cHJvY2Vz c29yKGNoYXIgKippbl9wb3MsIGNoYXIgKipvdXRfcG9zLA0KKwkJCQkgICAgIGNoYXIgKmlu X3N0b3AsIGNoYXIgKm91dF9zdG9wLA0KKwkJCQkgICAgIHRyYW5zY29kZXIgKm15X3RyYW5z Y29kZXIsDQorCQkJCSAgICAgdHJhbnNjb2RpbmcgKm15X3RyYW5zY29kaW5nKQ0KK3sNCisg ICAgY2hhciAqaW5fcCA9ICppbl9wb3MsICpvdXRfcCA9ICpvdXRfcG9zOw0KKyAgICBpbnQg Y3VyX21vZGUgPSBJU09fMjAyMl9HWl9BU0NJSSwgbmV3X21vZGUgPSAwOw0KKyAgICB1bnNp Z25lZCBjaGFyIG5leHRfYnl0ZTsNCisgICAgY2hhciAqb3V0X3MgPSBvdXRfc3RvcCAtIG15 X3RyYW5zY29kZXItPm1heF9vdXRwdXQgKyAxOw0KKyAgICB3aGlsZSAoaW5fcCA8IGluX3N0 b3ApIHsNCisJaWYgKG91dF9wID49IG91dF9zKSB7DQorCSAgICBpbnQgbGVuID0gKG91dF9w IC0gKm91dF9wb3MpOw0KKwkgICAgaW50IG5ld19sZW4gPSAobGVuICsgbXlfdHJhbnNjb2Rl ci0+bWF4X291dHB1dCkgKiAyOw0KKwkgICAgKm91dF9wb3MgPSAoKm15X3RyYW5zY29kaW5n LT5mbHVzaF9mdW5jKShteV90cmFuc2NvZGluZywgbGVuLCBuZXdfbGVuKTsNCisJICAgIG91 dF9wID0gKm91dF9wb3MgKyBsZW47DQorCSAgICBvdXRfcyA9ICpvdXRfcG9zICsgbmV3X2xl biAtIG15X3RyYW5zY29kZXItPm1heF9vdXRwdXQ7DQorCX0NCisJbmV4dF9ieXRlID0gKmlu X3ArKzsNCisJaWYgKG5leHRfYnl0ZSA8IDB4ODApIHsNCisJICAgIG5ld19tb2RlID0gSVNP XzIwMjJfR1pfQVNDSUk7DQorCX0gZWxzZSBpZiAobmV4dF9ieXRlID09IDB4OEUpIHsNCisJ ICAgIG5ld19tb2RlID0gSVNPXzIwMjJfR1pfSklTX1hfMDIwMV9LYXRha2FuYTsNCisJICAg IG5leHRfYnl0ZSA9ICppbl9wKys7DQorCX0gZWxzZSBpZiAobmV4dF9ieXRlID09IDB4OEYp IHsNCisJICAgIG5ld19tb2RlID0gSVNPXzIwMjJfR1pfSklTX1hfMDIxMl8xOTkwOw0KKwkg ICAgbmV4dF9ieXRlID0gKmluX3ArKzsNCisJfSBlbHNlIHsNCisJICAgIG5ld19tb2RlID0g SVNPXzIwMjJfR1pfSklTX1hfMDIwOF8xOTgzOw0KKwl9DQorCWlmIChjdXJfbW9kZSAhPSBu ZXdfbW9kZSkNCisJICAgIGN1cl9tb2RlID0gc2VsZWN0X2lzb18yMDIyX21vZGUoJm91dF9w LCBuZXdfbW9kZSk7DQorCWlmIChjdXJfbW9kZSA8IDB4RkZGRikgew0KKwkgICAgKm91dF9w KysgPSBuZXh0X2J5dGUgJiAweDdGOw0KKwl9IGVsc2Ugew0KKwkgICAgKm91dF9wKysgPSBu ZXh0X2J5dGUgJiAweDdGOw0KKwkgICAgKm91dF9wKysgPSAqaW5fcCsrICYgMHg3RjsNCisJ fQ0KKyAgICB9DQorICAgIGlmIChjdXJfbW9kZSAhPSBJU09fMjAyMl9HWl9BU0NJSSkNCisJ Y3VyX21vZGUgPSBzZWxlY3RfaXNvXzIwMjJfbW9kZSgmb3V0X3AsIElTT18yMDIyX0daX0FT Q0lJKTsNCisgICAgLyogY2xlYW51cCAqLw0KKyAgICAqaW5fcG9zICA9IGluX3A7DQorICAg ICpvdXRfcG9zID0gb3V0X3A7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQogaW5pdF90cmFuc2Nv ZGVyX3RhYmxlKHZvaWQpDQogew0KICAgICByZWdpc3Rlcl90cmFuc2NvZGVyKCJJU08tODg1 OS0xIiwgICJVVEYtOCIsICZyYl9mcm9tX0lTT184ODU5XzEsIDIsIDApOw0KQEAgLTEzNSw2 ICszNzcsMTAgQEANCiAgICAgcmVnaXN0ZXJfdHJhbnNjb2RlcigiRVVDLUpQIiwgIlVURi04 IiwgICAgICAmcmJfZnJvbV9FVUNfSlAsIDMsIDApOw0KICAgICByZWdpc3Rlcl90cmFuc2Nv ZGVyKCJVVEYtOCIsICJTSElGVF9KSVMiLCAgICZyYl90b19TSElGVF9KSVMsIDIsIDEpOw0K ICAgICByZWdpc3Rlcl90cmFuc2NvZGVyKCJVVEYtOCIsICJFVUMtSlAiLCAgICAgICZyYl90 b19FVUNfSlAsIDIsIDEpOw0KKyAgICByZWdpc3Rlcl9mdW5jdGlvbmFsX3RyYW5zY29kZXIo IklTTy0yMDIyLUpQIiwgIlVURi04IiwgJnJiX2Zyb21fRVVDX0pQLA0KKwkJCQkgICA4LCAw LCBmcm9tX2lzb18yMDIyX2pwX3RyYW5zY29kZXJfcHJlcHJvY2Vzc29yLCBOVUxMKTsNCisg ICAgcmVnaXN0ZXJfZnVuY3Rpb25hbF90cmFuc2NvZGVyKCJVVEYtOCIsICJJU08tMjAyMi1K UCIsICZyYl90b19FVUNfSlAsDQorCQkJCSAgIDgsIDEsIE5VTEwsIHRvX2lzb18yMDIyX2pw X3RyYW5zY29kZXJfcG9zdHByb2Nlc3Nvcik7DQogDQogICAgIHJlZ2lzdGVyX3RyYW5zY29k ZXIoTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCk7DQogfQ0KQEAgLTE2NSwxNSArNDExLDcgQEAN CiAgICAgcmV0dXJuIE5VTEw7DQogfQ0KIA0KLS8qIGR5bmFtaWMgc3RydWN0dXJlLCBvbmUg cGVyIGNvbnZlcnNpb24gKHNpbWlsYXIgdG8gaWNvbnZfdCkgKi8NCi0vKiBtYXkgY2Fycnkg Y29udmVyc2lvbiBzdGF0ZSAoZS5nLiBmb3IgaXNvLTIwMjItanApICovDQotdHlwZWRlZiBz dHJ1Y3QgdHJhbnNjb2Rpbmcgew0KLSAgICBWQUxVRSBydWJ5X3N0cmluZ19kZXN0OyAvKiB0 aGUgU3RyaW5nIHVzZWQgYXMgdGhlIGNvbnZlcnNpb24gZGVzdGluYXRpb24sDQotCQkJICAg ICAgIG9yIE5VTEwgaWYgc29tZXRoaW5nIGVsc2UgaXMgYmVpbmcgY29udmVydGVkICovDQot ICAgIGNoYXIgKigqZmx1c2hfZnVuYykoc3RydWN0IHRyYW5zY29kaW5nKiwgaW50LCBpbnQp Ow0KLX0gdHJhbnNjb2Rpbmc7DQogDQotDQogLyoNCiAgKiAgVHJhbnNjb2RpbmcgZW5naW5l IGxvZ2ljDQogICovDQpAQCAtMzMxLDYgKzU2OSwyMyBAQA0KIAkgICAgcmJfcmFpc2UocmJf ZUFyZ0Vycm9yLCAidHJhbnNjb2Rpbmcgbm90IHN1cHBvcnRlZCAoZnJvbSAlcyB0byAlcyki LCBmcm9tX2UsIHRvX2UpOw0KIAl9DQogDQorCWlmIChteV90cmFuc2NvZGVyLT5wcmVwcm9j ZXNzb3IpDQorCXsNCisJICAgIGZyb21wID0gc3AgPSBSU1RSSU5HX1BUUihzdHIpOw0KKwkg ICAgc2xlbiA9IFJTVFJJTkdfTEVOKHN0cik7DQorCSAgICBibGVuID0gc2xlbiArIDMwOyAv KiBsZW4gKyBtYXJnaW4gKi8NCisJICAgIGRlc3QgPSByYl9zdHJfdG1wX25ldyhibGVuKTsN CisJICAgIGJwID0gUlNUUklOR19QVFIoZGVzdCk7DQorCSAgICBteV90cmFuc2NvZGluZy5y dWJ5X3N0cmluZ19kZXN0ID0gZGVzdDsNCisJICAgICgqbXlfdHJhbnNjb2Rlci0+cHJlcHJv Y2Vzc29yKSgmZnJvbXAsICZicCwgKHNwK3NsZW4pLCAoYnArYmxlbiksIG15X3RyYW5zY29k ZXIsICZteV90cmFuc2NvZGluZyk7DQorCSAgICBpZiAoZnJvbXAgIT0gc3Arc2xlbikgew0K KwkJcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAibm90IGZ1bGx5IGNvbnZlcnRlZCwgJWQgYnl0 ZXMgbGVmdCIsIHNwK3NsZW4tZnJvbXApOw0KKwkgICAgfQ0KKwkgICAgYnVmID0gUlNUUklO R19QVFIoZGVzdCk7DQorCSAgICAqYnAgPSAnXDAnOw0KKwkgICAgcmJfc3RyX3NldF9sZW4o ZGVzdCwgYnAgLSBidWYpOw0KKwkgICAgc3RyID0gZGVzdDsNCisJfQ0KIAlmcm9tcCA9IHNw ID0gUlNUUklOR19QVFIoc3RyKTsNCiAJc2xlbiA9IFJTVFJJTkdfTEVOKHN0cik7DQogCWJs ZW4gPSBzbGVuICsgMzA7IC8qIGxlbiArIG1hcmdpbiAqLw0KQEAgLTM0Niw2ICs2MDEsMjMg QEANCiAJYnVmID0gUlNUUklOR19QVFIoZGVzdCk7DQogCSpicCA9ICdcMCc7DQogCXJiX3N0 cl9zZXRfbGVuKGRlc3QsIGJwIC0gYnVmKTsNCisJaWYgKG15X3RyYW5zY29kZXItPnBvc3Rw cm9jZXNzb3IpDQorCXsNCisJICAgIHN0ciA9IGRlc3Q7DQorCSAgICBmcm9tcCA9IHNwID0g UlNUUklOR19QVFIoc3RyKTsNCisJICAgIHNsZW4gPSBSU1RSSU5HX0xFTihzdHIpOw0KKwkg ICAgYmxlbiA9IHNsZW4gKyAzMDsgLyogbGVuICsgbWFyZ2luICovDQorCSAgICBkZXN0ID0g cmJfc3RyX3RtcF9uZXcoYmxlbik7DQorCSAgICBicCA9IFJTVFJJTkdfUFRSKGRlc3QpOw0K KwkgICAgbXlfdHJhbnNjb2RpbmcucnVieV9zdHJpbmdfZGVzdCA9IGRlc3Q7DQorCSAgICAo Km15X3RyYW5zY29kZXItPnBvc3Rwcm9jZXNzb3IpKCZmcm9tcCwgJmJwLCAoc3Arc2xlbiks IChicCtibGVuKSwgbXlfdHJhbnNjb2RlciwgJm15X3RyYW5zY29kaW5nKTsNCisJICAgIGlm IChmcm9tcCAhPSBzcCtzbGVuKSB7DQorCQlyYl9yYWlzZShyYl9lQXJnRXJyb3IsICJub3Qg ZnVsbHkgY29udmVydGVkLCAlZCBieXRlcyBsZWZ0Iiwgc3Arc2xlbi1mcm9tcCk7DQorCSAg ICB9DQorCSAgICBidWYgPSBSU1RSSU5HX1BUUihkZXN0KTsNCisJICAgICpicCA9ICdcMCc7 DQorCSAgICByYl9zdHJfc2V0X2xlbihkZXN0LCBicCAtIGJ1Zik7DQorCX0NCiANCiAJaWYg KGVuY29kaW5nX2VxdWFsKG15X3RyYW5zY29kZXItPnRvX2VuY29kaW5nLCB0b19lKSkgew0K IAkgICAgZmluYWxfZW5jb2RpbmcgPSAxOw0K --------------010102010008060805020602--