●● Gnu Awk (gawk) 2.15, patchlevel 6 + multi-byte extension 1.04 ●●
●●                                            May 3, 1995 by t^2 ●●

    gawk-2.15.6+mb1.04 -- マルチバイト文字対応版 Gnu Awk

●概要

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

●使用法

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

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

        -Wctype=ASCII または --ctype=ASCII
            マルチバイト文字を考慮しません. このオプションを使用した場合, 
            オリジナルの gawk を単に８ビットクリーンとした動作となります.

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

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

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

    以下, 組み込み関数などの変更点を挙げます.

        substr()    マルチバイト文字を分断させるような指定は自動的に修正
                    します.  例えば,
                            substr("aあiいuうeえoお", 3, 4)
                    は,
                            substr("aあiいuうeえoお", 2, 3) ==> "あi"
                    という結果になります.  どちらの引数も小さくなる方向
                    へ丸めます.

        jindex()    これは, 以前からよくある index() の変形です.
                    index() の結果をバイト位置ではなく文字位置で返します.

        jlength()   同じく length() の変形です.  バイト数ではなく文字数
                    を返します.

        jsubstr()   substr() の変形です.  バイト位置, バイト数の指定の代
                    わりに文字位置, 文字数を指定します.

        RS          マルチバイト文字を使用することができます.

        その他      ・識別子にマルチバイト文字を使用できます.

                    ・パス名に含まれるマルチバイト文字はについては全く考
                      慮していません.  注意してください.

                    ・文字列の大小比較は, 正規表現中の文字クラスの範囲指
                      定と同様,

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

                      という関係に基づいて比較します.

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

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

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

           ACKNOWLE     オリジナルのソースに含まれている ACKNOWLEDGMENT
           COPYING      オリジナルのソースに含まれている COPYING
           FUTURES      オリジナルのソースに含まれている FUTURES
           LIMITATI     オリジナルのソースに含まれている LIMITATIONS
           NEWS         オリジナルのソースに含まれている NEWS
           POSIX        オリジナルのソースに含まれている POSIX
           PROBLEMS     オリジナルのソースに含まれている PROBLEMS
           README       オリジナルのソースに含まれている README
           README.1ST   オリジナルのソースに含まれている README.FIRST

       gawk+mb 用のファイル

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

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

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

    2. GAWK と GAWK.EXE について

        GAWK および GAWK.EXE は, gawk-2.15.6+mb1.04 をそれぞれ GNU CC
        2.5.7, MS-C 6.00A でコンパイルしたものです.

        デフォルトで Shift-JIS 漢字コードを含むプログラムやファイルを処
        理できますが, オプションによって変更することもできます.

        GAWK (GO32 版) はインストールする際, お使いになっている GO32 に
        付属の coff2exe ユーティリティなどで EXE 形式にして, 使用してく
        ださい. 詳しくはご使用の GO32 のドキュメントをご覧ください. なお, 
        都合上, 動作確認は DJGPP1.11 でのみ行っています. それ以外のバー
        ジョンの GO32 では動作しない可能性もないわけではありません. 不具
        合などは遠慮なくご報告ください. (対処できるとは限りませんが.)

        GAWK.EXE (リアルモード版) は, そのまま PATH の通ったディレクトリ
        にコピーして使用してください.

        GO32 版とリアルモード版は, 単に容量的な違いだけです. 通常はリア
        ルモード版で十分と思われます. リアルモード版がメモリ不足となるよ
        うな巨大なプログラム／データを処理したい方は, GO32 版を使用して
        みてください. 速度的にはリアルモード版の方が高速ですので, そうい
        う巨大なプログラム／データに縁のない方は GO32 版はインストールす
        る必要はないでしょう.

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

        GO32 版のコマンドラインに関しては, ご使用の GO32 のドキュメント
        を参照してください.

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

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

            gawk -f ファイル名

        とすることです.

    4. 環境

        環境変数 AWKPATH がセットされていれば, その値をディレクトリのリ
        ストとみなし, -f で指定されたファイルをそのディレクトリから探し
        ます.  環境変数 PATH などと同様に, それぞれのディレクトリはセミ
        コロン (;) で区切ります.

    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 =                   (デフォルトで使用しない場合)

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

    memmove 関数がライブラリにないシステムではリンク時にエラーが出ること
    があります.  そのときは config/* の対応するファイルに

           MEMMOVE_MISSING 1

    という行を追加して configure をやり直してください.

    その他の作業は, オリジナルの gawk と同様です.

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

    まず, pc/* を, このディレクトリにコピーしてください.

        A>copy pc\*.* .

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

        A>nmake -f Makefile.msc DEFS=

    とするだけでＯＫです. オプティマイズは -Ox まで大丈夫なようです. コ
    ンパイルが無事終了したら,

        A>nmake -f Makefile.msc test

    と入力して, 動作チェックをしてみてください.

    その他の処理系を使用する場合や, デフォルトを Shift-JIS 以外にする場
    合は Makefile.msc を書き換えて使用してください.

    また, GO32 版をインストールするには以下のようにしてください.

        A>copy pc\*.* .
        A>del config.h
        A>ren config.go3 config.h
        A>make -f Makefile.go3

    ただし, 確認しているのは DJGPP 1.11 のみです. 動作チェックの際に 
    DJGPP 版 GNU make を使用した場合,

        A>make -f Makefile.go3 test

    とすると何故かこけます. (単に私の設定が悪いだけかも知れませんが.) そ
    のときは test/Makefile.dos のこけた部分を見て, 手動でやってみてくだ
    さい.

    なお, この動作チェックを行う場合は, rm, wc などのツールが必要です. 
    持っていない方は test/Makefile.dos を書き換えるなり, rm, wc, etc. を
    作成するなりしてしのいでください. redir という見慣れないプログラムも
    使用していますが, これは, 標準エラー出力をリダイレクトしたりするため
    に即興で作ったプログラムです. これのソースはおまけとして pc/ ディレ
    クトリに入れておきました. しょうもないプログラムですので決してコード
    を覗き見したりしないように(笑). 簡易マニュアルを pc/redir.txt に書い
    ています.

●バグ

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

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

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

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

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

●アルゴリズム (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 awk の著作権は Free Software Foundation, Inc. が
       有しています. パッチ部分 (gawk-mb.diff) の著作権は私 (t^2) が有し
       ています.

    2. GNU awk のソースコードは各所の ftp サイト, もしくは Nifty-serve 
       の FUNIX のデータライブラリから入手可能です. GNU awk から gawk+mb 
       への差分 gawk-mb.diff は, Nifty-serve の FUNIX LIB 8, および 
       fj.sources へポストしています.

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

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

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

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

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

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

●謝辞

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

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

    これまで転載/バグ報告をくださった方々に感謝します. (バグ報告に関して
    は ChangeLog.MB を参照.)

    最後に, 貴重なディスクスペースを gawk+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:
