Tcl8.0.5 Japanization Patch This file is a patch for Tcl8.0.5 to be Japanized (Only for UNIX /Windows box). See the documents included in this patch for details. To apply this patch, you should cd to the top directory of the T cl8.0.5 source tree (the directory containing "README" and "lice nse.terms"), and do: patch -p1 < thisFile ------------------------------------------------------------ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/Incompat80jp ./Incompat80jp *** ../../tcl8.0.5/Incompat80jp Thu Jan 1 09:00:00 1970 --- ./Incompat80jp Mon Mar 15 14:06:57 1999 *************** *** 0 **** --- 1,393 ---- + tcl7.xjp と tcl8.0jp の非互換およびスクリプト再コンパイルに伴う副作用 + + m-hirano@sra.co.jp + + + tcl8.0 の On the fly bytecode compile 機能のために、tcl7.xjp と + tcl8.0jp の間には、internalCode への漢字コード自動変換機能回りに非互換 + が生じました。また、eval, uplevel, source 等の、実行中にスクリプトの再 + コンパイルを引き起こすコマンドの使用も internalCode への漢字コード自動 + 変換機能により有害な副作用を生じさせることがあります。 + + このドキュメントはその非互換部分と副作用について説明するものです。読 + 者が tcl7.xjp の kanji internalCode コマンドの使用法と振舞に関してある + 程度知識を持っていることを前提としています。 + + ちなみに、漢字コードの違いを意識し、tcl7.xjp の internalCode への漢 + 字コード自動変換機能に頼らないスクリプトを書いている方々には、非互換部 + 分はあまり気にならないでしょう。 + + + 1. 非互換部分 + + 1.1. 症例 + + 以下のようなスクリプトがあるとします。 + + 1 kanji internalCode JIS + 2 set jis あいうえお + 3 kanji internalCode SJIS + 4 set sjis あいうえお + 5 kanji internalCode EUC + 6 set euc あいうえお + 7 foreach i "$jis $sjis $euc" { + 8 puts [ kanji code $i ] + 9 } + 10 set l [ list $jis $sjis $euc ] + 11 + 12 kanji internalCode EUC + 13 foreach i "JIS SJIS EUC" { + 14 kanji internalCode $i + 15 set idx [ kanji lsearch $l あ* ] + 16 puts $idx + 17 } + + tcl7.xjp で上記を実行すると、インタラクティブモード、非インタラクティ + ブモードともに、 + + JIS + SJIS + EUC + 0 + 1 + 2 + + の出力が得られます。tcl8.0jp で実行すると、インタラクティブモードで + は、 + + JIS + SJIS + EUC + 2 + 2 + 2 + + 非インタラクティブモードでは、 + + EUC + EUC + EUC + 0 + 0 + 0 + + となります(SunOS 4.1.x の場合)。 + + + 1.2. 説明 + + tcl8.0jp でなぜこのようなことが起きるかというと、 + + 漢字を含む即値がコンパイルされる時には、現在の internalCode へ + コード変換される。その後、再コンパイルが起きない限り、コンパイ + ルされた即値はコード変換されない。 + + という実装にしたからです(立ち上げ時のデフォルト。2.2. で後述する方法 + でコンパイル時の internalCode へのコード変換を完全に禁止できます)。 + + # internalCode の振舞に関して tcl7.xjp との互換を保つには、バイトコー + # ド実行部分に手を入れなければならなくて(多分本当)、これがめんどくさい、 + # かつ実行パフォーマンスが落ちるのが目に見えているからこういう仕様に + # した、というのが本音です。 + + tcl8.0jp でのインタラクティブモードと非インタラクティブモードでの結 + 果の違いは、この実装と、以下の理由で生じます。 + + 非インタラクティブモードでは、スクリプトファイルを最初に全部コンパイ + ルした後で、バイトコードの実行を開始します(tcl8.0 の元々の実装)。した + がって、 + + kanji internalCode XXX の記述があっても、コンパイルはされるが、 + 当然直ちに実行されないので、コンパイル時には internalCode は変 + 化しない。 + + ことになります。 + + 一方インタラクティブモードでは、1 行読み込む毎にコンパイルし、バイト + コードを実行します(これも tcl8.0 の元々の実装)。したがって、 + + kanji internalCode XXX のコンパイル・実行の後の漢字を含む即値 + のコンパイルには、設定した internalCode が直ちに効力を発揮する。 + + ことになります。このような internalCode の変化のタイミングが、インタ + ラクティブモードと非インタラクティブモードの結果の違いを生み出している + わけです。 + + + 1.3. 解決法:eval を使う + + internalCode を設定した後に、漢字を含む即値を再コンパイルさせる、つ + まり、 + + 漢字を含む即値を持つコマンドを、eval コマンドを介して実行させる。 + + ことで tcl7.xjp と互換になります。tcl8.0 の実装では、eval コマンドは + 渡された引数を再コンパイル・実行します。 + + 実際に上記スクリプトを書換えると、 + + 1 kanji internalCode JIS + 2 eval set jis あいうえお + 3 kanji internalCode SJIS + 4 eval set sjis あいうえお + 5 kanji internalCode EUC + 6 eval set euc あいうえお + 7 foreach i "$jis $sjis $euc" { + 8 puts [ kanji code $i ] + 9 } + 10 set l [ list $jis $sjis $euc ] + 11 + 12 kanji internalCode EUC + 13 foreach i "JIS SJIS EUC" { + 14 kanji internalCode $i + 15 set idx [ eval kanji lsearch {$l} あ* ] + 16 puts $idx + 17 } + + のようになります。 + + + 2. 副作用 + + 1.3. では eval によるスクリプトの再コンパイルで積極的に internalCode + へのコード変換を活用しました。しかし、internalCode へのコード変換が有 + 害な副作用を生むこともあります。 + + + 2.1. 症例 + + あるプロシジャ + + proc Foo { x } { .... } + + が、unknown プロシジャで auto_load されるように tclIndex を記述して + いたとします。また、スクリプト内で最初に登場するの Foo の用法が、 + + Foo \x95\x5c + + のように、バックスラッシュエスケープで記述した即値が、たまたま漢字コー + ドとして正しいシーケンス(この例では SJIS で '表' の文字になる)になるよ + うなものだったとします。 + + \x95\x5c というバックスラッシュエスケープは、"Foo \x95\x5c" という文 + 字列のコンパイル時に、内部的にバイナリ、つまり SJIS の '表' に置換され + ます(tcl8.0 の元々の実装)。 + + さて、"Foo \x95\x5c" の呼び出しは unknown プロシジャで行われます。実 + 際には proc Foo { x } { .... } を含むファイルを source し、uplevel コ + マンドで "Foo \x95\x5c" を呼び出します。 + + このとき uplevel コマンドは "Foo 表" という文字列をコンパイルするこ + とになります。なぜなら、すでに \x95\x5c は "Foo \x95\x5c" という文字列 + のコンパイル時に SJIS の '表' に置換されているので、"Foo 表" が + unknown プロシジャの引数として使われるからです。 + + このコンパイルにより、tcl8.0jp は通常の SJIS の '表' と解釈し、 + internalCode へのコード変換を行ってしまいます。 + + もしこの時の internalCode が SJIS もしくは ANY だった場合は問題はな + いのですが、例えば SunOS 4.1.x のデフォルトである EUC であったとしましょ + う。この場合は結果的に \x95\x5c が EUC の '表' である \xc9\xbd に変換 + されて Foo の引数に渡されることになります。しかも、この unknown プロシ + ジャによる uplevel コマンドでのコンパイルは、一番最初の Foo の呼び出し + の時にしか起こりませんから、 + + Foo \x95\x5c + Foo \x95\x5c + + のようなスクリプトがあると、 + + Foo \xc9\xbd + Foo \x95\x5c + + が実行されてしまい、同じ値を Foo の引数に使用しても、最初の呼び出し + とそれ以降の呼び出しとで結果が異なるという、大変奇妙な状況に陥ります。 + + + 2.2. 解決法:コンパイル時のコード変換の禁止 + + この問題を回避するために、現状の tcl8.0jp の 実装では、 + $tcl_library/init.tcl で unknown プロシジャを置き換えて、unknown プロ + シジャが発生させるコンパイルの時には internalCode へのコード変換を禁止 + するようにしています。 + + source, uplevel, eval (その他のコマンドでも起きるかも知れませんが、 + ソースコード以外のドキュメントが無いので未調査)等によるコンパイル時の + internalCode へのコード変換を禁止するには、 + + kanji convertWhenCompile no + + を、コンパイルによる internalCode へのコード変換が起きて欲しくない場 + 所に挿入します。 + + kanji convertWhenCompile yes + + とすることで、コンパイル時の internalCode へのコード変換を可能にでき + ます。 + + これらを適切に使い分けることで、有害な副作用に対応できます。 + + # tcl8.0 のオリジナルコードのパーサ/バイトコード生成部分を適切に書換え + # ることでも対応出来るはずですが、変更部分が多そうなので止めてます ^^; + # ま、「バイトコード生成のパフォーマンスとの trade off を考えて」とい + # うもっともらしい理由を一応付けておきましょう B) + + また、もうお気づきでしょうが、漢字を含んだ変数名、プロシジャ名等も、 + eval 等の再コンパイルによる internalCode へのコード変換によって影響を + 受けます。漢字を含んだ関数名、変数名を使っている時に、あまり派手に + internalCode を切替えると、思わぬ苦労をすることがあるでしょう。 + + + 3. 漢字文字列パージングの完全な禁止 + + 場合によっては、全てのデータを漢字として扱って欲しくない場合がありま + す。特に、いわゆるバイナリデータに regsub, subst を使って複雑な文字列 + 変換を行い、それを eval へ渡すような場合です。 + + このような場合、 + + kanji scanKanjiToken no + + とすることで実現できます。立ち上げ時のデフォルトは + + kanji scanKanjiToken yes + + になっています。必要に応じて切替えて使用して下さい。 + + 通常デフォルトのままで大丈夫ですが、特に海外製のスクリプトを使用して + いる場合に subst で error が出たりするのなら、切替えてみると効果がある + かもしれません。 + + scanKanjiToken が no の場合、tcl8.0jp のパーサ部分はほぼ完全に + tcl8.0 と互換になります。つまり、日本語に関してパーサは何もしなくなり + ます。特に JIS コードを扱うスクリプトは壊滅状態になるでしょう。 + + ちなみに現在の仕様では、convertWhenCompile はインタープリタ(interp + コマンドで生成されたインタープリタ)毎に別ですが、scanKanjiToken はプロ + セス全体に波及します。 + + + 4. 漢字文字列と '\\' エスケープ + + tcl7.xjp では '\\' 直後に漢字文字列ある場合の動作が明確に決められて + いませんでした。これを Tcl/Tk 8.0.4jp 1.4a で決めました。以下のように + 置換されます。 + + + \漢字 -> 漢字 + "\漢字" -> 漢字 + {\漢字} -> \漢字 + "{\漢字}" -> {漢字} + + このように、ASCII 文字で '\\' エスケープされないものと同様の動きをし + ます。 + + また、2.1. でも述べた、何らかの正しい漢字文字列に見える \xXX\xXX や + \XXX\XXX (X は [a-fA-F0-9]) のシーケンスがある場合、これらは + internalCode に変換されません。以下に SJIS の '表' となる \x95\x5c を + 例に挙げて説明します。internalCode は EUC であるとします。 + + \x95\x5c + -> internalCode にかかわらず、常に SJIS の '表' + + a. "JISの漢字 \x95\x5c" + -> 'JISの漢字' のみが internalCode に変換され、 + \x95\x5c は常に SJIS の '表' つまり、 + + 'JISの漢字 表' .... 一文字列内に EUC と + SJIS のコードが混在。 + + b. {JISの漢字 \x95\x5c} + -> 'JISの漢字' のみが internalCode に変換され、 + \x95\x5c は Tcl の {} による quote 規則にのっとり、 + + 'JISの漢字 \x95\x5c' ... EUC 文字列 + + c. "{JISの漢字 \x95\x5c}" + + -> a. 同様、'JISの漢字' のみが internalCode に変換 + され、\x95\x5c は常に SJIS の '表' つまり、 + + '{JISの漢字 表}' ....一文字列内に EUC と + SJIS のコードが混在。 + + 当然ですが、文字コードを混在させる場合は注意して下さい。 + + + 5. SJIS 半角カナサポート + + Tcl/Tk 8.0.4jp 1.3a より、Windows プラットフォームのサポートが追加さ + れました。これにより、8.0jp で無視し続けていた半角カナをある程度サポー + トすることにしました。 + + tcl8.0jp で半角カナの使用できる漢字コードは SJIS に限ります。 + + 8.0.4jp 1.3a からは、漢字コードの自動判別において、8.0.4jp 1.2 以前 + のようにほぼ常に EUC と見なすのではなく、JIS/EUC/SJIS の internal code + の他に、コード自動判別困難な場合にユーザが SJIS/EUC のどちらを望むのか + の指定が可能になりました。 + + kanji preferSjis yes + + とすると、EUC/SJIS 判別が困難な場合、常に SJIS と見なすようになりま + す。これにより、特に SJIS 半角カナが恩恵を受けます。逆に言うと EUC が + 壊滅します。 + + kanji preferSjis no + + とすると、これまでの tcl8.0jp とほぼ同様、EUC と見なすようになります。 + + UNIX プラットフォームでは default で no で、ほぼ tcl8.0.4jp 1.2 以前 + のバージョンと互換があります(ほぼ、というのは、若干 SJIS と判断するケー + スを増やしたからです)。Windows プラットフォームでは default で yes で + す。また、当然ですが、Windows プラットフォームでの default の internal + code は SJIS です。 + + したがって、Windows プラットフォームで EUC で書かれたスクリプトを処 + 理する場合などは気を付けて下さい。8 bit 文字列はほぼ確実に SJIS だと見 + なされ、byte compile error が出ます。 + + ちなみに、JIS なら確実に自動コード判定できるので、マルチプラットフォー + ムで動かすスクリプトの漢字コードとして、安心して使用できるはずです。 + + + 6. Windows プラットフォームでの漢字コードの扱い + + Win32 API は SJIS 文字列を引数として使えます。ファイル名、フォント名、 + レジストリキー、タイトルバー、etc.. です。 + + こういうことをする人が多いとは思えませんが、Windows プラットフォーム + で、internal code を SJIS 以外にした場合、Win32 API に漢字文字列を渡そ + うとしても、正しく SJIS で渡らなくなる可能性があります。 + + したがって、internal code を SJIS 以外に変える場合、スクリプト内で + Win32 API に渡る文字列は、きちんと SJIS になるようプログラマ自身が気を + つけなければなりません。tcl8.0jp はこのための care を全く行いません。 + 言うまでもないとは思いますが、最悪の場合、ファイルを失ったり、むちゃく + ちゃなレジストリキーにむちゃくちゃな値を書き込んでしまう恐れもあります。 + + + 7. 立ち上げ時の internal code + + tcl8.0.4jp1.4 までは、tcl7.xjp 同様、立ち上げ時(default)の internal + code は環境変数 LANG を参照して設定していました。tcl8.0.5jp 1.5a より + これを変更し、 + + 1. まず環境変数 TCL_KANJICODE を参照。設定する値は、kanji + internalCode コマンドの引数と同じ、SJIS|EUC|JIS|ANY である。 + プラットフォームが Windows の場合、もし TCL_KANJICODE が設 + 定されていなければ、SJIS とする。 + + 2. プラットフォームが UNIX ならば、TCL_KANJICODE が設定されて + ない場合、さらに + LC_ALL + LC_CTYPE + LANG + の順で環境変数を参照。値はいわゆる locale 名。要するに + TCL_KANJICODE が設定されてなければ、tcl8.0.4jp 1.x, + tcl7.xjp と同様の動作をする。 + + のようにしました。 + + TCL_KANJICODE を用いて Windows で internal code を EUC にした場合、 + kanji preferSjis は自動的に false になります。 diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/README.JP ./README.JP *** ../../tcl8.0.5/README.JP Thu Jan 1 09:00:00 1970 --- ./README.JP Fri Sep 11 19:29:12 1998 *************** *** 0 **** --- 1,61 ---- + The Japanization of Tcl + + by Yoshiyuki Nishinaka (nisinaka@sra.co.jp) + Makoto Ishisone (ishisone@sra.co.jp) + Motonori Hirano (m-hirano@sra.co.jp) ... 8.0 support. + Software Research Associates, Inc. + + + 1. Introduction + --------------- + + Here we provide a patch kit for enabling Tcl to handle Japanese characters + (kanji). + + The patch kit contains: + + + Modifications to the Tcl source code + - Tcl interpreter is modified so that scripts containing kanji are + parsed and executed correctly. + + Some new tcl commands for handling Japanese text. + + A document describing the incomaptibility between Tcl7.xjp and Tcl8.0jp. + + The Japanization is self-contained -- it doesn't require any + internationalization support of the OS (i.e. no mb* and wc* routines are + needed). + + 2. Some selected features + ------------------------- + + The Japanization includes the following features: + + + The Tcl interpreter automatically recognizes the type of kanji code, so + users do not have to worry about the kanji code of scripts. + + New Tcl commands for handling kanji I/O code and kanji strings. + + 3. Compile & Installation + ------------------------- + + Just follow the steps of the original Tcl, simply run 'configure'. The + configure script has --enable-kanji option ('enable' default). + + Some library files (usually installed in "/usr/local/lib/tcl") are + modified for the tcl8.0 Japanization. See "Incompat80jp" in this + directory for details of the potential incompatibility. + + + 4. Test + ------- + + We provide a test suite 'tests/kanji.test' for the Japanized Tcl. + + + 5. Bug report + ------------- + + Please report comments & bugs via e-mail to: + + tcl-jp-bugs@sra.co.jp + + Please don't forget to include a brief description of your environment + such as your machine type, OS version or X library version. diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/changes.JP ./changes.JP *** ../../tcl8.0.5/changes.JP Thu Jan 1 09:00:00 1970 --- ./changes.JP Fri Nov 26 21:07:57 1999 *************** *** 0 **** --- 1,226 ---- + Release tcl8.0.5jp1.7 Nov 27, 1999 + + (bug fix) Now tcl80jp.dll and tclsh80jp.exe have proper + version/codepage informations (Win). + + (bug fix) Tcl couldn't exec 16 bit application at all on Windows + 9[58] environment (Win). + + (bug fix) Fix NULL pointer freeing in tkUnixFile.c (UNIX). + + Release tcl8.0.5jp1.6 May 16, 1999 + + Release tcl8.0.5jp1.5 Mar 15, 1999 + + Confidential release tcl8.0.5jp1.5a Mar 12, 1999 + + (new release) Modified for Tcl8.0.5. + + (feature change) Now tcl checks TCL_KANJICODE environment variable + to determine default internal kanji code (UNIX/Win). On UNIX, if + the TCL_KANJICODE is not set, checks LC_ALL, LC_CTYPE, LANG + environment variable (in this order) to determine the default + internal kanji code (UNIX). + + (feature change) Now user can specify which kanji code "japanese" + locale name should refer at compilation time (UNIX). + + Release tcl8.0.4jp1.4 Feb 12, 1999 + + (new release) Bug fixes and reconstruction around kanji token + scanner/parser. + + (bug fix) Overhauling kanji token scanner/parser. (UNIX/Win) + + (bug fix) '\\' just befor kanji string made tcl hangup or strange + behavior in any kanji code. (UNIX/Win) + + (new feature) registry command can handle kanji registry + key/value. (Win) + + (new feature) Kanji strings can be used for filename if the + platform has capability to handle kanji filename. file command can + handle kanji string (include glob). (Win: ok. UNIX: not actually + tested but maybe ok. so this feature is disabled in default config.) + + Confidential release tcl8.0.4jp1.4a Jan 31, 1999 + + (bug fix) Tcl_KanjiEnd() couldn't find valid kanji sequence + end. (UNIX/Win) + + Release tcl8.0.4jp1.3 Dec 18, 1998 + + (new release) On tcl side, Windows platform works fine. + + Confidential Release tcl8.0.4jp1.3a Dec 5, 1998 + + (new feature) Merging Windows platform patch contributed by + Mr. Atsushi Nemoto. Thanks a LOT! Cool man! + + (bug fix) Namespace and array did not work properly when internal + code is JIS. + + (new feature) kanji preferSjis command is added. If kanji + preferSjis is 'true', SJIS/EUC ambiguous string is always reported + as SJIS. + + Release tcl8.0.4jp1.2 Nov 28, 1998 + + (new release) Modified for Tcl8.0.4 + + (bug fix) All Tcl_Kanji*() now takes a memory range (length or + last pointer) parameter. + + Release tcl8.0.3jp1.1-fix1 Oct 16, 1998 + + Release tcl8.0.3jp1.1 Sep 11, 1998 + + (new release) Modified for Tcl8.0.3 + + Release tcl8.0p2jp1.1b0 Jul 18, 1998 + + Confidential release tcl8.0p2jp1.1b0 Jun 13, 1998 + + (bug fix) fix test failure of ioCmd.test. + + Release tcl8.0p2jp1.0 May 18, 1998 + + (bug fix) Treat stdin/stdout/stderr as tty if they are really tty. + (POTENTIAL INCOMPATIBILITY). Some scripts (e.g open a new tty and + assign own proccess's contorol terminal to it) written in TclX need this fix. + + Release tcl8.0p2jpb3 Feb 23, 1998 + + (new feature) add new "kanji scanKanjiToken" command to + enable/disable scanning kanji string. + + Release tcl8.0p2jpb2 Jan 23, 1998 + + (bug fix) foreach command couldn't handle a list contain kanji + element correctly. + + Release tcl8.0p2jpb0 Nov 28, 1997 + + (new release) Modified for Tcl8.0p2. + + Release tcl8.0p1jpb0 Nov 21, 1997 + + (new release) Modified for Tcl8.0p1. + + Confidential Release tcl8.0jpa0 Aug 22, 1997 + + (new release) Modified for the Tcl8.0. + + Confidential Release tcl8.0b1jp May 31, 1997 + + (new release) Modified for the Tcl8.0b1. + + (bug fix) No more recompile(code reconversion) the backslash + escape sequence as the kanji sequence. + + (bug fix) Backslash escape sequence that matches incomplete kanji + sequence made the tclsh freeze. + + (feature change) "kanji internalCode" come back again. but have + some incompat between 7.xjp. (POTENTIAL INCOMPATIBILITY). + + Confidential Release tcl8.0a2jp Apr 3, 1997 + + (new release) Modified for the Tcl8.0a2. + + (new feature) Add new "kanji convertWhenCopile" coomand to control + the kanji code conversion when the script will be compiled. + + (feature change??) "kanji internalCode" will be outdated because of byte + compilation (POTENTIAL INCOMPATIBILITY). + + (bug fix) JIS code kanji can be used as variable name. + + Release tcl7.6jp, November 24, 1996 + + (new release) Modified for the Tcl7.6. + + (new release) Modified for the Tcl7.5p1. + + (feature change) Eliminated exported global variables (they don't work with + Windows DLLs). The arrays of Kanji Encode/Decode functions (Tcl_KanjiEncode + and Tcl_KanjiDecode) are replaced with C functions (Tcl_KanjiEncode() and + Tcl_KanjiDecode()). + + Release tcl7.5jp_alpha, April 25, 1996 + + (new release) Modified for the Tcl7.5. + + (new feature) A set of patches for Windows is contributed from + Mr. Hiroaki NAKAMURA. + + (new release) Modified for the Tcl7.5b3. + + (new release) Modified for the Tcl7.5b1. + + (new release) Modified for the Tcl7.5a2. + + Release tcl7.4p3jp, December 11, 1995 + + Release tcl7.4jp, September 25, 1995 + + (bug fix) A comment line will be continued if the last character of + the line is a kanji which second byte is '\'. + + (bug fix) KANJI was always defined in tclKanjiUtil.c. + + Release tcl7.4jp-beta, August 1, 1995 + + Release tcl7.4jp-alpha, July 12, 1995 + + (new release) Some modifications according to the new release. + + Release tcl7.3jp-update3, May 24, 1995 + + (documentation error) Modified some doc.jp files. + + (bug fix) Fixed a bug in TclWordEnd where it couldn't find an end of + a word if it contains a kanji character with some special characters + like '{' or '['. + + Release tcl7.3jp-update2, August 25, 1994 + + (documentation error) Typo in doc.jp/library.n. + + (bug fix) Fixed bug in Tcl_ParseVar where it couldn't parse kanji + variable name properly. + + Release tcl7.3jp-update1, February 14, 1994 + + (feature change) Changed default JIS encoding to use ESC-(-B for ASCII + character set. + + (bug fix & new feature) Added Tcl_KanjiEnd function to find a string + ends with a kanji character or not. The problem occured when a kanji + string ends with the specical character '{'. In some places, like + Tcl_AppendElement, '{' was treated as a beginning of a list even if it + was the last character of a kanji string. + + (bug fix) The second file descriptor for a pipe was not registered to + the arrary 'tclOpenFiles'. This caused a core dump when you open a + command and try to 'puts' kanji strings. + + Release tcl7.3jp, December 7, 1993 + + (new feature) Modified tclUtil.c to behave like the original Tcl when + the current locale is set to 'C'. In this case, the kanji handling is + disabled. + + (configuration change) Eliminated 'ctype-fix.h': this file was introduced + to fix the bug in the original Tcl/Tk. Since the bug fix is incorporated + into the original source code, this local bug fix is no longer needed. + + (bug fix) Fixed bug in TclCopyAndCollaspe where it deletes '\' in kanji + strings. + + (document translation) Supplied several translations of man pages since + Tcl.n was broken into pieces. + + Release tk3.2jp-update1, August 26, 1993 + + Release tk3.2jp, July 9, 1993 diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tcl.h ./generic/tcl.h *** ../../tcl8.0.5/generic/tcl.h Wed Feb 3 11:58:25 1999 --- ./generic/tcl.h Fri Mar 12 00:00:47 1999 *************** *** 723,728 **** --- 723,807 ---- #define TCL_LINK_STRING 4 #define TCL_LINK_READ_ONLY 0x80 + #ifdef KANJI + /* + * Integer values for KANJI codes + */ + #define TCL_NOT_KANJI -1 + #define TCL_JIS 0 + #define TCL_SJIS 1 + #define TCL_EUC 2 + #define TCL_ANY 3 + #define TCL_NOT_SCANNED 4 /* Special. Only used in parser/compiler. */ + + EXTERN char *Tcl_KanjiCodeStr[]; + + #ifndef TCL_DEFAULT_KANJI_CODE + #if defined(__WIN32__) + #define TCL_DEFAULT_KANJI_CODE TCL_SJIS + #else + #define TCL_DEFAULT_KANJI_CODE TCL_EUC + #endif /* __WIN32__ */ + #endif + + /* + * type definition for wide character + */ + #ifndef WCHAR_DEFINED + #define WCHAR_DEFINED + typedef unsigned short wchar; + #endif + + /* + * macros for wide characters + */ + #define ISWKANA(wc) (((wc) & 0x8080) == 0x80) + #define ISWKANJI(wc) (((wc) & 0x8080) == 0x8080) + #define ISWSPACE(wc) (isascii(wc) && isspace(wc)) + #define ISWUPPER(wc) (isascii(wc) && isupper(wc)) + #define ISWLOWER(wc) (isascii(wc) && islower(wc)) + #define ISWALNUM(wc) (isascii(wc) && isalnum(wc)) + #define ISWDIGIT(wc) (isascii(wc) && isdigit(wc)) + #define G0MASK 0x0000 + #define G1MASK 0x8080 + #define G2MASK 0x0080 + #define G3MASK 0x8000 + + /* + * Macro for detecting the start of kanji sequence. + */ + EXTERN int globalDoKanjiScan; + #define Tcl_EnableKanjiScanner(flag) { globalDoKanjiScan = (flag); } + #define IS_KANJISTART(c) ( (((c) == '\033') || ((c) >= 0x80)) && globalDoKanjiScan ) + + /* + * If globalAssumeSjis is true, SJIS/EUC ambiguous string is assumed as SJIS. + */ + EXTERN int globalAssumeSjis; + + /* + * Tcl_DWString is same as Tcl_DString except that it handles wide strings. + */ + + #define TCL_DWSTRING_STATIC_SIZE 200 + typedef struct Tcl_DWString { + wchar *wstring; /* Points to beginning of string: either + * staticSpace below or a malloc'ed array. */ + int length; /* Number of non-NULL characters in the + * string. */ + int spaceAvl; /* Total number of bytes available for the + * string and its terminating NULL char. */ + wchar staticSpace[TCL_DWSTRING_STATIC_SIZE]; + /* Space to use in common case where string + * is small. */ + } Tcl_DWString; + + #define Tcl_DWStringLength(dwsPtr) ((dwsPtr)->length) + #define Tcl_DWStringValue(dwsPtr) ((dwsPtr)->wstring) + #define Tcl_DWStringTrunc Tcl_DWStringSetLength + + #endif /* KANJI */ + /* * The following declarations either map ckalloc and ckfree to * malloc and free, or they map them to procedures with all sorts *************** *** 1560,1565 **** --- 1639,1710 ---- char *s, int slen)); EXTERN void Tcl_WrongNumArgs _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], char *message)); + #ifdef KANJI + EXTERN int Tcl_KanjiEncode _ANSI_ARGS_((int kanjiCode, + unsigned char *ks, wchar *ws)); + EXTERN int Tcl_KanjiDecode _ANSI_ARGS_((int kanjiCode, + wchar *ws, unsigned char *ks)); + EXTERN int Tcl_EncodeJIS _ANSI_ARGS_((unsigned char *ks, wchar *ws)); + EXTERN int Tcl_EncodeSJIS _ANSI_ARGS_((unsigned char *ks, wchar *ws)); + EXTERN int Tcl_EncodeEUC _ANSI_ARGS_((unsigned char *ks, wchar *ws)); + EXTERN int Tcl_EncodeANY _ANSI_ARGS_((unsigned char *ks, wchar *ws)); + EXTERN int Tcl_DecodeJIS _ANSI_ARGS_((wchar *ws, unsigned char *ks)); + EXTERN int Tcl_DecodeSJIS _ANSI_ARGS_((wchar *ws, unsigned char *ks)); + EXTERN int Tcl_DecodeEUC _ANSI_ARGS_((wchar *ws, unsigned char *ks)); + EXTERN int Tcl_DecodeANY _ANSI_ARGS_((wchar *ws, unsigned char *ks)); + EXTERN int Tcl_DefaultKanjiCode _ANSI_ARGS_((void)); + EXTERN int Tcl_KanjiBackslash _ANSI_ARGS_((char *str, char *end, + char *valBuf, int *valLenPtr, int *sNumPtr)); + EXTERN int Tcl_KanjiBackslashIsKanji _ANSI_ARGS_((char *src, char *end)); + EXTERN int Tcl_KanjiCode _ANSI_ARGS_((Tcl_Interp *interp)); + EXTERN int Tcl_KanjiFile _ANSI_ARGS_((Tcl_Interp *interp, + char *fileName, int *kanjiCodePtr)); + EXTERN char * Tcl_KanjiFindNamespace _ANSI_ARGS_((char *s)); + EXTERN int Tcl_KanjiSkip _ANSI_ARGS_((unsigned char *string, unsigned char *end, + int *kanjiCodePtr)); + EXTERN int Tcl_KanjiStart _ANSI_ARGS_((unsigned char *string, unsigned char *end, + int *kanjiCodePtr)); + EXTERN int Tcl_KanjiEnd _ANSI_ARGS_((unsigned char *string, unsigned char *end, + int *kanjiCodePtr)); + EXTERN int Tcl_KanjiLength _ANSI_ARGS_((unsigned char *string, unsigned char *end, + int kanjiCode)); + EXTERN int Tcl_KanjiString _ANSI_ARGS_((Tcl_Interp *interp, + unsigned char *string, unsigned char *end, int *kanjiCodePtr)); + EXTERN int Tcl_GetKanjiCode _ANSI_ARGS_((Tcl_Interp *interp, + char *string, int *kanjiCodePtr)); + EXTERN char * Tcl_KStrchr _ANSI_ARGS_((CONST char *str, int c)); + EXTERN char * Tcl_KStrrchr _ANSI_ARGS_((CONST char *str, int c)); + EXTERN char * Tcl_KStrpbrk _ANSI_ARGS_((CONST char *str, CONST char *pattern)); + EXTERN int Tcl_WStrlen _ANSI_ARGS_((wchar *wstr)); + EXTERN wchar * Tcl_WStrcpy _ANSI_ARGS_((wchar *wstr1, wchar *wstr2)); + EXTERN wchar * Tcl_WStrncpy _ANSI_ARGS_((wchar *wstr1, wchar *wstr2, int n)); + EXTERN int Tcl_WStrcmp _ANSI_ARGS_((wchar *wstr1, wchar *wstr2)); + EXTERN int Tcl_WStrncmp _ANSI_ARGS_((wchar *wstr1, wchar *wstr2, int n)); + EXTERN int Tcl_WStringMatch _ANSI_ARGS_((wchar *string, + wchar *pattern)); + EXTERN wchar * Tcl_WStrstr _ANSI_ARGS_((wchar *wstr, wchar *subwstr)); + EXTERN wchar * Tcl_DWStringAppend _ANSI_ARGS_((Tcl_DWString *dwsPtr, + wchar *wstring, int length)); + EXTERN void Tcl_DWStringFree _ANSI_ARGS_((Tcl_DWString *dwsPtr)); + EXTERN void Tcl_DWStringGetResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DWString *dwsPtr)); + EXTERN void Tcl_DWStringInit _ANSI_ARGS_((Tcl_DWString *dwsPtr)); + EXTERN void Tcl_DWStringResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DWString *dwsPtr)); + EXTERN void Tcl_DWStringSetLength _ANSI_ARGS_((Tcl_DWString *dwsPtr, + int length)); + EXTERN wchar * Tcl_GetWStr _ANSI_ARGS_((Tcl_Interp *interp, + char *str, int *kanjiCodePtr)); + EXTERN void Tcl_FreeWStr _ANSI_ARGS_((wchar *wstr)); + EXTERN wchar * Tcl_InsertWStr _ANSI_ARGS_((Tcl_Interp *interp, + wchar *orig, int index, wchar *wstr)); + EXTERN wchar * Tcl_DeleteWStr _ANSI_ARGS_((Tcl_Interp *interp, + wchar *orig, int index, int count)); + EXTERN char * Tcl_DecodeWStr _ANSI_ARGS_((Tcl_Interp *interp, + wchar *wstr, int *kanjiCodePtr)); + EXTERN char * Tcl_ConvertToInternal _ANSI_ARGS_((Tcl_Interp *interp, + char *string, int *kanjiCodePtr)); + #endif /* KANJI */ #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclBasic.c ./generic/tclBasic.c *** ../../tcl8.0.5/generic/tclBasic.c Wed Feb 3 09:55:04 1999 --- ./generic/tclBasic.c Fri Mar 12 00:00:48 1999 *************** *** 104,109 **** --- 104,125 ---- (CompileProc *) NULL, 1}, {"join", (Tcl_CmdProc *) NULL, Tcl_JoinObjCmd, (CompileProc *) NULL, 1}, + #ifdef KANJI + {"kanji", Tcl_KanjiCmd, (Tcl_ObjCmdProc *) NULL, + (CompileProc *) NULL, 1}, + {"klsearch", Tcl_KlsearchCmd, (Tcl_ObjCmdProc *) NULL, + (CompileProc *) NULL, 1}, + /* + * Maybe we should use new Tcl_Obj interface... + * m-hirano. + */ + {"klsort", Tcl_KlsortCmd, (Tcl_ObjCmdProc *) NULL, + (CompileProc *) NULL, 1}, + {"ksplit", Tcl_KsplitCmd, (Tcl_ObjCmdProc *) NULL, + (CompileProc *) NULL, 1}, + {"kstring", Tcl_KstringCmd, (Tcl_ObjCmdProc *) NULL, + (CompileProc *) NULL, 1}, + #endif /* KANJI */ {"lappend", (Tcl_CmdProc *) NULL, Tcl_LappendObjCmd, (CompileProc *) NULL, 1}, {"lindex", (Tcl_CmdProc *) NULL, Tcl_LindexObjCmd, *************** *** 322,327 **** --- 338,349 ---- iPtr->emptyObjPtr = Tcl_NewObj(); /* another empty object */ Tcl_IncrRefCount(iPtr->emptyObjPtr); iPtr->resultSpace[0] = 0; + #ifdef KANJI + iPtr->kanjiCode = Tcl_DefaultKanjiCode(); + iPtr->kanjiInputCode = TCL_ANY; + iPtr->kanjiOutputCode = TCL_ANY; + iPtr->kanjiConvertWhenCompile = 1; + #endif /* KANJI */ iPtr->globalNsPtr = NULL; /* force creation of global ns below */ iPtr->globalNsPtr = (Namespace *) Tcl_CreateNamespace( *************** *** 1118,1124 **** --- 1140,1150 ---- * lets prevent "::" in the token too. --dl */ + #ifdef KANJI + if (Tcl_KanjiFindNamespace(hiddenCmdToken) != NULL) { + #else if (strstr(hiddenCmdToken, "::") != NULL) { + #endif /* KANJI */ Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "cannot use namespace qualifiers as hidden command", "token (rename)", (char *) NULL); *************** *** 1266,1272 **** --- 1292,1302 ---- * (to another namespace) at the same time) */ + #ifdef KANJI + if (Tcl_KanjiFindNamespace(cmdName) != NULL) { + #else if (strstr(cmdName, "::") != NULL) { + #endif /* KANJI */ Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can not expose to a namespace ", "(use expose to toplevel, then rename)", *************** *** 1439,1445 **** --- 1469,1479 ---- * otherwise, we always put it in the global namespace. */ + #ifdef KANJI + if (Tcl_KanjiFindNamespace(cmdName) != NULL) { + #else if (strstr(cmdName, "::") != NULL) { + #endif /* KANJI */ TclGetNamespaceForQualName(interp, cmdName, (Namespace *) NULL, CREATE_NS_IF_UNKNOWN, &nsPtr, &dummy1, &dummy2, &tail); if ((nsPtr == NULL) || (tail == NULL)) { *************** *** 1584,1591 **** * namespace qualifiers, we put it in the specified namespace; * otherwise, we always put it in the global namespace. */ ! if (strstr(cmdName, "::") != NULL) { TclGetNamespaceForQualName(interp, cmdName, (Namespace *) NULL, CREATE_NS_IF_UNKNOWN, &nsPtr, &dummy1, &dummy2, &tail); if ((nsPtr == NULL) || (tail == NULL)) { --- 1618,1628 ---- * namespace qualifiers, we put it in the specified namespace; * otherwise, we always put it in the global namespace. */ ! #ifdef KANJI ! if (Tcl_KanjiFindNamespace(cmdName) != NULL) { ! #else if (strstr(cmdName, "::") != NULL) { + #endif /* KANJI */ TclGetNamespaceForQualName(interp, cmdName, (Namespace *) NULL, CREATE_NS_IF_UNKNOWN, &nsPtr, &dummy1, &dummy2, &tail); if ((nsPtr == NULL) || (tail == NULL)) { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCmdAH.c ./generic/tclCmdAH.c *** ../../tcl8.0.5/generic/tclCmdAH.c Wed Dec 23 11:01:42 1998 --- ./generic/tclCmdAH.c Fri Mar 12 02:19:08 1999 *************** *** 666,678 **** * This list of constants should match the fileOption string array below. */ enum {FILE_ATIME, FILE_ATTRIBUTES, FILE_COPY, FILE_DELETE, FILE_DIRNAME, FILE_EXECUTABLE, FILE_EXISTS, FILE_EXTENSION, FILE_ISDIRECTORY, ! FILE_ISFILE, FILE_JOIN, FILE_LSTAT, FILE_MTIME, FILE_MKDIR, FILE_NATIVENAME, FILE_OWNED, FILE_PATHTYPE, FILE_READABLE, FILE_READLINK, FILE_RENAME, FILE_ROOTNAME, FILE_SIZE, FILE_SPLIT, FILE_STAT, FILE_TAIL, FILE_TYPE, FILE_VOLUMES, FILE_WRITABLE}; static char *fileOptions[] = {"atime", "attributes", "copy", "delete", "dirname", "executable", "exists", "extension", "isdirectory", --- 666,692 ---- * This list of constants should match the fileOption string array below. */ + #ifdef KANJI enum {FILE_ATIME, FILE_ATTRIBUTES, FILE_COPY, FILE_DELETE, FILE_DIRNAME, FILE_EXECUTABLE, FILE_EXISTS, FILE_EXTENSION, FILE_ISDIRECTORY, ! FILE_ISFILE, FILE_JOIN, FILE_KANJICODE, FILE_LSTAT, FILE_MTIME, FILE_MKDIR, FILE_NATIVENAME, FILE_OWNED, FILE_PATHTYPE, FILE_READABLE, FILE_READLINK, FILE_RENAME, FILE_ROOTNAME, FILE_SIZE, FILE_SPLIT, FILE_STAT, FILE_TAIL, FILE_TYPE, FILE_VOLUMES, FILE_WRITABLE}; + static char *fileOptions[] = {"atime", "attributes", "copy", "delete", + "dirname", "executable", "exists", "extension", "isdirectory", + "isfile", "join", "kanjiCode", "lstat", "mtime", "mkdir", "nativename", + "owned", "pathtype", "readable", "readlink", "rename", + "rootname", "size", "split", "stat", "tail", "type", "volumes", + "writable", (char *) NULL}; + #else + enum {FILE_ATIME, FILE_ATTRIBUTES, FILE_COPY, FILE_DELETE, FILE_DIRNAME, + FILE_EXECUTABLE, FILE_EXISTS, FILE_EXTENSION, FILE_ISDIRECTORY, + FILE_ISFILE, FILE_JOIN, FILE_LSTAT, FILE_MTIME, FILE_MKDIR, + FILE_NATIVENAME, FILE_OWNED, FILE_PATHTYPE, FILE_READABLE, + FILE_READLINK, FILE_RENAME, FILE_ROOTNAME, FILE_SIZE, FILE_SPLIT, + FILE_STAT, FILE_TAIL, FILE_TYPE, FILE_VOLUMES, FILE_WRITABLE}; static char *fileOptions[] = {"atime", "attributes", "copy", "delete", "dirname", "executable", "exists", "extension", "isdirectory", *************** *** 680,685 **** --- 694,700 ---- "owned", "pathtype", "readable", "readlink", "rename", "rootname", "size", "split", "stat", "tail", "type", "volumes", "writable", (char *) NULL}; + #endif if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?"); *************** *** 713,719 **** Tcl_DStringInit(&buffer); resultPtr = Tcl_GetObjResult(interp); ! /* * Handle operations on the file name. --- 728,734 ---- Tcl_DStringInit(&buffer); resultPtr = Tcl_GetObjResult(interp); ! /* * Handle operations on the file name. *************** *** 893,898 **** --- 908,931 ---- Tcl_DStringFree(&buffer); goto done; } + #ifdef KANJI + case FILE_KANJICODE: { + int kanjiCode; + + if (objc != 3) { + errorString = "kanjiCode name"; + goto not3Args; + } + + fileName = Tcl_GetStringFromObj(objv[2], &length); + if (Tcl_KanjiFile(interp, fileName, &kanjiCode) == TCL_ERROR) { + result = TCL_ERROR; + goto done; + } + Tcl_SetResult(interp, Tcl_KanjiCodeStr[kanjiCode], 0); + goto done; + } + #endif case FILE_RENAME: { char **pargv = (char **) ckalloc(objc * sizeof(char *)); int i; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCmdIL.c ./generic/tclCmdIL.c *** ../../tcl8.0.5/generic/tclCmdIL.c Wed Feb 3 09:55:04 1999 --- ./generic/tclCmdIL.c Fri Mar 12 00:00:51 1999 *************** *** 145,150 **** --- 145,154 ---- SortElement *rightPtr, SortInfo *infoPtr)); static int SortCompare _ANSI_ARGS_((Tcl_Obj *firstPtr, Tcl_Obj *second, SortInfo *infoPtr)); + #ifdef KANJI + static int SortKanjiCompareProc _ANSI_ARGS_((CONST VOID *first, + CONST VOID *second)); + #endif /* KANJI */ /* *---------------------------------------------------------------------- *************** *** 972,977 **** --- 976,1867 ---- return TCL_OK; } + #ifdef KANJI + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiCmd -- + * + * This procedure is invoked to process the "kanji" Tcl command. + * See the user documentation for details on what it does. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * See the user documentation. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + int + Tcl_KanjiCmd(dummy, interp, argc, argv) + ClientData dummy; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + register char c; + unsigned int length; + + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " option arg ?arg ...?\"", (char *) NULL); + return TCL_ERROR; + } + c = argv[1][0]; + length = strlen(argv[1]); + if ((c == 'c') && (strncmp(argv[1], "code", length) == 0)) { + int kanjiCode; + + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " code string\"", (char *) NULL); + return TCL_ERROR; + } + (void)Tcl_KanjiString(interp, argv[2], NULL, &kanjiCode); + Tcl_SetResult(interp, Tcl_KanjiCodeStr[kanjiCode], 0); + return TCL_OK; + } else if ((c == 'c') && (strncmp(argv[1], "conversion", length) == 0) + && (length >= 7)) { + int from, to; + wchar *wstr; + char *str; + + if (argc != 5) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " conversion fromCode toCode string\"", (char *) NULL); + return TCL_ERROR; + } + if (Tcl_GetKanjiCode(interp, argv[2], &from) == TCL_ERROR) return TCL_ERROR; + if (Tcl_GetKanjiCode(interp, argv[3], &to) == TCL_ERROR) return TCL_ERROR; + + if (from == to) { + Tcl_SetResult(interp, argv[4], TCL_VOLATILE); + return TCL_OK; + } + wstr = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(from, argv[4], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(from, argv[4], wstr); + str = (char *)ckalloc((unsigned)(Tcl_KanjiDecode(to, wstr, NULL) + 1)); + (void) Tcl_KanjiDecode(to, wstr, str); + Tcl_SetResult(interp, str, TCL_VOLATILE); + ckfree((char *)wstr); + ckfree(str); + return TCL_OK; + } else if ((c == 'p') && (strncmp(argv[1], "preferSjis", length) == 0)) { + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " preferSjis ?bool?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + int doSjis; + if (Tcl_GetBoolean(interp, argv[2], &doSjis) != TCL_OK) { + return TCL_ERROR; + } else { + globalAssumeSjis = doSjis; + sprintf(interp->result, argv[2]); + return TCL_OK; + } + } + if (globalAssumeSjis == 1) { + sprintf(interp->result, "yes"); + } else { + sprintf(interp->result, "no"); + } + return TCL_OK; + } else if ((c == 's') && (strncmp(argv[1], "scanKanjiToken", length) == 0)) { + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " scanKanjiToken ?bool?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + int doScan; + if (Tcl_GetBoolean(interp, argv[2], &doScan) != TCL_OK) { + return TCL_ERROR; + } else { + globalDoKanjiScan = doScan; + sprintf(interp->result, argv[2]); + return TCL_OK; + } + } + if (globalDoKanjiScan) { + sprintf(interp->result, "yes"); + } else { + sprintf(interp->result, "no"); + } + return TCL_OK; + } else if ((c == 'c') && (strncmp(argv[1], "convertWhenCompile", length) == 0) + && (length >= 7)) { + Interp *iPtr = (Interp *)interp; + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " convertWhenCompile ?bool?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + int compile; + if (Tcl_GetBoolean(interp, argv[2], &compile) != TCL_OK) { + return TCL_ERROR; + } else { + iPtr->kanjiConvertWhenCompile = compile; + sprintf(interp->result, argv[2]); + return TCL_OK; + } + } + if (iPtr->kanjiConvertWhenCompile) { + sprintf(interp->result, "yes"); + } else { + sprintf(interp->result, "no"); + } + return TCL_OK; + } else if ((c == 'd') && (strncmp(argv[1], "defaultInputCode", length) == 0) + && (length >= 8)) { + Interp *iPtr = (Interp *)interp; + + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " defaultInputCode ?value?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + if (Tcl_GetKanjiCode(interp, argv[2], &(iPtr->kanjiInputCode)) + == TCL_ERROR) { + return TCL_ERROR; + } + } + Tcl_SetResult(interp, Tcl_KanjiCodeStr[iPtr->kanjiInputCode], 0); + return TCL_OK; + } else if ((c == 'd') && (strncmp(argv[1], "defaultOutputCode", length) == 0) + && (length >= 8)) { + Interp *iPtr = (Interp *)interp; + + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " defaultOutputCode ?value?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + if (Tcl_GetKanjiCode(interp, argv[2], &(iPtr->kanjiOutputCode)) + == TCL_ERROR) { + return TCL_ERROR; + } + } + Tcl_SetResult(interp, Tcl_KanjiCodeStr[iPtr->kanjiOutputCode], 0); + return TCL_OK; + } else if ((c == 'i') && (strncmp(argv[1], "inputCode", length) == 0) + && (length >= 3)) { + Tcl_Channel chan; + int mode, result; + Tcl_DString ds; + + if (argc != 3 && argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " inputCode channelId ?value?\"", (char *) NULL); + return TCL_ERROR; + } + + chan = Tcl_GetChannel(interp, argv[2], &mode); + if (chan == (Tcl_Channel) NULL) { + return TCL_ERROR; + } + if ((mode & TCL_READABLE) == 0) { + Tcl_AppendResult(interp, "channel \"", argv[2], + "\" wasn't opened for reading", (char *) NULL); + return TCL_ERROR; + } + if (argc == 4) { + result = Tcl_SetChannelOption(interp, chan, "-inputCode", argv[3]); + if (result != TCL_OK) { + return result; + } + } + Tcl_DStringInit(&ds); + if (Tcl_GetChannelOption(interp, chan, "-inputCode", &ds) != TCL_OK) { + panic("Tcl_KanjiCmd: internal error"); + } + Tcl_DStringResult(interp, &ds); + Tcl_DStringFree(&ds); + return TCL_OK; + } else if ((c == 'i') && (strncmp(argv[1], "internalCode", length) == 0) + && (length >= 3)) { + Interp *iPtr = (Interp *)interp; + + if (argc > 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " code ?value?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 3) { + if (Tcl_GetKanjiCode(interp, argv[2], &(iPtr->kanjiCode)) == TCL_ERROR) { + return TCL_ERROR; + } + } + Tcl_SetResult(interp, Tcl_KanjiCodeStr[iPtr->kanjiCode], 0); + return TCL_OK; + } else if ((c == 'l') && (strncmp(argv[1], "lsearch", length) == 0) + && (length >= 3)) { + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " lsearch list pattern\"", (char *) NULL); + return TCL_ERROR; + } + return Tcl_KlsearchCmd(dummy, interp, argc-1, argv+1); + } else if ((c == 'l') && (strncmp(argv[1], "lsort", length) == 0) + && (length >= 3)) { + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " lsort list\"", (char *) NULL); + return TCL_ERROR; + } + return Tcl_KlsortCmd(dummy, interp, argc-1, argv+1); + } else if ((c == 'o') && (strncmp(argv[1], "outputCode", length) == 0)) { + Tcl_Channel chan; + int mode, result; + Tcl_DString ds; + + if (argc != 3 && argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " outputCode channelId ?value?\"", (char *) NULL); + return TCL_ERROR; + } + + chan = Tcl_GetChannel(interp, argv[2], &mode); + if (chan == (Tcl_Channel) NULL) { + return TCL_ERROR; + } + if ((mode & TCL_WRITABLE) == 0) { + Tcl_AppendResult(interp, "channel \"", argv[2], + "\" wasn't opened for writing", (char *) NULL); + return TCL_ERROR; + } + if (argc == 4) { + result = Tcl_SetChannelOption(interp, chan, "-outputCode", argv[3]); + if (result != TCL_OK) { + return result; + } + } + Tcl_DStringInit(&ds); + if (Tcl_GetChannelOption(interp, chan, "-outputCode", &ds) != TCL_OK) { + panic("Tcl_KanjiCmd: internal error"); + } + Tcl_DStringResult(interp, &ds); + Tcl_DStringFree(&ds); + return TCL_OK; + } else if ((c == 's') && (strncmp(argv[1], "split", length) == 0) + && (length >= 2)) { + if (argc != 3 && argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " split string ?splitChars?\"", (char *) NULL); + return TCL_ERROR; + } + return Tcl_KsplitCmd(dummy, interp, argc-1, argv+1); + } else if ((c == 's') && (strncmp(argv[1], "string", length) == 0) + && (length >= 2)) { + if (argc < 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " string option arg ?arg ...?\"", (char *) NULL); + return TCL_ERROR; + } + return Tcl_KstringCmd(dummy, interp, argc-1, argv+1); + } else { + Tcl_AppendResult(interp, "bad option \"", argv[1], + "\": should be code, conversion, convertWhenCompile,", + " defaultInputCode, defaultOutputCode, internalCode,", + " inputCode, lsearch, lsort, outputCode, preferSjis,", + " scanKanjiToken, split, or string", + (char *) NULL); + return TCL_ERROR; + } + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KlsearchCmd -- + * + * This procedure is invoked to process the "klsearch" Tcl command. + * This is the "lsearch" which handles kanji characters. + * See the user documentation for details on what it does. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * See the user documentation. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + int + Tcl_KlsearchCmd(notUsed, interp, argc, argv) + ClientData notUsed; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + int listArgc; + char **listArgv; + int i, match; + int maxlen; + wchar *string, *pattern; + int kanjiCode = ((Interp *)interp)->kanjiCode; + + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " list pattern\"", (char *) NULL); + return TCL_ERROR; + } + if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) { + return TCL_ERROR; + } + for (i = 0, maxlen = 0; i < listArgc; i++) { + int len; + + len = strlen(listArgv[i]); + if (maxlen < len) maxlen = len; + } + string = (wchar *) ckalloc((unsigned)(maxlen + 1) * 2); + pattern = (wchar *) ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], pattern); + match = -1; + for (i = 0; i < listArgc; i++) { + (void) Tcl_KanjiEncode(kanjiCode, listArgv[i], string); + if (Tcl_WStringMatch(string, pattern)) { + match = i; + break; + } + } + sprintf(interp->result, "%d", match); + ckfree((char *) listArgv); + ckfree((char *) string); + ckfree((char *) pattern); + return TCL_OK; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KlsortCmd -- + * + * This procedure is invoked to process the "lsort" Tcl command. + * This is the "lsort" which handles kanji characters. + * See the user documentation for details on what it does. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * See the user documentation. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + int + Tcl_KlsortCmd(notUsed, interp, argc, argv) + ClientData notUsed; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + unsigned int listArgc; + char **listArgv; + + if (argc != 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " list\"", (char *) NULL); + return TCL_ERROR; + } + if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) { + return TCL_ERROR; + } + qsort((VOID *) listArgv, listArgc, sizeof (char *), SortKanjiCompareProc); + interp->result = Tcl_Merge((int)listArgc, listArgv); + interp->freeProc = (Tcl_FreeProc *) free; + ckfree((char *) listArgv); + return TCL_OK; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KsplitCmd -- + * + * This procedure is invoked to process the "ksplit" Tcl command. + * This is the "split" which handles kanji characters. + * See the user documentation for details on what it does. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * See the user documentation. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + int + Tcl_KsplitCmd(dummy, interp, argc, argv) + ClientData dummy; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + int kanjiCode = ((Interp *)interp)->kanjiCode; + wchar *splitChars; + register char *p; + register wchar *wp; + char *elementStr; + int i; + + if (argc == 2) { + splitChars = (wchar *)ckalloc((unsigned)(4 + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, " \n\t\r", splitChars); + } else if (argc == 3) { + splitChars = (wchar *)ckalloc((unsigned) + (Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], splitChars); + } else { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " string ?splitChars?\"", (char *) NULL); + return TCL_ERROR; + } + + /* + * Handle the special case of splitting on every character. + */ + + if (*splitChars == 0) { + #define MAX_BYTES_FOR_ONE_WCHAR 10 /* hope this is enough */ + char str[MAX_BYTES_FOR_ONE_WCHAR]; + + for (p = argv[1]; *p != 0; ) { + if (Tcl_KanjiStart(p, NULL, &kanjiCode)) { + int num; + char c; + wchar *ws, wstr[2]; + + num = Tcl_KanjiLength(p, NULL, kanjiCode); + c = p[num]; + p[num] = 0; + ws = (wchar *) ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, p, NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, p, ws); + + wstr[1] = 0; + for (wp = ws; *wp != 0; wp++) { + wstr[0] = *wp; + if (Tcl_KanjiDecode(kanjiCode, wstr, str) >= MAX_BYTES_FOR_ONE_WCHAR) { + panic("Tcl_KsplitCmd : need larger MAX_BYTES_FOR_ONE_WCHAR"); + } + Tcl_AppendElement(interp, str); + } + + ckfree((char *) ws); + p[num] = c; + p += num; + } else { + str[0] = *p; + str[1] = 0; + Tcl_AppendElement(interp, str); + p++; + } + } + goto done; + } + + /* + * Normal case: split on any of a given set of characters. + * Discard instances of the split characters. + */ + + elementStr = (char *) ckalloc((unsigned)(strlen(argv[1]) + 1)); + i = 0; + for (p = argv[1]; *p != 0; ) { + if (Tcl_KanjiStart(p, NULL, &kanjiCode)) { + int n; + char c; + wchar *wstr, *wstrp, *start; + + n = Tcl_KanjiLength(p, NULL, kanjiCode); + c = p[n]; + p[n] = 0; + wstr = (wchar *) ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, p, NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, p, wstr); + + for (wstrp = start = wstr; *wstrp != 0; wstrp++) { + wchar wc = *wstrp; + + for (wp = splitChars; *wp != 0; wp++) { + if (*wp == wc) { + *wstrp = 0; + i += Tcl_KanjiDecode(kanjiCode, start, elementStr+i); + elementStr[i] = 0; + Tcl_AppendElement(interp, elementStr); + i = 0; + *wstrp = wc; + start = wstrp + 1; + break; + } + } + } + if (wstrp != start) { + i += Tcl_KanjiDecode(kanjiCode, start, elementStr+i); + } + ckfree((char *) wstr); + p[n] = c; + p += n; + } else { + for (wp = splitChars; *wp != 0; wp++) { + if (*wp == (wchar )*p) { + elementStr[i] = 0; + Tcl_AppendElement(interp, elementStr); + i = 0; + break; + } + } + if (*wp == 0) elementStr[i++] = *p; + p++; + } + } + if (p != argv[1]) { + elementStr[i] = 0; + Tcl_AppendElement(interp, elementStr); + } + + ckfree((char *) elementStr); + done: + ckfree((char *) splitChars); + return TCL_OK; + #undef MAX_BYTES_FOR_ONE_WCHAR + #undef MAX_BYTES_FOR_AN_ELEMENT + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KstringCmd -- + * + * This procedure is invoked to process the "kstring" Tcl command. + * This is the "string" which handles kanji characters. + * See the user documentation for details on what it does. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * See the user documentation. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + int + Tcl_KstringCmd(dummy, interp, argc, argv) + ClientData dummy; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + int kanjiCode = ((Interp *)interp)->kanjiCode; + unsigned int length; + register char c; + wchar *wstr1, *wstr2; + register wchar *wp, wc; + int match; + int first; + int left = 0, right = 0; + + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " option arg ?arg ...?\"", (char *) NULL); + return TCL_ERROR; + } + c = argv[1][0]; + length = strlen(argv[1]); + if ((c == 'c') && (strncmp(argv[1], "compare", length) == 0)) { + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " compare string1 string2\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + wstr2 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[3], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[3], wstr2); + match = Tcl_WStrcmp(wstr1, wstr2); + if (match > 0) { + interp->result = "1"; + } else if (match < 0) { + interp->result = "-1"; + } else { + interp->result = "0"; + } + ckfree((char *)wstr1); + ckfree((char *)wstr2); + return TCL_OK; + } else if ((c == 'f') && (strncmp(argv[1], "first", length) == 0)) { + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " first string1 string2\"", (char *) NULL); + return TCL_ERROR; + } + first = 1; + + firstLast: + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + wstr2 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[3], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[3], wstr2); + match = -1; + wc = *wstr1; + length = Tcl_WStrlen(wstr1); + for (wp = wstr2; *wp != 0; wp++) { + if (*wp != wc) { + continue; + } + if (Tcl_WStrncmp(wstr1, wp, (int)length) == 0) { + match = wp - wstr2; + if (first) { + break; + } + } + } + sprintf(interp->result, "%d", match); + ckfree((char *)wstr1); + ckfree((char *)wstr2); + return TCL_OK; + } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)) { + int index; + + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " index string charIndex\"", (char *) NULL); + return TCL_ERROR; + } + if (Tcl_GetInt(interp, argv[3], &index) != TCL_OK) { + return TCL_ERROR; + } + if ((index >= 0) && (index < (int)strlen(argv[2]))) { + wchar wstr[2]; + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + wstr[0] = wstr1[index]; + wstr[1] = 0; + (void) Tcl_KanjiDecode(kanjiCode, wstr, interp->result); + ckfree((char *)wstr1); + } + return TCL_OK; + } else if ((c == 'l') && (strncmp(argv[1], "last", length) == 0) + && (length >= 2)) { + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " last string1 string2\"", (char *) NULL); + return TCL_ERROR; + } + first = 0; + goto firstLast; + } else if ((c == 'l') && (strncmp(argv[1], "length", length) == 0) + && (length >= 2)) { + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " length string\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + sprintf(interp->result, "%d", Tcl_WStrlen(wstr1)); + ckfree((char *)wstr1); + return TCL_OK; + } else if ((c == 'm') && (strncmp(argv[1], "match", length) == 0)) { + if (argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " match pattern string\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + wstr2 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[3], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[3], wstr2); + if (Tcl_WStringMatch(wstr2, wstr1) != 0) { + interp->result = "1"; + } else { + interp->result = "0"; + } + ckfree((char *)wstr1); + ckfree((char *)wstr2); + return TCL_OK; + } else if ((c == 'r') && (strncmp(argv[1], "range", length) == 0)) { + int first, last, stringLength; + + if (argc != 5) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " range string first last\"", (char *) NULL); + return TCL_ERROR; + } + if (Tcl_GetInt(interp, argv[3], &first) != TCL_OK) { + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + stringLength = Tcl_WStrlen(wstr1); + if ((*argv[4] == 'e') + && (strncmp(argv[4], "end", strlen(argv[4])) == 0)) { + last = stringLength-1; + } else { + if (Tcl_GetInt(interp, argv[4], &last) != TCL_OK) { + Tcl_ResetResult(interp); + Tcl_AppendResult(interp, + "expected integer or \"end\" but got \"", + argv[4], "\"", (char *) NULL); + ckfree((char *)wstr1); + return TCL_ERROR; + } + } + if (first < 0) { + first = 0; + } + if (last >= stringLength) { + last = stringLength-1; + } + if (last >= first) { + char *str; + wchar saved; + + wp = wstr1 + last + 1; + saved = *wp; + *wp = 0; + str = (char *)ckalloc((unsigned)(Tcl_KanjiDecode(kanjiCode, wstr1+first, NULL) + 1)); + (void) Tcl_KanjiDecode(kanjiCode, wstr1+first, str); + Tcl_SetResult(interp, str, TCL_VOLATILE); + *wp = saved; + ckfree(str); + } + ckfree((char *)wstr1); + return TCL_OK; + } else if ((c == 't') && (strncmp(argv[1], "tolower", length) == 0) + && (length >= 3)) { + char *str; + + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " tolower string\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + for (wp = wstr1; *wp != 0; wp++) { + if (ISWUPPER(*wp)) { + *wp = tolower((char )*wp); + } + } + str = (char *)ckalloc((unsigned)(Tcl_KanjiDecode(kanjiCode, wstr1, NULL) + 1)); + (void) Tcl_KanjiDecode(kanjiCode, wstr1, str); + Tcl_SetResult(interp, str, TCL_VOLATILE); + ckfree(str); + ckfree((char *)wstr1); + return TCL_OK; + } else if ((c == 't') && (strncmp(argv[1], "toupper", length) == 0) + && (length >= 3)) { + char *str; + + if (argc != 3) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " toupper string\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + for (wp = wstr1; *wp != 0; wp++) { + if (ISWLOWER(*wp)) { + *wp = toupper((char )*wp); + } + } + str = (char *)ckalloc((unsigned)(Tcl_KanjiDecode(kanjiCode, wstr1, NULL) + 1)); + (void) Tcl_KanjiDecode(kanjiCode, wstr1, str); + Tcl_SetResult(interp, str, TCL_VOLATILE); + ckfree(str); + ckfree((char *)wstr1); + return TCL_OK; + } else if ((c == 't') && (strncmp(argv[1], "trim", length) == 0) + && (length == 4)) { + wchar *trimChars, *wstr; + register wchar *checkPtr; + char *str; + + left = right = 1; + + trim: + if (argc == 4) { + trimChars = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[3], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[3], trimChars); + } else if (argc == 3) { + trimChars = (wchar *)ckalloc((unsigned)(4 + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, " \t\n\r", trimChars); + } else { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " ", argv[1], " string ?chars?\"", (char *) NULL); + return TCL_ERROR; + } + wstr1 = (wchar *)ckalloc((unsigned)(Tcl_KanjiEncode(kanjiCode, argv[2], NULL) + 1) * 2); + (void) Tcl_KanjiEncode(kanjiCode, argv[2], wstr1); + wp = wstr1; + if (left) { + for (wc = *wp; wc != 0; wp++, wc = *wp) { + for (checkPtr = trimChars; *checkPtr != wc; checkPtr++) { + if (*checkPtr == 0) { + goto doneLeft; + } + } + } + } + doneLeft: + wstr = wp; + if (right) { + wchar *donePtr; + + wp = wstr + Tcl_WStrlen(wstr) - 1; + donePtr = &wstr[-1]; + for (wc = *wp; wp != donePtr; wp--, wc = *wp) { + for (checkPtr = trimChars; *checkPtr != wc; checkPtr++) { + if (*checkPtr == 0) { + goto doneRight; + } + } + } + doneRight: + wp[1] = 0; + } + str = (char *)ckalloc((unsigned)(Tcl_KanjiDecode(kanjiCode, wstr, NULL) + 1)); + (void) Tcl_KanjiDecode(kanjiCode, wstr, str); + Tcl_SetResult(interp, str, TCL_VOLATILE); + ckfree(str); + ckfree((char *)trimChars); + ckfree((char *)wstr1); + return TCL_OK; + } else if ((c == 't') && (strncmp(argv[1], "trimleft", length) == 0) + && (length > 4)) { + left = 1; + argv[1] = "trimleft"; + goto trim; + } else if ((c == 't') && (strncmp(argv[1], "trimright", length) == 0) + && (length > 4)) { + right = 1; + argv[1] = "trimright"; + goto trim; + } else { + Tcl_AppendResult(interp, "bad option \"", argv[1], + "\": should be compare, first, index, last, length, match, ", + "range, tolower, toupper, trim, trimleft, or trimright", + (char *) NULL); + return TCL_ERROR; + } + } + #endif /* KANJI */ /* *---------------------------------------------------------------------- * *************** *** 2931,2933 **** --- 3821,3838 ---- } return diff; } + + #ifdef KANJI + static int + SortKanjiCompareProc(first, second) + CONST VOID *first, *second; /* Elements to be compared. */ + { + unsigned char *s1 = *((unsigned char **) first); + unsigned char *s2 = *((unsigned char **) second); + + for ( ; *s1 == *s2; s1++, s2++) { + if (*s1 == '\0') return 0; + } + return (*s1 - *s2); + } + #endif /* KANJI */ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCmdMZ.c ./generic/tclCmdMZ.c *** ../../tcl8.0.5/generic/tclCmdMZ.c Tue Sep 15 03:39:57 1998 --- ./generic/tclCmdMZ.c Fri Mar 12 02:19:09 1999 *************** *** 1447,1452 **** --- 1447,1457 ---- int code, count, doVars, doCmds, doBackslashes, i; size_t length; char c; + #ifdef KANJI + char *endPtr = NULL; + int maxLen = 0; + int valLen = 0; + #endif /* KANJI */ /* * Parse command-line options. *************** *** 1490,1504 **** --- 1495,1526 ---- Tcl_DStringInit(&result); old = p = argv[i]; + #ifdef KANJI + maxLen = strlen(argv[i]); + endPtr = p + maxLen; + #endif /* KANJI */ while (*p != 0) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, endPtr, NULL); + continue; + } + #endif /* KANJI */ switch (*p) { case '\\': if (doBackslashes) { if (p != old) { Tcl_DStringAppend(&result, old, p-old); } + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, endPtr, &c, &valLen, &count); + if (valLen == 1) { + Tcl_DStringAppend(&result, &c, 1); + } + #else c = Tcl_Backslash(p, &count); Tcl_DStringAppend(&result, &c, 1); + #endif /* KANJI */ p += count; old = p; } else { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCompExpr.c ./generic/tclCompExpr.c *** ../../tcl8.0.5/generic/tclCompExpr.c Tue Sep 15 03:39:58 1998 --- ./generic/tclCompExpr.c Fri Mar 12 00:00:52 1999 *************** *** 2066,2071 **** --- 2066,2077 ---- * termporarily replaced by a null char * during braced string processing. */ int numRead; + #ifdef KANJI + int kanjiCode = TCL_ANY; + char *endPtr = infoPtr->lastChar + 1; + + envPtr->lastScannedKanjiCode = TCL_ANY; + #endif /* KANJI */ /* * Check first for any backslash-newlines, since we must treat *************** *** 2078,2083 **** --- 2084,2097 ---- Tcl_AppendToObj(Tcl_GetObjResult(interp), "missing close-brace", -1); return TCL_ERROR; + #ifdef KANJI + } else if (IS_KANJISTART(UCHAR(*src))) { + src += Tcl_KanjiSkip(src, endPtr, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + continue; + #endif /* KANJI */ } else if (CHAR_TYPE(src, infoPtr->lastChar) == TCL_NORMAL) { src++; continue; *************** *** 2095,2101 **** --- 2109,2119 ---- if (*src == '\n') { hasBackslashNL = 1; } + #ifdef KANJI + (void)Tcl_KanjiBackslash(src-1, endPtr, NULL, NULL, &numRead); + #else (void) Tcl_Backslash(src-1, &numRead); + #endif /* KANJI */ src += numRead - 1; } } *************** *** 2117,2129 **** --- 2135,2161 ---- register char *dst = buffer; register char *p = string; while (p <= last) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + int skip = Tcl_KanjiSkip(p, last + 1, NULL); + while (skip > 0) { + *dst++ = *p++; + skip--; + } + continue; + } + #endif /* KANJI */ c = *dst++ = *p++; if (c == '\\') { if (*p == '\n') { dst[-1] = Tcl_Backslash(p-1, &numRead); p += numRead - 1; } else { + #ifdef KANJI + (void)Tcl_KanjiBackslash(p-1, last + 1, NULL, NULL, &numRead); + #else (void) Tcl_Backslash(p-1, &numRead); + #endif /* KANJI */ while (numRead > 1) { *dst++ = *p++; numRead--; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCompile.c ./generic/tclCompile.c *** ../../tcl8.0.5/generic/tclCompile.c Wed Feb 3 09:55:04 1999 --- ./generic/tclCompile.c Fri Mar 12 00:00:53 1999 *************** *** 414,419 **** --- 414,424 ---- static int SetByteCodeFromAny _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); static void UpdateStringOfByteCode _ANSI_ARGS_((Tcl_Obj *objPtr)); + #ifdef KANJI + static int GetKanjiVarAndEl _ANSI_ARGS_((char *src, int len, + char **varName, char **elName, + int *varLen, int *elLen, CompileEnv *envPtr)); + #endif /* KANJI */ /* * The structure below defines the bytecode Tcl object type by *************** *** 1210,1215 **** --- 1215,1223 ---- envPtr->auxDataArrayNext = 0; envPtr->auxDataArrayEnd = COMPILEENV_INIT_AUX_DATA_SIZE; envPtr->mallocedAuxDataArray = 0; + #ifdef KANJI + envPtr->lastScannedKanjiCode = TCL_NOT_SCANNED; + #endif /* KANJI */ } /* *************** *** 1396,1401 **** --- 1404,1414 ---- memcpy((VOID *) p, (VOID *) envPtr->excRangeArrayPtr, exceptArrayBytes); } + #ifdef BUGFIX + else { + codePtr->excRangeArrayPtr = NULL; + } + #endif /* BUGFIX */ p += TCL_ALIGN(exceptArrayBytes); /* align AuxData array */ if (auxDataArrayBytes > 0) { *************** *** 1403,1408 **** --- 1416,1426 ---- memcpy((VOID *) p, (VOID *) envPtr->auxDataArrayPtr, auxDataArrayBytes); } + #ifdef BUGFIX + else { + codePtr->auxDataArrayPtr = NULL; + } + #endif /* BUGFIX */ p += auxDataArrayBytes; nextPtr = EncodeCmdLocMap(envPtr, codePtr, (unsigned char *) p); *************** *** 1734,1742 **** --- 1752,1769 ---- if (c == '#') { while (src != lastChar) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, NULL); + } else + #endif /* KANJI */ if (c == '\\') { int numRead; + #ifdef KANJI + (void)Tcl_KanjiBackslash(src, lastChar, NULL, NULL, &numRead); + #else Tcl_Backslash(src, &numRead); + #endif /* KANJI */ src += numRead; } else if (c == '\n') { src++; *************** *** 2405,2410 **** --- 2432,2444 ---- int savePushSimpleWords = envPtr->pushSimpleWords; int result = TCL_OK; int numRead; + #ifdef KANJI + int kanjiCode = TCL_ANY; + int bsKanjiCode = TCL_ANY; + int checkBs = 1; + + envPtr->lastScannedKanjiCode = TCL_ANY; + #endif /* KANJI */ type = CHAR_TYPE(src, lastChar); while (1) { *************** *** 2426,2434 **** --- 2460,2499 ---- start = src; hasBackslash = 0; do { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + } else + #endif /* KANJI */ if (type == TCL_BACKSLASH) { hasBackslash = 1; + #ifdef KANJI + /* + * Since Tcl_KanjiBackslashIsKanji() scans successive '\\' sequence, + * No need continuous calling. It's wasting time. + * And, if bsKanjiCode != TCL_ANY, also avoiding to call. + */ + if (checkBs == 1) { + bsKanjiCode = Tcl_KanjiBackslashIsKanji(src, lastChar); + } + (void)Tcl_KanjiBackslash(src, lastChar, NULL, NULL, &numRead); + if (bsKanjiCode != TCL_ANY) { + checkBs = 0; + } else { + if (src + numRead < lastChar) { + if (src[numRead] == '\\') { + checkBs = 0; + } else { + checkBs = 1; + } + } + } + #else Tcl_Backslash(src, &numRead); + #endif /* KANJI */ if (src[1] == '\n') { src += numRead; type = TCL_SPACE; /* force word end */ *************** *** 2479,2499 **** char *buffer = ckalloc((unsigned) numChars + 1); register char *dst = buffer; register char *p = start; while (p < src) { ! if (*p == '\\') { *dst = Tcl_Backslash(p, &numRead); if (p[1] == '\n') { break; } p += numRead; dst++; } else { *dst++ = *p++; } } *dst = '\0'; objIndex = TclObjIndexForString(buffer, dst-buffer, /*allocStrRep*/ 1, /*inHeap*/ 1, envPtr); } else { objIndex = TclObjIndexForString(start, numChars, /*allocStrRep*/ 1, /*inHeap*/ 0, envPtr); --- 2544,2628 ---- char *buffer = ckalloc((unsigned) numChars + 1); register char *dst = buffer; register char *p = start; + #ifdef KANJI + int doConv = envPtr->iPtr->kanjiConvertWhenCompile; + int valLen = 0; + int skip = 0; + int bufLen = numChars + 1; + wchar *wsTmp = (wchar *)ckalloc((unsigned int)(bufLen * sizeof(wchar))); + unsigned char save; + int cLen; + int allLen = 0; + int doConvByMySelf = (bsKanjiCode != TCL_ANY && + kanjiCode != envPtr->iPtr->kanjiCode); + #endif /* KANJI */ while (p < src) { ! #ifdef KANJI ! if (IS_KANJISTART(UCHAR(*p))) { ! skip = Tcl_KanjiSkip(p, src, NULL); ! if (doConvByMySelf == 1) { ! /* ! * convert by myself. ! */ ! save = p[skip]; ! p[skip] = '\0'; ! Tcl_KanjiEncode(kanjiCode, p, wsTmp); ! allLen += cLen = Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wsTmp, NULL); ! if (allLen > bufLen) { ! bufLen = allLen; ! buffer = (char *)ckrealloc(buffer, (unsigned int)bufLen); ! dst = buffer + allLen - cLen; ! } ! Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wsTmp, dst); ! p[skip] = save; ! dst += cLen; ! p += skip; ! } else { ! while (skip > 0) { ! *dst++ = *p++; ! skip--; ! } ! } ! continue; ! } ! #endif /* KANJI */ ! if (*p == '\\') { ! #ifdef KANJI ! (void)Tcl_KanjiBackslash(p, src, dst, &valLen, &numRead); ! if (p[1] == '\n') { ! break; ! } ! p += numRead; ! dst += valLen; ! #else *dst = Tcl_Backslash(p, &numRead); if (p[1] == '\n') { break; } p += numRead; dst++; + #endif /* KANJI */ } else { *dst++ = *p++; } } *dst = '\0'; + #ifdef KANJI + /* + * bsKanjiCode != TCL_ANY means '\\' seq matchs kanji. + * In this case, avoid re-conversion of backslash seq to kanji. + * Otherwise convert to internal kanji code. + */ + if (doConvByMySelf == 1) { + envPtr->iPtr->kanjiConvertWhenCompile = BS_ASUMP_KANJI; + } + #endif /* KANJI */ objIndex = TclObjIndexForString(buffer, dst-buffer, /*allocStrRep*/ 1, /*inHeap*/ 1, envPtr); + #ifdef KANJI + envPtr->iPtr->kanjiConvertWhenCompile = doConv; + ckfree((char *)wsTmp); + #endif /* KANJI */ } else { objIndex = TclObjIndexForString(start, numChars, /*allocStrRep*/ 1, /*inHeap*/ 0, envPtr); *************** *** 2654,2659 **** --- 2783,2795 ---- int numChars; /* Number of chars in string_part. */ int savePushSimpleWords = envPtr->pushSimpleWords; int result = TCL_OK; + #ifdef KANJI + int kanjiCode = TCL_ANY; + int bsKanjiCode = TCL_ANY; + int checkBs = 1; + + envPtr->lastScannedKanjiCode = TCL_ANY; + #endif /* KANJI */ /* * quoted_string: '"' string_part* '"' (or termChar instead of ") *************** *** 2707,2716 **** --- 2843,2884 ---- start = src; hasBackslash = 0; do { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + } else + #endif /* KANJI */ if (c == '\\') { hasBackslash = 1; + #ifdef KANJI + /* + * Since Tcl_KanjiBackslashIsKanji() scans successive '\\' sequence, + * No need continuous calling. It's wasting time. + * And, if bsKanjiCode != TCL_ANY, also avoiding to call. + */ + if (checkBs == 1) { + bsKanjiCode = Tcl_KanjiBackslashIsKanji(src, lastChar); + } + (void)Tcl_KanjiBackslash(src, lastChar, NULL, NULL, &numRead); + src += numRead; + if (bsKanjiCode != TCL_ANY) { + checkBs = 0; + } else { + if (src < lastChar) { + if (*src == '\\') { + checkBs = 0; + } else { + checkBs = 1; + } + } + } + #else Tcl_Backslash(src, &numRead); src += numRead; + #endif /* KANJI */ } else { src++; } *************** *** 2762,2778 **** --- 2930,3006 ---- char *buffer = ckalloc((unsigned) numChars + 1); register char *dst = buffer; register char *p = start; + #ifdef KANJI + int doConv = envPtr->iPtr->kanjiConvertWhenCompile; + int valLen = 0; + int skip = 0; + int bufLen = numChars + 1; + wchar *wsTmp = (wchar *)ckalloc((unsigned int)(bufLen * sizeof(wchar))); + unsigned char save; + int cLen; + int allLen = 0; + int doConvByMySelf = (bsKanjiCode != TCL_ANY && + kanjiCode != envPtr->iPtr->kanjiCode); + #endif /* KANJI */ while (p < src) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + skip = Tcl_KanjiSkip(p, src, NULL); + if (doConvByMySelf == 1) { + /* + * convert by myself. + */ + save = p[skip]; + p[skip] = '\0'; + Tcl_KanjiEncode(kanjiCode, p, wsTmp); + allLen += cLen = Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wsTmp, NULL); + if (allLen > bufLen) { + bufLen = allLen; + buffer = (char *)ckrealloc(buffer, (unsigned int)bufLen); + dst = buffer + allLen - cLen; + } + Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wsTmp, dst); + p[skip] = save; + dst += cLen; + p += skip; + } else { + while (skip > 0) { + *dst++ = *p++; + skip--; + } + } + continue; + } + #endif /* KANJI */ if (*p == '\\') { + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, src, dst, &valLen, &numRead); + dst += valLen; + #else *dst++ = Tcl_Backslash(p, &numRead); + #endif /* KANJI */ p += numRead; } else { *dst++ = *p++; } } *dst = '\0'; + #ifdef KANJI + /* + * bsKanjiCode != TCL_ANY means '\\' seq matchs kanji. + * In this case, avoid re-conversion of backslash seq to kanji. + * Otherwise convert to internal kanji code. + */ + if (doConvByMySelf == 1) { + envPtr->iPtr->kanjiConvertWhenCompile = BS_ASUMP_KANJI; + } + #endif /* KANJI */ objIndex = TclObjIndexForString(buffer, (dst - buffer), /*allocStrRep*/ 1, /*inHeap*/ 1, envPtr); + #ifdef KANJI + envPtr->iPtr->kanjiConvertWhenCompile = doConv; + ckfree((char *)wsTmp); + #endif /* KANJI */ } else { objIndex = TclObjIndexForString(start, numChars, /*allocStrRep*/ 1, /*inHeap*/ 0, envPtr); *************** *** 2907,2912 **** --- 3135,3145 ---- * object holding a braced string. */ int numRead; int result = TCL_OK; + #ifdef KANJI + int kanjiCode = TCL_ANY; + + envPtr->lastScannedKanjiCode = TCL_ANY; + #endif /* KANJI */ /* * Check for any backslash-newlines, since we must treat *************** *** 2922,2927 **** --- 3155,3169 ---- result = TCL_ERROR; goto done; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + continue; + } else + #endif /* KANJI */ if (CHAR_TYPE(src, lastChar) != TCL_NORMAL) { if (c == '{') { level++; *************** *** 2936,2942 **** --- 3178,3188 ---- if (*(src+1) == '\n') { hasBackslashNewline = 1; } + #ifdef KANJI + (void)Tcl_KanjiBackslash(src, lastChar, NULL, NULL, &numRead); + #else (void) Tcl_Backslash(src, &numRead); + #endif /* KANJI */ src += numRead - 1; } } *************** *** 2975,2987 **** --- 3221,3247 ---- register char *dst = buffer; register char *p = string; while (p <= last) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + int skip = Tcl_KanjiSkip(p, last + 1, NULL); + while (skip > 0) { + *dst++ = *p++; + skip--; + } + continue; + } + #endif /* KANJI */ c = *dst++ = *p++; if (c == '\\') { if (*p == '\n') { dst[-1] = Tcl_Backslash(p-1, &numRead); p += numRead - 1; } else { + #ifdef KANJI + (void)Tcl_KanjiBackslash(p-1, last + 1, NULL, NULL, &numRead); + #else (void) Tcl_Backslash(p-1, &numRead); + #endif /* KANJI */ while (numRead > 1) { *dst++ = *p++; numRead--; *************** *** 3071,3076 **** --- 3331,3341 ---- * to push the variable. */ int savePushSimpleWords = envPtr->pushSimpleWords; int result = TCL_OK; + #ifdef KANJI + int kanjiCode = TCL_ANY; + + envPtr->lastScannedKanjiCode = TCL_ANY; + #endif /* KANJI */ /* * var_reference: '$' '{' braced_name '}' | *************** *** 3117,3127 **** --- 3382,3410 ---- result = TCL_ERROR; goto done; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, &kanjiCode); + c = *src; + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + continue; + } + #endif /* KANJI */ src++; c = *src; } nameChars = (src - name); for (p = name; p < src; p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, src, &kanjiCode) - 1); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + } else + #endif /* KANJI */ if ((*p == ':') && (*(p+1) == ':')) { nameHasNsSeparators = 1; break; *************** *** 3135,3141 **** --- 3418,3437 ---- name = src; c = *src; + #ifdef KANJI + while (isalnum(UCHAR(c)) || (c == '_') || (c == ':') || + IS_KANJISTART(UCHAR(c))) { + if (IS_KANJISTART(UCHAR(c))) { + src += Tcl_KanjiSkip(src, lastChar, &kanjiCode); + c = *src; + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + continue; + } + #else while (isalnum(UCHAR(c)) || (c == '_') || (c == ':')) { + #endif /* KANJI */ if (c == ':') { if (*(src+1) == ':') { nameHasNsSeparators = 1; *************** *** 3174,3180 **** * compiling a procedure body or if the name has namespace * qualifiers ("::"s). */ ! if (!isArrayRef) { /* scalar reference */ if ((envPtr->procPtr == NULL) || nameHasNsSeparators) { savedChar = name[nameChars]; --- 3470,3476 ---- * compiling a procedure body or if the name has namespace * qualifiers ("::"s). */ ! if (!isArrayRef) { /* scalar reference */ if ((envPtr->procPtr == NULL) || nameHasNsSeparators) { savedChar = name[nameChars]; *************** *** 3309,3314 **** --- 3605,3615 ---- return 0; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, lastChar, NULL) - 1); + } else + #endif /* KANJI */ if (*p == '(') { if (*lastChar == ')') { /* we have an array element */ return 0; *************** *** 5227,5234 **** --- 5528,5539 ---- int objIndex; /* The object array index for a pushed * object holding a name part. */ int savePushSimpleWords = envPtr->pushSimpleWords; + #ifdef KANJI + int result; + #else char *p; int i, result; + #endif /* KANJI */ /* * Parse the next word: the variable name. If it is "simple" (requires *************** *** 5262,5267 **** --- 5567,5576 ---- } elName = NULL; elNameChars = 0; + #ifdef KANJI + (void) GetKanjiVarAndEl(name, nameChars, + &name, &elName, &nameChars, &elNameChars, envPtr); + #else p = name; for (i = 0; i < nameChars; i++) { if (*p == '(') { *************** *** 5276,5281 **** --- 5585,5591 ---- } p++; } + #endif /* KANJI */ } else { maxDepth = envPtr->maxStackDepth; } *************** *** 5634,5639 **** --- 5944,5952 ---- int nameHasNsSeparators = 0; /* Set 1 if name contains "::"s. */ int elNameChars; /* Length of array's element name if any. */ + #ifdef KANJI + char *lastChar; + #endif /* KANJI */ /* * A simple name. First divide it up into "name" plus "elName" *************** *** 5644,5650 **** nameChars = envPtr->numSimpleWordChars; elName = NULL; elNameChars = 0; ! p = name; for (i = 0; i < nameChars; i++) { if (*p == '(') { --- 5957,5968 ---- nameChars = envPtr->numSimpleWordChars; elName = NULL; elNameChars = 0; ! ! #ifdef KANJI ! (void) GetKanjiVarAndEl(name, nameChars, ! &name, &elName, &nameChars, &elNameChars, envPtr); ! lastChar = name + nameChars; ! #else p = name; for (i = 0; i < nameChars; i++) { if (*p == '(') { *************** *** 5659,5664 **** --- 5977,5983 ---- } p++; } + #endif /* KANJI */ /* * Determine if name has any namespace separators (::'s). *************** *** 5666,5671 **** --- 5985,5996 ---- p = name; for (i = 0; i < nameChars; i++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + i += (Tcl_KanjiSkip(p, lastChar, NULL) - 1); + p = &(name[i]); + } else + #endif /* KANJI */ if ((*p == ':') && ((i+1) < nameChars) && (*(p+1) == ':')) { nameHasNsSeparators = 1; break; *************** *** 6973,6978 **** --- 7298,7307 ---- * string: if an object is created and allocStrRep is 1 then its * string representation is set directly from string, otherwise * the string is freed. + #ifdef KANJI + * And, envPtr->lastScannedKanjiCode is initialized to TCL_NOT_SCANNED + * for next calling of this function. + #endif * *---------------------------------------------------------------------- */ *************** *** 6996,7003 **** --- 7325,7339 ---- int objIndex; /* Index of matching object. */ Tcl_HashEntry *hPtr; int strLength, new; + #ifdef KANJI + int lastScannedKanjiCode = envPtr->lastScannedKanjiCode; /* + * First, reset last scanned kanji code for further source scanning. + */ + envPtr->lastScannedKanjiCode = TCL_NOT_SCANNED; + #endif /* KANJI */ + /* * Look up the string in the code's object hashtable. If found, just * return the associated object array index. Note that if the string * has embedded nulls, we don't create a hash table entry. This *************** *** 7028,7033 **** --- 7364,7423 ---- objPtr = Tcl_NewObj(); if (allocStrRep) { + #ifdef KANJI + #if 0 + fprintf(stderr, "debug: iCode %s lCode %s conv %s '%s'\n", + Tcl_KanjiCodeStr[envPtr->iPtr->kanjiCode], + Tcl_KanjiCodeStr[lastScannedKanjiCode], + (envPtr->iPtr->kanjiConvertWhenCompile == 1) ? "true" : "false", + string); + #endif + if ((length > 1) && + (envPtr->iPtr->kanjiConvertWhenCompile != 0) && + (envPtr->iPtr->kanjiCode != TCL_ANY) && + (lastScannedKanjiCode != TCL_ANY) && + (lastScannedKanjiCode != envPtr->iPtr->kanjiCode)) { + char *newStr; + int nLen; + wchar *wTmp; + + if (lastScannedKanjiCode == TCL_NOT_SCANNED) { + (void) Tcl_KanjiString(NULL, string, NULL, &lastScannedKanjiCode); + if (lastScannedKanjiCode == TCL_ANY || + lastScannedKanjiCode == TCL_NOT_KANJI || + lastScannedKanjiCode == envPtr->iPtr->kanjiCode) { + goto noConv; + } + } + + nLen = Tcl_KanjiEncode(lastScannedKanjiCode, string, NULL); + wTmp = (wchar *)ckalloc(sizeof(wchar) * (nLen + 1)); + (void) Tcl_KanjiEncode(lastScannedKanjiCode, string, wTmp); + nLen = Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wTmp, NULL); + newStr = (char *)ckalloc(sizeof(char) * (nLen + 1)); + (void) Tcl_KanjiDecode(envPtr->iPtr->kanjiCode, wTmp, newStr); + ckfree((char *)wTmp); + + if (inHeap) { + ckfree(string); + } + + objPtr->bytes = newStr; + objPtr->length = nLen; + } else { + noConv: + if (inHeap) { /* use input string for obj's string rep */ + objPtr->bytes = string; + } else { /* must allocate string rep */ + if (length > 0) { + objPtr->bytes = ckalloc((unsigned) length + 1); + memcpy(objPtr->bytes, string, (size_t) length); + objPtr->bytes[length] = '\0'; + } + } + objPtr->length = length; + } + #else if (inHeap) { /* use input string for obj's string rep */ objPtr->bytes = string; } else { *************** *** 7039,7044 **** --- 7429,7435 ---- } } objPtr->length = length; + #endif /* KANJI */ } else { /* leave the string rep NULL */ if (inHeap) { ckfree(string); *************** *** 8089,8091 **** --- 8480,8579 ---- auxDataTypeTableInitialized = 0; } } + + + #ifdef KANJI + /* + *---------------------------------------------------------------------- + * + * GetKanjiVarAndEl -- + * + * Search variable name and index from given string with kanji care. + * + * Results: + * Set variable name and index to given pointers, return kanji code. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + static int + GetKanjiVarAndEl(src, len, varName, elName, varLen, elLen, envPtr) + char *src; + int len; + char **varName; + char **elName; + int *varLen; + int *elLen; + CompileEnv *envPtr; + { + int i = 0; + unsigned char *end = src + len; + int kanjiCode = TCL_ANY; + + envPtr->lastScannedKanjiCode = TCL_ANY; + *elName = (char *)NULL; + *elLen = 0; + *varName = src; + *varLen = len; + + while ( (i < len) && src[i] != '(' ) { + if (IS_KANJISTART(UCHAR(src[i]))) { + i += Tcl_KanjiSkip(&(src[i]), end, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + } else { + i++; + } + } + + *varLen = i; + if (i < len && src[i] == '(') { + i++; + if (src[len - 1] == ')') { + *elName = &(src[i]); + *elLen = len - i - 1; + } else { + *varLen = len; + } + } + + if (elName != NULL && *elLen > 0) { + char *p = *elName; + char *last = *elName + *elLen; + while (p < last) { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, last, &kanjiCode); + if (kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + envPtr->lastScannedKanjiCode = kanjiCode; + } + } else { + p++; + } + } + } + + #ifdef ARRAY_DEBUG + { + char *vN = alloca(*varLen + 1); + char *eN = alloca(*elLen + 1); + char *ss = alloca(len + 1); + + memcpy(vN, *varName, *varLen); + vN[*varLen] = '\0'; + + memcpy(eN, *elName, *elLen); + eN[*elLen] = '\0'; + + memcpy(ss, src, len); + ss[len] = '\0'; + fprintf(stderr, "src '%s' -> v:'%s' %d, e:'%s' %d\n", ss, vN, *varLen, eN, *elLen); + } + #endif /* ARRAY_DEBUG */ + + return kanjiCode; + } + #endif /* KANJI */ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclCompile.h ./generic/tclCompile.h *** ../../tcl8.0.5/generic/tclCompile.h Tue Sep 15 03:39:58 1998 --- ./generic/tclCompile.h Fri Mar 12 00:00:55 1999 *************** *** 21,26 **** --- 21,46 ---- # define TCL_STORAGE_CLASS DLLEXPORT #endif + #ifdef KANJI + + /* + * We have to decide the handling of backslash sequence that matched + * *ANY* kanji sequence. When it is matched, someone might want tclsh + * to convert it to the internal kanji code, but someone might *NOT* + * (It's me B). As the default, backslash sequence matched *ANY* + * kanji sequence is never converted. + * m-hirano + * P.S. + * As you can see, you may change this default when installation + * time by specifying '-DBS_ASUMP_KANJI=1' option. + */ + + #ifndef BS_ASUMP_KANJI + #define BS_ASUMP_KANJI 0 + #endif /* BS_ASUMP_KANJI */ + + #endif /* KANJI */ + /* *------------------------------------------------------------------------ * Variables related to compilation. These are used in tclCompile.c, *************** *** 308,313 **** --- 328,337 ---- int auxDataArrayEnd; /* Index after last aux data array entry. */ int mallocedAuxDataArray; /* 1 if aux data array was expanded and * auxDataArrayPtr points in heap else 0. */ + #ifdef KANJI + int lastScannedKanjiCode; /* Used in TclObjIndexForString() to determine + * conversion of given token is needed. */ + #endif /* KANJI */ unsigned char staticCodeSpace[COMPILEENV_INIT_CODE_BYTES]; /* Initial storage for code. */ Tcl_Obj *staticObjArraySpace[COMPILEENV_INIT_NUM_OBJECTS]; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclFileName.c ./generic/tclFileName.c *** ../../tcl8.0.5/generic/tclFileName.c Thu Feb 4 04:12:26 1999 --- ./generic/tclFileName.c Fri Mar 12 00:00:59 1999 *************** *** 71,76 **** --- 71,152 ---- Tcl_DString *bufPtr)); static char * SplitUnixPath _ANSI_ARGS_((char *path, Tcl_DString *bufPtr)); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + #define strchr(str, c) Tcl_KStrchr(str, c) + #define strrchr(str, c) Tcl_KStrrchr(str, c) + #define strpbrk(str, pattern) Tcl_KStrpbrk(str, pattern) + + static int + TclRegExecEUC(prog, string, start) + register regexp *prog; + register char *string; + char *start; + { + int kanjiCode = TCL_ANY; + + if (Tcl_KanjiString(NULL, string, NULL, &kanjiCode) == TCL_OK && + kanjiCode != TCL_EUC) { + wchar *ws; + char *estr; + int oLength = Tcl_KanjiEncode(kanjiCode, string, NULL); + int length; + int result, startOffset = 0; + char back; + ws = (wchar *)ckalloc((unsigned)(sizeof(wchar) * (oLength + 1))); + + if (start != string) { + back = *start; + *start = '\0'; + Tcl_KanjiEncode(kanjiCode, string, ws); + *start = back; + startOffset = Tcl_KanjiDecode(TCL_EUC, ws, NULL); + } + (void) Tcl_KanjiEncode(kanjiCode, string, ws); + + length = Tcl_KanjiDecode(TCL_EUC, ws, NULL); + estr = (char *)ckalloc((unsigned)(sizeof(char) * (length + 1))); + (void) Tcl_KanjiDecode(TCL_EUC, ws, estr); + + result = TclRegExec(prog, estr, estr + startOffset); + if (result) { + /* adjust startp and endp */ + int i; + for (i = 0; i < NSUBEXP; i++) { + if (prog->startp[i] != NULL) { + char *startp, *endp; + + if (prog->startp[i] == estr) { + startp = string; + } else { + back = *prog->startp[i]; + *prog->startp[i] = '\0'; + Tcl_KanjiEncode(TCL_EUC, estr, ws); + *prog->startp[i] = back; + startp = string + Tcl_KanjiDecode(kanjiCode, ws, NULL); + } + if (*prog->endp[i] == '\0') { + endp = string + strlen(string); + } else { + back = *prog->endp[i]; + *prog->endp[i] = '\0'; + Tcl_KanjiEncode(TCL_EUC, prog->startp[i], ws); + *prog->endp[i] = back; + endp = startp + Tcl_KanjiDecode(kanjiCode, ws, NULL); + } + + prog->startp[i] = startp; + prog->endp[i] = endp; + } + } + } + ckfree((char *)ws); + ckfree(estr); + return result; + } + return TclRegExec(prog, string, string); + } + #define TclRegExec(prog, string, start) TclRegExecEUC(prog, string, start) + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ /* *---------------------------------------------------------------------- *************** *** 410,415 **** --- 486,495 ---- for (;;) { elementStart = p; while ((*p != '\0') && (*p != '/')) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; } length = p - elementStart; *************** *** 471,476 **** --- 551,560 ---- do { elementStart = p; while ((*p != '\0') && (*p != '/') && (*p != '\\')) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; } length = p - elementStart; *************** *** 639,644 **** --- 723,732 ---- for (;;) { elementStart = p; while ((*p != '\0') && (*p != '/')) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; } length = p - elementStart; *************** *** 743,748 **** --- 831,844 ---- Tcl_DStringSetLength(resultPtr, (int) (length + strlen(p))); dest = Tcl_DStringValue(resultPtr) + length; for (; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + int klen = Tcl_KanjiSkip(p, NULL, NULL); + memcpy((VOID *)dest, (VOID *)p, (size_t)klen); + dest += klen; + p += klen - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '/') { while (p[1] == '/') { p++; *************** *** 800,806 **** --- 896,908 ---- if (length != oldLength) { c = Tcl_DStringValue(resultPtr)[length-1]; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (((c != '/') && (c != ':')) + || Tcl_KanjiEnd(Tcl_DStringValue(resultPtr), + Tcl_DStringValue(resultPtr) + length, NULL)) { + #else if ((c != '/') && (c != ':')) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_DStringAppend(resultPtr, "/", 1); } } *************** *** 814,819 **** --- 916,929 ---- Tcl_DStringSetLength(resultPtr, (int) (length + strlen(p))); dest = Tcl_DStringValue(resultPtr) + length; for (; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + int klen = Tcl_KanjiSkip(p, NULL, NULL); + memcpy((VOID *)dest, (VOID *)p, (size_t)klen); + dest += klen; + p += klen - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if ((*p == '/') || (*p == '\\')) { while ((p[1] == '/') || (p[1] == '\\')) { p++; *************** *** 861,866 **** --- 971,980 ---- } } else { c = p[1]; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + c = 0; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == ':') { if (!needsSep) { p++; *************** *** 965,970 **** --- 1079,1089 ---- if (tclPlatform == TCL_PLATFORM_WINDOWS) { for (p = Tcl_DStringValue(bufferPtr); *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '/') { *p = '\\'; } *************** *** 1018,1023 **** --- 1137,1147 ---- case TCL_PLATFORM_WINDOWS: lastSep = NULL; for (p = name; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (strchr("/\\:", *p) != NULL) { lastSep = p; } *************** *** 1179,1184 **** --- 1303,1313 ---- */ for (tail = argv[i]; *tail != '\0'; tail++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*tail))) { + tail += Tcl_KanjiSkip(tail, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*tail == '\\') { if (strchr(separators, tail[1]) != NULL) { break; *************** *** 1294,1305 **** --- 1423,1443 ---- for (p = *stringPtr; *p != '\0'; p++) { if (quoted) { quoted = 0; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ continue; } if ((level == 0) && (*p == *match)) { *stringPtr = p; return 1; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '{') { level++; } else if (*p == '}') { *************** *** 1353,1358 **** --- 1491,1501 ---- if (length > 0) { lastChar = Tcl_DStringValue(headPtr)[length-1]; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (Tcl_KanjiEnd(Tcl_DStringValue(headPtr), + Tcl_DStringValue(headPtr) + length, NULL)) + lastChar = -1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ } /* *************** *** 1446,1451 **** --- 1589,1601 ---- openBrace = closeBrace = NULL; quoted = 0; for (p = tail; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + if (quoted) + quoted = 0; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (quoted) { quoted = 0; } else if (*p == '\\') { *************** *** 1556,1562 **** --- 1706,1717 ---- } name = Tcl_DStringValue(headPtr); if (TclAccess(name, F_OK) == 0) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((name[1] != '\0') && !IS_KANJISTART(UCHAR(*name)) + && (strchr(name+1, ':') == NULL)) { + #else if ((name[1] != '\0') && (strchr(name+1, ':') == NULL)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_AppendElement(interp, name+1); } else { Tcl_AppendElement(interp, name); *************** *** 1580,1585 **** --- 1735,1745 ---- } } else { for (p = Tcl_DStringValue(headPtr); *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '/') { *p = '\\'; } *************** *** 1588,1593 **** --- 1748,1758 ---- name = Tcl_DStringValue(headPtr); exists = (TclAccess(name, F_OK) == 0); for (p = name; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '\\') { *p = '/'; } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclIO.c ./generic/tclIO.c *** ../../tcl8.0.5/generic/tclIO.c Fri Oct 30 09:38:38 1998 --- ./generic/tclIO.c Fri Mar 12 00:01:01 1999 *************** *** 170,175 **** --- 170,179 ---- int bufSize; /* What size buffers to allocate? */ Tcl_TimerToken timer; /* Handle to wakeup timer for this channel. */ CopyState *csPtr; /* State of background copy, or NULL. */ + #ifdef KANJI + int kanjiInputCode; /* What kanji code to expect for input. */ + int kanjiOutputCode; /* What kanji code to translate for output. */ + #endif /* KANJI */ } Channel; /* *************** *** 1217,1222 **** --- 1221,1230 ---- chanPtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE; chanPtr->timer = NULL; chanPtr->csPtr = NULL; + #ifdef KANJI + chanPtr->kanjiInputCode = TCL_ANY; + chanPtr->kanjiOutputCode = TCL_ANY; + #endif /* KANJI */ /* * Link the channel into the list of all channels; create an on-exit *************** *** 2144,2149 **** --- 2152,2165 ---- int srcCopied; /* How many bytes were copied from * the source string? */ char *destPtr; /* Where in line to copy to? */ + #ifdef KANJI + int slenOriginal = slen; /* Backup of the origianl slen. */ + char *convertedSrc = NULL; /* The source string was converted + * to an appropriate kanji code. */ + int kanjiCode; /* Kanji code of convertedSrc. */ + int convertedSlen = 0; /* Actual length of convertedSrc */ + int kanjiOutputCode = chanPtr->kanjiOutputCode; + #endif /* KANJI */ /* * If we are in network (or windows) translation mode, record the fact *************** *** 2151,2156 **** --- 2167,2198 ---- */ crsent = 0; + + #ifdef KANJI + /* + * Now let's convert the kanji code of the string. + * You can assume that the source string is always null terminated. + */ + if (kanjiOutputCode != TCL_ANY) { + if (Tcl_KanjiString(NULL, srcPtr, srcPtr + slenOriginal, &kanjiCode) != TCL_NOT_KANJI) { + if (kanjiOutputCode != kanjiCode) { + wchar *wstr; + + wstr = (wchar *) ckalloc((unsigned) + (Tcl_KanjiEncode(kanjiCode, srcPtr, NULL) + 1) + * sizeof(wchar)); + (void) Tcl_KanjiEncode(kanjiCode, srcPtr, wstr); + convertedSrc = (char *) ckalloc((unsigned) + (Tcl_KanjiDecode(kanjiOutputCode, wstr, NULL) + 1)); + convertedSlen = Tcl_KanjiDecode(kanjiOutputCode, wstr, convertedSrc); + ckfree((char *) wstr); + + srcPtr = convertedSrc; + slen = convertedSlen; + } + } + } + #endif /* KANJI */ /* * Loop filling buffers and flushing them until all output has been *************** *** 2254,2264 **** --- 2296,2322 ---- if (chanPtr->flags & BUFFER_READY) { if (FlushChannel(NULL, chanPtr, 0) != 0) { + #ifdef KANJI + if (convertedSrc) { + ckfree(convertedSrc); + } + #endif /* KANJI */ return -1; } } } /* Closes "while" */ + #ifdef KANJI + if (convertedSrc) { + ckfree(convertedSrc); + /* + * If the conversion of kanji code was occured, + * return the original length of the source string. + * Is it acceptable??? :-) + */ + return slenOriginal; + } + #endif /* KANJI */ return totalDestCopied; } *************** *** 3213,3219 **** * translated newline. If this is zero * and neither EOF nor BLOCKED is set, * the current line is empty. */ ! chanPtr = (Channel *) chan; lineLen = GetEOL(chanPtr); --- 3271,3281 ---- * translated newline. If this is zero * and neither EOF nor BLOCKED is set, * the current line is empty. */ ! #ifdef KANJI ! int kanjiCode; ! int kanjiInputCode = ((Channel *)chan)->kanjiInputCode; ! #endif /* KANJI */ ! chanPtr = (Channel *) chan; lineLen = GetEOL(chanPtr); *************** *** 3232,3237 **** --- 3294,3320 ---- if ((copiedTotal > 0) && (buf[copiedTotal - 1] == '\n')) { copiedTotal--; } + #ifdef KANJI + if (kanjiInputCode != TCL_ANY) { + if (Tcl_KanjiString(NULL, buf, buf + copiedTotal, &kanjiCode) != TCL_NOT_KANJI) { + if (kanjiInputCode != kanjiCode) { + wchar *wstr; + + buf[lineLen] = '\0'; + wstr = (wchar *)ckalloc((unsigned) + (Tcl_KanjiEncode(kanjiCode, buf, NULL) + 1) + * sizeof(wchar)); + (void) Tcl_KanjiEncode(kanjiCode, buf, wstr); + lineLen = Tcl_KanjiDecode(kanjiInputCode, wstr, NULL); + Tcl_DStringSetLength(lineRead, lineLen + offset); + (void) Tcl_KanjiDecode(kanjiInputCode, wstr, buf); + + ckfree((char *)wstr); + return lineLen; + } + } + } + #endif /* KANJI */ Tcl_DStringSetLength(lineRead, copiedTotal + offset); done: *************** *** 3286,3291 **** --- 3369,3378 ---- * translated newline. If this is zero * and neither EOF nor BLOCKED is set, * the current line is empty. */ + #ifdef KANJI + int kanjiCode; + int kanjiInputCode = ((Channel *)chan)->kanjiInputCode; + #endif /* KANJI */ chanPtr = (Channel *) chan; *************** *** 3306,3311 **** --- 3393,3420 ---- if ((copiedTotal > 0) && (buf[copiedTotal - 1] == '\n')) { copiedTotal--; } + #ifdef KANJI + if (kanjiInputCode != TCL_ANY) { + if (Tcl_KanjiString(NULL, buf, buf + copiedTotal, &kanjiCode) != TCL_NOT_KANJI) { + if (kanjiInputCode != kanjiCode) { + wchar *wstr; + + buf[lineLen] = '\0'; + wstr = (wchar *)ckalloc((unsigned) + (Tcl_KanjiEncode(kanjiCode, buf, NULL) + 1) + * sizeof(wchar)); + (void) Tcl_KanjiEncode(kanjiCode, buf, wstr); + lineLen = Tcl_KanjiDecode(kanjiInputCode, wstr, NULL); + Tcl_SetObjLength(objPtr, lineLen + offset); + buf = Tcl_GetStringFromObj(objPtr, NULL) + offset; + (void) Tcl_KanjiDecode(kanjiInputCode, wstr, buf); + + ckfree((char *)wstr); + return lineLen; + } + } + } + #endif /* KANJI */ Tcl_SetObjLength(objPtr, copiedTotal + offset); done: *************** *** 3947,3953 **** --- 4056,4066 ---- { if (interp) { CONST char *genericopt = + #ifdef KANJI + "blocking buffering buffersize eofchar inputCode outputCode translation"; + #else "blocking buffering buffersize eofchar translation"; + #endif /* KANJI */ char **argv; int argc, i; Tcl_DString ds; *************** *** 4119,4124 **** --- 4232,4259 ---- return TCL_OK; } } + #ifdef KANJI + if ((len == 0) || ((len > 1) && (optionName[1] == 'i') && + (strncmp(optionName, "-inputCode", len) == 0))) { + if (len == 0) { + Tcl_DStringAppendElement(dsPtr, "-inputCode"); + } + Tcl_DStringAppendElement(dsPtr, Tcl_KanjiCodeStr[chanPtr->kanjiInputCode]); + if (len > 0) { + return TCL_OK; + } + } + if ((len == 0) || ((len > 1) && (optionName[1] == 'o') && + (strncmp(optionName, "-outputCode", len) == 0))) { + if (len == 0) { + Tcl_DStringAppendElement(dsPtr, "-outputCode"); + } + Tcl_DStringAppendElement(dsPtr, Tcl_KanjiCodeStr[chanPtr->kanjiOutputCode]); + if (len > 0) { + return TCL_OK; + } + } + #endif /* KANJI */ if ((len == 0) || ((len > 1) && (optionName[1] == 't') && (strncmp(optionName, "-translation", len) == 0))) { *************** *** 4319,4324 **** --- 4454,4470 ---- } return TCL_OK; } + + #ifdef KANJI + if ((len > 1) && (optionName[1] == 'i') && + (strncmp(optionName, "-inputCode", len) == 0)) { + return Tcl_GetKanjiCode(interp, newValue, &(chanPtr->kanjiInputCode)); + } + if ((len > 1) && (optionName[1] == 'o') && + (strncmp(optionName, "-outputCode", len) == 0)) { + return Tcl_GetKanjiCode(interp, newValue, &(chanPtr->kanjiOutputCode)); + } + #endif /* KANJI */ if ((len > 1) && (optionName[1] == 't') && (strncmp(optionName, "-translation", len) == 0)) { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclIOCmd.c ./generic/tclIOCmd.c *** ../../tcl8.0.5/generic/tclIOCmd.c Wed Feb 3 07:25:42 1999 --- ./generic/tclIOCmd.c Fri Mar 12 00:01:02 1999 *************** *** 1044,1049 **** --- 1044,1055 ---- if (chan == (Tcl_Channel) NULL) { return TCL_ERROR; } + #ifdef KANJI + (void) Tcl_SetChannelOption(NULL, chan, "-inputCode", + Tcl_KanjiCodeStr[((Interp *)interp)->kanjiInputCode]); + (void) Tcl_SetChannelOption(NULL, chan, "-outputCode", + Tcl_KanjiCodeStr[((Interp *)interp)->kanjiOutputCode]); + #endif /* KANJI */ Tcl_RegisterChannel(interp, chan); Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), Tcl_GetChannelName(chan), (char *) NULL); diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclIOUtil.c ./generic/tclIOUtil.c *** ../../tcl8.0.5/generic/tclIOUtil.c Tue Sep 15 03:40:00 1998 --- ./generic/tclIOUtil.c Fri Mar 12 00:01:03 1999 *************** *** 310,316 **** --- 310,320 ---- goto error; } cmdBuffer = (char *) ckalloc((unsigned) statBuf.st_size+1); + #ifdef BUGFIX + result = Tcl_Read(chan, cmdBuffer, (int)statBuf.st_size); + #else result = Tcl_Read(chan, cmdBuffer, statBuf.st_size); + #endif /* BUGFIX */ if (result < 0) { Tcl_Close(interp, chan); Tcl_AppendResult(interp, "couldn't read file \"", fileName, *************** *** 470,475 **** --- 474,483 ---- { StatProc *statProcPtr = statProcList; int retVal = -1; + + #ifdef BUGFIX + memset((VOID *)buf, 0, sizeof(TclStat_)); + #endif /* BUGFIX */ /* * Call each of the "stat" function in succession. A non-return diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclInt.h ./generic/tclInt.h *** ../../tcl8.0.5/generic/tclInt.h Thu Feb 4 06:28:00 1999 --- ./generic/tclInt.h Fri Mar 12 00:01:04 1999 *************** *** 1120,1125 **** --- 1120,1138 ---- * gross way. */ char resultSpace[TCL_RESULT_SIZE+1]; /* Static space holding small results. */ + #ifdef KANJI + /* + * Information related to kanji: + */ + int kanjiCode; + int kanjiInputCode; + int kanjiOutputCode; + int kanjiConvertWhenCompile;/* Bool flag whether to convert kanji + * code when compiling. + * 1 ... convert + * 0 ... not convert + * defult is 1. */ + #endif /* KANJI */ } Interp; /* *************** *** 1632,1637 **** --- 1645,1655 ---- #endif EXTERN int TclParseBraces _ANSI_ARGS_((Tcl_Interp *interp, char *string, char **termPtr, ParseValue *pvPtr)); + #ifdef KANJI + EXTERN int TclParseKanji _ANSI_ARGS_((Tcl_Interp *interp, + char *string, char *end, int kanjiCode, char **termPtr, + ParseValue *pvPtr)); + #endif /* KANJI */ EXTERN int TclParseNestedCmd _ANSI_ARGS_((Tcl_Interp *interp, char *string, int flags, char **termPtr, ParseValue *pvPtr)); *************** *** 1762,1767 **** --- 1780,1797 ---- Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_JoinObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); + #ifdef KANJI + EXTERN int Tcl_KanjiCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, char **argv)); + EXTERN int Tcl_KlsearchCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, char **argv)); + EXTERN int Tcl_KlsortCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, char **argv)); + EXTERN int Tcl_KsplitCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, char **argv)); + EXTERN int Tcl_KstringCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, char **argv)); + #endif /* KANJI */ EXTERN int Tcl_LappendObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_LindexObjCmd _ANSI_ARGS_((ClientData clientData, diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclKanjiUtil.c ./generic/tclKanjiUtil.c *** ../../tcl8.0.5/generic/tclKanjiUtil.c Thu Jan 1 09:00:00 1970 --- ./generic/tclKanjiUtil.c Mon Mar 15 14:07:04 1999 *************** *** 0 **** --- 1,3211 ---- + /* + * tclKanjiUtil.c -- + * + * This file contains utility procedures that are used by many Tcl + * commands. + * + * Copyright (c) 1988-1999 Software Research Associates, Inc. + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + */ + + #ifndef lint + static char rcsid[] = "$Header: /home/m-hirano/cvsroot/tcltk/tcl8.0jp/generic/tclKanjiUtil.c,v 1.20 1999/03/12 09:50:17 m-hirano Exp $"; + #endif + + #ifdef KANJI + + #include "tclInt.h" + #include "tclPort.h" + + #ifdef ENCODE_DEBUG + #ifdef __WIN32__ + #define DEBUG_OUT stdout + #else + #define DEBUG_OUT stderr + #endif /* __WIN32__ */ + #endif /* ENCODE_DEBUG */ + + /* + * Global flag to enable/disable kanji token scanning. + */ + int globalDoKanjiScan = 1; + + /* + * Global flag to assume SJIS/EUC ambiguous string as SJIS. + */ + #ifdef __WIN32__ + int globalAssumeSjis = 1; + #else + int globalAssumeSjis = 0; + #endif /* __WIN32__ */ + + /* + * If C_LOCALE_SPECIAL is defined, C locale is treated specially. + * When the locale is C, the automatic kanji encoding detection + * feature is disabled, so that any string is recognized as a normal + * (ISO Latin-1) string. + * This makes Japanized Tcl to behave just like the original Tcl. + */ + #define C_LOCALE_SPECIAL + + /* + * In previous code, here was some sentence to use setlocale(3). + * I delete it because no one use it. Furthermore, According to ANSI C + * spec, calling setlocale(3) may change behavior of isXXX() defined + * in ctype.h, depend by specified locale. Thus, using "C" locale if + * we can handle multibyte characters by ourselves IS very good choice. + * m-hirano + */ + + /* + * This array holds the printable kanji code name corresponding to + * the kanji code defined in tcl.h. + */ + + char *Tcl_KanjiCodeStr[] = { "JIS", "SJIS", "EUC", "ANY", "NOT_SCANNED"}; + + #ifdef C_LOCALE_SPECIAL + /* + * This variable indicates whether some special Kanji related feature + * is disabled nor not. + */ + static int noKanjiFeature = 0; + #endif /* C_LOCALE_SPECIAL */ + + + /* + * One of the following data structures exists for each font set that is + * currently active. The structure is indexed with two hash tables, + * one based on font name and one based on XFontStruct address. + */ + + typedef struct { + int kanjiCode; /* original kanji code */ + char *str[4]; /* for Tcl_DecodeWStr(), prepare other code's + * expression. Offset is as same as TCL_(JIS, SJIS, + * EUC, ANY). */ + wchar *wstr; + int refCount; + Tcl_HashEntry *wstrHashPtr; + } TclWStr; + + /* + * Hash table to map from a wide string's values to a TclWStr structure + * describing a wide string with those values (used by Tcl_GetWStr). */ + + static Tcl_HashTable wstrTable; + + /* + * Hash table for wchar -> TclWStr mapping. This table is indexed by the + * wchar identifier, and is used by Tcl_FreeWStr. + */ + + static Tcl_HashTable ws_idTable; + + static int ws_initialized = 0; /* 0 means static structures haven't been + * initialized yet. */ + + /* + * Trivial yet useful macros. + */ + #ifndef MIN + #define MIN(a, b) ((a) > (b) ? (b) : (a)) + #endif + #ifndef MAX + #define MAX(a, b) ((a) > (b) ? (a) : (b)) + #endif + + /* + * Function prototypes for local procedures in this file: + */ + static int EncodingDetection _ANSI_ARGS_((unsigned char *string, unsigned char *end)); + static void WStrInit _ANSI_ARGS_((void)); + + #define T_ASCII 0 + #define T_KANJI 1 + #define T_KANA 2 + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiEncode -- + * + * Encode kanji string to wide string. + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiEncode(kanjiCode, ks, ws) + int kanjiCode; + unsigned char *ks; + wchar *ws; + { + switch (kanjiCode) { + case TCL_JIS: + return Tcl_EncodeJIS(ks, ws); + case TCL_SJIS: + return Tcl_EncodeSJIS(ks, ws); + case TCL_EUC: + return Tcl_EncodeEUC(ks, ws); + case TCL_ANY: + return Tcl_EncodeANY(ks, ws); + default: + panic("Tcl_KanjiEncode: Unknown kanjiCode."); + } + return -1; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiDecode -- + * + * Decode kanji string to wide string. + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiDecode(kanjiCode, ws, ks) + int kanjiCode; + wchar *ws; + unsigned char *ks; + { + switch (kanjiCode) { + case TCL_JIS: + return Tcl_DecodeJIS(ws, ks); + case TCL_SJIS: + return Tcl_DecodeSJIS(ws, ks); + case TCL_EUC: + return Tcl_DecodeEUC(ws, ks); + case TCL_ANY: + return Tcl_DecodeANY(ws, ks); + default: + panic("Tcl_KanjiDecode: Unknown kanjiCode."); + } + return -1; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_EncodeJIS -- + * + * Encode JIS kanji string to wide string. + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_EncodeJIS(js, ws) + unsigned char *js; + wchar *ws; + { + int c, c1; + int kanji = T_ASCII; + int n = 0; + + while( (c = *js++) != 0 ) { + if( c == '\033' ) { + if( !strncmp(js, "$B", 2) || !strncmp(js, "$@", 2)) { + kanji = T_KANJI; + js += 2; + } else if( !strncmp(js, "(J", 2) || !strncmp(js, "(B", 2) ) { + kanji = T_ASCII; + js += 2; + } else if( !strncmp(js, "(I", 2) ) { + kanji = T_KANA; + js += 2; + } else { + if( ws ) *ws++ = c; + n++; + } + } else if( kanji == T_KANJI ) { + c1 = *js++; + if( c1 == '\0' ) break; + if( ws ) *ws++ = (c << 8) | c1 | 0x8080; + n++; + } else { + if( ws ) *ws++ = c | ((kanji == T_KANA) ? 0x80 : 0); + n++; + } + } + if( ws ) *ws = 0; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DecodeJIS -- + * + * Decode wide string to JIS kanji string. + * + * Results: + * Bytes of the decoded kanji string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_DecodeJIS(ws, js) + wchar *ws; + unsigned char *js; + { + int c; + int kanji = T_ASCII; + int n = 0; + + while( (c = *ws++) != 0 ) { + switch( c & 0x8080 ) { + case 0: + if( kanji != T_ASCII ) { + if( js ) { + *js++ = '\033'; + *js++ = '('; + *js++ = 'B'; + } + n += 3; + } + if( js ) *js++ = c & 0x7f; + n++; + kanji = T_ASCII; + break; + case 0x80: + if( kanji != T_KANA ) { + if( js ) { + *js++ = '\033'; + *js++ = '('; + *js++ = 'I'; + } + n += 3; + } + if( js ) *js++ = c & 0x7f; + n++; + kanji = T_KANA; + break; + case 0x8080: + if( kanji != T_KANJI ) { + if( js ) { + *js++ = '\033'; + *js++ = '$'; + *js++ = 'B'; + } + n += 3; + } + if( js ) { + *js++ = (c >> 8) & 0x7f; + *js++ = c & 0x7f; + } + n += 2; + kanji = T_KANJI; + break; + } + } + if( kanji != T_ASCII ) { + if( js ) { + *js++ = '\033'; + *js++ = '('; + *js++ = 'B'; + } + n += 3; + } + if( js ) *js = '\0'; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_EncodeSJIS -- + * + * Encode SJIS kanji string to wide string. + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + #define IS_SJIS(c) (((c) >= 0x81 && (c) <= 0x9f) || ((c) >= 0xe0 && (c) <= 0xfc)) + + int + Tcl_EncodeSJIS(ss, ws) + unsigned char *ss; + wchar *ws; + { + int c, c1; + int n = 0; + + while( (c = *ss++) != 0 ) { + if( IS_SJIS(c) ) { + c1 = *ss++; + c -= (c>=0xa0) ? 0xc1 : 0x81; + if( ws ) { + if( c1 >= 0x9f ) { + *ws++ = ((c<<9) + 0x2200 + c1 - 0x7e) | 0x8080; + } else { + *ws++ = ((c<<9) + 0x2100 + c1 + - ((c1<=0x7e) ? 0x1f : 0x20)) | 0x8080; + } + } + n++; + } else { + if( ws ) *ws++ = c; + n++; + } + } + if( ws ) *ws = 0; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DecodeSJIS -- + * + * Decode wide string to SJIS kanji string. + * + * Results: + * Bytes of the decoded kanji string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_DecodeSJIS(ws, ss) + wchar *ws; + unsigned char *ss; + { + int c1, c2; + int n = 0; + + while( (c1 = *ws++) != 0 ) { + switch( c1 & 0x8080 ) { + case 0: + case 0x80: + if( ss ) *ss++ = c1 & 0xff; + n++; + break; + case 0x8080: + c2 = c1 & 0x7f; + c1 = (c1 >> 8) & 0x7f; + if( ss ) { + *ss++ = (c1 - 0x21) / 2 + ((c1 <= 0x5e) ? 0x81 : 0xc1); + if( c1 & 1 ) { /* odd */ + *ss++ = c2 + ((c2 <= 0x5f) ? 0x1f : 0x20); + } else { + *ss++ = c2 + 0x7e; + } + } + n += 2; + break; + } + } + if( ss ) *ss = '\0'; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_EncodeEUC -- + * + * Encode EUC kanji string to wide string. + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_EncodeEUC(es, ws) + unsigned char *es; + wchar *ws; + { + int c; + int n = 0; + + while( (c = *es++) != 0 ) { + if( c == 0x8e ) { /* SS2 */ + if( ws ) *ws++ = *es | 0x80; + es++; + n++; + } else if( c == 0x8f ) { /* SS3 */ + c = *es++; + if( ws ) *ws++ = (c << 8) | (*es & 0x7f) | 0x8000; + es++; + n++; + } else if( c & 0x80 ) { + if( ws ) *ws++ = (c << 8) | *es | 0x8080; + es++; + n++; + } else { + if( ws ) *ws++ = c; + n++; + } + } + if( ws ) *ws = 0; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DecodeEUC -- + * + * Decode wide string to EUC kanji string. + * + * Results: + * Bytes of the decoded kanji string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_DecodeEUC(ws, es) + wchar *ws; + unsigned char *es; + { + int c; + int n = 0; + + while( (c = *ws++) != 0 ) { + switch( c & 0x8080 ) { + case 0: + if( es ) *es++ = c & 0x7f; + n++; + break; + case 0x80: + if( es ) { + *es++ = 0x8e; /* SS2 */ + *es++ = c & 0xff; + } + n += 2; + break; + case 0x8000: + if( es ) { + *es++ = 0x8f; /* SS3 */ + *es++ = (c >> 8) | 0x80; + *es++ = (c & 0xff) | 0x80; + } + n += 3; + break; + case 0x8080: + if( es ) { + *es++ = c >> 8; + *es++ = c & 0xff; + } + n += 2; + break; + } + } + if( es ) *es = '\0'; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_EncodeANY -- + * + * Encode ANY kanji string to wide string. (as ascii string) + * + * Results: + * Number of the encoded characters. (Not bytes) + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_EncodeANY(as, ws) + unsigned char *as; + wchar *ws; + { + int c; + int n = 0; + + while( (c = *as++) != 0 ) { + if( ws ) *ws++ = c; + n++; + } + if( ws ) *ws = 0; + + return n; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DecodeANY -- + * + * Decode wide string to ANY kanji string. (as ascii string) + * + * Results: + * Bytes of the decoded kanji string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_DecodeANY(ws, as) + wchar *ws; + unsigned char *as; + { + int c; + int n = 0; + + while( (c = *ws++) != 0 ) { + switch( c & 0x8080 ) { + case 0: + case 0x80: + if( as ) *as++ = c & 0xff; + n++; + break; + case 0x8000: + case 0x8080: + if( as ) { + *as++ = c >> 8; + *as++ = c & 0xff; + } + n += 2; + break; + } + } + if( as ) *as = '\0'; + + return n; + } + + typedef struct { + char *lang; + int code; + } langTable; + + /* + * This table is based on locale.alias with came from X11R6. + */ + static langTable langTab[] = { + /* + * EUC stuff. + */ + {"ja", TCL_EUC}, + {"ja_JP", TCL_EUC}, + {"ja_JP.eucJP", TCL_EUC}, + {"ja_JP.ujis", TCL_EUC}, + #ifdef _AIX + {"Jp_JP", TCL_SJIS}, /* IBM */ + #else + {"Jp_JP", TCL_EUC}, /* locale.alias */ + #endif /* _AIX */ + {"ja_JP.AJEC", TCL_EUC}, + {"ja_JP.EUC", TCL_EUC}, + {"japanese.euc", TCL_EUC}, + {"japan", TCL_EUC}, + {"Japanese-EUC", TCL_EUC}, + + /* + * JIS stuff. + */ + {"ja_JP.JIS7", TCL_JIS}, + {"ja_JP.ISO-2022-JP", TCL_JIS}, + {"ja_JP.JIS", TCL_JIS}, + {"ja_JP.jis7", TCL_JIS}, + + /* + * SJIS stuff. + */ + {"ja_JP.SJIS", TCL_SJIS}, + {"ja_JP.mscode", TCL_SJIS}, + {"Japanese_Japan.932", TCL_SJIS}, + {"Ja_JP", TCL_SJIS}, /* IBM */ + + /* + * default locale.alias says "japanese" is EUC only in SunOS 5.x. + * It is not true. But "japanese" locale name is highly vendor dependent. + */ + #ifdef JAPANESE_IS_SJIS + #define TCL_JAPANESE TCL_SJIS + #else + #ifdef JAPANESE_IS_EUC + #define TCL_JAPANESE TCL_EUC + #else + #ifdef JAPANESE_IS_JIS + #define TCL_JAPANESE TCL_JIS + #endif /* JAPANESE_IS_JIS */ + #endif /* JAPANESE_IS_EUC */ + #endif /* JAPANESE_IS_SJIS */ + #ifndef TCL_JAPANESE + /* + * By historical reason, use TCL_EUC except hpux.. + */ + #ifdef hpux + #define TCL_JAPANESE TCL_SJIS + #else + #define TCL_JAPANESE TCL_EUC + #endif /* hpux */ + #endif /* !TCL_JAPANESE */ + + {"japanese", TCL_JAPANESE}, + + {"japanese.sjis", TCL_SJIS}, /* HP? */ + {"japanese-sjis", TCL_SJIS}, /* IBM */ + {"japanese-ujis", TCL_EUC}, /* IBM */ + + {"C", TCL_ANY}, + + {NULL, 0} + }; + + static char *localeEnvName[] = { + "LC_ALL", + "LC_CTYPE", + "LANG", + NULL + }; + + /* + *---------------------------------------------------------------------- + * + * Tcl_DefaultKanjiCode -- + * + * Determine the default Kanji code from: + * 1. "TCL_KANJICODE". + * 2. current locale. + * + * Results: + * This procudure returns a kanji code to be used as a default. + * + * Side effects: + * None. + *---------------------------------------------------------------------- + */ + + int + Tcl_DefaultKanjiCode() + { + char *lang; + int i = 0; + int found = 0; + #ifdef __WIN32__ + static int first = 1; + #endif /* __WIN32__ */ + + /* + * First, try "TCL_KANJICODE" environment variable. + */ + lang = getenv("TCL_KANJICODE"); + if (lang != NULL && lang[0] != '\0') { + int code = TCL_ANY; + if (strcmp(lang, "SJIS") == 0) { + code = TCL_SJIS; + } else if (strcmp(lang, "EUC") == 0) { + code = TCL_EUC; + } else if (strcmp(lang, "JIS") == 0) { + code = TCL_JIS; + } + #ifdef __WIN32__ + if (code == TCL_EUC && first == 1) { + globalAssumeSjis = 0; + } + first = 0; + #endif /* __WIN32__ */ + return code; + } + #ifdef __WIN32__ + first = 0; + return TCL_SJIS; + #endif /* __WIN32__ */ + + /* + * Second, get "LC_ALL", "LC_CTYPE", "LANG". + */ + while (localeEnvName[i] != NULL) { + lang = getenv(localeEnvName[i]); + if (lang != NULL && lang[0] != '\0') { + found = 1; + break; + } + i++; + } + if (found == 1) { + #ifdef C_LOCALE_SPECIAL + /* + * If the LANG variable is "C", skip some of the + * Kanji related feature (e.g. automatic encoding detection) + */ + if (!strcmp(lang, "C")) noKanjiFeature = 1; + #endif /* C_LOCALE_SPECIAL */ + for (i = 0; langTab[i].lang != NULL; i++) { + if (!strcmp(langTab[i].lang, lang)) { + return langTab[i].code; + } + } + } + return TCL_DEFAULT_KANJI_CODE; + } + + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiCode -- + * + * Returns the internal kanji code of the interpreter. + * + * Results: + * The internal kanji code. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiCode(interp) + Tcl_Interp *interp; + { + return ((Interp *)interp)->kanjiCode; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiSkip -- + * + * Skip all kanji sequence. + * + * Results: + * Return length of the sequence. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiSkip(string, end, kanjiCodePtr) + unsigned char *string; + unsigned char *end; + int *kanjiCodePtr; /* In/Out. + * + * In: Specify kanji code. If not + * sure, use TCL_ANY. + * + * Out: + * If In is TCL_ANY: scanned + * kanji code. + * If In is !TCL_ANY: unchanged. + * + * NULL is acceptable. If don't need + * kanji code return value, use NULL. + */ + { + unsigned char *str = string; + int len; + int ret = 1; + int kanjiCode = TCL_ANY; + + if (kanjiCodePtr != NULL) { + kanjiCode = *kanjiCodePtr; + } + + if (end == NULL) { + len = strlen(string); + end = string + len; + } else { + len = end - string; + } + + #ifdef C_LOCALE_SPECIAL + if (noKanjiFeature == 1) return (len > 0) ? 1 : 0; + #endif /* C_LOCALE_SPECIAL */ + + if (len <= 1) { + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = TCL_ANY; + } + if (len <= 0) { + panic("Tcl_KanjiSkip: get NULL."); + } + return len; + } + + if (*str == '\033' && + kanjiCode != TCL_EUC && + kanjiCode != TCL_SJIS) { + /* + * JIS + * start: ESC $ B + * ESC $ ( B + * ESC $ @ + * ESC $ ( @ + * + * end: ESC ( J + * ESC ( B + */ + unsigned char *old; + int completeJIS = 0; + str++; + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = TCL_JIS; + } + while (*str != '\033' && str < end) str++; + if (str == end) { + /* + * found leading ESC but no trailing ESC. + */ + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = TCL_ANY; + } + return len; + } else if (*str == '\033') { + if (str >= end) { + goto Ambig; + } + str++; + old = str; + if (*str == '(') { + if (str >= end) { + goto Ambig; + } + str++; + if (*str == 'J' || *str == 'B') { + if (str >= end) { + goto Ambig; + } + str++; + completeJIS = 1; + } + } + if (completeJIS) { + ret = str - string; + } else { + ret = old - string; + } + } else { + Ambig: + ret = str - string; + } + } else { + if (kanjiCode == TCL_NOT_KANJI || kanjiCode == TCL_ANY) { + kanjiCode = EncodingDetection(str, end); + } + if (kanjiCode == TCL_NOT_KANJI || kanjiCode == TCL_ANY) { + ret = 1; + kanjiCode = TCL_ANY; + } else { + ret = Tcl_KanjiLength(str, end, kanjiCode); + } + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = kanjiCode; + } + #ifdef ENCODE_DEBUG + if (ret > 0) { + char *x = alloca(ret + 1); + memcpy(x, string, ret); + x[ret] = 0; + fprintf(DEBUG_OUT, "debug: '%s' len %d, ret %d code %s\n", x, len, ret, + Tcl_KanjiCodeStr[kanjiCode]); + } else { + int ll = ((len >= 20) ? 20 : len); + char *x = alloca(ll + 1); + memcpy(x, string, ll); + x[ll] = 0; + fprintf(DEBUG_OUT, "debug: '%s'... len %d, ret %d code %s\n", x, len, ret, + Tcl_KanjiCodeStr[kanjiCode]); + } + #endif /* ENCODE_DEBUG */ + } + return ((ret > 0) ? ret : 1); + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiStart -- + * + * Check if the string starts with kanji or not. + * + * KanjiCodePtr is a pointer to an int which specifies + * the encoding of the given string. This procedure + * checks if the first character of the string is a + * kanji. + * + * If the value pointed by kanjiCodePtr is TCL_ANY, + * and if the first character of the string seems to be + * a kanji character, this procedure examines the string + * further, determines the encoding used, and assign the + * encoding value to *kanjiCodePtr. + * + * Results: + * If the first character of the given string is kanji, + * this procedure returns 1. Otherwise 0 is returned. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiStart(string, end, kanjiCodePtr) + unsigned char *string; + unsigned char *end; + int *kanjiCodePtr; + { + unsigned char c = *string; + + #ifdef C_LOCALE_SPECIAL + if (noKanjiFeature) return 0; + #endif /* C_LOCALE_SPECIAL */ + + if (string == end) return 0; + retry: + switch (*kanjiCodePtr) { + case TCL_ANY: + if (c != '\033' && c < 0x80) return 0; + *kanjiCodePtr = EncodingDetection(string, end); + goto retry; + case TCL_JIS: { + int len; + if (end == NULL) { + len = strlen(string); + end = string + len; + } else { + len = end - string; + } + if (len >= 4) { + return (c == '\033' && + string[1] == '$' && + ((string[2] == 'B' || string[2] == '@') || + (string[2] == '(' && (string[3] == 'B' || string[3] == '@')))); + } else if (len >= 3) { + return (c == '\033' && + string[1] == '$' && + (string[2] == 'B' || string[2] == '@')); + } else { + return 0; + } + } + case TCL_SJIS: + return ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)); + case TCL_EUC: + return (c == 0x8e || c == 0x8f || (c & 0x80)); + default: /* TCL_NOT_KANJI */ + return 0; + } + return 0; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiEnd -- + * + * Check if the string ends with kanji or not. + * + * KanjiCodePtr is a pointer to an int which specifies + * the encoding of the given string. This procedure + * checks if the last character of the string is a + * kanji. + * + * If the value pointed by kanjiCodePtr is TCL_ANY, + * and if the last character of the string seems to be + * a kanji character, this procedure examines the string + * further, determines the encoding used, and assign the + * encoding value to *kanjiCodePtr. + * + * Results: + * If the last character of the given string is kanji, + * this procedure returns 1. Otherwise 0 is returned. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiEnd(string, end, kanjiCodePtr) + unsigned char *string; + unsigned char *end; + int *kanjiCodePtr; + { + unsigned char *p = string; + int foundKanji = 0; + + #ifdef C_LOCALE_SPECIAL + if (noKanjiFeature) return 0; + #endif /* C_LOCALE_SPECIAL */ + + if (string == end) return 0; + if (end == NULL) { + end = p + strlen(string); + } + + while (p < end) { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, end, kanjiCodePtr); + foundKanji = 1; + } else { + p++; + foundKanji = 0; + } + } + if (foundKanji == 1 && p == end) { + return 1; + } else { + return 0; + } + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiLength -- + * + * Count a byte number of the given kanji sequence. + * + * Results: + * Return value is a byte number of the kanji sequence. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiLength(string, end, kanjiCode) + unsigned char *string; + unsigned char *end; + int kanjiCode; + { + unsigned char *src = string; + + if (string == end) return 0; + if (end == NULL) { + end = string + strlen(string); + } + + switch (kanjiCode) { + case TCL_JIS: { + int theCode = TCL_JIS; + if (*src == '\033') { + src += Tcl_KanjiSkip(src, end, &theCode); + } + return (int)(src - string); + break; + } + case TCL_SJIS: + while (src < end) { + if ((*src >= 0x81 && *src <= 0x9f) || (*src >= 0xe0 && *src <= 0xfc)) { + src++; + if (src < end) { + src++; + } else { + break; + } + } else { + break; + } + } + return (int)(src - string); + break; + case TCL_EUC: + while (src < end) { + if (*src == 0x8e) { + src++; + if (src < end) { + src++; + } else { + break; + } + continue; + } else if (*src == 0x8f) { + src++; + if (src < end) { + src++; + if (src < end) { + src++; + } else { + break; + } + } else { + break; + } + continue; + } else { + if (*src & 0x80) { + src++; + } else { + break; + } + } + } + return (int)(src - string); + break; + } + #if 0 + panic("unknown kanji code."); + return 0; + #else + return 1; + #endif + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiString -- + * + * Check if the string contains kanji. + * + * Results: + * If the string contains kanji, set its kanji code + * and return TCL_OK. Otherwise return TCL_NOT_KANJI. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiString(interp, string, end, kanjiCodePtr) + Tcl_Interp *interp; + unsigned char *string; + unsigned char *end; + int *kanjiCodePtr; + { + int encoding; + + if (end == NULL) { + end = string + strlen(string); + } + + if ( + #ifdef C_LOCALE_SPECIAL + noKanjiFeature || + #endif /* C_LOCALE_SPECIAL */ + (encoding = EncodingDetection(string, end)) == TCL_NOT_KANJI) { + *kanjiCodePtr = TCL_ANY; + return TCL_NOT_KANJI; + } else { + *kanjiCodePtr = encoding; + return TCL_OK; + } + } + + + #define TYPE_NONE (0) + #define TYPE_SJIS_1 (1) + #define TYPE_SJIS_2 (1<<1) + #define TYPE_SKANA (1<<2) + #define TYPE_EUC_1 (1<<3) + #define TYPE_EUC_2 (1<<4) + #define TYPE_ASCII (1<<5) + #define TYPE_UNDEF (1<<6) + + /* + * range of sjis byte 1 is same as IBM DBCS-PC byte 1 range. + */ + + /* + * Well, who's gonna use hankaku kana in EUC? + * Ignore SS2/SS3. + */ + + static unsigned char charTypeTbl[] = { + /* 0x00 */ (TYPE_ASCII), + /* 0x01 */ (TYPE_ASCII), + /* 0x02 */ (TYPE_ASCII), + /* 0x03 */ (TYPE_ASCII), + /* 0x04 */ (TYPE_ASCII), + /* 0x05 */ (TYPE_ASCII), + /* 0x06 */ (TYPE_ASCII), + /* 0x07 */ (TYPE_ASCII), + /* 0x08 */ (TYPE_ASCII), + /* 0x09 */ (TYPE_ASCII), + /* 0x0a */ (TYPE_ASCII), + /* 0x0b */ (TYPE_ASCII), + /* 0x0c */ (TYPE_ASCII), + /* 0x0d */ (TYPE_ASCII), + /* 0x0e */ (TYPE_ASCII), + /* 0x0f */ (TYPE_ASCII), + /* 0x10 */ (TYPE_ASCII), + /* 0x11 */ (TYPE_ASCII), + /* 0x12 */ (TYPE_ASCII), + /* 0x13 */ (TYPE_ASCII), + /* 0x14 */ (TYPE_ASCII), + /* 0x15 */ (TYPE_ASCII), + /* 0x16 */ (TYPE_ASCII), + /* 0x17 */ (TYPE_ASCII), + /* 0x18 */ (TYPE_ASCII), + /* 0x19 */ (TYPE_ASCII), + /* 0x1a */ (TYPE_ASCII), + /* 0x1b */ (TYPE_ASCII), + /* 0x1c */ (TYPE_ASCII), + /* 0x1d */ (TYPE_ASCII), + /* 0x1e */ (TYPE_ASCII), + /* 0x1f */ (TYPE_ASCII), + /* 0x20 */ (TYPE_ASCII), + /* 0x21 */ (TYPE_ASCII), + /* 0x22 */ (TYPE_ASCII), + /* 0x23 */ (TYPE_ASCII), + /* 0x24 */ (TYPE_ASCII), + /* 0x25 */ (TYPE_ASCII), + /* 0x26 */ (TYPE_ASCII), + /* 0x27 */ (TYPE_ASCII), + /* 0x28 */ (TYPE_ASCII), + /* 0x29 */ (TYPE_ASCII), + /* 0x2a */ (TYPE_ASCII), + /* 0x2b */ (TYPE_ASCII), + /* 0x2c */ (TYPE_ASCII), + /* 0x2d */ (TYPE_ASCII), + /* 0x2e */ (TYPE_ASCII), + /* 0x2f */ (TYPE_ASCII), + /* 0x30 */ (TYPE_ASCII), + /* 0x31 */ (TYPE_ASCII), + /* 0x32 */ (TYPE_ASCII), + /* 0x33 */ (TYPE_ASCII), + /* 0x34 */ (TYPE_ASCII), + /* 0x35 */ (TYPE_ASCII), + /* 0x36 */ (TYPE_ASCII), + /* 0x37 */ (TYPE_ASCII), + /* 0x38 */ (TYPE_ASCII), + /* 0x39 */ (TYPE_ASCII), + /* 0x3a */ (TYPE_ASCII), + /* 0x3b */ (TYPE_ASCII), + /* 0x3c */ (TYPE_ASCII), + /* 0x3d */ (TYPE_ASCII), + /* 0x3e */ (TYPE_ASCII), + /* 0x3f */ (TYPE_ASCII), + + /* 0x00 - 0x3f ascii */ + + /* 0x40 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x41 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x42 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x43 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x44 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x45 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x46 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x47 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x48 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x49 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4a */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4b */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4c */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4d */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4e */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x4f */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x50 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x51 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x52 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x53 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x54 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x55 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x56 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x57 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x58 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x59 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5a */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5b */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5c */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5d */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5e */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x5f */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x60 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x61 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x62 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x63 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x64 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x65 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x66 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x67 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x68 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x69 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6a */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6b */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6c */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6d */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6e */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x6f */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x70 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x71 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x72 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x73 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x74 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x75 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x76 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x77 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x78 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x79 */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x7a */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x7b */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x7c */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x7d */ (TYPE_ASCII|TYPE_SJIS_2), + /* 0x7e */ (TYPE_ASCII|TYPE_SJIS_2), + + /* 0x40 - 0x7e ascii sjis2 */ + + /* 0x7f */ (TYPE_ASCII), + + /* 0x7f - 0x7f ascii */ + + /* 0x80 */ (TYPE_SJIS_2), + + /* 0x80 - 0x80 sjis2 */ + + /* 0x81 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x82 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x83 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x84 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x85 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x86 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x87 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x88 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x89 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8a */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8b */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8c */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8d */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8e */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x8f */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x90 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x91 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x92 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x93 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x94 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x95 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x96 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x97 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x98 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x99 */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9a */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9b */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9c */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9d */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9e */ (TYPE_SJIS_1|TYPE_SJIS_2), + /* 0x9f */ (TYPE_SJIS_1|TYPE_SJIS_2), + + /* 0x81 - 0x9f sjis1 sjis2 */ + + /* 0xa0 */ (TYPE_SJIS_2), + + /* 0xa0 - 0xa0 sjis2 */ + + /* 0xa1 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa2 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa3 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa4 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa5 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa6 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa7 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa8 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xa9 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xaa */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xab */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xac */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xad */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xae */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xaf */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb0 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb1 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb2 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb3 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb4 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb5 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb6 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb7 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb8 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xb9 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xba */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xbb */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xbc */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xbd */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xbe */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xbf */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc0 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc1 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc2 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc3 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc4 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc5 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc6 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc7 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc8 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xc9 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xca */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xcb */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xcc */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xcd */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xce */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xcf */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd0 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd1 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd2 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd3 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd4 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd5 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd6 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd7 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd8 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xd9 */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xda */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xdb */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xdc */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xdd */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xde */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xdf */ (TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + + /* 0xa1 - 0xdf sjiskana sjis2 euc1 euc2 */ + + /* 0xe0 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe1 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe2 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe3 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe4 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe5 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe6 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe7 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe8 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xe9 */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xea */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xeb */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xec */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xed */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xee */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xef */ (TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + + /* 0xe0 - 0xef sjis1 sjis2 euc1 euc2 */ + + /* 0xf0 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf1 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf2 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf3 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf4 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf5 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf6 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf7 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf8 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xf9 */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xfa */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xfb */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + /* 0xfc */ (TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2), + + /* 0xf0 - 0xfc sjis2 euc1 euc2 */ + + /* 0xfd */ (TYPE_EUC_2), + /* 0xfe */ (TYPE_EUC_2), + + /* 0xfd - 0xfe euc2 */ + + /* 0xff */ (TYPE_NONE) + }; + + #define IS_TYPE(x, y) (((x) & (y)) != 0) + /* PURE SJIS: 0x80 - 0xa0. (0x81 - 0x9f, 0x80, 0xa0) */ + #define IS_PURE_SJIS(x) (((x) == TYPE_SJIS_1) || ((x) == TYPE_SJIS_2)) + /* PURE ASCII: 0x00 - 0x3f */ + #define IS_PURE_ASCII(x) ((x) == TYPE_ASCII) + /* PURE EUC: 0xfd - 0xfe */ + #define IS_PURE_EUC(x) (((x) == TYPE_EUC_2) || ((x) == TYPE_EUC_1)) + + /* + *---------------------------------------------------------------------- + * + * EncodingDetection -- + * + * Determine the encoding (kanji code) of the given string. + * This procedure assumes that the given string contains + * only ASCII and kanji (defined by the standard JIS X0208) + * characters. (i.e. no 1byte-kana and no user-defined + * characters are present) + * + * The interp argument is used to retrieve the internal code + * of the interpreter, and the internal code is used to help + * determining the encoding when it is ambiguous. Interp might + * be NULL. + * + * Results: + * The return value is the encoding (kanji code) of the + * given string. If the string contains only ASCII + * characters, TCL_NOT_KANJI will be returned. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + static int + EncodingDetection(string, end) + unsigned char *string; + unsigned char *end; + { + unsigned char *s = (unsigned char *)string; + int kanji_found = 0; + int len; + int i; + + int type = TYPE_NONE; + int type2 = TYPE_NONE; + + if (end == NULL) { + end = string + strlen(string); + } + len = end - s; + if (len < 2) { + return TCL_NOT_KANJI; + } + + for (i = 0; i < len; i++) { + if (kanji_found == 1 && + s[i] < 0x80) { + goto scanDone; + } + if (s[i] == '\033') { + int rem; + i++; + rem = len - i; + /* + * It might be JIS encoding. The valid JIS + * leading sequences are: + * ESC $ B ESC $ ( B -- designate JIS X0208 + * ESC $ @ ESC $ ( @ -- designate old JIS X0208 + * ESC ( B -- designate ASCII + * ESC ( J -- designate JIS X0201 + */ + if (rem >= 3) { + if (s[i] == '$' && + ( (s[i + 1] == 'B' || s[i + 1] == '@') || + (s[i + 1] == '(' && (s[i + 2] == 'B' || s[i + 2] == '@')) ) ) { + return TCL_JIS; + } + } else if (rem >= 2) { + if (s[i] == '$' && + (s[i + 1] == 'B' || s[i + 1] == '@')) { + return TCL_JIS; + } else if (s[i] == '(' && + (s[i + 1] == 'B' || s[i + 1] == 'J')) { + return TCL_JIS; + } + } + continue; + } else { + type = charTypeTbl[s[i]]; + + switch (type) { + case TYPE_ASCII: + case TYPE_ASCII|TYPE_SJIS_2: + case TYPE_SJIS_2: { + /* + * need further scan. + */ + continue; + break; + } + + case TYPE_SJIS_1|TYPE_SJIS_2: + case TYPE_SJIS_1|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2: { + /* + * got sjis byte 1. check next. + */ + if (i < (len - 1)) { + if (s[i + 1] == 0) { + goto scanDone; + } + type2 = charTypeTbl[s[i + 1]]; + if (type == (TYPE_SJIS_1|TYPE_SJIS_2)) { + /* + * means byte 1 is sjis1|sjis2 (0x81 - 0x9f). + */ + if (IS_TYPE(type2, TYPE_SJIS_2)) { + /* + * byte 1 (0x81 - 0x9f) + * byte 2 (0x40 - 0x7e, 0x80 - 0xfc) + * SJIS no doubt. + */ + return TCL_SJIS; + } + } else { + /* + * means byte 1 is sjis1|sjis2|euc1|euc2 (0xe0 - 0xef). + */ + if (IS_TYPE(type2, TYPE_SJIS_2)) { + if (!(IS_TYPE(type2, TYPE_EUC_2))) { + /* + * byte 1 (0xe0 - 0xef) + * byte 2 (0x40 - 0x7e, 0x80 - 0xa0) + * THUS: + * SJIS no doubt. + */ + return TCL_SJIS; + } else { + /* + * byte 1 (0xe0 - 0xef) + * byte 2 (0xa1 - 0xfc) + * EUC/SJIS Ambig. continue scan. + */ + kanji_found = 1; + } + } else if (type2 == TYPE_EUC_2) { + /* + * byte 1 (0xe0 - 0xfc) + * byte 2 (0xfd - 0xfe) + * THUS: + * EUC no doubt. + */ + return TCL_EUC; + } + } + i++; + } + break; + } + + case TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2: + case TYPE_SKANA|TYPE_SJIS_2|TYPE_EUC_1|TYPE_EUC_2: { + /* + * sjis hankaku kana/EUC Ambig. + */ + int isByte1Kana = 0; + if (IS_TYPE(type, TYPE_SKANA)) { + /* + * return SJIS if it is prefered. + */ + if (globalAssumeSjis == 1) { + return TCL_SJIS; + } + isByte1Kana = 1; + } + kanji_found = 1; + if (i < (len - 1)) { + if (s[i + 1] == 0) { + goto scanDone; + } + type2 = charTypeTbl[s[i + 1]]; + if (isByte1Kana == 0 && + (IS_TYPE(type2, TYPE_EUC_2)) && + (!(IS_TYPE(type2, TYPE_SKANA)))) { + /* + * TYPE_SJIS_2 on byte 1 is ignorable. + * THUS: + * EUC maybe. + */ + if (globalAssumeSjis == 0) { + return TCL_EUC; + } + } + i++; + } + break; + } + + default: { + break; + } + } + } + } + + scanDone: + if (kanji_found) { + /* + * return TCL_EUC/TCL_SJIS depend on globalAssumeSjis. + */ + #ifdef ENCODE_DEBUG + char *x = alloca(i + 1); + memcpy(x, string, i); + x[i] = 0; + fprintf(DEBUG_OUT, "\tdebug: '%s' scaned %d\n", x, i); + #endif /* ENCODE_DEBUG */ + if (globalAssumeSjis == 1) { + return TCL_SJIS; + } else { + return TCL_EUC; + } + } + + /* no kanji found */ + return TCL_NOT_KANJI; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_ConvertToInternal + * + * Convert the kanji code of given string to current internal + * kanji code. + * + * Results: + * Return a pointer of converted string. + * + * Side effects: + * Memory is allocated. + * + *---------------------------------------------------------------------- + */ + char * + Tcl_ConvertToInternal(interp, string, kanjiCodePtr) + Tcl_Interp *interp; + char *string; + int *kanjiCodePtr; + { + int kanjiCode = TCL_ANY; + int intKanjiCode = Tcl_KanjiCode(interp); + char *ret; + + if (intKanjiCode != TCL_ANY) { + if (Tcl_KanjiString(NULL, string, NULL, &kanjiCode) == TCL_OK) { + if (intKanjiCode != kanjiCode) { + wchar *ws; + int oLength = Tcl_KanjiEncode(kanjiCode, string, NULL); + int length; + ws = (wchar *)ckalloc((unsigned)(sizeof(wchar) * (oLength + 1))); + (void) Tcl_KanjiEncode(kanjiCode, string, ws); + + length = Tcl_KanjiDecode(intKanjiCode, ws, NULL); + ret = (char *)ckalloc((unsigned)(sizeof(char) * (length + 1))); + (void) Tcl_KanjiDecode(intKanjiCode, ws, ret); + ckfree((char *)ws); + string = ret; + } + } + } + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = kanjiCode; + } + return string; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiFindNamespace + * + * Find "::" in given string, except in kanji sequence. + * + * Results: + * Like a strstr(string, "::"), return address of first "::" in + * the string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + char * + Tcl_KanjiFindNamespace(s) + char *s; + { + while (*s != '\0') { + if (IS_KANJISTART(UCHAR(*s))) { + s += Tcl_KanjiSkip(s, NULL, NULL); + } else if (*s == ':' && *(s + 1) == ':') { + return s; + } else { + s++; + } + } + return NULL; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiBackslash -- + * + * Replacement for Tcl_Backslash(). Handle '\\' + KANJI. + * + * Results: + * Return successive kanji sequence just after '\\' if it + * is kanji string. Otherwise return Tcl_Backslash(). + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiBackslash(str, end, valBuf, valLenPtr, sNumPtr) + char *str; /* point '\\'. */ + char *end; /* last point of "str". */ + char *valBuf; /* value buffer. return */ + int *valLenPtr; /* length (in bytes) of "valBuf". Must be 1 or 0. return */ + int *sNumPtr; /* # (in bytes) of scanned. return */ + { + int valLen = 0; + int sNum = 0; + int ret = TCL_ANY; + unsigned char c; + char *start = str + 1; + int kanjiCode = TCL_ANY; + if (end == NULL) { + end = str + strlen(str); + } + + if (IS_KANJISTART(UCHAR(*start))) { + int skip = Tcl_KanjiSkip(start, end, &kanjiCode); + if (skip > 1 && kanjiCode != TCL_ANY && kanjiCode != TCL_NOT_KANJI) { + /* + * Found valid kanji seq. Just return 1 byte scan. + * The caller must continue kanji scanning. + */ + valLen = 0; + sNum = 1; + ret = kanjiCode; + } else { + goto tryNormal; + } + } else { + tryNormal: + c = (unsigned char)Tcl_Backslash(str, &sNum); + if (valBuf != NULL) { + *valBuf = c; + } + valLen = 1; + } + + if (valLenPtr != NULL) { + *valLenPtr = valLen; + } + if (sNumPtr != NULL) { + *sNumPtr = sNum; + } + + return ret; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiBackslashIsKanji -- + * + * Check \xXX\xXX or \XXX\XXX sequence matching kanji + * sequence to avoid re-conversion of the \xXX|\XXX sequence to + * internal kanji code. + * + * Results: + * If the sequence matches kanji, return kanji code. Otherwise + * return TCL_ANY. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + static char *bsCheckBuf = NULL; + static int bsCheckBufLen = 0; + int + Tcl_KanjiBackslashIsKanji(src, end) + char *src; + char *end; + { + int len = 0; + int numRead; + int ret; + char *dst; + int bufLen = end - src; + + if (bsCheckBuf == NULL || bufLen > bsCheckBufLen) { + bsCheckBufLen = bufLen; + if (bsCheckBuf != NULL) { + ckfree(bsCheckBuf); + } + bsCheckBuf = (char *)ckalloc((unsigned int)bsCheckBufLen); + } + dst = bsCheckBuf; + + /* + * scan the string until '\\' sequence end. + */ + while (end > src) { + if (*src == '\\') { + *dst++ = Tcl_Backslash(src, &numRead); + src += numRead; + len++; + } else { + break; + } + } + + if (len < 2) { + return TCL_ANY; + } else { + ret = EncodingDetection(bsCheckBuf, dst); + if (ret == TCL_NOT_KANJI) { + return TCL_ANY; + } + return ret; + } + return TCL_ANY; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_GetKanjiCode -- + * + * Get the kanji code according to the string. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_GetKanjiCode(interp, string, kanjiCodePtr) + Tcl_Interp *interp; + char *string; + int *kanjiCodePtr; + { + if( strcmp(string, "JIS") == 0 ) { + *kanjiCodePtr = TCL_JIS; + } else if( strcmp(string, "SJIS") == 0 ) { + *kanjiCodePtr = TCL_SJIS; + } else if( strcmp(string, "EUC") == 0 ) { + *kanjiCodePtr = TCL_EUC; + } else if( strcmp(string, "ANY") == 0 ) { + *kanjiCodePtr = TCL_ANY; + } else { + Tcl_AppendResult(interp, "bad kanjiCode \"", string, + "\": should be JIS, SJIS, EUC, or ANY", (char *) NULL); + return TCL_ERROR; + } + + return TCL_OK; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KanjiFile -- + * + * Check if the file contains kanji. + * + * Results: + * If the string contains kanji, set its kanji code + * and return TCL_OK. Otherwise return TCL_ERROR. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_KanjiFile(interp, fileName, kanjiCodePtr) + Tcl_Interp *interp; + char *fileName; + int *kanjiCodePtr; + { + Tcl_Channel chan; + Tcl_DString ds, kc; + int length, result = TCL_OK; + + chan = Tcl_OpenFileChannel(interp, fileName, "r", 0); + if (chan == (Tcl_Channel) NULL) { + return TCL_ERROR; + } + + *kanjiCodePtr = TCL_ANY; + Tcl_DStringInit(&ds); + Tcl_DStringInit(&kc); + (void) Tcl_GetChannelOption(interp, chan, "-inputCode", &kc); + (void) Tcl_SetChannelOption(interp, chan, "-inputCode", "ANY"); + while ((length = Tcl_Gets(chan, &ds)) > 0) { + (void) Tcl_KanjiString(interp, Tcl_DStringValue(&ds), NULL, kanjiCodePtr); + if (*kanjiCodePtr != TCL_ANY) { + break; + } + } + (void) Tcl_SetChannelOption(interp, chan, "-inputCode", Tcl_DStringValue(&kc)); + Tcl_DStringFree(&ds); + Tcl_DStringFree(&kc); + + if (length < 0) { + if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) { + Tcl_AppendResult(interp, "error reading \"", + Tcl_GetChannelName(chan), "\": ", Tcl_PosixError(interp), + (char *) NULL); + result = TCL_ERROR; + } + } + + if (Tcl_Close(interp, chan) != TCL_OK) { + result = TCL_ERROR; + } + + return result; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KStrchr -- + * + * Kanji-safe version of strchr. + * + * Results: + * the location of the char in string or NULL. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + char * + Tcl_KStrchr(str, c) + CONST char *str; + int c; + { + while (*str != c) { + if (IS_KANJISTART(UCHAR(*str))) + str += Tcl_KanjiSkip((char *)str, NULL, NULL); + else if (*str == '\0') + return NULL; + else + str++; + } + return (char *)str; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KStrrchr -- + * + * Kanji-safe version of strrchr. + * + * Results: + * the last location of the char in string or NULL. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + char * + Tcl_KStrrchr(str, c) + CONST char *str; + int c; + { + CONST char *result = NULL; + for (;;) { + if (IS_KANJISTART(UCHAR(*str))) + str += Tcl_KanjiSkip((char *)str, NULL, NULL); + else if (*str == c) + result = str++; + else if (*str == '\0') + break; + else + str++; + } + return (char *)result; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_KStrpbrk -- + * + * Kanji-safe version of strpbrk. + * Only `str' can contain kanji characters. + * + * Results: + * the location of the char in string or NULL. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + char * + Tcl_KStrpbrk(str, pattern) + CONST char *str; + CONST char *pattern; + { + while (*str != '\0') { + if (IS_KANJISTART(UCHAR(*str))) + str += Tcl_KanjiSkip((char *)str, NULL, NULL); + else if (strchr(pattern, *str) != NULL) + return (char *)str; + else + str++; + } + return NULL; + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrlen -- + * + * Get the length of the wide string. + * + * Results: + * Number of the wide characters. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + int + Tcl_WStrlen(wstr) + wchar *wstr; + { + int n = 0; + + while( *wstr++ ) n++; + + return n; + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrcpy -- + * + * Copy the wide string. + * + * Results: + * Pointer to the original string. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + wchar * + Tcl_WStrcpy(wstr1, wstr2) + wchar *wstr1, *wstr2; + { + wchar *ans = wstr1; + + while( (*wstr1++ = *wstr2++) != 0 ) ; + + return( ans ); + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrncpy -- + * + * Copy the specific number of wide characters. + * + * Results: + * Pointer to the original string. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + wchar * + Tcl_WStrncpy(wstr1, wstr2, n) + wchar *wstr1, *wstr2; + int n; + { + wchar *ans = wstr1; + + while( n-- > 0 && (*wstr1++ = *wstr2++) ) ; + + while( n-- > 0 ) *wstr1++ = 0; + + return( ans ); + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrcmp -- + * + * Compare two wide strings. + * + * Results: + * Return 0 if two strings are same. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + int + Tcl_WStrcmp(wstr1, wstr2) + wchar *wstr1, *wstr2; + { + while( *wstr1 && *wstr1 == *wstr2 ) wstr1++, wstr2++; + + return( *wstr1 - *wstr2 ); + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrncmp -- + * + * Compare two wide strings. + * + * Results: + * Return 0 if two strings are same. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + int + Tcl_WStrncmp(wstr1, wstr2, n) + wchar *wstr1, *wstr2; + int n; + { + while( n-- > 0 && *wstr1 && *wstr1 == *wstr2 ) wstr1++, wstr2++; + + if( n < 0 ) return( 0 ); + + return( *wstr1 - *wstr2 ); + } + + /* + *-------------------------------------------------------------- + * + * Tcl_WStrstr -- + * + * Locate the first instance of a substring in a string. + * + * Results: + * If string contains substring, the return value is the + * location of the first matching instance of substring + * in string. If string doesn't contain substring, the + * return value is 0. Matching is done on an exact + * character-for-character basis with no wildcards or special + * characters. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + wchar * + Tcl_WStrstr(wstr, subwstr) + register wchar *wstr; /* String to search. */ + wchar *subwstr; /* Substring to try to find in string. */ + { + register wchar *a, *b; + + /* First scan quickly through the two strings looking for a + * single-character match. When it's found, then compare the + * rest of the substring. + */ + + b = subwstr; + if (*b == 0) { + return wstr; + } + for ( ; *wstr != 0; wstr += 1) { + if (*wstr != *b) { + continue; + } + a = wstr; + while (1) { + if (*b == 0) { + return wstr; + } + if (*a++ != *b++) { + break; + } + } + b = subwstr; + } + return (wchar *) 0; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_WStringMatch -- + * + * See if a particular wide string matches a particular pattern. + * + * Results: + * The return value is 1 if string matches pattern, and + * 0 otherwise. The matching operation permits the following + * special characters in the pattern: *?\[] (see the manual + * entry for details on what these mean). + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + int + Tcl_WStringMatch(string, pattern) + register wchar *string; /* String. */ + register wchar *pattern; /* Pattern, which may contain + * special characters. */ + { + wchar c2; + + while (1) { + /* See if we're at the end of both the pattern and the string. + * If so, we succeeded. If we're at the end of the pattern + * but not at the end of the string, we failed. + */ + + if (*pattern == 0) { + if (*string == 0) { + return 1; + } else { + return 0; + } + } + if ((*string == 0) && (*pattern != '*')) { + return 0; + } + + /* Check for a "*" as the next pattern character. It matches + * any substring. We handle this by calling ourselves + * recursively for each postfix of string, until either we + * match or we reach the end of the string. + */ + + if (*pattern == '*') { + pattern += 1; + if (*pattern == 0) { + return 1; + } + while (1) { + if (Tcl_WStringMatch(string, pattern)) { + return 1; + } + if (*string == 0) { + return 0; + } + string += 1; + } + } + + /* Check for a "?" as the next pattern character. It matches + * any single character. + */ + + if (*pattern == '?') { + goto thisCharOK; + } + + /* Check for a "[" as the next pattern character. It is followed + * by a list of characters that are acceptable, or by a range + * (two characters separated by "-"). + */ + + if (*pattern == '[') { + pattern += 1; + while (1) { + if ((*pattern == ']') || (*pattern == 0)) { + return 0; + } + if (*pattern == *string) { + break; + } + if (pattern[1] == '-') { + c2 = pattern[2]; + if (c2 == 0) { + return 0; + } + if ((*pattern <= *string) && (c2 >= *string)) { + break; + } + if ((*pattern >= *string) && (c2 <= *string)) { + break; + } + pattern += 2; + } + pattern += 1; + } + while ((*pattern != ']') && (*pattern != 0)) { + pattern += 1; + } + goto thisCharOK; + } + + /* If the next pattern character is '/', just strip off the '/' + * so we do exact matching on the character that follows. + */ + + if (*pattern == '\\') { + pattern += 1; + if (*pattern == 0) { + return 0; + } + } + + /* There's no special character. Just make sure that the next + * characters of each string match. + */ + + if (*pattern != *string) { + return 0; + } + + thisCharOK: pattern += 1; + string += 1; + } + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringInit -- + * + * Initializes a dynamic string, discarding any previous contents + * of the string (Tcl_DWStringFree should have been called already + * if the dynamic string was previously in use). + * + * Results: + * None. + * + * Side effects: + * The dynamic string is initialized to be empty. + * + *---------------------------------------------------------------------- + */ + + void + Tcl_DWStringInit(dwsPtr) + register Tcl_DWString *dwsPtr; /* Pointer to structure for + * dynamic string. */ + { + dwsPtr->wstring = dwsPtr->staticSpace; + dwsPtr->length = 0; + dwsPtr->spaceAvl = TCL_DWSTRING_STATIC_SIZE; + dwsPtr->staticSpace[0] = 0; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringAppend -- + * + * Append more characters to the current value of a dynamic string. + * + * Results: + * The return value is a pointer to the dynamic string's new value. + * + * Side effects: + * Length bytes from string (or all of string if length is less + * than zero) are added to the current value of the string. Memory + * gets reallocated if needed to accomodate the string's new size. + * + *---------------------------------------------------------------------- + */ + + wchar * + Tcl_DWStringAppend(dwsPtr, wstring, length) + register Tcl_DWString *dwsPtr; /* Structure describing dynamic + * string. */ + wchar *wstring; /* String to append. If length is + * -1 then this must be + * null-terminated. */ + int length; /* Number of characters from string + * to append. If < 0, then append all + * of string, up to null at end. */ + { + int newSize; + wchar *newString, *dst, *end; + + if (length < 0) { + length = Tcl_WStrlen(wstring); + } + newSize = length + dwsPtr->length; + + /* + * Allocate a larger buffer for the string if the current one isn't + * large enough. Allocate extra space in the new buffer so that there + * will be room to grow before we have to allocate again. + */ + + if (newSize >= dwsPtr->spaceAvl) { + dwsPtr->spaceAvl = newSize*2; + newString = (wchar *) ckalloc((unsigned) (dwsPtr->spaceAvl * sizeof(wchar))); + memcpy((VOID *)newString, (VOID *) dwsPtr->wstring, + (size_t) (dwsPtr->length * sizeof(wchar))); + if (dwsPtr->wstring != dwsPtr->staticSpace) { + ckfree((char *) dwsPtr->wstring); + } + dwsPtr->wstring = newString; + } + + /* + * Copy the new string into the buffer at the end of the old + * one. + */ + + for (dst = dwsPtr->wstring + dwsPtr->length, end = wstring+length; + wstring < end; wstring++, dst++) { + *dst = *wstring; + } + *dst = 0; + dwsPtr->length += length; + return dwsPtr->wstring; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringSetLength -- + * + * Change the length of a dynamic string. This can cause the + * string to either grow or shrink, depending on the value of + * length. + * + * Results: + * None. + * + * Side effects: + * The length of dsPtr is changed to length and a null byte is + * stored at that position in the string. If length is larger + * than the space allocated for dsPtr, then a panic occurs. + * + *---------------------------------------------------------------------- + */ + + void + Tcl_DWStringSetLength(dwsPtr, length) + register Tcl_DWString *dwsPtr; /* Structure describing dynamic + * string. */ + int length; /* New length for dynamic string. */ + { + if (length < 0) { + length = 0; + } + if (length >= dwsPtr->spaceAvl) { + wchar *newString; + + dwsPtr->spaceAvl = length+1; + newString = (wchar *) ckalloc((unsigned) (dwsPtr->spaceAvl * sizeof(wchar))); + + /* + * SPECIAL NOTE: must use memcpy, not strcpy, to copy the string + * to a larger buffer, since there may be embedded NULLs in the + * string in some cases. + */ + + memcpy((VOID *) newString, (VOID *) dwsPtr->wstring, + (size_t) (dwsPtr->length * sizeof(wchar))); + if (dwsPtr->wstring != dwsPtr->staticSpace) { + ckfree((char *) dwsPtr->wstring); + } + dwsPtr->wstring = newString; + } + dwsPtr->length = length; + dwsPtr->wstring[length] = 0; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringFree -- + * + * Frees up any memory allocated for the dynamic string and + * reinitializes the string to an empty state. + * + * Results: + * None. + * + * Side effects: + * The previous contents of the dynamic string are lost, and + * the new value is an empty string. + * + *---------------------------------------------------------------------- + */ + + void + Tcl_DWStringFree(dwsPtr) + register Tcl_DWString *dwsPtr; /* Structure describing dynamic + * string. */ + { + if (dwsPtr->wstring != dwsPtr->staticSpace) { + ckfree((char *) dwsPtr->wstring); + } + dwsPtr->wstring = dwsPtr->staticSpace; + dwsPtr->length = 0; + dwsPtr->spaceAvl = TCL_DWSTRING_STATIC_SIZE; + dwsPtr->staticSpace[0] = 0; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringResult -- + * + * This procedure moves the value of a dynamic string into an + * interpreter as its result. The string itself is reinitialized + * to an empty string. + * + * Results: + * None. + * + * Side effects: + * The string is "moved" to interp's result, and any existing + * result for interp is freed up. DsPtr is reinitialized to + * an empty string. + * + *---------------------------------------------------------------------- + */ + + void + Tcl_DWStringResult(interp, dwsPtr) + Tcl_Interp *interp; /* Interpreter whose result is to be + * reset. */ + Tcl_DWString *dwsPtr; /* Dynamic string that is to become + * the result of interp. */ + { + int kanjiCode = ((Interp *) interp)->kanjiCode; + int length; + char* string; + + length = Tcl_KanjiDecode(kanjiCode, dwsPtr->wstring, NULL); + string = (char *) ckalloc((unsigned) (length + 1)); + (void) Tcl_KanjiDecode(kanjiCode, dwsPtr->wstring, string); + + Tcl_ResetResult(interp); + interp->result = string; + interp->freeProc = (Tcl_FreeProc *) free; + + Tcl_DWStringFree(dwsPtr); + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DWStringGetResult -- + * + * This procedure moves the result of an interpreter into a + * dynamic string. + * + * Results: + * None. + * + * Side effects: + * The interpreter's result is cleared, and the previous contents + * of dsPtr are freed. + * + *---------------------------------------------------------------------- + */ + + void + Tcl_DWStringGetResult(interp, dwsPtr) + Tcl_Interp *interp; /* Interpreter whose result is to be + * reset. */ + Tcl_DWString *dwsPtr; /* Dynamic string that is to become + * the result of interp. */ + { + Interp *iPtr = (Interp *) interp; + int kanjiCode = iPtr->kanjiCode; + int length; + wchar *wstring; + + length = Tcl_KanjiEncode(kanjiCode, iPtr->result, NULL); + wstring = (wchar *) ckalloc((unsigned) (length * sizeof(wchar))); + (void) Tcl_KanjiEncode(kanjiCode, iPtr->result, wstring); + + if (iPtr->freeProc != NULL) { + (*iPtr->freeProc)(iPtr->result); + iPtr->freeProc = NULL; + } + iPtr->result = iPtr->resultSpace; + iPtr->resultSpace[0] = 0; + + if (dwsPtr->wstring != dwsPtr->staticSpace) { + ckfree((char *) dwsPtr->wstring); + } + dwsPtr->length = Tcl_WStrlen(wstring); + if (dwsPtr->length < TCL_DWSTRING_STATIC_SIZE) { + dwsPtr->wstring = dwsPtr->staticSpace; + dwsPtr->spaceAvl = TCL_DWSTRING_STATIC_SIZE; + Tcl_WStrcpy(dwsPtr->wstring, wstring); + ckfree((char *) wstring); + } else { + dwsPtr->wstring = wstring; + dwsPtr->spaceAvl = dwsPtr->length + 1; + } + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_GetWStr -- + * + * Given a string, map them to a wide string. + * + * Results: + * The return value is normally a pointer to the wide string. + * + * Side effects: + * The wide string is added to an internal database with a reference + * count. For each call to this procedure, there should eventually + * be a call to Tcl_FreeWStr, so that the database is cleaned up when + * wide strings aren't in use anymore. + * + *---------------------------------------------------------------------- + */ + wchar * + Tcl_GetWStr(interp, str, kanjiCodePtr) + Tcl_Interp *interp; + char *str; + int *kanjiCodePtr; + { + Tcl_HashEntry *wstrHashPtr; + int new; + TclWStr *wstrPtr; + Tcl_HashEntry *idHashPtr; + int kanjiCode; + int length; + + if (!ws_initialized) WStrInit(); + + /* + * First, check to see if there's already a mapping for this string. + */ + + wstrHashPtr = Tcl_CreateHashEntry(&wstrTable, str, &new); + if (!new) { + wstrPtr = (TclWStr *)Tcl_GetHashValue(wstrHashPtr); + wstrPtr->refCount++; + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = wstrPtr->kanjiCode; + } + return wstrPtr->wstr; + } + + /* + * The string isn't currently known. Map from the string to + * a wide string, and add a new structure to the database. + */ + + /* + * Get the kanji encoding information. + */ + if (interp != NULL) { + kanjiCode = Tcl_KanjiCode(interp); + if (kanjiCode == TCL_ANY) goto Detect; + } else { + Detect: + (void) Tcl_KanjiString(NULL, str, NULL, &kanjiCode); + } + + wstrPtr = (TclWStr *) ckalloc(sizeof(TclWStr)); + memset((VOID *)wstrPtr, 0, sizeof(TclWStr)); + + wstrPtr->kanjiCode = kanjiCode; + length = strlen(str); + wstrPtr->str[kanjiCode] = ckalloc((unsigned)(length + 1)); + memcpy((VOID *)(wstrPtr->str[kanjiCode]), (VOID *)str, (unsigned)length); + (wstrPtr->str[kanjiCode])[length] = '\0'; + + length = Tcl_KanjiEncode(kanjiCode, str, NULL); + wstrPtr->wstr = (wchar *) ckalloc((unsigned)(length + 1) * sizeof(wchar)); + (void) Tcl_KanjiEncode(kanjiCode, str, wstrPtr->wstr); + + wstrPtr->refCount = 1; + wstrPtr->wstrHashPtr = wstrHashPtr; + idHashPtr = Tcl_CreateHashEntry(&ws_idTable, (char *)wstrPtr->wstr, &new); + if (!new) { + panic("wstr already registered in Tcl_GetWStr"); + } + Tcl_SetHashValue(wstrHashPtr, wstrPtr); + Tcl_SetHashValue(idHashPtr, wstrPtr); + + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = kanjiCode; + } + return wstrPtr->wstr; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_FreeWStr -- + * + * This procedure is called to release a wide string allocated + * by Tcl_GetWStr. + * + * Results: + * None. + * + * Side effects: + * The reference count associated with wstr is decremented, and + * wstr is officially deallocated if no-one is using it anymore. + * + *---------------------------------------------------------------------- + */ + void + Tcl_FreeWStr(wstr) + wchar *wstr; + { + Tcl_HashEntry *idHashPtr; + register TclWStr *wstrPtr; + + if( !ws_initialized ) panic("Tcl_FreeWStr called before Tcl_GetWStr"); + + idHashPtr = Tcl_FindHashEntry(&ws_idTable, (char *)wstr); + if( idHashPtr == NULL ) { + panic("Tcl_FreeWStr received unknown wstr argument"); + } + wstrPtr = (TclWStr *)Tcl_GetHashValue(idHashPtr); + wstrPtr->refCount--; + if( wstrPtr->refCount == 0 ) { + int i; + for (i = 0; i < 4; i++) { + if (wstrPtr->str[i] != NULL) { + ckfree((char *)wstrPtr->str[i]); + } + } + ckfree((char *)wstrPtr->wstr); + Tcl_DeleteHashEntry(wstrPtr->wstrHashPtr); + Tcl_DeleteHashEntry(idHashPtr); + ckfree((char *)wstrPtr); + } + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_InsertWStr -- + * + * This procedure is called to modify the existing wide + * string by inserting characters. + * + * Results: + * The return value is a pointer to the wide string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + wchar * + Tcl_InsertWStr(interp, orig, index, wstr) + Tcl_Interp *interp; + wchar *orig; + int index; + wchar *wstr; + { + int kanjiCode = TCL_ANY; + int origLen, wstrLen; + wchar *newstr; + char *str; + int length, new; + Tcl_HashEntry *wstrHashPtr; + register TclWStr *wstrPtr; + Tcl_HashEntry *idHashPtr; + + if (!ws_initialized) panic("Tcl_InsertWStr called before Tcl_GetWStr"); + + origLen = Tcl_WStrlen(orig); + wstrLen = Tcl_WStrlen(wstr); + newstr = (wchar *) ckalloc((unsigned)(origLen + wstrLen + 1) * sizeof(wchar)); + Tcl_WStrncpy(newstr, orig, index); + Tcl_WStrcpy(newstr+index, wstr); + Tcl_WStrcpy(newstr+index+wstrLen, orig+index); + + /* + * if interp != NULL, use internal kanji code. + */ + if (interp != NULL) { + kanjiCode = Tcl_KanjiCode(interp); + if (kanjiCode == TCL_ANY) goto Decide; + } else { + Decide: + kanjiCode = Tcl_DefaultKanjiCode(); + } + + /* + * Check if there's already a mapping for this string. + */ + length = Tcl_KanjiDecode(kanjiCode, newstr, NULL); + str = (char *) ckalloc((unsigned)(length + 1)); + (void) Tcl_KanjiDecode(kanjiCode, newstr, str); + + wstrHashPtr = Tcl_CreateHashEntry(&wstrTable, str, &new); + if (!new) { + wstrPtr = (TclWStr *) Tcl_GetHashValue(wstrHashPtr); + wstrPtr->refCount++; + Tcl_FreeWStr(orig); + ckfree((char *) newstr); + ckfree(str); + return wstrPtr->wstr; + } + + /* + * The string isn't currently known. Map from the string to + * a wide string, and add a new structure to the database. + */ + wstrPtr = (TclWStr *) ckalloc(sizeof(TclWStr)); + memset((VOID *)wstrPtr, 0, sizeof(TclWStr)); + wstrPtr->kanjiCode = kanjiCode; + wstrPtr->str[kanjiCode] = str; + wstrPtr->wstr = newstr; + wstrPtr->refCount = 1; + wstrPtr->wstrHashPtr = wstrHashPtr; + idHashPtr = Tcl_CreateHashEntry(&ws_idTable, (char *)wstrPtr->wstr, &new); + if (!new) { + panic("wstr already registered in Tcl_InsertWStr"); + } + Tcl_SetHashValue(wstrPtr->wstrHashPtr, wstrPtr); + Tcl_SetHashValue(idHashPtr, wstrPtr); + + Tcl_FreeWStr(orig); + return wstrPtr->wstr; + } + + /* + *---------------------------------------------------------------------- + * + * Tcl_DeleteWStr -- + * + * This procedure is called to modify the existing wide + * string by deleting characters. + * + * Results: + * The return value is a pointer to the wide string. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + wchar * + Tcl_DeleteWStr(interp, orig, index, count) + Tcl_Interp *interp; + wchar *orig; + int index; + int count; + { + int kanjiCode; + int length; + wchar *newstr; + char *str; + Tcl_HashEntry *wstrHashPtr; + register TclWStr *wstrPtr; + Tcl_HashEntry *idHashPtr; + int new; + + if (!ws_initialized) panic("Tcl_InsertWStr called before Tcl_GetWStr"); + + length = Tcl_WStrlen(orig); + newstr = (wchar *) ckalloc((unsigned)(length - count + 1) * sizeof(wchar)); + Tcl_WStrncpy(newstr, orig, index); + Tcl_WStrcpy(newstr+index, orig+index+count); + + /* + * if interp != NULL, use internal kanji code. + */ + if (interp != NULL) { + kanjiCode = Tcl_KanjiCode(interp); + if (kanjiCode == TCL_ANY) goto Decide; + } else { + Decide: + kanjiCode = Tcl_DefaultKanjiCode(); + } + + /* + * Check if there's already a mapping for this string. + */ + length = Tcl_KanjiDecode(kanjiCode, newstr, NULL); + str = (char *) ckalloc((unsigned)(length + 1)); + (void) Tcl_KanjiDecode(kanjiCode, newstr, str); + + wstrHashPtr = Tcl_CreateHashEntry(&wstrTable, str, &new); + if (!new) { + wstrPtr = (TclWStr *) Tcl_GetHashValue(wstrHashPtr); + wstrPtr->refCount++; + ckfree((char *) newstr); + ckfree(str); + Tcl_FreeWStr(orig); + return wstrPtr->wstr; + } + + /* + * The string isn't currently known. Map from the string to + * a wide string, and add a new structure to the database. + */ + wstrPtr = (TclWStr *) ckalloc(sizeof(TclWStr)); + memset((VOID *)wstrPtr, 0, sizeof(TclWStr)); + wstrPtr->kanjiCode = kanjiCode; + wstrPtr->str[kanjiCode] = str; + wstrPtr->wstr = newstr; + wstrPtr->refCount = 1; + wstrPtr->wstrHashPtr = wstrHashPtr; + idHashPtr = Tcl_CreateHashEntry(&ws_idTable, (char *)wstrPtr->wstr, &new); + if (!new) { + panic("wstr already registered in Tcl_DeleteWStr"); + } + Tcl_SetHashValue(wstrPtr->wstrHashPtr, wstrPtr); + Tcl_SetHashValue(idHashPtr, wstrPtr); + + Tcl_FreeWStr(orig); + return wstrPtr->wstr; + } + + /* + *-------------------------------------------------------------- + * + * Tcl_DecodeWStr -- + * + * Answer the original string of the wide string. + * + * Results: + * If interp == NULL, return original string of the wide string. + * Otherwise return string converted to internal kanji code. + * + * Side effects: + * None. + * + *-------------------------------------------------------------- + */ + + char * + Tcl_DecodeWStr(interp, wstr, kanjiCodePtr) + Tcl_Interp *interp; + wchar *wstr; + int *kanjiCodePtr; + { + Tcl_HashEntry *idHashPtr; + register TclWStr *wstrPtr; + int kanjiCode; + + if (!ws_initialized) panic("Tcl_DecodeWStr called before Tcl_GetWStr"); + + idHashPtr = Tcl_FindHashEntry(&ws_idTable, (char *)wstr); + if( idHashPtr == NULL ) { + panic("Tcl_DecodeWStr received unknown wstr argument"); + } + wstrPtr = (TclWStr *) Tcl_GetHashValue(idHashPtr); + + if (kanjiCodePtr != NULL) { + *kanjiCodePtr = wstrPtr->kanjiCode; + } + + if (interp != NULL) { + kanjiCode = Tcl_KanjiCode(interp); + if (kanjiCode == TCL_ANY) goto Decide; + } else { + Decide: + kanjiCode = wstrPtr->kanjiCode; + } + + if (wstrPtr->str[kanjiCode] == NULL) { + int lenght = Tcl_KanjiDecode(kanjiCode, wstrPtr->wstr, NULL); + wstrPtr->str[kanjiCode] = ckalloc((unsigned)((lenght + 1) * sizeof(char))); + (void)Tcl_KanjiDecode(kanjiCode, wstrPtr->wstr, wstrPtr->str[kanjiCode]); + } + return wstrPtr->str[kanjiCode]; + } + + /* + *---------------------------------------------------------------------- + * + * WStrInit -- + * + * Initialize the structures used for WStr management. + * + * Results: + * None. + * + * Side effects: + * Read the code. + * + *---------------------------------------------------------------------- + */ + + static void + WStrInit() + { + ws_initialized = 1; + Tcl_InitHashTable(&wstrTable, TCL_STRING_KEYS); + Tcl_InitHashTable(&ws_idTable, TCL_ONE_WORD_KEYS); + } + #endif /* KANJI */ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclNamesp.c ./generic/tclNamesp.c *** ../../tcl8.0.5/generic/tclNamesp.c Thu Feb 4 06:28:01 1999 --- ./generic/tclNamesp.c Fri Mar 12 00:01:09 1999 *************** *** 1684,1689 **** --- 1684,1694 ---- len = 0; for (end = start; *end != '\0'; end++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*end))) { + end += (Tcl_KanjiSkip(end, NULL, NULL) - 1); + } else + #endif /* KANJI */ if ((*end == ':') && (*(end+1) == ':')) { end += 2; /* skip over the initial :: */ while (*end == ':') { *************** *** 3440,3445 **** --- 3445,3453 ---- { register char *name, *p; int length; + #ifdef KANJI + char *lastCOLON = NULL; + #endif /* KANJI */ if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "string"); *************** *** 3452,3457 **** --- 3460,3488 ---- */ name = Tcl_GetStringFromObj(objv[2], (int *) NULL); + #ifdef KANJI + /* + * Well, we have to search from start. + */ + p = name; + while (*p != '\0') { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + } else if (*p == ':' && *(p + 1) == ':') { + lastCOLON = p; + p += 2; + while (*p != '\0' && *p == ':') { + p++; + } + } else { + p++; + } + } + if (lastCOLON != NULL && lastCOLON != name) { + length = lastCOLON - name; + Tcl_AppendToObj(Tcl_GetObjResult(interp), name, length); + } + #else for (p = name; *p != '\0'; p++) { /* empty body */ } *************** *** 3469,3474 **** --- 3500,3506 ---- length = p-name+1; Tcl_AppendToObj(Tcl_GetObjResult(interp), name, length); } + #endif /* KANJI */ return TCL_OK; } *************** *** 3506,3511 **** --- 3538,3546 ---- Tcl_Obj *CONST objv[]; /* Argument objects. */ { register char *name, *p; + #ifdef KANJI + char *last = NULL; + #endif /* KANJI */ if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "string"); *************** *** 3518,3523 **** --- 3553,3583 ---- */ name = Tcl_GetStringFromObj(objv[2], (int *) NULL); + #ifdef KANJI + /* + * Well, we have to search from start. + */ + p = name; + while (*p != '\0') { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + } else if (*p == ':' && *(p + 1) == ':') { + p += 2; + last = p; + while (*p != '\0' && *p == ':') { + p++; + last = p; + } + } else { + p++; + } + } + if (last != NULL) { + Tcl_AppendToObj(Tcl_GetObjResult(interp), last, -1); + } else { + Tcl_AppendToObj(Tcl_GetObjResult(interp), name, -1); + } + #else for (p = name; *p != '\0'; p++) { /* empty body */ } *************** *** 3531,3536 **** --- 3591,3597 ---- if (p >= name) { Tcl_AppendToObj(Tcl_GetObjResult(interp), p, -1); } + #endif /* KANJI */ return TCL_OK; } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclParse.c ./generic/tclParse.c *** ../../tcl8.0.5/generic/tclParse.c Tue Sep 15 03:40:01 1998 --- ./generic/tclParse.c Fri Mar 12 00:01:11 1999 *************** *** 74,79 **** --- 74,83 ---- { register char *src, *dst, c; char *lastChar = string + strlen(string); + #ifdef KANJI + int kanjiCode = TCL_ANY; + int valLen = 0; + #endif /* KANJI */ src = string; dst = pvPtr->next; *************** *** 91,96 **** --- 95,109 ---- c = *src; src++; + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*(src-1)))) { + Tcl_KanjiSkip(src-1, lastChar, &kanjiCode); + pvPtr->next = dst; + (void)TclParseKanji(interp, src-1, lastChar, kanjiCode, termPtr, pvPtr); + src = *termPtr; + dst = pvPtr->next; + } else + #endif /* KANJI */ if (c == termChar) { *dst = '\0'; pvPtr->next = dst; *************** *** 134,141 **** --- 147,159 ---- int numRead; src--; + #ifdef KANJI + (void)Tcl_KanjiBackslash(src, lastChar, dst, &valLen, &numRead); + dst += valLen; + #else *dst = Tcl_Backslash(src, &numRead); dst++; + #endif /* KANJI */ src += numRead; continue; } else if (c == '\0') { *************** *** 263,268 **** --- 281,289 ---- register char *src, *dst, *end; register char c; char *lastChar = string + strlen(string); + #ifdef KANJI + int kanjiCode = TCL_ANY; + #endif /* KANJI */ src = string; dst = pvPtr->next; *************** *** 275,280 **** --- 296,311 ---- */ while (1) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*src))) { + Tcl_KanjiSkip(src, lastChar, &kanjiCode); + pvPtr->next = dst; + (void)TclParseKanji(interp, src, lastChar, kanjiCode, termPtr, pvPtr); + src = *termPtr; + dst = pvPtr->next; + end = pvPtr->end; + } + #endif /* KANJI */ c = *src; src++; if (dst == end) { *************** *** 308,314 **** --- 339,352 ---- dst[-1] = Tcl_Backslash(src-1, &count); src += count - 1; } else { + #ifdef KANJI + /* + * '\\' is already copied. + */ + (void)Tcl_KanjiBackslash(src-1, lastChar, NULL, NULL, &count); + #else (void) Tcl_Backslash(src-1, &count); + #endif /* KANJI */ while (count > 1) { if (dst == end) { pvPtr->next = dst; *************** *** 467,472 **** --- 505,531 ---- p++; } else if (*p == '{') { int braces = 1; + #ifdef KANJI + p++; + while (braces != 0) { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + continue; + } else if (*p == '\\') { + (void)Tcl_KanjiBackslash(p, lastChar, NULL, NULL, &count); + p += count; + continue; + } + if (*p == '}') { + braces--; + } else if (*p == '{') { + braces++; + } else if (p == lastChar) { + return p; + } + p++; + } + #else while (braces != 0) { p++; while (*p == '\\') { *************** *** 482,487 **** --- 541,547 ---- } } p++; + #endif /* KANJI */ } /* *************** *** 493,498 **** --- 553,563 ---- */ while (1) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + } else + #endif /* KANJI */ if (*p == '[') { p = ScriptEnd(p+1, lastChar, 1); if (p == lastChar) { *************** *** 509,515 **** --- 574,584 ---- return p-1; } + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, lastChar, NULL, NULL, &count); + #else (void) Tcl_Backslash(p, &count); + #endif /* KANJI */ p += count; } else if (*p == '$') { p = VarNameEnd(p, lastChar); *************** *** 580,587 **** --- 649,665 ---- int count; while (*p != term) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + } else + #endif /* KANJI */ if (*p == '\\') { + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, lastChar, NULL, NULL, &count); + #else (void) Tcl_Backslash(p, &count); + #endif /* KANJI */ p += count; } else if (*p == '[') { for (p++; *p != ']'; p++) { *************** *** 635,647 **** --- 713,743 ---- if (*p == '{') { for (p++; (*p != '}') && (p != lastChar); p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, lastChar, NULL) - 1); + continue; + } + #else /* Empty loop body. */ + #endif /* KANJI */ } return p; } + #ifdef KANJI + while (isalnum(UCHAR(*p)) || (*p == '_') || + IS_KANJISTART(UCHAR(*p))) { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + } else { + p++; + } + } + #else while (isalnum(UCHAR(*p)) || (*p == '_')) { p++; } + #endif if ((*p == '(') && (p != string+1)) { return QuoteEnd(p+1, lastChar, ')'); } *************** *** 688,695 **** --- 784,802 ---- } p++; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + continue; + } + #endif /* KANJI */ if ((*p == '#') && commentOK) { do { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, lastChar, NULL); + } else + #endif /* KANJI */ if (*p == '\\') { /* * If the script ends with backslash-newline, then *************** *** 699,705 **** --- 806,816 ---- if ((p[1] == '\n') && (p+2 == lastChar)) { return p+2; } + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, lastChar, NULL, NULL, &length); + #else Tcl_Backslash(p, &length); + #endif /* KANJI */ p += length; } else { p++; *************** *** 761,766 **** --- 872,880 ---- #define NUM_CHARS 200 char copyStorage[NUM_CHARS]; ParseValue pv; + #ifdef KANJI + unsigned char *sEnd = string + strlen(string); + #endif /* KANJI */ /* * There are three cases: *************** *** 792,805 **** --- 906,934 ---- } return NULL; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*string))) { + string += Tcl_KanjiSkip(string, sEnd, NULL); + continue; + } + #endif /* KANJI */ string++; } name1End = string; string++; } else { name1 = string; + #ifdef KANJI + while (isalnum(UCHAR(*string)) || (*string == '_') + || (*string == ':') || IS_KANJISTART(UCHAR(*string))) { + if (IS_KANJISTART(UCHAR(*string))) { + string += Tcl_KanjiSkip(string, sEnd, NULL); + continue; + } + #else while (isalnum(UCHAR(*string)) || (*string == '_') || (*string == ':')) { + #endif /* KANJI */ if (*string == ':') { if (*(string+1) == ':') { string += 2; /* skip over the initial :: */ *************** *** 871,876 **** --- 1000,1084 ---- } return result; } + + #ifdef KANJI + /* + *---------------------------------------------------------------------- + * + * TclParseKanji -- + * + * This procedure parses a kanji string which code is either + * JIS, SJIS,or EUC, and convert its code if necessary. + * + * Results: + * The return value is (currently) always TCL_OK. If termPtr + * isn't NULL, *termPtr gets filled in with the address of the + * character just after the last one in the variable specifier. + * character just after the matching close-quote. The fully- + * substituted contents of the kanji string are stored in + * standard fashion in *pvPtr, null-terminated with pvPtr->next + * pointing to the terminating null character. + * + * Side effects: + * The buffer space in pvPtr may be enlarged by calling its + * expandProc. + * + *---------------------------------------------------------------------- + */ + + int + TclParseKanji(interp, string, end, kanjiCode, termPtr, pvPtr) + Tcl_Interp *interp; + char *string; + char *end; + int kanjiCode; + char **termPtr; + ParseValue *pvPtr; + { + Interp *iPtr = (Interp *)interp; + unsigned int length; + + length = Tcl_KanjiLength(string, end, kanjiCode); + + if( iPtr->kanjiCode == TCL_ANY || iPtr->kanjiCode == kanjiCode ) { + + if( (pvPtr->end - pvPtr->next) <= (int)length ) { + (*pvPtr->expandProc)(pvPtr, (int)length); + } + + strncpy(pvPtr->next, string, length); + + *termPtr = string + length; + pvPtr->next += length; + + } else { + char c; + int n; + wchar *ws; + + c = string[length]; + string[length] = '\0'; + + n = Tcl_KanjiEncode(kanjiCode, string, NULL); + ws = (wchar *)ckalloc((unsigned)((n + 1) * sizeof(wchar))); + (void) Tcl_KanjiEncode(kanjiCode, string, ws); + + n = Tcl_KanjiDecode(iPtr->kanjiCode, ws, NULL); + if( (pvPtr->end - pvPtr->next) <= (n+1) ) { + (*pvPtr->expandProc)(pvPtr, (n+1)); + } + (void) Tcl_KanjiDecode(iPtr->kanjiCode, ws, pvPtr->next); + + ckfree((char *) ws); + string[length] = c; + + *termPtr = string + length; + pvPtr->next += n; + } + + return TCL_OK; + } + #endif /* KANJI */ /* *---------------------------------------------------------------------- diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclProc.c ./generic/tclProc.c *** ../../tcl8.0.5/generic/tclProc.c Wed Feb 3 09:55:06 1999 --- ./generic/tclProc.c Fri Mar 12 00:01:13 1999 *************** *** 185,191 **** --- 185,195 ---- register Proc *procPtr; int i, length, result, numArgs; char *args, *bytes, *p; + #ifdef BUGFIX + register CompiledLocal *localPtr = (CompiledLocal *)NULL; + #else register CompiledLocal *localPtr; + #endif /* BUGFIX */ Tcl_Obj *defPtr; int precompiled = 0; *************** *** 319,324 **** --- 323,333 ---- p = fieldValues[0]; while (*p != '\0') { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + } else + #endif /* KANJI */ if (*p == '(') { char *q = p; do { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclTest.c ./generic/tclTest.c *** ../../tcl8.0.5/generic/tclTest.c Wed Feb 3 11:58:25 1999 --- ./generic/tclTest.c Fri Mar 12 00:01:15 1999 *************** *** 215,220 **** --- 215,224 ---- static int TestwordendObjCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); + #ifdef KANJI + static int KanjitestCmd _ANSI_ARGS_((ClientData dummy, + Tcl_Interp *interp, int argc, char **argv)); + #endif /* KANJI */ /* * External (platform specific) initialization routine, this declaration *************** *** 350,355 **** --- 354,363 ---- t3ArgTypes[1] = TCL_EITHER; Tcl_CreateMathFunc(interp, "T3", 2, t3ArgTypes, TestMathFunc2, (ClientData) 0); + #ifdef KANJI + Tcl_CreateCommand(interp, "kanjitest", KanjitestCmd, (ClientData) 0, + (Tcl_CmdDeleteProc *) NULL); + #endif /* KANJI */ /* * And finally add any platform specific test commands. *************** *** 1204,1209 **** --- 1212,1310 ---- { ckfree(blockPtr - 4); } + #ifdef KANJI + + /* + *---------------------------------------------------------------------- + * + * KanjitestCmd -- + * + * This procedure implements the "kanjitest" command. It is used + * to test kanji extensions of Tcl. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * Creates, deletes, and ivokes handlers. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ + static int + KanjitestCmd(dummy, interp, argc, argv) + ClientData dummy; /* Not used. */ + Tcl_Interp *interp; /* Current interpreter. */ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " option arg ?arg ...?\"", (char *) NULL); + return TCL_ERROR; + } + if (strcmp(argv[1], "end") == 0) { + int kanjiCode = TCL_ANY; + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " end stringValue ?kanjiCode?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 4) { + if (Tcl_GetKanjiCode(interp, argv[3], &kanjiCode) != TCL_OK) { + return TCL_ERROR; + } + } + if (Tcl_KanjiEnd(argv[2], NULL, &kanjiCode)) { + interp->result = "1"; + } else { + interp->result = "0"; + } + } else if (strcmp(argv[1], "start") == 0) { + int kanjiCode = TCL_ANY; + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " start stringValue ?kanjiCode?\"", (char *) NULL); + return TCL_ERROR; + } + if (argc == 4) { + if (Tcl_GetKanjiCode(interp, argv[3], &kanjiCode) != TCL_OK) { + return TCL_ERROR; + } + } + if (Tcl_KanjiStart(argv[2], NULL, &kanjiCode)) { + interp->result = "1"; + } else { + interp->result = "0"; + } + } else if (strcmp(argv[1], "write") == 0) { + Tcl_Channel out; + int length; + + if (argc != 3 && argc != 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " write string ?length?\"", (char *) NULL); + return TCL_ERROR; + } + out = Tcl_GetStdChannel(TCL_STDOUT); + if (out == (Tcl_Channel) NULL) { + return TCL_ERROR; + } + if (argc == 4) { + if (Tcl_GetInt(interp, argv[3], &length) != TCL_OK) { + return TCL_ERROR; + } + } + sprintf(interp->result, "%d", Tcl_Write(out, argv[2], length)); + } else { + Tcl_AppendResult(interp, "bad option \"", argv[1], + "\": must be start, end, or write", (char *) NULL); + return TCL_ERROR; + } + return TCL_OK; + } + #endif /* KANJI */ /* *---------------------------------------------------------------------- diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclUtil.c ./generic/tclUtil.c *** ../../tcl8.0.5/generic/tclUtil.c Tue Sep 15 03:40:02 1998 --- ./generic/tclUtil.c Fri Mar 12 00:01:17 1999 *************** *** 169,174 **** --- 169,184 ---- */ while (p < limit) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, limit, NULL); + if (p >= limit) { + p = limit; + break; + } + continue; + } + #endif /* KANJI */ switch (*p) { /* *************** *** 224,230 **** --- 234,244 ---- */ case '\\': { + #ifdef KANJI + (void)Tcl_KanjiBackslash(p, limit, NULL, NULL, &numChars); + #else (void) Tcl_Backslash(p, &numChars); + #endif /* KANJI */ p += (numChars - 1); break; } *************** *** 346,355 **** --- 360,389 ---- int numRead; int newCount = 0; + #ifdef KANJI + char *end = src + count; + int valLen = 0; + #endif /* KANJI */ + for (c = *src; count > 0; src++, c = *src, count--) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(c))) { + numRead = Tcl_KanjiSkip(src, end, NULL); + memcpy((VOID *)dst, (VOID *)src, (size_t)numRead); + dst += numRead; + src += (numRead - 1); + count -= (numRead - 1); + newCount += numRead; + } else + #endif /* KANJI */ if (c == '\\') { + #ifdef KANJI + (void)Tcl_KanjiBackslash(src, end, dst, &valLen, &numRead); + dst += valLen; + #else *dst = Tcl_Backslash(src, &numRead); dst++; + #endif /* KANJI */ src += numRead-1; count -= numRead-1; newCount++; *************** *** 586,591 **** --- 620,631 ---- flags |= USE_BRACES; } for ( ; p != lastChar; p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip((char *)p, (char *)lastChar, NULL) - 1); + continue; + } + #endif /* KANJI */ switch (*p) { case '{': nestingLevel++; *************** *** 613,619 **** --- 653,663 ---- } else { int size; + #ifdef KANJI + (void)Tcl_KanjiBackslash((char *)p, (char *)lastChar, NULL, NULL, &size); + #else (void) Tcl_Backslash(p, &size); + #endif /* KANJI */ p += size-1; flags |= USE_BRACES; } *************** *** 736,741 **** --- 780,794 ---- flags |= BRACES_UNMATCHED; } for (; src != lastChar; src++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*src))) { + int length = Tcl_KanjiSkip((char *)src, (char *)lastChar, NULL); + memcpy((VOID *)p, (VOID *)src, (unsigned int)length); + src += (length - 1); + p += length; + continue; + } + #endif /* KANJI */ switch (*src) { case ']': case '[': *************** *** 2610,2616 **** --- 2663,2675 ---- } end--; if (*end != '{') { + #ifdef KANJI + int kanjiCode = TCL_ANY; + if (isspace(UCHAR(*end)) && ((end == start) || (end[-1] != '\\')) + && !Tcl_KanjiEnd(start, end, &kanjiCode)) { + #else if (isspace(UCHAR(*end)) && ((end == start) || (end[-1] != '\\'))) { + #endif /* KANJI */ return 0; } return 1; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/generic/tclVar.c ./generic/tclVar.c *** ../../tcl8.0.5/generic/tclVar.c Wed Feb 3 09:55:06 1999 --- ./generic/tclVar.c Fri Mar 12 00:01:18 1999 *************** *** 166,171 **** --- 166,176 ---- elName = NULL; break; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, NULL, NULL) - 1); + } else + #endif /* KANJI */ if (*p == '(') { openParen = p; do { *************** *** 243,249 **** --- 248,258 ---- if (((flags & (TCL_GLOBAL_ONLY | TCL_NAMESPACE_ONLY)) != 0) || (varFramePtr == NULL) || !varFramePtr->isProcCallFrame + #ifdef KANJI + || (Tcl_KanjiFindNamespace(part1) != NULL)) { + #else || (strstr(part1, "::") != NULL)) { + #endif /* KANJI */ char *tail; /* *************** *** 2745,2752 **** --- 2754,2775 ---- char *name, *p; int nameBytes, i; + #ifdef KANJI + int kanjiLen; + char *lastChar; + #endif /* KANJI */ name = TclGetStringFromObj(objv[1], &nameBytes); + #ifdef KANJI + lastChar = name + nameBytes; + #endif /* KANJI */ for (i = 0, p = name; i < nameBytes; i++, p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + kanjiLen = Tcl_KanjiSkip(p, lastChar, NULL) - 1; + i += kanjiLen; + p += kanjiLen; + } else + #endif /* KANJI */ if (*p == '(') { p = (name + nameBytes-1); if (*p == ')') { /* last char is ')' => array ref */ *************** *** 3326,3332 **** --- 3349,3359 ---- if ((myFlags & (TCL_GLOBAL_ONLY | TCL_NAMESPACE_ONLY)) || (varFramePtr == NULL) || !varFramePtr->isProcCallFrame + #ifdef KANJI + || (Tcl_KanjiFindNamespace(myName) != NULL)) { + #else || (strstr(myName, "::") != NULL)) { + #endif /* KANJI */ TclGetNamespaceForQualName((Tcl_Interp *) iPtr, myName, (Namespace *) NULL, myFlags, &nsPtr, &altNsPtr, &dummyNsPtr, &tail); *************** *** 3492,3497 **** --- 3519,3529 ---- */ for (p = varName; *p != '\0'; p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, NULL, NULL) - 1); + } else + #endif /* KANJI */ if (*p == '(') { char *openParen = p; do { *************** *** 3643,3648 **** --- 3675,3683 ---- char *varName; register char *tail; int result, i; + #ifdef KANJI + char *p; + #endif /* KANJI */ if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "varName ?varName ...?"); *************** *** 3672,3677 **** --- 3707,3730 ---- * the local "link" variable must be the simple name at the tail. */ + #ifdef KANJI + p = varName; + tail = varName; + while (*p != '\0') { + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + } else if (*p == ':' && *(p + 1) == ':') { + p += 2; + tail = p; + while (*p != '\0' && *p == ':') { + p++; + tail = p; + } + } else { + p++; + } + } + #else for (tail = varName; *tail != '\0'; tail++) { /* empty body */ } *************** *** 3681,3686 **** --- 3734,3740 ---- if (*tail == ':') { tail++; } + #endif /* KANJI */ /* * Link to the variable "varName" in the global :: namespace. *************** *** 3799,3805 **** * Locate tail in one pass: drop any prefix after two *or more* * consecutive ":" characters). */ ! for (tail = cp = varName; *cp != '\0'; ) { if (*cp++ == ':') { while (*cp++ == ':') { --- 3853,3875 ---- * Locate tail in one pass: drop any prefix after two *or more* * consecutive ":" characters). */ ! #ifdef KANJI ! tail = cp = varName; ! while (*cp != '\0') { ! if (IS_KANJISTART(UCHAR(*cp))) { ! cp += Tcl_KanjiSkip(cp, NULL, NULL); ! } else if (*cp == ':' && *(cp + 1) == ':') { ! cp += 2; ! tail = cp; ! while (*cp != '\0' && *cp == ':') { ! cp++; ! tail = cp; ! } ! } else { ! cp++; ! } ! } ! #else for (tail = cp = varName; *cp != '\0'; ) { if (*cp++ == ':') { while (*cp++ == ':') { *************** *** 3807,3812 **** --- 3877,3883 ---- } } } + #endif /* KANJI */ /* * Create a local link "tail" to the variable "varName" in the *************** *** 3889,3894 **** --- 3960,3970 ---- myVarName = Tcl_GetStringFromObj(objv[1], (int *) NULL); otherVarName = Tcl_GetStringFromObj(objv[0], (int *) NULL); for (p = otherVarName; *p != 0; p++) { + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, NULL, NULL) - 1); + } else + #endif /* KANJI */ if (*p == '(') { char *openParen = p; *************** *** 3995,4000 **** --- 4071,4081 ---- if (*p == 0) { break; } + #ifdef KANJI + if (IS_KANJISTART(UCHAR(*p))) { + p += (Tcl_KanjiSkip(p, NULL, NULL) - 1); + } else + #endif /* KANJI */ if (*p == '(') { openParen = p; do { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/library/http1.0/http.tcl ./library/http1.0/http.tcl *** ../../tcl8.0.5/library/http1.0/http.tcl Tue Sep 15 03:40:03 1998 --- ./library/http1.0/http.tcl Fri Mar 12 00:01:37 1999 *************** *** 343,348 **** --- 343,354 ---- # 4 "subst" the result, doing all the array substitutions proc httpMapReply {string} { + set isKanji 0 + if {[string length [info command kanji]] > 0} { + set isKanji 1 + set sc [kanji scanKanji] + kanji scanKanji no + } global httpFormMap set alphanumeric a-zA-Z0-9 if {![info exists httpFormMap]} { *************** *** 362,368 **** regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string ! return [subst $string] } # Default proxy filter. --- 368,380 ---- regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string ! if {$isKanji == 0} { ! return [subst $string] ! } else { ! set ret [subst $string] ! kanji scanKanji $sc ! return $ret ! } } # Default proxy filter. diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/library/http2.0/http.tcl ./library/http2.0/http.tcl *** ../../tcl8.0.5/library/http2.0/http.tcl Wed Feb 3 07:28:30 1999 --- ./library/http2.0/http.tcl Fri Mar 12 00:01:45 1999 *************** *** 443,455 **** # 4 "subst" the result, doing all the array substitutions proc http::mapReply {string} { variable formMap set alphanumeric a-zA-Z0-9 regsub -all \[^$alphanumeric\] $string {$formMap(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string ! return [subst $string] } # Default proxy filter. --- 443,467 ---- # 4 "subst" the result, doing all the array substitutions proc http::mapReply {string} { + set isKanji 0 + if {[string length [info command kanji]] > 0} { + set isKanji 1 + set sc [kanji scanKanji] + kanji scanKanji no + } variable formMap set alphanumeric a-zA-Z0-9 regsub -all \[^$alphanumeric\] $string {$formMap(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string ! if {$isKanji == 0} { ! return [subst $string] ! } else { ! set ret [subst $string] ! kanji scanKanji $sc ! return $ret ! } } # Default proxy filter. diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/library/init.tcl ./library/init.tcl *** ../../tcl8.0.5/library/init.tcl Thu Feb 11 12:06:23 1999 --- ./library/init.tcl Fri Mar 12 00:01:28 1999 *************** *** 262,267 **** --- 262,293 ---- return -code error "invalid command name \"$name\"" } + # unknown_kanji -- + + proc unknown_kanji args { + global auto_convload errorCode + if { ![ info exists auto_convload ] } { + set conv [ kanji convertWhenCompile ] + kanji convertWhenCompile no + set code [ catch { set ret [ uplevel __org_unknown $args ] } msg ] + kanji convertWhenCompile $conv + if { $code != 0 } { + return -code $code -errorcode $errorCode $msg + } else { + return $ret + } + } else { + uplevel __org_unknown $args + } + } + + if { [ string length [ info command kanji ] ] > 0 } { + if { [ string length [ info command __org_unknown ] ] == 0 } { + rename unknown __org_unknown + rename unknown_kanji unknown + } + } + # auto_load -- # Checks a collection of library directories to see if a procedure # is defined in one of them. If so, it sources the appropriate *************** *** 618,624 **** if {[info exist the_library] && [string compare $the_library {}]} { lappend dirs $the_library } else { ! # Do the canonical search # 1. From an environment variable, if it exists --- 644,654 ---- if {[info exist the_library] && [string compare $the_library {}]} { lappend dirs $the_library } else { ! if {[string compare kanji [info command kanji]] == 0} { ! if {[string match {*jp} $version] != 1} { ! append version jp ! } ! } # Do the canonical search # 1. From an environment variable, if it exists diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/cmdAH.test ./tests/cmdAH.test *** ../../tcl8.0.5/tests/cmdAH.test Thu Feb 4 04:12:27 1999 --- ./tests/cmdAH.test Fri Mar 12 00:02:28 1999 *************** *** 21,27 **** } {1 {wrong # args: should be "file option ?arg ...?"}} test cmdAH-1.2 {Tcl_FileObjCmd} { list [catch {file x} msg] $msg ! } {1 {bad option "x": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-1.3 {Tcl_FileObjCmd} { list [catch {file atime} msg] $msg } {1 {wrong # args: should be "file atime name ?arg ...?"}} --- 21,29 ---- } {1 {wrong # args: should be "file option ?arg ...?"}} test cmdAH-1.2 {Tcl_FileObjCmd} { list [catch {file x} msg] $msg ! } [ jp&orig \ ! {1 {bad option "x": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {bad option "x": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-1.3 {Tcl_FileObjCmd} { list [catch {file atime} msg] $msg } {1 {wrong # args: should be "file atime name ?arg ...?"}} *************** *** 1239,1263 **** test cmdAH-26.1 {error conditions} { list [catch {file gorp x} msg] $msg ! } {1 {bad option "gorp": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.2 {error conditions} { list [catch {file ex x} msg] $msg ! } {1 {ambiguous option "ex": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.3 {error conditions} { list [catch {file is x} msg] $msg ! } {1 {ambiguous option "is": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.4 {error conditions} { list [catch {file z x} msg] $msg ! } {1 {bad option "z": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.5 {error conditions} { list [catch {file read x} msg] $msg ! } {1 {ambiguous option "read": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.6 {error conditions} { list [catch {file s x} msg] $msg ! } {1 {ambiguous option "s": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.7 {error conditions} { list [catch {file t x} msg] $msg ! } {1 {ambiguous option "t": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} test cmdAH-26.8 {error conditions} { list [catch {file dirname ~woohgy} msg] $msg } {1 {user "woohgy" doesn't exist}} --- 1241,1279 ---- test cmdAH-26.1 {error conditions} { list [catch {file gorp x} msg] $msg ! } [ jp&orig \ ! {1 {bad option "gorp": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {bad option "gorp": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.2 {error conditions} { list [catch {file ex x} msg] $msg ! } [ jp&orig \ ! {1 {ambiguous option "ex": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {ambiguous option "ex": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.3 {error conditions} { list [catch {file is x} msg] $msg ! } [ jp&orig \ ! {1 {ambiguous option "is": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {ambiguous option "is": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.4 {error conditions} { list [catch {file z x} msg] $msg ! } [ jp&orig \ ! {1 {bad option "z": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {bad option "z": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.5 {error conditions} { list [catch {file read x} msg] $msg ! } [ jp&orig \ ! {1 {ambiguous option "read": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {ambiguous option "read": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.6 {error conditions} { list [catch {file s x} msg] $msg ! } [ jp&orig \ ! {1 {ambiguous option "s": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {ambiguous option "s": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.7 {error conditions} { list [catch {file t x} msg] $msg ! } [ jp&orig \ ! {1 {ambiguous option "t": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, kanjiCode, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} \ ! {1 {ambiguous option "t": must be atime, attributes, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}} ] test cmdAH-26.8 {error conditions} { list [catch {file dirname ~woohgy} msg] $msg } {1 {user "woohgy" doesn't exist}} diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/defs ./tests/defs *** ../../tcl8.0.5/tests/defs Fri Dec 4 13:18:20 1998 --- ./tests/defs Fri Mar 12 00:02:30 1999 *************** *** 365,370 **** --- 365,380 ---- puts stdout "---- Result should have been:" puts stdout "$answer" puts stdout "---- $name FAILED" + } + } + + # Japanized version of Tcl might cause some errors. + # Followings are to avoid such kind of non-essential errors. + proc jp&orig {jp orig} { + if { [ string length [ info commands kanji ] ] <= 0 } { + return $orig + } else { + return $jp } } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/fCmd.test ./tests/fCmd.test *** ../../tcl8.0.5/tests/fCmd.test Fri Dec 4 13:18:20 1998 --- ./tests/fCmd.test Fri Mar 12 00:02:34 1999 *************** *** 78,84 **** foreach file $x { if {[catch {file delete -force -- $file}]} { openup $file ! file delete -force -- $file } } } --- 78,88 ---- foreach file $x { if {[catch {file delete -force -- $file}]} { openup $file ! catch { file delete -force -- $file } ! catch { testchmod 755 $file } ! catch { exec chmod -R 755 $file } ! catch { exec chmod 755 $file } ! catch { exec rm -rf $file } } } } *************** *** 2105,2108 **** list [catch {eval file attributes foo.tmp [lrange $attrs 0 3]} msg] $msg [file delete -force -- foo.tmp] } {0 {} {}} ! cleanup --- 2109,2112 ---- list [catch {eval file attributes foo.tmp [lrange $attrs 0 3]} msg] $msg [file delete -force -- foo.tmp] } {0 {} {}} ! cleanup ~ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/ioCmd.test ./tests/ioCmd.test *** ../../tcl8.0.5/tests/ioCmd.test Tue Sep 15 03:40:11 1998 --- ./tests/ioCmd.test Fri Mar 12 00:02:41 1999 *************** *** 195,201 **** set x [list [catch {fconfigure $f1 froboz} msg] $msg] close $f1 set x ! } {1 {bad option "froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} test iocmd-8.5 {fconfigure command} { list [catch {fconfigure stdin -buffering froboz} msg] $msg } {1 {bad value for -buffering: must be one of full, line, or none}} --- 195,203 ---- set x [list [catch {fconfigure $f1 froboz} msg] $msg] close $f1 set x ! } [ jp&orig \ ! {1 {bad option "froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, -inputCode, -outputCode, or -translation}} \ ! {1 {bad option "froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} ] test iocmd-8.5 {fconfigure command} { list [catch {fconfigure stdin -buffering froboz} msg] $msg } {1 {bad value for -buffering: must be one of full, line, or none}} *************** *** 209,215 **** set x [fconfigure $f1] close $f1 set x ! } {-blocking 1 -buffering full -buffersize 4096 -eofchar {} -translation lf} test iocmd-8.8 {fconfigure command} { removeFile test1 set f1 [open test1 w] --- 211,219 ---- set x [fconfigure $f1] close $f1 set x ! } [ jp&orig \ ! {-blocking 1 -buffering full -buffersize 4096 -eofchar {} -inputCode ANY -outputCode ANY -translation lf} \ ! {-blocking 1 -buffering full -buffersize 4096 -eofchar {} -translation lf} ] test iocmd-8.8 {fconfigure command} { removeFile test1 set f1 [open test1 w] *************** *** 220,226 **** lappend x [fconfigure $f1] close $f1 set x ! } {line {-blocking 1 -buffering line -buffersize 3030 -eofchar {} -translation lf}} test iocmd-8.9 {fconfigure command} { removeFile test1 set f1 [open test1 w] --- 224,232 ---- lappend x [fconfigure $f1] close $f1 set x ! } [ jp&orig \ ! {line {-blocking 1 -buffering line -buffersize 3030 -eofchar {} -inputCode ANY -outputCode ANY -translation lf}} \ ! {line {-blocking 1 -buffering line -buffersize 3030 -eofchar {} -translation lf}} ] test iocmd-8.9 {fconfigure command} { removeFile test1 set f1 [open test1 w] *************** *** 229,247 **** set x [fconfigure $f1] close $f1 set x ! } {-blocking 1 -buffering none -buffersize 4040 -eofchar {} -translation lf} test iocmd-8.10 {fconfigure command} { list [catch {fconfigure a b} msg] $msg } {1 {can not find channel named "a"}} test iocmd-8.11 {fconfigure command} { list [catch {fconfigure stdout -froboz blarfo} msg] $msg ! } {1 {bad option "-froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} test iocmd-8.12 {fconfigure command} { list [catch {fconfigure stdout -b blarfo} msg] $msg ! } {1 {bad option "-b": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} test iocmd-8.13 {fconfigure command} { list [catch {fconfigure stdout -buffer blarfo} msg] $msg ! } {1 {bad option "-buffer": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} test iocmd-8.14 {fconfigure command} { fconfigure stdin -buffers } 4096 --- 235,261 ---- set x [fconfigure $f1] close $f1 set x ! } [ jp&orig \ ! {-blocking 1 -buffering none -buffersize 4040 -eofchar {} -inputCode ANY -outputCode ANY -translation lf} \ ! {-blocking 1 -buffering none -buffersize 4040 -eofchar {} -translation lf} ] test iocmd-8.10 {fconfigure command} { list [catch {fconfigure a b} msg] $msg } {1 {can not find channel named "a"}} test iocmd-8.11 {fconfigure command} { list [catch {fconfigure stdout -froboz blarfo} msg] $msg ! } [ jp&orig \ ! {1 {bad option "-froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, -inputCode, -outputCode, -translation, or -mode}} \ ! {1 {bad option "-froboz": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} ] test iocmd-8.12 {fconfigure command} { list [catch {fconfigure stdout -b blarfo} msg] $msg ! } [ jp&orig \ ! {1 {bad option "-b": should be one of -blocking, -buffering, -buffersize, -eofchar, -inputCode, -outputCode, -translation, or -mode}} \ ! {1 {bad option "-b": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} ] test iocmd-8.13 {fconfigure command} { list [catch {fconfigure stdout -buffer blarfo} msg] $msg ! } [ jp&orig \ ! {1 {bad option "-buffer": should be one of -blocking, -buffering, -buffersize, -eofchar, -inputCode, -outputCode, -translation, or -mode}} \ ! {1 {bad option "-buffer": should be one of -blocking, -buffering, -buffersize, -eofchar, or -translation}} ] test iocmd-8.14 {fconfigure command} { fconfigure stdin -buffers } 4096 *************** *** 267,273 **** set r [list [catch {fconfigure $cli -blah} msg] $msg]; iocmdSSHTDWN set r; ! } {1 {bad option "-blah": should be one of -blocking, -buffering, -buffersize, -eofchar, -translation, -peername, or -sockname}} test iocmd-8.16 {fconfigure command / tcp channel} {socket} { iocmdSSETUP set r [expr [lindex [fconfigure $cli -peername] 2]==$port]; --- 281,289 ---- set r [list [catch {fconfigure $cli -blah} msg] $msg]; iocmdSSHTDWN set r; ! } [ jp&orig \ ! {1 {bad option "-blah": should be one of -blocking, -buffering, -buffersize, -eofchar, -inputCode, -outputCode, -translation, -peername, or -sockname}} \ ! {1 {bad option "-blah": should be one of -blocking, -buffering, -buffersize, -eofchar, -translation, -peername, or -sockname}} ] test iocmd-8.16 {fconfigure command / tcp channel} {socket} { iocmdSSETUP set r [expr [lindex [fconfigure $cli -peername] 2]==$port]; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/kana.sjis ./tests/kana.sjis *** ../../tcl8.0.5/tests/kana.sjis Thu Jan 1 09:00:00 1970 --- ./tests/kana.sjis Fri Mar 12 00:02:42 1999 *************** *** 0 **** --- 1 ---- + 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/kanji.euc ./tests/kanji.euc *** ../../tcl8.0.5/tests/kanji.euc Thu Jan 1 09:00:00 1970 --- ./tests/kanji.euc Wed Jun 25 08:31:18 1997 *************** *** 0 **** --- 1 ---- + 、「、、、ヲ、ィ、ェ diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/kanji.jis ./tests/kanji.jis *** ../../tcl8.0.5/tests/kanji.jis Thu Jan 1 09:00:00 1970 --- ./tests/kanji.jis Wed Jun 25 08:31:19 1997 *************** *** 0 **** --- 1 ---- + $@$"$$$&$($*(J diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/kanji.sjis ./tests/kanji.sjis *** ../../tcl8.0.5/tests/kanji.sjis Thu Jan 1 09:00:00 1970 --- ./tests/kanji.sjis Wed Jun 25 08:31:19 1997 *************** *** 0 **** --- 1 ---- + あいうえお diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/kanji.test ./tests/kanji.test *** ../../tcl8.0.5/tests/kanji.test Thu Jan 1 09:00:00 1970 --- ./tests/kanji.test Fri Mar 12 00:02:42 1999 *************** *** 0 **** --- 1,969 ---- + # Commands covered: kanji + # + # This file contains a collection of tests for one or more of the Tcl + # built-in commands. Sourcing this file into Tcl runs the tests and + # generates output for errors. No output means no errors were found. + # + # Copyright (c) 1993, 1998-1999 Software Research Associates, Inc. + # Permission to use, copy, modify, and distribute this software and its + # documentation for any purpose and without fee is hereby granted, provided + # that the above copyright notice appear in all copies and that both that + # copyright notice and this permission notice appear in supporting + # documentation, and that the name of Software Research Associates not be + # used in advertising or publicity pertaining to distribution of the + # software without specific, written prior permission. Software Research + # Associates makes no representations about the suitability of this software + # for any purpose. It is provided "as is" without express or implied + # warranty. + # + # $Header: /home/m-hirano/cvsroot/tcltk/tcl8.0jp/tests/kanji.test,v 1.14 1999/03/11 15:02:42 m-hirano Exp $ + + if {[string compare test [info procs test]] == 1} then {source defs} + + proc DeleteFile { file } { + catch {exec rm -f $file} + catch {file delete -force $file} + } + + proc winRead {file} { + set f [open $file r] + fconfigure $f -inputCode ANY -translation binary + while {![eof $f]} { + append data [read -nonewline $f] + } + close $f + set data [kanji string trimright $data] + return $data + } + + if [catch {set env(LANG)} lang] then { + set lang "" + } else { + unset env(LANG) + } + + set isWin 0 + if {[string match Windows* $tcl_platform(os)] == 1} { + set isWin 1 + } + set oPrefSjis [ kanji preferSjis ] + kanji preferSjis no + set filecode [ kanji code $B$3$N%U%!%$%k(B ] + kanji convertWhenCompile yes + + DeleteFile kanji.any + set f [open kanji.any w] + puts -nonewline $f "aiueo" + close $f + + if {$isWin == 0} { + set kanji(JIS) [exec cat kanji.jis] + set kanji(SJIS) [exec cat kanji.sjis] + set kanji(EUC) [exec cat kanji.euc] + set kanji(ANY) [exec cat kanji.any] + set kana [exec cat kana.sjis] + } else { + set kanji(JIS) [winRead kanji.jis] + set kanji(SJIS) [winRead kanji.sjis] + set kanji(EUC) [winRead kanji.euc] + set kanji(ANY) [winRead kanji.any] + set kana [winRead kana.sjis] + } + + # file kanjiCode + + test kanji1.1 {file kanjiCode} {file kanjiCode kanji.jis} JIS + test kanji1.2 {file kanjiCode} {file kanjiCode kanji.sjis} SJIS + test kanji1.3 {file kanjiCode} {file kanjiCode kanji.euc} EUC + test kanji1.4 {file kanjiCode} {file kanjiCode kanji.any} ANY + + set oSjis [kanji preferSjis] + kanji preferSjis yes + test kanji1.5 {file kanjiCode (hankaku kana)} {file kanjiCode kana.sjis} SJIS + kanji preferSjis no + test kanji1.6 {file kanjiCode (hankaku kana)} {file kanjiCode kana.sjis} EUC + kanji preferSjis $oSjis + + # kanji code + + test kanji2.1 {kanji code: error message} { + list [catch {kanji code} msg] $msg + } {1 {wrong # args: should be "kanji code string"}} + test kanji2.2 {kanji code} {kanji code $kanji(JIS)} JIS + test kanji2.3 {kanji code} {kanji code $kanji(SJIS)} SJIS + test kanji2.4 {kanji code} {kanji code $kanji(EUC)} EUC + test kanji2.5 {kanji code} {kanji code $kanji(ANY)} ANY + + set oSjis [kanji preferSjis] + kanji preferSjis yes + test kanji2.6 {kanji code (hankaku kana)} {kanji code $kana} SJIS + kanji preferSjis no + test kanji2.7 {kanji code (hankaku kana)} {kanji code $kana} EUC + kanji preferSjis $oSjis + + # kanji internalCode + + test kanji3.1 {kanji internalCode: default value} { + catch {kanji internalCode} default + } 0 + test kanji3.2 {kanji internalCode: set internalCode to JIS} { + list [catch {kanji internalCode JIS} msg] $msg [kanji internalCode] + } {0 JIS JIS} + test kanji3.3 {kanji internalCode: set internalCode to SJIS} { + list [catch {kanji internalCode SJIS} msg] $msg [kanji internalCode] + } {0 SJIS SJIS} + test kanji3.4 {kanji internalCode: set internalCode to EUC} { + list [catch {kanji internalCode EUC} msg] $msg [kanji internalCode] + } {0 EUC EUC} + test kanji3.5 {kanji internalCode: set internalCode to ANY} { + list [catch {kanji internalCode ANY} msg] $msg [kanji internalCode] + } {0 ANY ANY} + test kanji3.6 {kanji internalCode: set internalCode to KANJI, makes error} { + kanji internalCode ANY + list [catch {kanji internalCode KANJI} msg] $msg [kanji internalCode] + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY} ANY} + test kanji3.7 {kanji internalCode JIS} { + catch {unset str} + kanji internalCode JIS + eval "set str(JIS) $kanji(JIS)" + eval "set str(SJIS) $kanji(SJIS)" + eval "set str(EUC) $kanji(EUC)" + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {JIS JIS JIS} + test kanji3.8 {kanji internalCode SJIS} { + catch {unset str} + kanji internalCode SJIS + eval "set str(JIS) $kanji(JIS)" + eval "set str(SJIS) $kanji(SJIS)" + eval "set str(EUC) $kanji(EUC)" + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {SJIS SJIS SJIS} + test kanji3.9 {kanji internalCode EUC} { + catch {unset str} + kanji internalCode EUC + eval "set str(JIS) $kanji(JIS)" + eval "set str(SJIS) $kanji(SJIS)" + eval "set str(EUC) $kanji(EUC)" + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {EUC EUC EUC} + test kanji3.10 {kanji internalCode ANY} { + catch {unset str} + kanji internalCode ANY + eval "set str(JIS) $kanji(JIS)" + eval "set str(SJIS) $kanji(SJIS)" + eval "set str(EUC) $kanji(EUC)" + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {JIS SJIS EUC} + + kanji internalCode $default + + + # kanji inputCode + + test kanji4.1 {kanji inputCode: default value} { + catch {kanji inputCode stdin} default + } 0 + test kanji4.2 {kanji inputCode: error message} { + list [catch {kanji inputCode stdout} msg] $msg + } {1 {channel "stdout" wasn't opened for reading}} + test kanji4.3 {kanji inputCode: set inputCode to JIS} { + list [catch {kanji inputCode stdin JIS} msg] $msg [kanji inputCode stdin] + } {0 JIS JIS} + test kanji4.4 {kanji inputCode: set inputCode to SJIS} { + list [catch {kanji inputCode stdin SJIS} msg] $msg [kanji inputCode stdin] + } {0 SJIS SJIS} + test kanji4.5 {kanji inputCode: set inputCode to EUC} { + list [catch {kanji inputCode stdin EUC} msg] $msg [kanji inputCode stdin] + } {0 EUC EUC} + test kanji4.6 {kanji inputCode: set inputCode to ANY} { + list [catch {kanji inputCode stdin ANY} msg] $msg [kanji inputCode stdin] + } {0 ANY ANY} + test kanji4.7 {kanji inputCode: set inputCode to KANJI, makes error} { + kanji inputCode stdin ANY + list [catch {kanji inputCode stdin KANJI} msg] $msg [kanji inputCode stdin] + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY} ANY} + test kanji4.8 {kanji inputCode} { + catch {unset str} + set fd [open kanji.jis] + kanji inputCode $fd JIS + set str(JIS) [gets $fd] + close $fd + set fd [open kanji.sjis] + kanji inputCode $fd JIS + set str(SJIS) [gets $fd] + close $fd + set fd [open kanji.euc] + kanji inputCode $fd JIS + set str(EUC) [gets $fd] + close $fd + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {JIS JIS JIS} + test kanji4.9 {kanji inputCode} { + catch {unset str} + set fd [open kanji.jis] + kanji inputCode $fd SJIS + set str(JIS) [gets $fd] + close $fd + set fd [open kanji.sjis] + kanji inputCode $fd SJIS + set str(SJIS) [gets $fd] + close $fd + set fd [open kanji.euc] + kanji inputCode $fd SJIS + set str(EUC) [gets $fd] + close $fd + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {SJIS SJIS SJIS} + test kanji4.10 {kanji inputCode} { + catch {unset str} + set fd [open kanji.jis] + kanji inputCode $fd EUC + set str(JIS) [gets $fd] + close $fd + set fd [open kanji.sjis] + kanji inputCode $fd EUC + set str(SJIS) [gets $fd] + close $fd + set fd [open kanji.euc] + kanji inputCode $fd EUC + set str(EUC) [gets $fd] + close $fd + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {EUC EUC EUC} + test kanji4.11 {kanji inputCode} { + catch {unset str} + set fd [open kanji.jis] + kanji inputCode $fd ANY + set str(JIS) [gets $fd] + close $fd + set fd [open kanji.sjis] + kanji inputCode $fd ANY + set str(SJIS) [gets $fd] + close $fd + set fd [open kanji.euc] + kanji inputCode $fd ANY + set str(EUC) [gets $fd] + close $fd + list [kanji code $str(JIS)] [kanji code $str(SJIS)] [kanji code $str(EUC)] + } {JIS SJIS EUC} + + kanji inputCode stdin $default + + + # kanji outputCode + + test kanji5.1 {kanji outputCode: default value} { + catch {kanji outputCode stdout} default + } 0 + test kanji5.2 {kanji outputCode: error message} { + list [catch {kanji outputCode stdin} msg] $msg + } {1 {channel "stdin" wasn't opened for writing}} + test kanji5.3 {kanji outputCode: set outputCode to JIS} { + list [catch {kanji outputCode stdout JIS} msg] $msg [kanji outputCode stdout] + } {0 JIS JIS} + test kanji5.4 {kanji outputCode: set outputCode to SJIS} { + list [catch {kanji outputCode stdout SJIS} msg] $msg [kanji outputCode stdout] + } {0 SJIS SJIS} + test kanji5.5 {kanji outputCode: set outputCode to EUC} { + list [catch {kanji outputCode stdout EUC} msg] $msg [kanji outputCode stdout] + } {0 EUC EUC} + test kanji5.6 {kanji outputCode: set outputCode to ANY} { + list [catch {kanji outputCode stdout ANY} msg] $msg [kanji outputCode stdout] + } {0 ANY ANY} + test kanji5.7 {kanji outputCode: set outputCode to KANJI, makes error} { + kanji outputCode stdout ANY + list [catch {kanji outputCode stdout KANJI} msg] $msg [kanji outputCode stdout] + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY} ANY} + test kanji5.8 {kanji outputCode} { + DeleteFile tmp.jis + DeleteFile tmp.sjis + DeleteFile tmp.euc + set fd [open tmp.jis w] + kanji outputCode $fd JIS + puts $fd $kanji(JIS) + close $fd + set fd [open tmp.sjis w] + kanji outputCode $fd JIS + puts $fd $kanji(SJIS) + close $fd + set fd [open tmp.euc w] + kanji outputCode $fd JIS + puts $fd $kanji(EUC) + close $fd + list [file kanjiCode tmp.jis] [file kanjiCode tmp.sjis] [file kanjiCode tmp.euc] + } {JIS JIS JIS} + test kanji5.9 {kanji outputCode} { + DeleteFile tmp.jis + DeleteFile tmp.sjis + DeleteFile tmp.euc + set fd [open tmp.jis w] + kanji outputCode $fd SJIS + puts $fd $kanji(JIS) + close $fd + set fd [open tmp.sjis w] + kanji outputCode $fd SJIS + puts $fd $kanji(SJIS) + close $fd + set fd [open tmp.euc w] + kanji outputCode $fd SJIS + puts $fd $kanji(EUC) + close $fd + list [file kanjiCode tmp.jis] [file kanjiCode tmp.sjis] [file kanjiCode tmp.euc] + } {SJIS SJIS SJIS} + test kanji5.10 {kanji outputCode} { + DeleteFile tmp.jis + DeleteFile tmp.sjis + DeleteFile tmp.euc + set fd [open tmp.jis w] + kanji outputCode $fd EUC + puts $fd $kanji(JIS) + close $fd + set fd [open tmp.sjis w] + kanji outputCode $fd EUC + puts $fd $kanji(SJIS) + close $fd + set fd [open tmp.euc w] + kanji outputCode $fd EUC + puts $fd $kanji(EUC) + close $fd + list [file kanjiCode tmp.jis] [file kanjiCode tmp.sjis] [file kanjiCode tmp.euc] + } {EUC EUC EUC} + test kanji5.11 {kanji outputCode} { + DeleteFile tmp.jis + DeleteFile tmp.sjis + DeleteFile tmp.euc + set fd [open tmp.jis w] + kanji outputCode $fd ANY + puts $fd $kanji(JIS) + close $fd + set fd [open tmp.sjis w] + kanji outputCode $fd ANY + puts $fd $kanji(SJIS) + close $fd + set fd [open tmp.euc w] + kanji outputCode $fd ANY + puts $fd $kanji(EUC) + close $fd + list [file kanjiCode tmp.jis] [file kanjiCode tmp.sjis] [file kanjiCode tmp.euc] + } {JIS SJIS EUC} + + DeleteFile tmp.jis + DeleteFile tmp.sjis + DeleteFile tmp.euc + kanji outputCode stdout $default + + + # kanji defaultInputCode + + test kanji6.1 {kanji defaultInputCode: default value} { + catch {kanji defaultInputCode} default + } 0 + test kanji6.2 {kanji defaultInputCode: set defaultInputCode to JIS} { + list [catch {kanji defaultInputCode JIS} msg] $msg [kanji defaultInputCode] + } {0 JIS JIS} + test kanji6.3 {kanji defaultInputCode: set defaultInputCode to SJIS} { + list [catch {kanji defaultInputCode SJIS} msg] $msg [kanji defaultInputCode] + } {0 SJIS SJIS} + test kanji6.4 {kanji defaultInputCode: set defaultInputCode to EUC} { + list [catch {kanji defaultInputCode EUC} msg] $msg [kanji defaultInputCode] + } {0 EUC EUC} + test kanji6.5 {kanji defaultInputCode: set defaultInputCode to ANY} { + list [catch {kanji defaultInputCode ANY} msg] $msg [kanji defaultInputCode] + } {0 ANY ANY} + test kanji6.6 {kanji defaultInputCode: set defaultInputCode to KANJI, makes error} { + kanji defaultInputCode ANY + list [catch {kanji defaultInputCode KANJI} msg] $msg [kanji defaultInputCode] + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY} ANY} + test kanji6.7 {kanji defaultInputCode} { + catch {unset code} + kanji defaultInputCode JIS + set fd [open kanji.test] + set code(JIS) [kanji inputCode $fd] + close $fd + kanji defaultInputCode SJIS + set fd [open kanji.test] + set code(SJIS) [kanji inputCode $fd] + close $fd + kanji defaultInputCode EUC + set fd [open kanji.test] + set code(EUC) [kanji inputCode $fd] + close $fd + kanji defaultInputCode ANY + set fd [open kanji.test] + set code(ANY) [kanji inputCode $fd] + close $fd + list $code(JIS) $code(SJIS) $code(EUC) $code(ANY) + } {JIS SJIS EUC ANY} + + kanji defaultInputCode $default + + + # kanji defaultOutputCode + + test kanji7.1 {kanji defaultOutputCode: default value} { + catch {kanji defaultOutputCode} default + } 0 + test kanji7.2 {kanji defaultOutputCode: set defaultOutputCode to JIS} { + list [catch {kanji defaultOutputCode JIS} msg] $msg [kanji defaultOutputCode] + } {0 JIS JIS} + test kanji7.3 {kanji defaultOutputCode: set defaultOutputCode to SJIS} { + list [catch {kanji defaultOutputCode SJIS} msg] $msg [kanji defaultOutputCode] + } {0 SJIS SJIS} + test kanji7.4 {kanji defaultOutputCode: set defaultOutputCode to EUC} { + list [catch {kanji defaultOutputCode EUC} msg] $msg [kanji defaultOutputCode] + } {0 EUC EUC} + test kanji7.5 {kanji defaultOutputCode: set defaultOutputCode to ANY} { + list [catch {kanji defaultOutputCode ANY} msg] $msg [kanji defaultOutputCode] + } {0 ANY ANY} + test kanji7.6 {kanji defaultOutputCode: set defaultOutputCode to KANJI, makes error} { + kanji defaultOutputCode ANY + list [catch {kanji defaultOutputCode KANJI} msg] $msg [kanji defaultOutputCode] + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY} ANY} + test kanji7.7 {kanji defaultOutputCode} { + catch {unset code} + kanji defaultOutputCode JIS + set fd [open kanji.tmp w] + set code(JIS) [kanji outputCode $fd] + close $fd + kanji defaultOutputCode SJIS + set fd [open kanji.tmp w] + set code(SJIS) [kanji outputCode $fd] + close $fd + kanji defaultOutputCode EUC + set fd [open kanji.tmp w] + set code(EUC) [kanji outputCode $fd] + close $fd + kanji defaultOutputCode ANY + set fd [open kanji.tmp w] + set code(ANY) [kanji outputCode $fd] + close $fd + list $code(JIS) $code(SJIS) $code(EUC) $code(ANY) + } {JIS SJIS EUC ANY} + + DeleteFile kanji.tmp + kanji defaultOutputCode $default + + + # kanji lsearch + + set l [list $kanji(JIS) $kanji(SJIS) $kanji(EUC)] + set default [kanji internalCode] + + test kanji8.1.1 {kanji lsearch (or klsearch): error message} { + list [catch {kanji lsearch} msg] $msg + } {1 {wrong # args: should be "kanji lsearch list pattern"}} + test kanji8.1.2 {kanji lsearch (or klsearch): error message} { + list [catch {klsearch} msg] $msg + } {1 {wrong # args: should be "klsearch list pattern"}} + test kanji8.2.1 {kanji lsearch (or klsearch)} { + kanji lsearch $l $kanji(JIS) + } 0 + test kanji8.2.2 {kanji lsearch (or klsearch)} { + kanji lsearch $l $kanji(SJIS) + } 1 + test kanji8.2.3 {kanji lsearch (or klsearch)} { + kanji lsearch $l $kanji(EUC) + } 2 + + kanji internalCode ANY + test kanji8.3.1 {kanji lsearch (or klsearch)} { + kanji internalCode JIS + eval {kanji lsearch $l $B$"(B*} + } 0 + + test kanji8.3.2 {kanji lsearch (or klsearch)} { + kanji internalCode SJIS + eval {kanji lsearch $l *$B$*(B} + } 1 + + test kanji8.3.3 {kanji lsearch (or klsearch)} { + kanji internalCode EUC + eval {kanji lsearch $l *$B$&(B*} + } 2 + + kanji internalCode $default + + + # kanji lsort + set l [list $kanji(JIS) $kanji(SJIS) $kanji(EUC) $kanji(ANY)] + + kanji internalCode EUC + test kanji9.1 {kanji lsort (or klsort): error message} { + list [catch {kanji lsort} msg] $msg + } {1 {wrong # args: should be "kanji lsort list"}} + test kanji9.2 {kanji lsort (or klsort): error message} { + list [catch {klsort} msg] $msg + } {1 {wrong # args: should be "klsort list"}} + test kanji9.3 {kanji lsort (or klsort)} { + eval {kanji lsort {$B$s(B $B$"$$(B 1 $B$"$"(B a}} + } [kanji conversion $default EUC {1 a $B$"$"(B $B$"$$(B $B$s(B}] + test kanji9.4 {kanji lsort (or klsort)} { + kanji lsort $l + } [list $kanji(JIS) $kanji(ANY) $kanji(SJIS) $kanji(EUC)] + kanji internalCode $default + + # kanji split + + set default [kanji internalCode] + + test kanji10.1.1 {kanji split (or ksplit): error message} { + list [catch {kanji split} msg] $msg + } {1 {wrong # args: should be "kanji split string ?splitChars?"}} + test kanji10.1.2 {kanji split (or ksplit): error message} { + list [catch {ksplit} msg] $msg + } {1 {wrong # args: should be "ksplit string ?splitChars?"}} + + test kanji10.2.1 {kanji split (or ksplit)} { + kanji internalCode JIS + eval {kanji split "$B$"(B\n $B$$(B\t\r $B$&(B\n "} + } [ kanji conversion $filecode JIS "$B$"(B {} $B$$(B {} {} $B$&(B {} {}" ] + + test kanji10.2.2 {kanji split (or ksplit)} { + kanji internalCode SJIS + eval {kanji split "$B$"(B\n $B$$(B\t\r $B$&(B\n "} + } [ kanji conversion $filecode SJIS "$B$"(B {} $B$$(B {} {} $B$&(B {} {}" ] + + test kanji10.2.3 {kanji split (or ksplit)} { + kanji internalCode EUC + eval {kanji split "$B$"(B\n $B$$(B\t\r $B$&(B\n "} + } [ kanji conversion $filecode EUC "$B$"(B {} $B$$(B {} {} $B$&(B {} {}" ] + + test kanji10.3.1 {kanji split (or ksplit)} { + kanji internalCode JIS + eval {kanji split "$B$"(Bxyz$B$$(Bz$B$&(B" xyz} + } [ kanji conversion $filecode JIS "$B$"(B {} {} $B$$(B $B$&(B" ] + + test kanji10.3.2 {kanji split (or ksplit)} { + kanji internalCode SJIS + eval {kanji split "$B$"(Bxyz$B$$(Bz$B$&(B" xyz} + } [ kanji conversion $filecode SJIS "$B$"(B {} {} $B$$(B $B$&(B" ] + + test kanji10.3.3 {kanji split (or ksplit)} { + kanji internalCode EUC + eval {kanji split "$B$"(Bxyz$B$$(Bz$B$&(B" xyz} + } [ kanji conversion $filecode EUC "$B$"(B {} {} $B$$(B $B$&(B" ] + + kanji internalCode $default + + test kanji10.4.1 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" a + } "{} $B$"(Bb$B$$(Bc" + test kanji10.4.2 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" b + } "a$B$"(B $B$$(Bc" + test kanji10.4.3 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" c + } "a$B$"(Bb$B$$(B {}" + test kanji10.4.4 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" c + } "a$B$"(Bb$B$$(B {}" + test kanji10.4.5 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" $B$"(B + } "a b$B$$(Bc" + test kanji10.4.6 {kanji split (or ksplit)} { + kanji split "a$B$"(Bb$B$$(Bc" $B$"$$(B + } "a b c" + + kanji internalCode $default + + # kanji string + + set default [kanji internalCode] + + test kanji11.1.1 {kanji string (or kstring): error message} { + list [catch {kanji string} msg] $msg + } {1 {wrong # args: should be "kanji string option arg ?arg ...?"}} + test kanji11.1.2 {kanji string (or kstring): error message} { + list [catch {kstring} msg] $msg + } {1 {wrong # args: should be "kstring option arg ?arg ...?"}} + test kanji11.1.3 {kanji string (or kstring): error message} { + list [catch {kanji string op} msg] $msg + } {1 {bad option "op": should be compare, first, index, last, length, match, range, tolower, toupper, trim, trimleft, or trimright}} + test kanji11.1.4 {kanji string (or kstring): error message} { + list [catch {kstring op} msg] $msg + } {1 {bad option "op": should be compare, first, index, last, length, match, range, tolower, toupper, trim, trimleft, or trimright}} + + test kanji11.2.1 {kanji string compare: error message} { + list [catch {kstring compare} msg] $msg + } {1 {wrong # args: should be "kstring compare string1 string2"}} + test kanji11.2.2 {kanji string compare} { + kstring compare $B$"$$$&$($*(B $B$"$$$&$($s(B + } -1 + test kanji11.2.3 {kanji string compare} { + kstring compare $B$"$$$&$($s(B $B$"$$$&$($*(B + } 1 + test kanji11.2.4 {kanji string compare} { + kstring compare $B$"$$$&$($*(B $B$"$$$&$($*(B + } 0 + + if {[kanji internalCode] != "ANY"} { + test kanji11.3.1 {kanji string first: error message} { + list [catch {kstring first} msg] $msg + } {1 {wrong # args: should be "kstring first string1 string2"}} + test kanji11.3.2 {kanji string first} { + kstring first $B$&(B a$B$"(Bb$B$$(Bc$B$&(Bd$B$((Be$B$*(Bf + } 5 + test kanji11.3.3 {kanji string first} { + kstring first c a$B$"(Bb$B$$(Bc$B$&(Bd$B$((Be$B$*(Bf + } 4 + test kanji11.3.4 {kanji string first} { + kstring first $B$$(Bc$B$&(B a$B$"(Bb$B$$(Bc$B$&(Bd$B$((Be$B$*(Bf + } 3 + } + + if {[kanji internalCode] != "ANY"} { + test kanji11.4.1 {kanji string index: error message} { + list [catch {kstring index} msg] $msg + } {1 {wrong # args: should be "kstring index string charIndex"}} + test kanji11.4.2 {kanji string index: error message} { + list [catch {kstring index abc XXX} msg] $msg + } {1 {expected integer but got "XXX"}} + test kanji11.4.3 {kanji string index} { + kstring index $B$"$$$&$($*(B 0 + } "$B$"(B" + test kanji11.4.4 {kanji string index} { + kstring index $B$"$$$&$($*(B 4 + } "$B$*(B" + test kanji11.4.5 {kanji string index} { + kstring index $B$"$$$&$($*(B 5 + } {} + test kanji11.4.6 {kanji string index} { + kstring index $B$"$$$&$($*(B -1 + } {} + } + + if {[kanji internalCode] != "ANY"} { + test kanji11.5.1 {kanji string last: error message} { + list [catch {kstring last} msg] $msg + } {1 {wrong # args: should be "kstring last string1 string2"}} + test kanji11.5.2 {kanji string last} { + kstring last $B$"(B $B$"$"$"$"$"(B + } 4 + test kanji11.5.3 {kanji string last} { + kstring last $B$"$"(B $B$"$"$"$"$"(B + } 3 + test kanji11.5.4 {kanji string last} { + kstring last $B$"$"$"$"$"(B $B$"$"$"$"$"(B + } 0 + test kanji11.5.5 {kanji string last} { + kstring last $B$"$"$"$"$"$"(B $B$"$"$"$"$"(B + } -1 + } + + if {[kanji internalCode] != "ANY"} { + test kanji11.6.1 {kanji string length: error message} { + list [catch {kstring length} msg] $msg + } {1 {wrong # args: should be "kstring length string"}} + test kanji11.6.2 {kanji string length} { + kstring length $B$"$$$&$($*(B + } 5 + test kanji11.6.3 {kanji string length} { + kstring length a$B$"(Bb$B$$(Bc$B$&(Bd + } 7 + } + + if {[kanji internalCode] != "ANY"} { + test kanji11.7.1 {kanji string match: error message} { + list [catch {kstring match} msg] $msg + } {1 {wrong # args: should be "kstring match pattern string"}} + test kanji11.7.2 {kanji string match} { + kstring match $B$"$$$&$($*(B $B$"$$$&$($*(B + } 1 + test kanji11.7.3 {kanji string match} { + kstring match $B$"$$$&$($*(B $B$"$$$&$($s(B + } 0 + test kanji11.7.4 {kanji string match} { + kstring match $B$"(B*$B$*(B $B$"$$$&$($*(B + } 1 + test kanji11.7.5 {kanji string match} { + kstring match $B$"(B**$B$*(B $B$"$$$&$($*(B + } 1 + test kanji11.7.6 {kanji string match} { + kstring match $B$"(B* $B$"$$$&$($*(B + } 1 + test kanji11.7.7 {kanji string match} { + kstring match *$B$*(B $B$"$$$&$($*(B + } 1 + test kanji11.7.8 {kanji string match} { + kstring match $B$"(B???$B$*(B $B$"$$$&$($*(B + } 1 + test kanji11.7.9 {kanji string match} { + kstring match $B$"(B??$B$*(B $B$"$$$&$($*(B + } 0 + test kanji11.7.10 {kanji string match} { + kstring match $B$"(B????$B$*(B $B$"$$$&$($*(B + } 0 + test kanji11.7.11 {kanji string match} { + kstring match $B$"(B????$B$*(B $B$"$$$&$($*(B + } 0 + test kanji11.7.12 {kanji string match} { + kstring match "\[$B$"$$$&(B\]\[$B$"$$$&(B\]\[$B$"$$$&(B\]$B$($*(B" $B$"$$$&$($*(B + } 1 + test kanji11.7.13 {kanji string match} { + kstring match "\[$B$"(B-$B$&(B\]\[$B$"(B-$B$&(B\]\[$B$"(B-$B$&(B\]$B$($*(B" $B$"$$$&$($*(B + } 1 + test kanji11.7.14 {kanji string match} { + kstring match "$B$"(B\[$B$$(B-$B$((B\]*$B$*(B" $B$"$$$&$($*(B + } 1 + } + + if {[kanji internalCode] != "ANY"} { + test kanji11.8.1 {kanji string range: error message} { + list [catch {kstring range} msg] $msg + } {1 {wrong # args: should be "kstring range string first last"}} + test kanji11.8.2 {kanji string range: error message} { + list [catch {kstring range abc abc 1} msg] $msg + } {1 {expected integer but got "abc"}} + test kanji11.8.3 {kanji string range: error message} { + list [catch {kstring range abc 1 eof} msg] $msg + } {1 {expected integer or "end" but got "eof"}} + test kanji11.8.4 {kanji string range} { + kstring range $B$"$$$&$($*(B 1 3 + } "$B$$$&$((B" + test kanji11.8.5 {kanji string range} { + kstring range $B$"$$$&$($*(B 2 1000 + } "$B$&$($*(B" + test kanji11.8.6 {kanji string range} { + kstring range $B$"$$$&$($*(B 4 end + } "$B$*(B" + test kanji11.8.7 {kanji string range} { + kstring range $B$"$$$&$($*(B 4 3 + } {} + test kanji11.8.8 {kanji string range} { + kstring range $B$"$$$&$($*(B -1 2 + } "$B$"$$$&(B" + test kanji11.8.9 {kanji string range} { + kstring range $B$"$$$&$($*(B -3 -2 + } {} + test kanji11.8.10 {kanji string range} { + kstring range $B$"$$$&$($*(B 1000 1010 + } {} + test kanji11.8.11 {kanji string range} { + kstring range $B$"$$$&$($*(B -100 end + } "$B$"$$$&$($*(B" + } + + test kanji11.9.1 {kanji string trim: error message} { + list [catch {kstring trim} msg] $msg + } {1 {wrong # args: should be "kstring trim string ?chars?"}} + test kanji11.9.2 {kanji string trim} { + kstring trim " $B#0#1#2(B " + } "$B#0#1#2(B" + test kanji11.9.3 {kanji string trim} { + kstring trim "\t\n$B#0#1#2(B\t\n\r\n" + } "$B#0#1#2(B" + test kanji11.9.4 {kanji string trim} { + kstring trim " $B#0(B $B#1(B $B#2(B " + } "$B#0(B $B#1(B $B#2(B" + test kanji11.9.5 {kanji string trim} { + kstring trim "XXYYZZ0$B#0#1#2(B $B$"(BXXYYZZ" XYZ$B$"(B + } "0$B#0#1#2(B " + + test kanji11.9.1 {kanji string trimleft: error message} { + list [catch {kstring trimleft} msg] $msg + } {1 {wrong # args: should be "kstring trimleft string ?chars?"}} + test kanji11.9.2 {kanji string trimleft} { + kstring trimleft " $B#0#1#2(B " + } "$B#0#1#2(B " + + test kanji11.10.1 {kanji string trimright: error message} { + list [catch {kstring trimright} msg] $msg + } {1 {wrong # args: should be "kstring trimright string ?chars?"}} + test kanji11.10.2 {kanji string trimright} { + kstring trimright " $B#0#1#2(B " + } " $B#0#1#2(B" + + test kanji11.11.1 {kanji string tolower: error message} { + list [catch {kstring tolower} msg] $msg + } {1 {wrong # args: should be "kstring tolower string"}} + test kanji11.11.2 {kanji string tolower} { + kstring tolower "ABCDeF" + } "abcdef" + test kanji11.11.2 {kanji string tolower} { + kstring tolower "ABC $B$"$$$&(B XyZ" + } "abc $B$"$$$&(B xyz" + + test kanji11.12.1 {kanji string toupper: error message} { + list [catch {kstring toupper} msg] $msg + } {1 {wrong # args: should be "kstring toupper string"}} + test kanji11.12.2 {kanji string toupper} { + kstring toupper "abcDef" + } "ABCDEF" + test kanji11.12.2 {kanji string toupper} { + kstring toupper "abc $B$"$$$&(B xYZ" + } "ABC $B$"$$$&(B XYZ" + + + # kanji conversion + + test kanji12.1 {kanji conversion: error message} { + list [catch {kanji conversion} msg] $msg + } {1 {wrong # args: should be "kanji conversion fromCode toCode string"}} + test kanji12.2 {kanji conversion: error message} { + list [catch {kanji conversion KANJI ANY abc} msg] $msg + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY}} + test kanji12.3 {kanji conversion: error message} { + list [catch {kanji conversion ANY KANJI abc} msg] $msg + } {1 {bad kanjiCode "KANJI": should be JIS, SJIS, EUC, or ANY}} + test kanji12.4 {kanji conversion JIS} { + kanji code [kanji conversion JIS JIS $kanji(JIS)] + } JIS + test kanji12.5 {kanji conversion JIS} { + kanji code [kanji conversion JIS SJIS $kanji(JIS)] + } SJIS + test kanji12.6 {kanji conversion JIS} { + kanji code [kanji conversion JIS EUC $kanji(JIS)] + } EUC + test kanji12.7 {kanji conversion SJIS} { + kanji code [kanji conversion SJIS JIS $kanji(SJIS)] + } JIS + test kanji12.8 {kanji conversion SJIS} { + kanji code [kanji conversion SJIS SJIS $kanji(SJIS)] + } SJIS + test kanji12.9 {kanji conversion SJIS} { + kanji code [kanji conversion SJIS EUC $kanji(SJIS)] + } EUC + test kanji12.10 {kanji conversion EUC} { + kanji code [kanji conversion EUC JIS $kanji(EUC)] + } JIS + test kanji12.11 {kanji conversion EUC} { + kanji code [kanji conversion EUC SJIS $kanji(EUC)] + } SJIS + test kanji12.12 {kanji conversion EUC} { + kanji code [kanji conversion EUC EUC $kanji(EUC)] + } EUC + + # + + test kanji13.1 {kanji error conditions} { + list [catch {kanji} msg] $msg + } {1 {wrong # args: should be "kanji option arg ?arg ...?"}} + test kanji13.2 {kanji error conditions} { + list [catch {kanji op} msg] $msg + } {1 {bad option "op": should be code, conversion, convertWhenCompile, defaultInputCode, defaultOutputCode, internalCode, inputCode, lsearch, lsort, outputCode, preferSjis, scanKanjiToken, split, or string}} + + # + + if {[info commands kanjitest] == {}} { + puts "This application hasn't been compiled with the \"kanjitest\" command." + } else { + test kanji14.1 {} { + kanjitest start $kanji(JIS) + } 1 + test kanji14.2 {} { + kanjitest start $kanji(JIS) JIS + } 1 + test kanji14.3 {} { + kanjitest start "a$kanji(JIS)" JIS + } 0 + test kanji14.4 {} { + kanjitest start $kanji(SJIS) + } 1 + test kanji14.5 {} { + kanjitest start $kanji(SJIS) SJIS + } 1 + test kanji14.6 {} { + kanjitest start "a$kanji(SJIS)" SJIS + } 0 + test kanji14.7 {} { + kanjitest start $kanji(EUC) + } 1 + test kanji14.8 {} { + kanjitest start $kanji(EUC) EUC + } 1 + test kanji14.9 {} { + kanjitest start "a$kanji(EUC)" EUC + } 0 + test kanji14.10 {} { + kanjitest end $kanji(JIS) + } 1 + test kanji14.11 {} { + kanjitest end $kanji(JIS) JIS + } 1 + test kanji14.12 {} { + kanjitest end "$kanji(JIS)z" JIS + } 0 + test kanji14.13 {} { + kanjitest end $kanji(SJIS) + } 1 + test kanji14.14 {} { + kanjitest end $kanji(SJIS) SJIS + } 1 + test kanji14.15 {} { + kanjitest end "$kanji(SJIS)z" SJIS + } 0 + test kanji14.16 {} { + kanjitest end $kanji(EUC) + } 1 + test kanji14.17 {} { + kanjitest end $kanji(EUC) EUC + } 1 + test kanji14.18 {} { + kanjitest end "$kanji(EUC)z" EUC + } 0 + } + + # kanji variable names + + set default [kanji internalCode] + kanji internalCode [file kanjiCode kanji.test] + + test kanji15.1 {kanji variable names} { + set $BJQ?t(B abc + expr {$$BJQ?t(B == "abc"} + } 1 + test kanji15.2 {kanji variable names} { + set $BJQ?t(B abc + expr {${$BJQ?t(B} == "abc"} + } 1 + test kanji15.3 {kanji variable names} { + set $BG[Ns(B($B#0(B) abc + expr {$$BG[Ns(B($B#0(B) == "abc"} + } 1 + + kanji internalCode $default + + + # kanji proc names. + + + set procs2 { + catch {rename $B%F%9%H%W%m%7%8%c(B ""} + catch {unset $BG[NsL>(B} + + proc $B%F%9%H%W%m%7%8%c(B { $B0z?t(B1 $B0z?t(B2 } { + global $$B0z?t(B1 + set ${$B0z?t(B1}(${$B0z?t(B2}) [list $$B0z?t(B1 $$B0z?t(B2] + return [kanji code [set ${$B0z?t(B1}(${$B0z?t(B2})]] + } + + set x [$B%F%9%H%W%m%7%8%c(B $BG[NsL>(B $B%$%s%G%C%/%9(B] + list [set $BG[NsL>(B($B%$%s%G%C%/%9(B)] $x + } + + set kCode [kanji code $procs2] + kanji internalCode JIS + test kanji16.1 {kanji proc names: JIS} { + set v [kanji conversion $kCode JIS $procs2] + eval "$v" + } "{[kanji conversion $kCode JIS {$BG[NsL>(B $B%$%s%G%C%/%9(B}]} JIS" + + kanji internalCode SJIS + test kanji16.2 {kanji proc names: SJIS} { + set v [kanji conversion $kCode SJIS $procs2] + eval "$v" + } "{[kanji conversion $kCode SJIS {$BG[NsL>(B $B%$%s%G%C%/%9(B}]} SJIS" + + kanji internalCode EUC + test kanji16.3 {kanji proc names: EUC} { + set v [kanji conversion $kCode EUC $procs2] + eval "$v" + } "{[kanji conversion $kCode EUC {$BG[NsL>(B $B%$%s%G%C%/%9(B}]} EUC" + + kanji internalCode $default + + if {$lang != ""} then {set env(LANG) $lang} + unset lang + + DeleteFile kanji.any + kanji preferSjis $oPrefSjis diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/registry.test ./tests/registry.test *** ../../tcl8.0.5/tests/registry.test Wed Feb 3 08:01:42 1999 --- ./tests/registry.test Fri Mar 12 00:02:52 1999 *************** *** 144,150 **** test registry-2.7 {DeleteKey: trailing backslashes} { registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar\\} msg] $msg ! } {1 {unable to delete key: The configuration registry key is invalid.}} test registry-2.8 {DeleteKey: failure} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry delete HKEY_CLASSES_ROOT\\TclFoobar --- 144,150 ---- test registry-2.7 {DeleteKey: trailing backslashes} { registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar\\} msg] $msg ! } [jp&orig {1 {unable to delete key: 設定レジストリ キーが無効です。}} {1 {unable to delete key: The configuration registry key is invalid.}}] test registry-2.8 {DeleteKey: failure} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry delete HKEY_CLASSES_ROOT\\TclFoobar *************** *** 163,182 **** test registry-3.2 {DeleteValue: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar test} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-3.3 {DeleteValue: bad value} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz test2 blort set result [list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar test1} msg] $msg] registry delete HKEY_CLASSES_ROOT\\TclFoobar set result ! } {1 {unable to delete value "test1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}} test registry-4.1 {GetKeyNames: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-4.2 {GetKeyNames} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz --- 163,182 ---- test registry-3.2 {DeleteValue: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar test} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-3.3 {DeleteValue: bad value} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz test2 blort set result [list [catch {registry delete HKEY_CLASSES_ROOT\\TclFoobar test1} msg] $msg] registry delete HKEY_CLASSES_ROOT\\TclFoobar set result ! } [jp&orig {1 {unable to delete value "test1" from key "HKEY_CLASSES_ROOT\TclFoobar": 指定されたファイルが見つかりません。}} {1 {unable to delete value "test1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}}] test registry-4.1 {GetKeyNames: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-4.2 {GetKeyNames} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar\\baz *************** *** 219,229 **** test registry-5.1 {GetType} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry type HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-5.2 {GetType} { registry set HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry type HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } {1 {unable to get type of value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}} test registry-5.3 {GetType} { registry set HKEY_CLASSES_ROOT\\TclFoobar val1 foobar none set result [registry type HKEY_CLASSES_ROOT\\TclFoobar val1] --- 219,229 ---- test registry-5.1 {GetType} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry type HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-5.2 {GetType} { registry set HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry type HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } [jp&orig {1 {unable to get type of value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": 指定されたファイルが見つかりません。}} {1 {unable to get type of value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}}] test registry-5.3 {GetType} { registry set HKEY_CLASSES_ROOT\\TclFoobar val1 foobar none set result [registry type HKEY_CLASSES_ROOT\\TclFoobar val1] *************** *** 294,304 **** test registry-6.1 {GetValue} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry get HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-6.2 {GetValue} { registry set HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry get HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } {1 {unable to get value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}} test registry-6.3 {GetValue} { registry set HKEY_CLASSES_ROOT\\TclFoobar val1 foobar none set result [registry get HKEY_CLASSES_ROOT\\TclFoobar val1] --- 294,304 ---- test registry-6.1 {GetValue} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry get HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-6.2 {GetValue} { registry set HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry get HKEY_CLASSES_ROOT\\TclFoobar val1} msg] $msg ! } [jp&orig {1 {unable to get value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": 指定されたファイルが見つかりません。}} {1 {unable to get value "val1" from key "HKEY_CLASSES_ROOT\TclFoobar": The system cannot find the file specified.}}] test registry-6.3 {GetValue} { registry set HKEY_CLASSES_ROOT\\TclFoobar val1 foobar none set result [registry get HKEY_CLASSES_ROOT\\TclFoobar val1] *************** *** 387,393 **** test registry-7.1 {GetValueNames: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry values HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-7.2 {GetValueNames} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar baz foobar --- 387,393 ---- test registry-7.1 {GetValueNames: bad key} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry values HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-7.2 {GetValueNames} { registry delete HKEY_CLASSES_ROOT\\TclFoobar registry set HKEY_CLASSES_ROOT\\TclFoobar baz foobar *************** *** 449,455 **** test registry-8.3 {OpenSubKey} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-9.1 {ParseKeyName: bad keys} { list [catch {registry values \\} msg] $msg --- 449,455 ---- test registry-8.3 {OpenSubKey} { registry delete HKEY_CLASSES_ROOT\\TclFoobar list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-9.1 {ParseKeyName: bad keys} { list [catch {registry values \\} msg] $msg *************** *** 465,471 **** } {1 {ambiguous root name "": must be HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, or HKEY_DYN_DATA}} test registry-9.5 {ParseKeyName: bad keys} { list [catch {registry values \\\\\\HKEY_CLASSES_ROOT} msg] $msg ! } {1 {unable to open key: The network address is invalid.}} test registry-9.6 {ParseKeyName: bad keys} { list [catch {registry values \\\\gaspode} msg] $msg } {1 {ambiguous root name "": must be HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, or HKEY_DYN_DATA}} --- 465,471 ---- } {1 {ambiguous root name "": must be HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, or HKEY_DYN_DATA}} test registry-9.5 {ParseKeyName: bad keys} { list [catch {registry values \\\\\\HKEY_CLASSES_ROOT} msg] $msg ! } [jp&orig {1 {unable to open key: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンが失敗しました。}} {1 {unable to open key: The network address is invalid.}}] test registry-9.6 {ParseKeyName: bad keys} { list [catch {registry values \\\\gaspode} msg] $msg } {1 {ambiguous root name "": must be HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, or HKEY_DYN_DATA}} *************** *** 477,483 **** } {1 {bad key: cannot delete root keys}} test registry-9.9 {ParseKeyName: null keys} { list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar\\baz} msg] $msg ! } {1 {unable to open key: The system cannot find the file specified.}} test registry-10.1 {RecursiveDeleteKey} { registry delete HKEY_CLASSES_ROOT\\TclFoobar --- 477,483 ---- } {1 {bad key: cannot delete root keys}} test registry-9.9 {ParseKeyName: null keys} { list [catch {registry keys HKEY_CLASSES_ROOT\\TclFoobar\\baz} msg] $msg ! } [jp&orig {1 {unable to open key: 指定されたファイルが見つかりません。}} {1 {unable to open key: The system cannot find the file specified.}}] test registry-10.1 {RecursiveDeleteKey} { registry delete HKEY_CLASSES_ROOT\\TclFoobar diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/socket.test ./tests/socket.test *** ../../tcl8.0.5/tests/socket.test Fri Dec 4 10:01:55 1998 --- ./tests/socket.test Fri Mar 12 00:02:54 1999 *************** *** 823,829 **** close $s update llength $l ! } 10 test socket-7.4 {testing socket specific options} { set s [socket -server accept 2823] proc accept {s a p} { --- 823,829 ---- close $s update llength $l ! } [ jp&orig 14 10 ] test socket-7.4 {testing socket specific options} { set s [socket -server accept 2823] proc accept {s a p} { diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/tests/unixNotfy.test ./tests/unixNotfy.test *** ../../tcl8.0.5/tests/unixNotfy.test Tue Sep 15 03:40:14 1998 --- ./tests/unixNotfy.test Fri Mar 12 00:02:59 1999 *************** *** 46,50 **** list [catch {vwait x} msg] $msg } {1 {can't wait for variable "x": would wait forever}} ! file delete foo file delete foo2 --- 46,50 ---- list [catch {vwait x} msg] $msg } {1 {can't wait for variable "x": would wait forever}} ! file delete foo foo2 file delete foo2 diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/Makefile.in ./unix/Makefile.in *** ../../tcl8.0.5/unix/Makefile.in Tue Mar 9 15:51:26 1999 --- ./unix/Makefile.in Fri Mar 12 00:03:30 1999 *************** *** 137,142 **** --- 137,147 ---- #COMPILE_DEBUG_FLAGS = -DTCL_COMPILE_STATS #COMPILE_DEBUG_FLAGS = -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS + KANJI_FLAGS = @KANJI_FLAGS@ + + KANJI_SRCS = $(GENERIC_DIR)/tclKanjiUtil.c + KANJI_OBJS = tclKanjiUtil.o + # Some versions of make, like SGI's, use the following variable to # determine which shell to use for executing commands: SHELL = /bin/sh *************** *** 192,198 **** COMPAT_OBJS = @LIBOBJS@ ! AC_FLAGS = @EXTRA_CFLAGS@ @DEFS@ RANLIB = @RANLIB@ SRC_DIR = @srcdir@ TOP_DIR = @srcdir@/.. --- 197,203 ---- COMPAT_OBJS = @LIBOBJS@ ! AC_FLAGS = @EXTRA_CFLAGS@ @DEFS@ @CPPFLAGS@ RANLIB = @RANLIB@ SRC_DIR = @srcdir@ TOP_DIR = @srcdir@/.. *************** *** 213,226 **** CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \ -I${GENERIC_DIR} -I${SRC_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \ ! ${COMPILE_DEBUG_FLAGS} ${ENV_FLAGS} -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\" LIBS = @DL_LIBS@ @LIBS@ $(MATH_LIBS) -lc DEPEND_SWITCHES = ${CFLAGS} -I${GENERIC_DIR} -I${SRC_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} \ ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \ ! -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\" TCLSH_OBJS = tclAppInit.o --- 218,231 ---- CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \ -I${GENERIC_DIR} -I${SRC_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \ ! ${COMPILE_DEBUG_FLAGS} ${ENV_FLAGS} -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\" ${KANJI_FLAGS} LIBS = @DL_LIBS@ @LIBS@ $(MATH_LIBS) -lc DEPEND_SWITCHES = ${CFLAGS} -I${GENERIC_DIR} -I${SRC_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} \ ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \ ! -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\" ${KANJI_FLAGS} TCLSH_OBJS = tclAppInit.o *************** *** 240,246 **** tclPreserve.o tclProc.o tclStringObj.o tclTimer.o tclUtil.o tclVar.o \ tclResolve.o ! OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} ${COMPAT_OBJS} @DL_OBJS@ GENERIC_HDRS = \ $(GENERIC_DIR)/tclRegexp.h \ --- 245,251 ---- tclPreserve.o tclProc.o tclStringObj.o tclTimer.o tclUtil.o tclVar.o \ tclResolve.o ! OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} ${COMPAT_OBJS} ${KANJI_OBJS} @DL_OBJS@ GENERIC_HDRS = \ $(GENERIC_DIR)/tclRegexp.h \ *************** *** 329,335 **** # compile on the current machine, and they will cause problems for # things like "make depend". ! SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) all: ${TCL_LIB_FILE} tclsh --- 334,340 ---- # compile on the current machine, and they will cause problems for # things like "make depend". ! SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) $(KANJI_SRCS) all: ${TCL_LIB_FILE} tclsh *************** *** 353,368 **** tclsh: ${TCLSH_OBJS} ${TCL_LIB_FILE} ! ${CC} @LD_FLAGS@ ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -o tclsh tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST} ! ${CC} @LD_FLAGS@ ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -o tcltest xttest: ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ @DL_OBJS@ ${BUILD_DLTEST} ! ${CC} ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ @DL_OBJS@ @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -lXt -o xttest --- 358,373 ---- tclsh: ${TCLSH_OBJS} ${TCL_LIB_FILE} ! ${PURECOM} ${CC} @LD_FLAGS@ ${CFLAGS} ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -o tclsh tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST} ! ${PURECOM} ${CC} @LD_FLAGS@ ${CFLAGS} ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -o tcltest xttest: ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ @DL_OBJS@ ${BUILD_DLTEST} ! ${PURECOM} ${CC} @LD_FLAGS@ ${CFLAGS} ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ @DL_OBJS@ @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -lXt -o xttest *************** *** 539,546 **** $(PACKAGE).* prototype if test -f dltest/Makefile; then cd dltest; $(MAKE) distclean; fi depend: ! makedepend -- $(DEPEND_SWITCHES) -- $(SRCS) bp: $(UNIX_DIR)/bp.c $(CC) $(CC_SWITCHES) $(UNIX_DIR)/bp.c -o bp --- 544,561 ---- $(PACKAGE).* prototype if test -f dltest/Makefile; then cd dltest; $(MAKE) distclean; fi + GCCINC = -I`case "@CC@" in *gcc) echo \`@CC@ -v 2>&1 | grep specs | sed 's/specs$$/include/' | awk '{ print $$NF }'\`;; esac` + depend: ! touch .depend.tmp ! makedepend -f ./.depend.tmp -a -- $(GCCINC) $(DEPEND_SWITCHES) -- $(SRCS) ! sed 's:^$(GENERIC_DIR)/:./:' ./.depend.tmp > ./.depend ! cat Makefile ./.depend > ./Makefile.tmp ! mv Makefile.tmp Makefile ! rm -f ./.depend ./.depend.tmp ! ! #depend: ! # makedepend -- $(DEPEND_SWITCHES) -- $(SRCS) bp: $(UNIX_DIR)/bp.c $(CC) $(CC_SWITCHES) $(UNIX_DIR)/bp.c -o bp *************** *** 750,755 **** --- 765,773 ---- tclTimer.o: $(GENERIC_DIR)/tclTimer.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclTimer.c + + tclKanjiUtil.o: $(GENERIC_DIR)/tclKanjiUtil.c + $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclKanjiUtil.c tclUnixChan.o: $(UNIX_DIR)/tclUnixChan.c $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixChan.c diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/configure ./unix/configure *** ../../tcl8.0.5/unix/configure Tue Mar 9 15:51:26 1999 --- ./unix/configure Fri Mar 12 00:18:59 1999 *************** *** 1,7 **** #! /bin/sh # Guess values for system-dependent variables and create Makefiles. ! # Generated automatically using autoconf version 2.9 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation --- 1,7 ---- #! /bin/sh # Guess values for system-dependent variables and create Makefiles. ! # Generated automatically using autoconf version 2.12 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation *************** *** 12,17 **** --- 12,21 ---- ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help + --enable-kanji enable kanji features (default: on)" + ac_help="$ac_help + --enable-kanji-filename enable kanji filename feature (default: off)" + ac_help="$ac_help --enable-gcc allow use of gcc if available" ac_help="$ac_help --disable-load disallow dynamic loading and "load" command" *************** *** 57,62 **** --- 61,68 ---- # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= + # Maximum number of lines to put in a shell here document. + ac_max_here_lines=12 ac_prev= for ac_option *************** *** 338,344 **** verbose=yes ;; -version | --version | --versio | --versi | --vers) ! echo "configure generated by autoconf version 2.9" exit 0 ;; -with-* | --with-*) --- 344,350 ---- verbose=yes ;; -version | --version | --versio | --versi | --vers) ! echo "configure generated by autoconf version 2.12" exit 0 ;; -with-* | --with-*) *************** *** 440,450 **** done # NLS nuisances. ! # Only set LANG and LC_ALL to C if already set. ! # These must not be set unconditionally because not all systems understand ! # e.g. LANG=C (notably SCO). ! if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h --- 446,459 ---- done # NLS nuisances. ! # Only set these to C if already set. These must not be set unconditionally ! # because not all systems understand e.g. LANG=C (notably SCO). ! # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi + if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi + if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi + if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h *************** *** 506,511 **** --- 515,521 ---- ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' + cross_compiling=$ac_cv_prog_cc_cross if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. *************** *** 520,533 **** fi ! # RCS: @(#) $Id: configure.in,v 1.28 1999/02/03 18:37:42 stanton Exp $ ! TCL_VERSION=8.0 TCL_MAJOR_VERSION=8 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL=".5" VERSION=${TCL_VERSION} if test "${prefix}" = "NONE"; then prefix=/usr/local fi --- 530,578 ---- fi ! # RCS: @(#) $Id: configure,v 1.13 1999/03/11 15:18:59 m-hirano Exp $ ! TCL_VERSION=8.0jp TCL_MAJOR_VERSION=8 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL=".5" VERSION=${TCL_VERSION} + # kanji stuff. + kanji="" + kanjiPath="" + KANJI_FLAGS="" + # Check whether --enable-kanji or --disable-kanji was given. + if test "${enable_kanji+set}" = set; then + enableval="$enable_kanji" + kanji=$enableval + else + kanji=yes + fi + + if test "X$kanji" = "Xyes"; then + echo "$ac_t""kanji features are enabled." 1>&6 + KANJI_FLAGS="-DKANJI -DBUGFIX" + else + echo "$ac_t""kanji features are disabled." 1>&6 + fi + # Check whether --enable-kanji-filename or --disable-kanji-filename was given. + if test "${enable_kanji_filename+set}" = set; then + enableval="$enable_kanji_filename" + kanjiPath=$enableval + else + kanjiPath=no + fi + + if test "X$kanjiPath" = "Xyes"; then + echo "$ac_t""kanji filename feature is enabled." 1>&6 + KANJI_FLAGS="$KANJI_FLAGS -DHANDLE_KANJI_PATHNAME" + else + echo "$ac_t""kanji filename feature is disabled." 1>&6 + fi + + + if test "${prefix}" = "NONE"; then prefix=/usr/local fi *************** *** 539,544 **** --- 584,590 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 + echo "configure:588: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** *** 576,581 **** --- 622,628 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 + echo "configure:626: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** *** 604,609 **** --- 651,657 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 + echo "configure:655: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** *** 650,656 **** --- 698,744 ---- test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 + echo "configure:703: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + + ac_ext=c + # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. + ac_cpp='$CPP $CPPFLAGS' + ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' + ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' + cross_compiling=$ac_cv_prog_cc_cross + + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no + fi + rm -fr conftest* + + echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 + if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } + fi + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 + echo "configure:737: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 + echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 + cross_compiling=$ac_cv_prog_cc_cross + echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 + echo "configure:742: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** *** 659,665 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 747,753 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:751: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** *** 667,695 **** fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes ! if test "${CFLAGS+set}" != set; then ! echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ! ac_cv_prog_gcc_g=yes else ! ac_cv_prog_gcc_g=no fi rm -f conftest* fi ! echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 ! if test $ac_cv_prog_gcc_g = yes; then ! CFLAGS="-g -O" ! else ! CFLAGS="-O" ! fi fi else GCC= --- 755,788 ---- fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + if test $ac_cv_prog_gcc = yes; then GCC=yes ! ac_test_CFLAGS="${CFLAGS+set}" ! ac_save_CFLAGS="$CFLAGS" ! CFLAGS= ! echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:766: checking whether ${CC-cc} accepts -g" >&5 ! if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ! ac_cv_prog_cc_g=yes else ! ac_cv_prog_cc_g=no fi rm -f conftest* fi ! echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 ! if test "$ac_test_CFLAGS" = set; then ! CFLAGS="$ac_save_CFLAGS" ! elif test $ac_cv_prog_cc_g = yes; then ! CFLAGS="-g -O2" ! else ! CFLAGS="-O2" fi else GCC= *************** *** 700,730 **** CC=${CC-cc} fi - # If we cannot run a trivial program, we must be cross compiling. - echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 - else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes - else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } - if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_c_cross=no - else - ac_cv_c_cross=yes - fi - fi - rm -fr conftest* - fi - - echo "$ac_t""$ac_cv_c_cross" 1>&6 - cross_compiling=$ac_cv_c_cross # set the warning flags depending on whether or not we are using gcc --- 793,798 ---- *************** *** 742,768 **** if test -z "$no_pipe"; then if test -n "$GCC"; then echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6 OLDCC="$CC" CC="$CC -pipe" cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""yes" 1>&6 else rm -rf conftest* CC="$OLDCC" echo "$ac_t""no" 1>&6 fi rm -f conftest* - fi fi --- 810,837 ---- if test -z "$no_pipe"; then if test -n "$GCC"; then echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6 + echo "configure:814: checking if the compiler understands -pipe" >&5 OLDCC="$CC" CC="$CC -pipe" cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""yes" 1>&6 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* CC="$OLDCC" echo "$ac_t""no" 1>&6 fi rm -f conftest* fi fi *************** *** 775,794 **** for ac_func in getcwd do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char $ac_func(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 844,865 ---- for ac_func in getcwd do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 + echo "configure:848: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char $ac_func(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 801,816 **** ; return 0; } EOF ! if { (eval echo configure:805: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` --- 872,889 ---- ; return 0; } EOF ! if { (eval echo configure:876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` *************** *** 833,852 **** for ac_func in opendir strstr do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char $ac_func(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 906,927 ---- for ac_func in opendir strstr do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 + echo "configure:910: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char $ac_func(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 859,902 **** ; return 0; } EOF ! if { (eval echo configure:863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ! : else echo "$ac_t""no" 1>&6 LIBOBJS="$LIBOBJS ${ac_func}.o" fi - done for ac_func in strtol tmpnam waitpid do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char $ac_func(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 934,985 ---- ; return 0; } EOF ! if { (eval echo configure:938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ! cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS ${ac_func}.o" fi done + for ac_func in strtol tmpnam waitpid do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 + echo "configure:968: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char $ac_func(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 909,949 **** ; return 0; } EOF ! if { (eval echo configure:913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ! : else echo "$ac_t""no" 1>&6 LIBOBJS="$LIBOBJS ${ac_func}.o" fi - done echo $ac_n "checking for strerror""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char strerror(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 992,1040 ---- ; return 0; } EOF ! if { (eval echo configure:996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ! cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS ${ac_func}.o" fi done + echo $ac_n "checking for strerror""... $ac_c" 1>&6 + echo "configure:1023: checking for strerror" >&5 if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char strerror(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 956,971 **** ; return 0; } EOF ! if { (eval echo configure:960: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_strerror=yes" else rm -rf conftest* eval "ac_cv_func_strerror=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'strerror`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 1047,1064 ---- ; return 0; } EOF ! if { (eval echo configure:1051: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_strerror=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strerror=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'strerror`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 978,997 **** fi echo $ac_n "checking for getwd""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_getwd'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char getwd(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 1071,1092 ---- fi echo $ac_n "checking for getwd""... $ac_c" 1>&6 + echo "configure:1075: checking for getwd" >&5 if eval "test \"`echo '$''{'ac_cv_func_getwd'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char getwd(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 1004,1019 **** ; return 0; } EOF ! if { (eval echo configure:1008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_getwd=yes" else rm -rf conftest* eval "ac_cv_func_getwd=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'getwd`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 1099,1116 ---- ; return 0; } EOF ! if { (eval echo configure:1103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_getwd=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_getwd=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'getwd`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 1026,1045 **** fi echo $ac_n "checking for wait3""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_wait3'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char wait3(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 1123,1144 ---- fi echo $ac_n "checking for wait3""... $ac_c" 1>&6 + echo "configure:1127: checking for wait3" >&5 if eval "test \"`echo '$''{'ac_cv_func_wait3'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char wait3(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 1052,1067 **** ; return 0; } EOF ! if { (eval echo configure:1056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_wait3=yes" else rm -rf conftest* eval "ac_cv_func_wait3=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'wait3`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 1151,1168 ---- ; return 0; } EOF ! if { (eval echo configure:1155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_wait3=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_wait3=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'wait3`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 1074,1093 **** fi echo $ac_n "checking for uname""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_uname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char uname(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 1175,1196 ---- fi echo $ac_n "checking for uname""... $ac_c" 1>&6 + echo "configure:1179: checking for uname" >&5 if eval "test \"`echo '$''{'ac_cv_func_uname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char uname(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 1100,1115 **** ; return 0; } EOF ! if { (eval echo configure:1104: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_uname=yes" else rm -rf conftest* eval "ac_cv_func_uname=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'uname`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 1203,1220 ---- ; return 0; } EOF ! if { (eval echo configure:1207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_uname=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_uname=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'uname`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 1130,1149 **** #-------------------------------------------------------------------- echo $ac_n "checking for sin""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char sin(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 1235,1256 ---- #-------------------------------------------------------------------- echo $ac_n "checking for sin""... $ac_c" 1>&6 + echo "configure:1239: checking for sin" >&5 if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char sin(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 1156,1171 **** ; return 0; } EOF ! if { (eval echo configure:1160: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_sin=yes" else rm -rf conftest* eval "ac_cv_func_sin=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then echo "$ac_t""yes" 1>&6 MATH_LIBS="" --- 1263,1280 ---- ; return 0; } EOF ! if { (eval echo configure:1267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_sin=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_sin=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then echo "$ac_t""yes" 1>&6 MATH_LIBS="" *************** *** 1174,1201 **** MATH_LIBS="-lm" fi ! echo $ac_n "checking for -lieee""... $ac_c" 1>&6 ! ac_lib_var=`echo ieee_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lieee $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 1283,1310 ---- MATH_LIBS="-lm" fi ! echo $ac_n "checking for main in -lieee""... $ac_c" 1>&6 ! echo "configure:1288: checking for main in -lieee" >&5 ! ac_lib_var=`echo ieee'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lieee $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 1220,1247 **** #-------------------------------------------------------------------- libbsd=no if test "`uname -s`" = "AIX" ; then ! echo $ac_n "checking for -lbsd""... $ac_c" 1>&6 ! ac_lib_var=`echo bsd_gettimeofday | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lbsd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 1329,1360 ---- #-------------------------------------------------------------------- libbsd=no if test "`uname -s`" = "AIX" ; then ! echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6 ! echo "configure:1334: checking for gettimeofday in -lbsd" >&5 ! ac_lib_var=`echo bsd'_'gettimeofday | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lbsd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 1271,1283 **** #-------------------------------------------------------------------- echo $ac_n "checking dirent.h""... $ac_c" 1>&6 cat > conftest.$ac_ext < #include ! int main() { return 0; } ! int t() { #ifndef _POSIX_SOURCE # ifdef __Lynx__ --- 1384,1396 ---- #-------------------------------------------------------------------- echo $ac_n "checking dirent.h""... $ac_c" 1>&6 + echo "configure:1388: checking dirent.h" >&5 cat > conftest.$ac_ext < #include ! int main() { #ifndef _POSIX_SOURCE # ifdef __Lynx__ *************** *** 1299,1313 **** ; return 0; } EOF ! if { (eval echo configure:1303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* tcl_ok=yes else rm -rf conftest* tcl_ok=no fi rm -f conftest* - if test $tcl_ok = no; then cat >> confdefs.h <<\EOF #define NO_DIRENT_H 1 --- 1412,1427 ---- ; return 0; } EOF ! if { (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* tcl_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=no fi rm -f conftest* if test $tcl_ok = no; then cat >> confdefs.h <<\EOF #define NO_DIRENT_H 1 *************** *** 1316,1321 **** --- 1430,1436 ---- fi echo "$ac_t""$tcl_ok" 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 + echo "configure:1434: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= *************** *** 1330,1362 **** # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1340: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1355: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP=/lib/cpp fi --- 1445,1481 ---- # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1455: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1472: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi *************** *** 1371,1394 **** fi echo "$ac_t""$CPP" 1>&6 ! ac_safe=`echo "errno.h" | tr './\055' '___'` echo $ac_n "checking for errno.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1490,1516 ---- fi echo "$ac_t""$CPP" 1>&6 ! ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for errno.h""... $ac_c" 1>&6 + echo "configure:1496: checking for errno.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1506: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1405,1428 **** fi ! ac_safe=`echo "float.h" | tr './\055' '___'` echo $ac_n "checking for float.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1420: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1527,1553 ---- fi ! ac_safe=`echo "float.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for float.h""... $ac_c" 1>&6 + echo "configure:1533: checking for float.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1543: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1439,1462 **** fi ! ac_safe=`echo "values.h" | tr './\055' '___'` echo $ac_n "checking for values.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1454: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1564,1590 ---- fi ! ac_safe=`echo "values.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for values.h""... $ac_c" 1>&6 + echo "configure:1570: checking for values.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1580: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1473,1496 **** fi ! ac_safe=`echo "limits.h" | tr './\055' '___'` echo $ac_n "checking for limits.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1601,1627 ---- fi ! ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for limits.h""... $ac_c" 1>&6 + echo "configure:1607: checking for limits.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1617: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1507,1530 **** fi ! ac_safe=`echo "stdlib.h" | tr './\055' '___'` echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1522: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1638,1664 ---- fi ! ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6 + echo "configure:1644: checking for stdlib.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1654: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1539,1545 **** fi cat > conftest.$ac_ext < EOF --- 1673,1679 ---- fi cat > conftest.$ac_ext < EOF *************** *** 1553,1559 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 1687,1693 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** *** 1567,1573 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 1701,1707 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** *** 1586,1609 **** EOF fi ! ac_safe=`echo "string.h" | tr './\055' '___'` echo $ac_n "checking for string.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1601: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1720,1746 ---- EOF fi ! ac_safe=`echo "string.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for string.h""... $ac_c" 1>&6 + echo "configure:1726: checking for string.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1618,1624 **** fi cat > conftest.$ac_ext < EOF --- 1755,1761 ---- fi cat > conftest.$ac_ext < EOF *************** *** 1632,1638 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 1769,1775 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** *** 1651,1674 **** EOF fi ! ac_safe=`echo "sys/wait.h" | tr './\055' '___'` echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1666: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1788,1814 ---- EOF fi ! ac_safe=`echo "sys/wait.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6 + echo "configure:1794: checking for sys/wait.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1804: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1685,1708 **** fi ! ac_safe=`echo "dlfcn.h" | tr './\055' '___'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1700: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1825,1851 ---- fi ! ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 + echo "configure:1831: checking for dlfcn.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1841: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1721,1744 **** for ac_hdr in unistd.h do ! ac_safe=`echo "$ac_hdr" | tr './\055' '___'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 1864,1890 ---- for ac_hdr in unistd.h do ! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 + echo "configure:1870: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1880: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1746,1752 **** fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 if test "$cross_compiling" = yes; then tk_ok=no else ! cat > conftest.$ac_ext < --- 1910,1921 ---- #--------------------------------------------------------------------------- echo $ac_n "checking termios vs. termio vs. sgtty""... $ac_c" 1>&6 + echo "configure:1914: checking termios vs. termio vs. sgtty" >&5 if test "$cross_compiling" = yes; then tk_ok=no else ! cat > conftest.$ac_ext < *************** *** 1784,1797 **** return 1; } EOF ! { (eval echo configure:1788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tk_ok=termios else tk_ok=no fi - fi rm -fr conftest* if test $tk_ok = termios; then cat >> confdefs.h <<\EOF #define USE_TERMIOS 1 --- 1931,1948 ---- return 1; } EOF ! if { (eval echo configure:1935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tk_ok=termios else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tk_ok=no fi rm -fr conftest* + fi + if test $tk_ok = termios; then cat >> confdefs.h <<\EOF #define USE_TERMIOS 1 *************** *** 1801,1808 **** if test "$cross_compiling" = yes; then tk_ok=no else ! cat > conftest.$ac_ext < --- 1952,1959 ---- if test "$cross_compiling" = yes; then tk_ok=no else ! cat > conftest.$ac_ext < *************** *** 1817,1830 **** return 1; } EOF ! { (eval echo configure:1821: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tk_ok=termio else tk_ok=no fi - fi rm -fr conftest* if test $tk_ok = termio; then cat >> confdefs.h <<\EOF #define USE_TERMIO 1 --- 1968,1985 ---- return 1; } EOF ! if { (eval echo configure:1972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tk_ok=termio else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tk_ok=no fi rm -fr conftest* + fi + if test $tk_ok = termio; then cat >> confdefs.h <<\EOF #define USE_TERMIO 1 *************** *** 1834,1841 **** if test "$cross_compiling" = yes; then tk_ok=none else ! cat > conftest.$ac_ext < --- 1989,1996 ---- if test "$cross_compiling" = yes; then tk_ok=none else ! cat > conftest.$ac_ext < *************** *** 1851,1864 **** return 1; } EOF ! { (eval echo configure:1855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tk_ok=sgtty else tk_ok=none fi - fi rm -fr conftest* if test $tk_ok = sgtty; then cat >> confdefs.h <<\EOF #define USE_SGTTY 1 --- 2006,2023 ---- return 1; } EOF ! if { (eval echo configure:2010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tk_ok=sgtty else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tk_ok=none fi rm -fr conftest* + fi + if test $tk_ok = sgtty; then cat >> confdefs.h <<\EOF #define USE_SGTTY 1 *************** *** 1880,1906 **** #-------------------------------------------------------------------- echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { fd_set readMask, writeMask; ; return 0; } EOF ! if { (eval echo configure:1893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tk_ok=yes else rm -rf conftest* tk_ok=no fi rm -f conftest* - if test $tk_ok = no; then cat > conftest.$ac_ext < EOF --- 2039,2066 ---- #-------------------------------------------------------------------- echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6 + echo "configure:2043: checking fd_set and sys/select" >&5 cat > conftest.$ac_ext < ! int main() { fd_set readMask, writeMask; ; return 0; } EOF ! if { (eval echo configure:2052: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tk_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tk_ok=no fi rm -f conftest* if test $tk_ok = no; then cat > conftest.$ac_ext < EOF *************** *** 1932,1955 **** for ac_hdr in sys/time.h do ! ac_safe=`echo "$ac_hdr" | tr './\055' '___'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1947: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 2092,2118 ---- for ac_hdr in sys/time.h do ! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 + echo "configure:2098: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2108: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 1957,1963 **** fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include ! int main() { return 0; } ! int t() { struct tm *tp; ; return 0; } EOF ! if { (eval echo configure:1986: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* - fi echo "$ac_t""$ac_cv_header_time" 1>&6 --- 2131,2160 ---- done echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 + echo "configure:2135: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include ! int main() { struct tm *tp; ; return 0; } EOF ! if { (eval echo configure:2149: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_time" 1>&6 *************** *** 2002,2029 **** fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include ! int main() { return 0; } ! int t() { struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:2019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else rm -rf conftest* ac_cv_struct_tm=sys/time.h fi rm -f conftest* - fi echo "$ac_t""$ac_cv_struct_tm" 1>&6 --- 2166,2194 ---- fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 + echo "configure:2170: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include ! int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:2183: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_tm=sys/time.h fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_tm" 1>&6 *************** *** 2035,2062 **** fi echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_cv_struct_tm> ! int main() { return 0; } ! int t() { struct tm tm; tm.tm_zone; ; return 0; } EOF ! if { (eval echo configure:2052: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm_zone=yes else rm -rf conftest* ac_cv_struct_tm_zone=no fi rm -f conftest* - fi echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6 --- 2200,2228 ---- fi echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6 + echo "configure:2204: checking for tm_zone in struct tm" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_cv_struct_tm> ! int main() { struct tm tm; tm.tm_zone; ; return 0; } EOF ! if { (eval echo configure:2217: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm_zone=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_tm_zone=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6 *************** *** 2067,2096 **** else echo $ac_n "checking for tzname""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ #endif ! int main() { return 0; } ! int t() { atoi(*tzname); ; return 0; } EOF ! if { (eval echo configure:2086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* ac_cv_var_tzname=yes else rm -rf conftest* ac_cv_var_tzname=no fi rm -f conftest* - fi echo "$ac_t""$ac_cv_var_tzname" 1>&6 --- 2233,2263 ---- else echo $ac_n "checking for tzname""... $ac_c" 1>&6 + echo "configure:2237: checking for tzname" >&5 if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ #endif ! int main() { atoi(*tzname); ; return 0; } EOF ! if { (eval echo configure:2252: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_var_tzname=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_var_tzname=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_var_tzname" 1>&6 *************** *** 2104,2119 **** echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct tm tm; tm.tm_tzadj; ; return 0; } EOF ! if { (eval echo configure:2117: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TM_TZADJ 1 --- 2271,2286 ---- echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6 + echo "configure:2275: checking tm_tzadj in struct tm" >&5 cat > conftest.$ac_ext < ! int main() { struct tm tm; tm.tm_tzadj; ; return 0; } EOF ! if { (eval echo configure:2284: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TM_TZADJ 1 *************** *** 2121,2143 **** echo "$ac_t""yes" 1>&6 else rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* - echo $ac_n "checking tm_gmtoff in struct tm""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct tm tm; tm.tm_gmtoff; ; return 0; } EOF ! if { (eval echo configure:2141: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TM_GMTOFF 1 --- 2288,2311 ---- echo "$ac_t""yes" 1>&6 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* echo $ac_n "checking tm_gmtoff in struct tm""... $ac_c" 1>&6 + echo "configure:2300: checking tm_gmtoff in struct tm" >&5 cat > conftest.$ac_ext < ! int main() { struct tm tm; tm.tm_gmtoff; ; return 0; } EOF ! if { (eval echo configure:2309: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TM_GMTOFF 1 *************** *** 2145,2174 **** echo "$ac_t""yes" 1>&6 else rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* - # # Its important to include time.h in this check, as some systems (like convex) # have timezone functions, etc. # have_timezone=no echo $ac_n "checking long timezone variable""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { extern long timezone; timezone += 1; exit (0); ; return 0; } EOF ! if { (eval echo configure:2172: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* have_timezone=yes cat >> confdefs.h <<\EOF --- 2313,2343 ---- echo "$ac_t""yes" 1>&6 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* # # Its important to include time.h in this check, as some systems (like convex) # have timezone functions, etc. # have_timezone=no echo $ac_n "checking long timezone variable""... $ac_c" 1>&6 + echo "configure:2330: checking long timezone variable" >&5 cat > conftest.$ac_ext < ! int main() { extern long timezone; timezone += 1; exit (0); ; return 0; } EOF ! if { (eval echo configure:2341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* have_timezone=yes cat >> confdefs.h <<\EOF *************** *** 2177,2205 **** echo "$ac_t""yes" 1>&6 else rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* - # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # if test "$have_timezone" = no; then echo $ac_n "checking time_t timezone variable""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { extern time_t timezone; timezone += 1; exit (0); ; return 0; } EOF ! if { (eval echo configure:2203: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TIMEZONE_VAR 1 --- 2346,2375 ---- echo "$ac_t""yes" 1>&6 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # if test "$have_timezone" = no; then echo $ac_n "checking time_t timezone variable""... $ac_c" 1>&6 + echo "configure:2362: checking time_t timezone variable" >&5 cat > conftest.$ac_ext < ! int main() { extern time_t timezone; timezone += 1; exit (0); ; return 0; } EOF ! if { (eval echo configure:2373: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TIMEZONE_VAR 1 *************** *** 2207,2217 **** echo "$ac_t""yes" 1>&6 else rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* - fi # --- 2377,2388 ---- echo "$ac_t""yes" 1>&6 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* echo "$ac_t""no" 1>&6 fi rm -f conftest* fi # *************** *** 2232,2259 **** # in struct stat. #-------------------------------------------------------------------- echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include ! int main() { return 0; } ! int t() { struct stat s; s.st_blksize; ; return 0; } EOF ! if { (eval echo configure:2249: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_blksize=yes else rm -rf conftest* ac_cv_struct_st_blksize=no fi rm -f conftest* - fi echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6 --- 2403,2431 ---- # in struct stat. #-------------------------------------------------------------------- echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6 + echo "configure:2407: checking for st_blksize in struct stat" >&5 if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include ! int main() { struct stat s; s.st_blksize; ; return 0; } EOF ! if { (eval echo configure:2420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_blksize=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_st_blksize=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6 *************** *** 2271,2281 **** #-------------------------------------------------------------------- echo $ac_n "checking proper strstr implementation""... $ac_c" 1>&6 if test "$cross_compiling" = yes; then tcl_ok=no else ! cat > conftest.$ac_ext <&6 + echo "configure:2447: checking proper strstr implementation" >&5 if test "$cross_compiling" = yes; then tcl_ok=no else ! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tcl_ok=yes else tcl_ok=no fi - fi rm -fr conftest* if test $tcl_ok = yes; then echo "$ac_t""yes" 1>&6 else --- 2458,2475 ---- } EOF ! if { (eval echo configure:2462: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tcl_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tcl_ok=no fi rm -fr conftest* + fi + if test $tcl_ok = yes; then echo "$ac_t""yes" 1>&6 else *************** *** 2307,2326 **** #-------------------------------------------------------------------- echo $ac_n "checking for strtoul""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_strtoul'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char strtoul(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 2484,2505 ---- #-------------------------------------------------------------------- echo $ac_n "checking for strtoul""... $ac_c" 1>&6 + echo "configure:2488: checking for strtoul" >&5 if eval "test \"`echo '$''{'ac_cv_func_strtoul'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char strtoul(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 2333,2348 **** ; return 0; } EOF ! if { (eval echo configure:2337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_strtoul=yes" else rm -rf conftest* eval "ac_cv_func_strtoul=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'strtoul`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 --- 2512,2529 ---- ; return 0; } EOF ! if { (eval echo configure:2516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_strtoul=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strtoul=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'strtoul`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 *************** *** 2354,2361 **** if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then : else tcl_ok=0 fi - fi rm -fr conftest* if test "$tcl_ok" = 0; then test -n "$verbose" && echo " Adding strtoul.o." LIBOBJS="$LIBOBJS strtoul.o" --- 2552,2569 ---- exit(0); } EOF ! if { (eval echo configure:2556: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then : else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tcl_ok=0 fi rm -fr conftest* + fi + if test "$tcl_ok" = 0; then test -n "$verbose" && echo " Adding strtoul.o." LIBOBJS="$LIBOBJS strtoul.o" *************** *** 2390,2409 **** #-------------------------------------------------------------------- echo $ac_n "checking for strtod""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char strtod(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 2575,2596 ---- #-------------------------------------------------------------------- echo $ac_n "checking for strtod""... $ac_c" 1>&6 + echo "configure:2579: checking for strtod" >&5 if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char strtod(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 2416,2431 **** ; return 0; } EOF ! if { (eval echo configure:2420: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_strtod=yes" else rm -rf conftest* eval "ac_cv_func_strtod=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 --- 2603,2620 ---- ; return 0; } EOF ! if { (eval echo configure:2607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_strtod=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strtod=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 *************** *** 2437,2444 **** if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then : else tcl_ok=0 fi - fi rm -fr conftest* if test "$tcl_ok" = 0; then test -n "$verbose" && echo " Adding strtod.o." LIBOBJS="$LIBOBJS strtod.o" --- 2643,2660 ---- exit(0); } EOF ! if { (eval echo configure:2647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then : else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tcl_ok=0 fi rm -fr conftest* + fi + if test "$tcl_ok" = 0; then test -n "$verbose" && echo " Adding strtod.o." LIBOBJS="$LIBOBJS strtod.o" *************** *** 2475,2494 **** #-------------------------------------------------------------------- echo $ac_n "checking for strtod""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char strtod(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 2668,2689 ---- #-------------------------------------------------------------------- echo $ac_n "checking for strtod""... $ac_c" 1>&6 + echo "configure:2672: checking for strtod" >&5 if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char strtod(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 2501,2516 **** ; return 0; } EOF ! if { (eval echo configure:2505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_strtod=yes" else rm -rf conftest* eval "ac_cv_func_strtod=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_strtod=1 --- 2696,2713 ---- ; return 0; } EOF ! if { (eval echo configure:2700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_strtod=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strtod=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_strtod=1 *************** *** 2521,2531 **** if test "$tcl_strtod" = 1; then echo $ac_n "checking for Solaris strtod bug""... $ac_c" 1>&6 if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext <&6 + echo "configure:2722: checking for Solaris strtod bug" >&5 if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tcl_ok=1 else tcl_ok=0 fi - fi rm -fr conftest* if test $tcl_ok = 1; then echo "$ac_t""ok" 1>&6 else --- 2738,2755 ---- exit(0); } EOF ! if { (eval echo configure:2742: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tcl_ok=1 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tcl_ok=0 fi rm -fr conftest* + fi + if test $tcl_ok = 1; then echo "$ac_t""ok" 1>&6 else *************** *** 2566,2576 **** #-------------------------------------------------------------------- echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 2768,2779 ---- #-------------------------------------------------------------------- echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 + echo "configure:2772: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** *** 2578,2590 **** #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2582: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 rm -rf conftest* ac_cv_header_stdc=no fi --- 2781,2795 ---- #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2785: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi *************** *** 2593,2599 **** if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 2798,2804 ---- if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** *** 2611,2617 **** if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 2816,2822 ---- if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** *** 2631,2638 **** if test "$cross_compiling" = yes; then : else ! cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') --- 2836,2843 ---- if test "$cross_compiling" = yes; then : else ! cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') *************** *** 2643,2657 **** exit (0); } EOF ! { (eval echo configure:2647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then : else ac_cv_header_stdc=no fi - fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 --- 2848,2866 ---- exit (0); } EOF ! if { (eval echo configure:2852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then : else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi + + fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 *************** *** 2663,2681 **** fi echo $ac_n "checking for mode_t""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "mode_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_mode_t=yes else --- 2872,2892 ---- fi echo $ac_n "checking for mode_t""... $ac_c" 1>&6 + echo "configure:2876: checking for mode_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include + #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_mode_t=yes else *************** *** 2694,2712 **** fi echo $ac_n "checking for pid_t""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "pid_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_pid_t=yes else --- 2905,2925 ---- fi echo $ac_n "checking for pid_t""... $ac_c" 1>&6 + echo "configure:2909: checking for pid_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include + #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_pid_t=yes else *************** *** 2725,2743 **** fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "size_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else --- 2938,2958 ---- fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 + echo "configure:2942: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include + #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ! egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else *************** *** 2756,2766 **** fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF --- 2971,2982 ---- fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 + echo "configure:2975: checking for uid_t in sys/types.h" >&5 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF *************** *** 2797,2816 **** #-------------------------------------------------------------------- echo $ac_n "checking for opendir""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_opendir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char opendir(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3013,3034 ---- #-------------------------------------------------------------------- echo $ac_n "checking for opendir""... $ac_c" 1>&6 + echo "configure:3017: checking for opendir" >&5 if eval "test \"`echo '$''{'ac_cv_func_opendir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char opendir(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 2823,2838 **** ; return 0; } EOF ! if { (eval echo configure:2827: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_opendir=yes" else rm -rf conftest* eval "ac_cv_func_opendir=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'opendir`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 3041,3058 ---- ; return 0; } EOF ! if { (eval echo configure:3045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_opendir=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_opendir=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'opendir`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 2854,2866 **** #-------------------------------------------------------------------- echo $ac_n "checking union wait""... $ac_c" 1>&6 cat > conftest.$ac_ext < #include ! int main() { return 0; } ! int t() { union wait x; WIFEXITED(x); /* Generates compiler error if WIFEXITED --- 3074,3086 ---- #-------------------------------------------------------------------- echo $ac_n "checking union wait""... $ac_c" 1>&6 + echo "configure:3078: checking union wait" >&5 cat > conftest.$ac_ext < #include ! int main() { union wait x; WIFEXITED(x); /* Generates compiler error if WIFEXITED *************** *** 2868,2882 **** ; return 0; } EOF ! if { (eval echo configure:2872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* tcl_ok=yes else rm -rf conftest* tcl_ok=no fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = no; then cat >> confdefs.h <<\EOF --- 3088,3103 ---- ; return 0; } EOF ! if { (eval echo configure:3092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* tcl_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=no fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = no; then cat >> confdefs.h <<\EOF *************** *** 2891,2902 **** #-------------------------------------------------------------------- echo $ac_n "checking matherr support""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct exception x; x.type = DOMAIN; --- 3112,3123 ---- #-------------------------------------------------------------------- echo $ac_n "checking matherr support""... $ac_c" 1>&6 + echo "configure:3116: checking matherr support" >&5 cat > conftest.$ac_ext < ! int main() { struct exception x; x.type = DOMAIN; *************** *** 2904,2918 **** ; return 0; } EOF ! if { (eval echo configure:2908: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=yes else rm -rf conftest* tcl_ok=no fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = yes; then cat >> confdefs.h <<\EOF --- 3125,3140 ---- ; return 0; } EOF ! if { (eval echo configure:3129: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=no fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = yes; then cat >> confdefs.h <<\EOF *************** *** 2930,2940 **** #-------------------------------------------------------------------- echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 3152,3163 ---- #-------------------------------------------------------------------- echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 + echo "configure:3156: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** *** 2947,2966 **** void (*signal ()) (); #endif ! int main() { return 0; } ! int t() { int i; ; return 0; } EOF ! if { (eval echo configure:2956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* - fi echo "$ac_t""$ac_cv_type_signal" 1>&6 --- 3170,3189 ---- void (*signal ()) (); #endif ! int main() { int i; ; return 0; } EOF ! if { (eval echo configure:3178: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 *************** *** 2970,2989 **** echo $ac_n "checking for vfork""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char vfork(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3193,3214 ---- echo $ac_n "checking for vfork""... $ac_c" 1>&6 + echo "configure:3197: checking for vfork" >&5 if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char vfork(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 2996,3011 **** ; return 0; } EOF ! if { (eval echo configure:3000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_vfork=yes" else rm -rf conftest* eval "ac_cv_func_vfork=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'vfork`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 --- 3221,3238 ---- ; return 0; } EOF ! if { (eval echo configure:3225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_vfork=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_vfork=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'vfork`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 *************** *** 3015,3026 **** fi if test "$tcl_ok" = 1; then ! echo $ac_n "checking vfork/signal bug""... $ac_c" 1>&6; if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext < --- 3242,3254 ---- fi if test "$tcl_ok" = 1; then ! echo $ac_n "checking vfork/signal bug""... $ac_c" 1>&6 ! echo "configure:3247: checking vfork/signal bug" >&5; if test "$cross_compiling" = yes; then tcl_ok=0 else ! cat > conftest.$ac_ext < *************** *** 3048,3061 **** exit((gotSignal) ? 0 : 1); } EOF ! { (eval echo configure:3052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then tcl_ok=1 else tcl_ok=0 fi - fi rm -fr conftest* if test "$tcl_ok" = 1; then echo "$ac_t""ok" 1>&6 else --- 3276,3293 ---- exit((gotSignal) ? 0 : 1); } EOF ! if { (eval echo configure:3280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then tcl_ok=1 else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* tcl_ok=0 fi rm -fr conftest* + fi + if test "$tcl_ok" = 1; then echo "$ac_t""ok" 1>&6 else *************** *** 3077,3096 **** #-------------------------------------------------------------------- echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_strncasecmp'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char strncasecmp(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3309,3330 ---- #-------------------------------------------------------------------- echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6 + echo "configure:3313: checking for strncasecmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_strncasecmp'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char strncasecmp(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3103,3118 **** ; return 0; } EOF ! if { (eval echo configure:3107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_strncasecmp=yes" else rm -rf conftest* eval "ac_cv_func_strncasecmp=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'strncasecmp`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 --- 3337,3354 ---- ; return 0; } EOF ! if { (eval echo configure:3341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_strncasecmp=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strncasecmp=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'strncasecmp`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_ok=1 *************** *** 3122,3149 **** fi if test "$tcl_ok" = 0; then ! echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 ! ac_lib_var=`echo socket_strncasecmp | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 3358,3389 ---- fi if test "$tcl_ok" = 0; then ! echo $ac_n "checking for strncasecmp in -lsocket""... $ac_c" 1>&6 ! echo "configure:3363: checking for strncasecmp in -lsocket" >&5 ! ac_lib_var=`echo socket'_'strncasecmp | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3161,3188 **** fi if test "$tcl_ok" = 0; then ! echo $ac_n "checking for -linet""... $ac_c" 1>&6 ! ac_lib_var=`echo inet_strncasecmp | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-linet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 3401,3432 ---- fi if test "$tcl_ok" = 0; then ! echo $ac_n "checking for strncasecmp in -linet""... $ac_c" 1>&6 ! echo "configure:3406: checking for strncasecmp in -linet" >&5 ! ac_lib_var=`echo inet'_'strncasecmp | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-linet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3215,3234 **** #-------------------------------------------------------------------- echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_BSDgettimeofday'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char BSDgettimeofday(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3459,3480 ---- #-------------------------------------------------------------------- echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6 + echo "configure:3463: checking for BSDgettimeofday" >&5 if eval "test \"`echo '$''{'ac_cv_func_BSDgettimeofday'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char BSDgettimeofday(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3241,3256 **** ; return 0; } EOF ! if { (eval echo configure:3245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_BSDgettimeofday=yes" else rm -rf conftest* eval "ac_cv_func_BSDgettimeofday=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'BSDgettimeofday`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF --- 3487,3504 ---- ; return 0; } EOF ! if { (eval echo configure:3491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_BSDgettimeofday=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_BSDgettimeofday=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'BSDgettimeofday`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF *************** *** 3260,3279 **** else echo "$ac_t""no" 1>&6 echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char gettimeofday(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3508,3529 ---- else echo "$ac_t""no" 1>&6 echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6 + echo "configure:3512: checking for gettimeofday" >&5 if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char gettimeofday(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3286,3301 **** ; return 0; } EOF ! if { (eval echo configure:3290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_gettimeofday=yes" else rm -rf conftest* eval "ac_cv_func_gettimeofday=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then echo "$ac_t""yes" 1>&6 : --- 3536,3553 ---- ; return 0; } EOF ! if { (eval echo configure:3540: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gettimeofday=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gettimeofday=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then echo "$ac_t""yes" 1>&6 : *************** *** 3310,3317 **** fi echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6 cat > conftest.$ac_ext < EOF --- 3562,3570 ---- fi echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6 + echo "configure:3566: checking for gettimeofday declaration" >&5 cat > conftest.$ac_ext < EOF *************** *** 3337,3364 **** # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- ! echo $ac_n "checking for -linet""... $ac_c" 1>&6 ! ac_lib_var=`echo inet_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-linet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 3590,3617 ---- # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- ! echo $ac_n "checking for main in -linet""... $ac_c" 1>&6 ! echo "configure:3595: checking for main in -linet" >&5 ! ac_lib_var=`echo inet'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-linet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3373,3396 **** echo "$ac_t""no" 1>&6 fi ! ac_safe=`echo "net/errno.h" | tr './\055' '___'` echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:3388: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 3626,3652 ---- echo "$ac_t""no" 1>&6 fi ! ac_safe=`echo "net/errno.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6 + echo "configure:3632: checking for net/errno.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:3642: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 3414,3426 **** #-------------------------------------------------------------------- echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$GCC" = yes; then # GCC predefines this symbol on systems where it applies. cat > conftest.$ac_ext <&6 + echo "configure:3674: checking whether char is unsigned" >&5 if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$GCC" = yes; then # GCC predefines this symbol on systems where it applies. cat > conftest.$ac_ext <&2; exit 1; } else ! cat > conftest.$ac_ext <&2; exit 1; } else ! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ! if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_char_unsigned=yes else ac_cv_c_char_unsigned=no fi - fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_c_char_unsigned" 1>&6 --- 3709,3727 ---- volatile char c = 255; exit(c < 0); } EOF ! if { (eval echo configure:3713: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null ! then ac_cv_c_char_unsigned=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* ac_cv_c_char_unsigned=no fi rm -fr conftest* fi + + fi fi echo "$ac_t""$ac_cv_c_char_unsigned" 1>&6 *************** *** 3472,3498 **** fi echo $ac_n "checking signed char declarations""... $ac_c" 1>&6 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=yes else rm -rf conftest* tcl_ok=no fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = yes; then cat >> confdefs.h <<\EOF --- 3733,3760 ---- fi echo $ac_n "checking signed char declarations""... $ac_c" 1>&6 + echo "configure:3737: checking signed char declarations" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=no fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = yes; then cat >> confdefs.h <<\EOF *************** *** 3521,3540 **** tcl_checkBoth=0 echo $ac_n "checking for connect""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char connect(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3783,3804 ---- tcl_checkBoth=0 echo $ac_n "checking for connect""... $ac_c" 1>&6 + echo "configure:3787: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char connect(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3547,3562 **** ; return 0; } EOF ! if { (eval echo configure:3551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_connect=yes" else rm -rf conftest* eval "ac_cv_func_connect=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_checkSocket=0 --- 3811,3828 ---- ; return 0; } EOF ! if { (eval echo configure:3815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_connect=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_connect=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_checkSocket=0 *************** *** 3566,3593 **** fi if test "$tcl_checkSocket" = 1; then ! echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 ! ac_lib_var=`echo socket_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 3832,3859 ---- fi if test "$tcl_checkSocket" = 1; then ! echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6 ! echo "configure:3837: checking for main in -lsocket" >&5 ! ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3608,3627 **** tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" echo $ac_n "checking for accept""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char accept(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3874,3895 ---- tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" echo $ac_n "checking for accept""... $ac_c" 1>&6 + echo "configure:3878: checking for accept" >&5 if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char accept(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3634,3649 **** ; return 0; } EOF ! if { (eval echo configure:3638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_accept=yes" else rm -rf conftest* eval "ac_cv_func_accept=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_checkNsl=0 --- 3902,3919 ---- ; return 0; } EOF ! if { (eval echo configure:3906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_accept=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_accept=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then echo "$ac_t""yes" 1>&6 tcl_checkNsl=0 *************** *** 3654,3673 **** fi echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ char gethostbyname(); ! int main() { return 0; } ! int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named --- 3924,3945 ---- fi echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 + echo "configure:3928: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ char gethostbyname(); ! int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named *************** *** 3680,3722 **** ; return 0; } EOF ! if { (eval echo configure:3684: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else rm -rf conftest* eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* - fi if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 ! echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 ! ac_lib_var=`echo nsl_main | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 3952,3996 ---- ; return 0; } EOF ! if { (eval echo configure:3956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* fi + if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 ! echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6 ! echo "configure:3974: checking for main in -lnsl" >&5 ! ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3790,3795 **** --- 4064,4070 ---- # there are a few systems, like Next, where this doesn't work. echo $ac_n "checking system version (for dynamic loading)""... $ac_c" 1>&6 + echo "configure:4068: checking system version (for dynamic loading)" >&5 if test -f /usr/lib/NextStep/software_version; then system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` else *************** *** 3814,3841 **** # Step 2: check for existence of -ldl library. This is needed because # Linux can use either -ldl or -ldld for dynamic loading. ! echo $ac_n "checking for -ldl""... $ac_c" 1>&6 ! ac_lib_var=`echo dl_dlopen | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 4089,4120 ---- # Step 2: check for existence of -ldl library. This is needed because # Linux can use either -ldl or -ldld for dynamic loading. ! echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 ! echo "configure:4094: checking for dlopen in -ldl" >&5 ! ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 3861,3867 **** ECHO_VERSION='`echo ${VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g ! CFLAGS_OPTIMIZE=-O case $system in AIX-4.[2-9]) SHLIB_CFLAGS="" --- 4140,4146 ---- ECHO_VERSION='`echo ${VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g ! CFLAGS_OPTIMIZE=$CFLAGS case $system in AIX-4.[2-9]) SHLIB_CFLAGS="" *************** *** 3908,3935 **** ;; HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) SHLIB_SUFFIX=".sl" ! echo $ac_n "checking for -ldld""... $ac_c" 1>&6 ! ac_lib_var=`echo dld_shl_load | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi --- 4187,4218 ---- ;; HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) SHLIB_SUFFIX=".sl" ! echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 ! echo "configure:4192: checking for shl_load in -ldld" >&5 ! ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi *************** *** 4011,4034 **** LD_FLAGS="-rdynamic" LD_SEARCH_FLAGS="" else ! ac_safe=`echo "dld.h" | tr './\055' '___'` echo $ac_n "checking for dld.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4026: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 4294,4320 ---- LD_FLAGS="-rdynamic" LD_SEARCH_FLAGS="" else ! ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dld.h""... $ac_c" 1>&6 + echo "configure:4300: checking for dld.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4310: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 4070,4093 **** ;; NetBSD-*|FreeBSD-*|OpenBSD-*) # Not available on all versions: check for include file. ! ac_safe=`echo "dlfcn.h" | tr './\055' '___'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4085: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 4356,4382 ---- ;; NetBSD-*|FreeBSD-*|OpenBSD-*) # Not available on all versions: check for include file. ! ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 + echo "configure:4362: checking for dlfcn.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4372: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 4258,4282 **** # that don't grok the -Bexport option. Test that it does. hold_ldflags=$LDFLAGS echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6 LDFLAGS="${LDFLAGS} -Wl,-Bexport" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* found=yes else rm -rf conftest* found=no fi rm -f conftest* - LDFLAGS=$hold_ldflags echo "$ac_t""$found" 1>&6 if test $found = yes; then --- 4547,4572 ---- # that don't grok the -Bexport option. Test that it does. hold_ldflags=$LDFLAGS echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6 + echo "configure:4551: checking for ld accepts -Bexport flag" >&5 LDFLAGS="${LDFLAGS} -Wl,-Bexport" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* found=yes else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* found=no fi rm -f conftest* LDFLAGS=$hold_ldflags echo "$ac_t""$found" 1>&6 if test $found = yes; then *************** *** 4309,4320 **** if test "x$DL_OBJS" = "xtclLoadAout.o" ; then echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct exec foo; unsigned long seek; --- 4599,4610 ---- if test "x$DL_OBJS" = "xtclLoadAout.o" ; then echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6 + echo "configure:4603: checking sys/exec.h" >&5 cat > conftest.$ac_ext < ! int main() { struct exec foo; unsigned long seek; *************** *** 4329,4343 **** ; return 0; } EOF ! if { (eval echo configure:4333: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else rm -rf conftest* tcl_ok=unusable fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF --- 4619,4634 ---- ; return 0; } EOF ! if { (eval echo configure:4623: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=unusable fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF *************** *** 4346,4357 **** else echo $ac_n "checking a.out.h""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct exec foo; unsigned long seek; --- 4637,4648 ---- else echo $ac_n "checking a.out.h""... $ac_c" 1>&6 + echo "configure:4641: checking a.out.h" >&5 cat > conftest.$ac_ext < ! int main() { struct exec foo; unsigned long seek; *************** *** 4366,4380 **** ; return 0; } EOF ! if { (eval echo configure:4370: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else rm -rf conftest* tcl_ok=unusable fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF --- 4657,4672 ---- ; return 0; } EOF ! if { (eval echo configure:4661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=unusable fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF *************** *** 4383,4394 **** else echo $ac_n "checking sys/exec_aout.h""... $ac_c" 1>&6 cat > conftest.$ac_ext < ! int main() { return 0; } ! int t() { struct exec foo; unsigned long seek; --- 4675,4686 ---- else echo $ac_n "checking sys/exec_aout.h""... $ac_c" 1>&6 + echo "configure:4679: checking sys/exec_aout.h" >&5 cat > conftest.$ac_ext < ! int main() { struct exec foo; unsigned long seek; *************** *** 4403,4417 **** ; return 0; } EOF ! if { (eval echo configure:4407: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else rm -rf conftest* tcl_ok=unusable fi rm -f conftest* - echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF --- 4695,4710 ---- ; return 0; } EOF ! if { (eval echo configure:4699: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* tcl_ok=usable else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* tcl_ok=unusable fi rm -f conftest* echo "$ac_t""$tcl_ok" 1>&6 if test $tcl_ok = usable; then cat >> confdefs.h <<\EOF *************** *** 4507,4530 **** for ac_hdr in sys/ioctl.h do ! ac_safe=`echo "$ac_hdr" | tr './\055' '___'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4522: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 4800,4826 ---- for ac_hdr in sys/ioctl.h do ! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 + echo "configure:4806: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 4532,4538 **** fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4559: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi --- 4840,4866 ---- for ac_hdr in sys/filio.h do ! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 + echo "configure:4846: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:4856: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi *************** *** 4569,4575 **** fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 + echo "configure:4883: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5 if test -f /usr/lib/NextStep/software_version; then system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` else *************** *** 4769,4779 **** # --recheck option to rerun configure. # EOF # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | ! sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ ! >> confcache if cmp -s $cache_file confcache; then : else --- 5069,5093 ---- # --recheck option to rerun configure. # EOF + # The following way of writing the cache mishandles newlines in values, + # but we know of no workaround that is simple, portable, and efficient. + # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | ! case `(ac_space=' '; set) 2>&1` in ! *ac_space=\ *) ! # `set' does not quote correctly, so add quotes (double-quote substitution ! # turns \\\\ into \\, and sed turns \\ into \). ! sed -n \ ! -e "s/'/'\\\\''/g" \ ! -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ! ;; ! *) ! # `set' quotes correctly as required by POSIX, so do not add quotes. ! sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ! ;; ! esac >> confcache if cmp -s $cache_file confcache; then : else *************** *** 4840,4846 **** echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ! echo "$CONFIG_STATUS generated by autoconf version 2.9" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; --- 5154,5160 ---- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ! echo "$CONFIG_STATUS generated by autoconf version 2.12" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *************** *** 4880,4885 **** --- 5194,5200 ---- s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g + s%@KANJI_FLAGS@%$KANJI_FLAGS%g s%@RANLIB@%$RANLIB%g s%@CC@%$CC%g s%@LIBOBJS@%$LIBOBJS%g *************** *** 4921,4940 **** CEOF EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ! # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in ! *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac ! # Adjust relative srcdir, etc. for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` --- 5236,5291 ---- CEOF EOF + + cat >> $CONFIG_STATUS <<\EOF + + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. + ac_file=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_cmds # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds="" + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi + EOF + cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ! # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in ! *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac ! # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` *************** *** 4958,4963 **** --- 5309,5315 ---- top_srcdir="$ac_dots$ac_given_srcdir" ;; esac + echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." *************** *** 4966,4980 **** # $configure_input" ;; *) ac_comsub= ;; esac sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g ! " -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file fi; done ! rm -f conftest.subs exit 0 EOF --- 5318,5338 ---- # $configure_input" ;; *) ac_comsub= ;; esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g ! " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done ! rm -f conftest.s* + EOF + cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/configure.in ./unix/configure.in *** ../../tcl8.0.5/unix/configure.in Tue Mar 9 15:51:26 1999 --- ./unix/configure.in Fri Mar 12 00:03:32 1999 *************** *** 2,15 **** dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT(../generic/tcl.h) ! # RCS: @(#) $Id: configure.in,v 1.28 1999/02/03 18:37:42 stanton Exp $ ! TCL_VERSION=8.0 TCL_MAJOR_VERSION=8 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL=".5" VERSION=${TCL_VERSION} if test "${prefix}" = "NONE"; then prefix=/usr/local fi --- 2,38 ---- dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT(../generic/tcl.h) ! # RCS: @(#) $Id: configure.in,v 1.10 1999/03/11 15:03:32 m-hirano Exp $ ! TCL_VERSION=8.0jp TCL_MAJOR_VERSION=8 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL=".5" VERSION=${TCL_VERSION} + # kanji stuff. + kanji="" + kanjiPath="" + KANJI_FLAGS="" + AC_ARG_ENABLE(kanji, [ --enable-kanji enable kanji features (default: on)], + [kanji=$enableval], [kanji=yes]) + if test "X$kanji" = "Xyes"; then + AC_MSG_RESULT(kanji features are enabled.) + KANJI_FLAGS="-DKANJI -DBUGFIX" + else + AC_MSG_RESULT(kanji features are disabled.) + fi + AC_ARG_ENABLE(kanji-filename, [ --enable-kanji-filename enable kanji filename feature (default: off)], + [kanjiPath=$enableval], [kanjiPath=no]) + if test "X$kanjiPath" = "Xyes"; then + AC_MSG_RESULT(kanji filename feature is enabled.) + KANJI_FLAGS="$KANJI_FLAGS -DHANDLE_KANJI_PATHNAME" + else + AC_MSG_RESULT(kanji filename feature is disabled.) + fi + + AC_SUBST(KANJI_FLAGS) + if test "${prefix}" = "NONE"; then prefix=/usr/local fi *************** *** 683,689 **** ECHO_VERSION='`echo ${VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g ! CFLAGS_OPTIMIZE=-O case $system in AIX-4.[[2-9]]) SHLIB_CFLAGS="" --- 706,712 ---- ECHO_VERSION='`echo ${VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g ! CFLAGS_OPTIMIZE=$CFLAGS case $system in AIX-4.[[2-9]]) SHLIB_CFLAGS="" diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/dltest/configure ./unix/dltest/configure *** ../../tcl8.0.5/unix/dltest/configure Tue Mar 9 15:50:20 1999 --- ./unix/dltest/configure Fri Mar 12 00:19:11 1999 *************** *** 1,7 **** #! /bin/sh # Guess values for system-dependent variables and create Makefiles. ! # Generated automatically using autoconf version 2.9 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation --- 1,7 ---- #! /bin/sh # Guess values for system-dependent variables and create Makefiles. ! # Generated automatically using autoconf version 2.12 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation *************** *** 49,54 **** --- 49,56 ---- # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= + # Maximum number of lines to put in a shell here document. + ac_max_here_lines=12 ac_prev= for ac_option *************** *** 330,336 **** verbose=yes ;; -version | --version | --versio | --versi | --vers) ! echo "configure generated by autoconf version 2.9" exit 0 ;; -with-* | --with-*) --- 332,338 ---- verbose=yes ;; -version | --version | --versio | --versi | --vers) ! echo "configure generated by autoconf version 2.12" exit 0 ;; -with-* | --with-*) *************** *** 432,442 **** done # NLS nuisances. ! # Only set LANG and LC_ALL to C if already set. ! # These must not be set unconditionally because not all systems understand ! # e.g. LANG=C (notably SCO). ! if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h --- 434,447 ---- done # NLS nuisances. ! # Only set these to C if already set. These must not be set unconditionally ! # because not all systems understand e.g. LANG=C (notably SCO). ! # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi + if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi + if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi + if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h *************** *** 498,503 **** --- 503,509 ---- ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' + cross_compiling=$ac_cv_prog_cc_cross if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. *************** *** 555,565 **** # --recheck option to rerun configure. # EOF # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | ! sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ ! >> confcache if cmp -s $cache_file confcache; then : else --- 561,585 ---- # --recheck option to rerun configure. # EOF + # The following way of writing the cache mishandles newlines in values, + # but we know of no workaround that is simple, portable, and efficient. + # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | ! case `(ac_space=' '; set) 2>&1` in ! *ac_space=\ *) ! # `set' does not quote correctly, so add quotes (double-quote substitution ! # turns \\\\ into \\, and sed turns \\ into \). ! sed -n \ ! -e "s/'/'\\\\''/g" \ ! -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ! ;; ! *) ! # `set' quotes correctly as required by POSIX, so do not add quotes. ! sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ! ;; ! esac >> confcache if cmp -s $cache_file confcache; then : else *************** *** 626,632 **** echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ! echo "$CONFIG_STATUS generated by autoconf version 2.9" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; --- 646,652 ---- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ! echo "$CONFIG_STATUS generated by autoconf version 2.12" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *************** *** 679,698 **** CEOF EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ! # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in ! *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac ! # Adjust relative srcdir, etc. for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` --- 699,754 ---- CEOF EOF + + cat >> $CONFIG_STATUS <<\EOF + + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. + ac_file=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_cmds # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds="" + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi + EOF + cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ! # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in ! *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac ! # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` *************** *** 716,721 **** --- 772,778 ---- top_srcdir="$ac_dots$ac_given_srcdir" ;; esac + echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." *************** *** 724,738 **** # $configure_input" ;; *) ac_comsub= ;; esac sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g ! " -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file fi; done ! rm -f conftest.subs exit 0 EOF --- 781,801 ---- # $configure_input" ;; *) ac_comsub= ;; esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g ! " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done ! rm -f conftest.s* + EOF + cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF Only in ../../tcl8.0.5/unix: porting.old diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/tclConfig.sh.in ./unix/tclConfig.sh.in *** ../../tcl8.0.5/unix/tclConfig.sh.in Tue Mar 9 15:51:26 1999 --- ./unix/tclConfig.sh.in Mon Mar 15 14:07:11 1999 *************** *** 21,27 **** TCL_CC='@CC@' # -D flags for use with the C compiler. ! TCL_DEFS='@DEFS@' # If TCL was built with debugging symbols, generated libraries contain # this string at the end of the library name (before the extension). --- 21,29 ---- TCL_CC='@CC@' # -D flags for use with the C compiler. ! TCL_DEFS='@DEFS@ @KANJI_FLAGS@ @CPPFLAGS@' ! ! TCL_KANJI_DEFS='@KANJI_FLAGS@' # If TCL was built with debugging symbols, generated libraries contain # this string at the end of the library name (before the extension). diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/tclUnixChan.c ./unix/tclUnixChan.c *** ../../tcl8.0.5/unix/tclUnixChan.c Wed Feb 3 09:51:20 1999 --- ./unix/tclUnixChan.c Fri Mar 12 00:03:36 1999 *************** *** 455,461 **** --- 455,465 ---- FileState *fsPtr = (FileState *) instanceData; int newLoc; + #ifdef BUGFIX + newLoc = (int)lseek(fsPtr->fd, (off_t)offset, mode); + #else newLoc = lseek(fsPtr->fd, offset, mode); + #endif /* BUGFIX */ *errorCodePtr = (newLoc == -1) ? errno : 0; return newLoc; *************** *** 1313,1318 **** --- 1317,1325 ---- { FileState *fsPtr; char channelName[20]; + #ifdef BUGFIX + Tcl_ChannelType *channelTypePtr = &fileChannelType; + #endif /* BUGFIX */ int fd = (int) handle; if (mode == 0) { *************** *** 1336,1345 **** fsPtr->nextPtr = firstFilePtr; firstFilePtr = fsPtr; fsPtr->fd = fd; fsPtr->validMask = mode | TCL_EXCEPTION; fsPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName, (ClientData) fsPtr, mode); ! return fsPtr->channel; } --- 1343,1361 ---- fsPtr->nextPtr = firstFilePtr; firstFilePtr = fsPtr; fsPtr->fd = fd; + #ifdef BUGFIX + if (isatty(fd)) { + channelTypePtr = &ttyChannelType; + } + #endif /* BUGFIX */ fsPtr->validMask = mode | TCL_EXCEPTION; + #ifdef BUGFIX + fsPtr->channel = Tcl_CreateChannel(channelTypePtr, channelName, + (ClientData) fsPtr, mode); + #else fsPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName, (ClientData) fsPtr, mode); ! #endif /* BUGFIX */ return fsPtr->channel; } *************** *** 1508,1514 **** --- 1524,1534 ---- if (state != 0) { return -1; } + #ifdef BUGFIX + bytesRead = recv(statePtr->fd, buf, (size_t)bufSize, 0); + #else bytesRead = recv(statePtr->fd, buf, bufSize, 0); + #endif /* BUGFIX */ if (bytesRead > -1) { return bytesRead; } *************** *** 1561,1567 **** --- 1581,1591 ---- if (state != 0) { return -1; } + #ifdef BUGFIX + written = send(statePtr->fd, buf, (size_t)toWrite, 0); + #else written = send(statePtr->fd, buf, toWrite, 0); + #endif /* BUGFIX */ if (written > -1) { return written; } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/tclUnixFCmd.c ./unix/tclUnixFCmd.c *** ../../tcl8.0.5/unix/tclUnixFCmd.c Tue Sep 15 03:40:17 1998 --- ./unix/tclUnixFCmd.c Fri Mar 12 00:03:37 1999 *************** *** 942,948 **** --- 942,952 ---- groupPtr = getgrgid(statBuf.st_gid); if (groupPtr == NULL) { + #ifdef BUGFIX + *attributePtrPtr = Tcl_NewIntObj((int)statBuf.st_gid); + #else *attributePtrPtr = Tcl_NewIntObj(statBuf.st_gid); + #endif /* BUGFIX */ } else { *attributePtrPtr = Tcl_NewStringObj(groupPtr->gr_name, -1); } *************** *** 986,992 **** --- 990,1000 ---- pwPtr = getpwuid(statBuf.st_uid); if (pwPtr == NULL) { + #ifdef BUGFIX + *attributePtrPtr = Tcl_NewIntObj((int)statBuf.st_uid); + #else *attributePtrPtr = Tcl_NewIntObj(statBuf.st_uid); + #endif /* BUGFIX */ } else { *attributePtrPtr = Tcl_NewStringObj(pwPtr->pw_name, -1); } *************** *** 1028,1034 **** --- 1036,1046 ---- return TCL_ERROR; } + #ifdef BUGFIX + sprintf(returnString, "%0#5lo", (unsigned long int)(statBuf.st_mode & 0x00007FFF)); + #else sprintf(returnString, "%0#5lo", (statBuf.st_mode & 0x00007FFF)); + #endif /* BUGFIX */ *attributePtrPtr = Tcl_NewStringObj(returnString, -1); *************** *** 1080,1086 **** --- 1092,1102 ---- groupNumber = (gid_t) placeHolder; } + #ifdef BUGFIX + if (chown(fileName, (uid_t)-1, groupNumber) != 0) { + #else if (chown(fileName, -1, groupNumber) != 0) { + #endif /* BUGFIX */ endgrent(); Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "could not set group for file \"", fileName, "\": ", *************** *** 1135,1141 **** --- 1151,1161 ---- userNumber = (uid_t) placeHolder; } + #ifdef BUGFIX + if (chown(fileName, userNumber, (gid_t)-1) != 0) { + #else if (chown(fileName, userNumber, -1) != 0) { + #endif /* BUGFIX */ Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "could not set owner for file \"", fileName, "\": ", Tcl_PosixError(interp), (char *) NULL); diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/tclUnixFile.c ./unix/tclUnixFile.c *** ../../tcl8.0.5/unix/tclUnixFile.c Tue Sep 15 03:40:17 1998 --- ./unix/tclUnixFile.c Tue Nov 23 11:02:22 1999 *************** *** 236,241 **** --- 236,247 ---- name = argv0; for (p = name; *p != 0; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + continue; + } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '/') { /* * The name contains a slash, so use the name directly *************** *** 274,279 **** --- 280,291 ---- } name = p; while ((*p != ':') && (*p != 0)) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL); + continue; + } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; } Tcl_DStringSetLength(&buffer, 0); *************** *** 420,425 **** --- 432,445 ---- int matchHidden; int result = TCL_OK; int baseLength = Tcl_DStringLength(dirPtr); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + wchar *ws = NULL; + int dLen; + int dWsLen = 0; + int dirKanjiCode = TCL_ANY; + wchar *wPattern = NULL; + int wpLen = 0; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ /* * Make sure that the directory part of the name really is a *************** *** 488,497 **** --- 508,528 ---- if (*tail == '\0') { tail = NULL; } else { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*tail))) { + tail += Tcl_KanjiSkip(tail, NULL, NULL) - 1; + } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ tail++; } savedChar = *patternEnd; *patternEnd = '\0'; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + (void)Tcl_KanjiString(interp, pattern, NULL, &dirKanjiCode); + wpLen = Tcl_KanjiEncode(dirKanjiCode, (unsigned char *)pattern, NULL); + wPattern = (wchar *)ckalloc((wpLen + 1) * sizeof(wchar)); + (void)Tcl_KanjiEncode(dirKanjiCode, (unsigned char *)pattern, wPattern); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ while (1) { entryPtr = readdir(d); *************** *** 515,521 **** --- 546,567 ---- * the file to the result. */ + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + (void)Tcl_KanjiString(interp, entryPtr->d_name, NULL, &dirKanjiCode); + dLen = Tcl_KanjiEncode(dirKanjiCode, entryPtr->d_name, NULL); + if (dWsLen < dLen) { + dWsLen = dLen; + if (ws != NULL) { + ckfree((char *)ws); + } + ws = (wchar *)ckalloc((dWsLen + 1) * sizeof(wchar)); + } + (void)Tcl_KanjiEncode(dirKanjiCode, entryPtr->d_name, ws); + + if (Tcl_WStringMatch(ws, wPattern)) { + #else if (Tcl_StringMatch(entryPtr->d_name, pattern)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_DStringSetLength(dirPtr, baseLength); Tcl_DStringAppend(dirPtr, entryPtr->d_name, -1); if (tail == NULL) { *************** *** 531,536 **** --- 577,590 ---- } } *patternEnd = savedChar; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (wPattern != NULL) { + (void)ckfree((char *)wPattern); + } + if (ws != NULL) { + (void)ckfree((char *)ws); + } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ closedir(d); return result; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/unix/tclUnixPipe.c ./unix/tclUnixPipe.c *** ../../tcl8.0.5/unix/tclUnixPipe.c Tue Sep 15 03:40:17 1998 --- ./unix/tclUnixPipe.c Fri Mar 12 00:03:39 1999 *************** *** 143,149 **** --- 143,153 ---- */ if (mode & O_WRONLY) { + #ifdef BUGFIX + (void)lseek(fd, (off_t)0, SEEK_END); + #else lseek(fd, 0, SEEK_END); + #endif /* BUGFIX */ } /* *************** *** 199,205 **** --- 203,213 ---- return NULL; } } + #ifdef BUGFIX + (void)lseek(fd, (off_t)0, SEEK_SET); + #else lseek(fd, 0, SEEK_SET); + #endif /* BUGFIX */ } if (namePtr != NULL) { Tcl_DStringAppend(namePtr, fileName, -1); diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/makefile.bc ./win/makefile.bc *** ../../tcl8.0.5/win/makefile.bc Tue Sep 15 03:40:19 1998 --- ./win/makefile.bc Fri Mar 12 00:04:00 1999 *************** *** 26,31 **** --- 26,32 ---- #DEBUGDEFINES =TCL_MEM_DEBUG;TCL_COMPILE_STATS #DEBUGDEFINES =TCL_MEM_DEBUG;TCL_COMPILE_DEBUG;TCL_COMPILE_STATS + KANJI_FLAGS = -DKANJI -DBUGFIX -DHANDLE_KANJI_PATHNAME ###################################################################### # Do not modify below this line *************** *** 33,39 **** STACKSIZE = 1f0001 ! VERSION = 80 TCLLIB = tcl$(VERSION).lib TCLDLL = tcl$(VERSION).dll --- 34,40 ---- STACKSIZE = 1f0001 ! VERSION = 80jp TCLLIB = tcl$(VERSION).lib TCLDLL = tcl$(VERSION).dll *************** *** 114,120 **** $(TMPDIR)\tclWinNotify.obj \ $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ ! $(TMPDIR)\tclWinTime.obj cc32 = $(TOOLS)\bin\bcc32.exe link32 = $(TOOLS)\bin\tlink32.exe --- 115,122 ---- $(TMPDIR)\tclWinNotify.obj \ $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ ! $(TMPDIR)\tclWinTime.obj \ ! $(TMPDIR)\tclKanjiUtil.obj cc32 = $(TOOLS)\bin\bcc32.exe link32 = $(TOOLS)\bin\tlink32.exe *************** *** 165,171 **** !endif DEFINES = MT;_RTLDLL;$(DEBUGDEFINES) ! PROJECTCCFLAGS = $(DEBUGCCFLAGS) -w-par -w-stu # --- 167,173 ---- !endif DEFINES = MT;_RTLDLL;$(DEBUGDEFINES) ! PROJECTCCFLAGS = $(DEBUGCCFLAGS) -w-par -w-stu $(KANJI_FLAGS) # diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/makefile.vc ./win/makefile.vc *** ../../tcl8.0.5/win/makefile.vc Wed Feb 3 11:59:17 1999 --- ./win/makefile.vc Fri Nov 26 21:08:02 1999 *************** *** 39,45 **** TOOLS32_rc = c:\program files\devstudio\sharedide TOOLS16 = c:\msvc ! INSTALLDIR = c:\programa files\Tcl # Set this to the appropriate value of /MACHINE: for your platform MACHINE = IX86 --- 39,45 ---- TOOLS32_rc = c:\program files\devstudio\sharedide TOOLS16 = c:\msvc ! INSTALLDIR = c:\progra~1\Tcl # Set this to the appropriate value of /MACHINE: for your platform MACHINE = IX86 *************** *** 62,74 **** #DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS #DEBUGDEFINES = -DUSE_NATIVEMALLOC ###################################################################### # Do not modify below this line ###################################################################### NAMEPREFIX = tcl ! DOTVERSION = 8.0 ! VERSION = 80 BINROOT = . !IF "$(NODEBUG)" == "1" --- 62,76 ---- #DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS #DEBUGDEFINES = -DUSE_NATIVEMALLOC + KANJI_FLAGS = -DKANJI -DBUGFIX -DHANDLE_KANJI_PATHNAME + ###################################################################### # Do not modify below this line ###################################################################### NAMEPREFIX = tcl ! DOTVERSION = 8.0jp ! VERSION = 80jp BINROOT = . !IF "$(NODEBUG)" == "1" *************** *** 174,180 **** $(TMPDIR)\tclWinNotify.obj \ $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ ! $(TMPDIR)\tclWinTime.obj cc32 = "$(TOOLS32)\bin\cl.exe" link32 = "$(TOOLS32)\bin\link.exe" --- 176,183 ---- $(TMPDIR)\tclWinNotify.obj \ $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ ! $(TMPDIR)\tclWinTime.obj \ ! $(TMPDIR)\tclKanjiUtil.obj cc32 = "$(TOOLS32)\bin\cl.exe" link32 = "$(TOOLS32)\bin\link.exe" *************** *** 251,257 **** !ENDIF # declarations common to all compiler options ! ccommon = -c -W3 -nologo -YX -Fp$(TMPDIR)\ -Dtry=__try -Dexcept=__except !IF "$(MACHINE)" == "IX86" cflags = $(ccommon) -D_X86_=1 --- 254,260 ---- !ENDIF # declarations common to all compiler options ! ccommon = -c -W3 -nologo -YX -Fp$(TMPDIR)\ -Dtry=__try -Dexcept=__except $(KANJI_FLAGS) !IF "$(MACHINE)" == "IX86" cflags = $(ccommon) -D_X86_=1 *************** *** 471,476 **** --- 474,480 ---- {$(WINDIR)}.rc{$(TMPDIR)}.res: $(rc32) -fo $@ -r -i $(GENERICDIR) -i $(WINDIR) -D__WIN32__ \ + $(KANJI_FLAGS) \ $(TCL_DEFINES) $< clean: diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/mkd.bat ./win/mkd.bat *** ../../tcl8.0.5/win/mkd.bat Thu Oct 1 05:19:35 1998 --- ./win/mkd.bat Fri Mar 12 00:04:01 1999 *************** *** 1,21 **** ! @echo off ! rem RCS: @(#) $Id: mkd.bat,v 1.4 1998/09/30 20:19:35 escoffon Exp $ ! ! if exist %1\tag.txt goto end ! ! if "%OS%" == "Windows_NT" goto winnt ! ! md %1 ! if errorlevel 1 goto end ! ! goto success ! ! :winnt ! md %1 ! if errorlevel 1 goto end ! ! :success ! echo TAG >%1\tag.txt ! echo created directory %1 ! ! :end --- 1,21 ---- ! @echo off ! rem RCS: @(#) $Id: mkd.bat,v 1.4 1999/03/11 15:04:01 m-hirano Exp $ ! ! if exist %1\tag.txt goto end ! ! if "%OS%" == "Windows_NT" goto winnt ! ! md %1 ! if errorlevel 1 goto end ! ! goto success ! ! :winnt ! md %1 ! if errorlevel 1 goto end ! ! :success ! echo TAG >%1\tag.txt ! echo created directory %1 ! ! :end diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/pkgIndex.tcl ./win/pkgIndex.tcl *** ../../tcl8.0.5/win/pkgIndex.tcl Tue Sep 15 03:40:19 1998 --- ./win/pkgIndex.tcl Mon Mar 15 14:07:13 1999 *************** *** 6,11 **** # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # ! # RCS: @(#) $Id: pkgIndex.tcl,v 1.2 1998/09/14 18:40:19 stanton Exp $ ! package ifneeded registry 1.0 [list tclPkgSetup $dir registry 1.0 {{tclreg80.dll load registry}}] --- 6,11 ---- # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # ! # RCS: @(#) $Id: pkgIndex.tcl,v 1.5 1999/03/12 09:50:46 m-hirano Exp $ ! package ifneeded registry 1.0 [list tclPkgSetup $dir registry 1.0 {{tclreg80jp.dll load registry}}] diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/rmd.bat ./win/rmd.bat *** ../../tcl8.0.5/win/rmd.bat Thu Oct 1 05:19:46 1998 --- ./win/rmd.bat Fri Mar 12 00:04:01 1999 *************** *** 1,25 **** ! @echo off ! rem RCS: @(#) $Id: rmd.bat,v 1.4 1998/09/30 20:19:46 escoffon Exp $ ! ! if not exist %1\tag.txt goto end ! ! echo Removing directory %1 ! ! if "%OS%" == "Windows_NT" goto winnt ! ! cd %1 ! if errorlevel 1 goto end ! del *.* ! cd .. ! rmdir %1 ! if errorlevel 1 goto end ! goto success ! ! :winnt ! rmdir %1 /s /q ! if errorlevel 1 goto end ! ! :success ! echo deleted directory %1 ! ! :end --- 1,25 ---- ! @echo off ! rem RCS: @(#) $Id: rmd.bat,v 1.4 1999/03/11 15:04:01 m-hirano Exp $ ! ! if not exist %1\tag.txt goto end ! ! echo Removing directory %1 ! ! if "%OS%" == "Windows_NT" goto winnt ! ! cd %1 ! if errorlevel 1 goto end ! del *.* ! cd .. ! rmdir %1 ! if errorlevel 1 goto end ! goto success ! ! :winnt ! rmdir %1 /s /q ! if errorlevel 1 goto end ! ! :success ! echo deleted directory %1 ! ! :end diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tcl.rc ./win/tcl.rc *** ../../tcl8.0.5/win/tcl.rc Tue Sep 15 03:40:19 1998 --- ./win/tcl.rc Fri Nov 26 21:08:02 1999 *************** *** 5,10 **** --- 5,16 ---- #define RESOURCE_INCLUDED #include + #ifdef KANJI + #include + #include + LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + #pragma code_page(932) + #endif // KANJI VS_VERSION_INFO VERSIONINFO FILEVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL *************** *** 17,24 **** --- 23,42 ---- BEGIN BLOCK "StringFileInfo" BEGIN + #ifdef KANJI + BLOCK "041104b0" + #else BLOCK "040904b0" + #endif // KANJI BEGIN + #ifdef KANJI + VALUE "FileDescription", "日本語版 Tcl DLL\0" + VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) "jp.dll\0" + VALUE "FileVersion", TCL_PATCH_LEVEL " (jp1.7)\0" + VALUE "ProductName", "Tcl " TCL_VERSION " 日本語版 for Windows\0" + VALUE "InternalName", "Tcl " TCL_PATCH_LEVEL " jp 1.7 Win\0" + VALUE "ProductVersion", TCL_PATCH_LEVEL " (jp1.7)\0" + #else VALUE "FileDescription", "Tcl DLL\0" VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".dll\0" VALUE "CompanyName", "Sun Microsystems, Inc\0" *************** *** 26,42 **** VALUE "LegalCopyright", "Copyright \251 1995-1997\0" VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0" VALUE "ProductVersion", TCL_PATCH_LEVEL END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END - - - - - - - --- 44,58 ---- VALUE "LegalCopyright", "Copyright \251 1995-1997\0" VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0" VALUE "ProductVersion", TCL_PATCH_LEVEL + #endif // KANJI END END BLOCK "VarFileInfo" BEGIN + #ifdef KANJI + VALUE "Translation", 0x411, 1200 + #else VALUE "Translation", 0x409, 1200 + #endif // KANJI END END diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclAppInit.c ./win/tclAppInit.c *** ../../tcl8.0.5/win/tclAppInit.c Wed Feb 3 11:58:26 1999 --- ./win/tclAppInit.c Fri Mar 12 00:04:02 1999 *************** *** 68,78 **** --- 68,83 ---- GetModuleFileName(NULL, buffer, sizeof(buffer)); argv[0] = buffer; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + for (p = Tcl_KStrchr(buffer, '\\'); p != NULL; p = Tcl_KStrchr(p, '\\')) + *p = '/'; + #else for (p = buffer; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_Main(argc, argv, Tcl_AppInit); return 0; /* Needed only to prevent compiler warning. */ *************** *** 184,189 **** --- 189,198 ---- char *cmdLine, *p, *arg, *argSpace; char **argv; int argc, size, inquote, copy, slashes; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + char *pend; + int klen; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ cmdLine = GetCommandLine(); *************** *** 211,219 **** --- 220,235 ---- size--; p = cmdLine; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + pend = p + strlen(p); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ for (argc = 0; argc < size; argc++) { argv[argc] = arg = argSpace; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + while (isspace((unsigned char)*p)) { + #else while (isspace(*p)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; } if (*p == '\0') { *************** *** 247,260 **** --- 263,291 ---- slashes--; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((*p == '\0') || (!inquote && isspace((unsigned char)*p))) { + #else if ((*p == '\0') || (!inquote && isspace(*p))) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ break; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + klen = Tcl_KanjiLength(p, pend, TCL_SJIS); + if (klen == 0) + klen = 1; + if (copy) { + memcpy((VOID *)arg, (VOID *)p, klen); + arg += klen; + } + p += klen; + #else if (copy != 0) { *arg = *p; arg++; } p++; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ } *arg = '\0'; argSpace = arg + 1; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclWinFCmd.c ./win/tclWinFCmd.c *** ../../tcl8.0.5/win/tclWinFCmd.c Tue Sep 15 03:40:19 1998 --- ./win/tclWinFCmd.c Fri Mar 12 00:04:04 1999 *************** *** 703,709 **** --- 703,714 ---- Tcl_DStringInit(&buffer); find = Tcl_DStringAppend(&buffer, path, -1); len = Tcl_DStringLength(&buffer); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((len > 0) && ((find[len - 1] != '\\') + || Tcl_KanjiEnd(find, find + len, NULL))) { + #else if ((len > 0) && (find[len - 1] != '\\')) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_DStringAppend(&buffer, "\\", 1); } find = Tcl_DStringAppend(&buffer, "*.*", 3); *************** *** 829,835 **** --- 834,845 ---- */ sourceLen = sourceLenOriginal; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((sourceLen > 0) && ((source[sourceLen - 1] != '\\') + || Tcl_KanjiEnd(source, source + sourceLen, NULL))) { + #else if ((sourceLen > 0) && (source[sourceLen - 1] != '\\')) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_DStringAppend(sourcePtr, "\\", 1); sourceLen++; } *************** *** 854,860 **** --- 864,875 ---- if (targetPtr != NULL) { targetLen = targetLenOriginal; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((targetLen > 0) && ((target[targetLen - 1] != '\\') + || Tcl_KanjiEnd(target, target + targetLen, NULL))) { + #else if ((targetLen > 0) && (target[targetLen - 1] != '\\')) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ target = Tcl_DStringAppend(targetPtr, "\\", 1); targetLen++; } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclWinFile.c ./win/tclWinFile.c *** ../../tcl8.0.5/win/tclWinFile.c Tue Sep 15 03:40:20 1998 --- ./win/tclWinFile.c Fri Mar 12 00:04:04 1999 *************** *** 104,111 **** --- 104,117 ---- * point to a location in pattern. */ { char drivePattern[4] = "?:\\"; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + wchar wdata[MAX_PATH]; + wchar *newPattern, *wp; + char *p, *dir, *root, c; + #else char *newPattern, *p, *dir, *root, c; char *src, *dest; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ int length, matchDotFiles; int result = TCL_OK; int baseLength = Tcl_DStringLength(dirPtr); *************** *** 133,140 **** --- 139,151 ---- *p = '\\'; } } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if ((*(p - 1) != '\\' && *(p - 1) != ':') + || Tcl_KanjiEnd(Tcl_DStringValue(&buffer), p, NULL)) { + #else p--; if (*p != '\\' && *p != ':') { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_DStringAppend(&buffer, "\\", 1); } dir = Tcl_DStringValue(&buffer); *************** *** 178,185 **** --- 189,201 ---- found = GetVolumeInformation(root, NULL, 0, NULL, NULL, &volFlags, NULL, 0); } else if (dir[1] == '\\') { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + p = Tcl_KStrchr(dir+2, '\\'); + p = Tcl_KStrchr(p+1, '\\'); + #else p = strchr(dir+2, '\\'); p = strchr(p+1, '\\'); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ p++; c = *p; *p = 0; *************** *** 206,216 **** --- 222,245 ---- */ length = tail - pattern; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + p = ckalloc(length+1); + strncpy(p, pattern, length); + p[length] = '\0'; + newPattern = (wchar *)ckalloc((length+1) * sizeof(wchar)); + Tcl_EncodeSJIS(p, newPattern); + for (wp = newPattern; *wp != 0; wp++) { + if (isascii(*wp)) + *wp = (char) tolower(*wp); + } + ckfree(p); + #else /* HANDLE_KANJI_PATHNAME */ newPattern = ckalloc(length+1); for (src = pattern, dest = newPattern; src < tail; src++, dest++) { *dest = (char) tolower(*src); } *dest = '\0'; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ /* * We need to check all files in the directory, so append a *.* *************** *** 232,238 **** --- 261,271 ---- Tcl_ResetResult(interp); Tcl_AppendResult(interp, "couldn't read directory \"", dirPtr->string, "\": ", Tcl_PosixError(interp), (char *) NULL); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + ckfree((char *)newPattern); + #else ckfree(newPattern); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ return TCL_ERROR; } *************** *** 247,252 **** --- 280,289 ---- if (*tail == '\0') { tail = NULL; } else { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*tail))) + tail += Tcl_KanjiSkip(tail, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ tail++; } *************** *** 289,298 **** --- 326,344 ---- matchResult = NULL; Tcl_DStringSetLength(&buffer, 0); Tcl_DStringAppend(&buffer, data.cFileName, -1); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + Tcl_EncodeSJIS(buffer.string, wdata); + for (wp = wdata; *wp != 0; wp++) { + if (isascii(*wp)) + *wp = (wchar) tolower(*wp); + } + if (Tcl_WStringMatch(wdata, newPattern)) { + #else /* HANDLE_KANJI_PATHNAME */ for (p = buffer.string; *p != '\0'; p++) { *p = (char) tolower(*p); } if (Tcl_StringMatch(buffer.string, newPattern)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (volFlags & FS_CASE_IS_PRESERVED) { matchResult = data.cFileName; } else { *************** *** 329,335 **** --- 375,385 ---- Tcl_DStringFree(&buffer); FindClose(handle); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + ckfree((char *)newPattern); + #else ckfree(newPattern); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ return result; } *************** *** 432,437 **** --- 482,492 ---- */ for (p = bufPtr; *p != '\0'; p++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '\\') { *p = '/'; } diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclWinInit.c ./win/tclWinInit.c *** ../../tcl8.0.5/win/tclWinInit.c Wed Feb 3 03:36:31 1999 --- ./win/tclWinInit.c Fri Mar 12 00:04:05 1999 *************** *** 161,167 **** --- 161,171 ---- Tcl_SetVar(interp, "tclDefaultLibrary", Tcl_DStringValue(&ds), TCL_GLOBAL_ONLY); argv[0] = Tcl_GetVar(interp, "tclDefaultLibrary", TCL_GLOBAL_ONLY); + #ifdef KANJI + argv[1] = "lib/tcl" TCL_VERSION "jp"; + #else argv[1] = "lib/tcl" TCL_VERSION; + #endif argv[2] = NULL; Tcl_DStringSetLength(&ds, 0); Tcl_SetVar(interp, "tclDefaultLibrary", *************** *** 198,203 **** --- 202,212 ---- if (*p) { argv[argc++] = p; while (*p) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*p))) { + p += Tcl_KanjiSkip(p, NULL, NULL) - 1; + } else + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (*p == '\\') { *p = '/'; } *************** *** 309,315 **** --- 318,333 ---- return (TCL_ERROR); }; } + #ifdef KANJI + /* trick to find init.tcl without registry value */ + return(Tcl_VarEval(interp, + "append tcl_version jp\n", + initScript, + "\nset tcl_version [string range $tcl_version 0 [expr [string length $tcl_version] - 3]]", + NULL)); + #else return(Tcl_Eval(interp, initScript)); + #endif /* KANJI */ } /* diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclWinPipe.c ./win/tclWinPipe.c *** ../../tcl8.0.5/win/tclWinPipe.c Tue Sep 15 03:40:20 1998 --- ./win/tclWinPipe.c Fri Nov 26 21:08:03 1999 *************** *** 1251,1258 **** --- 1251,1263 ---- startInfo.dwFlags |= STARTF_USESHOWWINDOW; createFlags = CREATE_NEW_CONSOLE; } + #ifdef KANJI + Tcl_DStringAppend(&cmdLine, "tclpip" STRINGIFY(TCL_MAJOR_VERSION) + STRINGIFY(TCL_MINOR_VERSION) "jp.dll ", -1); + #else Tcl_DStringAppend(&cmdLine, "tclpip" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".dll ", -1); + #endif /* KANJI */ } } *************** *** 1565,1571 **** --- 1570,1580 ---- quote = 1; } else { for (start = argv[i]; *start != '\0'; start++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (isspace(UCHAR(*start))) { + #else if (isspace(*start)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ quote = 1; break; } *************** *** 1582,1587 **** --- 1591,1600 ---- Tcl_DStringAppend(linePtr, start, special - start); start = special; while (1) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*special))) + special += Tcl_KanjiSkip(special, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ special++; if (*special == '"') { /* *************** *** 1607,1612 **** --- 1620,1629 ---- if (*special == '\0') { break; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (IS_KANJISTART(UCHAR(*special))) + special += Tcl_KanjiSkip(special, NULL, NULL) - 1; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ special++; } Tcl_DStringAppend(linePtr, start, special - start); diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclWinReg.c ./win/tclWinReg.c *** ../../tcl8.0.5/win/tclWinReg.c Wed Feb 3 07:25:21 1999 --- ./win/tclWinReg.c Fri Mar 12 00:04:07 1999 *************** *** 325,331 **** --- 325,335 ---- return TCL_ERROR; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + tail = Tcl_KStrrchr(keyName, '\\'); + #else /* HANDLE_KANJI_PATHNAME */ tail = strrchr(keyName, '\\'); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ if (tail) { *tail++ = '\0'; } else { *************** *** 445,451 **** --- 449,461 ---- { HKEY key; DWORD index; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + char buffer[MAX_PATH+1]; + wchar wbuffer[MAX_PATH+1]; + wchar *pattern; + #else char buffer[MAX_PATH+1], *pattern; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ Tcl_Obj *resultPtr; int result = TCL_OK; *************** *** 459,465 **** --- 469,479 ---- } if (patternObj) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + pattern = Tcl_GetWStr(interp, Tcl_GetStringFromObj(patternObj, NULL), NULL); + #else pattern = Tcl_GetStringFromObj(patternObj, NULL); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ } else { pattern = NULL; } *************** *** 472,486 **** --- 486,513 ---- resultPtr = Tcl_GetObjResult(interp); for (index = 0; RegEnumKey(key, index, buffer, MAX_PATH+1) == ERROR_SUCCESS; index++) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (pattern) { + Tcl_EncodeSJIS(buffer, wbuffer); + if (!Tcl_WStringMatch(wbuffer, pattern)) { + continue; + } + } + #else if (pattern && !Tcl_StringMatch(buffer, pattern)) { continue; } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ result = Tcl_ListObjAppendElement(interp, resultPtr, Tcl_NewStringObj(buffer, -1)); if (result != TCL_OK) { break; } } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (pattern) + Tcl_FreeWStr(pattern); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ RegCloseKey(key); return result; *************** *** 689,695 **** --- 716,726 ---- Tcl_Obj *resultPtr; DWORD index, size, result; Tcl_DString buffer; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + wchar *pattern; + #else char *pattern; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ /* * Attempt to open the key for enumeration. *************** *** 717,722 **** --- 748,757 ---- result = TCL_ERROR; goto done; } + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + /* ??? WinNT returns 1 for multibyte-chars */ + size *= 2; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ size++; *************** *** 726,732 **** --- 761,771 ---- result = TCL_OK; if (patternObj) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + pattern = Tcl_GetWStr(interp, Tcl_GetStringFromObj(patternObj, NULL), NULL); + #else pattern = Tcl_GetStringFromObj(patternObj, NULL); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ } else { pattern = NULL; } *************** *** 739,745 **** --- 778,796 ---- while (RegEnumValue(key, index, Tcl_DStringValue(&buffer), &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + int match = 0; + if (pattern) { + int len = Tcl_EncodeSJIS(Tcl_DStringValue(&buffer), NULL); + wchar *wbuffer = (wchar *)ckalloc((len + 1) * sizeof(wchar)); + Tcl_EncodeSJIS(Tcl_DStringValue(&buffer), wbuffer); + match = Tcl_WStringMatch(wbuffer, pattern); + ckfree((char *)wbuffer); + } + if (!pattern || match) { + #else if (!pattern || Tcl_StringMatch(Tcl_DStringValue(&buffer), pattern)) { + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ result = Tcl_ListObjAppendElement(interp, resultPtr, Tcl_NewStringObj(Tcl_DStringValue(&buffer), size)); if (result != TCL_OK) { *************** *** 750,755 **** --- 801,810 ---- size = Tcl_DStringLength(&buffer); } Tcl_DStringFree(&buffer); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + if (pattern) + Tcl_FreeWStr(pattern); + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ done: RegCloseKey(key); *************** *** 912,923 **** --- 967,986 ---- if (name[0] == '\\') { if (name[1] == '\\') { *hostNamePtr = name; + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + rootName = Tcl_KStrchr(name + 2, '\\'); + if (rootName != NULL) + *rootName++ = '\0'; + else + rootName = name + strlen(name); + #else for (rootName = name+2; *rootName != '\0'; rootName++) { if (*rootName == '\\') { *rootName++ = '\0'; break; } } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ } } else { rootName = name; *************** *** 932,937 **** --- 995,1009 ---- * Split the root into root and subkey portions. */ + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + *keyNamePtr = Tcl_KStrchr(rootName, '\\'); + if (*keyNamePtr != NULL) { + **keyNamePtr = '\0'; + (*keyNamePtr)++; + } else { + *keyNamePtr = rootName + strlen(rootName); + } + #else for (*keyNamePtr = rootName; **keyNamePtr != '\0'; (*keyNamePtr)++) { if (**keyNamePtr == '\\') { **keyNamePtr = '\0'; *************** *** 939,944 **** --- 1011,1017 ---- break; } } + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ /* * Look for a matching root name. *************** *** 997,1002 **** --- 1070,1079 ---- } result = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &subKeyLength, NULL, NULL, NULL, NULL, NULL, NULL); + #if defined(KANJI) && defined(HANDLE_KANJI_PATHNAME) + /* ??? WinNT returns 1 for multibyte-chars */ + subKeyLength *= 2; + #endif /* KANJI && HANDLE_KANJI_PATHNAME */ subKeyLength++; if (result != ERROR_SUCCESS) { return result; diff -r -c -P -x CVS -I .*\$Id: .* Exp \$ ../../tcl8.0.5/win/tclsh.rc ./win/tclsh.rc *** ../../tcl8.0.5/win/tclsh.rc Tue Sep 15 03:40:20 1998 --- ./win/tclsh.rc Fri Nov 26 21:08:03 1999 *************** *** 5,10 **** --- 5,16 ---- #define RESOURCE_INCLUDED #include + #ifdef KANJI + #include + #include + LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + #pragma code_page(932) + #endif // KANJI VS_VERSION_INFO VERSIONINFO FILEVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL *************** *** 17,24 **** --- 23,42 ---- BEGIN BLOCK "StringFileInfo" BEGIN + #ifdef KANJI + BLOCK "041104b0" + #else BLOCK "040904b0" + #endif // KANJI BEGIN + #ifdef KANJI + VALUE "FileDescription", "Tclsh アプリケーション\0" + VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) "jp.exe\0" + VALUE "FileVersion", TCL_PATCH_LEVEL " (jp1.7)\0" + VALUE "ProductName", "Tcl " TCL_VERSION " 日本語版 for Windows\0" + VALUE "InternalName", "Tcl " TCL_PATCH_LEVEL " jp 1.7 Win\0" + VALUE "ProductVersion", TCL_PATCH_LEVEL " (jp1.7)\0" + #else VALUE "FileDescription", "Tclsh Application\0" VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".exe\0" VALUE "CompanyName", "Sun Microsystems, Inc\0" *************** *** 26,36 **** --- 44,59 ---- VALUE "LegalCopyright", "Copyright \251 1995-1996\0" VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0" VALUE "ProductVersion", TCL_PATCH_LEVEL + #endif // KANJI END END BLOCK "VarFileInfo" BEGIN + #ifdef KANJI + VALUE "Translation", 0x411, 1200 + #else VALUE "Translation", 0x409, 1200 + #endif // KANJI END END