●●●●● GNU grep version 2.0 + multi-byte extension 1.04 ●●●●●
●●●●●                              Jun. 2, 1994 by t^2 ●●●●●

    grep-2.0+mb1.04 -- マルチバイト文字対応版 GNU grep

●概要

    GNU プロジェクトによる grep, egrep, fgrep (以下単に grep) をマルチバ
    イト文字対応化したものです.

●使用法

    grep からの拡張部分だけを説明します.

    増えたオプションは以下の通りです.

        -Wctype=ASCII
            マルチバイト文字を考慮しません.  このオプションを使用した場
            合, grep のオリジナルと同じ動作になるはずです.

        -Wctype=EUC
            マルチバイト文字として EUC を認識します.

        -Wctype=SJIS
            マルチバイト文字として Shift-JIS を認識します.

        MS-DOS 以外のシステムで, Makefile(.in)? を書き換えずにインストー
        ルした場合, デフォルトでは EUC を認識します.  MS-DOS ではデフォ
        ルトで Shift-JIS を認識します.

● GREM104.LZH (MS-DOS 版実行形式を含むアーカイブ) について (それ以外の
   形態で入手された方は無視してください)

    1. アーカイブに含まれているファイル

       オリジナルから全く手を加えていないファイル

           AUTHORS      オリジナルのソースに含まれている AUTHORS
           CHANGELO     オリジナルのソースに含まれている ChangeLog
           COPYING      オリジナルのソースに含まれている COPYING
           MANIFEST     オリジナルのソースに含まれている MANIFEST
           NEWS         オリジナルのソースに含まれている NEWS
           PROJECTS     オリジナルのソースに含まれている PROJECTS
           README       オリジナルのソースに含まれている README

       grep+mb 用のファイル

           CHANGELO.MB  grep+mb の変更履歴
           README.MB    このファイル

       MS-DOS 版 grep+mb 用のファイル

           GREP.CAT     オリジナルのソースに含まれているマニュアルページ.
                        grep.man を GNU roff でフォーマットしたもの.
           GREP.EXE     MS-DOS 版 grep-2.0+mb1.04 の実行形式
           READMAN.SED  sed を持っている人へおまけ
                        (sed -f readman.sed grep.cat)

    2. GREP.EXE について

        grep-2.0+mb1.04 を MS-C 6.00A でコンパイルしたものです.

        デフォルトで Shift-JIS 漢字コードを含むパターンやテキストを処理
        できます.

        setargv.obj を組み込んでありますので, MS-DOS でポピュラーなタイ
        プのワイルドカードが使用できます.  UNIX の csh ライクなワイルド
        カード展開ルーチンを用意しようかとも思ったのですが, MS-DOS の他
        のコマンドとの整合性が取れないし, オリジナルをなるべく尊重したかっ
        たので断念しました.

    3. インストール

        GREP.EXE は, grep はもちろん, egrep, fgrep の機能を含んでいます.
        grep に -E オプションを与えると egrep の動作, -F オプションを与
        えると fgrep の動作をします.  また, GREP.EXE を EGREP.EXE,
        FGREP.EXE という名前でコピーして egrep, fgrep として起動すると, 
        その名前にふさわしい動作をします.  ハードディスクに余裕のない方
        以外は,

            A>copy grep.exe a:\bin
            A>copy grep.exe a:\bin\egrep.exe
            A>copy grep.exe a:\bin\fgrep.exe

        などとしてご使用になられることをお勧めします.  どうしてもハード
        ディスクの無駄使いをしたくなければ,

            @echo off
            grep -E %1 %2 %3 %4 %5 %6 %7 %8 %9

        などのバッチファイルを作成するという手もあります.

    4. コマンドライン引数について

        前述したとおり MS-C の setargv.obj をリンクしていますので, その
        仕様に従わなければなりません.

        １つ１つの引数は空白で区切ります.  引数に空白, ", \, <, >, | を
        含むときはクォーティングが必要です.  その方法は COMMAND.COM のバ
        グ臭い仕様と, さらに setargv.obj にも問題があり, かなり難しいの
        でここでは説明を省きます.  各自研究してください.  一番簡単なのは,
        検索パターンをファイルにして

            grep -f ファイル名

        とすることです.

    5. マニュアル

        roff 系のフォーマッタを使えない人のために GNU roff でフォーマッ
        ト済みのマニュアルを用意しました.  ボールドフェース, アンダーラ
        イン対応の less などでお読みください.  エディタなどでは ^H が入っ
        ていて読みにくいと思います.

            s/.^H//g

        という sed のプログラムに通せば, 通常のテキストファイルが得られ
        ます.  (^H というのはコントロールコードを直接埋めこむという意味
        です.)

●インストール (MS-DOS 以外)

    デフォルトのマルチバイト文字の設定は, Makefile.in の中で指定します. 
    デフォルトを Shift-JIS とする場合と, デフォルトでマルチバイト文字を
    使用しない場合は Makefile.in の MBCTYPE_DEF マクロの定義をそれぞれ以
    下のように変えてください.

        MBCTYPE_DEF=-DSJIS              (デフォルトで Shift-JIS の場合)
        MBCTYPE_DEF=                    (デフォルトで使用しない場合)

    いずれの場合でも起動時のオプションによりマルチバイト文字コードの選択
    が可能です.

    その他の作業は, オリジナルの grep と同様ですので INSTALL をお読みく
    ださい.

●インストール (MS-DOS 版.  ここでいうインストールというのは, ソースから
  のインストールのことです)

    MS-C 6.00A を使用して, デフォルトで Shift-JIS を認識する grep を作成
    する場合は, README.MSC に目を通して, 必要ならライブラリにパッチを当
    てた後,

        A>nmake -f makefile.msc

    とするだけでＯＫです.  grep.exe を作成後, 自動的にテストを行います. 
    その際, grep からのエラーメッセージがいくつか表示されますが, それは
    異常ではありません.  エラーを含むパターンを渡した時に, 終了ステータ
    スが 2 となることを確認しているだけです.  本当に異常があった場合は 
    "Spencer test #nn faild" (nn は数字) と表示されます.

    テストにパスしたら, grep.exe を適当なディレクトリにコピーしてくださ
    い.  その際, 名前を egrep.exe, fgrep.exe と変えるだけで, それぞれ 
    egrep, fgrep の動作をします.  そこで, 例えば a:\bin へインストールす
    る場合,

        A>copy grep.exe a:\bin
        A>copy grep.exe a:\bin\egrep.exe
        A>copy grep.exe a:\bin\fgrep.exe

    などとします.

    その他の処理系を使用する場合や, デフォルトを Shift-JIS 以外にする場
    合は Makefile.msc を参考に Makefile を書いてください. なお, テストに
    は awk (gawk) が必要です.

●バグ

    1. いわゆる JIS には対応していません.  将来対応する予定もありません.

    2. マルチバイト文字コードはあまり厳格には考えていません.

        EUC       １バイト目 ... 0x80 - 0xff
        EUC       ２バイト目 ... 0x01 - 0xff (0x0a を除く)

        Shift-JIS １バイト目 ... 0x80 - 0x9f, 0xe0 - 0xff
        Shift-JIS ２バイト目 ... 0x01 - 0xff (0x0a を除く)

       として処理しています.  半角カナも使えます.  EUC の SS3 (0x8f) に
       始まる３バイトコードは使えません.  (私はこれをサポートしているシ
       ステムを見たことがない...)

    3. -b オプションで表示されるバイトオフセットは DOS の場合 CR+LF を 1 
       としてカウントした値になります.  (手抜き)

●アルゴリズム (dfa.[ch] のマルチバイト文字対応化)

    以前は漠然と, DFA を直接 EUC や Shift-JIS のような文字種の多いコード
    セットに対応させるのは, 非常に難しいと思っていました.  ところがある
    日, 自作ライブラリのテスト用に, 正規表現を DFA へ変換する簡単なプロ
    グラムを書いたときに, 突然うまいアイディアが閃いたのです.  マルチバ
    イト文字といえども結局はバイトの並びです.  マルチバイト文字を, すべ
    てバイト単位に分解して, 正規表現を作ってしまえばよかったのです.

    言葉ではうまく表現できないので, 以下の記号を使用し, どういうふうにバ
    イト単位に分解しているのか, 例を挙げます.

            a, b, c ... シングルバイト文字.
            x, y, z ... マルチバイト文字の１文字目.

        . (任意の１文字)
          ==> [a-c]|[x-z][a-z]

          (シングルバイト文字か, またはマルチバイト文字の１文字目と
          任意の１文字の連接.)

        [xb-zx] (xb から zx の範囲のマルチバイト文字)
          ==> x[b-z]|y[a-z]|z[a-x]

        yb*
          ==> (yb)*

    実際には正規表現を作り出すのではなく, 正規表現を分解したトークンを直
    接生成しています.  この辺, 興味がある方はソースを見たほうが早いと思
    います.  (あまりエレガントではありませんのでソースをじっくり見られる
    のは恥ずかしい気もしますが...)

    これだけでは, 例えばあるテキストから xy という文字を探そうとすると,
    xxyy のような文字の並びにまで反応してしまいます.  そこで, マルチバイ
    トモードのときには必ず "^.*(" + ユーザパターン + ")" として処理しま
    す.  '.*' により, '.' はマルチバイト文字の一部にはマッチしませんから, 
    頭出しできるわけです.

● dfa.[ch], regex.[ch] の拡張仕様

    dfa.[ch], regex.[ch] モジュールは mbc.[ch] モジュールに依存していま
    す.  また, これはオリジナルの仕様ですが, dfa.[ch] を使用する場合は 
    regex.h の定義が必要です.

    マルチバイト文字のタイプは, mbc.[ch] の mbcinit() で設定します.
    mbc.h に定義されているマクロ MBCTYPE_ASCII, MBCTYPE_EUC,
    MBCTYPE_SJIS のいずれかを mbcinit() に渡してください.

    dfa.[ch] は, パターンのコンパイル時にだけ, この mbc.[ch] の設定を参
    照します.  パターンマッチングの際は, コンパイル時に設定されていた, 
    マルチバイト文字のタイプを検索します.

    一方, regex.[ch] は, パターンコンパイル時, マッチング時の両方で 
    mbc.[ch] の設定を参照します.  が, この両者で mbc.[ch] の設定を変更す
    ることはできません.  つまり, Shift-JIS で記述されたパターンを, EUC 
    テキストから検索するといった動作はできません.  注意してください.

    マルチバイト文字対応に伴って注意すべき正規表現を以下に記します.

        .       任意の１バイト文字, 正当なマルチバイト文字にマッチします. 
                「正当なマルチバイト文字」とは, マルチバイト文字の１文字
                目に, '\0' または '\n' 以外が続く文字のことです.

        [x-y]   文字コード (内部表現) が x から y の範囲にある任意の１文
                字にマッチします.  これも . と同じく, 正当でない文字には
                マッチしません.

        [^x-y]  文字コード (内部表現) が x から y の範囲にない任意の１文
                字にマッチします.  正当でない文字にもマッチします.

    マルチバイト文字の内部表現は単に１バイト目を上位バイト, ２バイト目を
    下位バイトとした１６ビット符号なし整数です.  Shift-JIS でも EUC でも

        １バイト ASCII 文字 < 半角カナ文字 < 全角文字

    という大小関係が成り立っています.

●その他

    1. オリジナルの GNU grep の著作権は Free Software Foundation, Inc. 
       が有しています. パッチ部分 (grep-mb.diff) の著作権は私 (t^2) が有
       しています.

    2. GNU grep のソースコードは各所の ftp サイト, もしくは Nifty-serve 
       の FUNIX のデータライブラリから入手可能です. GNU grep から 
       grep+mb への差分 grep-mb.diff は, 私が FUNIX へ登録し, 堂園和郎氏 
       (dohzono@sdsft.kme.mei.co.jp) が fj.sources へポストしてくださっ
       ています.

    3. 差分 grep-mb.diff の再配布は自由です. これに関しては FSF の規定に
       従う必要もありません. しかし差分を適用した結果のソースコード, お
       よび実行形式での再配布の際は GNU GENERAL PUBLIC LICENSE (COPYING 
       参照) に従ってください.

       grep+mb に何らかの改変を加えたものを再配布する際も, GNU GENERAL
       PUBLIC LICENSE に従うように注意してください. また grep+mb に含ま
       れるコード (dfa.[ch] や regex.[ch]) を利用したプログラムを配布す
       る際も GNU GENERAL PUBLIC LICENSE の該当部分に従ってください.

       また義務ではありませんが再配布される方は事後にでも連絡をください. 
       そして可能な限り, 新しいバージョンへのアップデートに努め, 利用者
       からの連絡が私に届くように配慮してください.

    4. このプログラムは無保証です.

    5. grep+mb に何らかの不具合が発生した場合, (FSF や, オリジナルの作者
       ではなく) 私に連絡してください. 配布した人が希望している場合は, 
       その人に連絡してください.

    6. ご質問/ご要望/お叱り, その他も大歓迎です. できるかぎりサポートし
       ます.

●謝辞

    原作者および FSF に感謝します.

    ドキュメント作成に関して助言をくださった堂園和郎氏 
    (dohzono@sdsft.kme.mei.co.jp) に感謝します.

    これまで転載/バグ報告をくださった方々に感謝します. 実名を挙げさせて
    頂きたかったのですがハードディスクのトラブルでほとんどのメールを消失
    させてしまいました.

    最後に, 貴重なディスクスペースを grep+mb のために割いてご使用頂いて
    いるすべての利用者の方々に感謝します.

●「私」の連絡先

    〒810  福岡市中央区梅光園団地 7-207               (注: 転居しました)
    TEL/FAX: 092-731-4025 (TEL/FAX 自動切替え)
             092-724-6342 (TEL のみ)
    E-mail: NBC02362@niftyserve.or.jp                           谷本孝浩

# Local variables:
# mode: indented-text
# indent-tabs-mode: nil
# tab-stop-list: (4 8 16 24 32 40 48 56 64 72 80)
# left-margin: 4
# fill-column: 72
# fill-prefix: "    "
# version-control: never
# End:
