czenyen v1.11 Cソース中の " や 'で囲まれた中にある \ を含む全角文字の検索や 変換を行うツール writen by てんか☆(M.Kitamura) □ はじめに Cのソース中に MS全角(シフトJIS)文字を用いるときに問題となることも ある \を含むMS全角文字を探したり、MS全角未対応のコンパイラでコンパイ ルするために \を含む全角文字に細工をしたりするツールです。 細工といっても単に " や ' で囲まれた範囲の \を含む文字の直後に \を 付加するか \を含む文字自体を \x??\x5c というふうに変換したりするだけ です。 また、 \を含む文字の直後に \があれば削除する、という機能もあります。 ただし完璧なツールというわけではなく、基本的にコンパイルの通るソース 前提ですし、#if 〜 #endifの中身は条件式の結果に関わらずすべて処理対象 ですので、動作や対象とするソースの状態をよく確認した上で変換作業は行 なってください。 □ 使い方 usage> czenyen [-opts] srcfile [newfile] オプション: -t [テスト] \ を含む全角文字がある行を調べる(-a,-nの確認用) -s [テスト] \ を含む全角文字の直後に \ があるか調べる(-dの確認用) -a [変換]\ を含む全角文字の直後に \ を付加 -d [変換]\ を含む全角文字の直後の \ を削除 -n [変換]\ を含む全角文字を\x??\x5cに変換 -na [変換] すべての全角文字と半角カナを \x?? に変換 -nb [変換] 文字コードが 0x80 以上の文字を \x?? に変換 -ns -n -na -nbで\x??化の直後に16進数文字が来る場合""で文字列を分割 -k -t -s で " や ' の範囲だけでなく// /* */ コメント中の調べた 結果も表示 -x[EXT] 指定ファイルは一つで新しいファイルを元の名で出力し、元ファ イルは拡張子を .EXT にする(EXT省略時:bak) -y[FILE] エラーメッセージを FILE に出力する。 -y のみだと標準出力する。 -y がなければエラーメッセージは標準エラー出力される。 オプション無視定の場合、デフォルトで -t を行います。 変換(-a -d -n) を行う場合は、[newfile]を指定するか -x を指定すれば ファイルに、なければ標準出力します。 入力ファイルが省略されると、標準入力します。ただし、このプログラム では引数無しで起動されるとヘルプ表示になるので、必ず何かオプションを 指定してください。 変換は ' か " で囲まれた範囲のみで // /* */ コメント中は行いません が、-a -n 指定時には 改行の直前に \ を含む全角のある場合には全角空白 を付加します(エディタやツールで行末空白の削除が容易く行われてしまう 場合を想定して、半角でなく全角を付加しています)。 -t -s は同じチェックを行いますが、若干表示が違うだけです。 -a -d で変換を行う前に -t -s で対象としているソースをチェックし、 不都合が無いか調べてください。 -a を行なうならばソースは素のまま、-d を行なうならば \対策を一通り 施こしたソースになっていないといけません。 チェックの結果 <<警告>> とある行は不都合が生じるかもしれない行です。 もっとも警告が付かない行が安心かというとそういうわけでもないですが。 例えばソース中に "表\n" のような文字列があるときに -d を行うと誤っ て必要な \を削除してしまうでしょう。 □ 注意点 単純な作りなので基本的に入力するソースはコンパイルできるもののみに してください。/* */ のネストは不可です(今時しないけど)。 また、#if 〜 #endif などで条件不成立にしてコメントを書いている場合 も不都合が発生する可能性があります。 例)#if 0 /* COMMENT */ コンパイル時はコメントして機能するが、このツールでは この部分も処理しちゃうので、 //があったり、 " や ' が奇数個あったり */ や /* が閉じてなかったりする と、誤変換しちゃうでせう #endif 上記のようなことをせず、つまり #if 〜 #endif の中身は 文法的に C の ソースで、コメントは/*〜*/や //〜 に必ずなるように記述されたソースで あれば問題ないはずです。 □ 使い道 もともと Watcom-C で /zk オプションのことすっかり忘れてて 文字化け したのがきっかけでしたが(気付いてよかった^^;)、同様に、ようはシフ トJIS(MS全角)テキストに対応していないCコンパイラ(フリーなWinものな らたとえばMingwやLCC-Winなど)の前処理として用いるのが、らしい使い道 になると思われます。 この場合、-a オプションを用いるのがよいです。-n系のほうが文法的に はよさそうで、変換後のソースをシフトJIS対応/未対応に関わらず\ に煩わ されずにコンパイルできるのですが、 "表01" とあるばあい "\x95\x5c01" となり \x5c01 の部分でコンパイラに怒られるか、最悪誤変換されてしまう 可能性があります。7ビットの文字コードしか通さないコンパイラの場合は しかたないですが、makefileなりで -a で中間ファイルとして生成する形に したほうが手間少ないように、と思います。 (今思うとANSI-Cコンパイラならば"\x95\x5c" "01" のように生成すれば つじつまは合うかな?プリプロセスなので先に連結されちゃってダメかな? ……試したら意図通りになるコンパイラが多そう?なので一応-nsを追加)。 あと、逆に、昔 MS-C v5以前のソースなどのシフトJIS未対応のコンパイラ 向けに \ が余分につけてあるソースから余分な \ を削除する目的にも使え ます。 ■ 配布条件等 フリーソフトウェアです。オンラインでの非営利配布ならば作者に連絡不 要で再配布していただいてかまいません。その他の場合(雑誌紹介とかディ スク配布で同梱したいなど)事前に相談ください、ってことで。 なお、配布ファイル中の実行ファイルは Inprise Bcc32 v5.5 でコンパイ ルしてあります。 営利配布は自由でないですが、 営利利用(仕事場で業務に使うとか)は もちろん構いません。 ソースですが、原作者を含め第三者のプログラミングを阻害しない人に限 り流用や改造は自由です(改造部分の著作権でもって他者の利用を禁止する とかいう人は駄目です) 直接的な改造物を再配布したい場合は改造物であることを明示し配布条件 を原作者と同じような趣旨にしてください。ささいな流用程度ならば出所明 記は特には不要です。 再コンパイルですが、 ANSI系,unix系のライブラリ関数以外で使ってるの はstricmpだけのはずなので、MS-C を意識した(MS-DOS用ANSI)Cコンパイラ ならば,ほぼそのまま再コンパイルできると思われます(v1.0において BC3, LsiC86(試食),WatcomC10.5, BCC5.5 で確認) なお、作者はいかなる責任も義務も負いません。利用者の責任で用いてだ さい。 ■ おわりに csstob(//コメントを/*コメント*/に変換するツール)をつくった勢いで 派生したツールです。 例によって十分なチェックなんて行ってるわけないので、気をつけてくだ さいませ。 てんか☆ (北村雅史) NBB00541@nifty.ne.jp