diff -Nur grep-2.3/ChangeLog.MB grep-ja-2.3/ChangeLog.MB
--- grep-2.3/ChangeLog.MB	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/ChangeLog.MB	Thu Jan  1 09:00:00 1970
@@ -1,219 +0,0 @@
-Thu Jun  2 16:58:03 1994  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 2.0 + multi-byte extension 1.04 released.
-
-Sat Mar  5 16:30:16 1994  Takahiro Tanimoto  (tt@isaac)
-
-	* README.MSC: PC-9800 シリーズ用 MS-C 6.00A の, ワイルドカード展
-	開ルーチンのバグに対処した.  以前の stdargv.diff をこれに統合し, 
-	削除した.  (Thanks to 福浩邦さん <GFE00522@niftyserve.or.jp>)
-
-Thu Aug 19 04:26:09 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c (re_compile_fastmap): charset_not の fastmap の作成処
-	理が間違っていて, regex の fastmap を使用する場合 (e?grep では 
-	fastmap を使用していないため, この問題は表面には現れない), 正規
-	表現の先頭の [^Ａ] や [^a] に例えば Ｂ がマッチしなかった.
-	(Thanks to 小屋良祐さん <JAE03716@niftyserve.or.jp>)
-
-Tue Aug 10 01:29:05 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c (set_list_bits): 文字クラス中のマルチバイト文字の最適
-	化で, 区間終点の更新処理部分にバグがあり, [Ａ-ＣＥ-ＧＢ-Ｄ] を最
-	適化すると [Ａ-Ｇ] だが, これが [Ａ-Ｅ] となってしまっていた. 
-	ただし, regex ではなく dfa が使用される場合にはこのバグは表面に
-	は現れない.
-
-Fri Jul 23 03:22:13 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 2.0 + multi-byte extension 1.03 released.
-
-	* DEFS.dos: strcmpi を stricmp に変更.
-
-	* grep.c (main): MS-DOS の場合, argv[0] を加工した文字列へのポイ
-	ンタを argv[0] へもセットする.  getopt が出力するメッセージも加
-	工された文字列となる.
-
-	* grep.c (main): MS-C 6.00A の stdargv.asm のバグをフィックスし
-	たため, argv[0] == "" のときの処理を削除した.
-
-	* stdargv.diff: 追加.
-
-Tue Jul 13 07:04:13 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 2.0 + multi-byte extension 1.02 released.
-
-Mon Jul 12 00:20:36 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* grep.c: HAVE_STRCASECMP が #define されていないとき, 一方の文
-	字列だけを小文字にしてから比較する関数を定義していたが, 使い方が
-	悪かった.  それを strcasecmp() と同じものに変更した.
-
-	* DEFS.dos: HAVE_STRCMPI を #define する代わりに,
-	HAVE_STRCASECMP を #define し, strcasecmp を strcmpi に #define 
-	した.
-
-Sat Jul 10 01:05:04 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 2.0 + multi-byte extension 1.01 released.
-
-	* grep.c (main): MSDOS の場合, argv[0] を小文字にして prog にセッ
-	トする.  また, 拡張子は取り除く.
-
-	* obstack.h: chunk_size の型を size_t から unsigned に変更.
-	old-C の場合, size_t が定義されていない状態となったため.
-
-	* regex.h: 定数の後に U, UL をつけると old-C でコンパイルできな
-	い.  これらをキャストに変更した.
-
-	* regex.h: RE_DUP_MAX の定義を 16 ビット int のマシンでもオーバ
-	フローしない書き方に修正.
-
-	* obstack.h: struct obstack のメンバ chunk_size の型を size_t と
-	した.  PTR_INT_TYPE を外部から #define できるようにした.  MSDOS 
-	で SMALL MODEL 以外の場合, __PTR_TO_INT, __INT_TO_PTR とともに,
-	ポインタと long を変換するようにした.
-
-	* grep.c (fillbuf, grep): read() の返り値の正負によるエラーチェッ
-	クを, -1 に等しいかどうかで行うように変更.
-
-	* grep.c: totalcc, totalnl を unsigned long に変更し, prline() 
-	中の printf() の書式を合わせた.
-
-	* DEFS.dos: BUFSALLOC を 4096 に #define.  (See reset() in
-	grep.c.)
-
-	* getpagesize.h: MSDOS の場合, ページサイズは 4096 とした.
-
-	* dfa.c: STDC_HEADERS または HAVE_STRING_H のとき, bcopy, bzero 
-	をマクロ展開する.
-
-Fri Jul  9 13:16:50 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* mbc.c, mbc.h, ...: ismbchar() をモジュール毎に独立して定義する
-	のをやめ, モジュールを追加した.
-
-	* search.c (Fexecute): fgrep をマルチバイト文字に対応させた.
-
-Wed Jul  7 17:02:33 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* kwset.c (bmexec): 8 ビットクリーンでないところを修正.
-
-	* ベースを grep-2.0 へ変更.
-
-Sun Jul  4 08:48:12 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c (re_match_2): オリジナルのバグ.  maybe_finalize_jump 
-	の処理中, start_memory/stop_memory をスキップするところで, 引数
-	のスキップをしていないバグを修正.  例えば "([a-n]+).*\1" が正し
-	く "abcxyzab" にマッチするようになった.
-
-Sat Jul  3 06:51:33 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 1.6 + multi-byte extension 1.00 released.
-
-Sat Jul  3 04:29:14 1993  Takahiro Tanimoto  (tt at pc98)
-
-	* grep.c (bufprev): -b オプションで表示するバイトオフセットを 
-	long にするために bufprev を long とした.  bufprev 以外は変更し
-	ていないため, 1 行のサイズが int の範囲を越えると正しく処理され
-	ない.  また, DOS では CR+LF を 1 バイトとしてカウントしてしまう.
-	(手抜き)
-
-	* regex.c (re_match_2): 文字クラスの処理中の 16 ビット int で正
-	常動作しない部分を修正.
-
-	* regex.c (re_exec): re_search() への最後の引数を 0 から NULL へ
-	修正.
-
-	* regex.c (re_match): re_match_2() への２番目の引数を 0 から 
-	NULL へ修正.
-
-	* regex.c (re_search): re_search_2() への２番目の引数を 0 から 
-	NULL へ修正.
-
-	* grep.c (main): MS-C の setargv のバグのせいで, grep "\\" foo 
-	とすると argv[0] == "" となってしまう.  argv[0] == "" のときは強
-	制的に "grep" または "egrep" をセットするようにした.
-
-Fri Jul  2 19:25:58 1993  Takahiro Tanimoto  (tt at pc98)
-
-	* grep.c (main): 変数 prog の設定を DOS 用に修正した.  その際, 
-	オリジナルのやり方はまずかったので修正した.
-
-	* grep.c: MSDOS のとき errno と sys_errlist の宣言をしないように
-	修正した.
-
-	* regex.c (set_list_bits): 使用していなかった変数を削除.
-
-	* Makefile.msc: DOS サポートのため追加.
-
-Fri Jun 11 04:14:22 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* grep.c: version 文字列が古いままだった.
-
-Tue May 25 00:10:49 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* Version 1.6 + multi-byte extension 0.02 released.
-
-Mon May 24 15:57:31 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c (re_search_2): 後方へ advance する際のバグを修正.
-
-Sat May 22 02:03:41 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c (re_compile_fastmap): exactn で translate するのをやめ
-	た.  re_compile_pattern で一度 translate されているはず.
-
-	* regex.c (re_match_2): exactn の処理部分で, #if 0 を #if 1 にし
-	た場合, 正しい処理を行っていなかったのを修正.
-
-Fri May 21 20:04:07 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.[ch]: mbcharset, mbcharset_not を廃止.  代わりに 
-	charset, charset_not がマルチバイト文字をも保持する.
-
-	* grep.c (main): 下記の変更に伴って, "^.*(" ... ")" を付加する処
-	理を削除した.
-
-	* dfa.c (regcompile): searchflag が ON のとき, 正規表現を "^.*("
-	... ")" としてコンパイルするようにした.  以前は grep.c の中で同
-	じことを行っていた.
-
-	* dfa.c (lex): 文字クラスでマルチバイト文字の１文字目の集合から,
-	シングルバイト文字を除外する処理を追加した.
-
-	* dfa.c (lex): 文字クラスでシングルバイト文字の上限が間違ってい
-	たのを修正した.
-
-Wed May 19 01:27:07 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* regex.c: !__STDC__ のときに const を #define.
-
-	* dfa.h: オリジナルでは !STDC_HEADERS のときに const を #define 
-	していたが, これを !__STDC__ のときに #define するように変更した.
-
-	* configure.in: bcopy(), memmove() のチェックを追加.
-
-	* dfa.c (reginit): cs_tok[] の初期化を追加した.  -i フラグを付け
-	た場合の不具合を修正.
-
-Tue May 18 18:14:04 1993  Takahiro Tanimoto  (tt@albert)
-
-	* dfa.h: regex.h での RE_MBCTYPE_??? の値と一致させた.
-
-	* regex.[ch] (RE_TRANSLATED_RANGE): mbsed-0.01 で行った拡張を輸
-	入した.
-
-Sat May 15 04:27:32 1993  Takahiro Tanimoto  (tt@isaac)
-
-	* マルチバイト文字対応版が一通り完成した.
-
-
-Local Variables:
-mode: indented-text
-left-margin: 8
-fill-column: 72
-fill-prefix: "	"
-version-control: never
-End:
diff -Nur grep-2.3/ChangeLog.MB.New grep-ja-2.3/ChangeLog.MB.New
--- grep-2.3/ChangeLog.MB.New	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/ChangeLog.MB.New	Sat Mar 25 15:51:36 2000
@@ -0,0 +1,48 @@
+Sat Mar 25 15:45:46 2000  GOTO Masanori  <gotom@debian.or.jp>
+
+	* src/dfa.c: Fixed when the option --ignore-case is added
+	like "grep -i", grep-ja cause segmentation fault.
+	Patched by: Yasuhiro Uchida / 内田恭広 <uchida@tecnet.or.jp>.
+	* src/grep.c: Fixed the incorrect version number.
+
+Thu Feb 10 17:42:56 2000  GOTO Masanori  <gotom@debian.or.jp>
+
+	* ChangeLog.MB.ja: added some discriptions.
+	* README.MB-ja, README.MB-ja.ja: translated and updated.
+	* INSTALL.MB: added.
+	* Release as grep-ja-2.3 with MB extension 2.0.
+
+Mon Dec 20 23:29:29 1999  GOTO Masanori  <gotom@debian.or.jp>
+
+	* New grep-ja_2.3 release based on grep_2.3 and grep-ja_2.0 .
+	  From this version, I do not guarantee to run on DOS system.
+
+	* old-ja/ChangeLog.MB: Move old -ja files from package root directory.
+	  old-ja/DEFS.dos: likewise.
+	  old-ja/MANIFEST.MB: likewise.
+  	  old-ja/Makefile.msc: likewise.
+	  old-ja/README.MB: likewise.
+	  old-ja/README.MSC: likewise.
+
+	* old-ja/tests/batgen.awk: Move from tests dir, these files was included
+		in grep-ja 2.0 source.
+	  old-ja/tests/check.bat: likewise.
+	  old-ja/tests/spencer.dos: likewise.
+
+	* Makefile.in: Merged between grep-ja 2.0 and grep 2.3 .
+	* configure.in: Merged between grep-ja 2.0 and grep 2.3 .
+	* configure: Merged between grep-ja 2.0 and grep 2.3 .
+
+	* src/mbc.c: Move from package root directory to src dir.
+	* src/mbc.h: likewise.
+	
+
+	* src/dfa.c: Merged between grep-ja 2.0 and grep 2.3 .
+	* src/dfa.h: likewise.
+	* src/getpagesize.h: likewise.
+	* src/grep.c: likewise.
+	* src/kwset.c: likewise.
+	* src/obstack.h: likewise.
+	* src/regex.c: likewise.
+	* src/regex.h: likewise.
+	* src/search.c: likewise.
diff -Nur grep-2.3/DEFS.dos grep-ja-2.3/DEFS.dos
--- grep-2.3/DEFS.dos	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/DEFS.dos	Thu Jan  1 09:00:00 1970
@@ -1,15 +0,0 @@
-#define STDC_HEADERS 1
-#define HAVE_STRING_H 1
-#define HAVE_MEMCHR 1
-#define HAVE_STRERROR 1
-#define HAVE_MEMMOVE 1
-#define HAVE_STRCASECMP 1
-#define strcasecmp stricmp
-
-#define BUFSALLOC 4096
-
-#ifndef M_I86SM
-#define __PTR_TO_INT(P) ((long)(P))
-#define __INT_TO_PTR(P) ((char *)(P))
-#define PTR_INT_TYPE long
-#endif
diff -Nur grep-2.3/INSTALL.MB grep-ja-2.3/INSTALL.MB
--- grep-2.3/INSTALL.MB	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/INSTALL.MB	Thu Feb 10 17:45:56 2000
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff -Nur grep-2.3/MANIFEST.MB grep-ja-2.3/MANIFEST.MB
--- grep-2.3/MANIFEST.MB	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/MANIFEST.MB	Thu Jan  1 09:00:00 1970
@@ -1,11 +0,0 @@
-ChangeLog.MB		Revision history of multi-byte extension to grep.
-DEFS.dos		Definitions for DOS.
-MANIFEST.MB		This file.
-Makefile.msc		Makefile for MS-C version 6.
-README.MB		Documentation for multi-byte extension.
-README.MSC		Patch for source/startup/... of MS-C 6.00A
-mbc.c			Multi-byte char handler.
-mbc.h			Interface to mbc.c.
-tests/batgen.awk	DOS version of scriptgen.awk.
-tests/check.bat		DOS version of check.sh
-tests/spencer.dos	Input for batgen.
diff -Nur grep-2.3/Makefile.in grep-ja-2.3/Makefile.in
--- grep-2.3/Makefile.in	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -282,7 +282,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/Makefile.in.orig grep-ja-2.3/Makefile.in.orig
--- grep-2.3/Makefile.in.orig	Mon Feb 15 09:43:46 1999
+++ grep-ja-2.3/Makefile.in.orig	Thu Jan  1 09:00:00 1970
@@ -1,378 +0,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = .
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
-CC = @CC@
-DATADIRNAME = @DATADIRNAME@
-EXEEXT = @EXEEXT@
-GENCAT = @GENCAT@
-GMOFILES = @GMOFILES@
-GMSGFMT = @GMSGFMT@
-GT_NO = @GT_NO@
-GT_YES = @GT_YES@
-INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
-INSTOBJEXT = @INSTOBJEXT@
-INTLDEPS = @INTLDEPS@
-INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-LIBOBJS = @LIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-POFILES = @POFILES@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SEP = @SEP@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
-USE_NLS = @USE_NLS@
-VERSION = @VERSION@
-l = @l@
-
-AUTOMAKE_OPTIONS = no-dependencies
-
-ACLOCAL_AMFLAGS = --acdir=m4
-SUBDIRS = intl po doc src tests djgpp m4 vms bootstrap
-
-EXTRA_DIST = TODO README PATCHES-AC
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = 
-DIST_COMMON =  README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \
-INSTALL Makefile.am Makefile.in NEWS THANKS TODO acconfig.h aclocal.m4 \
-config.hin configure configure.in install-sh missing mkinstalldirs
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-all: all-redirect
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
-
-Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) \
-	  && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-$(ACLOCAL_M4):  configure.in 
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-
-config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
-	cd $(srcdir) && $(AUTOCONF)
-
-config.h: stamp-h
-	@if test ! -f $@; then \
-		rm -f stamp-h; \
-		$(MAKE) stamp-h; \
-	else :; fi
-stamp-h: $(srcdir)/config.hin $(top_builddir)/config.status
-	cd $(top_builddir) \
-	  && CONFIG_FILES= CONFIG_HEADERS=config.h:config.hin \
-	     $(SHELL) ./config.status
-	@echo timestamp > stamp-h 2> /dev/null
-$(srcdir)/config.hin: $(srcdir)/stamp-h.in
-	@if test ! -f $@; then \
-		rm -f $(srcdir)/stamp-h.in; \
-		$(MAKE) $(srcdir)/stamp-h.in; \
-	else :; fi
-$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
-	cd $(top_srcdir) && $(AUTOHEADER)
-	@echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
-
-mostlyclean-hdr:
-
-clean-hdr:
-
-distclean-hdr:
-	-rm -f config.h
-
-maintainer-clean-hdr:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-
-@SET_MAKE@
-
-all-recursive install-data-recursive install-exec-recursive \
-installdirs-recursive install-recursive uninstall-recursive  \
-check-recursive installcheck-recursive info-recursive dvi-recursive:
-	@set fnord $(MAKEFLAGS); amf=$$2; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@set fnord $(MAKEFLAGS); amf=$$2; \
-	dot_seen=no; \
-	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
-	  rev="$$subdir $$rev"; \
-	  test "$$subdir" = "." && dot_seen=yes; \
-	done; \
-	test "$$dot_seen" = "no" && rev=". $$rev"; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS)'; \
-	unique=`for i in $$list; do echo $$i; done | \
-	  awk '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	here=`pwd` && cd $(srcdir) \
-	  && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-   if test "$$subdir" = .; then :; else \
-	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
-   fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)'; \
-	unique=`for i in $$list; do echo $$i; done | \
-	  awk '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)config.hin$$unique$(LISP)$$tags" \
-	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.hin $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
-	-rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	-rm -rf $(distdir)
-	GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
-	mkdir $(distdir)/=build
-	mkdir $(distdir)/=inst
-	dc_install_base=`cd $(distdir)/=inst && pwd`; \
-	cd $(distdir)/=build \
-	  && ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist
-	-rm -rf $(distdir)
-	@banner="$(distdir).tar.gz is ready for distribution"; \
-	dashes=`echo "$$banner" | sed s/./=/g`; \
-	echo "$$dashes"; \
-	echo "$$banner"; \
-	echo "$$dashes"
-dist: distdir
-	-chmod -R a+r $(distdir)
-	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-	-rm -rf $(distdir)
-dist-all: distdir
-	-chmod -R a+r $(distdir)
-	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-	-rm -rf $(distdir)
-distdir: $(DISTFILES)
-	-rm -rf $(distdir)
-	mkdir $(distdir)
-	-chmod 777 $(distdir)
-	@for file in $(DISTFILES); do \
-	  d=$(srcdir); \
-	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
-	    || cp -p $$d/$$file $(distdir)/$$file || :; \
-	  fi; \
-	done
-	for subdir in $(SUBDIRS); do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d $(distdir)/$$subdir \
-	    || mkdir $(distdir)/$$subdir \
-	    || exit 1; \
-	    chmod 777 $(distdir)/$$subdir; \
-	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-info-am:
-info: info-recursive
-dvi-am:
-dvi: dvi-recursive
-check-am: all-am
-check: check-recursive
-installcheck-am:
-installcheck: installcheck-recursive
-all-recursive-am: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-install-exec-am:
-install-exec: install-exec-recursive
-
-install-data-am:
-install-data: install-data-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-recursive
-uninstall-am:
-uninstall: uninstall-recursive
-all-am: Makefile config.h
-all-redirect: all-recursive-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs: installdirs-recursive
-installdirs-am:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
-
-mostlyclean: mostlyclean-recursive
-
-clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
-
-clean: clean-recursive
-
-distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
-
-distclean: distclean-recursive
-	-rm -f config.status
-
-maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
-		maintainer-clean-generic distclean-am
-	@echo "This command is intended for maintainers to use;"
-	@echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f config.status
-
-.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
-install-data-recursive uninstall-data-recursive install-exec-recursive \
-uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
-all-recursive check-recursive installcheck-recursive info-recursive \
-dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
-maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
-install-exec-am install-exec install-data-am install-data install-am \
-install uninstall-am uninstall all-redirect all-am all installdirs-am \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff -Nur grep-2.3/Makefile.in.rej grep-ja-2.3/Makefile.in.rej
--- grep-2.3/Makefile.in.rej	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/Makefile.in.rej	Thu Jan  1 09:00:00 1970
@@ -1,115 +0,0 @@
-***************
-*** 15,20 ****
-  # along with this program; if not, write to the Free Software
-  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-  SHELL = /bin/sh
-  
-  #### Start of system configuration section. ####
---- 15,23 ----
-  # along with this program; if not, write to the Free Software
-  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-+ # Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-+ # Last change: Jul. 12, 1993 by t^2
-+ 
-  SHELL = /bin/sh
-  
-  #### Start of system configuration section. ####
-***************
-*** 39,44 ****
-  #			gcc defines this automatically.
-  DEFS=-DGREP @DEFS@
-  
-  # Extra libraries.
-  LIBS=@LIBS@
-  ALLOCA=@ALLOCA@
---- 42,54 ----
-  #			gcc defines this automatically.
-  DEFS=-DGREP @DEFS@
-  
-+ # Things you might set to MBCTYPE_DEF to spec. default multi-byte char type.
-+ # -DEUC			will make default multi-byte char type EUC and
-+ # -DSJIS		SJIS.
-+ #			If you do not set EUC/SJIS, grep assumes no multi-byte
-+ #			char as default.
-+ MBCTYPE_DEF=-DEUC
-+ 
-  # Extra libraries.
-  LIBS=@LIBS@
-  ALLOCA=@ALLOCA@
-***************
-*** 68,78 ****
-  
-  #### End of system configuration section. ####
-  
-- SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c
-- OBJS=grep.o getopt.o regex.o dfa.o kwset.o obstack.o search.o
-  
-  .c.o:
-- 	$(CC) $(CFLAGS) $(DEFS) -I$(srcdir) -c $<
-  
-  all: grep check.done
-  
---- 78,88 ----
-  
-  #### End of system configuration section. ####
-  
-+ SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c mbc.c
-+ OBJS=grep.o getopt.o regex.o dfa.o kwset.o obstack.o search.o mbc.o
-  
-  .c.o:
-+ 	$(CC) $(CFLAGS) $(DEFS) $(MBCTYPE_DEF) -I$(srcdir) -c $<
-  
-  all: grep check.done
-  
-***************
-*** 90,96 ****
-  	$(LN) $(bindir)/$(binprefix)grep $(bindir)/$(binprefix)egrep
-  	rm -f $(bindir)/$(binprefix)fgrep
-  	$(LN) $(bindir)/$(binprefix)grep $(bindir)/$(binprefix)fgrep	
-- 	$(INSTALL_DATA) $(srcdir)/grep.man $(mandir)/grep.$(manext)
-  
-  check:
-  	AWK=$(AWK) sh $(srcdir)/tests/check.sh $(srcdir)/tests
---- 100,106 ----
-  	$(LN) $(bindir)/$(binprefix)grep $(bindir)/$(binprefix)egrep
-  	rm -f $(bindir)/$(binprefix)fgrep
-  	$(LN) $(bindir)/$(binprefix)grep $(bindir)/$(binprefix)fgrep	
-+ 	$(INSTALL_DATA) $(srcdir)/grep.man $(mandir)/$(manprefix)grep.$(manext)
-  
-  check:
-  	AWK=$(AWK) sh $(srcdir)/tests/check.sh $(srcdir)/tests
-***************
-*** 119,127 ****
-  
-  dist:
-  	V=`sed -n '/version\\[/s/.*\\([0-9][0-9]*\\.[0-9]*\\).*/\\1/p' \
-  	grep.c`; \
-  	mkdir grep-$$V; mkdir grep-$$V/tests; \
-- 	for f in `awk '{print $$1}' MANIFEST`; do ln $$f grep-$$V/$$f; done; \
-  	tar cvhf - grep-$$V | gzip > grep-$$V.tar.z; \
-  	rm -fr grep-$$V
-  
---- 129,139 ----
-  
-  dist:
-  	V=`sed -n '/version\\[/s/.*\\([0-9][0-9]*\\.[0-9]*\\).*/\\1/p' \
-+ 	grep.c`+mb`sed -n '/^ + multi-byte/s/[^0-9]*\\([0-9.]*\\).*/\\1/p' \
-  	grep.c`; \
-  	mkdir grep-$$V; mkdir grep-$$V/tests; \
-+ 	for f in `awk '{print $$1}' MANIFEST MANIFEST.MB`; \
-+ 	do ln $$f grep-$$V/$$f; done; \
-  	tar cvhf - grep-$$V | gzip > grep-$$V.tar.z; \
-  	rm -fr grep-$$V
-  
-***************
-*** 131,133 ****
-  kwset.o search.o: kwset.h
-  kwset.o obstack.o: obstack.h
-  regex.o search.o: regex.h
---- 143,146 ----
-  kwset.o search.o: kwset.h
-  kwset.o obstack.o: obstack.h
-  regex.o search.o: regex.h
-+ grep.o regex.o dfa.o search.o mbc.o: mbc.h
diff -Nur grep-2.3/Makefile.msc grep-ja-2.3/Makefile.msc
--- grep-2.3/Makefile.msc	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/Makefile.msc	Thu Jan  1 09:00:00 1970
@@ -1,138 +0,0 @@
-# Generated automatically from Makefile.in by configure.
-# Makefile for GNU grep
-# Copyright (C) 1992 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-# Last change: Jul. 23, 1993 by t^2
-
-#### Start of system configuration section. ####
-
-srcdir=.
-VPATH=.
-
-AWK=gawk
-INSTALL=cp
-INSTALL_PROGRAM=$(INSTALL)
-INSTALL_DATA=$(INSTALL)
-
-CC=cl -nologo -D__STDC__ -AL
-LINT=lint
-
-# Things you might add to DEFS:
-# -DSTDC_HEADERS	If you have ANSI C headers and libraries.
-# -DHAVE_UNISTD_H	If you have unistd.h.
-# -DUSG			If you have System V/ANSI C string
-#			and memory functions and headers.
-# -D__CHAR_UNSIGNED__	If type `char' is unsigned.
-#			gcc defines this automatically.
-#
-# For DOS, add those to DEFS.dos.
-
-# Things you might set to MBCTYPE_DEF to spec. default multi-byte char type.
-# -DEUC			will make default multi-byte char type EUC and
-# -DSJIS		SJIS.
-#			If you do not set EUC/SJIS, grep assumes no multi-byte
-#			char as default.
-MBCTYPE_DEF=-DSJIS
-
-# Extra libraries.
-LIBS=setargv/noe/st:30000
-ALLOCA=
-
-CFLAGS=-Ox
-LDFLAGS=$(CFLAGS)
-
-prefix=
-exec_prefix=$(prefix)
-
-# Prefix for installed program, normally empty or `g'.
-binprefix= 
-# Prefix for installed man page, normally empty or `g'.
-manprefix= 
-
-# Where to install executables.
-bindir=$(exec_prefix)/bin
-
-# Where to install man pages.
-mandir=$(prefix)/man/man1
-
-# Extension for man pages.
-manext=1
-
-# How to make a hard link.
-LN=cp
-
-#### End of system configuration section. ####
-
-SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c mbc.c
-OBJS=grep.obj getopt.obj regex.obj dfa.obj kwset.obj obstack.obj search.obj mbc.obj
-
-.c.obj:
-	cat DEFS.dos $< > $*_.c
-	$(CC) $(CFLAGS) $(MBCTYPE_DEF) -I$(srcdir) -c -Fo$@ $*_.c
-	rm $*_.c
-
-all: grep.exe check.don
-
-# For Saber C.
-grep.loa: $(SRCS)
-	#load $(CFLAGS) $(DEFS) -I$(srcdir) (SRCS)
-
-# For Lint.
-grep.lin: $(SRCS)
-	$(LINT) $(CFLAGS) $(DEFS) -I$(srcdir) $(SRCS)
-
-install: all
-	$(INSTALL_PROGRAM) grep.exe $(bindir)/$(binprefix)grep.exe
-	rm -f $(bindir)/$(binprefix)egrep.exe
-	$(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)egrep.exe
-	rm -f $(bindir)/$(binprefix)fgrep.exe
-	$(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)fgrep.exe
-
-check:
-	tests\check
-	echo done >check.don
-
-check.don: grep.exe
-	tests\check
-	echo done >check.don
-
-grep.exe: $(OBJS)
-	echo $(OBJS:.obj =.obj+)+>link.tmp
-	echo $(LIBS)>>link.tmp
-	echo $@/noi;>>link.tmp
-	link @link.tmp
-	rm link.tmp
-
-clean:
-	rm -f grep.exe *.obj check.don tmp.bat tmp.in khadafy.out
-
-mostlycl: clean
-
-distclea: clean
-	rm -f Makefile config.sta
-
-realclea: distclea
-	rm -f TAGS
-
-# Some header file dependencies that really ought to be automatically deduced.
-dfa.obj search.obj: dfa.h
-grep.obj search.obj: grep.h
-kwset.obj search.obj: kwset.h
-kwset.obj obstack.obj: obstack.h
-regex.obj search.obj: regex.h
-grep.obj regex.obj dfa.obj search.obj mbc.obj: mbc.h
diff -Nur grep-2.3/README.MB grep-ja-2.3/README.MB
--- grep-2.3/README.MB	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/README.MB	Thu Jan  1 09:00:00 1970
@@ -1,327 +0,0 @@
-●●●●● 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:
diff -Nur grep-2.3/README.MB.New grep-ja-2.3/README.MB.New
--- grep-2.3/README.MB.New	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/README.MB.New	Sat Mar 25 15:48:39 2000
@@ -0,0 +1,382 @@
+GNU grep version 2.3 + multi-byte extension 2.0.1
+
+	DATE:   2000-03-25 (Sat)
+	AUTHOR: GOTO Masanori <gotom@debian.or.jp>
+
+* What is this?
+
+	This is GNU grep 2.3 , with multi-byte extension, called `grep-ja'.
+        Original extension patch version based on grep 2.0 was made by t^2.
+	I ported it (grep-2.0+mb1.04) to grep-2.3.
+	Eventually, I indend to develop this patch including into GNU grep
+	2.4 or later.
+
+
+* Extension
+
+	This patch extends with multi byte support.
+
+	Adding arguments are:
+
+		-Wctype=ASCII : Works as same as original GNU grep.
+
+		-Wctype=EUC : Recognize EUC as multibyte characters.
+
+		-Wctype=SJIS : Recognize SJIS as multibyte characters.
+
+	Default setting is EUC.
+	UTF-8, UCS-2/4 support are future works.
+	In addtion, there is a grep which can deal with many encodings,
+	called `lgrep', a part of `lv'.
+	In detail, see, http://www.ff.iij4u.or.jp/~nrt/lv .
+
+
+* License
+
+	GPL.
+
+
+* New extension changes
+    
+    The most important change I modified is not to
+    guarantee running on DOS system in this version (grep-ja 2.3+mb2.0).
+    Maybe you cannot compile or run this source on DOS.
+
+    Original Documents are in old-ja directory, but documents are
+    described in Japanese. If you cannot read Japanese and want to
+    know what is written, contact to me.
+    
+
+* Documents
+
+	Original GNU grep 2.3 does not include below files.
+
+	This patch added:
+		INSTALL.MB: How to install.
+		ChangeLog.MB.New: ChangeLog with this patch.
+		README.MB.New:    This file.
+		README.MB.New.ja: Japanese version of README.MB.New .
+
+	grep-2.0-MB-extension patch including files:
+
+		ChangeLog.MB  MANIFEST.MB   README.MB
+		DEFS.dos      Makefile.msc  README.MSC
+
+	are moved into old-ja directory. If you want know in detail,
+	see these documents (described in Japanese).
+
+
+* MS-DOS support
+
+	Original grep-2.0-MB-extension patch includes MS-DOS support,
+	but this patch does not consider these old systems.
+
+
+* INSTALL
+
+	See, INSTALL file.
+	If you set default reconization of multi byte characters, 
+	see Makefile.in like:
+
+        MBCTYPE_DEF=-DSJIS              (Default is Shift-JIS extension)
+        MBCTYPE_DEF=-DEUC               (Default is EUC extension)
+        MBCTYPE_DEF=                    (Default is not to use extension)
+
+	You can select default multibyte code with arguments.
+	All other options are as same as original GNU grep.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+           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:
diff -Nur grep-2.3/README.MB.New.ja grep-ja-2.3/README.MB.New.ja
--- grep-2.3/README.MB.New.ja	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/README.MB.New.ja	Sat Mar 25 15:48:18 2000
@@ -0,0 +1,152 @@
+GNU grep version 2.3 + multi-byte extension 2.0.1
+
+	日付:   2000-03-25 (Sat)
+	作者:   後藤 正徳 (GOTO, Masanori) <gotom@debian.or.jp>
+
+
+grep_2.3+mb_2.0.1 : grep-ja 2.3 version 2.0.1
+   ---  GNU grep 2.3 マルチバイト文字対応版 2.0.1
+
+* 概要
+
+	GNU grep, egrep, fgrep (以下単に grep) をマルチバイト文字に
+	対応させたものです。
+
+	これは、1994年 6月 2日に t^2 氏によって grep 2.0 を
+	マルチバイト文字対応するように作成された
+	GNU grep version 2.0 + multi-byte extension 1.04
+	(grep-2.0+mb1.04 -- マルチバイト文字対応版 GNU grep)
+	を元に、grep 2.3 へ移植を図ったものです。
+	最終的には GNU grep 2.4 に取り込むことを意図としています。
+
+
+* 使用法
+
+	grep 2.3 に対し、grep-2.0+mb1.04 と同様に以下の拡張
+	が施されています。grep 2.3 からの拡張部分のみ説明します。
+
+	増えた引数は以下の通りです。
+
+            -Wctype=ASCII
+                マルチバイト文字を考慮しません.  このオプションを使用した場
+                合, grep のオリジナルと同じ動作になるはずです.
+
+            -Wctype=EUC
+                マルチバイト文字として EUC を認識します.
+
+            -Wctype=SJIS
+                マルチバイト文字として Shift-JIS を認識します.
+
+	デフォルトでは EUC が設定されているように振る舞います。
+	UTF-8, UCS-2/4 等他のエンコーディングは需要次第です。
+	なお、これらを扱える grep として lv 付属の lgrep があります。
+	詳細は http://www.ff.iij4u.or.jp/~nrt/lv を参照下さい。
+
+
+* ライセンス
+
+	本パッチも含めて GPL です。
+
+	
+* 新規変更
+
+	最も大きな変更は、オリジナルの grep-ja 2.0 パッチから
+	対象を 2.3 へ移植したことにあります。
+
+	またそれにともないドキュメントを改編しました。
+	オリジナルの grep-ja パッチのドキュメントは
+	old-ja ディレクトリにあります。
+
+
+* アーカイブに含まれているドキュメント
+
+	オリジナルの grep-ja パッチには含まれていない新規ファイル:
+
+		INSTALL.MB: インストールするためのポインタが示されています。
+		ChangeLog.MB.New: 本パッチから加えて変更。
+		README.MB.New: 本パッチから追加。英語版
+		README.MB.New.ja: 上記 README.MB.New の日本語版。本ファイル。
+	
+	オリジナルの grep-ja パッチに含まれていたファイル:
+
+		ChangeLog.MB  MANIFEST.MB   README.MB
+		DEFS.dos      Makefile.msc  README.MSC
+
+	これらは old-ja ディレクトリに移動してあります。
+	併せて参考にしてください。
+
+
+* MS-DOS に対するサポートについて
+
+	このパッチには MS-DOS のサポートは特に考慮されていません。
+	そのため場合によっては動作しない可能性があります。
+	また、今後オリジナルの MS-DOS サポート部分を
+	更に削除するかも知れません。
+
+	この結果、以下のファイルをパッチからはずし、削除しました。
+
+	* MS-DOS 版 GREP.EXE。
+	* GNU roff でフォーマット済みのマニュアル。
+
+	またコマンドライン引数の拡張として
+	元は MS-C の setargv.obj をリンクしていますが、
+	本パッチもその動作は対象外としています。
+
+
+* インストール
+
+	基本的に Un*x 準拠の OS を対象として記述してあります。
+
+	デフォルトのマルチバイト文字設定を、Makefile.in の中で指定します. 
+	デフォルトを Shift-JIS とする場合と, デフォルトでマルチバイト文字を
+	使用しない場合は Makefile.in の MBCTYPE_DEF マクロの定義をそれぞれ以
+	下のように変えてください.
+
+        MBCTYPE_DEF=-DSJIS              (デフォルトで Shift-JIS の場合)
+        MBCTYPE_DEF=                    (デフォルトで使用しない場合)
+
+	いずれの場合でも起動時のオプションによりマルチバイト文字コードの選択
+	が可能です.
+
+	その他の作業は, オリジナルの grep と同様ですので INSTALL をお読みく
+	ださい.
+
+* バグ
+
+	以下はオリジナルの grep-ja からあるものです。
+	将来的な対応は未定です。
+
+    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 
+       としてカウントした値になります.  (手抜き)
+
+
+	また本パッチに存在するものは以下の通りです。
+
+	1. ASCII, EUC, SJIS 以外のエンコーディングに対応していない。
+
+	2. MS-DOS サポートがない。
+
+	
+	十分なテストが済んでないので、この他にもあるかもしれません。
+
+
+* そのほか
+
+	このパッチのメンテナンスは
+		後藤 正徳 (gotom@debian.or.jp)
+	が行っています。
+
diff -Nur grep-2.3/README.MSC grep-ja-2.3/README.MSC
--- grep-2.3/README.MSC	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/README.MSC	Thu Jan  1 09:00:00 1970
@@ -1,99 +0,0 @@
-PC-9801 用 MS-C version 6.00A の引数のセットアップルーチンにはバグがあり
-ます.
-
-#include <stdio.h>
-
-int
-main(int argc, char **argv)
-{
-  int i;
-
-  for (i = 0; i <= argc; i++)
-    printf("argv[%d] == %s\n", i, argv[i]);
-  return 0;
-}
-
-をコンパイル, リンクした FOO.EXE に
-
-  A>foo "\\" abc
-
-などの引数を渡して実行すると, バグが確認できます.  また, ワイルドカード
-展開ルーチンにもバグがあり, 上記のプログラムを SETARGV.OBJ とともにリン
-クして
-
-  A>foo \DOS\*.com
-
-などの引数で実行すると, おかしな展開の仕方をしてしまいます.
-
-このバグは SOURCE/STARTUP 下の DOS/STDARGV.ASM および WILD.C に以下のパッ
-チを当てると修正できるようです.  パッチを当てて STARTUP.BAT でコンパイル
-してください. その後, 例えばラージモデル用のライブラリを修正する場合,
-L/DOS/STDARGV.OBJ, L/DOS/_SETARGV.OBJ, L/WILD.OBJ をそれぞれ 
-KSTDARGV.OBJ, _KSTARGV.OBJ, KWILD.OBJ とリネームし,
-
-  lib \msc6\lib\llibce.lib-+dos\kstdargv.obj-+dos\_kstargv.obj-+kwild.obj;
-
-などとしてモジュールを更新してください.  念のためこの作業を行う前に,
-
-  lib \msc6\lib\llibce.lib*kstdargv.obj*_kstargv.obj*kwild.obj;
-
-などで, kstdargv.obj, _kstargv.obj, kwild.obj のバックアップをとって置く
-といいでしょう.
-
-なお, このパッチは当然のことながら無保証です.
-
-Mar. 5, 1994                                                      t^2
-
-*** stdargv.org	Mon Oct  8 19:50:46 1990
---- stdargv.asm	Thu Jul 22 17:50:44 1993
-***************
-*** 409,415 ****
-  	shr	cx,1
-  	adc	dx,cx		; add 1 for every pair of backslashes
-  	test	al,1		; plus 1 for the " if odd number of \
-! 	jz	arg310		; [J1]
-  	jmp	arg210		; [J1]
-  ;
-  ; Command line is fully parsed - compute number of bytes needed
---- 409,415 ----
-  	shr	cx,1
-  	adc	dx,cx		; add 1 for every pair of backslashes
-  	test	al,1		; plus 1 for the " if odd number of \
-! 	jnz	arg310		; ! Jul.21.93 t^2
-  	jmp	arg210		; [J1]
-  ;
-  ; Command line is fully parsed - compute number of bytes needed
-
-*** wild.org	Mon Oct  8 19:49:48 1990
---- wild.c	Sat Mar  5 00:42:12 1994
-***************
-*** 186,197 ****
-      char    *ptr2 = arg;                    // [J1]
-  
-      if(ptr != arg) {                        // [J1]
-!         while(ptr2 + 1 != ptr && *ptr2 != SLASHCHAR && *ptr2 != FWDSLASHCHAR
-!                 && *ptr2 != ':') {          // [J1]
-              if(iskanji(*ptr2))  ptr2++;     // [J1]
-              ptr2++;                         // [J1]
-          }                                   // [J1]
-!         ptr = ptr2;                         // [J1]
-      }                                       // [J1]
-  
-      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
---- 186,201 ----
-      char    *ptr2 = arg;                    // [J1]
-  
-      if(ptr != arg) {                        // [J1]
-! 	char *ptr3 = arg;
-! 
-!         while (ptr2 < ptr) {
-! 	    if (*ptr2 == SLASHCHAR || *ptr2 == FWDSLASHCHAR
-! 		|| *ptr2 == ':')
-! 		ptr3 = ptr2;
-              if(iskanji(*ptr2))  ptr2++;     // [J1]
-              ptr2++;                         // [J1]
-          }                                   // [J1]
-! 	ptr = ptr3;
-      }                                       // [J1]
-  
-      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
diff -Nur grep-2.3/bootstrap/Makefile.in grep-ja-2.3/bootstrap/Makefile.in
--- grep-2.3/bootstrap/Makefile.in	Mon Feb 15 09:43:50 1999
+++ grep-ja-2.3/bootstrap/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -122,7 +122,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/configure.in.orig grep-ja-2.3/configure.in.orig
--- grep-2.3/configure.in.orig	Mon Feb 15 09:39:16 1999
+++ grep-ja-2.3/configure.in.orig	Thu Jan  1 09:00:00 1970
@@ -1,80 +0,0 @@
-# Configuration for grep
-#
-# Alain Magloire <alainm@rcsm.ee.mcgill.ca>
-#
-dnl Process this file with autoconf to produce a configure script
-AC_INIT(src/grep.c)
-AC_DEFINE(GREP)
-AC_PREREQ(2.13)
-
-dnl Automake stuff.
-AM_INIT_AUTOMAKE(grep, 2.3)
-AM_CONFIG_HEADER(config.h:config.hin)
-
-dnl Checks for programs.
-AC_PROG_AWK
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_RANLIB
-
-# From Paul Eggert.
-# If available, prefer support for large files unless the user specified
-# one of the CPPFLAGS, LDFLAGS, or LIBS variables.
-AC_LFS
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_TYPE_SIZE_T
-AC_C_CONST
-
-dnl Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS(string.h stdlib.h sys/param.h memory.h unistd.h libintl.h)
-AC_CHECK_HEADERS(wctype.h wchar.h, USE_WCHAR=yes, USE_WCHAR=no)
-AC_HEADER_DIRENT
-AC_HEADER_STAT
-
-dnl Checks for functions.
-AC_FUNC_ALLOCA
-AC_FUNC_CLOSEDIR_VOID
-AC_FUNC_MMAP
-dnl getpagesize is checked for by AC_FUNC_MMAP.
-AC_CHECK_FUNCS(strerror isascii setmode)
-AC_REPLACE_FUNCS(memchr stpcpy)
-dnl Solaris 2.5 doesn't have btowc()
-if test "$USE_WCHAR" = "yes"; then
-	AC_REPLACE_FUNCS(btowc)
-dnl Solaris puts wctype/wXXX() in /usr/lib/libw.a
-	AC_CHECK_LIB(w, wctype, [LIBS="$LIBS -lw"])
-fi
-
-dnl for VC++
-if test x$ac_cv_prog_CC = xcl ; then
-	AC_DEFINE(alloca, _alloca)
-fi
-
-
-dnl I18N feature
-ALL_LINGUAS="de es el fr ko nl no pl ru sl sv"
-AM_GNU_GETTEXT
-AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
-AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
-
-dnl DOS file name convention
-dnl sets HAVE_DOS_FILE_NAMES
-AC_DOSFILE
-
-dnl check for the environ separator
-dnl sets SEP
-AM_SEP
-
-dnl OS specifics
-dnl sets {EXE,OBJ}EXT
-AC_EXEEXT
-AC_OBJEXT
-
-dnl some folks ask for this, that's fine by me
-dnl hope they know what they're doing ...
-dnl if glibc2 regex is not included
-jm_INCLUDED_REGEX(src/regex.c)
-
-AC_OUTPUT(Makefile src/Makefile tests/Makefile po/Makefile.in intl/Makefile doc/Makefile m4/Makefile djgpp/Makefile vms/Makefile bootstrap/Makefile, [sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile; echo timestamp > stamp-h])
diff -Nur grep-2.3/configure.in.rej grep-ja-2.3/configure.in.rej
--- grep-2.3/configure.in.rej	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/configure.in.rej	Thu Jan  1 09:00:00 1970
@@ -1,17 +0,0 @@
-***************
-*** 11,17 ****
-  AC_UNISTD_H
-  AC_SIZE_T
-  AC_ALLOCA
-- AC_HAVE_FUNCS(getpagesize memchr strerror valloc)
-  AC_CHAR_UNSIGNED
-  AC_CONST
-  echo checking for working mmap
---- 11,17 ----
-  AC_UNISTD_H
-  AC_SIZE_T
-  AC_ALLOCA
-+ AC_HAVE_FUNCS(getpagesize memchr strerror valloc bcopy memmove strcasecmp)
-  AC_CHAR_UNSIGNED
-  AC_CONST
-  echo checking for working mmap
diff -Nur grep-2.3/configure.orig grep-ja-2.3/configure.orig
--- grep-2.3/configure.orig	Mon Feb 15 09:43:23 1999
+++ grep-ja-2.3/configure.orig	Thu Jan  1 09:00:00 1970
@@ -1,4574 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13 
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
-  --disable-nls           do not use Native Language Support"
-ac_help="$ac_help
-  --with-included-gettext use the GNU gettext library included here"
-ac_help="$ac_help
-  --with-catgets          use catgets functions if available"
-ac_help="$ac_help
-  --without-included-regex don't compile regex; this is the default on
-                          systems with version 2 of the GNU C library
-                          (use with caution on other system)"
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case "$ac_option" in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir="$ac_optarg" ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.13"
-    exit 0 ;;
-
-  -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
-
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
-    ;;
-
-  *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: WARNING: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
-  esac
-done
-
-# Support of DJGPP port of bash.
-if test -n "$COMSPEC$ComSpec"; then ac_x=-x; else ac_x=-f; fi
-
-# 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
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=src/grep.c
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
-  else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
-  fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
-else
-  echo "creating cache $cache_file"
-  > $cache_file
-fi
-
-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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='	'
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-
-cat >> confdefs.h <<\EOF
-#define GREP 1
-EOF
-
-
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
-fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:575: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
-  for ac_dir in $PATH; do
-    # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
-    *)
-      # OSF1 and SCO ODT 3.0 have their own names for install.
-      # Don't use installbsd from OSF since it installs stuff as root
-      # by default.
-      for ac_prog in ginstall scoinst install; do
-        if test $ac_x $ac_dir/$ac_prog; then
-	  if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  else
-	    ac_cv_path_install="$ac_dir/$ac_prog -c"
-	    break 2
-	  fi
-	fi
-      done
-      ;;
-    esac
-  done
-  IFS="$ac_save_IFS"
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
-  fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:628: checking whether build environment is sane" >&5
-# Just in case
-sleep 1
-echo timestamp > conftestfile
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftestfile`
-   fi
-   if test "$*" != "X $srcdir/configure conftestfile" \
-      && test "$*" != "X conftestfile $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" 1>&2; exit 1; }
-   fi
-
-   test "$2" = conftestfile
-   )
-then
-   # Ok.
-   :
-else
-   { echo "configure: error: newly created file is older than distributed files!
-Check your system clock" 1>&2; exit 1; }
-fi
-rm -f conftest*
-echo "$ac_t""yes" 1>&6
-if test "$program_transform_name" = s,x,x,; then
-  program_transform_name=
-else
-  # Double any \ or $.  echo might interpret backslashes.
-  cat <<\EOF_SED > conftestsed
-s,\\,\\\\,g; s,\$,$$,g
-EOF_SED
-  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
-  rm -f conftestsed
-fi
-test "$program_prefix" != NONE &&
-  program_transform_name="s,^,${program_prefix},; $program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
-
-# sed with no file args requires a program.
-test "$program_transform_name" = "" && program_transform_name="s,x,x,"
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:685: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftestmake <<\EOF
-all:
-	@echo 'ac_maketemp="${MAKE}"'
-EOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftestmake
-fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  SET_MAKE=
-else
-  echo "$ac_t""no" 1>&6
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-
-PACKAGE=grep
-
-VERSION=2.3
-
-if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
-  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
-fi
-cat >> confdefs.h <<EOF
-#define PACKAGE "$PACKAGE"
-EOF
-
-cat >> confdefs.h <<EOF
-#define VERSION "$VERSION"
-EOF
-
-
-
-missing_dir=`cd $ac_aux_dir && pwd`
-echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:731: checking for working aclocal" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (aclocal --version) < /dev/null > /dev/null 2>&1; then
-   ACLOCAL=aclocal
-   echo "$ac_t""found" 1>&6
-else
-   ACLOCAL="$missing_dir/missing aclocal"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:744: checking for working autoconf" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (autoconf --version) < /dev/null > /dev/null 2>&1; then
-   AUTOCONF=autoconf
-   echo "$ac_t""found" 1>&6
-else
-   AUTOCONF="$missing_dir/missing autoconf"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:757: checking for working automake" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (automake --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake
-   echo "$ac_t""found" 1>&6
-else
-   AUTOMAKE="$missing_dir/missing automake"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:770: checking for working autoheader" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (autoheader --version) < /dev/null > /dev/null 2>&1; then
-   AUTOHEADER=autoheader
-   echo "$ac_t""found" 1>&6
-else
-   AUTOHEADER="$missing_dir/missing autoheader"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:783: checking for working makeinfo" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
-   MAKEINFO=makeinfo
-   echo "$ac_t""found" 1>&6
-else
-   MAKEINFO="$missing_dir/missing makeinfo"
-   echo "$ac_t""missing" 1>&6
-fi
-
-
-
-
-
-
-for ac_prog in mawk gawk nawk awk
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:805: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_prog_AWK="$ac_prog"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-fi
-fi
-AWK="$ac_cv_prog_AWK"
-if test -n "$AWK"; then
-  echo "$ac_t""$AWK" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-test -n "$AWK" && break
-done
-
-# 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:837: 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
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_prog_CC="gcc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$CC"; then
-  # 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:867: 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
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_prog_rejected=no
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
-        ac_prog_rejected=yes
-	continue
-      fi
-      ac_cv_prog_CC="cc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# -gt 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    set dummy "$ac_dir/$ac_word" "$@"
-    shift
-    ac_cv_prog_CC="$@"
-  fi
-fi
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-  if test -z "$CC"; then
-    case "`uname -s`" in
-    *win32* | *WIN32*)
-      # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:918: 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
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_prog_CC="cl"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
- ;;
-    esac
-  fi
-  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:950: 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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext << EOF
-
-#line 961 "configure"
-#include "confdefs.h"
-
-main(){return(0);}
-EOF
-if { (eval echo configure:966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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*
-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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-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:992: 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:997: 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
-  cat > conftest.c <<EOF
-#ifdef __GNUC__
-  yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1006: \"$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
-fi
-fi
-
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
-
-if test $ac_cv_prog_gcc = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-
-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:1025: 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
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1068: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
-  for ac_dir in $PATH; do
-    # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
-    *)
-      # OSF1 and SCO ODT 3.0 have their own names for install.
-      # Don't use installbsd from OSF since it installs stuff as root
-      # by default.
-      for ac_prog in ginstall scoinst install; do
-        if test $ac_x $ac_dir/$ac_prog; then
-	  if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  else
-	    ac_cv_path_install="$ac_dir/$ac_prog -c"
-	    break 2
-	  fi
-	fi
-      done
-      ;;
-    esac
-  done
-  IFS="$ac_save_IFS"
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
-  fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-# 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:1123: 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
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-# From Paul Eggert.
-# If available, prefer support for large files unless the user specified
-# one of the CPPFLAGS, LDFLAGS, or LIBS variables.
-  # If available, prefer support for large files unless the user specified
-  # one of the CPPFLAGS, LDFLAGS, or LIBS variables.
-  echo $ac_n "checking whether large file support needs explicit enabling""... $ac_c" 1>&6
-echo "configure:1157: checking whether large file support needs explicit enabling" >&5
-  ac_getconfs=''
-  ac_result=yes
-  ac_set=''
-  ac_shellvars='CPPFLAGS LDFLAGS LIBS'
-  for ac_shellvar in $ac_shellvars; do
-    case $ac_shellvar in
-      CPPFLAGS) ac_lfsvar=LFS_CFLAGS ;;
-      *) ac_lfsvar=LFS_$ac_shellvar ;;
-    esac
-    eval test '"${'$ac_shellvar'+set}"' = set && ac_set=$ac_shellvar
-    (getconf $ac_lfsvar) >/dev/null 2>&1 || { ac_result=no; break; }
-    ac_getconf=`getconf $ac_lfsvar`
-    ac_getconfs=$ac_getconfs$ac_getconf
-    eval ac_test_$ac_shellvar=\$ac_getconf
-  done
-  case "$ac_result$ac_getconfs" in
-    yes) ac_result=no ;;
-  esac
-  case "$ac_result$ac_set" in
-    yes?*) ac_result="yes, but $ac_set is already set, so use its settings"
-  esac
-  echo "$ac_t""$ac_result" 1>&6
-  case $ac_result in
-    yes)
-      for ac_shellvar in $ac_shellvars; do
-	eval $ac_shellvar=\$ac_test_$ac_shellvar
-      done ;;
-  esac
-
-
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1189: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
-  cat > conftest.$ac_ext <<EOF
-#line 1204 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1210: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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 <<EOF
-#line 1221 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1227: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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} -nologo -E"
-  cat > conftest.$ac_ext <<EOF
-#line 1238 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1244: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
-fi
-  CPP="$ac_cv_prog_CPP"
-else
-  ac_cv_prog_CPP="$CPP"
-fi
-echo "$ac_t""$CPP" 1>&6
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1269: 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 <<EOF
-#line 1274 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-
-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
-#line 1299 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-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
-#line 1317 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
-  :
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1338 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:1349: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./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
-if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1373: 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 <<EOF
-#line 1378 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_size_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_size_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_size_t" 1>&6
-if test $ac_cv_type_size_t = no; then
-  cat >> confdefs.h <<\EOF
-#define size_t unsigned
-EOF
-
-fi
-
-echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1406: checking for working const" >&5
-if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1411 "configure"
-#include "confdefs.h"
-
-int main() {
-
-/* Ultrix mips cc rejects this.  */
-typedef int charset[2]; const charset x;
-/* SunOS 4.1.1 cc rejects this.  */
-char const *const *ccp;
-char **p;
-/* NEC SVR4.0.2 mips cc rejects this.  */
-struct point {int x, y;};
-static struct point const zero = {0,0};
-/* AIX XL C 1.02.0.0 rejects this.
-   It does not let you subtract one const X* pointer from another in an arm
-   of an if-expression whose if-part is not a constant expression */
-const char *g = "string";
-ccp = &g + (g ? g-g : 0);
-/* HPUX 7.0 cc rejects these. */
-++ccp;
-p = (char**) ccp;
-ccp = (char const *const *) p;
-{ /* SCO 3.2v4 cc rejects this.  */
-  char *t;
-  char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-  *t++ = 0;
-}
-{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-  int x[] = {25, 17};
-  const int *foo = &x[0];
-  ++foo;
-}
-{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-  typedef const int *iptr;
-  iptr p = 0;
-  ++p;
-}
-{ /* AIX XL C 1.02.0.0 rejects this saying
-     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-  struct s { int j; const int *ap[3]; };
-  struct s *b; b->j = 5;
-}
-{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-  const int foo = 10;
-}
-
-; return 0; }
-EOF
-if { (eval echo configure:1460: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_c_const=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_c_const=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_c_const" 1>&6
-if test $ac_cv_c_const = no; then
-  cat >> confdefs.h <<\EOF
-#define const 
-EOF
-
-fi
-
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1482: 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 <<EOF
-#line 1487 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1495: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-
-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
-#line 1512 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-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
-#line 1530 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
-  :
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1551 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:1562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./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
-if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-for ac_hdr in string.h stdlib.h sys/param.h memory.h unistd.h libintl.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1589: 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
-#line 1594 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1599: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-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 | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-for ac_hdr in wctype.h wchar.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1629: 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
-#line 1634 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1639: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-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 | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- USE_WCHAR=yes
-else
-  echo "$ac_t""no" 1>&6
-USE_WCHAR=no
-fi
-done
-
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:1671: checking for $ac_hdr that defines DIR" >&5
-if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1676 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <$ac_hdr>
-int main() {
-DIR *dirp = 0;
-; return 0; }
-EOF
-if { (eval echo configure:1684: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  eval "ac_cv_header_dirent_$ac_safe=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_dirent_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- ac_header_dirent=$ac_hdr; break
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
-echo $ac_n "checking for opendir""... $ac_c" 1>&6
-echo "configure:1709: 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 <<EOF
-#line 1714 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char opendir(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_opendir) || defined (__stub___opendir)
-choke me
-#else
-opendir();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-  :
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-if test $ac_cv_func_opendir = no; then
- echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:1758: checking for opendir in -ldir" >&5
-ac_lib_var=`echo dir'_'opendir | 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="-ldir  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1766 "configure"
-#include "confdefs.h"
-/* 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() {
-opendir()
-; return 0; }
-EOF
-if { (eval echo configure:1777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="$LIBS -ldir"
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-fi
-else
-echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:1800: checking for opendir in -lx" >&5
-ac_lib_var=`echo x'_'opendir | 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="-lx  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1808 "configure"
-#include "confdefs.h"
-/* 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() {
-opendir()
-; return 0; }
-EOF
-if { (eval echo configure:1819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="$LIBS -lx"
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
-echo "configure:1842: checking whether stat file-mode macros are broken" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1847 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#if defined(S_ISBLK) && defined(S_IFDIR)
-# if S_ISBLK (S_IFDIR)
-You lose.
-# endif
-#endif
-
-#if defined(S_ISBLK) && defined(S_IFCHR)
-# if S_ISBLK (S_IFCHR)
-You lose.
-# endif
-#endif
-
-#if defined(S_ISLNK) && defined(S_IFREG)
-# if S_ISLNK (S_IFREG)
-You lose.
-# endif
-#endif
-
-#if defined(S_ISSOCK) && defined(S_IFREG)
-# if S_ISSOCK (S_IFREG)
-You lose.
-# endif
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "You lose" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_header_stat_broken=yes
-else
-  rm -rf conftest*
-  ac_cv_header_stat_broken=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_header_stat_broken" 1>&6
-if test $ac_cv_header_stat_broken = yes; then
-  cat >> confdefs.h <<\EOF
-#define STAT_MACROS_BROKEN 1
-EOF
-
-fi
-
-
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:1901: checking for working alloca.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1906 "configure"
-#include "confdefs.h"
-#include <alloca.h>
-int main() {
-char *p = alloca(2 * sizeof(int));
-; return 0; }
-EOF
-if { (eval echo configure:1913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  ac_cv_header_alloca_h=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_header_alloca_h=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
-if test $ac_cv_header_alloca_h = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ALLOCA_H 1
-EOF
-
-fi
-
-echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:1934: checking for alloca" >&5
-if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1939 "configure"
-#include "confdefs.h"
-
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  if HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-int main() {
-char *p = (char *) alloca(1);
-; return 0; }
-EOF
-if { (eval echo configure:1967: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  ac_cv_func_alloca_works=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_func_alloca_works=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
-if test $ac_cv_func_alloca_works = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ALLOCA 1
-EOF
-
-fi
-
-if test $ac_cv_func_alloca_works = no; then
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-  # that cause trouble.  Some versions do not even contain alloca or
-  # contain a buggy version.  If you still want to use their alloca,
-  # use ar to extract alloca.o from them instead of compiling alloca.c.
-  ALLOCA=alloca.${ac_objext}
-  cat >> confdefs.h <<\EOF
-#define C_ALLOCA 1
-EOF
-
-
-echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:1999: checking whether alloca needs Cray hooks" >&5
-if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2004 "configure"
-#include "confdefs.h"
-#if defined(CRAY) && ! defined(CRAY2)
-webecray
-#else
-wenotbecray
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "webecray" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_os_cray=yes
-else
-  rm -rf conftest*
-  ac_cv_os_cray=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_os_cray" 1>&6
-if test $ac_cv_os_cray = yes; then
-for ac_func in _getb67 GETB67 getb67; do
-  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2029: 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 <<EOF
-#line 2034 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-  cat >> confdefs.h <<EOF
-#define CRAY_STACKSEG_END $ac_func
-EOF
-
-  break
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-done
-fi
-
-echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:2084: checking stack direction for C alloca" >&5
-if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_c_stack_direction=0
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2092 "configure"
-#include "confdefs.h"
-find_stack_direction ()
-{
-  static char *addr = 0;
-  auto char dummy;
-  if (addr == 0)
-    {
-      addr = &dummy;
-      return find_stack_direction ();
-    }
-  else
-    return (&dummy > addr) ? 1 : -1;
-}
-main ()
-{
-  exit (find_stack_direction() < 0);
-}
-EOF
-if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  ac_cv_c_stack_direction=1
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_c_stack_direction=-1
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
-cat >> confdefs.h <<EOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-EOF
-
-fi
-
-echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6
-echo "configure:2133: checking whether closedir returns void" >&5
-if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_closedir_void=yes
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2141 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <$ac_header_dirent>
-int closedir(); main() { exit(closedir(opendir(".")) != 0); }
-EOF
-if { (eval echo configure:2147: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  ac_cv_func_closedir_void=no
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_func_closedir_void=yes
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$ac_cv_func_closedir_void" 1>&6
-if test $ac_cv_func_closedir_void = yes; then
-  cat >> confdefs.h <<\EOF
-#define CLOSEDIR_VOID 1
-EOF
-
-fi
-
-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:2173: 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
-#line 2178 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2183: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-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 | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-for ac_func in getpagesize
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2212: 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 <<EOF
-#line 2217 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2240: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:2265: checking for working mmap" >&5
-if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_mmap_fixed_mapped=no
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2273 "configure"
-#include "confdefs.h"
-
-/* Thanks to Mike Haertel and Jim Avera for this test.
-   Here is a matrix of mmap possibilities:
-	mmap private not fixed
-	mmap private fixed at somewhere currently unmapped
-	mmap private fixed at somewhere already mapped
-	mmap shared not fixed
-	mmap shared fixed at somewhere currently unmapped
-	mmap shared fixed at somewhere already mapped
-   For private mappings, we should verify that changes cannot be read()
-   back from the file, nor mmap's back from the file at a different
-   address.  (There have been systems where private was not correctly
-   implemented like the infamous i386 svr4.0, and systems where the
-   VM page cache was not coherent with the filesystem buffer cache
-   like early versions of FreeBSD and possibly contemporary NetBSD.)
-   For shared mappings, we should conversely verify that changes get
-   propogated back to all the places they're supposed to be.
-
-   Grep wants private fixed already mapped.
-   The main things grep needs to know about mmap are:
-   * does it exist and is it safe to write into the mmap'd area
-   * how to use it (BSD variants)  */
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-
-/* This mess was copied from the GNU getpagesize.h.  */
-#ifndef HAVE_GETPAGESIZE
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-# endif
-
-/* Assume that all systems that can run configure have sys/param.h.  */
-# ifndef HAVE_SYS_PARAM_H
-#  define HAVE_SYS_PARAM_H 1
-# endif
-
-# ifdef _SC_PAGESIZE
-#  define getpagesize() sysconf(_SC_PAGESIZE)
-# else /* no _SC_PAGESIZE */
-#  ifdef HAVE_SYS_PARAM_H
-#   include <sys/param.h>
-#   ifdef EXEC_PAGESIZE
-#    define getpagesize() EXEC_PAGESIZE
-#   else /* no EXEC_PAGESIZE */
-#    ifdef NBPG
-#     define getpagesize() NBPG * CLSIZE
-#     ifndef CLSIZE
-#      define CLSIZE 1
-#     endif /* no CLSIZE */
-#    else /* no NBPG */
-#     ifdef NBPC
-#      define getpagesize() NBPC
-#     else /* no NBPC */
-#      ifdef PAGESIZE
-#       define getpagesize() PAGESIZE
-#      endif /* PAGESIZE */
-#     endif /* no NBPC */
-#    endif /* no NBPG */
-#   endif /* no EXEC_PAGESIZE */
-#  else /* no HAVE_SYS_PARAM_H */
-#   define getpagesize() 8192	/* punt totally */
-#  endif /* no HAVE_SYS_PARAM_H */
-# endif /* no _SC_PAGESIZE */
-
-#endif /* no HAVE_GETPAGESIZE */
-
-#ifdef __cplusplus
-extern "C" { void *malloc(unsigned); }
-#else
-char *malloc();
-#endif
-
-int
-main()
-{
-	char *data, *data2, *data3;
-	int i, pagesize;
-	int fd;
-
-	pagesize = getpagesize();
-
-	/*
-	 * First, make a file with some known garbage in it.
-	 */
-	data = malloc(pagesize);
-	if (!data)
-		exit(1);
-	for (i = 0; i < pagesize; ++i)
-		*(data + i) = rand();
-	umask(0);
-	fd = creat("conftestmmap", 0600);
-	if (fd < 0)
-		exit(1);
-	if (write(fd, data, pagesize) != pagesize)
-		exit(1);
-	close(fd);
-
-	/*
-	 * Next, try to mmap the file at a fixed address which
-	 * already has something else allocated at it.  If we can,
-	 * also make sure that we see the same garbage.
-	 */
-	fd = open("conftestmmap", O_RDWR);
-	if (fd < 0)
-		exit(1);
-	data2 = malloc(2 * pagesize);
-	if (!data2)
-		exit(1);
-	data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
-	if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
-	    MAP_PRIVATE | MAP_FIXED, fd, 0L))
-		exit(1);
-	for (i = 0; i < pagesize; ++i)
-		if (*(data + i) != *(data2 + i))
-			exit(1);
-
-	/*
-	 * Finally, make sure that changes to the mapped area
-	 * do not percolate back to the file as seen by read().
-	 * (This is a bug on some variants of i386 svr4.0.)
-	 */
-	for (i = 0; i < pagesize; ++i)
-		*(data2 + i) = *(data2 + i) + 1;
-	data3 = malloc(pagesize);
-	if (!data3)
-		exit(1);
-	if (read(fd, data3, pagesize) != pagesize)
-		exit(1);
-	for (i = 0; i < pagesize; ++i)
-		if (*(data + i) != *(data3 + i))
-			exit(1);
-	close(fd);
-	unlink("conftestmmap");
-	exit(0);
-}
-
-EOF
-if { (eval echo configure:2413: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  ac_cv_func_mmap_fixed_mapped=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_func_mmap_fixed_mapped=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
-if test $ac_cv_func_mmap_fixed_mapped = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_MMAP 1
-EOF
-
-fi
-
-for ac_func in strerror isascii setmode
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2438: 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 <<EOF
-#line 2443 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2466: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-for ac_func in memchr stpcpy
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2493: 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 <<EOF
-#line 2498 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
-fi
-done
-
-
-if test "$USE_WCHAR" = "yes"; then
-	for ac_func in btowc
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2551: 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 <<EOF
-#line 2556 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2579: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
-fi
-done
-
-
-	echo $ac_n "checking for wctype in -lw""... $ac_c" 1>&6
-echo "configure:2606: checking for wctype in -lw" >&5
-ac_lib_var=`echo w'_'wctype | 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="-lw  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2614 "configure"
-#include "confdefs.h"
-/* 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 wctype();
-
-int main() {
-wctype()
-; return 0; }
-EOF
-if { (eval echo configure:2625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="$LIBS -lw"
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-if test x$ac_cv_prog_CC = xcl ; then
-	cat >> confdefs.h <<\EOF
-#define alloca _alloca
-EOF
-
-fi
-
-
-ALL_LINGUAS="de es el fr ko nl no pl ru sl sv"
-
-              
-
-echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:2660: checking for inline" >&5
-if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_cv_c_inline=no
-for ac_kw in inline __inline__ __inline; do
-  cat > conftest.$ac_ext <<EOF
-#line 2667 "configure"
-#include "confdefs.h"
-
-int main() {
-} $ac_kw foo() {
-; return 0; }
-EOF
-if { (eval echo configure:2674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_c_inline=$ac_kw; break
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-fi
-rm -f conftest*
-done
-
-fi
-
-echo "$ac_t""$ac_cv_c_inline" 1>&6
-case "$ac_cv_c_inline" in
-  inline | yes) ;;
-  no) cat >> confdefs.h <<\EOF
-#define inline 
-EOF
- ;;
-  *)  cat >> confdefs.h <<EOF
-#define inline $ac_cv_c_inline
-EOF
- ;;
-esac
-
-echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:2700: checking for off_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2705 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_off_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_off_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_off_t" 1>&6
-if test $ac_cv_type_off_t = no; then
-  cat >> confdefs.h <<\EOF
-#define off_t long
-EOF
-
-fi
-
-                              
-   for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \
-unistd.h sys/param.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2738: 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
-#line 2743 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2748: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-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 | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-   for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \
-strdup __argz_count __argz_stringify __argz_next
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2778: 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 <<EOF
-#line 2783 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-
-   if test "${ac_cv_func_stpcpy+set}" != "set"; then
-     for ac_func in stpcpy
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2835: 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 <<EOF
-#line 2840 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:2863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-   fi
-   if test "${ac_cv_func_stpcpy}" = "yes"; then
-     cat >> confdefs.h <<\EOF
-#define HAVE_STPCPY 1
-EOF
-
-   fi
-
-   if test $ac_cv_header_locale_h = yes; then
-    echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:2897: checking for LC_MESSAGES" >&5
-if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2902 "configure"
-#include "confdefs.h"
-#include <locale.h>
-int main() {
-return LC_MESSAGES
-; return 0; }
-EOF
-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  am_cv_val_LC_MESSAGES=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  am_cv_val_LC_MESSAGES=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
-    if test $am_cv_val_LC_MESSAGES = yes; then
-      cat >> confdefs.h <<\EOF
-#define HAVE_LC_MESSAGES 1
-EOF
-
-    fi
-  fi
-   echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:2930: checking whether NLS is requested" >&5
-        # Check whether --enable-nls or --disable-nls was given.
-if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
-else
-  USE_NLS=yes
-fi
-
-    echo "$ac_t""$USE_NLS" 1>&6
-    
-
-    USE_INCLUDED_LIBINTL=no
-
-        if test "$USE_NLS" = "yes"; then
-      cat >> confdefs.h <<\EOF
-#define ENABLE_NLS 1
-EOF
-
-      echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:2950: checking whether included gettext is requested" >&5
-      # Check whether --with-included-gettext or --without-included-gettext was given.
-if test "${with_included_gettext+set}" = set; then
-  withval="$with_included_gettext"
-  nls_cv_force_use_gnu_gettext=$withval
-else
-  nls_cv_force_use_gnu_gettext=no
-fi
-
-      echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
-
-      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
-      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
-                        		nls_cv_header_intl=
-	nls_cv_header_libgt=
-	CATOBJEXT=NONE
-
-	ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:2969: checking for libintl.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
-#line 2974 "configure"
-#include "confdefs.h"
-#include <libintl.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2979: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
-echo "configure:2996: checking for gettext in libc" >&5
-if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 3001 "configure"
-#include "confdefs.h"
-#include <libintl.h>
-int main() {
-return (int) gettext ("")
-; return 0; }
-EOF
-if { (eval echo configure:3008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  gt_cv_func_gettext_libc=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  gt_cv_func_gettext_libc=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
-
-	   if test "$gt_cv_func_gettext_libc" != "yes"; then
-	     echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
-echo "configure:3024: checking for bindtextdomain in -lintl" >&5
-ac_lib_var=`echo intl'_'bindtextdomain | 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="-lintl  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 3032 "configure"
-#include "confdefs.h"
-/* 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 bindtextdomain();
-
-int main() {
-bindtextdomain()
-; return 0; }
-EOF
-if { (eval echo configure:3043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
-echo "configure:3059: checking for gettext in libintl" >&5
-if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
-echo "configure:3064: checking for gettext in -lintl" >&5
-ac_lib_var=`echo intl'_'gettext | 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="-lintl  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 3072 "configure"
-#include "confdefs.h"
-/* 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 gettext();
-
-int main() {
-gettext()
-; return 0; }
-EOF
-if { (eval echo configure:3083: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  gt_cv_func_gettext_libintl=yes
-else
-  echo "$ac_t""no" 1>&6
-gt_cv_func_gettext_libintl=no
-fi
-
-fi
-
-echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-	     if test "$gt_cv_func_gettext_libintl" = yes; then
-	       LIBS="$LIBS -lintl"
-	     fi
-
-	   fi
-
-	   if test "$gt_cv_func_gettext_libc" = "yes" \
-	      || test "$gt_cv_func_gettext_libintl" = "yes"; then
-	      cat >> confdefs.h <<\EOF
-#define HAVE_GETTEXT 1
-EOF
-
-	      # Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3127: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$MSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
-	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
-  ;;
-esac
-fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test -n "$MSGFMT"; then
-  echo "$ac_t""$MSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-	      if test "$MSGFMT" != "no"; then
-		for ac_func in dcgettext
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3161: 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 <<EOF
-#line 3166 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* 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
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-		# Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3216: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$GMSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
-  ;;
-esac
-fi
-GMSGFMT="$ac_cv_path_GMSGFMT"
-if test -n "$GMSGFMT"; then
-  echo "$ac_t""$GMSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-		# Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3252: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$XGETTEXT" in
-  /*|[A-z]:/*)
-  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
-	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-  ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test -n "$XGETTEXT"; then
-  echo "$ac_t""$XGETTEXT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-		cat > conftest.$ac_ext <<EOF
-#line 3284 "configure"
-#include "confdefs.h"
-
-int main() {
-extern int _nl_msg_cat_cntr;
-			       return _nl_msg_cat_cntr
-; return 0; }
-EOF
-if { (eval echo configure:3292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  CATOBJEXT=.gmo
-		   DATADIRNAME=share
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CATOBJEXT=.mo
-		   DATADIRNAME=lib
-fi
-rm -f conftest*
-		INSTOBJEXT=.mo
-	      fi
-	    fi
-	
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-        if test "$CATOBJEXT" = "NONE"; then
-	  echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
-echo "configure:3315: checking whether catgets can be used" >&5
-	  # Check whether --with-catgets or --without-catgets was given.
-if test "${with_catgets+set}" = set; then
-  withval="$with_catgets"
-  nls_cv_use_catgets=$withval
-else
-  nls_cv_use_catgets=no
-fi
-
-	  echo "$ac_t""$nls_cv_use_catgets" 1>&6
-
-	  if test "$nls_cv_use_catgets" = "yes"; then
-	    	    echo $ac_n "checking for main in -li""... $ac_c" 1>&6
-echo "configure:3328: checking for main in -li" >&5
-ac_lib_var=`echo i'_'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="-li  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 3336 "configure"
-#include "confdefs.h"
-
-int main() {
-main()
-; return 0; }
-EOF
-if { (eval echo configure:3343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
-  LIBS="-li $LIBS"
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-	    echo $ac_n "checking for catgets""... $ac_c" 1>&6
-echo "configure:3371: checking for catgets" >&5
-if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 3376 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char catgets(); below.  */
-#include <assert.h>
-/* 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 catgets();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_catgets) || defined (__stub___catgets)
-choke me
-#else
-catgets();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3399: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_func_catgets=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_catgets=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define HAVE_CATGETS 1
-EOF
-
-	       INTLOBJS="\$(CATOBJS)"
-	       # Extract the first word of "gencat", so it can be a program name with args.
-set dummy gencat; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3421: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$GENCAT" in
-  /*|[A-z]:/*)
-  ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_path_GENCAT="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no"
-  ;;
-esac
-fi
-GENCAT="$ac_cv_path_GENCAT"
-if test -n "$GENCAT"; then
-  echo "$ac_t""$GENCAT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-	       if test "$GENCAT" != "no"; then
-		 # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3457: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$GMSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
-  ;;
-esac
-fi
-GMSGFMT="$ac_cv_path_GMSGFMT"
-if test -n "$GMSGFMT"; then
-  echo "$ac_t""$GMSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-		 if test "$GMSGFMT" = "no"; then
-		   # Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3494: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$GMSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
-	ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
-  ;;
-esac
-fi
-GMSGFMT="$ac_cv_path_GMSGFMT"
-if test -n "$GMSGFMT"; then
-  echo "$ac_t""$GMSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-		 fi
-		 # Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3529: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$XGETTEXT" in
-  /*|[A-z]:/*)
-  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
-	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-  ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test -n "$XGETTEXT"; then
-  echo "$ac_t""$XGETTEXT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-		 USE_INCLUDED_LIBINTL=yes
-		 CATOBJEXT=.cat
-		 INSTOBJEXT=.cat
-		 DATADIRNAME=lib
-		 INTLDEPS='$(top_builddir)/intl/libintl.a'
-		 INTLLIBS=$INTLDEPS
-		 LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-		 nls_cv_header_intl=intl/libintl.h
-		 nls_cv_header_libgt=intl/libgettext.h
-	       fi
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-	  fi
-        fi
-
-        if test "$CATOBJEXT" = "NONE"; then
-	  	  	  nls_cv_use_gnu_gettext=yes
-        fi
-      fi
-
-      if test "$nls_cv_use_gnu_gettext" = "yes"; then
-                INTLOBJS="\$(GETTOBJS)"
-        # Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3587: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$MSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
-	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt"
-  ;;
-esac
-fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test -n "$MSGFMT"; then
-  echo "$ac_t""$MSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-        # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3621: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$GMSGFMT" in
-  /*|[A-z]:/*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
-  ;;
-esac
-fi
-GMSGFMT="$ac_cv_path_GMSGFMT"
-if test -n "$GMSGFMT"; then
-  echo "$ac_t""$GMSGFMT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-        # Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3657: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$XGETTEXT" in
-  /*|[A-z]:/*)
-  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test $ac_x $ac_dir/$ac_word; then
-      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
-	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
-	break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-  ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test -n "$XGETTEXT"; then
-  echo "$ac_t""$XGETTEXT" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-        
-	USE_INCLUDED_LIBINTL=yes
-        CATOBJEXT=.gmo
-        INSTOBJEXT=.mo
-        DATADIRNAME=share
-	INTLDEPS='$(top_builddir)/intl/libintl.a'
-	INTLLIBS=$INTLDEPS
-	LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-        nls_cv_header_intl=intl/libintl.h
-        nls_cv_header_libgt=intl/libgettext.h
-      fi
-
-            if test "$XGETTEXT" != ":"; then
-			if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
-	  : ;
-	else
-	  echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
-	  XGETTEXT=":"
-	fi
-      fi
-
-      # We need to process the po/ directory.
-      POSUB=po
-    else
-      DATADIRNAME=share
-      nls_cv_header_intl=intl/libintl.h
-      nls_cv_header_libgt=intl/libgettext.h
-    fi
-    if test -z "$nsl_cv_header_intl"; then
-      # Clean out junk possibly left behind by a previous configuration.
-      rm -f intl/libintl.h
-    fi
-    
-    
-
-
-    # If this is used in GNU gettext we have to set USE_NLS to `yes'
-    # because some of the sources are only built for this goal.
-    if test "$PACKAGE" = gettext; then
-      USE_NLS=yes
-      USE_INCLUDED_LIBINTL=yes
-    fi
-
-                for lang in $ALL_LINGUAS; do
-      GMOFILES="$GMOFILES $lang.gmo"
-      POFILES="$POFILES $lang.po"
-    done
-
-        
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-  
-
-   if test "x$CATOBJEXT" != "x"; then
-     if test "x$ALL_LINGUAS" = "x"; then
-       LINGUAS=
-     else
-       echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:3754: checking for catalogs to be installed" >&5
-       NEW_LINGUAS=
-       for lang in ${LINGUAS=$ALL_LINGUAS}; do
-         case "$ALL_LINGUAS" in
-          *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
-         esac
-       done
-       LINGUAS=$NEW_LINGUAS
-       echo "$ac_t""$LINGUAS" 1>&6
-     fi
-
-          if test -n "$LINGUAS"; then
-       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
-     fi
-   fi
-
-            if test $ac_cv_header_locale_h = yes; then
-     INCLUDE_LOCALE_H="#include <locale.h>"
-   else
-     INCLUDE_LOCALE_H="\
-/* The system does not provide the header <locale.h>.  Take care yourself.  */"
-   fi
-   
-
-            test -d intl || mkdir intl
-   if test "$CATOBJEXT" = ".cat"; then
-     ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
-echo "configure:3782: checking for linux/version.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
-#line 3787 "configure"
-#include "confdefs.h"
-#include <linux/version.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3792: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-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
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  msgformat=linux
-else
-  echo "$ac_t""no" 1>&6
-msgformat=xopen
-fi
-
-
-               sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
-   fi
-      sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
-     $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
-
-            if test "$PACKAGE" = "gettext"; then
-     GT_NO="#NO#"
-     GT_YES=
-   else
-     GT_NO=
-     GT_YES="#YES#"
-   fi
-   
-   
-
-            MKINSTALLDIRS=
-   if test -n "$ac_aux_dir"; then
-     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
-   fi
-   if test -z "$MKINSTALLDIRS"; then
-     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
-   fi
-   
-
-      l=
-   
-
-         test -d po || mkdir po
-   if test "x$srcdir" != "x."; then
-        if test "x`echo $srcdir | sed -e 's@^[A-z]:@@' -e 's@/.*@@'`" = "x"; then
-       posrcprefix="$srcdir/"
-     else
-       posrcprefix="../$srcdir/"
-     fi
-      else
-     posrcprefix="../"
-   fi
-   rm -f po/POTFILES
-   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
-	< $srcdir/po/POTFILES.in > po/POTFILES
-  
-cat >> confdefs.h <<EOF
-#define PACKAGE "$PACKAGE"
-EOF
-
-cat >> confdefs.h <<EOF
-#define VERSION "$VERSION"
-EOF
-
-
-echo $ac_n "checking for dos file convention""... $ac_c" 1>&6
-echo "configure:3866: checking for dos file convention" >&5
-if eval "test \"`echo '$''{'ac_cv_dosfile'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -d ".\."; then
-   ac_cv_dosfile=yes
-   cat >> confdefs.h <<\EOF
-#define HAVE_DOS_FILE_NAMES 1
-EOF
-
-else
-   ac_cv_dosfile=no
-fi
-
-fi
-
-echo "$ac_t""$ac_cv_dosfile" 1>&6
-
-echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:3885: checking for Cygwin environment" >&5
-if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 3890 "configure"
-#include "confdefs.h"
-
-int main() {
-
-#ifndef __CYGWIN__
-#define __CYGWIN__ __CYGWIN32__
-#endif
-return __CYGWIN__;
-; return 0; }
-EOF
-if { (eval echo configure:3901: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_cygwin=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_cygwin=no
-fi
-rm -f conftest*
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_cygwin" 1>&6
-CYGWIN=
-test "$ac_cv_cygwin" = yes && CYGWIN=yes
-echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:3918: checking for mingw32 environment" >&5
-if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 3923 "configure"
-#include "confdefs.h"
-
-int main() {
-return __MINGW32__;
-; return 0; }
-EOF
-if { (eval echo configure:3930: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_mingw32=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_mingw32=no
-fi
-rm -f conftest*
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_mingw32" 1>&6
-MINGW32=
-test "$ac_cv_mingw32" = yes && MINGW32=yes
-echo $ac_n "checking for DJGPP environment""... $ac_c" 1>&6
-echo "configure:3947: checking for DJGPP environment" >&5
-if eval "test \"`echo '$''{'ac_cv_djgpp'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 3952 "configure"
-#include "confdefs.h"
-
-int main() {
- return __DJGPP__;
-; return 0; }
-EOF
-if { (eval echo configure:3959: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_djgpp=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_djgpp=no
-fi
-rm -f conftest*
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_djgpp" 1>&6
-DJ_GPP=
-test "$ac_cv_djgpp" = yes && DJ_GPP=yes
-
-
-
-echo $ac_n "checking for environ variable separator""... $ac_c" 1>&6
-echo "configure:3979: checking for environ variable separator" >&5
-if eval "test \"`echo '$''{'ac_cv_sep'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$CYGWIN" = yes || test "$MINGW32" = yes || test "$DJ_GPP" = yes ; then
-  ac_cv_sep=yes
-else
-  ac_cv_sep=no
-fi
-fi
-
-SEP=":"
-test x"$ac_cv_sep" = xyes && SEP=";"
-echo "$ac_t""${SEP}" 1>&6
-
-
-
-
-echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:3998: checking for executable suffix" >&5
-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
-  ac_cv_exeext=.exe
-else
-  rm -f conftest*
-  echo 'int main () { return 0; }' > conftest.$ac_ext
-  ac_cv_exeext=
-  if { (eval echo configure:4008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
-    for file in conftest.*; do
-      case $file in
-      *.c | *.o | *.obj) ;;
-      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
-      esac
-    done
-  else
-    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
-  fi
-  rm -f conftest*
-  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
-fi
-fi
-
-EXEEXT=""
-test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
-echo "$ac_t""${ac_cv_exeext}" 1>&6
-ac_exeext=$EXEEXT
-
-echo $ac_n "checking for object suffix""... $ac_c" 1>&6
-echo "configure:4029: checking for object suffix" >&5
-if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  rm -f conftest*
-echo 'int i = 1;' > conftest.$ac_ext
-if { (eval echo configure:4035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  for ac_file in conftest.*; do
-    case $ac_file in
-    *.c) ;;
-    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
-    esac
-  done
-else
-  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_objext" 1>&6
-OBJEXT=$ac_cv_objext
-ac_objext=$ac_cv_objext
-
-
-
-        
-    # Assume we'll default to using the included regex.c.
-    ac_use_included_regex=yes
-
-    # However, if the system regex support is good enough that it passes the
-    # the following run test, then default to *not* using the included regex.c.
-    # If cross compiling, assume the test would fail and use the included
-    # regex.c.  The failing regular expression is from `Spencer ere test #75'
-    # in grep-2.3.
-    echo $ac_n "checking for working re_compile_pattern""... $ac_c" 1>&6
-echo "configure:4064: checking for working re_compile_pattern" >&5
-if eval "test \"`echo '$''{'jm_cv_func_working_re_compile_pattern'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-  	       jm_cv_func_working_re_compile_pattern=no
-else
-  cat > conftest.$ac_ext <<EOF
-#line 4072 "configure"
-#include "confdefs.h"
-	
-#include <stdio.h>
-#include <regex.h>
-	  int
-	  main ()
-	  {
-	    static struct re_pattern_buffer regex;
-	    const char *s;
-	    re_set_syntax (RE_SYNTAX_POSIX_EGREP);
-	    /* Add this third left square bracket, , to balance the
-	       three right ones below.  Otherwise autoconf-2.14 chokes.  */
-	    s = re_compile_pattern ("a[[:]:]b\n", 9, &regex);
-	    /* This should fail with _Invalid character class name_ error.  */
-	    exit (s ? 0 : 1);
-	  }
-	
-EOF
-if { (eval echo configure:4091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  
-	       jm_cv_func_working_re_compile_pattern=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  jm_cv_func_working_re_compile_pattern=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$jm_cv_func_working_re_compile_pattern" 1>&6
-    if test $jm_cv_func_working_re_compile_pattern = yes; then
-      ac_use_included_regex=no
-    fi
-
-    test -n "src/regex.c" || { echo "configure: error: missing argument" 1>&2; exit 1; }
-    
-    
-
-	# Check whether --with-included-regex or --without-included-regex was given.
-if test "${with_included_regex+set}" = set; then
-  withval="$with_included_regex"
-  jm_with_regex=$withval
-else
-  jm_with_regex=$ac_use_included_regex
-fi
-
-	if test "$jm_with_regex" = yes; then
-	  
-	  LIBOBJS="$LIBOBJS regex.$ac_objext"
-	fi
-      
-  
-
-
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --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 | grep ac_space) 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
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-DEFS=-DHAVE_CONFIG_H
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
-  case "\$ac_option" in
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    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.13"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
-  esac
-done
-
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
-
-trap 'rm -fr `echo "Makefile src/Makefile tests/Makefile po/Makefile.in intl/Makefile doc/Makefile m4/Makefile djgpp/Makefile vms/Makefile bootstrap/Makefile config.h:config.hin" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@PACKAGE@%$PACKAGE%g
-s%@VERSION@%$VERSION%g
-s%@ACLOCAL@%$ACLOCAL%g
-s%@AUTOCONF@%$AUTOCONF%g
-s%@AUTOMAKE@%$AUTOMAKE%g
-s%@AUTOHEADER@%$AUTOHEADER%g
-s%@MAKEINFO@%$MAKEINFO%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@AWK@%$AWK%g
-s%@CC@%$CC%g
-s%@RANLIB@%$RANLIB%g
-s%@CPP@%$CPP%g
-s%@ALLOCA@%$ALLOCA%g
-s%@LIBOBJS@%$LIBOBJS%g
-s%@USE_NLS@%$USE_NLS%g
-s%@MSGFMT@%$MSGFMT%g
-s%@GMSGFMT@%$GMSGFMT%g
-s%@XGETTEXT@%$XGETTEXT%g
-s%@GENCAT@%$GENCAT%g
-s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
-s%@CATALOGS@%$CATALOGS%g
-s%@CATOBJEXT@%$CATOBJEXT%g
-s%@DATADIRNAME@%$DATADIRNAME%g
-s%@GMOFILES@%$GMOFILES%g
-s%@INSTOBJEXT@%$INSTOBJEXT%g
-s%@INTLDEPS@%$INTLDEPS%g
-s%@INTLLIBS@%$INTLLIBS%g
-s%@INTLOBJS@%$INTLOBJS%g
-s%@POFILES@%$POFILES%g
-s%@POSUB@%$POSUB%g
-s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g
-s%@GT_NO@%$GT_NO%g
-s%@GT_YES@%$GT_YES%g
-s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
-s%@l@%$l%g
-s%@SEP@%$SEP%g
-s%@EXEEXT@%$EXEEXT%g
-s%@OBJEXT@%$OBJEXT%g
-
-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 <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile src/Makefile tests/Makefile po/Makefile.in intl/Makefile doc/Makefile m4/Makefile djgpp/Makefile vms/Makefile bootstrap/Makefile"}
-EOF
-cat >> $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%/[^/][^/]*$%%'`
-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dir_suffix= ac_dots=
-  fi
-
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*|[A-z]:/*)
-    srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
-  *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-  case "$ac_given_INSTALL" in
-  [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;;
-  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
-  esac
-
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
-
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
-  sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-s%@INSTALL@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
-ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
-ac_dC='\3'
-ac_dD='%g'
-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
-ac_uB='\([ 	]\)%\1#\2define\3'
-ac_uC=' '
-ac_uD='\4%g'
-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
-ac_eB='$%\1#\2define\3'
-ac_eC=' '
-ac_eD='%g'
-
-if test "${CONFIG_HEADERS+set}" != set; then
-EOF
-cat >> $CONFIG_STATUS <<EOF
-  CONFIG_HEADERS="config.h:config.hin"
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-fi
-for ac_file in .. $CONFIG_HEADERS; 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
-
-  echo creating $ac_file
-
-  rm -f conftest.frag conftest.in conftest.out
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
-  cat $ac_file_inputs > conftest.in
-
-EOF
-
-# Transform confdefs.h into a sed script conftest.vals that substitutes
-# the proper values into config.h.in to produce config.h.  And first:
-# Protect against being on the right side of a sed subst in config.status.
-# Protect against being in an unquoted here document in config.status.
-rm -f conftest.vals
-cat > conftest.hdr <<\EOF
-s/[\\&%]/\\&/g
-s%[\\$`]%\\&%g
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
-s%ac_d%ac_u%gp
-s%ac_u%ac_e%gp
-EOF
-sed -n -f conftest.hdr confdefs.h > conftest.vals
-rm -f conftest.hdr
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >> conftest.vals <<\EOF
-s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
-EOF
-
-# Break up conftest.vals because some shells have a limit on
-# the size of here documents, and old seds have small limits too.
-
-rm -f conftest.tail
-while :
-do
-  ac_lines=`grep -c . conftest.vals`
-  # grep -c gives empty output for an empty file on some AIX systems.
-  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
-  # Write a limited-size here document to conftest.frag.
-  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
-  echo 'CEOF
-  sed -f conftest.frag conftest.in > conftest.out
-  rm -f conftest.in
-  mv conftest.out conftest.in
-' >> $CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
-  rm -f conftest.vals
-  mv conftest.tail conftest.vals
-done
-rm -f conftest.vals
-
-cat >> $CONFIG_STATUS <<\EOF
-  rm -f conftest.frag conftest.h
-  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
-  cat conftest.in >> conftest.h
-  rm -f conftest.in
-  if cmp -s $ac_file conftest.h 2>/dev/null; then
-    echo "$ac_file is unchanged"
-    rm -f conftest.h
-  else
-    # Remove last slash and all that follows it.  Not all systems have dirname.
-      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-      # The file is in a subdirectory.
-      test ! -d "$ac_dir" && mkdir "$ac_dir"
-    fi
-    rm -f $ac_file
-    mv conftest.h $ac_file
-  fi
-fi; done
-
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-ac_sources="$nls_cv_header_libgt"
-ac_dests="$nls_cv_header_intl"
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-srcdir=$ac_given_srcdir
-while test -n "$ac_sources"; do
-  set $ac_dests; ac_dest=$1; shift; ac_dests=$*
-  set $ac_sources; ac_source=$1; shift; ac_sources=$*
-
-  echo "linking $srcdir/$ac_source to $ac_dest"
-
-  if test ! -r $srcdir/$ac_source; then
-    { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; }
-  fi
-  rm -f $ac_dest
-
-  # Make relative symlinks.
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'`
-  if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then
-    # The dest file is in a subdirectory.
-    test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir"
-    ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dest_dir_suffix.
-    ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dest_dir_suffix= ac_dots=
-  fi
-
-  case "$srcdir" in
-  [/$]*|[A-z]:/*) ac_rel_source="$srcdir/$ac_source" ;;
-  *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
-  esac
-
-  # Make a symlink if possible; otherwise try a hard link.
-  if ln -s $ac_rel_source $ac_dest 2>/dev/null ||
-    ln $srcdir/$ac_source $ac_dest; then :
-  else
-    { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; }
-  fi
-done
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
-case "$CONFIG_FILES" in *po/Makefile.in*)
-        sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
-      esac
-sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile; echo timestamp > stamp-h
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
diff -Nur grep-2.3/configure.rej grep-ja-2.3/configure.rej
--- grep-2.3/configure.rej	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/configure.rej	Thu Jan  1 09:00:00 1970
@@ -1,17 +0,0 @@
-***************
-*** 565,571 ****
-  rm -f conftest*
-  fi
-  
-- for func in getpagesize memchr strerror valloc
-  do
-  trfunc=HAVE_`echo $func | tr '[a-z]' '[A-Z]'`
-  echo checking for ${func}
---- 565,571 ----
-  rm -f conftest*
-  fi
-  
-+ for func in getpagesize memchr strerror valloc bcopy memmove strcasecmp
-  do
-  trfunc=HAVE_`echo $func | tr '[a-z]' '[A-Z]'`
-  echo checking for ${func}
diff -Nur grep-2.3/debian/README.Debian grep-ja-2.3/debian/README.Debian
--- grep-2.3/debian/README.Debian	Mon Dec 20 23:06:54 1999
+++ grep-ja-2.3/debian/README.Debian	Thu Jan  1 09:00:00 1970
@@ -1,7 +0,0 @@
-grep-ja for DEBIAN
-----------------------
-
-これは マルチバイト文字対応版 GNU grep です。
-谷本孝浩 NBC02362@niftyserve.or.jp 様によるパッチを利用しました。
-
-Ishida Takashi <tahsi@phoenix-c.or.jp>, Thu, 12 Jun 1997 03:41:26 +0900
diff -Nur grep-2.3/debian/changelog grep-ja-2.3/debian/changelog
--- grep-2.3/debian/changelog	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/changelog	Thu Jan  1 09:00:00 1970
@@ -1,136 +0,0 @@
-grep (2.3-4) unstable; urgency=low
-
-  * Remove debian/files and debian/substvars on clean (Bug# 38620)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Mon, 31 May 1999 13:31:59 +0200
-
-grep (2.3-3) unstable; urgency=low
-
-  * Don't clobber NEWS with ChangeLog (Bug# 33917)
-  * Register info-documentation with install-info (Bug# 33917)
-  * Generally try to preserve timestamps
-  * Upgrade standards-version to 2.5.1
-
- -- Wichert Akkerman <wakkerma@debian.org>  Wed, 26 May 1999 00:36:51 +0200
-
-grep (2.3-2) unstable; urgency=low
-
-  * Make egrep and grep seperate binaries again, since they don't check
-    argv[0] anymore
-
- -- Wichert Akkerman <wakkerma@debian.org>  Thu, 25 Feb 1999 02:59:21 +0100
-
-grep (2.3-1) unstable; urgency=low
-
-  * New upstream version
-
- -- Wichert Akkerman <wakkerma@debian.org>  Tue, 23 Feb 1999 02:16:01 +0100
- 
-grep (2.2-1) unstable; urgency=low
-
-  * New upstream version
-
- -- Wichert Akkerman <wakkerma@debian.org>  Mon, 27 Apr 1998 12:13:04 +0200
-
-grep (2.1-7) frozen unstable; urgency=high
-
-  * Fix wrong patch for Bug# 20284. Note to self: don't trust
-    received patches! (Bug# 20573, 20592, 20541)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Fri,  3 Apr 1998 12:05:42 +0200
-
-grep (2.1-6) frozen unstable; urgency=low
-
-  * Complain about non-existant files (Bug# 20283)
-  * Return with errorcode 2 when file cannot be opened (Bug# 20284)
-  * Fixed syntax error in manpage (Bug# 20509)
-  * Changed manpage: a pattern is a legal parameter (Bug# 20509)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Wed,  1 Apr 1998 14:07:00 +0200
-
-grep (2.1-5) unstable; urgency=low
-
-  * Fixed type in description (Bug# 18945)
-  * Now standards-version 2.4.0.0
-  * Re-instate [ef]grep.1 since some man-programs seem to
-    need them BBug# 16445)
-  * GPL is not compressed (lintian)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Sun, 15 Mar 1998 23:19:37 +0100
-
-grep (2.1-4) unstable; urgency=low
-
-  * Hardlink [ef]grep to grep binary again
-
- -- Wichert Akkerman <wakkerma@debian.org>  Mon, 29 Dec 1997 02:06:26 +0100
-
-grep (2.1-3) unstable; urgency=low
-
-  * Fixed incorrect md5sums
-
- -- Wichert Akkerman <wakkerma@debian.org>  Tue, 16 Dec 1997 17:17:57 +0100
-
-grep (2.1-2) unstable; urgency=low
-
-  * Fix redundant manpages (Bug# 14570)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Fri,  7 Nov 1997 18:03:39 +0100
-
-grep (2.1-1) unstable; urgency=low
-
-  * New upstream version (Bug# 14219)
-  * Fixed spelling error in copyright
-  * Fixed compilation flags to comply with policy
-  * Pristine sources
-
- -- Wichert Akkerman <wakkerma@debian.org>  Thu, 25 Sep 1997 12:19:59 +0200
-
-grep (2.0-12) unstable; urgency=low
-
-  * Rename upstream change to changelog
-  * Added md5sums to .deb file
-
- -- Wichert Akkerman <wakkerma@debian.org>  Mon, 14 Jul 1997 01:17:15 +0200
-
-grep (2.0-11) unstable; urgency=low
-
-  * Removed symlinks for egrep.1 and fgrep.1 (Bug# 7814)
-
- -- Wichert Akkerman <wakkerma@debian.org>  Tue, 11 Mar 1997 00:20:25 +0100
-
-grep (2.0-10) unstable; urgency=low
-
-  * Now conforms to policy manual version 2.1.2.2
-  * Fixed typo in debian/rules (Bug# 7665)
-
- -- Wichert Akkerman <wakkerma@wi.leidenuniv.nl>  Thu, 27 Feb 1997 02:01:53 +0100
-
-grep (2.0-9) frozen unstable; urgency=low
-
-  * Corrected priority in debian controlfile.
-
- -- Wichert Akkerman <wakkerma@wi.leidenuniv.nl>  Tue, 12 Nov 1996 23:36:10 +0100
-
-grep (2.0-8) stable; urgency=low
-
-  * Made copyright a symlink to /usr/doc/copyright/GPL
-  * Compress man-pages
-  * Renamed debian changelog to changelog.Debian
-
- -- Wichert Akkerman <wakkerma@wi.leidenuniv.nl>  Sat, 26 Oct 1996 18:43:57 +0200
-
-grep (2.0-7) stable unstable; urgency=low
-
-  * Moved to new packaging format
-
- -- Wichert Akkerman <wakkerma@wi.leidenuniv.nl>  Sat, 21 Sep 1996 17:24:52 +0200
-
-grep (2.0-6); priority=LOW
-
-  * Revamped debian files
-  * Disable mmap-code since mmap does not work on files from the
-    proc-filesystem. (Temporary fix, still looking for a better
-	solution).
-  * new maintainer: Wichert Akkerman <wakkerma@wi.leidenuniv.nl>
-
- -- Wichert Akkerman <wakkerma@wi.leidenuniv.nl>,Mon Jul 29 18:38:06 MET DST 1996
diff -Nur grep-2.3/debian/changelog.rej grep-ja-2.3/debian/changelog.rej
--- grep-2.3/debian/changelog.rej	Mon Dec 20 23:07:00 1999
+++ grep-ja-2.3/debian/changelog.rej	Thu Jan  1 09:00:00 1970
@@ -1,40 +0,0 @@
-***************
-*** 0 ****
---- 1,37 ----
-+ grep-ja (2.0-4) unstable; urgency=low
-+ 
-+   * New maintainer release.
-+   * Updated to Standards-Version 2.5.0.
-+ 
-+  -- GOTO Masanori <gotom@cs.titech.ac.jp>  Mon, 24 May 1999 22:05:11 +0900
-+ 
-+ grep-ja (2.0-3) unstable; urgency=low
-+ 
-+   * New maintainer.
-+   * Updated to Standards-Version 2.4.1.0.
-+   * Built with libc6.
-+   * Removed unnecessary documents from /usr/doc/grep-ja.
-+   * debian/control: Architecture field: i386 -> any
-+   * debian/control: Added an extended description.
-+   * debian/copyright: Refer to /usr/doc/copyright/GPL.
-+   * Made symbolic link from jgrep.1.gz to jfgrep.1.gz and jegrep.1.gz.
-+ 
-+  -- Takao KAWAMURA <kawamura@debian.or.jp>  Thu, 28 May 1998 10:16:32 +0900
-+ 
-+ grep-ja (2.0-2) unstable; urgency=low
-+ 
-+   * Bug fix in grep.c.
-+   * Bug fix. -- Don't work correctly.
-+ 
-+  -- Ishida Takashi <tahsi@phoenix-c.or.jp>  Tue, 15 Jul 1997 09:09:21 +0900
-+ 
-+ grep-ja (2.0-1) unstable; urgency=low
-+ 
-+   * Initial Release.
-+ 
-+  -- Ishida Takashi <tahsi@phoenix-c.or.jp>  Thu, 12 Jun 1997 03:41:26 +0900
-+ 
-+ Local variables:
-+ mode: debian-changelog
-+ add-log-mailing-address: "gotom@cs.titech.ac.jp"
-+ End:
diff -Nur grep-2.3/debian/control grep-ja-2.3/debian/control
--- grep-2.3/debian/control	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/control	Thu Jan  1 09:00:00 1970
@@ -1,20 +0,0 @@
-Source: grep
-Section: base
-Priority: Required
-Maintainer: Wichert Akkerman <wakkerma@debian.org>
-Standards-Version: 2.5.1
-
-Package: grep
-Architecture: any
-Essential: yes
-Pre-Depends: ${shlibs:Pre-Depends}
-Description: GNU grep, egrep and fgrep.
- The GNU family of grep utilities may be the "fastest grep in the west".
- GNU grep is based on a fast lazy-state deterministic matcher (about
- twice as fast as stock Unix egrep) hybridized with a Boyer-Moore-Gosper
- search for a fixed string that eliminates impossible text from being
- considered by the full regexp matcher without necessarily having to
- look at every character. The result is typically many times faster
- than Unix grep or egrep. (Regular expressions containing backreferencing
- will run more slowly, however.)
-
diff -Nur grep-2.3/debian/control.rej grep-ja-2.3/debian/control.rej
--- grep-2.3/debian/control.rej	Mon Dec 20 23:07:01 1999
+++ grep-ja-2.3/debian/control.rej	Thu Jan  1 09:00:00 1970
@@ -1,14 +0,0 @@
-***************
-*** 0 ****
---- 1,11 ----
-+ Source: grep-ja
-+ Section: base
-+ Priority: extra
-+ Maintainer: GOTO Masanori <gotom@cs.titech.ac.jp>
-+ Standards-Version: 2.5.0
-+ 
-+ Package: grep-ja
-+ Architecture: any
-+ Depends: ${shlibs:Depends}
-+ Description: GNU grep, egrep and fgrep + multi-byte extension
-+  This package provides the GNU grep 2.0 applied a multi-byte extension patch.
diff -Nur grep-2.3/debian/copyright grep-ja-2.3/debian/copyright
--- grep-2.3/debian/copyright	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/copyright	Thu Jan  1 09:00:00 1970
@@ -1,9 +0,0 @@
-This is the Debian GNU/Linux prepackaged version of the grep program.
-Currently Wichert Akkerman <wakkerma@debian.org> maintains the
-Debian/GNU Linux version of grep.
-
-This package was created from the grep sources as found on the GNU
-mirrors. Like all GNU software, grep is distritubed under the terms
-of the GNU General Public License, version 2. On Debian/GNU Linux
-system you can find a copy of this license in `/usr/doc/copyright/GPL'.
-
diff -Nur grep-2.3/debian/copyright.rej grep-ja-2.3/debian/copyright.rej
--- grep-2.3/debian/copyright.rej	Mon Dec 20 23:07:02 1999
+++ grep-ja-2.3/debian/copyright.rej	Thu Jan  1 09:00:00 1970
@@ -1,15 +0,0 @@
-***************
-*** 0 ****
---- 1,12 ----
-+ This package was debianized by Ishida Takashi tahsi@phoenix-c.or.jp on
-+ Thu, 12 Jun 1997 03:41:26 +0900.
-+ 
-+ It was downloaded from
-+ ftp.hipecs.hokudai.ac.jp /pub/Japanese/fj/grep-2.0-mb1.04.diff.gz
-+ 
-+ Copyright:
-+ 
-+ On Debian GNU/Linux systems, the complete text of the GNU General
-+ Public License can be found in `/usr/doc/copyright/GPL'.  You can also
-+ obtain it by writing to the Free Software Foundation, Inc., 59 Temple
-+ Place - Suite 330, Boston, MA 02111-1307, USA.
diff -Nur grep-2.3/debian/dirs grep-ja-2.3/debian/dirs
--- grep-2.3/debian/dirs	Mon Dec 20 23:07:02 1999
+++ grep-ja-2.3/debian/dirs	Thu Jan  1 09:00:00 1970
@@ -1,3 +0,0 @@
-usr/bin
-usr/man/man1
-usr/doc/grep-ja
diff -Nur grep-2.3/debian/docs grep-ja-2.3/debian/docs
--- grep-2.3/debian/docs	Mon Dec 20 23:07:02 1999
+++ grep-ja-2.3/debian/docs	Thu Jan  1 09:00:00 1970
@@ -1,3 +0,0 @@
-README
-README.MB
-ChangeLog.MB
diff -Nur grep-2.3/debian/postinst grep-ja-2.3/debian/postinst
--- grep-2.3/debian/postinst	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/postinst	Thu Jan  1 09:00:00 1970
@@ -1,7 +0,0 @@
-#! /bin/sh
-
-set -e
-
-install-info --quiet \
-	--section "General commands" "General commands" \
-	/usr/info/grep.info.gz
diff -Nur grep-2.3/debian/preinst grep-ja-2.3/debian/preinst
--- grep-2.3/debian/preinst	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/preinst	Thu Jan  1 09:00:00 1970
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-set -e
-
-dpkg --assert-support-predepends
diff -Nur grep-2.3/debian/prerm grep-ja-2.3/debian/prerm
--- grep-2.3/debian/prerm	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/prerm	Thu Jan  1 09:00:00 1970
@@ -1,6 +0,0 @@
-#! /bin/sh
-
-set -e
-
-install-info --quiet --remove /usr/info/grep.info.gz
-
diff -Nur grep-2.3/debian/rules grep-ja-2.3/debian/rules
--- grep-2.3/debian/rules	Mon Dec 20 23:05:12 1999
+++ grep-ja-2.3/debian/rules	Thu Jan  1 09:00:00 1970
@@ -1,72 +0,0 @@
-#! /usr/bin/make -f
-
-# Debian package information
-package		= grep
-
-# C compiler information
-CC			= gcc
-CFLAGS		= -g -O2
-LDFLAGS		= -s
-
-all build:	Makefile
-	make $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
-	touch stamp-build
-
-clean:
-	-make distclean
-	rm -f stamp-build debian/files debian/substvars
-	rm -rf debian/tmp
-
-Makefile:
-	./configure --prefix=/usr
-
-binary: binary-indep binary-arch
-
-binary-indep:
-
-binary-arch: checkroot
-	test -f stamp-build || make $(MFLAGS) -f debian/rules build
-	-rm -rf debian/tmp debian/{files,substvars}
-	install -d debian/tmp/DEBIAN debian/tmp/usr/doc/$(package)
-
-# Install grep
-	make prefix=`pwd`/debian/tmp/usr exec_prefix=`pwd`/debian/tmp install
-
-# Now fix installation errors
-	install -d -o root -g root -m 755 debian/tmp/usr
-	gzip -9 debian/tmp/usr/man/man1/grep.1
-	rm -f debian/tmp/usr/man/man1/{e,f}grep.1
-	ln -s grep.1.gz debian/tmp/usr/man/man1/egrep.1.gz
-	ln -s grep.1.gz debian/tmp/usr/man/man1/fgrep.1.gz
-	gzip -9 debian/tmp/usr/info/grep.info
-
-# Install documentation
-	install -p -o root -g root -m 644 TODO debian/tmp/usr/doc/$(package)
-	install -p -o root -g root -m 644 AUTHORS debian/tmp/usr/doc/$(package)
-	install -p -o root -g root -m 644 NEWS debian/tmp/usr/doc/$(package)
-	install -p -o root -g root -m 644 README debian/tmp/usr/doc/$(package)
-	install -p -o root -g root -m 644 THANKS debian/tmp/usr/doc/$(package)
-	install -p -o root -g root -m 644 ChangeLog \
-			debian/tmp/usr/doc/$(package)/changelog
-
-# Install Debian-specific documentation
-	install -p -o root -g root -m 644 debian/changelog \
-			debian/tmp/usr/doc/$(package)/changelog.Debian
-	gzip -9 debian/tmp/usr/doc/$(package)/*
-	install -p -o root -g root -m 644 debian/copyright \
-			debian/tmp/usr/doc/$(package)
-
-# Finish the installation
-	install -p -o root -g root -m 755 debian/preinst debian/tmp/DEBIAN/
-	install -p -o root -g root -m 755 debian/postinst debian/tmp/DEBIAN/
-	install -p -o root -g root -m 755 debian/prerm debian/tmp/DEBIAN/
-
-	find debian/tmp -type f | grep -v "./DEBIAN" | xargs md5sum | \
-					sed -e 's#debian/tmp/##' > debian/tmp/DEBIAN/md5sums
-	dpkg-shlibdeps -dPre-Depends src/grep
-	dpkg-gencontrol
-	dpkg --build debian/tmp ..
-
-checkroot:
-	test root = "`whoami`"
-
diff -Nur grep-2.3/debian/rules.rej grep-ja-2.3/debian/rules.rej
--- grep-2.3/debian/rules.rej	Mon Dec 20 23:07:02 1999
+++ grep-ja-2.3/debian/rules.rej	Thu Jan  1 09:00:00 1970
@@ -1,81 +0,0 @@
-***************
-*** 0 ****
---- 1,78 ----
-+ #!/usr/bin/make -f
-+ #-*- makefile -*-
-+ # Made with the aid of dh_make, by Craig Small
-+ # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
-+ # Some lines taken from debmake, by Christoph Lameter.
-+ 
-+ # Uncomment this to turn on verbose mode.
-+ #export DH_VERBOSE=1
-+ 
-+ build: build-stamp
-+ build-stamp:
-+ 	dh_testdir
-+ 
-+ 	./configure --prefix=/usr
-+ 	# Add here commands to compile the package.
-+ 	$(MAKE) 
-+ 
-+ 	touch build-stamp
-+ 
-+ clean:
-+ 	dh_testdir
-+ 	dh_testroot
-+ 	rm -f build-stamp install-stamp
-+ 
-+ 	# Add here commands to clean up after the build process.
-+ 	-$(MAKE) distclean
-+ 
-+ 	dh_clean
-+ 
-+ install: install-stamp
-+ install-stamp: build-stamp
-+ 	dh_testdir
-+ 	dh_testroot
-+ 	dh_clean -k
-+ 	dh_installdirs
-+ 
-+ 	# Add here commands to install the package into debian/tmp.
-+ 	$(MAKE) binprefix=j manprefix=j prefix=`pwd`/debian/tmp/usr install
-+ 	cd `pwd`/debian/tmp/usr/man/man1 && ln -s jgrep.1.gz jfgrep.1.gz && ln -s jgrep.1.gz jegrep.1.gz
-+ 
-+ 	touch install-stamp
-+ 
-+ # Build architecture-independent files here.
-+ binary-indep: build install
-+ # We have nothing to do by default.
-+ 
-+ # Build architecture-dependent files here.
-+ binary-arch: build install
-+ #	dh_testversion
-+ 	dh_testdir
-+ 	dh_testroot
-+ 	dh_installdocs
-+ 	dh_installexamples
-+ 	dh_installmenu
-+ #	dh_installemacsen
-+ #	dh_installinit
-+ 	dh_installcron
-+ 	dh_installmanpages
-+ #	dh_undocumented
-+ 	dh_installchangelogs ChangeLog
-+ 	dh_link
-+ 	dh_strip
-+ 	dh_compress
-+ 	dh_fixperms
-+ 	# You may want to make some executables suid here
-+ 	dh_suidregister
-+ #	dh_makeshlibs
-+ 	dh_installdeb
-+ 	dh_shlibdeps
-+ 	dh_gencontrol
-+ 	dh_md5sums
-+ 	dh_builddeb
-+ 
-+ source diff:                                                                  
-+ 	@echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
-+ 
-+ binary: binary-indep binary-arch
-+ .PHONY: build clean binary-indep binary-arch binary
diff -Nur grep-2.3/djgpp/Makefile.in grep-ja-2.3/djgpp/Makefile.in
--- grep-2.3/djgpp/Makefile.in	Mon Feb 15 09:43:49 1999
+++ grep-ja-2.3/djgpp/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -122,7 +122,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/doc/Makefile.in grep-ja-2.3/doc/Makefile.in
--- grep-2.3/doc/Makefile.in	Mon Feb 15 09:43:49 1999
+++ grep-ja-2.3/doc/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -154,8 +154,6 @@
 grep.dvi: grep.texi version.texi
 
 
-sep=@SEP@
-
 DVIPS = dvips
 
 .texi.info:
@@ -164,7 +162,7 @@
 	  && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
 
 .texi.dvi:
-	TEXINPUTS=".$(sep)$$TEXINPUTS" \
+	TEXINPUTS=.:$$TEXINPUTS \
 	  MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
 
 .texi:
@@ -183,7 +181,7 @@
 	  && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
 
 .texinfo.dvi:
-	TEXINPUTS=".$(sep)$$TEXINPUTS" \
+	TEXINPUTS=.:$$TEXINPUTS \
 	  MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
 
 .txi.info:
@@ -192,7 +190,7 @@
 	  && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
 
 .txi.dvi:
-	TEXINPUTS=".$(sep)$$TEXINPUTS" \
+	TEXINPUTS=.:$$TEXINPUTS \
 	  MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
 
 .txi:
@@ -318,7 +316,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/m4/Makefile.in grep-ja-2.3/m4/Makefile.in
--- grep-2.3/m4/Makefile.in	Mon Feb 15 09:43:49 1999
+++ grep-ja-2.3/m4/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -123,7 +123,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/old-ja/ChangeLog.MB grep-ja-2.3/old-ja/ChangeLog.MB
--- grep-2.3/old-ja/ChangeLog.MB	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/ChangeLog.MB	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,219 @@
+Thu Jun  2 16:58:03 1994  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 2.0 + multi-byte extension 1.04 released.
+
+Sat Mar  5 16:30:16 1994  Takahiro Tanimoto  (tt@isaac)
+
+	* README.MSC: PC-9800 シリーズ用 MS-C 6.00A の, ワイルドカード展
+	開ルーチンのバグに対処した.  以前の stdargv.diff をこれに統合し, 
+	削除した.  (Thanks to 福浩邦さん <GFE00522@niftyserve.or.jp>)
+
+Thu Aug 19 04:26:09 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c (re_compile_fastmap): charset_not の fastmap の作成処
+	理が間違っていて, regex の fastmap を使用する場合 (e?grep では 
+	fastmap を使用していないため, この問題は表面には現れない), 正規
+	表現の先頭の [^Ａ] や [^a] に例えば Ｂ がマッチしなかった.
+	(Thanks to 小屋良祐さん <JAE03716@niftyserve.or.jp>)
+
+Tue Aug 10 01:29:05 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c (set_list_bits): 文字クラス中のマルチバイト文字の最適
+	化で, 区間終点の更新処理部分にバグがあり, [Ａ-ＣＥ-ＧＢ-Ｄ] を最
+	適化すると [Ａ-Ｇ] だが, これが [Ａ-Ｅ] となってしまっていた. 
+	ただし, regex ではなく dfa が使用される場合にはこのバグは表面に
+	は現れない.
+
+Fri Jul 23 03:22:13 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 2.0 + multi-byte extension 1.03 released.
+
+	* DEFS.dos: strcmpi を stricmp に変更.
+
+	* grep.c (main): MS-DOS の場合, argv[0] を加工した文字列へのポイ
+	ンタを argv[0] へもセットする.  getopt が出力するメッセージも加
+	工された文字列となる.
+
+	* grep.c (main): MS-C 6.00A の stdargv.asm のバグをフィックスし
+	たため, argv[0] == "" のときの処理を削除した.
+
+	* stdargv.diff: 追加.
+
+Tue Jul 13 07:04:13 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 2.0 + multi-byte extension 1.02 released.
+
+Mon Jul 12 00:20:36 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* grep.c: HAVE_STRCASECMP が #define されていないとき, 一方の文
+	字列だけを小文字にしてから比較する関数を定義していたが, 使い方が
+	悪かった.  それを strcasecmp() と同じものに変更した.
+
+	* DEFS.dos: HAVE_STRCMPI を #define する代わりに,
+	HAVE_STRCASECMP を #define し, strcasecmp を strcmpi に #define 
+	した.
+
+Sat Jul 10 01:05:04 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 2.0 + multi-byte extension 1.01 released.
+
+	* grep.c (main): MSDOS の場合, argv[0] を小文字にして prog にセッ
+	トする.  また, 拡張子は取り除く.
+
+	* obstack.h: chunk_size の型を size_t から unsigned に変更.
+	old-C の場合, size_t が定義されていない状態となったため.
+
+	* regex.h: 定数の後に U, UL をつけると old-C でコンパイルできな
+	い.  これらをキャストに変更した.
+
+	* regex.h: RE_DUP_MAX の定義を 16 ビット int のマシンでもオーバ
+	フローしない書き方に修正.
+
+	* obstack.h: struct obstack のメンバ chunk_size の型を size_t と
+	した.  PTR_INT_TYPE を外部から #define できるようにした.  MSDOS 
+	で SMALL MODEL 以外の場合, __PTR_TO_INT, __INT_TO_PTR とともに,
+	ポインタと long を変換するようにした.
+
+	* grep.c (fillbuf, grep): read() の返り値の正負によるエラーチェッ
+	クを, -1 に等しいかどうかで行うように変更.
+
+	* grep.c: totalcc, totalnl を unsigned long に変更し, prline() 
+	中の printf() の書式を合わせた.
+
+	* DEFS.dos: BUFSALLOC を 4096 に #define.  (See reset() in
+	grep.c.)
+
+	* getpagesize.h: MSDOS の場合, ページサイズは 4096 とした.
+
+	* dfa.c: STDC_HEADERS または HAVE_STRING_H のとき, bcopy, bzero 
+	をマクロ展開する.
+
+Fri Jul  9 13:16:50 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* mbc.c, mbc.h, ...: ismbchar() をモジュール毎に独立して定義する
+	のをやめ, モジュールを追加した.
+
+	* search.c (Fexecute): fgrep をマルチバイト文字に対応させた.
+
+Wed Jul  7 17:02:33 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* kwset.c (bmexec): 8 ビットクリーンでないところを修正.
+
+	* ベースを grep-2.0 へ変更.
+
+Sun Jul  4 08:48:12 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c (re_match_2): オリジナルのバグ.  maybe_finalize_jump 
+	の処理中, start_memory/stop_memory をスキップするところで, 引数
+	のスキップをしていないバグを修正.  例えば "([a-n]+).*\1" が正し
+	く "abcxyzab" にマッチするようになった.
+
+Sat Jul  3 06:51:33 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 1.6 + multi-byte extension 1.00 released.
+
+Sat Jul  3 04:29:14 1993  Takahiro Tanimoto  (tt at pc98)
+
+	* grep.c (bufprev): -b オプションで表示するバイトオフセットを 
+	long にするために bufprev を long とした.  bufprev 以外は変更し
+	ていないため, 1 行のサイズが int の範囲を越えると正しく処理され
+	ない.  また, DOS では CR+LF を 1 バイトとしてカウントしてしまう.
+	(手抜き)
+
+	* regex.c (re_match_2): 文字クラスの処理中の 16 ビット int で正
+	常動作しない部分を修正.
+
+	* regex.c (re_exec): re_search() への最後の引数を 0 から NULL へ
+	修正.
+
+	* regex.c (re_match): re_match_2() への２番目の引数を 0 から 
+	NULL へ修正.
+
+	* regex.c (re_search): re_search_2() への２番目の引数を 0 から 
+	NULL へ修正.
+
+	* grep.c (main): MS-C の setargv のバグのせいで, grep "\\" foo 
+	とすると argv[0] == "" となってしまう.  argv[0] == "" のときは強
+	制的に "grep" または "egrep" をセットするようにした.
+
+Fri Jul  2 19:25:58 1993  Takahiro Tanimoto  (tt at pc98)
+
+	* grep.c (main): 変数 prog の設定を DOS 用に修正した.  その際, 
+	オリジナルのやり方はまずかったので修正した.
+
+	* grep.c: MSDOS のとき errno と sys_errlist の宣言をしないように
+	修正した.
+
+	* regex.c (set_list_bits): 使用していなかった変数を削除.
+
+	* Makefile.msc: DOS サポートのため追加.
+
+Fri Jun 11 04:14:22 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* grep.c: version 文字列が古いままだった.
+
+Tue May 25 00:10:49 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* Version 1.6 + multi-byte extension 0.02 released.
+
+Mon May 24 15:57:31 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c (re_search_2): 後方へ advance する際のバグを修正.
+
+Sat May 22 02:03:41 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c (re_compile_fastmap): exactn で translate するのをやめ
+	た.  re_compile_pattern で一度 translate されているはず.
+
+	* regex.c (re_match_2): exactn の処理部分で, #if 0 を #if 1 にし
+	た場合, 正しい処理を行っていなかったのを修正.
+
+Fri May 21 20:04:07 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.[ch]: mbcharset, mbcharset_not を廃止.  代わりに 
+	charset, charset_not がマルチバイト文字をも保持する.
+
+	* grep.c (main): 下記の変更に伴って, "^.*(" ... ")" を付加する処
+	理を削除した.
+
+	* dfa.c (regcompile): searchflag が ON のとき, 正規表現を "^.*("
+	... ")" としてコンパイルするようにした.  以前は grep.c の中で同
+	じことを行っていた.
+
+	* dfa.c (lex): 文字クラスでマルチバイト文字の１文字目の集合から,
+	シングルバイト文字を除外する処理を追加した.
+
+	* dfa.c (lex): 文字クラスでシングルバイト文字の上限が間違ってい
+	たのを修正した.
+
+Wed May 19 01:27:07 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* regex.c: !__STDC__ のときに const を #define.
+
+	* dfa.h: オリジナルでは !STDC_HEADERS のときに const を #define 
+	していたが, これを !__STDC__ のときに #define するように変更した.
+
+	* configure.in: bcopy(), memmove() のチェックを追加.
+
+	* dfa.c (reginit): cs_tok[] の初期化を追加した.  -i フラグを付け
+	た場合の不具合を修正.
+
+Tue May 18 18:14:04 1993  Takahiro Tanimoto  (tt@albert)
+
+	* dfa.h: regex.h での RE_MBCTYPE_??? の値と一致させた.
+
+	* regex.[ch] (RE_TRANSLATED_RANGE): mbsed-0.01 で行った拡張を輸
+	入した.
+
+Sat May 15 04:27:32 1993  Takahiro Tanimoto  (tt@isaac)
+
+	* マルチバイト文字対応版が一通り完成した.
+
+
+Local Variables:
+mode: indented-text
+left-margin: 8
+fill-column: 72
+fill-prefix: "	"
+version-control: never
+End:
diff -Nur grep-2.3/old-ja/DEFS.dos grep-ja-2.3/old-ja/DEFS.dos
--- grep-2.3/old-ja/DEFS.dos	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/DEFS.dos	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,15 @@
+#define STDC_HEADERS 1
+#define HAVE_STRING_H 1
+#define HAVE_MEMCHR 1
+#define HAVE_STRERROR 1
+#define HAVE_MEMMOVE 1
+#define HAVE_STRCASECMP 1
+#define strcasecmp stricmp
+
+#define BUFSALLOC 4096
+
+#ifndef M_I86SM
+#define __PTR_TO_INT(P) ((long)(P))
+#define __INT_TO_PTR(P) ((char *)(P))
+#define PTR_INT_TYPE long
+#endif
diff -Nur grep-2.3/old-ja/MANIFEST.MB grep-ja-2.3/old-ja/MANIFEST.MB
--- grep-2.3/old-ja/MANIFEST.MB	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/MANIFEST.MB	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,11 @@
+ChangeLog.MB		Revision history of multi-byte extension to grep.
+DEFS.dos		Definitions for DOS.
+MANIFEST.MB		This file.
+Makefile.msc		Makefile for MS-C version 6.
+README.MB		Documentation for multi-byte extension.
+README.MSC		Patch for source/startup/... of MS-C 6.00A
+mbc.c			Multi-byte char handler.
+mbc.h			Interface to mbc.c.
+tests/batgen.awk	DOS version of scriptgen.awk.
+tests/check.bat		DOS version of check.sh
+tests/spencer.dos	Input for batgen.
diff -Nur grep-2.3/old-ja/Makefile.msc grep-ja-2.3/old-ja/Makefile.msc
--- grep-2.3/old-ja/Makefile.msc	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/Makefile.msc	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,138 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile for GNU grep
+# Copyright (C) 1992 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
+# Last change: Jul. 23, 1993 by t^2
+
+#### Start of system configuration section. ####
+
+srcdir=.
+VPATH=.
+
+AWK=gawk
+INSTALL=cp
+INSTALL_PROGRAM=$(INSTALL)
+INSTALL_DATA=$(INSTALL)
+
+CC=cl -nologo -D__STDC__ -AL
+LINT=lint
+
+# Things you might add to DEFS:
+# -DSTDC_HEADERS	If you have ANSI C headers and libraries.
+# -DHAVE_UNISTD_H	If you have unistd.h.
+# -DUSG			If you have System V/ANSI C string
+#			and memory functions and headers.
+# -D__CHAR_UNSIGNED__	If type `char' is unsigned.
+#			gcc defines this automatically.
+#
+# For DOS, add those to DEFS.dos.
+
+# Things you might set to MBCTYPE_DEF to spec. default multi-byte char type.
+# -DEUC			will make default multi-byte char type EUC and
+# -DSJIS		SJIS.
+#			If you do not set EUC/SJIS, grep assumes no multi-byte
+#			char as default.
+MBCTYPE_DEF=-DSJIS
+
+# Extra libraries.
+LIBS=setargv/noe/st:30000
+ALLOCA=
+
+CFLAGS=-Ox
+LDFLAGS=$(CFLAGS)
+
+prefix=
+exec_prefix=$(prefix)
+
+# Prefix for installed program, normally empty or `g'.
+binprefix= 
+# Prefix for installed man page, normally empty or `g'.
+manprefix= 
+
+# Where to install executables.
+bindir=$(exec_prefix)/bin
+
+# Where to install man pages.
+mandir=$(prefix)/man/man1
+
+# Extension for man pages.
+manext=1
+
+# How to make a hard link.
+LN=cp
+
+#### End of system configuration section. ####
+
+SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c mbc.c
+OBJS=grep.obj getopt.obj regex.obj dfa.obj kwset.obj obstack.obj search.obj mbc.obj
+
+.c.obj:
+	cat DEFS.dos $< > $*_.c
+	$(CC) $(CFLAGS) $(MBCTYPE_DEF) -I$(srcdir) -c -Fo$@ $*_.c
+	rm $*_.c
+
+all: grep.exe check.don
+
+# For Saber C.
+grep.loa: $(SRCS)
+	#load $(CFLAGS) $(DEFS) -I$(srcdir) (SRCS)
+
+# For Lint.
+grep.lin: $(SRCS)
+	$(LINT) $(CFLAGS) $(DEFS) -I$(srcdir) $(SRCS)
+
+install: all
+	$(INSTALL_PROGRAM) grep.exe $(bindir)/$(binprefix)grep.exe
+	rm -f $(bindir)/$(binprefix)egrep.exe
+	$(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)egrep.exe
+	rm -f $(bindir)/$(binprefix)fgrep.exe
+	$(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)fgrep.exe
+
+check:
+	tests\check
+	echo done >check.don
+
+check.don: grep.exe
+	tests\check
+	echo done >check.don
+
+grep.exe: $(OBJS)
+	echo $(OBJS:.obj =.obj+)+>link.tmp
+	echo $(LIBS)>>link.tmp
+	echo $@/noi;>>link.tmp
+	link @link.tmp
+	rm link.tmp
+
+clean:
+	rm -f grep.exe *.obj check.don tmp.bat tmp.in khadafy.out
+
+mostlycl: clean
+
+distclea: clean
+	rm -f Makefile config.sta
+
+realclea: distclea
+	rm -f TAGS
+
+# Some header file dependencies that really ought to be automatically deduced.
+dfa.obj search.obj: dfa.h
+grep.obj search.obj: grep.h
+kwset.obj search.obj: kwset.h
+kwset.obj obstack.obj: obstack.h
+regex.obj search.obj: regex.h
+grep.obj regex.obj dfa.obj search.obj mbc.obj: mbc.h
diff -Nur grep-2.3/old-ja/README.MB grep-ja-2.3/old-ja/README.MB
--- grep-2.3/old-ja/README.MB	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/README.MB	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,327 @@
+●●●●● 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:
diff -Nur grep-2.3/old-ja/README.MSC grep-ja-2.3/old-ja/README.MSC
--- grep-2.3/old-ja/README.MSC	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/README.MSC	Mon Dec 20 23:06:54 1999
@@ -0,0 +1,99 @@
+PC-9801 用 MS-C version 6.00A の引数のセットアップルーチンにはバグがあり
+ます.
+
+#include <stdio.h>
+
+int
+main(int argc, char **argv)
+{
+  int i;
+
+  for (i = 0; i <= argc; i++)
+    printf("argv[%d] == %s\n", i, argv[i]);
+  return 0;
+}
+
+をコンパイル, リンクした FOO.EXE に
+
+  A>foo "\\" abc
+
+などの引数を渡して実行すると, バグが確認できます.  また, ワイルドカード
+展開ルーチンにもバグがあり, 上記のプログラムを SETARGV.OBJ とともにリン
+クして
+
+  A>foo \DOS\*.com
+
+などの引数で実行すると, おかしな展開の仕方をしてしまいます.
+
+このバグは SOURCE/STARTUP 下の DOS/STDARGV.ASM および WILD.C に以下のパッ
+チを当てると修正できるようです.  パッチを当てて STARTUP.BAT でコンパイル
+してください. その後, 例えばラージモデル用のライブラリを修正する場合,
+L/DOS/STDARGV.OBJ, L/DOS/_SETARGV.OBJ, L/WILD.OBJ をそれぞれ 
+KSTDARGV.OBJ, _KSTARGV.OBJ, KWILD.OBJ とリネームし,
+
+  lib \msc6\lib\llibce.lib-+dos\kstdargv.obj-+dos\_kstargv.obj-+kwild.obj;
+
+などとしてモジュールを更新してください.  念のためこの作業を行う前に,
+
+  lib \msc6\lib\llibce.lib*kstdargv.obj*_kstargv.obj*kwild.obj;
+
+などで, kstdargv.obj, _kstargv.obj, kwild.obj のバックアップをとって置く
+といいでしょう.
+
+なお, このパッチは当然のことながら無保証です.
+
+Mar. 5, 1994                                                      t^2
+
+*** stdargv.org	Mon Oct  8 19:50:46 1990
+--- stdargv.asm	Thu Jul 22 17:50:44 1993
+***************
+*** 409,415 ****
+  	shr	cx,1
+  	adc	dx,cx		; add 1 for every pair of backslashes
+  	test	al,1		; plus 1 for the " if odd number of \
+! 	jz	arg310		; [J1]
+  	jmp	arg210		; [J1]
+  ;
+  ; Command line is fully parsed - compute number of bytes needed
+--- 409,415 ----
+  	shr	cx,1
+  	adc	dx,cx		; add 1 for every pair of backslashes
+  	test	al,1		; plus 1 for the " if odd number of \
+! 	jnz	arg310		; ! Jul.21.93 t^2
+  	jmp	arg210		; [J1]
+  ;
+  ; Command line is fully parsed - compute number of bytes needed
+
+*** wild.org	Mon Oct  8 19:49:48 1990
+--- wild.c	Sat Mar  5 00:42:12 1994
+***************
+*** 186,197 ****
+      char    *ptr2 = arg;                    // [J1]
+  
+      if(ptr != arg) {                        // [J1]
+!         while(ptr2 + 1 != ptr && *ptr2 != SLASHCHAR && *ptr2 != FWDSLASHCHAR
+!                 && *ptr2 != ':') {          // [J1]
+              if(iskanji(*ptr2))  ptr2++;     // [J1]
+              ptr2++;                         // [J1]
+          }                                   // [J1]
+!         ptr = ptr2;                         // [J1]
+      }                                       // [J1]
+  
+      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
+--- 186,201 ----
+      char    *ptr2 = arg;                    // [J1]
+  
+      if(ptr != arg) {                        // [J1]
+! 	char *ptr3 = arg;
+! 
+!         while (ptr2 < ptr) {
+! 	    if (*ptr2 == SLASHCHAR || *ptr2 == FWDSLASHCHAR
+! 		|| *ptr2 == ':')
+! 		ptr3 = ptr2;
+              if(iskanji(*ptr2))  ptr2++;     // [J1]
+              ptr2++;                         // [J1]
+          }                                   // [J1]
+! 	ptr = ptr3;
+      }                                       // [J1]
+  
+      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
diff -Nur grep-2.3/old-ja/tests/batgen.awk grep-ja-2.3/old-ja/tests/batgen.awk
--- grep-2.3/old-ja/tests/batgen.awk	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/tests/batgen.awk	Mon Dec 20 23:07:51 1999
@@ -0,0 +1,10 @@
+BEGIN { print "@echo off"; }
+$0 !~ /^#/ && NF == 3 {
+	printf "echo #%d --\n", ++n
+	print "set R=0";
+	print "echo " $3 ">tmp.in";
+	print "grep -E -e \"" $2 "\" tmp.in >nul";
+	print "if errorlevel 1 set R=1";
+	print "if errorlevel 2 set R=2";
+	printf "if not %R% == " $1 " echo Spencer test #%d failed\n", n
+}
diff -Nur grep-2.3/old-ja/tests/check.bat grep-ja-2.3/old-ja/tests/check.bat
--- grep-2.3/old-ja/tests/check.bat	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/tests/check.bat	Mon Dec 20 23:07:51 1999
@@ -0,0 +1,14 @@
+@echo off
+rem
+rem Regression test for GNU e?grep.
+rem
+
+rem The Khadafy test is brought to you by Scott Anderson . . .
+grep -E -f tests/khadafy.reg tests/khadafy.lin > khadafy.out
+fc tests\khadafy.lin khadafy.out
+
+rem . . . and the following by Henry Spencer.
+
+gawk -F: -f tests/batgen.awk tests/spencer.dos > tmp.bat
+
+tmp
diff -Nur grep-2.3/old-ja/tests/spencer.dos grep-ja-2.3/old-ja/tests/spencer.dos
--- grep-2.3/old-ja/tests/spencer.dos	Thu Jan  1 09:00:00 1970
+++ grep-ja-2.3/old-ja/tests/spencer.dos	Mon Dec 20 23:07:51 1999
@@ -0,0 +1,122 @@
+0:abc:abc
+1:abc:xbc
+1:abc:axc
+1:abc:abx
+0:abc:xabcy
+0:abc:ababc
+0:ab*c:abc
+0:ab*bc:abc
+0:ab*bc:abbc
+0:ab*bc:abbbbc
+0:ab+bc:abbc
+1:ab+bc:abc
+1:ab+bc:abq
+0:ab+bc:abbbbc
+0:ab?bc:abbc
+0:ab?bc:abc
+1:ab?bc:abbbbc
+0:ab?c:abc
+0:^abc$:abc
+1:^abc$:abcc
+0:^abc:abcc
+1:^abc$:aabc
+0:abc$:aabc
+0:^:abc
+0:$:abc
+0:a.c:abc
+0:a.c:axc
+0:a.*c:axyzc
+1:a.*c:axyzd
+1:a[bc]d:abc
+0:a[bc]d:abd
+1:a[b-d]e:abd
+0:a[b-d]e:ace
+0:a[b-d]:aac
+0:a[-b]:a-
+0:a[b-]:a-
+1:a[b-a]:-
+2:a[]b:-
+2:a[:-
+0:a]:a]
+0:a[]]b:a]b
+0:a[^bc]d:aed
+1:a[^bc]d:abd
+0:a[^-b]c:adc
+1:a[^-b]c:a-c
+1:a[^]b]c:a]c
+0:a[^]b]c:adc
+0:ab|cd:abc
+0:ab|cd:abcd
+0:()ef:def
+0:()*:-
+1:*a:-
+0:^*:-
+0:$*:-
+1:(*)b:-
+1:$b:b
+2:a\\:-
+0:a\(b:a(b
+0:a\(*b:ab
+0:a\(*b:a((b
+1:a\x:a\x
+2:abc):-
+2:(abc:-
+0:((a)):abc
+0:(a)b(c):abc
+0:a+b+c:aabbabc
+0:a**:-
+0:a*?:-
+0:(a*)*:-
+0:(a*)+:-
+0:(a|)*:-
+0:(a*|b)*:-
+0:(a+|b)*:ab
+0:(a+|b)+:ab
+0:(a+|b)?:ab
+0:[^ab]*:cde
+0:(^)*:-
+0:(ab|)*:-
+2:)(:-
+1:abc:
+1:abc:
+0:a*:
+0:([abc])*d:abbbcd
+0:([abc])*bcd:abcd
+0:a|b|c|d|e:e
+0:(a|b|c|d|e)f:ef
+0:((a*|b))*:-
+0:abcd*efg:abcdefg
+0:ab*:xabyabbbz
+0:ab*:xayabbbz
+0:(ab|cd)e:abcde
+0:[abhgefdc]ij:hij
+1:^(ab|cd)e:abcde
+0:(abc|)ef:abcdef
+0:(a|b)c*d:abcd
+0:(ab|ab*)bc:abc
+0:a([bc]*)c*:abc
+0:a([bc]*)(c*d):abcd
+0:a([bc]+)(c*d):abcd
+0:a([bc]*)(c+d):abcd
+0:a[bcd]*dcdcde:adcdcde
+1:a[bcd]+dcdcde:adcdcde
+0:(ab|a)b*c:abc
+0:((a)(b)c)(d):abcd
+0:[A-Za-z_][A-Za-z0-9_]*:alpha
+0:^a(bc+|b[eh])g|.h$:abh
+0:(bc+d$|ef*g.|h?i(j|k)):effgz
+0:(bc+d$|ef*g.|h?i(j|k)):ij
+1:(bc+d$|ef*g.|h?i(j|k)):effg
+1:(bc+d$|ef*g.|h?i(j|k)):bcdd
+0:(bc+d$|ef*g.|h?i(j|k)):reffgz
+1:((((((((((a)))))))))):-
+0:(((((((((a))))))))):a
+1:multiple words of text:uh-uh
+0:multiple words:multiple words, yeah
+0:(.*)c(.*):abcde
+1:\((.*),:(.*)\)
+1:[k]:ab
+0:abcd:abcd
+0:a(bc)d:abcd
+0:a[-]?c:ac
+0:(....).*\1:beriberi
diff -Nur grep-2.3/src/Makefile.am grep-ja-2.3/src/Makefile.am
--- grep-2.3/src/Makefile.am	Thu Feb  4 02:54:57 1999
+++ grep-ja-2.3/src/Makefile.am	Tue Dec 21 00:21:21 1999
@@ -10,7 +10,8 @@
                obstack.c obstack.h \
 	       savedir.c savedir.h \
                getopt.c getopt1.c getopt.h \
-               search.c getpagesize.h system.h
+               search.c getpagesize.h system.h \
+               mbc.c mbc.h
 egrep_SOURCES = $(base_sources) egrepmat.c
 fgrep_SOURCES = $(base_sources) fgrepmat.c
 grep_SOURCES  = $(base_sources) grepmat.c
@@ -23,4 +24,3 @@
 EXTRA_DIST = regex.h regex.c \
              dosbuf.c \
              vms_fab.c vms_fab.h
-
diff -Nur grep-2.3/src/Makefile.in grep-ja-2.3/src/Makefile.in
--- grep-2.3/src/Makefile.in	Mon Feb 15 09:43:47 1999
+++ grep-ja-2.3/src/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -92,7 +92,7 @@
 LN = ln
 
 bin_PROGRAMS = grep egrep fgrep
-base_sources = grep.c grep.h                dfa.c dfa.h                kwset.c  kwset.h                obstack.c obstack.h 	       savedir.c savedir.h                getopt.c getopt1.c getopt.h                search.c getpagesize.h system.h
+base_sources = grep.c grep.h                dfa.c dfa.h                kwset.c  kwset.h                obstack.c obstack.h 	       savedir.c savedir.h                getopt.c getopt1.c getopt.h                search.c getpagesize.h system.h                mbc.c mbc.h
 
 egrep_SOURCES = $(base_sources) egrepmat.c
 fgrep_SOURCES = $(base_sources) fgrepmat.c
@@ -118,19 +118,19 @@
 LIBS = @LIBS@
 grep_OBJECTS =  grep.$(OBJEXT) dfa.$(OBJEXT) kwset.$(OBJEXT) \
 obstack.$(OBJEXT) savedir.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \
-search.$(OBJEXT) grepmat.$(OBJEXT)
+search.$(OBJEXT) mbc.$(OBJEXT) grepmat.$(OBJEXT)
 grep_LDADD = $(LDADD)
 grep_DEPENDENCIES =  @ALLOCA@ @LIBOBJS@
 grep_LDFLAGS = 
 egrep_OBJECTS =  grep.$(OBJEXT) dfa.$(OBJEXT) kwset.$(OBJEXT) \
 obstack.$(OBJEXT) savedir.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \
-search.$(OBJEXT) egrepmat.$(OBJEXT)
+search.$(OBJEXT) mbc.$(OBJEXT) egrepmat.$(OBJEXT)
 egrep_LDADD = $(LDADD)
 egrep_DEPENDENCIES =  @ALLOCA@ @LIBOBJS@
 egrep_LDFLAGS = 
 fgrep_OBJECTS =  grep.$(OBJEXT) dfa.$(OBJEXT) kwset.$(OBJEXT) \
 obstack.$(OBJEXT) savedir.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \
-search.$(OBJEXT) fgrepmat.$(OBJEXT)
+search.$(OBJEXT) mbc.$(OBJEXT) fgrepmat.$(OBJEXT)
 fgrep_LDADD = $(LDADD)
 fgrep_DEPENDENCIES =  @ALLOCA@ @LIBOBJS@
 fgrep_LDFLAGS = 
@@ -259,7 +259,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/src/dfa.c grep-ja-2.3/src/dfa.c
--- grep-2.3/src/dfa.c	Mon Dec 20 23:07:08 1999
+++ grep-ja-2.3/src/dfa.c	Sat Mar 25 15:44:53 2000
@@ -80,9 +80,14 @@
 #define ISALNUM(C) (isascii(C) && isalnum(C))
 #define ISPRINT(C) (isascii(C) && isprint(C))
 #define ISGRAPH(C) (isascii(C) && isgraph(C))
+#include "mbc.h"
 #define ISCNTRL(C) (isascii(C) && iscntrl(C))
 #endif
 
+// gotom added
+#include "mbc.h"
+// gotom end
+
 /* If we (don't) have I18N.  */
 /* glibc defines _ */
 #ifndef _
@@ -715,16 +720,23 @@
 	case '.':
 	  if (backslash)
 	    goto normal_char;
+	  if (current_mbctype != MBCTYPE_ASCII)
+	    mbexttok = MBEXTTOK_ORMBC;
+	  laststart = 0;
+	  return setcodeset(0);
+
+	case 'w':
+	  if (!backslash)
+	    goto normal_char;
 	  zeroset(ccl);
-	  notset(ccl);
-	  if (!(syntax_bits & RE_DOT_NEWLINE))
-	    clrbit('\n', ccl);
-	  if (syntax_bits & RE_DOT_NOT_NULL)
-	    clrbit('\0', ccl);
+	  for (c2 = 0; c2 < NOTCHAR; ++c2)
+	    /* gotom changed */
+	    if (!ISALNUM(c2) && !ismbchar(c2))
+	      setbit(c2, ccl);
+ 	  mbexttok = MBEXTTOK_ORMBC_NL;
 	  laststart = 0;
 	  return lasttok = CSET + charclass_index(ccl);
 
-	case 'w':
 	case 'W':
 	  if (!backslash || (syntax_bits & RE_NO_GNU_OPS))
 	    goto normal_char;
@@ -778,6 +790,11 @@
 		    }
 	      if (c == '\\' && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
 		FETCH(c, _("Unbalanced ["));
+	      /* gotom changed */
+ 	      if (ismbchar(c)) {
+ 		ch = (unsigned char)c;
+ 		FETCH(c, "Multi-byte char incomplete");
+ 	      }
 	      FETCH(c1, _("Unbalanced ["));
 	      if (c1 == '-')
 		{
@@ -795,11 +812,37 @@
 		      if (c2 == '\\'
 			  && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
 			FETCH(c2, _("Unbalanced ["));
+		      /* gotom changed */
+ 		      if (ismbchar(c2)) {
+ 			c2h = (unsigned char)c2;
+ 			FETCH(c2, "Multi-byte char incomplete");
+ 		      }
 		      FETCH(c1, _("Unbalanced ["));
 		    }
 		}
-	      else
+	      /* gotom changed */
+ 	      else {
+ 		c2h = ch;
 		c2 = c;
+		/* gotom changed */
+ 	      }
+ 	      if (ch < c2h || (ch == c2h && c <= c2)) {
+ 		if (ch == 0) {
+ 		  ch = (unsigned char)c2;
+ 		  if (c2h > 0)
+ 		    ch = NOTCHAR - 1;
+ 		  for (; (unsigned char)c <= ch; c++) {
+ 		    setbit(c, ccl);
+ 		    if (case_fold) {
+ 		      if (ISUPPER(c))
+ 			setbit(tolower(c), ccl);
+ 		      else if (ISLOWER(c))
+ 			setbit(toupper(c), ccl);
+ 		    }
+ 		  }
+ 		  ch = 0x80;
+ 		  c = 0x00;
+/*
 	      while (c <= c2)
 		{
 		  setbit(c, ccl);
@@ -809,7 +852,61 @@
 		    else if (ISLOWER(c))
 		      setbit(toupper(c), ccl);
 		  ++c;
+*/
 		}
+		/* gotom changed */
+ 		if (ch <= c2h) {
+ 		  if (mbexttok < 0) {
+ 		    mbexttok = MBEXTTOK_CLASS;
+ 		    zeroset(mbcset_set);
+ 		    zeroset(mbcset_all);
+ 		  }
+ 		  if (ch < c2h && c != 0x00) {	/* 最初の半端 */
+ 		    int t;
+ 
+ 		    if (ismbchar(ch)
+ 			&& ((t = tstbit(ch, mbcset_set))
+ 			    || !tstbit(ch, mbcset_all))) {
+ 		      if (!t) {
+ 			setbit(ch, mbcset_set);
+ 			zeroset(mbcset[ch - 0x80]);
+ 		      }
+ 		      for (; c < NOTCHAR; c++)
+ 			setbit(c, mbcset[ch - 0x80]);
+ 		    }
+ 		    ch++;
+ 		    c = 0x00;
+ 		  }
+ 		  if (ch < c2h || (ch == c2h && c == 0x00 && c2 == 0xff)) {
+ 		    if (c == 0x00 && c2 == 0xff)
+ 		      c2h++;
+ 		    for (; ch < c2h; ch++)
+ 		      if (ismbchar(ch)) {
+ 			clrbit(ch, mbcset_set);
+ 			setbit(ch, mbcset_all);
+ 		      }
+ 		    if (c == 0x00 && c2 == 0xff)
+ 		      c2h--;
+ 		    c = 0x00;
+ 		  }
+ 		  if (ch <= c2h) {
+ 		    int t;
+ 
+ 		    /* ここでは必ず c <= c2 となっている. */
+ 		    if (ismbchar(ch)
+ 			&& ((t = tstbit(ch, mbcset_set))
+ 			    || !tstbit(ch, mbcset_all))) {
+ 		      if (!t) {
+ 			setbit(ch, mbcset_set);
+ 			zeroset(mbcset[ch - 0x80]);
+ 		      }
+ 		      for (; c <= c2; c++)
+ 			setbit(c, mbcset[ch - 0x80]);
+ 		    }
+ 		  }
+ 		}
+ 	      }
+	      /* gotom: 変更ここまで */
 	    skip:
 	      ;
 	    }
@@ -2159,34 +2256,81 @@
 {
   if (case_fold)	/* dummy folding in service of dfamust() */
     {
-      char *lcopy;
+      /* gotom changed */
+      char *lcopy, *p;
       int i;
 
-      lcopy = malloc(len);
+      p = lcopy = malloc(len + 7);
+      /* gotom: 変更ここまで */
       if (!lcopy)
 	dfaerror(_("out of memory"));
 
       /* This is a kludge. */
+      /* gotom changed */
       case_fold = 0;
+      if (current_mbctype != MBCTYPE_ASCII && searchflag) {
+ 	*p++ = '^';
+ 	*p++ = '.';
+ 	*p++ = '*';
+ 	if (!(syntax_bits & RE_NO_BK_PARENS))
+ 	  *p++ = '\\';
+ 	*p++ = '(';
+      }
       for (i = 0; i < len; ++i)
 	if (ISUPPER ((unsigned char) s[i]))
-	  lcopy[i] = tolower ((unsigned char) s[i]);
+	  *p++ = tolower((unsigned char)s[i]);
+      //	  lcopy[i] = tolower ((unsigned char) s[i]);
 	else
-	  lcopy[i] = s[i];
+ 	  *p++ = s[i];
+       if (current_mbctype != MBCTYPE_ASCII && searchflag) {
+	 if (!(syntax_bits & RE_NO_BK_PARENS))
+	   *p++ = '\\';
+	 *p++ = ')';
+       }
+       //	  lcopy[i] = s[i];
 
       dfainit(d);
-      dfaparse(lcopy, len, d);
-      free(lcopy);
+      dfaparse(lcopy, p - lcopy, d);
+      //      dfaparse(lcopy, len, d);
+      //      free(lcopy);
       dfamust(d);
       d->cindex = d->tindex = d->depth = d->nleaves = d->nregexps = 0;
+      bzero(cs_tok, sizeof cs_tok);
       case_fold = 1;
-      dfaparse(s, len, d);
+      if (current_mbctype != MBCTYPE_ASCII && searchflag) {
+	bcopy(s, lcopy + (syntax_bits & RE_NO_BK_PARENS ? 4 : 5), len);
+	dfaparse(lcopy, p - lcopy, d);
+      }
+      else
+ 	dfaparse(s, len, d);
+      //      dfaparse(s, len, d);
       dfaanalyze(d, searchflag);
+      free(lcopy);
     }
   else
     {
         dfainit(d);
-        dfaparse(s, len, d);
+ 	if (current_mbctype != MBCTYPE_ASCII && searchflag) {
+ 	  char *lcopy, *p;
+ 
+ 	  p = lcopy = malloc(len + 7);
+ 	  *p++ = '^';
+ 	  *p++ = '.';
+ 	  *p++ = '*';
+ 	  if (!(syntax_bits & RE_NO_BK_PARENS))
+ 	    *p++ = '\\';
+ 	  *p++ = '(';
+ 	  bcopy(s, p, len);
+ 	  p += len;
+ 	  if (!(syntax_bits & RE_NO_BK_PARENS))
+ 	    *p++ = '\\';
+ 	  *p++ = ')';
+ 	  dfaparse(lcopy, p - lcopy, d);
+ 	  free(lcopy);
+ 	}
+ 	else
+ 	  dfaparse(s, len, d);
+	//        dfaparse(s, len, d);
 	dfamust(d);
         dfaanalyze(d, searchflag);
     }
diff -Nur grep-2.3/src/dfa.c.orig grep-ja-2.3/src/dfa.c.orig
--- grep-2.3/src/dfa.c.orig	Tue Nov 17 09:11:28 1998
+++ grep-ja-2.3/src/dfa.c.orig	Thu Jan  1 09:00:00 1970
@@ -1,2603 +0,0 @@
-/* dfa.c - deterministic extended regexp routines for GNU
-   Copyright (C) 1988, 1998 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA */
-
-/* Written June, 1988 by Mike Haertel
-   Modified July, 1988 by Arthur David Olson to assist BMG speedups  */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdio.h>
-
-#include <sys/types.h>
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#else
-extern char *calloc(), *malloc(), *realloc();
-extern void free();
-#endif
-
-#if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
-#include <string.h>
-#undef index
-#define index strchr
-#else
-#include <strings.h>
-#endif
-
-#ifndef DEBUG	/* use the same approach as regex.c */
-#undef assert
-#define assert(e)
-#endif /* DEBUG */
-
-#ifndef isgraph
-#define isgraph(C) (isprint(C) && !isspace(C))
-#endif
-
-#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
-#define ISALPHA(C) isalpha(C)
-#define ISUPPER(C) isupper(C)
-#define ISLOWER(C) islower(C)
-#define ISDIGIT(C) isdigit(C)
-#define ISXDIGIT(C) isxdigit(C)
-#define ISSPACE(C) isspace(C)
-#define ISPUNCT(C) ispunct(C)
-#define ISALNUM(C) isalnum(C)
-#define ISPRINT(C) isprint(C)
-#define ISGRAPH(C) isgraph(C)
-#define ISCNTRL(C) iscntrl(C)
-#else
-#define ISALPHA(C) (isascii(C) && isalpha(C))
-#define ISUPPER(C) (isascii(C) && isupper(C))
-#define ISLOWER(C) (isascii(C) && islower(C))
-#define ISDIGIT(C) (isascii(C) && isdigit(C))
-#define ISXDIGIT(C) (isascii(C) && isxdigit(C))
-#define ISSPACE(C) (isascii(C) && isspace(C))
-#define ISPUNCT(C) (isascii(C) && ispunct(C))
-#define ISALNUM(C) (isascii(C) && isalnum(C))
-#define ISPRINT(C) (isascii(C) && isprint(C))
-#define ISGRAPH(C) (isascii(C) && isgraph(C))
-#define ISCNTRL(C) (isascii(C) && iscntrl(C))
-#endif
-
-/* If we (don't) have I18N.  */
-/* glibc defines _ */
-#ifndef _
-# ifdef HAVE_LIBINTL_H
-#  include <libintl.h>
-#  ifndef _
-#   define _(Str) gettext (Str)
-#  endif
-# else
-#  define _(Str) (Str)
-# endif
-#endif
-
-#include "regex.h"
-#include "dfa.h"
-
-/* HPUX, define those as macros in sys/param.h */
-#ifdef setbit
-# undef setbit
-#endif
-#ifdef clrbit
-# undef clrbit
-#endif
-
-static void dfamust PARAMS ((struct dfa *dfa));
-
-static ptr_t xcalloc PARAMS ((size_t n, size_t s));
-static ptr_t xmalloc PARAMS ((size_t n));
-static ptr_t xrealloc PARAMS ((ptr_t p, size_t n));
-#ifdef DEBUG
-static void prtok PARAMS ((token t));
-#endif
-static int tstbit PARAMS ((int b, charclass c));
-static void setbit PARAMS ((int b, charclass c));
-static void clrbit PARAMS ((int b, charclass c));
-static void copyset PARAMS ((charclass src, charclass dst));
-static void zeroset PARAMS ((charclass s));
-static void notset PARAMS ((charclass s));
-static int equal PARAMS ((charclass s1, charclass s2));
-static int charclass_index PARAMS ((charclass s));
-static int looking_at PARAMS ((const char *s));
-static token lex PARAMS ((void));
-static void addtok PARAMS ((token t));
-static void atom PARAMS ((void));
-static int nsubtoks PARAMS ((int tindex));
-static void copytoks PARAMS ((int tindex, int ntokens));
-static void closure PARAMS ((void));
-static void branch PARAMS ((void));
-static void regexp PARAMS ((int toplevel));
-static void copy PARAMS ((position_set *src, position_set *dst));
-static void insert PARAMS ((position p, position_set *s));
-static void merge PARAMS ((position_set *s1, position_set *s2, position_set *m));
-static void delete PARAMS ((position p, position_set *s));
-static int state_index PARAMS ((struct dfa *d, position_set *s,
-			  int newline, int letter));
-static void build_state PARAMS ((int s, struct dfa *d));
-static void build_state_zero PARAMS ((struct dfa *d));
-static char *icatalloc PARAMS ((char *old, char *new));
-static char *icpyalloc PARAMS ((char *string));
-static char *istrstr PARAMS ((char *lookin, char *lookfor));
-static void ifree PARAMS ((char *cp));
-static void freelist PARAMS ((char **cpp));
-static char **enlist PARAMS ((char **cpp, char *new, size_t len));
-static char **comsubs PARAMS ((char *left, char *right));
-static char **addlists PARAMS ((char **old, char **new));
-static char **inboth PARAMS ((char **left, char **right));
-
-static ptr_t
-xcalloc(n, s)
-     size_t n;
-     size_t s;
-{
-  ptr_t r = calloc(n, s);
-
-  if (!r)
-    dfaerror(_("Memory exhausted"));
-  return r;
-}
-
-static ptr_t
-xmalloc(n)
-     size_t n;
-{
-  ptr_t r = malloc(n);
-
-  assert(n != 0);
-  if (!r)
-    dfaerror(_("Memory exhausted"));
-  return r;
-}
-
-static ptr_t
-xrealloc(p, n)
-     ptr_t p;
-     size_t n;
-{
-  ptr_t r = realloc(p, n);
-
-  assert(n != 0);
-  if (!r)
-    dfaerror(_("Memory exhausted"));
-  return r;
-}
-
-#define CALLOC(p, t, n) ((p) = (t *) xcalloc((size_t)(n), sizeof (t)))
-#define MALLOC(p, t, n) ((p) = (t *) xmalloc((n) * sizeof (t)))
-#define REALLOC(p, t, n) ((p) = (t *) xrealloc((ptr_t) (p), (n) * sizeof (t)))
-
-/* Reallocate an array of type t if nalloc is too small for index. */
-#define REALLOC_IF_NECESSARY(p, t, nalloc, index) \
-  if ((index) >= (nalloc))			  \
-    {						  \
-      while ((index) >= (nalloc))		  \
-	(nalloc) *= 2;				  \
-      REALLOC(p, t, nalloc);			  \
-    }
-
-#ifdef DEBUG
-
-static void
-prtok(t)
-     token t;
-{
-  char *s;
-
-  if (t < 0)
-    fprintf(stderr, "END");
-  else if (t < NOTCHAR)
-    fprintf(stderr, "%c", t);
-  else
-    {
-      switch (t)
-	{
-	case EMPTY: s = "EMPTY"; break;
-	case BACKREF: s = "BACKREF"; break;
-	case BEGLINE: s = "BEGLINE"; break;
-	case ENDLINE: s = "ENDLINE"; break;
-	case BEGWORD: s = "BEGWORD"; break;
-	case ENDWORD: s = "ENDWORD"; break;
-	case LIMWORD: s = "LIMWORD"; break;
-	case NOTLIMWORD: s = "NOTLIMWORD"; break;
-	case QMARK: s = "QMARK"; break;
-	case STAR: s = "STAR"; break;
-	case PLUS: s = "PLUS"; break;
-	case CAT: s = "CAT"; break;
-	case OR: s = "OR"; break;
-	case ORTOP: s = "ORTOP"; break;
-	case LPAREN: s = "LPAREN"; break;
-	case RPAREN: s = "RPAREN"; break;
-	default: s = "CSET"; break;
-	}
-      fprintf(stderr, "%s", s);
-    }
-}
-#endif /* DEBUG */
-
-/* Stuff pertaining to charclasses. */
-
-static int
-tstbit(b, c)
-     int b;
-     charclass c;
-{
-  return c[b / INTBITS] & 1 << b % INTBITS;
-}
-
-static void
-setbit(b, c)
-     int b;
-     charclass c;
-{
-  c[b / INTBITS] |= 1 << b % INTBITS;
-}
-
-static void
-clrbit(b, c)
-     int b;
-     charclass c;
-{
-  c[b / INTBITS] &= ~(1 << b % INTBITS);
-}
-
-static void
-copyset(src, dst)
-     charclass src;
-     charclass dst;
-{
-  int i;
-
-  for (i = 0; i < CHARCLASS_INTS; ++i)
-    dst[i] = src[i];
-}
-
-static void
-zeroset(s)
-     charclass s;
-{
-  int i;
-
-  for (i = 0; i < CHARCLASS_INTS; ++i)
-    s[i] = 0;
-}
-
-static void
-notset(s)
-     charclass s;
-{
-  int i;
-
-  for (i = 0; i < CHARCLASS_INTS; ++i)
-    s[i] = ~s[i];
-}
-
-static int
-equal(s1, s2)
-     charclass s1;
-     charclass s2;
-{
-  int i;
-
-  for (i = 0; i < CHARCLASS_INTS; ++i)
-    if (s1[i] != s2[i])
-      return 0;
-  return 1;
-}
-
-/* A pointer to the current dfa is kept here during parsing. */
-static struct dfa *dfa;
-
-/* Find the index of charclass s in dfa->charclasses, or allocate a new charclass. */
-static int
-charclass_index(s)
-     charclass s;
-{
-  int i;
-
-  for (i = 0; i < dfa->cindex; ++i)
-    if (equal(s, dfa->charclasses[i]))
-      return i;
-  REALLOC_IF_NECESSARY(dfa->charclasses, charclass, dfa->calloc, dfa->cindex);
-  ++dfa->cindex;
-  copyset(s, dfa->charclasses[i]);
-  return i;
-}
-
-/* Syntax bits controlling the behavior of the lexical analyzer. */
-static reg_syntax_t syntax_bits, syntax_bits_set;
-
-/* Flag for case-folding letters into sets. */
-static int case_fold;
-
-/* Entry point to set syntax options. */
-void
-dfasyntax(bits, fold)
-     reg_syntax_t bits;
-     int fold;
-{
-  syntax_bits_set = 1;
-  syntax_bits = bits;
-  case_fold = fold;
-}
-
-/* Lexical analyzer.  All the dross that deals with the obnoxious
-   GNU Regex syntax bits is located here.  The poor, suffering
-   reader is referred to the GNU Regex documentation for the
-   meaning of the @#%!@#%^!@ syntax bits. */
-
-static char *lexstart;		/* Pointer to beginning of input string. */
-static char *lexptr;		/* Pointer to next input character. */
-static int lexleft;		/* Number of characters remaining. */
-static token lasttok;		/* Previous token returned; initially END. */
-static int laststart;		/* True if we're separated from beginning or (, |
-				   only by zero-width characters. */
-static int parens;		/* Count of outstanding left parens. */
-static int minrep, maxrep;	/* Repeat counts for {m,n}. */
-
-/* Note that characters become unsigned here. */
-#define FETCH(c, eoferr)   	      \
-  {			   	      \
-    if (! lexleft)	   	      \
-      if (eoferr != 0)	   	      \
-	dfaerror(eoferr);  	      \
-      else		   	      \
-	return lasttok = END;	      \
-    (c) = (unsigned char) *lexptr++;  \
-    --lexleft;		   	      \
-  }
-
-#ifdef __STDC__
-#define FUNC(F, P) static int F(int c) { return P(c); }
-#else
-#define FUNC(F, P) static int F(c) int c; { return P(c); }
-#endif
-
-FUNC(is_alpha, ISALPHA)
-FUNC(is_upper, ISUPPER)
-FUNC(is_lower, ISLOWER)
-FUNC(is_digit, ISDIGIT)
-FUNC(is_xdigit, ISXDIGIT)
-FUNC(is_space, ISSPACE)
-FUNC(is_punct, ISPUNCT)
-FUNC(is_alnum, ISALNUM)
-FUNC(is_print, ISPRINT)
-FUNC(is_graph, ISGRAPH)
-FUNC(is_cntrl, ISCNTRL)
-
-static int is_blank(c)
-int c;
-{
-   return (c == ' ' || c == '\t');
-}
-
-/* The following list maps the names of the Posix named character classes
-   to predicate functions that determine whether a given character is in
-   the class.  The leading [ has already been eaten by the lexical analyzer. */
-static struct {
-  const char *name;
-  int (*pred) PARAMS ((int));
-} prednames[] = {
-  { ":alpha:]", is_alpha },
-  { ":upper:]", is_upper },
-  { ":lower:]", is_lower },
-  { ":digit:]", is_digit },
-  { ":xdigit:]", is_xdigit },
-  { ":space:]", is_space },
-  { ":punct:]", is_punct },
-  { ":alnum:]", is_alnum },
-  { ":print:]", is_print },
-  { ":graph:]", is_graph },
-  { ":cntrl:]", is_cntrl },
-  { ":blank:]", is_blank },
-  { 0 }
-};
-
-/* Return non-zero if C is a `word-constituent' byte; zero otherwise.  */
-#define IS_WORD_CONSTITUENT(C) (ISALNUM(C) || (C) == '_')
-
-static int
-looking_at(s)
-     const char *s;
-{
-  size_t len;
-
-  len = strlen(s);
-  if (lexleft < len)
-    return 0;
-  return strncmp(s, lexptr, len) == 0;
-}
-
-static token
-lex()
-{
-  token c, c1, c2;
-  int backslash = 0, invert;
-  charclass ccl;
-  int i;
-
-  /* Basic plan: We fetch a character.  If it's a backslash,
-     we set the backslash flag and go through the loop again.
-     On the plus side, this avoids having a duplicate of the
-     main switch inside the backslash case.  On the minus side,
-     it means that just about every case begins with
-     "if (backslash) ...".  */
-  for (i = 0; i < 2; ++i)
-    {
-      FETCH(c, 0);
-      switch (c)
-	{
-	case '\\':
-	  if (backslash)
-	    goto normal_char;
-	  if (lexleft == 0)
-	    dfaerror(_("Unfinished \\ escape"));
-	  backslash = 1;
-	  break;
-
-	case '^':
-	  if (backslash)
-	    goto normal_char;
-	  if (syntax_bits & RE_CONTEXT_INDEP_ANCHORS
-	      || lasttok == END
-	      || lasttok == LPAREN
-	      || lasttok == OR)
-	    return lasttok = BEGLINE;
-	  goto normal_char;
-
-	case '$':
-	  if (backslash)
-	    goto normal_char;
-	  if (syntax_bits & RE_CONTEXT_INDEP_ANCHORS
-	      || lexleft == 0
-	      || (syntax_bits & RE_NO_BK_PARENS
-		  ? lexleft > 0 && *lexptr == ')'
-		  : lexleft > 1 && lexptr[0] == '\\' && lexptr[1] == ')')
-	      || (syntax_bits & RE_NO_BK_VBAR
-		  ? lexleft > 0 && *lexptr == '|'
-		  : lexleft > 1 && lexptr[0] == '\\' && lexptr[1] == '|')
-	      || ((syntax_bits & RE_NEWLINE_ALT)
-	          && lexleft > 0 && *lexptr == '\n'))
-	    return lasttok = ENDLINE;
-	  goto normal_char;
-
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	  if (backslash && !(syntax_bits & RE_NO_BK_REFS))
-	    {
-	      laststart = 0;
-	      return lasttok = BACKREF;
-	    }
-	  goto normal_char;
-
-	case '`':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = BEGLINE;	/* FIXME: should be beginning of string */
-	  goto normal_char;
-
-	case '\'':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = ENDLINE;	/* FIXME: should be end of string */
-	  goto normal_char;
-
-	case '<':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = BEGWORD;
-	  goto normal_char;
-
-	case '>':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = ENDWORD;
-	  goto normal_char;
-
-	case 'b':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = LIMWORD;
-	  goto normal_char;
-
-	case 'B':
-	  if (backslash && !(syntax_bits & RE_NO_GNU_OPS))
-	    return lasttok = NOTLIMWORD;
-	  goto normal_char;
-
-	case '?':
-	  if (syntax_bits & RE_LIMITED_OPS)
-	    goto normal_char;
-	  if (backslash != ((syntax_bits & RE_BK_PLUS_QM) != 0))
-	    goto normal_char;
-	  if (!(syntax_bits & RE_CONTEXT_INDEP_OPS) && laststart)
-	    goto normal_char;
-	  return lasttok = QMARK;
-
-	case '*':
-	  if (backslash)
-	    goto normal_char;
-	  if (!(syntax_bits & RE_CONTEXT_INDEP_OPS) && laststart)
-	    goto normal_char;
-	  return lasttok = STAR;
-
-	case '+':
-	  if (syntax_bits & RE_LIMITED_OPS)
-	    goto normal_char;
-	  if (backslash != ((syntax_bits & RE_BK_PLUS_QM) != 0))
-	    goto normal_char;
-	  if (!(syntax_bits & RE_CONTEXT_INDEP_OPS) && laststart)
-	    goto normal_char;
-	  return lasttok = PLUS;
-
-	case '{':
-	  if (!(syntax_bits & RE_INTERVALS))
-	    goto normal_char;
-	  if (backslash != ((syntax_bits & RE_NO_BK_BRACES) == 0))
-	    goto normal_char;
-	  minrep = maxrep = 0;
-	  /* Cases:
-	     {M} - exact count
-	     {M,} - minimum count, maximum is infinity
-	     {,M} - 0 through M
-	     {M,N} - M through N */
-	  FETCH(c, _("unfinished repeat count"));
-	  if (ISDIGIT(c))
-	    {
-	      minrep = c - '0';
-	      for (;;)
-		{
-		  FETCH(c, _("unfinished repeat count"));
-		  if (!ISDIGIT(c))
-		    break;
-		  minrep = 10 * minrep + c - '0';
-		}
-	    }
-	  else if (c != ',')
-	    dfaerror(_("malformed repeat count"));
-	  if (c == ',')
-	    for (;;)
-	      {
-		FETCH(c, _("unfinished repeat count"));
-		if (!ISDIGIT(c))
-		  break;
-		maxrep = 10 * maxrep + c - '0';
-	      }
-	  else
-	    maxrep = minrep;
-	  if (!(syntax_bits & RE_NO_BK_BRACES))
-	    {
-	      if (c != '\\')
-		dfaerror(_("malformed repeat count"));
-	      FETCH(c, _("unfinished repeat count"));
-	    }
-	  if (c != '}')
-	    dfaerror(_("malformed repeat count"));
-	  laststart = 0;
-	  return lasttok = REPMN;
-
-	case '|':
-	  if (syntax_bits & RE_LIMITED_OPS)
-	    goto normal_char;
-	  if (backslash != ((syntax_bits & RE_NO_BK_VBAR) == 0))
-	    goto normal_char;
-	  laststart = 1;
-	  return lasttok = OR;
-
-	case '\n':
-	  if (syntax_bits & RE_LIMITED_OPS
-	      || backslash
-	      || !(syntax_bits & RE_NEWLINE_ALT))
-	    goto normal_char;
-	  laststart = 1;
-	  return lasttok = OR;
-
-	case '(':
-	  if (backslash != ((syntax_bits & RE_NO_BK_PARENS) == 0))
-	    goto normal_char;
-	  ++parens;
-	  laststart = 1;
-	  return lasttok = LPAREN;
-
-	case ')':
-	  if (backslash != ((syntax_bits & RE_NO_BK_PARENS) == 0))
-	    goto normal_char;
-	  if (parens == 0 && syntax_bits & RE_UNMATCHED_RIGHT_PAREN_ORD)
-	    goto normal_char;
-	  --parens;
-	  laststart = 0;
-	  return lasttok = RPAREN;
-
-	case '.':
-	  if (backslash)
-	    goto normal_char;
-	  zeroset(ccl);
-	  notset(ccl);
-	  if (!(syntax_bits & RE_DOT_NEWLINE))
-	    clrbit('\n', ccl);
-	  if (syntax_bits & RE_DOT_NOT_NULL)
-	    clrbit('\0', ccl);
-	  laststart = 0;
-	  return lasttok = CSET + charclass_index(ccl);
-
-	case 'w':
-	case 'W':
-	  if (!backslash || (syntax_bits & RE_NO_GNU_OPS))
-	    goto normal_char;
-	  zeroset(ccl);
-	  for (c2 = 0; c2 < NOTCHAR; ++c2)
-	    if (IS_WORD_CONSTITUENT(c2))
-	      setbit(c2, ccl);
-	  if (c == 'W')
-	    notset(ccl);
-	  laststart = 0;
-	  return lasttok = CSET + charclass_index(ccl);
-
-	case '[':
-	  if (backslash)
-	    goto normal_char;
-	  zeroset(ccl);
-	  FETCH(c, _("Unbalanced ["));
-	  if (c == '^')
-	    {
-	      FETCH(c, _("Unbalanced ["));
-	      invert = 1;
-	    }
-	  else
-	    invert = 0;
-	  do
-	    {
-	      /* Nobody ever said this had to be fast. :-)
-		 Note that if we're looking at some other [:...:]
-		 construct, we just treat it as a bunch of ordinary
-		 characters.  We can do this because we assume
-		 regex has checked for syntax errors before
-		 dfa is ever called. */
-	      if (c == '[' && (syntax_bits & RE_CHAR_CLASSES))
-		for (c1 = 0; prednames[c1].name; ++c1)
-		  if (looking_at(prednames[c1].name))
-		    {
-			int (*pred)() = prednames[c1].pred;
-			if (case_fold
-			    && (pred == is_upper || pred == is_lower))
-				pred = is_alpha;
-
-		      for (c2 = 0; c2 < NOTCHAR; ++c2)
-			if ((*pred)(c2))
-			  setbit(c2, ccl);
-		      lexptr += strlen(prednames[c1].name);
-		      lexleft -= strlen(prednames[c1].name);
-		      FETCH(c1, _("Unbalanced ["));
-		      goto skip;
-		    }
-	      if (c == '\\' && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-		FETCH(c, _("Unbalanced ["));
-	      FETCH(c1, _("Unbalanced ["));
-	      if (c1 == '-')
-		{
-		  FETCH(c2, _("Unbalanced ["));
-		  if (c2 == ']')
-		    {
-		      /* In the case [x-], the - is an ordinary hyphen,
-			 which is left in c1, the lookahead character. */
-		      --lexptr;
-		      ++lexleft;
-		      c2 = c;
-		    }
-		  else
-		    {
-		      if (c2 == '\\'
-			  && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-			FETCH(c2, _("Unbalanced ["));
-		      FETCH(c1, _("Unbalanced ["));
-		    }
-		}
-	      else
-		c2 = c;
-	      while (c <= c2)
-		{
-		  setbit(c, ccl);
-		  if (case_fold)
-		    if (ISUPPER(c))
-		      setbit(tolower(c), ccl);
-		    else if (ISLOWER(c))
-		      setbit(toupper(c), ccl);
-		  ++c;
-		}
-	    skip:
-	      ;
-	    }
-	  while ((c = c1) != ']');
-	  if (invert)
-	    {
-	      notset(ccl);
-	      if (syntax_bits & RE_HAT_LISTS_NOT_NEWLINE)
-		clrbit('\n', ccl);
-	    }
-	  laststart = 0;
-	  return lasttok = CSET + charclass_index(ccl);
-
-	default:
-	normal_char:
-	  laststart = 0;
-	  if (case_fold && ISALPHA(c))
-	    {
-	      zeroset(ccl);
-	      setbit(c, ccl);
-	      if (isupper(c))
-		setbit(tolower(c), ccl);
-	      else
-		setbit(toupper(c), ccl);
-	      return lasttok = CSET + charclass_index(ccl);
-	    }
-	  return c;
-	}
-    }
-
-  /* The above loop should consume at most a backslash
-     and some other character. */
-  abort();
-  return END;	/* keeps pedantic compilers happy. */
-}
-
-/* Recursive descent parser for regular expressions. */
-
-static token tok;		/* Lookahead token. */
-static int depth;		/* Current depth of a hypothetical stack
-				   holding deferred productions.  This is
-				   used to determine the depth that will be
-				   required of the real stack later on in
-				   dfaanalyze(). */
-
-/* Add the given token to the parse tree, maintaining the depth count and
-   updating the maximum depth if necessary. */
-static void
-addtok(t)
-     token t;
-{
-  REALLOC_IF_NECESSARY(dfa->tokens, token, dfa->talloc, dfa->tindex);
-  dfa->tokens[dfa->tindex++] = t;
-
-  switch (t)
-    {
-    case QMARK:
-    case STAR:
-    case PLUS:
-      break;
-
-    case CAT:
-    case OR:
-    case ORTOP:
-      --depth;
-      break;
-
-    default:
-      ++dfa->nleaves;
-    case EMPTY:
-      ++depth;
-      break;
-    }
-  if (depth > dfa->depth)
-    dfa->depth = depth;
-}
-
-/* The grammar understood by the parser is as follows.
-
-   regexp:
-     regexp OR branch
-     branch
-
-   branch:
-     branch closure
-     closure
-
-   closure:
-     closure QMARK
-     closure STAR
-     closure PLUS
-     atom
-
-   atom:
-     <normal character>
-     CSET
-     BACKREF
-     BEGLINE
-     ENDLINE
-     BEGWORD
-     ENDWORD
-     LIMWORD
-     NOTLIMWORD
-     <empty>
-
-   The parser builds a parse tree in postfix form in an array of tokens. */
-
-static void
-atom()
-{
-  if ((tok >= 0 && tok < NOTCHAR) || tok >= CSET || tok == BACKREF
-      || tok == BEGLINE || tok == ENDLINE || tok == BEGWORD
-      || tok == ENDWORD || tok == LIMWORD || tok == NOTLIMWORD)
-    {
-      addtok(tok);
-      tok = lex();
-    }
-  else if (tok == LPAREN)
-    {
-      tok = lex();
-      regexp(0);
-      if (tok != RPAREN)
-	dfaerror(_("Unbalanced ("));
-      tok = lex();
-    }
-  else
-    addtok(EMPTY);
-}
-
-/* Return the number of tokens in the given subexpression. */
-static int
-nsubtoks(tindex)
-int tindex;
-{
-  int ntoks1;
-
-  switch (dfa->tokens[tindex - 1])
-    {
-    default:
-      return 1;
-    case QMARK:
-    case STAR:
-    case PLUS:
-      return 1 + nsubtoks(tindex - 1);
-    case CAT:
-    case OR:
-    case ORTOP:
-      ntoks1 = nsubtoks(tindex - 1);
-      return 1 + ntoks1 + nsubtoks(tindex - 1 - ntoks1);
-    }
-}
-
-/* Copy the given subexpression to the top of the tree. */
-static void
-copytoks(tindex, ntokens)
-     int tindex, ntokens;
-{
-  int i;
-
-  for (i = 0; i < ntokens; ++i)
-    addtok(dfa->tokens[tindex + i]);
-}
-
-static void
-closure()
-{
-  int tindex, ntokens, i;
-
-  atom();
-  while (tok == QMARK || tok == STAR || tok == PLUS || tok == REPMN)
-    if (tok == REPMN)
-      {
-	ntokens = nsubtoks(dfa->tindex);
-	tindex = dfa->tindex - ntokens;
-	if (maxrep == 0)
-	  addtok(PLUS);
-	if (minrep == 0)
-	  addtok(QMARK);
-	for (i = 1; i < minrep; ++i)
-	  {
-	    copytoks(tindex, ntokens);
-	    addtok(CAT);
-	  }
-	for (; i < maxrep; ++i)
-	  {
-	    copytoks(tindex, ntokens);
-	    addtok(QMARK);
-	    addtok(CAT);
-	  }
-	tok = lex();
-      }
-    else
-      {
-	addtok(tok);
-	tok = lex();
-      }
-}
-
-static void
-branch()
-{
-  closure();
-  while (tok != RPAREN && tok != OR && tok >= 0)
-    {
-      closure();
-      addtok(CAT);
-    }
-}
-
-static void
-regexp(toplevel)
-     int toplevel;
-{
-  branch();
-  while (tok == OR)
-    {
-      tok = lex();
-      branch();
-      if (toplevel)
-	addtok(ORTOP);
-      else
-	addtok(OR);
-    }
-}
-
-/* Main entry point for the parser.  S is a string to be parsed, len is the
-   length of the string, so s can include NUL characters.  D is a pointer to
-   the struct dfa to parse into. */
-void
-dfaparse(s, len, d)
-     char *s;
-     size_t len;
-     struct dfa *d;
-
-{
-  dfa = d;
-  lexstart = lexptr = s;
-  lexleft = len;
-  lasttok = END;
-  laststart = 1;
-  parens = 0;
-
-  if (! syntax_bits_set)
-    dfaerror(_("No syntax specified"));
-
-  tok = lex();
-  depth = d->depth;
-
-  regexp(1);
-
-  if (tok != END)
-    dfaerror(_("Unbalanced )"));
-
-  addtok(END - d->nregexps);
-  addtok(CAT);
-
-  if (d->nregexps)
-    addtok(ORTOP);
-
-  ++d->nregexps;
-}
-
-/* Some primitives for operating on sets of positions. */
-
-/* Copy one set to another; the destination must be large enough. */
-static void
-copy(src, dst)
-     position_set *src;
-     position_set *dst;
-{
-  int i;
-
-  for (i = 0; i < src->nelem; ++i)
-    dst->elems[i] = src->elems[i];
-  dst->nelem = src->nelem;
-}
-
-/* Insert a position in a set.  Position sets are maintained in sorted
-   order according to index.  If position already exists in the set with
-   the same index then their constraints are logically or'd together.
-   S->elems must point to an array large enough to hold the resulting set. */
-static void
-insert(p, s)
-     position p;
-     position_set *s;
-{
-  int i;
-  position t1, t2;
-
-  for (i = 0; i < s->nelem && p.index < s->elems[i].index; ++i)
-    continue;
-  if (i < s->nelem && p.index == s->elems[i].index)
-    s->elems[i].constraint |= p.constraint;
-  else
-    {
-      t1 = p;
-      ++s->nelem;
-      while (i < s->nelem)
-	{
-	  t2 = s->elems[i];
-	  s->elems[i++] = t1;
-	  t1 = t2;
-	}
-    }
-}
-
-/* Merge two sets of positions into a third.  The result is exactly as if
-   the positions of both sets were inserted into an initially empty set. */
-static void
-merge(s1, s2, m)
-     position_set *s1;
-     position_set *s2;
-     position_set *m;
-{
-  int i = 0, j = 0;
-
-  m->nelem = 0;
-  while (i < s1->nelem && j < s2->nelem)
-    if (s1->elems[i].index > s2->elems[j].index)
-      m->elems[m->nelem++] = s1->elems[i++];
-    else if (s1->elems[i].index < s2->elems[j].index)
-      m->elems[m->nelem++] = s2->elems[j++];
-    else
-      {
-	m->elems[m->nelem] = s1->elems[i++];
-	m->elems[m->nelem++].constraint |= s2->elems[j++].constraint;
-      }
-  while (i < s1->nelem)
-    m->elems[m->nelem++] = s1->elems[i++];
-  while (j < s2->nelem)
-    m->elems[m->nelem++] = s2->elems[j++];
-}
-
-/* Delete a position from a set. */
-static void
-delete(p, s)
-     position p;
-     position_set *s;
-{
-  int i;
-
-  for (i = 0; i < s->nelem; ++i)
-    if (p.index == s->elems[i].index)
-      break;
-  if (i < s->nelem)
-    for (--s->nelem; i < s->nelem; ++i)
-      s->elems[i] = s->elems[i + 1];
-}
-
-/* Find the index of the state corresponding to the given position set with
-   the given preceding context, or create a new state if there is no such
-   state.  Newline and letter tell whether we got here on a newline or
-   letter, respectively. */
-static int
-state_index(d, s, newline, letter)
-     struct dfa *d;
-     position_set *s;
-     int newline;
-     int letter;
-{
-  int hash = 0;
-  int constraint;
-  int i, j;
-
-  newline = newline ? 1 : 0;
-  letter = letter ? 1 : 0;
-
-  for (i = 0; i < s->nelem; ++i)
-    hash ^= s->elems[i].index + s->elems[i].constraint;
-
-  /* Try to find a state that exactly matches the proposed one. */
-  for (i = 0; i < d->sindex; ++i)
-    {
-      if (hash != d->states[i].hash || s->nelem != d->states[i].elems.nelem
-	  || newline != d->states[i].newline || letter != d->states[i].letter)
-	continue;
-      for (j = 0; j < s->nelem; ++j)
-	if (s->elems[j].constraint
-	    != d->states[i].elems.elems[j].constraint
-	    || s->elems[j].index != d->states[i].elems.elems[j].index)
-	  break;
-      if (j == s->nelem)
-	return i;
-    }
-
-  /* We'll have to create a new state. */
-  REALLOC_IF_NECESSARY(d->states, dfa_state, d->salloc, d->sindex);
-  d->states[i].hash = hash;
-  MALLOC(d->states[i].elems.elems, position, s->nelem);
-  copy(s, &d->states[i].elems);
-  d->states[i].newline = newline;
-  d->states[i].letter = letter;
-  d->states[i].backref = 0;
-  d->states[i].constraint = 0;
-  d->states[i].first_end = 0;
-  for (j = 0; j < s->nelem; ++j)
-    if (d->tokens[s->elems[j].index] < 0)
-      {
-	constraint = s->elems[j].constraint;
-	if (SUCCEEDS_IN_CONTEXT(constraint, newline, 0, letter, 0)
-	    || SUCCEEDS_IN_CONTEXT(constraint, newline, 0, letter, 1)
-	    || SUCCEEDS_IN_CONTEXT(constraint, newline, 1, letter, 0)
-	    || SUCCEEDS_IN_CONTEXT(constraint, newline, 1, letter, 1))
-	  d->states[i].constraint |= constraint;
-	if (! d->states[i].first_end)
-	  d->states[i].first_end = d->tokens[s->elems[j].index];
-      }
-    else if (d->tokens[s->elems[j].index] == BACKREF)
-      {
-	d->states[i].constraint = NO_CONSTRAINT;
-	d->states[i].backref = 1;
-      }
-
-  ++d->sindex;
-
-  return i;
-}
-
-/* Find the epsilon closure of a set of positions.  If any position of the set
-   contains a symbol that matches the empty string in some context, replace
-   that position with the elements of its follow labeled with an appropriate
-   constraint.  Repeat exhaustively until no funny positions are left.
-   S->elems must be large enough to hold the result. */
-static void epsclosure PARAMS ((position_set *s, struct dfa *d));
-
-static void
-epsclosure(s, d)
-     position_set *s;
-     struct dfa *d;
-{
-  int i, j;
-  int *visited;
-  position p, old;
-
-  MALLOC(visited, int, d->tindex);
-  for (i = 0; i < d->tindex; ++i)
-    visited[i] = 0;
-
-  for (i = 0; i < s->nelem; ++i)
-    if (d->tokens[s->elems[i].index] >= NOTCHAR
-	&& d->tokens[s->elems[i].index] != BACKREF
-	&& d->tokens[s->elems[i].index] < CSET)
-      {
-	old = s->elems[i];
-	p.constraint = old.constraint;
-	delete(s->elems[i], s);
-	if (visited[old.index])
-	  {
-	    --i;
-	    continue;
-	  }
-	visited[old.index] = 1;
-	switch (d->tokens[old.index])
-	  {
-	  case BEGLINE:
-	    p.constraint &= BEGLINE_CONSTRAINT;
-	    break;
-	  case ENDLINE:
-	    p.constraint &= ENDLINE_CONSTRAINT;
-	    break;
-	  case BEGWORD:
-	    p.constraint &= BEGWORD_CONSTRAINT;
-	    break;
-	  case ENDWORD:
-	    p.constraint &= ENDWORD_CONSTRAINT;
-	    break;
-	  case LIMWORD:
-	    p.constraint &= LIMWORD_CONSTRAINT;
-	    break;
-	  case NOTLIMWORD:
-	    p.constraint &= NOTLIMWORD_CONSTRAINT;
-	    break;
-	  default:
-	    break;
-	  }
-	for (j = 0; j < d->follows[old.index].nelem; ++j)
-	  {
-	    p.index = d->follows[old.index].elems[j].index;
-	    insert(p, s);
-	  }
-	/* Force rescan to start at the beginning. */
-	i = -1;
-      }
-
-  free(visited);
-}
-
-/* Perform bottom-up analysis on the parse tree, computing various functions.
-   Note that at this point, we're pretending constructs like \< are real
-   characters rather than constraints on what can follow them.
-
-   Nullable:  A node is nullable if it is at the root of a regexp that can
-   match the empty string.
-   *  EMPTY leaves are nullable.
-   * No other leaf is nullable.
-   * A QMARK or STAR node is nullable.
-   * A PLUS node is nullable if its argument is nullable.
-   * A CAT node is nullable if both its arguments are nullable.
-   * An OR node is nullable if either argument is nullable.
-
-   Firstpos:  The firstpos of a node is the set of positions (nonempty leaves)
-   that could correspond to the first character of a string matching the
-   regexp rooted at the given node.
-   * EMPTY leaves have empty firstpos.
-   * The firstpos of a nonempty leaf is that leaf itself.
-   * The firstpos of a QMARK, STAR, or PLUS node is the firstpos of its
-     argument.
-   * The firstpos of a CAT node is the firstpos of the left argument, union
-     the firstpos of the right if the left argument is nullable.
-   * The firstpos of an OR node is the union of firstpos of each argument.
-
-   Lastpos:  The lastpos of a node is the set of positions that could
-   correspond to the last character of a string matching the regexp at
-   the given node.
-   * EMPTY leaves have empty lastpos.
-   * The lastpos of a nonempty leaf is that leaf itself.
-   * The lastpos of a QMARK, STAR, or PLUS node is the lastpos of its
-     argument.
-   * The lastpos of a CAT node is the lastpos of its right argument, union
-     the lastpos of the left if the right argument is nullable.
-   * The lastpos of an OR node is the union of the lastpos of each argument.
-
-   Follow:  The follow of a position is the set of positions that could
-   correspond to the character following a character matching the node in
-   a string matching the regexp.  At this point we consider special symbols
-   that match the empty string in some context to be just normal characters.
-   Later, if we find that a special symbol is in a follow set, we will
-   replace it with the elements of its follow, labeled with an appropriate
-   constraint.
-   * Every node in the firstpos of the argument of a STAR or PLUS node is in
-     the follow of every node in the lastpos.
-   * Every node in the firstpos of the second argument of a CAT node is in
-     the follow of every node in the lastpos of the first argument.
-
-   Because of the postfix representation of the parse tree, the depth-first
-   analysis is conveniently done by a linear scan with the aid of a stack.
-   Sets are stored as arrays of the elements, obeying a stack-like allocation
-   scheme; the number of elements in each set deeper in the stack can be
-   used to determine the address of a particular set's array. */
-void
-dfaanalyze(d, searchflag)
-     struct dfa *d;
-     int searchflag;
-{
-  int *nullable;		/* Nullable stack. */
-  int *nfirstpos;		/* Element count stack for firstpos sets. */
-  position *firstpos;		/* Array where firstpos elements are stored. */
-  int *nlastpos;		/* Element count stack for lastpos sets. */
-  position *lastpos;		/* Array where lastpos elements are stored. */
-  int *nalloc;			/* Sizes of arrays allocated to follow sets. */
-  position_set tmp;		/* Temporary set for merging sets. */
-  position_set merged;		/* Result of merging sets. */
-  int wants_newline;		/* True if some position wants newline info. */
-  int *o_nullable;
-  int *o_nfirst, *o_nlast;
-  position *o_firstpos, *o_lastpos;
-  int i, j;
-  position *pos;
-
-#ifdef DEBUG
-  fprintf(stderr, "dfaanalyze:\n");
-  for (i = 0; i < d->tindex; ++i)
-    {
-      fprintf(stderr, " %d:", i);
-      prtok(d->tokens[i]);
-    }
-  putc('\n', stderr);
-#endif
-
-  d->searchflag = searchflag;
-
-  MALLOC(nullable, int, d->depth);
-  o_nullable = nullable;
-  MALLOC(nfirstpos, int, d->depth);
-  o_nfirst = nfirstpos;
-  MALLOC(firstpos, position, d->nleaves);
-  o_firstpos = firstpos, firstpos += d->nleaves;
-  MALLOC(nlastpos, int, d->depth);
-  o_nlast = nlastpos;
-  MALLOC(lastpos, position, d->nleaves);
-  o_lastpos = lastpos, lastpos += d->nleaves;
-  MALLOC(nalloc, int, d->tindex);
-  for (i = 0; i < d->tindex; ++i)
-    nalloc[i] = 0;
-  MALLOC(merged.elems, position, d->nleaves);
-
-  CALLOC(d->follows, position_set, d->tindex);
-
-  for (i = 0; i < d->tindex; ++i)
-#ifdef DEBUG
-    {				/* Nonsyntactic #ifdef goo... */
-#endif
-    switch (d->tokens[i])
-      {
-      case EMPTY:
-	/* The empty set is nullable. */
-	*nullable++ = 1;
-
-	/* The firstpos and lastpos of the empty leaf are both empty. */
-	*nfirstpos++ = *nlastpos++ = 0;
-	break;
-
-      case STAR:
-      case PLUS:
-	/* Every element in the firstpos of the argument is in the follow
-	   of every element in the lastpos. */
-	tmp.nelem = nfirstpos[-1];
-	tmp.elems = firstpos;
-	pos = lastpos;
-	for (j = 0; j < nlastpos[-1]; ++j)
-	  {
-	    merge(&tmp, &d->follows[pos[j].index], &merged);
-	    REALLOC_IF_NECESSARY(d->follows[pos[j].index].elems, position,
-				 nalloc[pos[j].index], merged.nelem - 1);
-	    copy(&merged, &d->follows[pos[j].index]);
-	  }
-
-      case QMARK:
-	/* A QMARK or STAR node is automatically nullable. */
-	if (d->tokens[i] != PLUS)
-	  nullable[-1] = 1;
-	break;
-
-      case CAT:
-	/* Every element in the firstpos of the second argument is in the
-	   follow of every element in the lastpos of the first argument. */
-	tmp.nelem = nfirstpos[-1];
-	tmp.elems = firstpos;
-	pos = lastpos + nlastpos[-1];
-	for (j = 0; j < nlastpos[-2]; ++j)
-	  {
-	    merge(&tmp, &d->follows[pos[j].index], &merged);
-	    REALLOC_IF_NECESSARY(d->follows[pos[j].index].elems, position,
-				 nalloc[pos[j].index], merged.nelem - 1);
-	    copy(&merged, &d->follows[pos[j].index]);
-	  }
-
-	/* The firstpos of a CAT node is the firstpos of the first argument,
-	   union that of the second argument if the first is nullable. */
-	if (nullable[-2])
-	  nfirstpos[-2] += nfirstpos[-1];
-	else
-	  firstpos += nfirstpos[-1];
-	--nfirstpos;
-
-	/* The lastpos of a CAT node is the lastpos of the second argument,
-	   union that of the first argument if the second is nullable. */
-	if (nullable[-1])
-	  nlastpos[-2] += nlastpos[-1];
-	else
-	  {
-	    pos = lastpos + nlastpos[-2];
-	    for (j = nlastpos[-1] - 1; j >= 0; --j)
-	      pos[j] = lastpos[j];
-	    lastpos += nlastpos[-2];
-	    nlastpos[-2] = nlastpos[-1];
-	  }
-	--nlastpos;
-
-	/* A CAT node is nullable if both arguments are nullable. */
-	nullable[-2] = nullable[-1] && nullable[-2];
-	--nullable;
-	break;
-
-      case OR:
-      case ORTOP:
-	/* The firstpos is the union of the firstpos of each argument. */
-	nfirstpos[-2] += nfirstpos[-1];
-	--nfirstpos;
-
-	/* The lastpos is the union of the lastpos of each argument. */
-	nlastpos[-2] += nlastpos[-1];
-	--nlastpos;
-
-	/* An OR node is nullable if either argument is nullable. */
-	nullable[-2] = nullable[-1] || nullable[-2];
-	--nullable;
-	break;
-
-      default:
-	/* Anything else is a nonempty position.  (Note that special
-	   constructs like \< are treated as nonempty strings here;
-	   an "epsilon closure" effectively makes them nullable later.
-	   Backreferences have to get a real position so we can detect
-	   transitions on them later.  But they are nullable. */
-	*nullable++ = d->tokens[i] == BACKREF;
-
-	/* This position is in its own firstpos and lastpos. */
-	*nfirstpos++ = *nlastpos++ = 1;
-	--firstpos, --lastpos;
-	firstpos->index = lastpos->index = i;
-	firstpos->constraint = lastpos->constraint = NO_CONSTRAINT;
-
-	/* Allocate the follow set for this position. */
-	nalloc[i] = 1;
-	MALLOC(d->follows[i].elems, position, nalloc[i]);
-	break;
-      }
-#ifdef DEBUG
-    /* ... balance the above nonsyntactic #ifdef goo... */
-      fprintf(stderr, "node %d:", i);
-      prtok(d->tokens[i]);
-      putc('\n', stderr);
-      fprintf(stderr, nullable[-1] ? " nullable: yes\n" : " nullable: no\n");
-      fprintf(stderr, " firstpos:");
-      for (j = nfirstpos[-1] - 1; j >= 0; --j)
-	{
-	  fprintf(stderr, " %d:", firstpos[j].index);
-	  prtok(d->tokens[firstpos[j].index]);
-	}
-      fprintf(stderr, "\n lastpos:");
-      for (j = nlastpos[-1] - 1; j >= 0; --j)
-	{
-	  fprintf(stderr, " %d:", lastpos[j].index);
-	  prtok(d->tokens[lastpos[j].index]);
-	}
-      putc('\n', stderr);
-    }
-#endif
-
-  /* For each follow set that is the follow set of a real position, replace
-     it with its epsilon closure. */
-  for (i = 0; i < d->tindex; ++i)
-    if (d->tokens[i] < NOTCHAR || d->tokens[i] == BACKREF
-	|| d->tokens[i] >= CSET)
-      {
-#ifdef DEBUG
-	fprintf(stderr, "follows(%d:", i);
-	prtok(d->tokens[i]);
-	fprintf(stderr, "):");
-	for (j = d->follows[i].nelem - 1; j >= 0; --j)
-	  {
-	    fprintf(stderr, " %d:", d->follows[i].elems[j].index);
-	    prtok(d->tokens[d->follows[i].elems[j].index]);
-	  }
-	putc('\n', stderr);
-#endif
-	copy(&d->follows[i], &merged);
-	epsclosure(&merged, d);
-	if (d->follows[i].nelem < merged.nelem)
-	  REALLOC(d->follows[i].elems, position, merged.nelem);
-	copy(&merged, &d->follows[i]);
-      }
-
-  /* Get the epsilon closure of the firstpos of the regexp.  The result will
-     be the set of positions of state 0. */
-  merged.nelem = 0;
-  for (i = 0; i < nfirstpos[-1]; ++i)
-    insert(firstpos[i], &merged);
-  epsclosure(&merged, d);
-
-  /* Check if any of the positions of state 0 will want newline context. */
-  wants_newline = 0;
-  for (i = 0; i < merged.nelem; ++i)
-    if (PREV_NEWLINE_DEPENDENT(merged.elems[i].constraint))
-      wants_newline = 1;
-
-  /* Build the initial state. */
-  d->salloc = 1;
-  d->sindex = 0;
-  MALLOC(d->states, dfa_state, d->salloc);
-  state_index(d, &merged, wants_newline, 0);
-
-  free(o_nullable);
-  free(o_nfirst);
-  free(o_firstpos);
-  free(o_nlast);
-  free(o_lastpos);
-  free(nalloc);
-  free(merged.elems);
-}
-
-/* Find, for each character, the transition out of state s of d, and store
-   it in the appropriate slot of trans.
-
-   We divide the positions of s into groups (positions can appear in more
-   than one group).  Each group is labeled with a set of characters that
-   every position in the group matches (taking into account, if necessary,
-   preceding context information of s).  For each group, find the union
-   of the its elements' follows.  This set is the set of positions of the
-   new state.  For each character in the group's label, set the transition
-   on this character to be to a state corresponding to the set's positions,
-   and its associated backward context information, if necessary.
-
-   If we are building a searching matcher, we include the positions of state
-   0 in every state.
-
-   The collection of groups is constructed by building an equivalence-class
-   partition of the positions of s.
-
-   For each position, find the set of characters C that it matches.  Eliminate
-   any characters from C that fail on grounds of backward context.
-
-   Search through the groups, looking for a group whose label L has nonempty
-   intersection with C.  If L - C is nonempty, create a new group labeled
-   L - C and having the same positions as the current group, and set L to
-   the intersection of L and C.  Insert the position in this group, set
-   C = C - L, and resume scanning.
-
-   If after comparing with every group there are characters remaining in C,
-   create a new group labeled with the characters of C and insert this
-   position in that group. */
-void
-dfastate(s, d, trans)
-     int s;
-     struct dfa *d;
-     int trans[];
-{
-  position_set grps[NOTCHAR];	/* As many as will ever be needed. */
-  charclass labels[NOTCHAR];	/* Labels corresponding to the groups. */
-  int ngrps = 0;		/* Number of groups actually used. */
-  position pos;			/* Current position being considered. */
-  charclass matches;		/* Set of matching characters. */
-  int matchesf;			/* True if matches is nonempty. */
-  charclass intersect;		/* Intersection with some label set. */
-  int intersectf;		/* True if intersect is nonempty. */
-  charclass leftovers;		/* Stuff in the label that didn't match. */
-  int leftoversf;		/* True if leftovers is nonempty. */
-  static charclass letters;	/* Set of characters considered letters. */
-  static charclass newline;	/* Set of characters that aren't newline. */
-  position_set follows;		/* Union of the follows of some group. */
-  position_set tmp;		/* Temporary space for merging sets. */
-  int state;			/* New state. */
-  int wants_newline;		/* New state wants to know newline context. */
-  int state_newline;		/* New state on a newline transition. */
-  int wants_letter;		/* New state wants to know letter context. */
-  int state_letter;		/* New state on a letter transition. */
-  static int initialized;	/* Flag for static initialization. */
-  int i, j, k;
-
-  /* Initialize the set of letters, if necessary. */
-  if (! initialized)
-    {
-      initialized = 1;
-      for (i = 0; i < NOTCHAR; ++i)
-	if (IS_WORD_CONSTITUENT(i))
-	  setbit(i, letters);
-      setbit('\n', newline);
-    }
-
-  zeroset(matches);
-
-  for (i = 0; i < d->states[s].elems.nelem; ++i)
-    {
-      pos = d->states[s].elems.elems[i];
-      if (d->tokens[pos.index] >= 0 && d->tokens[pos.index] < NOTCHAR)
-	setbit(d->tokens[pos.index], matches);
-      else if (d->tokens[pos.index] >= CSET)
-	copyset(d->charclasses[d->tokens[pos.index] - CSET], matches);
-      else
-	continue;
-
-      /* Some characters may need to be eliminated from matches because
-	 they fail in the current context. */
-      if (pos.constraint != 0xFF)
-	{
-	  if (! MATCHES_NEWLINE_CONTEXT(pos.constraint,
-					 d->states[s].newline, 1))
-	    clrbit('\n', matches);
-	  if (! MATCHES_NEWLINE_CONTEXT(pos.constraint,
-					 d->states[s].newline, 0))
-	    for (j = 0; j < CHARCLASS_INTS; ++j)
-	      matches[j] &= newline[j];
-	  if (! MATCHES_LETTER_CONTEXT(pos.constraint,
-					d->states[s].letter, 1))
-	    for (j = 0; j < CHARCLASS_INTS; ++j)
-	      matches[j] &= ~letters[j];
-	  if (! MATCHES_LETTER_CONTEXT(pos.constraint,
-					d->states[s].letter, 0))
-	    for (j = 0; j < CHARCLASS_INTS; ++j)
-	      matches[j] &= letters[j];
-
-	  /* If there are no characters left, there's no point in going on. */
-	  for (j = 0; j < CHARCLASS_INTS && !matches[j]; ++j)
-	    continue;
-	  if (j == CHARCLASS_INTS)
-	    continue;
-	}
-
-      for (j = 0; j < ngrps; ++j)
-	{
-	  /* If matches contains a single character only, and the current
-	     group's label doesn't contain that character, go on to the
-	     next group. */
-	  if (d->tokens[pos.index] >= 0 && d->tokens[pos.index] < NOTCHAR
-	      && !tstbit(d->tokens[pos.index], labels[j]))
-	    continue;
-
-	  /* Check if this group's label has a nonempty intersection with
-	     matches. */
-	  intersectf = 0;
-	  for (k = 0; k < CHARCLASS_INTS; ++k)
-	    (intersect[k] = matches[k] & labels[j][k]) ? (intersectf = 1) : 0;
-	  if (! intersectf)
-	    continue;
-
-	  /* It does; now find the set differences both ways. */
-	  leftoversf = matchesf = 0;
-	  for (k = 0; k < CHARCLASS_INTS; ++k)
-	    {
-	      /* Even an optimizing compiler can't know this for sure. */
-	      int match = matches[k], label = labels[j][k];
-
-	      (leftovers[k] = ~match & label) ? (leftoversf = 1) : 0;
-	      (matches[k] = match & ~label) ? (matchesf = 1) : 0;
-	    }
-
-	  /* If there were leftovers, create a new group labeled with them. */
-	  if (leftoversf)
-	    {
-	      copyset(leftovers, labels[ngrps]);
-	      copyset(intersect, labels[j]);
-	      MALLOC(grps[ngrps].elems, position, d->nleaves);
-	      copy(&grps[j], &grps[ngrps]);
-	      ++ngrps;
-	    }
-
-	  /* Put the position in the current group.  Note that there is no
-	     reason to call insert() here. */
-	  grps[j].elems[grps[j].nelem++] = pos;
-
-	  /* If every character matching the current position has been
-	     accounted for, we're done. */
-	  if (! matchesf)
-	    break;
-	}
-
-      /* If we've passed the last group, and there are still characters
-	 unaccounted for, then we'll have to create a new group. */
-      if (j == ngrps)
-	{
-	  copyset(matches, labels[ngrps]);
-	  zeroset(matches);
-	  MALLOC(grps[ngrps].elems, position, d->nleaves);
-	  grps[ngrps].nelem = 1;
-	  grps[ngrps].elems[0] = pos;
-	  ++ngrps;
-	}
-    }
-
-  MALLOC(follows.elems, position, d->nleaves);
-  MALLOC(tmp.elems, position, d->nleaves);
-
-  /* If we are a searching matcher, the default transition is to a state
-     containing the positions of state 0, otherwise the default transition
-     is to fail miserably. */
-  if (d->searchflag)
-    {
-      wants_newline = 0;
-      wants_letter = 0;
-      for (i = 0; i < d->states[0].elems.nelem; ++i)
-	{
-	  if (PREV_NEWLINE_DEPENDENT(d->states[0].elems.elems[i].constraint))
-	    wants_newline = 1;
-	  if (PREV_LETTER_DEPENDENT(d->states[0].elems.elems[i].constraint))
-	    wants_letter = 1;
-	}
-      copy(&d->states[0].elems, &follows);
-      state = state_index(d, &follows, 0, 0);
-      if (wants_newline)
-	state_newline = state_index(d, &follows, 1, 0);
-      else
-	state_newline = state;
-      if (wants_letter)
-	state_letter = state_index(d, &follows, 0, 1);
-      else
-	state_letter = state;
-      for (i = 0; i < NOTCHAR; ++i)
-	trans[i] = (IS_WORD_CONSTITUENT(i)) ? state_letter : state;
-      trans['\n'] = state_newline;
-    }
-  else
-    for (i = 0; i < NOTCHAR; ++i)
-      trans[i] = -1;
-
-  for (i = 0; i < ngrps; ++i)
-    {
-      follows.nelem = 0;
-
-      /* Find the union of the follows of the positions of the group.
-	 This is a hideously inefficient loop.  Fix it someday. */
-      for (j = 0; j < grps[i].nelem; ++j)
-	for (k = 0; k < d->follows[grps[i].elems[j].index].nelem; ++k)
-	  insert(d->follows[grps[i].elems[j].index].elems[k], &follows);
-
-      /* If we are building a searching matcher, throw in the positions
-	 of state 0 as well. */
-      if (d->searchflag)
-	for (j = 0; j < d->states[0].elems.nelem; ++j)
-	  insert(d->states[0].elems.elems[j], &follows);
-
-      /* Find out if the new state will want any context information. */
-      wants_newline = 0;
-      if (tstbit('\n', labels[i]))
-	for (j = 0; j < follows.nelem; ++j)
-	  if (PREV_NEWLINE_DEPENDENT(follows.elems[j].constraint))
-	    wants_newline = 1;
-
-      wants_letter = 0;
-      for (j = 0; j < CHARCLASS_INTS; ++j)
-	if (labels[i][j] & letters[j])
-	  break;
-      if (j < CHARCLASS_INTS)
-	for (j = 0; j < follows.nelem; ++j)
-	  if (PREV_LETTER_DEPENDENT(follows.elems[j].constraint))
-	    wants_letter = 1;
-
-      /* Find the state(s) corresponding to the union of the follows. */
-      state = state_index(d, &follows, 0, 0);
-      if (wants_newline)
-	state_newline = state_index(d, &follows, 1, 0);
-      else
-	state_newline = state;
-      if (wants_letter)
-	state_letter = state_index(d, &follows, 0, 1);
-      else
-	state_letter = state;
-
-      /* Set the transitions for each character in the current label. */
-      for (j = 0; j < CHARCLASS_INTS; ++j)
-	for (k = 0; k < INTBITS; ++k)
-	  if (labels[i][j] & 1 << k)
-	    {
-	      int c = j * INTBITS + k;
-
-	      if (c == '\n')
-		trans[c] = state_newline;
-	      else if (IS_WORD_CONSTITUENT(c))
-		trans[c] = state_letter;
-	      else if (c < NOTCHAR)
-		trans[c] = state;
-	    }
-    }
-
-  for (i = 0; i < ngrps; ++i)
-    free(grps[i].elems);
-  free(follows.elems);
-  free(tmp.elems);
-}
-
-/* Some routines for manipulating a compiled dfa's transition tables.
-   Each state may or may not have a transition table; if it does, and it
-   is a non-accepting state, then d->trans[state] points to its table.
-   If it is an accepting state then d->fails[state] points to its table.
-   If it has no table at all, then d->trans[state] is NULL.
-   TODO: Improve this comment, get rid of the unnecessary redundancy. */
-
-static void
-build_state(s, d)
-     int s;
-     struct dfa *d;
-{
-  int *trans;			/* The new transition table. */
-  int i;
-
-  /* Set an upper limit on the number of transition tables that will ever
-     exist at once.  1024 is arbitrary.  The idea is that the frequently
-     used transition tables will be quickly rebuilt, whereas the ones that
-     were only needed once or twice will be cleared away. */
-  if (d->trcount >= 1024)
-    {
-      for (i = 0; i < d->tralloc; ++i)
-	if (d->trans[i])
-	  {
-	    free((ptr_t) d->trans[i]);
-	    d->trans[i] = NULL;
-	  }
-	else if (d->fails[i])
-	  {
-	    free((ptr_t) d->fails[i]);
-	    d->fails[i] = NULL;
-	  }
-      d->trcount = 0;
-    }
-
-  ++d->trcount;
-
-  /* Set up the success bits for this state. */
-  d->success[s] = 0;
-  if (ACCEPTS_IN_CONTEXT(d->states[s].newline, 1, d->states[s].letter, 0,
-      s, *d))
-    d->success[s] |= 4;
-  if (ACCEPTS_IN_CONTEXT(d->states[s].newline, 0, d->states[s].letter, 1,
-      s, *d))
-    d->success[s] |= 2;
-  if (ACCEPTS_IN_CONTEXT(d->states[s].newline, 0, d->states[s].letter, 0,
-      s, *d))
-    d->success[s] |= 1;
-
-  MALLOC(trans, int, NOTCHAR);
-  dfastate(s, d, trans);
-
-  /* Now go through the new transition table, and make sure that the trans
-     and fail arrays are allocated large enough to hold a pointer for the
-     largest state mentioned in the table. */
-  for (i = 0; i < NOTCHAR; ++i)
-    if (trans[i] >= d->tralloc)
-      {
-	int oldalloc = d->tralloc;
-
-	while (trans[i] >= d->tralloc)
-	  d->tralloc *= 2;
-	REALLOC(d->realtrans, int *, d->tralloc + 1);
-	d->trans = d->realtrans + 1;
-	REALLOC(d->fails, int *, d->tralloc);
-	REALLOC(d->success, int, d->tralloc);
-	REALLOC(d->newlines, int, d->tralloc);
-	while (oldalloc < d->tralloc)
-	  {
-	    d->trans[oldalloc] = NULL;
-	    d->fails[oldalloc++] = NULL;
-	  }
-      }
-
-  /* Keep the newline transition in a special place so we can use it as
-     a sentinel. */
-  d->newlines[s] = trans['\n'];
-  trans['\n'] = -1;
-
-  if (ACCEPTING(s, *d))
-    d->fails[s] = trans;
-  else
-    d->trans[s] = trans;
-}
-
-static void
-build_state_zero(d)
-     struct dfa *d;
-{
-  d->tralloc = 1;
-  d->trcount = 0;
-  CALLOC(d->realtrans, int *, d->tralloc + 1);
-  d->trans = d->realtrans + 1;
-  CALLOC(d->fails, int *, d->tralloc);
-  MALLOC(d->success, int, d->tralloc);
-  MALLOC(d->newlines, int, d->tralloc);
-  build_state(0, d);
-}
-
-/* Search through a buffer looking for a match to the given struct dfa.
-   Find the first occurrence of a string matching the regexp in the buffer,
-   and the shortest possible version thereof.  Return a pointer to the first
-   character after the match, or NULL if none is found.  Begin points to
-   the beginning of the buffer, and end points to the first character after
-   its end.  We store a newline in *end to act as a sentinel, so end had
-   better point somewhere valid.  Newline is a flag indicating whether to
-   allow newlines to be in the matching string.  If count is non-
-   NULL it points to a place we're supposed to increment every time we
-   see a newline.  Finally, if backref is non-NULL it points to a place
-   where we're supposed to store a 1 if backreferencing happened and the
-   match needs to be verified by a backtracking matcher.  Otherwise
-   we store a 0 in *backref. */
-char *
-dfaexec(d, begin, end, newline, count, backref)
-     struct dfa *d;
-     char *begin;
-     char *end;
-     int newline;
-     int *count;
-     int *backref;
-{
-  register int s, s1, tmp;	/* Current state. */
-  register unsigned char *p;	/* Current input character. */
-  register int **trans, *t;	/* Copy of d->trans so it can be optimized
-				   into a register. */
-  static int sbit[NOTCHAR];	/* Table for anding with d->success. */
-  static int sbit_init;
-
-  if (! sbit_init)
-    {
-      int i;
-
-      sbit_init = 1;
-      for (i = 0; i < NOTCHAR; ++i)
-	sbit[i] = (IS_WORD_CONSTITUENT(i)) ? 2 : 1;
-      sbit['\n'] = 4;
-    }
-
-  if (! d->tralloc)
-    build_state_zero(d);
-
-  s = s1 = 0;
-  p = (unsigned char *) begin;
-  trans = d->trans;
-  *end = '\n';
-
-  for (;;)
-    {
-      while ((t = trans[s]) != 0) { /* hand-optimized loop */
-	s1 = t[*p++];
-        if ((t = trans[s1]) == 0) {
-           tmp = s ; s = s1 ; s1 = tmp ; /* swap */
-           break;
-        }
-	s = t[*p++];
-      }
-
-      if (s >= 0 && p <= (unsigned char *) end && d->fails[s])
-	{
-	  if (d->success[s] & sbit[*p])
-	    {
-	      if (backref)
-		*backref = (d->states[s].backref != 0);
-	      return (char *) p;
-	    }
-
-	  s1 = s;
-	  s = d->fails[s][*p++];
-	  continue;
-	}
-
-      /* If the previous character was a newline, count it. */
-      if (count && (char *) p <= end && p[-1] == '\n')
-	++*count;
-
-      /* Check if we've run off the end of the buffer. */
-      if ((char *) p > end)
-	return NULL;
-
-      if (s >= 0)
-	{
-	  build_state(s, d);
-	  trans = d->trans;
-	  continue;
-	}
-
-      if (p[-1] == '\n' && newline)
-	{
-	  s = d->newlines[s1];
-	  continue;
-	}
-
-      s = 0;
-    }
-}
-
-/* Initialize the components of a dfa that the other routines don't
-   initialize for themselves. */
-void
-dfainit(d)
-     struct dfa *d;
-{
-  d->calloc = 1;
-  MALLOC(d->charclasses, charclass, d->calloc);
-  d->cindex = 0;
-
-  d->talloc = 1;
-  MALLOC(d->tokens, token, d->talloc);
-  d->tindex = d->depth = d->nleaves = d->nregexps = 0;
-
-  d->searchflag = 0;
-  d->tralloc = 0;
-
-  d->musts = 0;
-}
-
-/* Parse and analyze a single string of the given length. */
-void
-dfacomp(s, len, d, searchflag)
-     char *s;
-     size_t len;
-     struct dfa *d;
-     int searchflag;
-{
-  if (case_fold)	/* dummy folding in service of dfamust() */
-    {
-      char *lcopy;
-      int i;
-
-      lcopy = malloc(len);
-      if (!lcopy)
-	dfaerror(_("out of memory"));
-
-      /* This is a kludge. */
-      case_fold = 0;
-      for (i = 0; i < len; ++i)
-	if (ISUPPER ((unsigned char) s[i]))
-	  lcopy[i] = tolower ((unsigned char) s[i]);
-	else
-	  lcopy[i] = s[i];
-
-      dfainit(d);
-      dfaparse(lcopy, len, d);
-      free(lcopy);
-      dfamust(d);
-      d->cindex = d->tindex = d->depth = d->nleaves = d->nregexps = 0;
-      case_fold = 1;
-      dfaparse(s, len, d);
-      dfaanalyze(d, searchflag);
-    }
-  else
-    {
-        dfainit(d);
-        dfaparse(s, len, d);
-	dfamust(d);
-        dfaanalyze(d, searchflag);
-    }
-}
-
-/* Free the storage held by the components of a dfa. */
-void
-dfafree(d)
-     struct dfa *d;
-{
-  int i;
-  struct dfamust *dm, *ndm;
-
-  free((ptr_t) d->charclasses);
-  free((ptr_t) d->tokens);
-  for (i = 0; i < d->sindex; ++i)
-    free((ptr_t) d->states[i].elems.elems);
-  free((ptr_t) d->states);
-  for (i = 0; i < d->tindex; ++i)
-    if (d->follows[i].elems)
-      free((ptr_t) d->follows[i].elems);
-  free((ptr_t) d->follows);
-  for (i = 0; i < d->tralloc; ++i)
-    if (d->trans[i])
-      free((ptr_t) d->trans[i]);
-    else if (d->fails[i])
-      free((ptr_t) d->fails[i]);
-  if (d->realtrans) free((ptr_t) d->realtrans);
-  if (d->fails) free((ptr_t) d->fails);
-  if (d->newlines) free((ptr_t) d->newlines);
-  if (d->success) free((ptr_t) d->success);
-  for (dm = d->musts; dm; dm = ndm)
-    {
-      ndm = dm->next;
-      free(dm->must);
-      free((ptr_t) dm);
-    }
-}
-
-/* Having found the postfix representation of the regular expression,
-   try to find a long sequence of characters that must appear in any line
-   containing the r.e.
-   Finding a "longest" sequence is beyond the scope here;
-   we take an easy way out and hope for the best.
-   (Take "(ab|a)b"--please.)
-
-   We do a bottom-up calculation of sequences of characters that must appear
-   in matches of r.e.'s represented by trees rooted at the nodes of the postfix
-   representation:
-	sequences that must appear at the left of the match ("left")
-	sequences that must appear at the right of the match ("right")
-	lists of sequences that must appear somewhere in the match ("in")
-	sequences that must constitute the match ("is")
-
-   When we get to the root of the tree, we use one of the longest of its
-   calculated "in" sequences as our answer.  The sequence we find is returned in
-   d->must (where "d" is the single argument passed to "dfamust");
-   the length of the sequence is returned in d->mustn.
-
-   The sequences calculated for the various types of node (in pseudo ANSI c)
-   are shown below.  "p" is the operand of unary operators (and the left-hand
-   operand of binary operators); "q" is the right-hand operand of binary
-   operators.
-
-   "ZERO" means "a zero-length sequence" below.
-
-	Type	left		right		is		in
-	----	----		-----		--		--
-	char c	# c		# c		# c		# c
-
-	CSET	ZERO		ZERO		ZERO		ZERO
-
-	STAR	ZERO		ZERO		ZERO		ZERO
-
-	QMARK	ZERO		ZERO		ZERO		ZERO
-
-	PLUS	p->left		p->right	ZERO		p->in
-
-	CAT	(p->is==ZERO)?	(q->is==ZERO)?	(p->is!=ZERO &&	p->in plus
-		p->left :	q->right :	q->is!=ZERO) ?	q->in plus
-		p->is##q->left	p->right##q->is	p->is##q->is :	p->right##q->left
-						ZERO
-
-	OR	longest common	longest common	(do p->is and	substrings common to
-		leading		trailing	q->is have same	p->in and q->in
-		(sub)sequence	(sub)sequence	length and
-		of p->left	of p->right	content) ?
-		and q->left	and q->right	p->is : NULL
-
-   If there's anything else we recognize in the tree, all four sequences get set
-   to zero-length sequences.  If there's something we don't recognize in the tree,
-   we just return a zero-length sequence.
-
-   Break ties in favor of infrequent letters (choosing 'zzz' in preference to
-   'aaa')?
-
-   And. . .is it here or someplace that we might ponder "optimizations" such as
-	egrep 'psi|epsilon'	->	egrep 'psi'
-	egrep 'pepsi|epsilon'	->	egrep 'epsi'
-					(Yes, we now find "epsi" as a "string
-					that must occur", but we might also
-					simplify the *entire* r.e. being sought)
-	grep '[c]'		->	grep 'c'
-	grep '(ab|a)b'		->	grep 'ab'
-	grep 'ab*'		->	grep 'a'
-	grep 'a*b'		->	grep 'b'
-
-   There are several issues:
-
-   Is optimization easy (enough)?
-
-   Does optimization actually accomplish anything,
-   or is the automaton you get from "psi|epsilon" (for example)
-   the same as the one you get from "psi" (for example)?
-
-   Are optimizable r.e.'s likely to be used in real-life situations
-   (something like 'ab*' is probably unlikely; something like is
-   'psi|epsilon' is likelier)? */
-
-static char *
-icatalloc(old, new)
-     char *old;
-     char *new;
-{
-  char *result;
-  size_t oldsize, newsize;
-
-  newsize = (new == NULL) ? 0 : strlen(new);
-  if (old == NULL)
-    oldsize = 0;
-  else if (newsize == 0)
-    return old;
-  else	oldsize = strlen(old);
-  if (old == NULL)
-    result = (char *) malloc(newsize + 1);
-  else
-    result = (char *) realloc((void *) old, oldsize + newsize + 1);
-  if (result != NULL && new != NULL)
-    (void) strcpy(result + oldsize, new);
-  return result;
-}
-
-static char *
-icpyalloc(string)
-     char *string;
-{
-  return icatalloc((char *) NULL, string);
-}
-
-static char *
-istrstr(lookin, lookfor)
-     char *lookin;
-     char *lookfor;
-{
-  char *cp;
-  size_t len;
-
-  len = strlen(lookfor);
-  for (cp = lookin; *cp != '\0'; ++cp)
-    if (strncmp(cp, lookfor, len) == 0)
-      return cp;
-  return NULL;
-}
-
-static void
-ifree(cp)
-     char *cp;
-{
-  if (cp != NULL)
-    free(cp);
-}
-
-static void
-freelist(cpp)
-     char **cpp;
-{
-  int i;
-
-  if (cpp == NULL)
-    return;
-  for (i = 0; cpp[i] != NULL; ++i)
-    {
-      free(cpp[i]);
-      cpp[i] = NULL;
-    }
-}
-
-static char **
-enlist(cpp, new, len)
-     char **cpp;
-     char *new;
-     size_t len;
-{
-  int i, j;
-
-  if (cpp == NULL)
-    return NULL;
-  if ((new = icpyalloc(new)) == NULL)
-    {
-      freelist(cpp);
-      return NULL;
-    }
-  new[len] = '\0';
-  /* Is there already something in the list that's new (or longer)? */
-  for (i = 0; cpp[i] != NULL; ++i)
-    if (istrstr(cpp[i], new) != NULL)
-      {
-	free(new);
-	return cpp;
-      }
-  /* Eliminate any obsoleted strings. */
-  j = 0;
-  while (cpp[j] != NULL)
-    if (istrstr(new, cpp[j]) == NULL)
-      ++j;
-    else
-      {
-	free(cpp[j]);
-	if (--i == j)
-	  break;
-	cpp[j] = cpp[i];
-	cpp[i] = NULL;
-      }
-  /* Add the new string. */
-  cpp = (char **) realloc((char *) cpp, (i + 2) * sizeof *cpp);
-  if (cpp == NULL)
-    return NULL;
-  cpp[i] = new;
-  cpp[i + 1] = NULL;
-  return cpp;
-}
-
-/* Given pointers to two strings, return a pointer to an allocated
-   list of their distinct common substrings. Return NULL if something
-   seems wild. */
-static char **
-comsubs(left, right)
-     char *left;
-     char *right;
-{
-  char **cpp;
-  char *lcp;
-  char *rcp;
-  size_t i, len;
-
-  if (left == NULL || right == NULL)
-    return NULL;
-  cpp = (char **) malloc(sizeof *cpp);
-  if (cpp == NULL)
-    return NULL;
-  cpp[0] = NULL;
-  for (lcp = left; *lcp != '\0'; ++lcp)
-    {
-      len = 0;
-      rcp = index(right, *lcp);
-      while (rcp != NULL)
-	{
-	  for (i = 1; lcp[i] != '\0' && lcp[i] == rcp[i]; ++i)
-	    continue;
-	  if (i > len)
-	    len = i;
-	  rcp = index(rcp + 1, *lcp);
-	}
-      if (len == 0)
-	continue;
-      if ((cpp = enlist(cpp, lcp, len)) == NULL)
-	break;
-    }
-  return cpp;
-}
-
-static char **
-addlists(old, new)
-char **old;
-char **new;
-{
-  int i;
-
-  if (old == NULL || new == NULL)
-    return NULL;
-  for (i = 0; new[i] != NULL; ++i)
-    {
-      old = enlist(old, new[i], strlen(new[i]));
-      if (old == NULL)
-	break;
-    }
-  return old;
-}
-
-/* Given two lists of substrings, return a new list giving substrings
-   common to both. */
-static char **
-inboth(left, right)
-     char **left;
-     char **right;
-{
-  char **both;
-  char **temp;
-  int lnum, rnum;
-
-  if (left == NULL || right == NULL)
-    return NULL;
-  both = (char **) malloc(sizeof *both);
-  if (both == NULL)
-    return NULL;
-  both[0] = NULL;
-  for (lnum = 0; left[lnum] != NULL; ++lnum)
-    {
-      for (rnum = 0; right[rnum] != NULL; ++rnum)
-	{
-	  temp = comsubs(left[lnum], right[rnum]);
-	  if (temp == NULL)
-	    {
-	      freelist(both);
-	      return NULL;
-	    }
-	  both = addlists(both, temp);
-	  freelist(temp);
-	  free(temp);
-	  if (both == NULL)
-	    return NULL;
-	}
-    }
-  return both;
-}
-
-typedef struct
-{
-  char **in;
-  char *left;
-  char *right;
-  char *is;
-} must;
-
-static void
-resetmust(mp)
-must *mp;
-{
-  mp->left[0] = mp->right[0] = mp->is[0] = '\0';
-  freelist(mp->in);
-}
-
-static void
-dfamust(dfa)
-struct dfa *dfa;
-{
-  must *musts;
-  must *mp;
-  char *result;
-  int ri;
-  int i;
-  int exact;
-  token t;
-  static must must0;
-  struct dfamust *dm;
-  static char empty_string[] = "";
-
-  result = empty_string;
-  exact = 0;
-  musts = (must *) malloc((dfa->tindex + 1) * sizeof *musts);
-  if (musts == NULL)
-    return;
-  mp = musts;
-  for (i = 0; i <= dfa->tindex; ++i)
-    mp[i] = must0;
-  for (i = 0; i <= dfa->tindex; ++i)
-    {
-      mp[i].in = (char **) malloc(sizeof *mp[i].in);
-      mp[i].left = malloc(2);
-      mp[i].right = malloc(2);
-      mp[i].is = malloc(2);
-      if (mp[i].in == NULL || mp[i].left == NULL ||
-	  mp[i].right == NULL || mp[i].is == NULL)
-	goto done;
-      mp[i].left[0] = mp[i].right[0] = mp[i].is[0] = '\0';
-      mp[i].in[0] = NULL;
-    }
-#ifdef DEBUG
-  fprintf(stderr, "dfamust:\n");
-  for (i = 0; i < dfa->tindex; ++i)
-    {
-      fprintf(stderr, " %d:", i);
-      prtok(dfa->tokens[i]);
-    }
-  putc('\n', stderr);
-#endif
-  for (ri = 0; ri < dfa->tindex; ++ri)
-    {
-      switch (t = dfa->tokens[ri])
-	{
-	case LPAREN:
-	case RPAREN:
-	  goto done;		/* "cannot happen" */
-	case EMPTY:
-	case BEGLINE:
-	case ENDLINE:
-	case BEGWORD:
-	case ENDWORD:
-	case LIMWORD:
-	case NOTLIMWORD:
-	case BACKREF:
-	  resetmust(mp);
-	  break;
-	case STAR:
-	case QMARK:
-	  if (mp <= musts)
-	    goto done;		/* "cannot happen" */
-	  --mp;
-	  resetmust(mp);
-	  break;
-	case OR:
-	case ORTOP:
-	  if (mp < &musts[2])
-	    goto done;		/* "cannot happen" */
-	  {
-	    char **new;
-	    must *lmp;
-	    must *rmp;
-	    int j, ln, rn, n;
-
-	    rmp = --mp;
-	    lmp = --mp;
-	    /* Guaranteed to be.  Unlikely, but. . . */
-	    if (strcmp(lmp->is, rmp->is) != 0)
-	      lmp->is[0] = '\0';
-	    /* Left side--easy */
-	    i = 0;
-	    while (lmp->left[i] != '\0' && lmp->left[i] == rmp->left[i])
-	      ++i;
-	    lmp->left[i] = '\0';
-	    /* Right side */
-	    ln = strlen(lmp->right);
-	    rn = strlen(rmp->right);
-	    n = ln;
-	    if (n > rn)
-	      n = rn;
-	    for (i = 0; i < n; ++i)
-	      if (lmp->right[ln - i - 1] != rmp->right[rn - i - 1])
-		break;
-	    for (j = 0; j < i; ++j)
-	      lmp->right[j] = lmp->right[(ln - i) + j];
-	    lmp->right[j] = '\0';
-	    new = inboth(lmp->in, rmp->in);
-	    if (new == NULL)
-	      goto done;
-	    freelist(lmp->in);
-	    free((char *) lmp->in);
-	    lmp->in = new;
-	  }
-	  break;
-	case PLUS:
-	  if (mp <= musts)
-	    goto done;		/* "cannot happen" */
-	  --mp;
-	  mp->is[0] = '\0';
-	  break;
-	case END:
-	  if (mp != &musts[1])
-	    goto done;		/* "cannot happen" */
-	  for (i = 0; musts[0].in[i] != NULL; ++i)
-	    if (strlen(musts[0].in[i]) > strlen(result))
-	      result = musts[0].in[i];
-	  if (strcmp(result, musts[0].is) == 0)
-	    exact = 1;
-	  goto done;
-	case CAT:
-	  if (mp < &musts[2])
-	    goto done;		/* "cannot happen" */
-	  {
-	    must *lmp;
-	    must *rmp;
-
-	    rmp = --mp;
-	    lmp = --mp;
-	    /* In.  Everything in left, plus everything in
-	       right, plus catenation of
-	       left's right and right's left. */
-	    lmp->in = addlists(lmp->in, rmp->in);
-	    if (lmp->in == NULL)
-	      goto done;
-	    if (lmp->right[0] != '\0' &&
-		rmp->left[0] != '\0')
-	      {
-		char *tp;
-
-		tp = icpyalloc(lmp->right);
-		if (tp == NULL)
-		  goto done;
-		tp = icatalloc(tp, rmp->left);
-		if (tp == NULL)
-		  goto done;
-		lmp->in = enlist(lmp->in, tp,
-				 strlen(tp));
-		free(tp);
-		if (lmp->in == NULL)
-		  goto done;
-	      }
-	    /* Left-hand */
-	    if (lmp->is[0] != '\0')
-	      {
-		lmp->left = icatalloc(lmp->left,
-				      rmp->left);
-		if (lmp->left == NULL)
-		  goto done;
-	      }
-	    /* Right-hand */
-	    if (rmp->is[0] == '\0')
-	      lmp->right[0] = '\0';
-	    lmp->right = icatalloc(lmp->right, rmp->right);
-	    if (lmp->right == NULL)
-	      goto done;
-	    /* Guaranteed to be */
-	    if (lmp->is[0] != '\0' && rmp->is[0] != '\0')
-	      {
-		lmp->is = icatalloc(lmp->is, rmp->is);
-		if (lmp->is == NULL)
-		  goto done;
-	      }
-	    else
-	      lmp->is[0] = '\0';
-	  }
-	  break;
-	default:
-	  if (t < END)
-	    {
-	      /* "cannot happen" */
-	      goto done;
-	    }
-	  else if (t == '\0')
-	    {
-	      /* not on *my* shift */
-	      goto done;
-	    }
-	  else if (t >= CSET)
-	    {
-	      /* easy enough */
-	      resetmust(mp);
-	    }
-	  else
-	    {
-	      /* plain character */
-	      resetmust(mp);
-	      mp->is[0] = mp->left[0] = mp->right[0] = t;
-	      mp->is[1] = mp->left[1] = mp->right[1] = '\0';
-	      mp->in = enlist(mp->in, mp->is, (size_t)1);
-	      if (mp->in == NULL)
-		goto done;
-	    }
-	  break;
-	}
-#ifdef DEBUG
-      fprintf(stderr, " node: %d:", ri);
-      prtok(dfa->tokens[ri]);
-      fprintf(stderr, "\n  in:");
-      for (i = 0; mp->in[i]; ++i)
-	fprintf(stderr, " \"%s\"", mp->in[i]);
-      fprintf(stderr, "\n  is: \"%s\"\n", mp->is);
-      fprintf(stderr, "  left: \"%s\"\n", mp->left);
-      fprintf(stderr, "  right: \"%s\"\n", mp->right);
-#endif
-      ++mp;
-    }
- done:
-  if (strlen(result))
-    {
-      dm = (struct dfamust *) malloc(sizeof (struct dfamust));
-      dm->exact = exact;
-      dm->must = malloc(strlen(result) + 1);
-      strcpy(dm->must, result);
-      dm->next = dfa->musts;
-      dfa->musts = dm;
-    }
-  mp = musts;
-  for (i = 0; i <= dfa->tindex; ++i)
-    {
-      freelist(mp[i].in);
-      ifree((char *) mp[i].in);
-      ifree(mp[i].left);
-      ifree(mp[i].right);
-      ifree(mp[i].is);
-    }
-  free((char *) mp);
-}
diff -Nur grep-2.3/src/dfa.c.rej grep-ja-2.3/src/dfa.c.rej
--- grep-2.3/src/dfa.c.rej	Mon Dec 20 23:07:08 1999
+++ grep-ja-2.3/src/dfa.c.rej	Thu Jan  1 09:00:00 1970
@@ -1,345 +0,0 @@
-***************
-*** 74,79 ****
-  
-  #include "dfa.h"
-  #include "regex.h"
-  
-  #if __STDC__
-  typedef void *ptr_t;
---- 80,86 ----
-  
-  #include "dfa.h"
-  #include "regex.h"
-+ #include "mbc.h"
-  
-  #if __STDC__
-  typedef void *ptr_t;
-***************
-*** 262,268 ****
-  }
-  
-  /* Syntax bits controlling the behavior of the lexical analyzer. */
-- static int syntax_bits, syntax_bits_set;
-  
-  /* Flag for case-folding letters into sets. */
-  static int case_fold;
---- 284,291 ----
-  }
-  
-  /* Syntax bits controlling the behavior of the lexical analyzer. */
-+ static unsigned long syntax_bits;
-+ static int syntax_bits_set;
-  
-  /* Flag for case-folding letters into sets. */
-  static int case_fold;
-***************
-*** 270,276 ****
-  /* Entry point to set syntax options. */
-  void
-  dfasyntax(bits, fold)
--      int bits;
-       int fold;
-  {
-    syntax_bits_set = 1;
---- 293,299 ----
-  /* Entry point to set syntax options. */
-  void
-  dfasyntax(bits, fold)
-+      unsigned long bits;
-       int fold;
-  {
-    syntax_bits_set = 1;
-***************
-*** 560,584 ****
-  	case '.':
-  	  if (backslash)
-  	    goto normal_char;
-  	  zeroset(ccl);
-- 	  notset(ccl);
-- 	  if (!(syntax_bits & RE_DOT_NEWLINE))
-- 	    clrbit('\n', ccl);
-- 	  if (syntax_bits & RE_DOT_NOT_NULL)
-- 	    clrbit('\0', ccl);
-  	  laststart = 0;
-  	  return lasttok = CSET + charclass_index(ccl);
-  
-- 	case 'w':
-  	case 'W':
-  	  if (!backslash)
-  	    goto normal_char;
-  	  zeroset(ccl);
-  	  for (c2 = 0; c2 < NOTCHAR; ++c2)
-- 	    if (ISALNUM(c2))
-  	      setbit(c2, ccl);
-- 	  if (c == 'W')
-- 	    notset(ccl);
-  	  laststart = 0;
-  	  return lasttok = CSET + charclass_index(ccl);
-  	
---- 646,674 ----
-  	case '.':
-  	  if (backslash)
-  	    goto normal_char;
-+ 	  if (current_mbctype != MBCTYPE_ASCII)
-+ 	    mbexttok = MBEXTTOK_ORMBC;
-+ 	  laststart = 0;
-+ 	  return setcodeset(0);
-+ 
-+ 	case 'w':
-+ 	  if (!backslash)
-+ 	    goto normal_char;
-  	  zeroset(ccl);
-+ 	  for (c2 = 0; c2 < NOTCHAR; ++c2)
-+ 	    if (ISALNUM(c2))
-+ 	      setbit(c2, ccl);
-  	  laststart = 0;
-  	  return lasttok = CSET + charclass_index(ccl);
-  
-  	case 'W':
-  	  if (!backslash)
-  	    goto normal_char;
-  	  zeroset(ccl);
-  	  for (c2 = 0; c2 < NOTCHAR; ++c2)
-+ 	    if (!ISALNUM(c2) && !ismbchar(c2))
-  	      setbit(c2, ccl);
-+ 	  mbexttok = MBEXTTOK_ORMBC_NL;
-  	  laststart = 0;
-  	  return lasttok = CSET + charclass_index(ccl);
-  	
-***************
-*** 669,674 ****
-  		    }
-  	      if (c == '\\' && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-  		FETCH(c, "Unbalanced [");
-  	      FETCH(c1, "Unbalanced [");
-  	      if (c1 == '-')
-  		{
---- 761,770 ----
-  		    }
-  	      if (c == '\\' && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-  		FETCH(c, "Unbalanced [");
-+ 	      if (ismbchar(c)) {
-+ 		ch = (unsigned char)c;
-+ 		FETCH(c, "Multi-byte char incomplete");
-+ 	      }
-  	      FETCH(c1, "Unbalanced [");
-  	      if (c1 == '-')
-  		{
-***************
-*** 686,706 ****
-  		      if (c2 == '\\'
-  			  && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-  			FETCH(c2, "Unbalanced [");
-  		      FETCH(c1, "Unbalanced [");
-  		    }
-  		}
-- 	      else
-  		c2 = c;
-- 	      while (c <= c2)
-- 		{
-- 		  setbit(c, ccl);
-- 		  if (case_fold)
-- 		    if (ISUPPER(c))
-- 		      setbit(tolower(c), ccl);
-- 		    else if (ISLOWER(c))
-- 		      setbit(toupper(c), ccl);
-- 		  ++c;
-  		}
-  	    skip:
-  	      ;
-  	    }
---- 782,866 ----
-  		      if (c2 == '\\'
-  			  && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
-  			FETCH(c2, "Unbalanced [");
-+ 		      if (ismbchar(c2)) {
-+ 			c2h = (unsigned char)c2;
-+ 			FETCH(c2, "Multi-byte char incomplete");
-+ 		      }
-  		      FETCH(c1, "Unbalanced [");
-  		    }
-  		}
-+ 	      else {
-+ 		c2h = ch;
-  		c2 = c;
-+ 	      }
-+ 	      if (ch < c2h || (ch == c2h && c <= c2)) {
-+ 		if (ch == 0) {
-+ 		  ch = (unsigned char)c2;
-+ 		  if (c2h > 0)
-+ 		    ch = NOTCHAR - 1;
-+ 		  for (; (unsigned char)c <= ch; c++) {
-+ 		    setbit(c, ccl);
-+ 		    if (case_fold) {
-+ 		      if (ISUPPER(c))
-+ 			setbit(tolower(c), ccl);
-+ 		      else if (ISLOWER(c))
-+ 			setbit(toupper(c), ccl);
-+ 		    }
-+ 		  }
-+ 		  ch = 0x80;
-+ 		  c = 0x00;
-  		}
-+ 		if (ch <= c2h) {
-+ 		  if (mbexttok < 0) {
-+ 		    mbexttok = MBEXTTOK_CLASS;
-+ 		    zeroset(mbcset_set);
-+ 		    zeroset(mbcset_all);
-+ 		  }
-+ 		  if (ch < c2h && c != 0x00) {	/* 最初の半端 */
-+ 		    int t;
-+ 
-+ 		    if (ismbchar(ch)
-+ 			&& ((t = tstbit(ch, mbcset_set))
-+ 			    || !tstbit(ch, mbcset_all))) {
-+ 		      if (!t) {
-+ 			setbit(ch, mbcset_set);
-+ 			zeroset(mbcset[ch - 0x80]);
-+ 		      }
-+ 		      for (; c < NOTCHAR; c++)
-+ 			setbit(c, mbcset[ch - 0x80]);
-+ 		    }
-+ 		    ch++;
-+ 		    c = 0x00;
-+ 		  }
-+ 		  if (ch < c2h || (ch == c2h && c == 0x00 && c2 == 0xff)) {
-+ 		    if (c == 0x00 && c2 == 0xff)
-+ 		      c2h++;
-+ 		    for (; ch < c2h; ch++)
-+ 		      if (ismbchar(ch)) {
-+ 			clrbit(ch, mbcset_set);
-+ 			setbit(ch, mbcset_all);
-+ 		      }
-+ 		    if (c == 0x00 && c2 == 0xff)
-+ 		      c2h--;
-+ 		    c = 0x00;
-+ 		  }
-+ 		  if (ch <= c2h) {
-+ 		    int t;
-+ 
-+ 		    /* ここでは必ず c <= c2 となっている. */
-+ 		    if (ismbchar(ch)
-+ 			&& ((t = tstbit(ch, mbcset_set))
-+ 			    || !tstbit(ch, mbcset_all))) {
-+ 		      if (!t) {
-+ 			setbit(ch, mbcset_set);
-+ 			zeroset(mbcset[ch - 0x80]);
-+ 		      }
-+ 		      for (; c <= c2; c++)
-+ 			setbit(c, mbcset[ch - 0x80]);
-+ 		    }
-+ 		  }
-+ 		}
-+ 	      }
-  	    skip:
-  	      ;
-  	    }
-***************
-*** 1924,1957 ****
-  {
-    if (case_fold)	/* dummy folding in service of dfamust() */
-      {
--       char *copy;
-        int i;
-  
--       copy = malloc(len);
-        if (!copy)
-  	dfaerror("out of memory");
-        
-        /* This is a kludge. */
-        case_fold = 0;
-        for (i = 0; i < len; ++i)
-  	if (ISUPPER(s[i]))
-- 	  copy[i] = tolower(s[i]);
-  	else
-- 	  copy[i] = s[i];
-  
-        dfainit(d);
--       dfaparse(copy, len, d);
--       free(copy);
-        dfamust(d);
-        d->cindex = d->tindex = d->depth = d->nleaves = d->nregexps = 0;
-        case_fold = 1;
--       dfaparse(s, len, d);
-        dfaanalyze(d, searchflag);
-      }
-    else
-      {
-          dfainit(d);
--         dfaparse(s, len, d);
-  	dfamust(d);
-          dfaanalyze(d, searchflag);
-      }
---- 2167,2238 ----
-  {
-    if (case_fold)	/* dummy folding in service of dfamust() */
-      {
-+       char *copy, *p;
-        int i;
-  
-+       p = copy = malloc(len + 7);
-        if (!copy)
-  	dfaerror("out of memory");
-        
-        /* This is a kludge. */
-        case_fold = 0;
-+       if (current_mbctype != MBCTYPE_ASCII && searchflag) {
-+ 	*p++ = '^';
-+ 	*p++ = '.';
-+ 	*p++ = '*';
-+ 	if (!(syntax_bits & RE_NO_BK_PARENS))
-+ 	  *p++ = '\\';
-+ 	*p++ = '(';
-+       }
-        for (i = 0; i < len; ++i)
-  	if (ISUPPER(s[i]))
-+ 	  *p++ = tolower((unsigned char)s[i]);
-  	else
-+ 	  *p++ = s[i];
-+       if (current_mbctype != MBCTYPE_ASCII && searchflag) {
-+ 	if (!(syntax_bits & RE_NO_BK_PARENS))
-+ 	  *p++ = '\\';
-+ 	*p++ = ')';
-+       }
-  
-        dfainit(d);
-+       dfaparse(copy, p - copy, d);
-        dfamust(d);
-        d->cindex = d->tindex = d->depth = d->nleaves = d->nregexps = 0;
-+       bzero(cs_tok, sizeof cs_tok);
-        case_fold = 1;
-+       if (current_mbctype != MBCTYPE_ASCII && searchflag) {
-+ 	bcopy(s, copy + (syntax_bits & RE_NO_BK_PARENS ? 4 : 5), len);
-+ 	dfaparse(copy, p - copy, d);
-+       }
-+       else
-+ 	dfaparse(s, len, d);
-        dfaanalyze(d, searchflag);
-+       free(copy);
-      }
-    else
-      {
-          dfainit(d);
-+ 	if (current_mbctype != MBCTYPE_ASCII && searchflag) {
-+ 	  char *copy, *p;
-+ 
-+ 	  p = copy = malloc(len + 7);
-+ 	  *p++ = '^';
-+ 	  *p++ = '.';
-+ 	  *p++ = '*';
-+ 	  if (!(syntax_bits & RE_NO_BK_PARENS))
-+ 	    *p++ = '\\';
-+ 	  *p++ = '(';
-+ 	  bcopy(s, p, len);
-+ 	  p += len;
-+ 	  if (!(syntax_bits & RE_NO_BK_PARENS))
-+ 	    *p++ = '\\';
-+ 	  *p++ = ')';
-+ 	  dfaparse(copy, p - copy, d);
-+ 	  free(copy);
-+ 	}
-+ 	else
-+ 	  dfaparse(s, len, d);
-  	dfamust(d);
-          dfaanalyze(d, searchflag);
-      }
diff -Nur grep-2.3/src/dfa.h grep-ja-2.3/src/dfa.h
--- grep-2.3/src/dfa.h	Mon Dec 20 23:07:13 1999
+++ grep-ja-2.3/src/dfa.h	Mon Dec 20 23:48:12 1999
@@ -14,6 +14,8 @@
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA */
+/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jul. 7, 1993 by t^2  */
 
 /* Written June, 1988 by Mike Haertel */
 
diff -Nur grep-2.3/src/dfa.h.orig grep-ja-2.3/src/dfa.h.orig
--- grep-2.3/src/dfa.h.orig	Wed Nov  4 06:39:03 1998
+++ grep-ja-2.3/src/dfa.h.orig	Thu Jan  1 09:00:00 1970
@@ -1,371 +0,0 @@
-/* dfa.h - declarations for GNU deterministic regexp compiler
-   Copyright (C) 1988, 1998 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA */
-
-/* Written June, 1988 by Mike Haertel */
-
-/* FIXME:
-   2.  We should not export so much of the DFA internals.
-   In addition to clobbering modularity, we eat up valuable
-   name space. */
-
-# undef PARAMS
-#if __STDC__
-# ifndef _PTR_T
-# define _PTR_T
-  typedef void * ptr_t;
-# endif
-# define PARAMS(x) x
-#else
-# ifndef _PTR_T
-# define _PTR_T
-  typedef char * ptr_t;
-# endif
-# define PARAMS(x) ()
-#endif
-
-/* Number of bits in an unsigned char. */
-#ifndef CHARBITS
-#define CHARBITS 8
-#endif
-
-/* First integer value that is greater than any character code. */
-#define NOTCHAR (1 << CHARBITS)
-
-/* INTBITS need not be exact, just a lower bound. */
-#ifndef INTBITS
-#define INTBITS (CHARBITS * sizeof (int))
-#endif
-
-/* Number of ints required to hold a bit for every character. */
-#define CHARCLASS_INTS ((NOTCHAR + INTBITS - 1) / INTBITS)
-
-/* Sets of unsigned characters are stored as bit vectors in arrays of ints. */
-typedef int charclass[CHARCLASS_INTS];
-
-/* The regexp is parsed into an array of tokens in postfix form.  Some tokens
-   are operators and others are terminal symbols.  Most (but not all) of these
-   codes are returned by the lexical analyzer. */
-
-typedef enum
-{
-  END = -1,			/* END is a terminal symbol that matches the
-				   end of input; any value of END or less in
-				   the parse tree is such a symbol.  Accepting
-				   states of the DFA are those that would have
-				   a transition on END. */
-
-  /* Ordinary character values are terminal symbols that match themselves. */
-
-  EMPTY = NOTCHAR,		/* EMPTY is a terminal symbol that matches
-				   the empty string. */
-
-  BACKREF,			/* BACKREF is generated by \<digit>; it
-				   it not completely handled.  If the scanner
-				   detects a transition on backref, it returns
-				   a kind of "semi-success" indicating that
-				   the match will have to be verified with
-				   a backtracking matcher. */
-
-  BEGLINE,			/* BEGLINE is a terminal symbol that matches
-				   the empty string if it is at the beginning
-				   of a line. */
-
-  ENDLINE,			/* ENDLINE is a terminal symbol that matches
-				   the empty string if it is at the end of
-				   a line. */
-
-  BEGWORD,			/* BEGWORD is a terminal symbol that matches
-				   the empty string if it is at the beginning
-				   of a word. */
-
-  ENDWORD,			/* ENDWORD is a terminal symbol that matches
-				   the empty string if it is at the end of
-				   a word. */
-
-  LIMWORD,			/* LIMWORD is a terminal symbol that matches
-				   the empty string if it is at the beginning
-				   or the end of a word. */
-
-  NOTLIMWORD,			/* NOTLIMWORD is a terminal symbol that
-				   matches the empty string if it is not at
-				   the beginning or end of a word. */
-
-  QMARK,			/* QMARK is an operator of one argument that
-				   matches zero or one occurences of its
-				   argument. */
-
-  STAR,				/* STAR is an operator of one argument that
-				   matches the Kleene closure (zero or more
-				   occurrences) of its argument. */
-
-  PLUS,				/* PLUS is an operator of one argument that
-				   matches the positive closure (one or more
-				   occurrences) of its argument. */
-
-  REPMN,			/* REPMN is a lexical token corresponding
-				   to the {m,n} construct.  REPMN never
-				   appears in the compiled token vector. */
-
-  CAT,				/* CAT is an operator of two arguments that
-				   matches the concatenation of its
-				   arguments.  CAT is never returned by the
-				   lexical analyzer. */
-
-  OR,				/* OR is an operator of two arguments that
-				   matches either of its arguments. */
-
-  ORTOP,			/* OR at the toplevel in the parse tree.
-				   This is used for a boyer-moore heuristic. */
-
-  LPAREN,			/* LPAREN never appears in the parse tree,
-				   it is only a lexeme. */
-
-  RPAREN,			/* RPAREN never appears in the parse tree. */
-
-  CSET				/* CSET and (and any value greater) is a
-				   terminal symbol that matches any of a
-				   class of characters. */
-} token;
-
-/* Sets are stored in an array in the compiled dfa; the index of the
-   array corresponding to a given set token is given by SET_INDEX(t). */
-#define SET_INDEX(t) ((t) - CSET)
-
-/* Sometimes characters can only be matched depending on the surrounding
-   context.  Such context decisions depend on what the previous character
-   was, and the value of the current (lookahead) character.  Context
-   dependent constraints are encoded as 8 bit integers.  Each bit that
-   is set indicates that the constraint succeeds in the corresponding
-   context.
-
-   bit 7 - previous and current are newlines
-   bit 6 - previous was newline, current isn't
-   bit 5 - previous wasn't newline, current is
-   bit 4 - neither previous nor current is a newline
-   bit 3 - previous and current are word-constituents
-   bit 2 - previous was word-constituent, current isn't
-   bit 1 - previous wasn't word-constituent, current is
-   bit 0 - neither previous nor current is word-constituent
-
-   Word-constituent characters are those that satisfy isalnum().
-
-   The macro SUCCEEDS_IN_CONTEXT determines whether a a given constraint
-   succeeds in a particular context.  Prevn is true if the previous character
-   was a newline, currn is true if the lookahead character is a newline.
-   Prevl and currl similarly depend upon whether the previous and current
-   characters are word-constituent letters. */
-#define MATCHES_NEWLINE_CONTEXT(constraint, prevn, currn) \
-  ((constraint) & 1 << (((prevn) ? 2 : 0) + ((currn) ? 1 : 0) + 4))
-#define MATCHES_LETTER_CONTEXT(constraint, prevl, currl) \
-  ((constraint) & 1 << (((prevl) ? 2 : 0) + ((currl) ? 1 : 0)))
-#define SUCCEEDS_IN_CONTEXT(constraint, prevn, currn, prevl, currl) \
-  (MATCHES_NEWLINE_CONTEXT(constraint, prevn, currn)		     \
-   && MATCHES_LETTER_CONTEXT(constraint, prevl, currl))
-
-/* The following macros give information about what a constraint depends on. */
-#define PREV_NEWLINE_DEPENDENT(constraint) \
-  (((constraint) & 0xc0) >> 2 != ((constraint) & 0x30))
-#define PREV_LETTER_DEPENDENT(constraint) \
-  (((constraint) & 0x0c) >> 2 != ((constraint) & 0x03))
-
-/* Tokens that match the empty string subject to some constraint actually
-   work by applying that constraint to determine what may follow them,
-   taking into account what has gone before.  The following values are
-   the constraints corresponding to the special tokens previously defined. */
-#define NO_CONSTRAINT 0xff
-#define BEGLINE_CONSTRAINT 0xcf
-#define ENDLINE_CONSTRAINT 0xaf
-#define BEGWORD_CONSTRAINT 0xf2
-#define ENDWORD_CONSTRAINT 0xf4
-#define LIMWORD_CONSTRAINT 0xf6
-#define NOTLIMWORD_CONSTRAINT 0xf9
-
-/* States of the recognizer correspond to sets of positions in the parse
-   tree, together with the constraints under which they may be matched.
-   So a position is encoded as an index into the parse tree together with
-   a constraint. */
-typedef struct
-{
-  unsigned index;		/* Index into the parse array. */
-  unsigned constraint;		/* Constraint for matching this position. */
-} position;
-
-/* Sets of positions are stored as arrays. */
-typedef struct
-{
-  position *elems;		/* Elements of this position set. */
-  int nelem;			/* Number of elements in this set. */
-} position_set;
-
-/* A state of the dfa consists of a set of positions, some flags,
-   and the token value of the lowest-numbered position of the state that
-   contains an END token. */
-typedef struct
-{
-  int hash;			/* Hash of the positions of this state. */
-  position_set elems;		/* Positions this state could match. */
-  char newline;			/* True if previous state matched newline. */
-  char letter;			/* True if previous state matched a letter. */
-  char backref;			/* True if this state matches a \<digit>. */
-  unsigned char constraint;	/* Constraint for this state to accept. */
-  int first_end;		/* Token value of the first END in elems. */
-} dfa_state;
-
-/* Element of a list of strings, at least one of which is known to
-   appear in any R.E. matching the DFA. */
-struct dfamust
-{
-  int exact;
-  char *must;
-  struct dfamust *next;
-};
-
-/* A compiled regular expression. */
-struct dfa
-{
-  /* Stuff built by the scanner. */
-  charclass *charclasses;	/* Array of character sets for CSET tokens. */
-  int cindex;			/* Index for adding new charclasses. */
-  int calloc;			/* Number of charclasses currently allocated. */
-
-  /* Stuff built by the parser. */
-  token *tokens;		/* Postfix parse array. */
-  int tindex;			/* Index for adding new tokens. */
-  int talloc;			/* Number of tokens currently allocated. */
-  int depth;			/* Depth required of an evaluation stack
-				   used for depth-first traversal of the
-				   parse tree. */
-  int nleaves;			/* Number of leaves on the parse tree. */
-  int nregexps;			/* Count of parallel regexps being built
-				   with dfaparse(). */
-
-  /* Stuff owned by the state builder. */
-  dfa_state *states;		/* States of the dfa. */
-  int sindex;			/* Index for adding new states. */
-  int salloc;			/* Number of states currently allocated. */
-
-  /* Stuff built by the structure analyzer. */
-  position_set *follows;	/* Array of follow sets, indexed by position
-				   index.  The follow of a position is the set
-				   of positions containing characters that
-				   could conceivably follow a character
-				   matching the given position in a string
-				   matching the regexp.  Allocated to the
-				   maximum possible position index. */
-  int searchflag;		/* True if we are supposed to build a searching
-				   as opposed to an exact matcher.  A searching
-				   matcher finds the first and shortest string
-				   matching a regexp anywhere in the buffer,
-				   whereas an exact matcher finds the longest
-				   string matching, but anchored to the
-				   beginning of the buffer. */
-
-  /* Stuff owned by the executor. */
-  int tralloc;			/* Number of transition tables that have
-				   slots so far. */
-  int trcount;			/* Number of transition tables that have
-				   actually been built. */
-  int **trans;			/* Transition tables for states that can
-				   never accept.  If the transitions for a
-				   state have not yet been computed, or the
-				   state could possibly accept, its entry in
-				   this table is NULL. */
-  int **realtrans;		/* Trans always points to realtrans + 1; this
-				   is so trans[-1] can contain NULL. */
-  int **fails;			/* Transition tables after failing to accept
-				   on a state that potentially could do so. */
-  int *success;			/* Table of acceptance conditions used in
-				   dfaexec and computed in build_state. */
-  int *newlines;		/* Transitions on newlines.  The entry for a
-				   newline in any transition table is always
-				   -1 so we can count lines without wasting
-				   too many cycles.  The transition for a
-				   newline is stored separately and handled
-				   as a special case.  Newline is also used
-				   as a sentinel at the end of the buffer. */
-  struct dfamust *musts;	/* List of strings, at least one of which
-				   is known to appear in any r.e. matching
-				   the dfa. */
-};
-
-/* Some macros for user access to dfa internals. */
-
-/* ACCEPTING returns true if s could possibly be an accepting state of r. */
-#define ACCEPTING(s, r) ((r).states[s].constraint)
-
-/* ACCEPTS_IN_CONTEXT returns true if the given state accepts in the
-   specified context. */
-#define ACCEPTS_IN_CONTEXT(prevn, currn, prevl, currl, state, dfa) \
-  SUCCEEDS_IN_CONTEXT((dfa).states[state].constraint,		   \
-		       prevn, currn, prevl, currl)
-
-/* FIRST_MATCHING_REGEXP returns the index number of the first of parallel
-   regexps that a given state could accept.  Parallel regexps are numbered
-   starting at 1. */
-#define FIRST_MATCHING_REGEXP(state, dfa) (-(dfa).states[state].first_end)
-
-/* Entry points. */
-
-/* dfasyntax() takes two arguments; the first sets the syntax bits described
-   earlier in this file, and the second sets the case-folding flag. */
-extern void dfasyntax PARAMS ((reg_syntax_t, int));
-
-/* Compile the given string of the given length into the given struct dfa.
-   Final argument is a flag specifying whether to build a searching or an
-   exact matcher. */
-extern void dfacomp PARAMS ((char *, size_t, struct dfa *, int));
-
-/* Execute the given struct dfa on the buffer of characters.  The
-   first char * points to the beginning, and the second points to the
-   first character after the end of the buffer, which must be a writable
-   place so a sentinel end-of-buffer marker can be stored there.  The
-   second-to-last argument is a flag telling whether to allow newlines to
-   be part of a string matching the regexp.  The next-to-last argument,
-   if non-NULL, points to a place to increment every time we see a
-   newline.  The final argument, if non-NULL, points to a flag that will
-   be set if further examination by a backtracking matcher is needed in
-   order to verify backreferencing; otherwise the flag will be cleared.
-   Returns NULL if no match is found, or a pointer to the first
-   character after the first & shortest matching string in the buffer. */
-extern char *dfaexec PARAMS ((struct dfa *, char *, char *, int, int *, int *));
-
-/* Free the storage held by the components of a struct dfa. */
-extern void dfafree PARAMS ((struct dfa *));
-
-/* Entry points for people who know what they're doing. */
-
-/* Initialize the components of a struct dfa. */
-extern void dfainit PARAMS ((struct dfa *));
-
-/* Incrementally parse a string of given length into a struct dfa. */
-extern void dfaparse PARAMS ((char *, size_t, struct dfa *));
-
-/* Analyze a parsed regexp; second argument tells whether to build a searching
-   or an exact matcher. */
-extern void dfaanalyze PARAMS ((struct dfa *, int));
-
-/* Compute, for each possible character, the transitions out of a given
-   state, storing them in an array of integers. */
-extern void dfastate PARAMS ((int, struct dfa *, int []));
-
-/* Error handling. */
-
-/* dfaerror() is called by the regexp routines whenever an error occurs.  It
-   takes a single argument, a NUL-terminated string describing the error.
-   The default dfaerror() prints the error message to stderr and exits.
-   The user can provide a different dfafree() if so desired. */
-extern void dfaerror PARAMS ((const char *));
diff -Nur grep-2.3/src/dfa.h.rej grep-ja-2.3/src/dfa.h.rej
--- grep-2.3/src/dfa.h.rej	Mon Dec 20 23:07:13 1999
+++ grep-ja-2.3/src/dfa.h.rej	Thu Jan  1 09:00:00 1970
@@ -1,34 +0,0 @@
-***************
-*** 14,19 ****
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-  
-  /* Written June, 1988 by Mike Haertel */
-  
---- 14,21 ----
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-+ /* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jul. 7, 1993 by t^2  */
-  
-  /* Written June, 1988 by Mike Haertel */
-  
-***************
-*** 305,311 ****
-  
-  /* dfasyntax() takes two arguments; the first sets the syntax bits described
-     earlier in this file, and the second sets the case-folding flag. */
-- extern void dfasyntax(int, int);
-  
-  /* Compile the given string of the given length into the given struct dfa.
-     Final argument is a flag specifying whether to build a searching or an
---- 307,313 ----
-  
-  /* dfasyntax() takes two arguments; the first sets the syntax bits described
-     earlier in this file, and the second sets the case-folding flag. */
-+ extern void dfasyntax(unsigned long, int);
-  
-  /* Compile the given string of the given length into the given struct dfa.
-     Final argument is a flag specifying whether to build a searching or an
diff -Nur grep-2.3/src/getpagesize.h grep-ja-2.3/src/getpagesize.h
--- grep-2.3/src/getpagesize.h	Mon Dec 20 23:07:17 1999
+++ grep-ja-2.3/src/getpagesize.h	Mon Dec 20 23:48:21 1999
@@ -1,3 +1,6 @@
+/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jul. 10, 1993 by t^2  */
+/* More added by gotom. 1999-09-24 */
 /* Emulate getpagesize on systems that lack it.  */
 
 #ifndef HAVE_GETPAGESIZE
@@ -34,7 +37,11 @@
 #    endif /* no NBPG */
 #   endif /* no EXEC_PAGESIZE */
 #  else /* no HAVE_SYS_PARAM_H */
-#   define getpagesize() 8192	/* punt totally */
+#   ifndef MSDOS
+#    define getpagesize() 8192	/* punt totally */
+#   else
+#    define getpagesize() 4096
+#   endif
 #  endif /* no HAVE_SYS_PARAM_H */
 # endif /* no _SC_PAGESIZE */
 
diff -Nur grep-2.3/src/getpagesize.h.orig grep-ja-2.3/src/getpagesize.h.orig
--- grep-2.3/src/getpagesize.h.orig	Wed Nov  4 06:39:04 1998
+++ grep-ja-2.3/src/getpagesize.h.orig	Thu Jan  1 09:00:00 1970
@@ -1,41 +0,0 @@
-/* Emulate getpagesize on systems that lack it.  */
-
-#ifndef HAVE_GETPAGESIZE
-
-# ifdef VMS
-#  define getpagesize() 512
-# endif
-
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-# endif
-
-# ifdef _SC_PAGESIZE
-#  define getpagesize() sysconf(_SC_PAGESIZE)
-# else /* no _SC_PAGESIZE */
-#  ifdef HAVE_SYS_PARAM_H
-#   include <sys/param.h>
-#   ifdef EXEC_PAGESIZE
-#    define getpagesize() EXEC_PAGESIZE
-#   else /* no EXEC_PAGESIZE */
-#    ifdef NBPG
-#     define getpagesize() NBPG * CLSIZE
-#     ifndef CLSIZE
-#      define CLSIZE 1
-#     endif /* no CLSIZE */
-#    else /* no NBPG */
-#     ifdef NBPC
-#      define getpagesize() NBPC
-#     else /* no NBPC */
-#      ifdef PAGESIZE
-#       define getpagesize() PAGESIZE
-#      endif /* PAGESIZE */
-#     endif /* no NBPC */
-#    endif /* no NBPG */
-#   endif /* no EXEC_PAGESIZE */
-#  else /* no HAVE_SYS_PARAM_H */
-#   define getpagesize() 8192	/* punt totally */
-#  endif /* no HAVE_SYS_PARAM_H */
-# endif /* no _SC_PAGESIZE */
-
-#endif /* no HAVE_GETPAGESIZE */
diff -Nur grep-2.3/src/getpagesize.h.rej grep-ja-2.3/src/getpagesize.h.rej
--- grep-2.3/src/getpagesize.h.rej	Mon Dec 20 23:07:17 1999
+++ grep-ja-2.3/src/getpagesize.h.rej	Thu Jan  1 09:00:00 1970
@@ -1,32 +0,0 @@
-***************
-*** 1,3 ****
-  #ifdef BSD
-  #ifndef BSD4_1
-  #define HAVE_GETPAGESIZE
---- 1,5 ----
-+ /* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jul. 10, 1993 by t^2  */
-  #ifdef BSD
-  #ifndef BSD4_1
-  #define HAVE_GETPAGESIZE
-***************
-*** 34,40 ****
-  #endif /* no NBPG */
-  #endif /* no EXEC_PAGESIZE */
-  #else /* !HAVE_SYS_PARAM_H */
-  #define getpagesize() 8192	/* punt totally */
-  #endif /* !HAVE_SYS_PARAM_H */
-  #endif /* no _SC_PAGESIZE */
-  
---- 36,46 ----
-  #endif /* no NBPG */
-  #endif /* no EXEC_PAGESIZE */
-  #else /* !HAVE_SYS_PARAM_H */
-+ #ifndef MSDOS
-  #define getpagesize() 8192	/* punt totally */
-+ #else
-+ #define getpagesize() 4096
-+ #endif
-  #endif /* !HAVE_SYS_PARAM_H */
-  #endif /* no _SC_PAGESIZE */
-  
diff -Nur grep-2.3/src/grep.c grep-ja-2.3/src/grep.c
--- grep-2.3/src/grep.c	Mon Dec 20 23:07:31 1999
+++ grep-ja-2.3/src/grep.c	Sat Mar 25 15:50:51 2000
@@ -16,6 +16,8 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
+/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jun. 2, 1994 by t^2  */
 /* Written July 1992 by Mike Haertel.  */
 
 #ifdef HAVE_CONFIG_H
@@ -55,9 +57,13 @@
 /* If non-zero, print the version on standard output and exit.  */
 static int show_version;
 
+#include "mbc.h"
+
 /* Long options equivalences. */
 static struct option long_options[] =
 {
+  // gotom: なんで こんなところにくんの? check!
+  //#include "mbc.h"
   {"after-context", required_argument, NULL, 'A'},
   {"basic-regexp", no_argument, NULL, 'G'},
   {"before-context", required_argument, NULL, 'B'},
@@ -455,7 +461,7 @@
 }
 
 static void
-print_offset_sep (pos, sep)
+print_offset_sep (pos, sep)   /* <--  (++totalnl, sep) が入る */
      off_t pos;
      int sep;
 {
@@ -946,6 +952,13 @@
   -U, --binary              do not strip CR characters at EOL (MSDOS)\n\
   -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)\n\
 \n\
+Multi-byte Extention:\n\
+  -Wctype, --ctype=CHARSET  grep behaves adequete in CHARSET\n\
+                            CHARSET=ASCII : ignores multi-byte characters\n\
+                            CHARSET=EUC   : recognizies EUC as multi-byte characters\n\
+                            CHARSET=SJIS  : recognizies SJIS as multi-byte characters\n\
+                            default is ASCII\n\
+\n\
 If no -[GEF], then `egrep' assumes -E, `fgrep' -F, else -G.\n\
 With no FILE, or when FILE is -, read standard input. If less than\n\
 two FILEs given, assume -h. Exit with 0 if matches, with 1 if none.\n\
@@ -1097,9 +1110,9 @@
 
   while ((opt = getopt_long (argc, argv,
 #if O_BINARY
-         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxyUu",
+         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxyUuW:",
 #else
-         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxy",
+         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxyW:",
 #endif
          long_options, NULL)) != EOF)
     switch (opt)
@@ -1296,6 +1309,7 @@
   if (show_version)
     {
       printf (_("grep (GNU grep) %s\n"), VERSION);
+      printf (" + multi-byte extension 2.0.1 (by gotom@debian.or.jp)");
       printf ("\n");
       printf (_("\
 Copyright (C) 1988, 1992-1998, 1999 Free Software Foundation, Inc.\n"));
diff -Nur grep-2.3/src/grep.c.orig grep-ja-2.3/src/grep.c.orig
--- grep-2.3/src/grep.c.orig	Wed Feb 10 14:39:24 1999
+++ grep-ja-2.3/src/grep.c.orig	Thu Jan  1 09:00:00 1970
@@ -1,1324 +0,0 @@
-/* grep.c - main driver file for grep.
-   Copyright (C) 1992, 1997, 1998, 1999 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
-
-/* Written July 1992 by Mike Haertel.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#if defined(HAVE_MMAP)
-# include <sys/mman.h>
-#endif
-#if defined(HAVE_SETRLIMIT)
-# include <sys/time.h>
-# include <sys/resource.h>
-#endif
-#include <stdio.h>
-#include "system.h"
-#include "getopt.h"
-#include "getpagesize.h"
-#include "grep.h"
-#include "savedir.h"
-
-#undef MAX
-#define MAX(A,B) ((A) > (B) ? (A) : (B))
-
-struct stats
-{
-  struct stats *parent;
-  struct stat stat;
-};
-
-/* base of chain of stat buffers, used to detect directory loops */
-static struct stats stats_base;
-
-/* if non-zero, display usage information and exit */
-static int show_help;
-
-/* If non-zero, print the version on standard output and exit.  */
-static int show_version;
-
-/* Long options equivalences. */
-static struct option long_options[] =
-{
-  {"after-context", required_argument, NULL, 'A'},
-  {"basic-regexp", no_argument, NULL, 'G'},
-  {"before-context", required_argument, NULL, 'B'},
-  {"byte-offset", no_argument, NULL, 'b'},
-  {"context", optional_argument, NULL, 'C'},
-  {"count", no_argument, NULL, 'c'},
-  {"directories", required_argument, NULL, 'd'},
-  {"extended-regexp", no_argument, NULL, 'E'},
-  {"file", required_argument, NULL, 'f'},
-  {"files-with-matches", no_argument, NULL, 'l'},
-  {"files-without-match", no_argument, NULL, 'L'},
-  {"fixed-regexp", no_argument, NULL, 'F'},
-  {"fixed-strings", no_argument, NULL, 'F'},
-  {"help", no_argument, &show_help, 1},
-  {"ignore-case", no_argument, NULL, 'i'},
-  {"line-number", no_argument, NULL, 'n'},
-  {"line-regexp", no_argument, NULL, 'x'},
-  {"no-filename", no_argument, NULL, 'h'},
-  {"no-messages", no_argument, NULL, 's'},
-  {"quiet", no_argument, NULL, 'q'},
-  {"recursive", no_argument, NULL, 'r'},
-  {"regexp", required_argument, NULL, 'e'},
-  {"revert-match", no_argument, NULL, 'v'},
-  {"silent", no_argument, NULL, 'q'},
-  {"text", no_argument, NULL, 'a'},
-#if O_BINARY
-  {"binary", no_argument, NULL, 'U'},
-  {"unix-byte-offsets", no_argument, NULL, 'u'},
-#endif
-  {"version", no_argument, NULL, 'V'},
-  {"with-filename", no_argument, NULL, 'H'},
-  {"word-regexp", no_argument, NULL, 'w'},
-  {0, 0, 0, 0}
-};
-
-/* Define flags declared in grep.h. */
-char const *matcher;
-int match_icase;
-int match_words;
-int match_lines;
-
-/* For error messages. */
-static char *prog;
-static char const *filename;
-static int errseen;
-
-/* How to handle directories.  */
-static enum
-  {
-    READ_DIRECTORIES,
-    RECURSE_DIRECTORIES,
-    SKIP_DIRECTORIES
-  } directories;
-
-static int  ck_atoi PARAMS ((char const *, int *));
-static void usage PARAMS ((int)) __attribute__((noreturn));
-static void error PARAMS ((const char *, int));
-static int  setmatcher PARAMS ((char const *));
-static char *page_alloc PARAMS ((size_t, char **));
-static int  reset PARAMS ((int, char const *, struct stats *));
-static int  fillbuf PARAMS ((size_t, struct stats *));
-static int  grepbuf PARAMS ((char *, char *));
-static void prtext PARAMS ((char *, char *, int *));
-static void prpending PARAMS ((char *));
-static void prline PARAMS ((char *, char *, int));
-static void print_offset_sep PARAMS ((off_t, int));
-static void nlscan PARAMS ((char *));
-static int  grep PARAMS ((int, char const *, struct stats *));
-static int  grepdir PARAMS ((char const *, struct stats *));
-static int  grepfile PARAMS ((char const *, struct stats *));
-#if O_BINARY
-static inline int undossify_input PARAMS ((register char *, size_t));
-#endif
-
-/* Functions we'll use to search. */
-static void (*compile) PARAMS ((char *, size_t));
-static char *(*execute) PARAMS ((char *, size_t, char **));
-
-/* Print a message and possibly an error string.  Remember
-   that something awful happened. */
-static void
-error (mesg, errnum)
-     const char *mesg;
-     int errnum;
-{
-  if (errnum)
-    fprintf (stderr, "%s: %s: %s\n", prog, mesg, strerror (errnum));
-  else
-    fprintf (stderr, "%s: %s\n", prog, mesg);
-  errseen = 1;
-}
-
-/* Like error (), but die horribly after printing. */
-void
-fatal (mesg, errnum)
-     const char *mesg;
-     int errnum;
-{
-  error (mesg, errnum);
-  exit (2);
-}
-
-/* Interface to handle errors and fix library lossage. */
-char *
-xmalloc (size)
-     size_t size;
-{
-  char *result;
-
-  result = malloc (size);
-  if (size && !result)
-    fatal (_("memory exhausted"), 0);
-  return result;
-}
-
-/* Interface to handle errors and fix some library lossage. */
-char *
-xrealloc (ptr, size)
-     char *ptr;
-     size_t size;
-{
-  char *result;
-
-  if (ptr)
-    result = realloc (ptr, size);
-  else
-    result = malloc (size);
-  if (size && !result)
-    fatal (_("memory exhausted"), 0);
-  return result;
-}
-
-/* Convert STR to a positive integer, storing the result in *OUT.
-   If STR is not a valid integer, return -1 (otherwise 0). */
-static int
-ck_atoi (str, out)
-     char const *str;
-     int *out;
-{
-  char const *p;
-  for (p = str; *p; p++)
-    if (*p < '0' || *p > '9')
-      return -1;
-
-  *out = atoi (optarg);
-  return 0;
-}
-
-
-/* Hairy buffering mechanism for grep.  The intent is to keep
-   all reads aligned on a page boundary and multiples of the
-   page size. */
-
-static char *ubuffer;		/* Unaligned base of buffer. */
-static char *buffer;		/* Base of buffer. */
-static size_t bufsalloc;	/* Allocated size of buffer save region. */
-static size_t bufalloc;		/* Total buffer size. */
-static int bufdesc;		/* File descriptor. */
-static char *bufbeg;		/* Beginning of user-visible stuff. */
-static char *buflim;		/* Limit of user-visible stuff. */
-static size_t pagesize;		/* alignment of memory pages */
-
-#if defined(HAVE_MMAP)
-static int bufmapped;		/* True for ordinary files. */
-static off_t bufoffset;		/* What read() normally remembers. */
-static off_t initial_bufoffset;	/* Initial value of bufoffset. */
-#endif
-
-/* Return VAL aligned to the next multiple of ALIGNMENT.  VAL can be
-   an integer or a pointer.  Both args must be free of side effects.  */
-#define ALIGN_TO(val, alignment) \
-  ((size_t) (val) % (alignment) == 0 \
-   ? (val) \
-   : (val) + ((alignment) - (size_t) (val) % (alignment)))
-
-/* Return the address of a new page-aligned buffer of size SIZE.  Set
-   *UP to the newly allocated (but possibly unaligned) buffer used to
-   *build the aligned buffer.  To free the buffer, free (*UP).  */
-static char *
-page_alloc (size, up)
-     size_t size;
-     char **up;
-{
-  /* HAVE_WORKING_VALLOC means that valloc is properly declared, and
-     you can free the result of valloc.  This symbol is not (yet)
-     autoconfigured.  It can be useful to define HAVE_WORKING_VALLOC
-     while debugging, since some debugging memory allocators might
-     catch more bugs if this symbol is enabled.  */
-#if HAVE_WORKING_VALLOC
-  *up = valloc (size);
-  return *up;
-#else
-  size_t asize = size + pagesize - 1;
-  if (size <= asize)
-    {
-      *up = malloc (asize);
-      if (*up)
-	return ALIGN_TO (*up, pagesize);
-    }
-  return NULL;
-#endif
-}
-
-/* Reset the buffer for a new file, returning zero if we should skip it.
-   Initialize on the first time through. */
-static int
-reset (fd, file, stats)
-     int fd;
-     char const *file;
-     struct stats *stats;
-{
-  if (pagesize == 0)
-    {
-      size_t ubufsalloc;
-      pagesize = getpagesize ();
-      if (pagesize == 0)
-	abort ();
-#ifndef BUFSALLOC
-      ubufsalloc = MAX (8192, pagesize);
-#else
-      ubufsalloc = BUFSALLOC;
-#endif
-      bufsalloc = ALIGN_TO (ubufsalloc, pagesize);
-      bufalloc = 5 * bufsalloc;
-      /* The 1 byte of overflow is a kludge for dfaexec(), which
-	 inserts a sentinel newline at the end of the buffer
-	 being searched.  There's gotta be a better way... */
-      if (bufsalloc < ubufsalloc
-	  || bufalloc / 5 != bufsalloc || bufalloc + 1 < bufalloc
-	  || ! (buffer = page_alloc (bufalloc + 1, &ubuffer)))
-	fatal (_("memory exhausted"), 0);
-      bufbeg = buffer;
-      buflim = buffer;
-    }
-  bufdesc = fd;
-
-  if (
-#if defined(HAVE_MMAP)
-      1
-#else
-      directories != READ_DIRECTORIES
-#endif
-      )
-    if (fstat (fd, &stats->stat) != 0)
-      {
-	error ("fstat", errno);
-	return 0;
-      }
-  if (directories == SKIP_DIRECTORIES && S_ISDIR (stats->stat.st_mode))
-    return 0;
-#if defined(HAVE_MMAP)
-  if (!S_ISREG (stats->stat.st_mode))
-    bufmapped = 0;
-  else
-    {
-      bufmapped = 1;
-      bufoffset = initial_bufoffset = file ? 0 : lseek (fd, 0, 1);
-    }
-#endif
-  return 1;
-}
-
-/* Read new stuff into the buffer, saving the specified
-   amount of old stuff.  When we're done, 'bufbeg' points
-   to the beginning of the buffer contents, and 'buflim'
-   points just after the end.  Return count of new stuff. */
-static int
-fillbuf (save, stats)
-     size_t save;
-     struct stats *stats;
-{
-  int cc;
-#if defined(HAVE_MMAP)
-  caddr_t maddr;
-#endif
-
-  if (save > bufsalloc)
-    {
-      char *nubuffer;
-      char *nbuffer;
-
-      while (save > bufsalloc)
-	bufsalloc *= 2;
-      bufalloc = 5 * bufsalloc;
-      if (bufalloc / 5 != bufsalloc || bufalloc + 1 < bufalloc
-	  || ! (nbuffer = page_alloc (bufalloc + 1, &nubuffer)))
-	fatal (_("memory exhausted"), 0);
-
-      bufbeg = nbuffer + bufsalloc - save;
-      memcpy (bufbeg, buflim - save, save);
-      free (ubuffer);
-      ubuffer = nubuffer;
-      buffer = nbuffer;
-    }
-  else
-    {
-      bufbeg = buffer + bufsalloc - save;
-      memcpy (bufbeg, buflim - save, save);
-    }
-
-#if defined(HAVE_MMAP)
-  if (bufmapped && bufoffset % pagesize == 0
-      && stats->stat.st_size - bufoffset >= bufalloc - bufsalloc)
-    {
-      maddr = buffer + bufsalloc;
-      maddr = mmap (maddr, bufalloc - bufsalloc, PROT_READ | PROT_WRITE,
-		   MAP_PRIVATE | MAP_FIXED, bufdesc, bufoffset);
-      if (maddr == (caddr_t) -1)
-	{
-          /* This used to issue a warning, but on some hosts
-             (e.g. Solaris 2.5) mmap can fail merely because some
-             other process has an advisory read lock on the file.
-             There's no point alarming the user about this misfeature.  */
-#if 0
-	  fprintf (stderr, _("%s: warning: %s: %s\n"), prog, filename,
-		  strerror (errno));
-#endif
-	  goto tryread;
-	}
-#if 0
-      /* You might thing this (or MADV_WILLNEED) would help,
-	 but it doesn't, at least not on a Sun running 4.1.
-	 In fact, it actually slows us down about 30%! */
-      madvise (maddr, bufalloc - bufsalloc, MADV_SEQUENTIAL);
-#endif
-      cc = bufalloc - bufsalloc;
-      bufoffset += cc;
-    }
-  else
-    {
-    tryread:
-      /* We come here when we're not going to use mmap() any more.
-	 Note that we need to synchronize the file offset the
-	 first time through. */
-      if (bufmapped)
-	{
-	  bufmapped = 0;
-	  if (bufoffset != initial_bufoffset)
-	    lseek (bufdesc, bufoffset, 0);
-	}
-      cc = read (bufdesc, buffer + bufsalloc, bufalloc - bufsalloc);
-    }
-#else
-  cc = read (bufdesc, buffer + bufsalloc, bufalloc - bufsalloc);
-#endif /*HAVE_MMAP*/
-#if O_BINARY
-  if (cc > 0)
-    cc = undossify_input (buffer + bufsalloc, cc);
-#endif
-  if (cc > 0)
-    buflim = buffer + bufsalloc + cc;
-  else
-    buflim = buffer + bufsalloc;
-  return cc;
-}
-
-/* Flags controlling the style of output. */
-static int always_text;		/* Assume the input is always text. */
-static int out_quiet;		/* Suppress all normal output. */
-static int out_invert;		/* Print nonmatching stuff. */
-static int out_file;		/* Print filenames. */
-static int out_line;		/* Print line numbers. */
-static int out_byte;		/* Print byte offsets. */
-static int out_before;		/* Lines of leading context. */
-static int out_after;		/* Lines of trailing context. */
-static int count_matches;	/* Count matching lines.  */
-static int list_files;		/* List matching files.  */
-static int no_filenames;	/* Suppress file names.  */
-static int suppress_errors;	/* Suppress diagnostics.  */
-
-/* Internal variables to keep track of byte count, context, etc. */
-static off_t totalcc;		/* Total character count before bufbeg. */
-static char *lastnl;		/* Pointer after last newline counted. */
-static char *lastout;		/* Pointer after last character output;
-				   NULL if no character has been output
-				   or if it's conceptually before bufbeg. */
-static off_t totalnl;		/* Total newline count before lastnl. */
-static int pending;		/* Pending lines of output. */
-static int done_on_match;		/* Stop scanning file on first match */
-
-#if O_BINARY
-# include "dosbuf.c"
-#endif
-
-static void
-nlscan (lim)
-     char *lim;
-{
-  char *beg;
-
-  for (beg = lastnl; beg < lim; ++beg)
-    if (*beg == '\n')
-      ++totalnl;
-  lastnl = beg;
-}
-
-static void
-print_offset_sep (pos, sep)
-     off_t pos;
-     int sep;
-{
-  /* Do not rely on printf to print pos, since off_t may be longer than long,
-     and long long is not portable.  */
-
-  char buf[sizeof pos * CHAR_BIT];
-  char *p = buf + sizeof buf - 1;
-  *p = sep;
-
-  do
-    *--p = '0' + pos % 10;
-  while ((pos /= 10) != 0);
-
-  fwrite (p, 1, buf + sizeof buf - p, stdout);
-}
-
-static void
-prline (beg, lim, sep)
-     char *beg;
-     char *lim;
-     int sep;
-{
-  if (out_file)
-    printf ("%s%c", filename, sep);
-  if (out_line)
-    {
-      nlscan (beg);
-      print_offset_sep (++totalnl, sep);
-      lastnl = lim;
-    }
-  if (out_byte)
-    {
-      off_t pos = totalcc + (beg - bufbeg);
-#if O_BINARY
-      pos = dossified_pos (pos);
-#endif
-      print_offset_sep (pos, sep);
-    }
-  fwrite (beg, 1, lim - beg, stdout);
-  if (ferror (stdout))
-    error (_("writing output"), errno);
-  lastout = lim;
-}
-
-/* Print pending lines of trailing context prior to LIM. */
-static void
-prpending (lim)
-     char *lim;
-{
-  char *nl;
-
-  if (!lastout)
-    lastout = bufbeg;
-  while (pending > 0 && lastout < lim)
-    {
-      --pending;
-      if ((nl = memchr (lastout, '\n', lim - lastout)) != 0)
-	++nl;
-      else
-	nl = lim;
-      prline (lastout, nl, '-');
-    }
-}
-
-/* Print the lines between BEG and LIM.  Deal with context crap.
-   If NLINESP is non-null, store a count of lines between BEG and LIM. */
-static void
-prtext (beg, lim, nlinesp)
-     char *beg;
-     char *lim;
-     int *nlinesp;
-{
-  static int used;		/* avoid printing "--" before any output */
-  char *bp, *p, *nl;
-  int i, n;
-
-  if (!out_quiet && pending > 0)
-    prpending (beg);
-
-  p = beg;
-
-  if (!out_quiet)
-    {
-      /* Deal with leading context crap. */
-
-      bp = lastout ? lastout : bufbeg;
-      for (i = 0; i < out_before; ++i)
-	if (p > bp)
-	  do
-	    --p;
-	  while (p > bp && p[-1] != '\n');
-
-      /* We only print the "--" separator if our output is
-	 discontiguous from the last output in the file. */
-      if ((out_before || out_after) && used && p != lastout)
-	puts ("--");
-
-      while (p < beg)
-	{
-	  nl = memchr (p, '\n', beg - p);
-	  prline (p, nl + 1, '-');
-	  p = nl + 1;
-	}
-    }
-
-  if (nlinesp)
-    {
-      /* Caller wants a line count. */
-      for (n = 0; p < lim; ++n)
-	{
-	  if ((nl = memchr (p, '\n', lim - p)) != 0)
-	    ++nl;
-	  else
-	    nl = lim;
-	  if (!out_quiet)
-	    prline (p, nl, ':');
-	  p = nl;
-	}
-      *nlinesp = n;
-    }
-  else
-    if (!out_quiet)
-      prline (beg, lim, ':');
-
-  pending = out_after;
-  used = 1;
-}
-
-/* Scan the specified portion of the buffer, matching lines (or
-   between matching lines if OUT_INVERT is true).  Return a count of
-   lines printed. */
-static int
-grepbuf (beg, lim)
-     char *beg;
-     char *lim;
-{
-  int nlines, n;
-  register char *p, *b;
-  char *endp;
-
-  nlines = 0;
-  p = beg;
-  while ((b = (*execute)(p, lim - p, &endp)) != 0)
-    {
-      /* Avoid matching the empty line at the end of the buffer. */
-      if (b == lim && ((b > beg && b[-1] == '\n') || b == beg))
-	break;
-      if (!out_invert)
-	{
-	  prtext (b, endp, (int *) 0);
-	  nlines += 1;
-	  if (done_on_match)
-	    return nlines;
-	}
-      else if (p < b)
-	{
-	  prtext (p, b, &n);
-	  nlines += n;
-	}
-      p = endp;
-    }
-  if (out_invert && p < lim)
-    {
-      prtext (p, lim, &n);
-      nlines += n;
-    }
-  return nlines;
-}
-
-/* Search a given file.  Normally, return a count of lines printed;
-   but if the file is a directory and we search it recursively, then
-   return -2 if there was a match, and -1 otherwise.  */
-static int
-grep (fd, file, stats)
-     int fd;
-     char const *file;
-     struct stats *stats;
-{
-  int nlines, i;
-  int not_text;
-  size_t residue, save;
-  char *beg, *lim;
-
-  if (!reset (fd, file, stats))
-    return 0;
-
-  if (file && directories == RECURSE_DIRECTORIES
-      && S_ISDIR (stats->stat.st_mode))
-    {
-      /* Close fd now, so that we don't open a lot of file descriptors
-	 when we recurse deeply.  */
-      if (close (fd) != 0)
-	error (file, errno);
-      return grepdir (file, stats) - 2;
-    }
-
-  totalcc = 0;
-  lastout = 0;
-  totalnl = 0;
-  pending = 0;
-
-  nlines = 0;
-  residue = 0;
-  save = 0;
-
-  if (fillbuf (save, stats) < 0)
-    {
-      if (! (is_EISDIR (errno, file) && suppress_errors))
-	error (filename, errno);
-      return nlines;
-    }
-
-  not_text = (! (always_text | out_quiet)
-	      && memchr (bufbeg, '\0', buflim - bufbeg));
-  done_on_match += not_text;
-  out_quiet += not_text;
-
-  for (;;)
-    {
-      lastnl = bufbeg;
-      if (lastout)
-	lastout = bufbeg;
-      if (buflim - bufbeg == save)
-	break;
-      beg = bufbeg + save - residue;
-      for (lim = buflim; lim > beg && lim[-1] != '\n'; --lim)
-	;
-      residue = buflim - lim;
-      if (beg < lim)
-	{
-	  nlines += grepbuf (beg, lim);
-	  if (pending)
-	    prpending (lim);
-	  if (nlines && done_on_match && !out_invert)
-	    goto finish_grep;
-	}
-      i = 0;
-      beg = lim;
-      while (i < out_before && beg > bufbeg && beg != lastout)
-	{
-	  ++i;
-	  do
-	    --beg;
-	  while (beg > bufbeg && beg[-1] != '\n');
-	}
-      if (beg != lastout)
-	lastout = 0;
-      save = residue + lim - beg;
-      totalcc += buflim - bufbeg - save;
-      if (out_line)
-	nlscan (beg);
-      if (fillbuf (save, stats) < 0)
-	{
-	  if (! (is_EISDIR (errno, file) && suppress_errors))
-	    error (filename, errno);
-	  goto finish_grep;
-	}
-    }
-  if (residue)
-    {
-      nlines += grepbuf (bufbeg + save - residue, buflim);
-      if (pending)
-	prpending (buflim);
-    }
-
- finish_grep:
-  done_on_match -= not_text;
-  out_quiet -= not_text;
-  if ((not_text & ~out_quiet) && nlines != 0)
-    printf (_("Binary file %s matches\n"), filename);
-  return nlines;
-}
-
-static int
-grepfile (file, stats)
-     char const *file;
-     struct stats *stats;
-{
-  int desc;
-  int count;
-  int status;
-
-  if (! file)
-    {
-      desc = 0;
-      filename = _("(standard input)");
-    }
-  else
-    {
-      desc = open (file, O_RDONLY);
-
-      if (desc < 0)
-	{
-	  int e = errno;
-	    
-	  if (is_EISDIR (e, file) && directories == RECURSE_DIRECTORIES)
-	    {
-	      if (stat (file, &stats->stat) != 0)
-		{
-		  error (file, errno);
-		  return 1;
-		}
-
-	      return grepdir (file, stats);
-	    }
-	      
-	  if (!suppress_errors)
-	    {
-	      if (directories == SKIP_DIRECTORIES)
-		switch (e)
-		  {
-#ifdef EISDIR
-		  case EISDIR:
-		    return 1;
-#endif
-		  case EACCES:
-		    /* When skipping directories, don't worry about
-		       directories that can't be opened.  */
-		    if (stat (file, &stats->stat) == 0
-			&& S_ISDIR (stats->stat.st_mode))
-		      return 1;
-		    break;
-		  }
-
-	      error (file, e);
-	    }
-
-	  return 1;
-	}
-
-      filename = file;
-    }
-
-#if O_BINARY
-  /* Set input to binary mode.  Pipes are simulated with files
-     on DOS, so this includes the case of "foo | grep bar".  */
-  if (!isatty (desc))
-    SET_BINARY (desc);
-#endif
-
-  count = grep (desc, file, stats);
-  if (count < 0)
-    status = count + 2;
-  else
-    {
-      if (count_matches)
-	{
-	  if (out_file)
-	    printf ("%s:", filename);
-	  printf ("%d\n", count);
-	}
-
-      if (count)
-	{
-	  status = 0;
-	  if (list_files == 1)
-	    printf ("%s\n", filename);
-	}
-      else
-	{
-	  status = 1;
-	  if (list_files == -1)
-	    printf ("%s\n", filename);
-	}
-
-      if (file && close (desc) != 0)
-	error (file, errno);
-    }
-
-  return status;
-}
-
-static int
-grepdir (dir, stats)
-     char const *dir;
-     struct stats *stats;
-{
-  int status = 1;
-  struct stats *ancestor;
-  char *name_space;
-
-  for (ancestor = stats;  (ancestor = ancestor->parent) != 0;  )
-    if (! ((ancestor->stat.st_ino ^ stats->stat.st_ino)
-	   | (ancestor->stat.st_dev ^ stats->stat.st_dev)))
-      {
-	if (!suppress_errors)
-	  fprintf (stderr, _("%s: warning: %s: %s\n"), prog, dir,
-		   _("recursive directory loop"));
-	return 1;
-      }
-
-  name_space = savedir (dir, (unsigned) stats->stat.st_size);
-
-  if (! name_space)
-    {
-      if (errno)
-	{
-	  if (!suppress_errors)
-	    error (dir, errno);
-	}
-      else
-	fatal (_("Memory exhausted"), 0);
-    }
-  else
-    {
-      size_t dirlen = strlen (dir);
-      int needs_slash = ! (dirlen == FILESYSTEM_PREFIX_LEN (dir)
-			   || IS_SLASH (dir[dirlen - 1]));
-      char *file = NULL;
-      char *namep = name_space;
-      struct stats child;
-      child.parent = stats;
-      out_file += !no_filenames;
-      while (*namep)
-	{
-	  size_t namelen = strlen (namep);
-	  file = xrealloc (file, dirlen + 1 + namelen + 1);
-	  strcpy (file, dir);
-	  file[dirlen] = '/';
-	  strcpy (file + dirlen + needs_slash, namep);
-	  namep += namelen + 1;
-	  status &= grepfile (file, &child);
-	}
-      out_file -= !no_filenames;
-      if (file)
-        free (file);
-      free (name_space);
-    }
-
-  return status;
-}
-
-static void
-usage(status)
-int status;
-{
-  if (status != 0)
-    {
-      fprintf (stderr, _("Usage: %s [OPTION]... PATTERN [FILE]...\n"), prog);
-      fprintf (stderr, _("Try `%s --help' for more information.\n"), prog);
-    }
-  else
-    {
-      printf (_("Usage: %s [OPTION]... PATTERN [FILE] ...\n"), prog);
-      printf (_("\
-Search for PATTERN in each FILE or standard input.\n\
-\n\
-Regexp selection and interpretation:\n\
-  -E, --extended-regexp     PATTERN is an extended regular expression\n\
-  -F, --fixed-regexp        PATTERN is a fixed string separated by newlines\n\
-  -G, --basic-regexp        PATTERN is a basic regular expression\n\
-  -e, --regexp=PATTERN      use PATTERN as a regular expression\n\
-  -f, --file=FILE           obtain PATTERN from FILE\n\
-  -i, --ignore-case         ignore case distinctions\n\
-  -w, --word-regexp         force PATTERN to match only whole words\n\
-  -x, --line-regexp         force PATTERN to match only whole lines\n"));
-      printf (_("\
-\n\
-Miscellaneous:\n\
-  -s, --no-messages         suppress error messages\n\
-  -v, --revert-match        select non-matching lines\n\
-  -V, --version             print version information and exit\n\
-      --help                display this help and exit\n"));
-      printf (_("\
-\n\
-Output control:\n\
-  -b, --byte-offset         print the byte offset with output lines\n\
-  -n, --line-number         print line number with output lines\n\
-  -H, --with-filename       print the filename for each match\n\
-  -h, --no-filename         suppress the prefixing filename on output\n\
-  -q, --quiet, --silent     suppress all normal output\n\
-  -a, --text                do not suppress binary output\n\
-  -d, --directories=ACTION  how to handle directories\n\
-                            ACTION is 'read', 'recurse', or 'skip'.\n\
-  -r, --recursive           equivalent to --directories=recurse.\n\
-  -L, --files-without-match only print FILE names containing no match\n\
-  -l, --files-with-matches  only print FILE names containing matches\n\
-  -c, --count               only print a count of matching lines per FILE\n"));
-      printf (_("\
-\n\
-Context control:\n\
-  -B, --before-context=NUM  print NUM lines of leading context\n\
-  -A, --after-context=NUM   print NUM lines of trailing context\n\
-  -C, --context[=NUM]       print NUM (default 2) lines of output context\n\
-                            unless overriden by -A or -B\n\
-  -NUM                      same as --context=NUM\n\
-  -U, --binary              do not strip CR characters at EOL (MSDOS)\n\
-  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)\n\
-\n\
-If no -[GEF], then `egrep' assumes -E, `fgrep' -F, else -G.\n\
-With no FILE, or when FILE is -, read standard input. If less than\n\
-two FILEs given, assume -h. Exit with 0 if matches, with 1 if none.\n\
-Exit with 2 if syntax errors or system errors.\n"));
-      printf (_("\nReport bugs to <bug-gnu-utils@gnu.org>.\n"));
-    }
-  exit (status);
-}
-
-/* Go through the matchers vector and look for the specified matcher.
-   If we find it, install it in compile and execute, and return 1.  */
-static int
-setmatcher (name)
-     char const *name;
-{
-  int i;
-#ifdef HAVE_SETRLIMIT
-  struct rlimit rlim;
-#endif
-
-  for (i = 0; matchers[i].name; ++i)
-    if (strcmp (name, matchers[i].name) == 0)
-      {
-	compile = matchers[i].compile;
-	execute = matchers[i].execute;
-#if HAVE_SETRLIMIT && defined(RLIMIT_STACK)
-	/* I think every platform needs to do this, so that regex.c
-	   doesn't oveflow the stack.  The default value of
-	   `re_max_failures' is too large for some platforms: it needs
-	   more than 3MB-large stack.
-
-	   The test for HAVE_SETRLIMIT should go into `configure'.  */
-	if (!getrlimit (RLIMIT_STACK, &rlim))
-	  {
-	    long newlim;
-	    extern long int re_max_failures; /* from regex.c */
-
-	    /* Approximate the amount regex.c needs, plus some more.  */
-	    newlim = re_max_failures * 2 * 20 * sizeof (char *);
-	    if (newlim > rlim.rlim_max)
-	      {
-		newlim = rlim.rlim_max;
-		re_max_failures = newlim / (2 * 20 * sizeof (char *));
-	      }
-	    if (rlim.rlim_cur < newlim)
-	      rlim.rlim_cur = newlim;
-
-	    setrlimit (RLIMIT_STACK, &rlim);
-	  }
-#endif
-	return 1;
-      }
-  return 0;
-}
-
-int
-main (argc, argv)
-     int argc;
-     char *argv[];
-{
-  char *keys;
-  size_t keycc, oldcc, keyalloc;
-  int with_filenames;
-  int opt, cc, status;
-  unsigned digit_args_val, default_context;
-  FILE *fp;
-  extern char *optarg;
-  extern int optind;
-
-  initialize_main (&argc, &argv);
-  prog = argv[0];
-  if (prog && strrchr (prog, '/'))
-    prog = strrchr (prog, '/') + 1;
-
-#if defined(__MSDOS__) || defined(_WIN32)
-  /* DOS and MS-Windows use backslashes as directory separators, and usually
-     have an .exe suffix.  They also have case-insensitive filesystems.  */
-  if (prog)
-    {
-      char *p = prog;
-      char *bslash = strrchr (argv[0], '\\');
-
-      if (bslash && bslash >= prog) /* for mixed forward/backslash case */
-	prog = bslash + 1;
-      else if (prog == argv[0]
-	       && argv[0][0] && argv[0][1] == ':') /* "c:progname" */
-	prog = argv[0] + 2;
-
-      /* Collapse the letter-case, so `strcmp' could be used hence.  */
-      for ( ; *p; p++)
-	if (*p >= 'A' && *p <= 'Z')
-	  *p += 'a' - 'A';
-
-      /* Remove the .exe extension, if any.  */
-      if ((p = strrchr (prog, '.')) && strcmp (p, ".exe") == 0)
-	*p = '\0';
-    }
-#endif
-
-  keys = NULL;
-  keycc = 0;
-  with_filenames = 0;
-  matcher = NULL;
-
-  /* The value -1 means to use DEFAULT_CONTEXT. */
-  out_after = out_before = -1;
-  /* Default before/after context: chaged by -C/-NUM options */
-  default_context = 0;
-  /* Accumulated value of individual digits in a -NUM option */
-  digit_args_val = 0;
-
-
-/* Internationalization. */
-#if HAVE_SETLOCALE
-  setlocale (LC_ALL, "");
-#endif
-#if ENABLE_NLS
-  bindtextdomain (PACKAGE, LOCALEDIR);
-  textdomain (PACKAGE);
-#endif
-
-  while ((opt = getopt_long (argc, argv,
-#if O_BINARY
-         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxyUu",
-#else
-         "0123456789A:B:C::EFGHVX:abcd:e:f:hiLlnqrsvwxy",
-#endif
-         long_options, NULL)) != EOF)
-    switch (opt)
-      {
-      case '0':
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9':
-	digit_args_val = 10 * digit_args_val + opt - '0';
-	default_context = digit_args_val;
-	break;
-      case 'A':
-	if (optarg)
-	  {
-	    if (ck_atoi (optarg, &out_after))
-	      fatal (_("invalid context length argument"), 0);
-	  }
-	break;
-      case 'B':
-	if (optarg)
-	  {
-	    if (ck_atoi (optarg, &out_before))
-	      fatal (_("invalid context length argument"), 0);
-	  }
-	break;
-      case 'C':
-	/* Set output match context, but let any explicit leading or
-	   trailing amount specified with -A or -B stand. */
-	if (optarg)
-	  {
-	    if (ck_atoi (optarg, &default_context))
-	      fatal (_("invalid context length argument"), 0);
-	  }
-	else
-	  default_context = 2;
-	break;
-      case 'E':
-	if (matcher && strcmp (matcher, "posix-egrep") != 0)
-	  fatal (_("you may specify only one of -E, -F, or -G"), 0);
-	matcher = "posix-egrep";
-	break;
-      case 'F':
-	if (matcher && strcmp(matcher, "fgrep") != 0)
-	  fatal(_("you may specify only one of -E, -F, or -G"), 0);;
-	matcher = "fgrep";
-	break;
-      case 'G':
-	if (matcher && strcmp (matcher, "grep") != 0)
-	  fatal (_("you may specify only one of -E, -F, or -G"), 0);
-	matcher = "grep";
-	break;
-      case 'H':
-	with_filenames = 1;
-	break;
-#if O_BINARY
-      case 'U':
-	dos_use_file_type = DOS_BINARY;
-	break;
-      case 'u':
-	dos_report_unix_offset = 1;
-	break;
-#endif
-      case 'V':
-	show_version = 1;
-	break;
-      case 'X':
-	if (matcher)
-	  fatal (_("matcher already specified"), 0);
-	matcher = optarg;
-	break;
-      case 'a':
-	always_text = 1;
-	break;
-      case 'b':
-	out_byte = 1;
-	break;
-      case 'c':
-	out_quiet = 1;
-	count_matches = 1;
-	break;
-      case 'd':
-	if (strcmp (optarg, "read") == 0)
-	  directories = READ_DIRECTORIES;
-	else if (strcmp (optarg, "skip") == 0)
-	  directories = SKIP_DIRECTORIES;
-	else if (strcmp (optarg, "recurse") == 0)
-	  directories = RECURSE_DIRECTORIES;
-	else
-	  fatal (_("unknown directories method"), 0);
-	break;
-      case 'e':
-	cc = strlen (optarg);
-	keys = xrealloc (keys, keycc + cc + 1);
-	strcpy (&keys[keycc], optarg);
-	keycc += cc;
-	keys[keycc++] = '\n';
-	break;
-      case 'f':
-	fp = strcmp (optarg, "-") != 0 ? fopen (optarg, "r") : stdin;
-	if (!fp)
-	  fatal (optarg, errno);
-	for (keyalloc = 1; keyalloc <= keycc + 1; keyalloc *= 2)
-	  ;
-	keys = xrealloc (keys, keyalloc);
-	oldcc = keycc;
-	while (!feof (fp)
-	       && (cc = fread (keys + keycc, 1, keyalloc - 1 - keycc, fp)) > 0)
-	  {
-	    keycc += cc;
-	    if (keycc == keyalloc - 1)
-	      keys = xrealloc (keys, keyalloc *= 2);
-	  }
-	if (fp != stdin)
-	  fclose(fp);
-	/* Append final newline if file ended in non-newline. */
-	if (oldcc != keycc && keys[keycc - 1] != '\n')
-	  keys[keycc++] = '\n';
-	break;
-      case 'h':
-	no_filenames = 1;
-	break;
-      case 'i':
-      case 'y':			/* For old-timers . . . */
-	match_icase = 1;
-	break;
-      case 'L':
-	/* Like -l, except list files that don't contain matches.
-	   Inspired by the same option in Hume's gre. */
-	out_quiet = 1;
-	list_files = -1;
-	done_on_match = 1;
-	break;
-      case 'l':
-	out_quiet = 1;
-	list_files = 1;
-	done_on_match = 1;
-	break;
-      case 'n':
-	out_line = 1;
-	break;
-      case 'q':
-	done_on_match = 1;
-	out_quiet = 1;
-	break;
-      case 'r':
-	directories = RECURSE_DIRECTORIES;
-	break;
-      case 's':
-	suppress_errors = 1;
-	break;
-      case 'v':
-	out_invert = 1;
-	break;
-      case 'w':
-	match_words = 1;
-	break;
-      case 'x':
-	match_lines = 1;
-	break;
-      case 0:
-	/* long options */
-	break;
-      default:
-	usage (2);
-	break;
-      }
-
-  if (out_after < 0)
-    out_after = default_context;
-  if (out_before < 0)
-    out_before = default_context;
-
-  if (show_version)
-    {
-      printf (_("grep (GNU grep) %s\n"), VERSION);
-      printf ("\n");
-      printf (_("\
-Copyright (C) 1988, 1992-1998, 1999 Free Software Foundation, Inc.\n"));
-      printf (_("\
-This is free software; see the source for copying conditions. There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"));
-      printf ("\n");
-      exit (0);
-    }
-
-  if (show_help)
-    usage (0);
-
-  if (keys)
-    {
-      if (keycc == 0)
-	/* No keys were specified (e.g. -f /dev/null).  Match nothing.  */
-        out_invert ^= 1;
-      else
-	/* Strip trailing newline. */
-        --keycc;
-    }
-  else
-    if (optind < argc)
-      {
-	keys = argv[optind++];
-	keycc = strlen (keys);
-      }
-    else
-      usage (2);
-
-  if (! matcher)
-    matcher = default_matcher;
-
-  if (!setmatcher (matcher) && !setmatcher ("default"))
-    abort ();
-
-  (*compile)(keys, keycc);
-
-  if ((argc - optind > 1 && !no_filenames) || with_filenames)
-    out_file = 1;
-
-#if O_BINARY
-  /* Output is set to binary mode because we shouldn't convert
-     NL to CR-LF pairs, especially when grepping binary files.  */
-  if (!isatty (1))
-    SET_BINARY (1);
-#endif
-
-
-  if (optind < argc)
-    {
-	status = 1;
-	do
-	{
-	  char *file = argv[optind];
-	  status &= grepfile (strcmp (file, "-") == 0 ? (char *) NULL : file,
-			      &stats_base);
-	}
-	while ( ++optind < argc);
-    }
-  else
-    status = grepfile ((char *) NULL, &stats_base);
-
-  if (fclose (stdout) == EOF)
-    error (_("writing output"), errno);
-
-  exit (errseen ? 2 : status);
-}
diff -Nur grep-2.3/src/grep.c.rej grep-ja-2.3/src/grep.c.rej
--- grep-2.3/src/grep.c.rej	Mon Dec 20 23:07:31 1999
+++ grep-ja-2.3/src/grep.c.rej	Thu Jan  1 09:00:00 1970
@@ -1,198 +0,0 @@
-***************
-*** 16,28 ****
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-     Written July 1992 by Mike Haertel.  */
-  
-  #include <errno.h>
-  #include <stdio.h>
-  
-  #ifndef errno
-  extern int errno;
-  #endif
-  
-  #ifdef STDC_HEADERS
-  #include <stdlib.h>
---- 16,37 ----
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-     Written July 1992 by Mike Haertel.  */
-+ /* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jun. 2, 1994 by t^2  */
-  
-  #include <errno.h>
-  #include <stdio.h>
-  
-+ /* Temporary fix for Linux systems: mmap fails in /proc/kcore, but somehow
-+  * mmap-test succeeds..
-+  */
-+ #undef HAVE_WORKING_MMAP
-+ 
-  #ifndef errno
-+ #ifndef MSDOS
-  extern int errno;
-  #endif
-+ #endif
-  
-  #ifdef STDC_HEADERS
-  #include <stdlib.h>
-***************
-*** 58,63 ****
-  
-  #include "getpagesize.h"
-  #include "grep.h"
-  
-  #undef MAX
-  #define MAX(A,B) ((A) > (B) ? (A) : (B))
---- 67,73 ----
-  
-  #include "getpagesize.h"
-  #include "grep.h"
-+ #include "mbc.h"
-  
-  #undef MAX
-  #define MAX(A,B) ((A) > (B) ? (A) : (B))
-***************
-*** 424,435 ****
-  static int out_after;		/* Lines of trailing context. */
-  
-  /* Internal variables to keep track of byte count, context, etc. */
-- static size_t totalcc;		/* Total character count before bufbeg. */
-  static char *lastnl;		/* Pointer after last newline counted. */
-  static char *lastout;		/* Pointer after last character output;
-  				   NULL if no character has been output
-  				   or if it's conceptually before bufbeg. */
-- static size_t totalnl;		/* Total newline count before lastnl. */
-  static int pending;		/* Pending lines of output. */
-  
-  static void
---- 434,445 ----
-  static int out_after;		/* Lines of trailing context. */
-  
-  /* Internal variables to keep track of byte count, context, etc. */
-+ static unsigned long totalcc;	/* Total character count before bufbeg. */
-  static char *lastnl;		/* Pointer after last newline counted. */
-  static char *lastout;		/* Pointer after last character output;
-  				   NULL if no character has been output
-  				   or if it's conceptually before bufbeg. */
-+ static unsigned long totalnl;	/* Total newline count before lastnl. */
-  static int pending;		/* Pending lines of output. */
-  
-  static void
-***************
-*** 455,461 ****
-    if (out_line)
-      {
-        nlscan(beg);
--       printf("%d%c", ++totalnl, sep);
-        lastnl = lim;
-      }
-    if (out_byte)
---- 465,471 ----
-    if (out_line)
-      {
-        nlscan(beg);
-+       printf("%lu%c", ++totalnl, sep);
-        lastnl = lim;
-      }
-    if (out_byte)
-***************
-*** 611,617 ****
-  
-    for (;;)
-      {
--       if (fillbuf(save) < 0)
-  	{
-  	  error(filename, errno);
-  	  return nlines;
---- 621,627 ----
-  
-    for (;;)
-      {
-+       if (fillbuf(save) == -1)
-  	{
-  	  error(filename, errno);
-  	  return nlines;
-***************
-*** 656,665 ****
-    return nlines;
-  }
-  
-- static char version[] = "GNU grep version 2.0";
-  
-  #define USAGE \
--   "usage: %s [-[[AB] ]<num>] [-[CEFGVchilnqsvwx]] [-[ef]] <expr> [<files...>]\n"
-  
-  static void
-  usage()
---- 666,677 ----
-    return nlines;
-  }
-  
-+ static char version[] = "GNU grep version 2.0\
-+  + multi-byte extension 1.04";
-  
-  #define USAGE \
-+   "usage: %s [-[[AB] ]<num>] [-[CEFGVchilnqsvwx]] [-W ctype=...]\n\
-+             [-[ef]] <expr> [<files...>]\n"
-  
-  static void
-  usage()
-***************
-*** 921,929 ****
-    extern char *optarg;
-    extern int optind;
-  
--   prog = argv[0];
--   if (prog && strrchr(prog, '/'))
--     prog = strrchr(prog, '/') + 1;
-  
-    keys = NULL;
-    keycc = 0;
---- 961,989 ----
-    extern char *optarg;
-    extern int optind;
-  
-+   if ((prog = argv[0]) && prog[0]) {
-+     char c, *p;
-+ #ifdef MSDOS
-+     static char progname[8 + 1];
-+ #endif
-+ 
-+     for (p = prog; (c = *p++); )
-+       if (c == '/'
-+ #ifdef MSDOS
-+ 	  || c == '\\' || c == ':'
-+ #endif
-+ 	  )
-+ 	prog = p;
-+ #ifdef MSDOS
-+     for (p = progname; p < &progname[8] && (c = *prog++) && c != '.'; ) {
-+       if ((unsigned char)(c - 'A') <= (unsigned char)('Z' - 'A'))
-+ 	c += 'a' - 'A';
-+       *p++ = c;
-+     }
-+     *p++ = '\0';
-+     prog = argv[0] = progname;
-+ #endif
-+   }
-  
-    keys = NULL;
-    keycc = 0;
-***************
-*** 934,940 ****
-    suppress_errors = 0;
-    matcher = NULL;
-  
--   while ((opt = getopt(argc, argv, "0123456789A:B:CEFGVX:bce:f:hiLlnqsvwxy"))
-  	 != EOF)
-      switch (opt)
-        {
---- 994,1000 ----
-    suppress_errors = 0;
-    matcher = NULL;
-  
-+   while ((opt = getopt(argc, argv, "0123456789A:B:CEFGVX:bce:f:hiLlnqsvwxyW:"))
-  	 != EOF)
-      switch (opt)
-        {
diff -Nur grep-2.3/src/kwset.c.orig grep-ja-2.3/src/kwset.c.orig
--- grep-2.3/src/kwset.c.orig	Wed Nov  4 06:39:03 1998
+++ grep-ja-2.3/src/kwset.c.orig	Thu Jan  1 09:00:00 1970
@@ -1,802 +0,0 @@
-/* kwset.c - search for any of a set of keywords.
-   Copyright (C) 1989, 1998 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
-
-/* Written August 1989 by Mike Haertel.
-   The author may be reached (Email) at the address mike@ai.mit.edu,
-   or (US mail) as Mike Haertel c/o Free Software Foundation. */
-
-/* The algorithm implemented by these routines bears a startling resemblence
-   to one discovered by Beate Commentz-Walter, although it is not identical.
-   See "A String Matching Algorithm Fast on the Average," Technical Report,
-   IBM-Germany, Scientific Center Heidelberg, Tiergartenstrasse 15, D-6900
-   Heidelberg, Germany.  See also Aho, A.V., and M. Corasick, "Efficient
-   String Matching:  An Aid to Bibliographic Search," CACM June 1975,
-   Vol. 18, No. 6, which describes the failure function used below. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#include <sys/types.h>
-#include "system.h"
-#include "kwset.h"
-#include "obstack.h"
-
-#ifdef GREP
-extern char *xmalloc();
-# undef malloc
-# define malloc xmalloc
-#endif
-
-#define NCHAR (UCHAR_MAX + 1)
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-
-/* Balanced tree of edges and labels leaving a given trie node. */
-struct tree
-{
-  struct tree *llink;		/* Left link; MUST be first field. */
-  struct tree *rlink;		/* Right link (to larger labels). */
-  struct trie *trie;		/* Trie node pointed to by this edge. */
-  unsigned char label;		/* Label on this edge. */
-  char balance;			/* Difference in depths of subtrees. */
-};
-
-/* Node of a trie representing a set of reversed keywords. */
-struct trie
-{
-  unsigned int accepting;	/* Word index of accepted word, or zero. */
-  struct tree *links;		/* Tree of edges leaving this node. */
-  struct trie *parent;		/* Parent of this node. */
-  struct trie *next;		/* List of all trie nodes in level order. */
-  struct trie *fail;		/* Aho-Corasick failure function. */
-  int depth;			/* Depth of this node from the root. */
-  int shift;			/* Shift function for search failures. */
-  int maxshift;			/* Max shift of self and descendents. */
-};
-
-/* Structure returned opaquely to the caller, containing everything. */
-struct kwset
-{
-  struct obstack obstack;	/* Obstack for node allocation. */
-  int words;			/* Number of words in the trie. */
-  struct trie *trie;		/* The trie itself. */
-  int mind;			/* Minimum depth of an accepting node. */
-  int maxd;			/* Maximum depth of any node. */
-  unsigned char delta[NCHAR];	/* Delta table for rapid search. */
-  struct trie *next[NCHAR];	/* Table of children of the root. */
-  char *target;			/* Target string if there's only one. */
-  int mind2;			/* Used in Boyer-Moore search for one string. */
-  char *trans;			/* Character translation table. */
-};
-
-/* prototypes */
-static void enqueue PARAMS((struct tree *, struct trie **));
-static void treefails PARAMS((register struct tree *, struct trie *, struct trie *));
-static void treedelta PARAMS((register struct tree *,register unsigned int, unsigned char *));
-static int  hasevery PARAMS((register struct tree *, register struct tree *));
-static void treenext PARAMS((struct tree *, struct trie **));
-static char * bmexec PARAMS((kwset_t, char *, size_t));
-static char * cwexec PARAMS((kwset_t, char *, size_t, struct kwsmatch *));
-
-/* Allocate and initialize a keyword set object, returning an opaque
-   pointer to it.  Return NULL if memory is not available. */
-kwset_t
-kwsalloc(trans)
-     char *trans;
-{
-  struct kwset *kwset;
-
-  kwset = (struct kwset *) malloc(sizeof (struct kwset));
-  if (!kwset)
-    return 0;
-
-  obstack_init(&kwset->obstack);
-  kwset->words = 0;
-  kwset->trie
-    = (struct trie *) obstack_alloc(&kwset->obstack, sizeof (struct trie));
-  if (!kwset->trie)
-    {
-      kwsfree((kwset_t) kwset);
-      return 0;
-    }
-  kwset->trie->accepting = 0;
-  kwset->trie->links = 0;
-  kwset->trie->parent = 0;
-  kwset->trie->next = 0;
-  kwset->trie->fail = 0;
-  kwset->trie->depth = 0;
-  kwset->trie->shift = 0;
-  kwset->mind = INT_MAX;
-  kwset->maxd = -1;
-  kwset->target = 0;
-  kwset->trans = trans;
-
-  return (kwset_t) kwset;
-}
-
-/* Add the given string to the contents of the keyword set.  Return NULL
-   for success, an error message otherwise. */
-char *
-kwsincr(kws, text, len)
-     kwset_t kws;
-     char *text;
-     size_t len;
-{
-  struct kwset *kwset;
-  register struct trie *trie;
-  register unsigned char label;
-  register struct tree *link;
-  register int depth;
-  struct tree *links[12];
-  enum { L, R } dirs[12];
-  struct tree *t, *r, *l, *rl, *lr;
-
-  kwset = (struct kwset *) kws;
-  trie = kwset->trie;
-  text += len;
-
-  /* Descend the trie (built of reversed keywords) character-by-character,
-     installing new nodes when necessary. */
-  while (len--)
-    {
-      label = kwset->trans ? kwset->trans[(unsigned char) *--text] : *--text;
-
-      /* Descend the tree of outgoing links for this trie node,
-	 looking for the current character and keeping track
-	 of the path followed. */
-      link = trie->links;
-      links[0] = (struct tree *) &trie->links;
-      dirs[0] = L;
-      depth = 1;
-
-      while (link && label != link->label)
-	{
-	  links[depth] = link;
-	  if (label < link->label)
-	    dirs[depth++] = L, link = link->llink;
-	  else
-	    dirs[depth++] = R, link = link->rlink;
-	}
-
-      /* The current character doesn't have an outgoing link at
-	 this trie node, so build a new trie node and install
-	 a link in the current trie node's tree. */
-      if (!link)
-	{
-	  link = (struct tree *) obstack_alloc(&kwset->obstack,
-					       sizeof (struct tree));
-	  if (!link)
-	    return _("memory exhausted");
-	  link->llink = 0;
-	  link->rlink = 0;
-	  link->trie = (struct trie *) obstack_alloc(&kwset->obstack,
-						     sizeof (struct trie));
-	  if (!link->trie)
-	    return _("memory exhausted");
-	  link->trie->accepting = 0;
-	  link->trie->links = 0;
-	  link->trie->parent = trie;
-	  link->trie->next = 0;
-	  link->trie->fail = 0;
-	  link->trie->depth = trie->depth + 1;
-	  link->trie->shift = 0;
-	  link->label = label;
-	  link->balance = 0;
-
-	  /* Install the new tree node in its parent. */
-	  if (dirs[--depth] == L)
-	    links[depth]->llink = link;
-	  else
-	    links[depth]->rlink = link;
-
-	  /* Back up the tree fixing the balance flags. */
-	  while (depth && !links[depth]->balance)
-	    {
-	      if (dirs[depth] == L)
-		--links[depth]->balance;
-	      else
-		++links[depth]->balance;
-	      --depth;
-	    }
-
-	  /* Rebalance the tree by pointer rotations if necessary. */
-	  if (depth && ((dirs[depth] == L && --links[depth]->balance)
-			|| (dirs[depth] == R && ++links[depth]->balance)))
-	    {
-	      switch (links[depth]->balance)
-		{
-		case (char) -2:
-		  switch (dirs[depth + 1])
-		    {
-		    case L:
-		      r = links[depth], t = r->llink, rl = t->rlink;
-		      t->rlink = r, r->llink = rl;
-		      t->balance = r->balance = 0;
-		      break;
-		    case R:
-		      r = links[depth], l = r->llink, t = l->rlink;
-		      rl = t->rlink, lr = t->llink;
-		      t->llink = l, l->rlink = lr, t->rlink = r, r->llink = rl;
-		      l->balance = t->balance != 1 ? 0 : -1;
-		      r->balance = t->balance != (char) -1 ? 0 : 1;
-		      t->balance = 0;
-		      break;
-		    default:
-		      abort ();
-		    }
-		  break;
-		case 2:
-		  switch (dirs[depth + 1])
-		    {
-		    case R:
-		      l = links[depth], t = l->rlink, lr = t->llink;
-		      t->llink = l, l->rlink = lr;
-		      t->balance = l->balance = 0;
-		      break;
-		    case L:
-		      l = links[depth], r = l->rlink, t = r->llink;
-		      lr = t->llink, rl = t->rlink;
-		      t->llink = l, l->rlink = lr, t->rlink = r, r->llink = rl;
-		      l->balance = t->balance != 1 ? 0 : -1;
-		      r->balance = t->balance != (char) -1 ? 0 : 1;
-		      t->balance = 0;
-		      break;
-		    default:
-		      abort ();
-		    }
-		  break;
-		default:
-		  abort ();
-		}
-
-	      if (dirs[depth - 1] == L)
-		links[depth - 1]->llink = t;
-	      else
-		links[depth - 1]->rlink = t;
-	    }
-	}
-
-      trie = link->trie;
-    }
-
-  /* Mark the node we finally reached as accepting, encoding the
-     index number of this word in the keyword set so far. */
-  if (!trie->accepting)
-    trie->accepting = 1 + 2 * kwset->words;
-  ++kwset->words;
-
-  /* Keep track of the longest and shortest string of the keyword set. */
-  if (trie->depth < kwset->mind)
-    kwset->mind = trie->depth;
-  if (trie->depth > kwset->maxd)
-    kwset->maxd = trie->depth;
-
-  return 0;
-}
-
-/* Enqueue the trie nodes referenced from the given tree in the
-   given queue. */
-static void
-enqueue(tree, last)
-     struct tree *tree;
-     struct trie **last;
-{
-  if (!tree)
-    return;
-  enqueue(tree->llink, last);
-  enqueue(tree->rlink, last);
-  (*last) = (*last)->next = tree->trie;
-}
-
-/* Compute the Aho-Corasick failure function for the trie nodes referenced
-   from the given tree, given the failure function for their parent as
-   well as a last resort failure node. */
-static void
-treefails(tree, fail, recourse)
-     register struct tree *tree;
-     struct trie *fail;
-     struct trie *recourse;
-{
-  register struct tree *link;
-
-  if (!tree)
-    return;
-
-  treefails(tree->llink, fail, recourse);
-  treefails(tree->rlink, fail, recourse);
-
-  /* Find, in the chain of fails going back to the root, the first
-     node that has a descendent on the current label. */
-  while (fail)
-    {
-      link = fail->links;
-      while (link && tree->label != link->label)
-	if (tree->label < link->label)
-	  link = link->llink;
-	else
-	  link = link->rlink;
-      if (link)
-	{
-	  tree->trie->fail = link->trie;
-	  return;
-	}
-      fail = fail->fail;
-    }
-
-  tree->trie->fail = recourse;
-}
-
-/* Set delta entries for the links of the given tree such that
-   the preexisting delta value is larger than the current depth. */
-static void
-treedelta(tree, depth, delta)
-     register struct tree *tree;
-     register unsigned int depth;
-     unsigned char delta[];
-{
-  if (!tree)
-    return;
-  treedelta(tree->llink, depth, delta);
-  treedelta(tree->rlink, depth, delta);
-  if (depth < delta[tree->label])
-    delta[tree->label] = depth;
-}
-
-/* Return true if A has every label in B. */
-static int
-hasevery(a, b)
-     register struct tree *a;
-     register struct tree *b;
-{
-  if (!b)
-    return 1;
-  if (!hasevery(a, b->llink))
-    return 0;
-  if (!hasevery(a, b->rlink))
-    return 0;
-  while (a && b->label != a->label)
-    if (b->label < a->label)
-      a = a->llink;
-    else
-      a = a->rlink;
-  return !!a;
-}
-
-/* Compute a vector, indexed by character code, of the trie nodes
-   referenced from the given tree. */
-static void
-treenext(tree, next)
-     struct tree *tree;
-     struct trie *next[];
-{
-  if (!tree)
-    return;
-  treenext(tree->llink, next);
-  treenext(tree->rlink, next);
-  next[tree->label] = tree->trie;
-}
-
-/* Compute the shift for each trie node, as well as the delta
-   table and next cache for the given keyword set. */
-char *
-kwsprep(kws)
-     kwset_t kws;
-{
-  register struct kwset *kwset;
-  register int i;
-  register struct trie *curr, *fail;
-  register char *trans;
-  unsigned char delta[NCHAR];
-  struct trie *last, *next[NCHAR];
-
-  kwset = (struct kwset *) kws;
-
-  /* Initial values for the delta table; will be changed later.  The
-     delta entry for a given character is the smallest depth of any
-     node at which an outgoing edge is labeled by that character. */
-  if (kwset->mind < 256)
-    for (i = 0; i < NCHAR; ++i)
-      delta[i] = kwset->mind;
-  else
-    for (i = 0; i < NCHAR; ++i)
-      delta[i] = 255;
-
-  /* Check if we can use the simple boyer-moore algorithm, instead
-     of the hairy commentz-walter algorithm. */
-  if (kwset->words == 1 && kwset->trans == 0)
-    {
-      /* Looking for just one string.  Extract it from the trie. */
-      kwset->target = obstack_alloc(&kwset->obstack, kwset->mind);
-      for (i = kwset->mind - 1, curr = kwset->trie; i >= 0; --i)
-	{
-	  kwset->target[i] = curr->links->label;
-	  curr = curr->links->trie;
-	}
-      /* Build the Boyer Moore delta.  Boy that's easy compared to CW. */
-      for (i = 0; i < kwset->mind; ++i)
-	delta[(unsigned char) kwset->target[i]] = kwset->mind - (i + 1);
-      kwset->mind2 = kwset->mind;
-      /* Find the minimal delta2 shift that we might make after
-	 a backwards match has failed. */
-      for (i = 0; i < kwset->mind - 1; ++i)
-	if (kwset->target[i] == kwset->target[kwset->mind - 1])
-	  kwset->mind2 = kwset->mind - (i + 1);
-    }
-  else
-    {
-      /* Traverse the nodes of the trie in level order, simultaneously
-	 computing the delta table, failure function, and shift function. */
-      for (curr = last = kwset->trie; curr; curr = curr->next)
-	{
-	  /* Enqueue the immediate descendents in the level order queue. */
-	  enqueue(curr->links, &last);
-
-	  curr->shift = kwset->mind;
-	  curr->maxshift = kwset->mind;
-
-	  /* Update the delta table for the descendents of this node. */
-	  treedelta(curr->links, curr->depth, delta);
-
-	  /* Compute the failure function for the decendents of this node. */
-	  treefails(curr->links, curr->fail, kwset->trie);
-
-	  /* Update the shifts at each node in the current node's chain
-	     of fails back to the root. */
-	  for (fail = curr->fail; fail; fail = fail->fail)
-	    {
-	      /* If the current node has some outgoing edge that the fail
-		 doesn't, then the shift at the fail should be no larger
-		 than the difference of their depths. */
-	      if (!hasevery(fail->links, curr->links))
-		if (curr->depth - fail->depth < fail->shift)
-		  fail->shift = curr->depth - fail->depth;
-
-	      /* If the current node is accepting then the shift at the
-		 fail and its descendents should be no larger than the
-		 difference of their depths. */
-	      if (curr->accepting && fail->maxshift > curr->depth - fail->depth)
-		fail->maxshift = curr->depth - fail->depth;
-	    }
-	}
-
-      /* Traverse the trie in level order again, fixing up all nodes whose
-	 shift exceeds their inherited maxshift. */
-      for (curr = kwset->trie->next; curr; curr = curr->next)
-	{
-	  if (curr->maxshift > curr->parent->maxshift)
-	    curr->maxshift = curr->parent->maxshift;
-	  if (curr->shift > curr->maxshift)
-	    curr->shift = curr->maxshift;
-	}
-
-      /* Create a vector, indexed by character code, of the outgoing links
-	 from the root node. */
-      for (i = 0; i < NCHAR; ++i)
-	next[i] = 0;
-      treenext(kwset->trie->links, next);
-
-      if ((trans = kwset->trans) != 0)
-	for (i = 0; i < NCHAR; ++i)
-	  kwset->next[i] = next[(unsigned char) trans[i]];
-      else
-	for (i = 0; i < NCHAR; ++i)
-	  kwset->next[i] = next[i];
-    }
-
-  /* Fix things up for any translation table. */
-  if ((trans = kwset->trans) != 0)
-    for (i = 0; i < NCHAR; ++i)
-      kwset->delta[i] = delta[(unsigned char) trans[i]];
-  else
-    for (i = 0; i < NCHAR; ++i)
-      kwset->delta[i] = delta[i];
-
-  return 0;
-}
-
-#define U(C) ((unsigned char) (C))
-
-/* Fast boyer-moore search. */
-static char *
-bmexec(kws, text, size)
-     kwset_t kws;
-     char *text;
-     size_t size;
-{
-  struct kwset *kwset;
-  register unsigned char *d1;
-  register char *ep, *sp, *tp;
-  register int d, gc, i, len, md2;
-
-  kwset = (struct kwset *) kws;
-  len = kwset->mind;
-
-  if (len == 0)
-    return text;
-  if (len > size)
-    return 0;
-  if (len == 1)
-    return memchr(text, kwset->target[0], size);
-
-  d1 = kwset->delta;
-  sp = kwset->target + len;
-  gc = U(sp[-2]);
-  md2 = kwset->mind2;
-  tp = text + len;
-
-  /* Significance of 12: 1 (initial offset) + 10 (skip loop) + 1 (md2). */
-  if (size > 12 * len)
-    /* 11 is not a bug, the initial offset happens only once. */
-    for (ep = text + size - 11 * len;;)
-      {
-	while (tp <= ep)
-	  {
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	    if (d == 0)
-	      goto found;
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	    if (d == 0)
-	      goto found;
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	    if (d == 0)
-	      goto found;
-	    d = d1[U(tp[-1])], tp += d;
-	    d = d1[U(tp[-1])], tp += d;
-	  }
-	break;
-      found:
-	if (U(tp[-2]) == gc)
-	  {
-	    for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i)
-	      ;
-	    if (i > len)
-	      return tp - len;
-	  }
-	tp += md2;
-      }
-
-  /* Now we have only a few characters left to search.  We
-     carefully avoid ever producing an out-of-bounds pointer. */
-  ep = text + size;
-  d = d1[U(tp[-1])];
-  while (d <= ep - tp)
-    {
-      d = d1[U((tp += d)[-1])];
-      if (d != 0)
-	continue;
-      if (U(tp[-2]) == gc)
-	{
-	  for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i)
-	    ;
-	  if (i > len)
-	    return tp - len;
-	}
-      d = md2;
-    }
-
-  return 0;
-}
-
-/* Hairy multiple string search. */
-static char *
-cwexec(kws, text, len, kwsmatch)
-     kwset_t kws;
-     char *text;
-     size_t len;
-     struct kwsmatch *kwsmatch;
-{
-  struct kwset *kwset;
-  struct trie **next, *trie, *accept;
-  char *beg, *lim, *mch, *lmch;
-  register unsigned char c, *delta;
-  register int d;
-  register char *end, *qlim;
-  register struct tree *tree;
-  register char *trans;
-
-#ifdef lint
-  accept = NULL;
-#endif
-
-  /* Initialize register copies and look for easy ways out. */
-  kwset = (struct kwset *) kws;
-  if (len < kwset->mind)
-    return 0;
-  next = kwset->next;
-  delta = kwset->delta;
-  trans = kwset->trans;
-  lim = text + len;
-  end = text;
-  if ((d = kwset->mind) != 0)
-    mch = 0;
-  else
-    {
-      mch = text, accept = kwset->trie;
-      goto match;
-    }
-
-  if (len >= 4 * kwset->mind)
-    qlim = lim - 4 * kwset->mind;
-  else
-    qlim = 0;
-
-  while (lim - end >= d)
-    {
-      if (qlim && end <= qlim)
-	{
-	  end += d - 1;
-	  while ((d = delta[c = *end]) && end < qlim)
-	    {
-	      end += d;
-	      end += delta[(unsigned char) *end];
-	      end += delta[(unsigned char) *end];
-	    }
-	  ++end;
-	}
-      else
-	d = delta[c = (end += d)[-1]];
-      if (d)
-	continue;
-      beg = end - 1;
-      trie = next[c];
-      if (trie->accepting)
-	{
-	  mch = beg;
-	  accept = trie;
-	}
-      d = trie->shift;
-      while (beg > text)
-	{
-	  c = trans ? trans[(unsigned char) *--beg] : *--beg;
-	  tree = trie->links;
-	  while (tree && c != tree->label)
-	    if (c < tree->label)
-	      tree = tree->llink;
-	    else
-	      tree = tree->rlink;
-	  if (tree)
-	    {
-	      trie = tree->trie;
-	      if (trie->accepting)
-		{
-		  mch = beg;
-		  accept = trie;
-		}
-	    }
-	  else
-	    break;
-	  d = trie->shift;
-	}
-      if (mch)
-	goto match;
-    }
-  return 0;
-
- match:
-  /* Given a known match, find the longest possible match anchored
-     at or before its starting point.  This is nearly a verbatim
-     copy of the preceding main search loops. */
-  if (lim - mch > kwset->maxd)
-    lim = mch + kwset->maxd;
-  lmch = 0;
-  d = 1;
-  while (lim - end >= d)
-    {
-      if ((d = delta[c = (end += d)[-1]]) != 0)
-	continue;
-      beg = end - 1;
-      if (!(trie = next[c]))
-	{
-	  d = 1;
-	  continue;
-	}
-      if (trie->accepting && beg <= mch)
-	{
-	  lmch = beg;
-	  accept = trie;
-	}
-      d = trie->shift;
-      while (beg > text)
-	{
-	  c = trans ? trans[(unsigned char) *--beg] : *--beg;
-	  tree = trie->links;
-	  while (tree && c != tree->label)
-	    if (c < tree->label)
-	      tree = tree->llink;
-	    else
-	      tree = tree->rlink;
-	  if (tree)
-	    {
-	      trie = tree->trie;
-	      if (trie->accepting && beg <= mch)
-		{
-		  lmch = beg;
-		  accept = trie;
-		}
-	    }
-	  else
-	    break;
-	  d = trie->shift;
-	}
-      if (lmch)
-	{
-	  mch = lmch;
-	  goto match;
-	}
-      if (!d)
-	d = 1;
-    }
-
-  if (kwsmatch)
-    {
-      kwsmatch->index = accept->accepting / 2;
-      kwsmatch->beg[0] = mch;
-      kwsmatch->size[0] = accept->depth;
-    }
-  return mch;
-}
-
-/* Search through the given text for a match of any member of the
-   given keyword set.  Return a pointer to the first character of
-   the matching substring, or NULL if no match is found.  If FOUNDLEN
-   is non-NULL store in the referenced location the length of the
-   matching substring.  Similarly, if FOUNDIDX is non-NULL, store
-   in the referenced location the index number of the particular
-   keyword matched. */
-char *
-kwsexec(kws, text, size, kwsmatch)
-     kwset_t kws;
-     char *text;
-     size_t size;
-     struct kwsmatch *kwsmatch;
-{
-  struct kwset *kwset;
-  char *ret;
-
-  kwset = (struct kwset *) kws;
-  if (kwset->words == 1 && kwset->trans == 0)
-    {
-      ret = bmexec(kws, text, size);
-      if (kwsmatch != 0 && ret != 0)
-	{
-	  kwsmatch->index = 0;
-	  kwsmatch->beg[0] = ret;
-	  kwsmatch->size[0] = kwset->mind;
-	}
-      return ret;
-    }
-  else
-    return cwexec(kws, text, size, kwsmatch);
-}
-
-/* Free the components of the given keyword set. */
-void
-kwsfree(kws)
-     kwset_t kws;
-{
-  struct kwset *kwset;
-
-  kwset = (struct kwset *) kws;
-  obstack_free(&kwset->obstack, 0);
-  free(kws);
-}
diff -Nur grep-2.3/src/kwset.c.rej grep-ja-2.3/src/kwset.c.rej
--- grep-2.3/src/kwset.c.rej	Mon Dec 20 23:07:35 1999
+++ grep-ja-2.3/src/kwset.c.rej	Thu Jan  1 09:00:00 1970
@@ -1,17 +0,0 @@
-***************
-*** 592,598 ****
-        d = d1[U((tp += d)[-1])];
-        if (d != 0)
-  	continue;
--       if (tp[-2] == gc)
-  	{
-  	  for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i)
-  	    ;
---- 594,600 ----
-        d = d1[U((tp += d)[-1])];
-        if (d != 0)
-  	continue;
-+       if (U(tp[-2]) == gc)
-  	{
-  	  for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i)
-  	    ;
diff -Nur grep-2.3/src/mbc.h grep-ja-2.3/src/mbc.h
--- grep-2.3/src/mbc.h	Mon Dec 20 23:07:35 1999
+++ grep-ja-2.3/src/mbc.h	Tue Dec 21 00:05:07 1999
@@ -31,7 +31,9 @@
 extern const unsigned char *mbctab;
 extern int current_mbctype;
 
-void mbcinit _((int));
+// gotom: なんで こういう宣言しているかわからん
+// void mbcinit _((int));
+extern void mbcinit(int);
 
 #define ismbchar(c) mbctab[(unsigned char)c]
 
diff -Nur grep-2.3/src/obstack.h grep-ja-2.3/src/obstack.h
--- grep-2.3/src/obstack.h	Mon Dec 20 23:07:41 1999
+++ grep-ja-2.3/src/obstack.h	Mon Dec 20 23:48:39 1999
@@ -102,6 +102,8 @@
 	  as you would with a stack.)
 */
 
+/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jul. 10, 1993 by t^2  */
 
 /* Don't do the contents of this file more than once.  */
 
@@ -111,7 +113,8 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-
+  // gotom: なんつーか ^L ってなに? (ワラ
+  //
 /* We use subtraction of (char *) 0 instead of casting to int
    because on word-addressable machines a simple cast to int
    may ignore the byte-within-word field of the pointer.  */
@@ -135,11 +138,15 @@
    Otherwise, define just ptrdiff_t, which is all we need.  */
 #ifndef __NeXT__
 #define __need_ptrdiff_t
+  // gotom: なぜ付加されている? 元のソースをチェックしないと。
+  //#ifndef PTR_INT_TYPE
 #endif
 #endif
 
 #include <stddef.h>
 #endif
+  // gotom: ここの endif おかしい?
+  //#endif
 
 #if defined (__STDC__) && __STDC__
 #define PTR_INT_TYPE ptrdiff_t
@@ -167,7 +174,9 @@
 
 struct obstack		/* control current object in current chunk */
 {
-  long	chunk_size;		/* preferred size to allocate chunks in */
+  // gotom: ここは long -> unsigned になっているが,
+  // unsigned long の方がよいのではないだろうか??
+  unsigned chunk_size;		/* preferred size to allocate chunks in */
   struct _obstack_chunk *chunk;	/* address of current struct obstack_chunk */
   char	*object_base;		/* address of object we are building */
   char	*next_free;		/* where to add next char to current object */
diff -Nur grep-2.3/src/obstack.h.orig grep-ja-2.3/src/obstack.h.orig
--- grep-2.3/src/obstack.h.orig	Wed Nov  4 06:39:03 1998
+++ grep-ja-2.3/src/obstack.h.orig	Thu Jan  1 09:00:00 1970
@@ -1,591 +0,0 @@
-/* obstack.h - object stack macros
-   Copyright (C) 1988,89,90,91,92,93,94,96,97, 98 Free Software Foundation, Inc.
-
-   the C library, however.  The master source lives in /gd/gnu/lib.
-
-NOTE: The canonical source of this file is maintained with the
-GNU C Library.  Bugs can be reported to bug-glibc@prep.ai.mit.edu.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software Foundation,
-Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Summary:
-
-All the apparent functions defined here are macros. The idea
-is that you would use these pre-tested macros to solve a
-very specific set of problems, and they would run fast.
-Caution: no side-effects in arguments please!! They may be
-evaluated MANY times!!
-
-These macros operate a stack of objects.  Each object starts life
-small, and may grow to maturity.  (Consider building a word syllable
-by syllable.)  An object can move while it is growing.  Once it has
-been "finished" it never changes address again.  So the "top of the
-stack" is typically an immature growing object, while the rest of the
-stack is of mature, fixed size and fixed address objects.
-
-These routines grab large chunks of memory, using a function you
-supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
-by calling `obstack_chunk_free'.  You must define them and declare
-them before using any obstack macros.
-
-Each independent stack is represented by a `struct obstack'.
-Each of the obstack macros expects a pointer to such a structure
-as the first argument.
-
-One motivation for this package is the problem of growing char strings
-in symbol tables.  Unless you are "fascist pig with a read-only mind"
---Gosper's immortal quote from HAKMEM item 154, out of context--you
-would not like to put any arbitrary upper limit on the length of your
-symbols.
-
-In practice this often means you will build many short symbols and a
-few long symbols.  At the time you are reading a symbol you don't know
-how long it is.  One traditional method is to read a symbol into a
-buffer, realloc()ating the buffer every time you try to read a symbol
-that is longer than the buffer.  This is beaut, but you still will
-want to copy the symbol from the buffer to a more permanent
-symbol-table entry say about half the time.
-
-With obstacks, you can work differently.  Use one obstack for all symbol
-names.  As you read a symbol, grow the name in the obstack gradually.
-When the name is complete, finalize it.  Then, if the symbol exists already,
-free the newly read name.
-
-The way we do this is to take a large chunk, allocating memory from
-low addresses.  When you want to build a symbol in the chunk you just
-add chars above the current "high water mark" in the chunk.  When you
-have finished adding chars, because you got to the end of the symbol,
-you know how long the chars are, and you can create a new object.
-Mostly the chars will not burst over the highest address of the chunk,
-because you would typically expect a chunk to be (say) 100 times as
-long as an average object.
-
-In case that isn't clear, when we have enough chars to make up
-the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
-so we just point to it where it lies.  No moving of chars is
-needed and this is the second win: potentially long strings need
-never be explicitly shuffled. Once an object is formed, it does not
-change its address during its lifetime.
-
-When the chars burst over a chunk boundary, we allocate a larger
-chunk, and then copy the partly formed object from the end of the old
-chunk to the beginning of the new larger chunk.  We then carry on
-accreting characters to the end of the object as we normally would.
-
-A special macro is provided to add a single char at a time to a
-growing object.  This allows the use of register variables, which
-break the ordinary 'growth' macro.
-
-Summary:
-	We allocate large chunks.
-	We carve out one object at a time from the current chunk.
-	Once carved, an object never moves.
-	We are free to append data of any size to the currently
-	  growing object.
-	Exactly one object is growing in an obstack at any one time.
-	You can run one obstack per control block.
-	You may have as many control blocks as you dare.
-	Because of the way we do it, you can `unwind' an obstack
-	  back to a previous state. (You may remove objects much
-	  as you would with a stack.)
-*/
-
-
-/* Don't do the contents of this file more than once.  */
-
-#ifndef _OBSTACK_H
-#define _OBSTACK_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* We use subtraction of (char *) 0 instead of casting to int
-   because on word-addressable machines a simple cast to int
-   may ignore the byte-within-word field of the pointer.  */
-
-#ifndef __PTR_TO_INT
-#define __PTR_TO_INT(P) ((P) - (char *) 0)
-#endif
-
-#ifndef __INT_TO_PTR
-#define __INT_TO_PTR(P) ((P) + (char *) 0)
-#endif
-
-/* We need the type of the resulting object.  In ANSI C it is ptrdiff_t
-   but in traditional C it is usually long.  If we are in ANSI C and
-   don't already have ptrdiff_t get it.  */
-
-#if defined (__STDC__) && __STDC__ && ! defined (offsetof)
-#if defined (__GNUC__) && defined (IN_GCC)
-/* On Next machine, the system's stddef.h screws up if included
-   after we have defined just ptrdiff_t, so include all of stddef.h.
-   Otherwise, define just ptrdiff_t, which is all we need.  */
-#ifndef __NeXT__
-#define __need_ptrdiff_t
-#endif
-#endif
-
-#include <stddef.h>
-#endif
-
-#if defined (__STDC__) && __STDC__
-#define PTR_INT_TYPE ptrdiff_t
-#else
-#define PTR_INT_TYPE long
-#endif
-
-#if defined (_LIBC) || defined (HAVE_STRING_H)
-#include <string.h>
-#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-#ifdef memcpy
-#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-#define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
-#endif
-#endif
-
-struct _obstack_chunk		/* Lives at front of each chunk. */
-{
-  char  *limit;			/* 1 past end of this chunk */
-  struct _obstack_chunk *prev;	/* address of prior chunk or NULL */
-  char	contents[4];		/* objects begin here */
-};
-
-struct obstack		/* control current object in current chunk */
-{
-  long	chunk_size;		/* preferred size to allocate chunks in */
-  struct _obstack_chunk *chunk;	/* address of current struct obstack_chunk */
-  char	*object_base;		/* address of object we are building */
-  char	*next_free;		/* where to add next char to current object */
-  char	*chunk_limit;		/* address of char after current chunk */
-  PTR_INT_TYPE temp;		/* Temporary for some macros.  */
-  int   alignment_mask;		/* Mask of alignment for each object. */
-#if defined (__STDC__) && __STDC__
-  /* These prototypes vary based on `use_extra_arg', and we use
-     casts to the prototypeless function type in all assignments,
-     but having prototypes here quiets -Wstrict-prototypes.  */
-  struct _obstack_chunk *(*chunkfun) (void *, long);
-  void (*freefun) (void *, struct _obstack_chunk *);
-  void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-#else
-  struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
-  void (*freefun) ();		/* User's function to free a chunk.  */
-  char *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-#endif
-  unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
-  unsigned maybe_empty_object:1;/* There is a possibility that the current
-				   chunk contains a zero-length object.  This
-				   prevents freeing the chunk if we allocate
-				   a bigger chunk to replace it. */
-  unsigned alloc_failed:1;	/* No longer used, as we now call the failed
-				   handler on error, but retained for binary
-				   compatibility.  */
-};
-
-/* Declare the external functions we use; they are in obstack.c.  */
-
-#if defined (__STDC__) && __STDC__
-extern void _obstack_newchunk (struct obstack *, int);
-extern void _obstack_free (struct obstack *, void *);
-extern int _obstack_begin (struct obstack *, int, int,
-			    void *(*) (long), void (*) (void *));
-extern int _obstack_begin_1 (struct obstack *, int, int,
-			     void *(*) (void *, long),
-			     void (*) (void *, void *), void *);
-extern int _obstack_memory_used (struct obstack *);
-#else
-extern void _obstack_newchunk ();
-extern void _obstack_free ();
-extern int _obstack_begin ();
-extern int _obstack_begin_1 ();
-extern int _obstack_memory_used ();
-#endif
-
-#if defined (__STDC__) && __STDC__
-
-/* Do the function-declarations after the structs
-   but before defining the macros.  */
-
-void obstack_init (struct obstack *obstack);
-
-void * obstack_alloc (struct obstack *obstack, int size);
-
-void * obstack_copy (struct obstack *obstack, void *address, int size);
-void * obstack_copy0 (struct obstack *obstack, void *address, int size);
-
-void obstack_free (struct obstack *obstack, void *block);
-
-void obstack_blank (struct obstack *obstack, int size);
-
-void obstack_grow (struct obstack *obstack, void *data, int size);
-void obstack_grow0 (struct obstack *obstack, void *data, int size);
-
-void obstack_1grow (struct obstack *obstack, int data_char);
-void obstack_ptr_grow (struct obstack *obstack, void *data);
-void obstack_int_grow (struct obstack *obstack, int data);
-
-void * obstack_finish (struct obstack *obstack);
-
-int obstack_object_size (struct obstack *obstack);
-
-int obstack_room (struct obstack *obstack);
-void obstack_make_room (struct obstack *obstack, int size);
-void obstack_1grow_fast (struct obstack *obstack, int data_char);
-void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
-void obstack_int_grow_fast (struct obstack *obstack, int data);
-void obstack_blank_fast (struct obstack *obstack, int size);
-
-void * obstack_base (struct obstack *obstack);
-void * obstack_next_free (struct obstack *obstack);
-int obstack_alignment_mask (struct obstack *obstack);
-int obstack_chunk_size (struct obstack *obstack);
-int obstack_memory_used (struct obstack *obstack);
-
-#endif /* __STDC__ */
-
-/* Non-ANSI C cannot really support alternative functions for these macros,
-   so we do not declare them.  */
-
-/* Error handler called when `obstack_chunk_alloc' failed to allocate
-   more memory.  This can be set to a user defined function.  The
-   default action is to print a message and abort.  */
-#if defined (__STDC__) && __STDC__
-extern void (*obstack_alloc_failed_handler) (void);
-#else
-extern void (*obstack_alloc_failed_handler) ();
-#endif
-
-/* Exit value used when `print_and_abort' is used.  */
-extern int obstack_exit_failure;
-
-/* Pointer to beginning of object being allocated or to be allocated next.
-   Note that this might not be the final address of the object
-   because a new chunk might be needed to hold the final size.  */
-
-#define obstack_base(h) ((h)->object_base)
-
-/* Size for allocating ordinary chunks.  */
-
-#define obstack_chunk_size(h) ((h)->chunk_size)
-
-/* Pointer to next byte not yet allocated in current chunk.  */
-
-#define obstack_next_free(h)	((h)->next_free)
-
-/* Mask specifying low bits that should be clear in address of an object.  */
-
-#define obstack_alignment_mask(h) ((h)->alignment_mask)
-
-/* To prevent prototype warnings provide complete argument list in
-   standard C version.  */
-#if defined (__STDC__) && __STDC__
-
-#define obstack_init(h) \
-  _obstack_begin ((h), 0, 0, \
-		  (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
-
-#define obstack_begin(h, size) \
-  _obstack_begin ((h), (size), 0, \
-		  (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
-
-#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
-  _obstack_begin ((h), (size), (alignment), \
-		    (void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
-
-#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
-  _obstack_begin_1 ((h), (size), (alignment), \
-		    (void *(*) (void *, long)) (chunkfun), \
-		    (void (*) (void *, void *)) (freefun), (arg))
-
-#define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
-
-#define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
-
-#else
-
-#define obstack_init(h) \
-  _obstack_begin ((h), 0, 0, \
-		  (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
-
-#define obstack_begin(h, size) \
-  _obstack_begin ((h), (size), 0, \
-		  (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
-
-#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
-  _obstack_begin ((h), (size), (alignment), \
-		    (void *(*) ()) (chunkfun), (void (*) ()) (freefun))
-
-#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
-  _obstack_begin_1 ((h), (size), (alignment), \
-		    (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg))
-
-#define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
-
-#define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)()) (newfreefun))
-
-#endif
-
-#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
-
-#define obstack_blank_fast(h,n) ((h)->next_free += (n))
-
-#define obstack_memory_used(h) _obstack_memory_used (h)
-
-#if defined (__GNUC__) && defined (__STDC__) && __STDC__
-/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
-   does not implement __extension__.  But that compiler doesn't define
-   __GNUC_MINOR__.  */
-#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
-#define __extension__
-#endif
-
-/* For GNU C, if not -traditional,
-   we can define these macros to compute all args only once
-   without using a global variable.
-   Also, we can avoid using the `temp' slot, to make faster code.  */
-
-#define obstack_object_size(OBSTACK)					\
-  __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (unsigned) (__o->next_free - __o->object_base); })
-
-#define obstack_room(OBSTACK)						\
-  __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (unsigned) (__o->chunk_limit - __o->next_free); })
-
-#define obstack_make_room(OBSTACK,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   (void) 0; })
-
-#define obstack_grow(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len);					\
-   _obstack_memcpy (__o->next_free, (char *) (where), __len);		\
-   __o->next_free += __len;						\
-   (void) 0; })
-
-#define obstack_grow0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len + 1 > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len + 1);				\
-   _obstack_memcpy (__o->next_free, (char *) (where), __len);		\
-   __o->next_free += __len;						\
-   *(__o->next_free)++ = 0;						\
-   (void) 0; })
-
-#define obstack_1grow(OBSTACK,datum)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + 1 > __o->chunk_limit)				\
-     _obstack_newchunk (__o, 1);					\
-   *(__o->next_free)++ = (datum);					\
-   (void) 0; })
-
-/* These assume that the obstack alignment is good enough for pointers or ints,
-   and that the data added so far to the current object
-   shares that much alignment.  */
-
-#define obstack_ptr_grow(OBSTACK,datum)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (void *));				\
-   *((void **)__o->next_free)++ = ((void *)datum);			\
-   (void) 0; })
-
-#define obstack_int_grow(OBSTACK,datum)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (int));				\
-   *((int *)__o->next_free)++ = ((int)datum);				\
-   (void) 0; })
-
-#define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
-#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
-
-#define obstack_blank(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   __o->next_free += __len;						\
-   (void) 0; })
-
-#define obstack_alloc(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_blank (__h, (length));					\
-   obstack_finish (__h); })
-
-#define obstack_copy(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-#define obstack_copy0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow0 (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-/* The local variable is named __o1 to avoid a name conflict
-   when obstack_blank is called.  */
-#define obstack_finish(OBSTACK)  					\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   void *value;								\
-   value = (void *) __o1->object_base;					\
-   if (__o1->next_free == value)					\
-     __o1->maybe_empty_object = 1;					\
-   __o1->next_free							\
-     = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
-		     & ~ (__o1->alignment_mask));			\
-   if (__o1->next_free - (char *)__o1->chunk				\
-       > __o1->chunk_limit - (char *)__o1->chunk)			\
-     __o1->next_free = __o1->chunk_limit;				\
-   __o1->object_base = __o1->next_free;					\
-   value; })
-
-#define obstack_free(OBSTACK, OBJ)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   void *__obj = (OBJ);							\
-   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
-     __o->next_free = __o->object_base = __obj;				\
-   else (obstack_free) (__o, __obj); })
-
-#else /* not __GNUC__ or not __STDC__ */
-
-#define obstack_object_size(h) \
- (unsigned) ((h)->next_free - (h)->object_base)
-
-#define obstack_room(h)		\
- (unsigned) ((h)->chunk_limit - (h)->next_free)
-
-/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
-   so that we can avoid having void expressions
-   in the arms of the conditional expression.
-   Casting the third operand to void was tried before,
-   but some compilers won't accept it.  */
-
-#define obstack_make_room(h,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
-
-#define obstack_grow(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp),	\
-  (h)->next_free += (h)->temp)
-
-#define obstack_grow0(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp),	\
-  (h)->next_free += (h)->temp,						\
-  *((h)->next_free)++ = 0)
-
-#define obstack_1grow(h,datum)						\
-( (((h)->next_free + 1 > (h)->chunk_limit)				\
-   ? (_obstack_newchunk ((h), 1), 0) : 0),				\
-  (*((h)->next_free)++ = (datum)))
-
-#define obstack_ptr_grow(h,datum)					\
-( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
-  (*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
-
-#define obstack_int_grow(h,datum)					\
-( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
-  (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
-
-#define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
-#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
-
-#define obstack_blank(h,length)						\
-( (h)->temp = (length),							\
-  (((h)->chunk_limit - (h)->next_free < (h)->temp)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  ((h)->next_free += (h)->temp))
-
-#define obstack_alloc(h,length)						\
- (obstack_blank ((h), (length)), obstack_finish ((h)))
-
-#define obstack_copy(h,where,length)					\
- (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
-
-#define obstack_copy0(h,where,length)					\
- (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
-
-#define obstack_finish(h)  						\
-( ((h)->next_free == (h)->object_base					\
-   ? (((h)->maybe_empty_object = 1), 0)					\
-   : 0),								\
-  (h)->temp = __PTR_TO_INT ((h)->object_base),				\
-  (h)->next_free							\
-    = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)	\
-		    & ~ ((h)->alignment_mask)),				\
-  (((h)->next_free - (char *) (h)->chunk				\
-    > (h)->chunk_limit - (char *) (h)->chunk)				\
-   ? ((h)->next_free = (h)->chunk_limit) : 0),				\
-  (h)->object_base = (h)->next_free,					\
-  __INT_TO_PTR ((h)->temp))
-
-#if defined (__STDC__) && __STDC__
-#define obstack_free(h,obj)						\
-( (h)->temp = (char *) (obj) - (char *) (h)->chunk,			\
-  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
-   ? (int) ((h)->next_free = (h)->object_base				\
-	    = (h)->temp + (char *) (h)->chunk)				\
-   : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
-#else
-#define obstack_free(h,obj)						\
-( (h)->temp = (char *) (obj) - (char *) (h)->chunk,			\
-  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
-   ? (int) ((h)->next_free = (h)->object_base				\
-	    = (h)->temp + (char *) (h)->chunk)				\
-   : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
-#endif
-
-#endif /* not __GNUC__ or not __STDC__ */
-
-#ifdef __cplusplus
-}	/* C++ */
-#endif
-
-#endif /* obstack.h */
diff -Nur grep-2.3/src/obstack.h.rej grep-ja-2.3/src/obstack.h.rej
--- grep-2.3/src/obstack.h.rej	Mon Dec 20 23:07:41 1999
+++ grep-ja-2.3/src/obstack.h.rej	Thu Jan  1 09:00:00 1970
@@ -1,61 +0,0 @@
-***************
-*** 14,19 ****
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
-  
-  /* Summary:
-  
---- 14,21 ----
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
-+ /* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jul. 10, 1993 by t^2  */
-  
-  /* Summary:
-  
-***************
-*** 135,145 ****
-  #endif
-  #endif
-  
-  #ifdef __STDC__
-  #define PTR_INT_TYPE ptrdiff_t
-  #else
-  #define PTR_INT_TYPE long
-  #endif
-  
-  struct _obstack_chunk		/* Lives at front of each chunk. */
-  {
---- 137,149 ----
-  #endif
-  #endif
-  
-+ #ifndef PTR_INT_TYPE
-  #ifdef __STDC__
-  #define PTR_INT_TYPE ptrdiff_t
-  #else
-  #define PTR_INT_TYPE long
-  #endif
-+ #endif
-  
-  struct _obstack_chunk		/* Lives at front of each chunk. */
-  {
-***************
-*** 150,156 ****
-  
-  struct obstack		/* control current object in current chunk */
-  {
--   long	chunk_size;		/* preferred size to allocate chunks in */
-    struct _obstack_chunk* chunk;	/* address of current struct obstack_chunk */
-    char	*object_base;		/* address of object we are building */
-    char	*next_free;		/* where to add next char to current object */
---- 154,160 ----
-  
-  struct obstack		/* control current object in current chunk */
-  {
-+   unsigned chunk_size;		/* preferred size to allocate chunks in */
-    struct _obstack_chunk* chunk;	/* address of current struct obstack_chunk */
-    char	*object_base;		/* address of object we are building */
-    char	*next_free;		/* where to add next char to current object */
diff -Nur grep-2.3/src/regex.c grep-ja-2.3/src/regex.c
--- grep-2.3/src/regex.c	Mon Dec 20 23:07:44 1999
+++ grep-ja-2.3/src/regex.c	Mon Dec 20 23:48:43 1999
@@ -18,6 +18,8 @@
    License along with the GNU C Library; see the file COPYING.LIB.  If not,
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
+/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Aug. 19, 1993 by t^2  */
 
 /* AIX requires this to be the first thing in the file. */
 #if defined _AIX && !defined REGEX_MALLOC
@@ -621,6 +623,10 @@
 
 /* We use standard I/O for debugging.  */
 # include <stdio.h>
+	      if (ismbchar (*p) && 2 <= mcnt) {
+		printf ("/%.2s", (char *) p), p += 2, --mcnt;
+		continue;
+	      }
 
 /* It is useful to test things that ``must'' be true when debugging.  */
 # include <assert.h>
@@ -1229,6 +1235,161 @@
 
 /* This pushes an integer-valued item onto the failure stack.
    Assumes the variable `fail_stack'.  Probably should only
+/* Handle charset(_not)?.
+
+   Structure of charset(_not)? in compiled pattern.
+
+     struct {
+       unsinged char id;		charset(_not)?
+       unsigned char sbc_size;
+       unsigned char sbc_map[sbc_size];	same as original up to here.
+       unsigned short mbc_size;		number of intervals.
+       struct {
+	 unsigned short beg;		beginning of interval.
+	 unsigned short end;		end of interval.
+       } intervals[mbc_size];
+     }; */
+
+static reg_errcode_t
+#ifdef __STDC__
+set_list_bits (unsigned short c1, unsigned short c2,
+	       reg_syntax_t syntax, unsigned char *b, const char *translate)
+#else
+set_list_bits (c1, c2, syntax, b, translate)
+     unsigned short c1, c2;
+     reg_syntax_t syntax;
+     unsigned char *b;
+     const char *translate;
+#endif
+{
+  unsigned char sbc_size = b[-1];
+  unsigned short mbc_size = EXTRACT_UNSIGNED (&b[sbc_size]);
+  unsigned short beg, end, upb;
+
+  if (c1 > c2)
+    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+  if (c1 < 1 << BYTEWIDTH) {
+    upb = c2;
+    if (1 << BYTEWIDTH <= upb)
+      upb = (1 << BYTEWIDTH) - 1;	/* The last single-byte char */
+    if (sbc_size <= upb / BYTEWIDTH) {
+      /* Allocate maximum size so it never happens again.  */
+      /* NOTE: memcpy() would not work here.  */
+      bcopy (&b[sbc_size], &b[(1 << BYTEWIDTH) / BYTEWIDTH], 2 + mbc_size*4);
+      bzero (&b[sbc_size], (1 << BYTEWIDTH) / BYTEWIDTH - sbc_size);
+      b[-1] = sbc_size = (1 << BYTEWIDTH) / BYTEWIDTH;
+    }
+    if (!translate) {
+      for (; c1 <= upb; c1++)
+	if (!ismbchar (c1))
+	  SET_LIST_BIT (c1);
+    }
+    else
+      for (; c1 <= upb; c1++)
+	if (!ismbchar (c1))
+	  SET_LIST_BIT (TRANSLATE (c1));
+    if (c2 < 1 << BYTEWIDTH)
+      return REG_NOERROR;
+    c1 = 0x8000;			/* The first wide char */
+  }
+  b = &b[sbc_size + 2];
+
+  /*                             intervals[beg]
+         ●----------●          ●----------●
+                         c1
+                       ○----------------------●
+
+     上図のような区間のインデックス beg を決定する. */
+  for (beg = 0, upb = mbc_size; beg < upb; ) {
+    unsigned short mid = (beg + upb) >> 1;
+
+    if (c1 - 1 > EXTRACT_MBC (&b[mid*4 + 2]))
+      beg = mid + 1;
+    else
+      upb = mid;
+  }
+
+  /*                        intervals[end]
+           ●-------●      ●----------●
+                        c2
+         ●---------------○
+
+     上図のような区間のインデックス end を決定する. */
+  for (end = beg, upb = mbc_size; end < upb; ) {
+    unsigned short mid = (end + upb) >> 1;
+
+    if (c2 >= EXTRACT_MBC (&b[mid*4]) - 1)
+      end = mid + 1;
+    else
+      upb = mid;
+  }
+
+  if (beg != end) {
+    /* 既存の区間を少なくとも1つ統合する場合,
+       区間の始点, 終点を修正する. */
+    if (c1 > EXTRACT_MBC (&b[beg*4]))
+      c1 = EXTRACT_MBC (&b[beg*4]);
+    if (c2 < EXTRACT_MBC (&b[end*4 - 2]))
+      c2 = EXTRACT_MBC (&b[end*4 - 2]);
+  }
+  if (end < mbc_size && end != beg + 1)
+    /* 追加される区間の後ろに既存の区間を移動する. */
+    /* NOTE: memcpy() would not work here.  */
+    bcopy (&b[end*4], &b[(beg + 1)*4], (mbc_size - end)*4);
+  STORE_MBC (&b[beg*4 + 0], c1);
+  STORE_MBC (&b[beg*4 + 2], c2);
+  mbc_size += beg + 1 - end;
+  STORE_NUMBER (&b[-2], mbc_size);
+  return REG_NOERROR;
+}
+
+static int
+#ifdef __STDC__
+is_in_list (unsigned short c, const unsigned char *b)
+#else
+is_in_list (c, b)
+     unsigned short c;
+     const unsigned char *b;
+#endif
+{
+  unsigned short size;
+  int in = (re_opcode_t) b[-1] == charset_not;
+
+  size = *b++;
+  if (c < 1 << BYTEWIDTH) {
+    if (c / BYTEWIDTH < size && b[c / BYTEWIDTH] & 1 << c % BYTEWIDTH)
+      in = !in;
+  }
+  else {
+    unsigned short i, j;
+
+    b += size + 2;
+    size = EXTRACT_UNSIGNED (&b[-2]);
+
+    /*                        intervals[i]
+             ●-------●      ●--------●
+                        c
+                      ○----------------●
+
+     上図のような区間のインデックス i を決定する. */
+    for (i = 0, j = size; i < j; ) {
+      unsigned short k = (i + j) >> 1;
+
+      if (c > EXTRACT_MBC (&b[k*4 + 2]))
+	i = k + 1;
+      else
+	j = k;
+    }
+    if (i < size && EXTRACT_MBC (&b[i*4]) <= c
+	/* [...] から, 無効なマルチバイト文字を除外する.  ここでは簡単の
+	   ため２バイト目が '\n' または '\0' だけを無効とした.  [^...] 
+	   の場合は, 逆に無効なマルチバイト文字をマッチさせる.  */
+	&& ((unsigned char) c != '\n' && (unsigned char) c != '\0'))
+      in = !in;
+  }
+  return in;
+}
+
    be called from within `PUSH_FAILURE_POINT'.  */
 #define PUSH_FAILURE_INT(item)					\
   fail_stack.stack[fail_stack.avail++].integer = (item)
@@ -1545,7 +1706,11 @@
 # define PATFETCH(c)							\
   do {if (p == pend) return REG_EEND;					\
     c = (unsigned char) *p++;						\
-    if (translate) c = (unsigned char) translate[c];			\
+// gotom patched.
+//    if (translate) c = (unsigned char) translate[c];			\
+    if (translate && !ismbchar (c))					\
+      c = (unsigned char) translate[(unsigned char) c];			\
+// gotom ここまで
   } while (0)
 #endif
 
@@ -1566,7 +1731,10 @@
    when we use a character as a subscript we must make it unsigned.  */
 #ifndef TRANSLATE
 # define TRANSLATE(d) \
-  (translate ? (char) translate[(unsigned char) (d)] : (d))
+// gotom modified
+//  (translate ? (char) translate[(unsigned char) (d)] : (d))
+  (translate ? (unsigned char) translate[(unsigned char) (d)] : (d))
+// ここまで
 #endif
 
 
@@ -2135,12 +2303,15 @@
         case '[':
           {
             boolean had_char_class = false;
+	    unsigned short c, c1;
+	    int last_char = -1;
 
             if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
 
             /* Ensure that we have enough space to push a charset: the
                opcode, the length count, and the bitset; 34 bytes in all.  */
-	    GET_BUFFER_SPACE (34);
+	    /* + 2 + 4 for mbcharset(_not)? with just one interval.  */
+	    GET_BUFFER_SPACE (34 + 2 + 4);
 
             laststart = b;
 
@@ -2167,17 +2338,39 @@
             /* Read in characters and ranges, setting map bits.  */
             for (;;)
               {
+		// gotom added
+		int size;
+		// gotom end
+
                 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
 
-                PATFETCH (c);
+		// gotom added
+		if ((size = EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])))
+		  /* Ensure the space is enough to hold another interval
+		     of multi-byte chars in charset(_not)?.  */
+		  GET_BUFFER_SPACE (32 + 2 + size*4 + 4);
+
+		PATFETCH_RAW (c);
+		// gotom end 
+//                PATFETCH (c);
 
                 /* \ might escape characters inside [...] and [^...].  */
                 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
                   {
                     if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
 
-                    PATFETCH (c1);
-                    SET_LIST_BIT (c1);
+		    PATFETCH_RAW (c1);
+		    if (ismbchar (c1)) {
+		      unsigned char c2;
+
+		      PATFETCH_RAW (c2);
+		      c1 = c1 << 8 | c2;
+		      (void) set_list_bits (c1, c1, syntax, b, translate);
+		      last_char = c1;
+		      continue;
+		    }
+		    SET_LIST_BIT (TRANSLATE (c1));
+		    last_char = c1;
                     continue;
                   }
 
@@ -2187,6 +2380,13 @@
                 if (c == ']' && p != p1 + 1)
                   break;
 
+		if (ismbchar (c)) {
+		  unsigned char c2;
+
+		  PATFETCH_RAW (c2);
+		  c = c << 8 | c2;
+		}
+
                 /* Look ahead to see if it's a range when the last thing
                    was a character class.  */
                 if (had_char_class && c == '-' && *p != ']')
@@ -2197,12 +2397,33 @@
                    beginning or the end of a list, then it's the range
                    operator.  */
                 if (c == '-'
+		    // gotom added 
+#if 0 /* The original was: */
                     && !(p - 2 >= pattern && p[-2] == '[')
                     && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+#else /* I wonder why he did not write like this.
+	 Have we got any problems?  */
+		    && p != p1 + 1
+#endif
+		    // gotom end
                     && *p != ']')
                   {
-                    reg_errcode_t ret
-                      = compile_range (&p, pend, translate, syntax, b);
+                    //reg_errcode_t ret
+		    //                      = compile_range (&p, pend, translate, syntax, b);
+		    // gotom added 
+		    reg_errcode_t ret;
+
+		    assert (last_char >= 0);
+		    PATFETCH_RAW (c1);
+		    if (ismbchar (c1)) {
+		      unsigned char c2;
+
+		      PATFETCH_RAW (c2);
+		      c1 = c1 << 8 | c2;
+		    }
+		    ret = set_list_bits (last_char, c1, syntax, b, translate);
+		    last_char = c1;
+		    // gotom end
                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
                   }
 
@@ -2211,9 +2432,22 @@
                     reg_errcode_t ret;
 
 		    /* Move past the `-'.  */
-                    PATFETCH (c1);
+                    //PATFETCH (c1);
+		    //
+                    //ret = compile_range (&p, pend, translate, syntax, b);
+		    // gotom added 
+		    PATFETCH_RAW (c1);
+
+		    PATFETCH_RAW (c1);
+		    if (ismbchar (c1)) {
+		      unsigned char c2;
 
-                    ret = compile_range (&p, pend, translate, syntax, b);
+		      PATFETCH_RAW (c2);
+		      c1 = c1 << 8 | c2;
+		    }
+		    ret = set_list_bits (c, c1, syntax, b, translate);
+		    last_char = c1;
+		    // gotom end
                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
                   }
 
@@ -2335,15 +2569,22 @@
                         c1++;
                         while (c1--)
                           PATUNFETCH;
+#if 0 /* The original was: */
                         SET_LIST_BIT ('[');
                         SET_LIST_BIT (':');
+#else /* I think this is the right way.  */
+			SET_LIST_BIT (TRANSLATE ('['));
+			SET_LIST_BIT (TRANSLATE (':'));
+#endif
                         had_char_class = false;
+			last_char = ':';
                       }
                   }
                 else
                   {
                     had_char_class = false;
-                    SET_LIST_BIT (c);
+		    (void) set_list_bits (c, c, syntax, b, translate);
+		    last_char = c;
                   }
               }
 
@@ -2351,7 +2592,11 @@
                end of the map.  Decrease the map-length byte too.  */
             while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
               b[-1]--;
-            b += b[-1];
+	    if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH)
+	      bcopy (&b[(1 << BYTEWIDTH) / BYTEWIDTH], &b[b[-1]],
+		     2 + EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])*4);
+	    b += b[-1] + 2 + EXTRACT_UNSIGNED (&b[b[-1]])*4;
+	    break;
           }
           break;
 
@@ -2883,6 +3128,12 @@
 	      pending_exact = b - 1;
             }
 
+	  // gotom added
+	  if (c1) {
+	    BUF_PUSH (c1);
+	    (*pending_exact)++;
+	  }
+	  // gotom end
 	  BUF_PUSH (c);
           (*pending_exact)++;
 	  break;
@@ -3720,11 +3971,42 @@
         break;
       else if (range > 0)
         {
-          range--;
-          startpos++;
+	  // gotom added 
+	  const char *d = ((startpos >= size1 ? string2 - size1 : string1)
+			   + startpos);
+
+	  if (ismbchar (*d)) {
+	    range--, startpos++;
+	    if (!range)
+	      break;
+	  }
+          range--, startpos++;
+	  // gotom end
+	  //          range--;
+	  //          startpos++;
         }
       else
         {
+	  // gotom added
+          range++, startpos--;
+	  {
+	    const char *s, *d, *p;
+
+	    if (startpos < size1)
+	      s = string1, d = string1 + startpos;
+	    else
+	      s = string2, d = string2 + startpos - size1;
+	    for (p = d; p-- > s && ismbchar(*p); )
+	      /* --p >= s だと 80[12]?86 で動かない可能性がある.  (huge
+		 model 以外で, s のオフセットが 0 だった場合.)  */
+	      ;
+	    if (!((d - p) & 1)) {
+	      if (!range)
+		break;
+	      range++, startpos--;
+	    }
+	  }
+	  // gotom end 
           range++;
           startpos--;
         }
@@ -4326,8 +4608,26 @@
 	    {
 	      do
 		{
+		  // gotom added 
+		  unsigned char c;
+
+		  // gotom end 
 		  PREFETCH ();
-		  if ((unsigned char) translate[(unsigned char) *d++]
+		  // gotom added 
+		  c = *d++;
+		  if (ismbchar (c)) {
+		    if (c != (unsigned char) *p++
+			|| !--mcnt	/* パターンが正しくコンパイルさ
+					   れている限り, このチェックは
+					   冗長だが念のため.  */
+			|| d == dend
+			|| (unsigned char) *d++ != (unsigned char) *p++)
+		      goto fail;
+		    continue;
+		  }
+		  if ((unsigned char) translate[c] != (unsigned char) *p++)
+		    // gotom end
+		    //if ((unsigned char) translate[(unsigned char) *d++]
 		      != (unsigned char) *p++)
                     goto fail;
 		}
@@ -4395,26 +4695,32 @@
 	case charset:
 	case charset_not:
 	  {
-	    register unsigned char c;
-	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
+	    register unsigned short c;
+	    boolean not;
 
-            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
+	    DEBUG_PRINT2 ("EXECUTING charset%s.\n",
+			  (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
 
 	    PREFETCH ();
-	    c = TRANSLATE (*d); /* The character to match.  */
+	    c = (unsigned char) *d;
+	    if (ismbchar (c)) {
+	      c <<= 8;
+	      if (d + 1 != dend)
+		c |= (unsigned char) d[1];
+	    }
+	    else
+	      c = TRANSLATE (c); /* The character to match.  */
 
-            /* Cast to `unsigned' instead of `unsigned char' in case the
-               bit list is a full 32 bytes long.  */
-	    if (c < (unsigned) (*p * BYTEWIDTH)
-		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-	      not = !not;
+	    not = is_in_list (c, p);
 
-	    p += 1 + *p;
+	    p += 1 + *p + 2 + EXTRACT_UNSIGNED (&p[1 + *p])*4;
 
 	    if (!not) goto fail;
 
 	    SET_REGS_MATCHED ();
             d++;
+	    if (d != dend && c >= 1 << BYTEWIDTH)
+	      d++;
 	    break;
 	  }
 
@@ -4589,7 +4895,7 @@
                           regstart[r] = old_regstart[r];
 
                           /* xx why this test?  */
-                          if (old_regend[r] >= regstart[r])
+			  if (old_regend[r] >= regstart[r])
                             regend[r] = old_regend[r];
                         }
                     }
@@ -4880,15 +5186,25 @@
 		else if ((re_opcode_t) p1[3] == charset
 			 || (re_opcode_t) p1[3] == charset_not)
 		  {
-		    int not = (re_opcode_t) p1[3] == charset_not;
-
-		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
-			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-		      not = !not;
-
-                    /* `not' is equal to 1 if c would match, which means
+		    // gotom added 
+		    if (ismbchar (c))
+		      c = c << 8 | p2[3];
+		    // gotom end
+		    //		    int not = (re_opcode_t) p1[3] == charset_not;
+		    //
+		    //		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+		    //			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+		    //		      not = !not;
+
+		    //                    /* `not' is equal to 1 if c would match, which means
+		    // gotom added 
+		    /* `is_in_list()' is TRUE if c would match, which means
+		       // gotom end
                         that we can't change to pop_failure_jump.  */
-		    if (!not)
+		    // gotom added 
+		    if (!is_in_list (c, p1 + 4))
+		      // gotom end
+		    //		    if (!not)
                       {
   		        p[-3] = (unsigned char) pop_failure_jump;
                         DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
@@ -5564,9 +5880,22 @@
 {
   register const unsigned char *p1 = (const unsigned char *) s1;
   register const unsigned char *p2 = (const unsigned char *) s2;
+  // gotom added
+  register unsigned char c;
+  // gotom end
   while (len)
     {
-      if (translate[*p1++] != translate[*p2++]) return 1;
+      // gotom added 
+      c = *p1++;
+      if (ismbchar(c)) {
+	if (c != *p2++ || !--len || *p1++ != *p2++)
+	  return 1;
+      }
+      else
+	if (translate[c] != translate[*p2++])
+	  return 1;
+      // gotom end
+      //      if (translate[*p1++] != translate[*p2++]) return 1;
       len--;
     }
   return 0;
diff -Nur grep-2.3/src/regex.c.orig grep-ja-2.3/src/regex.c.orig
--- grep-2.3/src/regex.c.orig	Sun Nov 22 15:46:02 1998
+++ grep-ja-2.3/src/regex.c.orig	Thu Jan  1 09:00:00 1970
@@ -1,5829 +0,0 @@
-/* Extended regular expression matching and search library,
-   version 0.12.
-   (Implements POSIX draft P1003.2/D11.2, except for some of the
-   internationalization features.)
-   Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* AIX requires this to be the first thing in the file. */
-#if defined _AIX && !defined REGEX_MALLOC
-  #pragma alloca
-#endif
-
-#undef	_GNU_SOURCE
-#define _GNU_SOURCE
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef PARAMS
-# if defined __GNUC__ || (defined __STDC__ && __STDC__)
-#  define PARAMS(args) args
-# else
-#  define PARAMS(args) ()
-# endif  /* GCC.  */
-#endif  /* Not PARAMS.  */
-
-#if defined STDC_HEADERS && !defined emacs
-# include <stddef.h>
-#else
-/* We need this for `regex.h', and perhaps for the Emacs include files.  */
-# include <sys/types.h>
-#endif
-
-#define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC)
-
-/* For platform which support the ISO C amendement 1 functionality we
-   support user defined character classes.  */
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-# include <wchar.h>
-# include <wctype.h>
-#endif
-
-#ifdef _LIBC
-/* We have to keep the namespace clean.  */
-# define regfree(preg) __regfree (preg)
-# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
-# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
-# define regerror(errcode, preg, errbuf, errbuf_size) \
-	__regerror(errcode, preg, errbuf, errbuf_size)
-# define re_set_registers(bu, re, nu, st, en) \
-	__re_set_registers (bu, re, nu, st, en)
-# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
-	__re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-# define re_match(bufp, string, size, pos, regs) \
-	__re_match (bufp, string, size, pos, regs)
-# define re_search(bufp, string, size, startpos, range, regs) \
-	__re_search (bufp, string, size, startpos, range, regs)
-# define re_compile_pattern(pattern, length, bufp) \
-	__re_compile_pattern (pattern, length, bufp)
-# define re_set_syntax(syntax) __re_set_syntax (syntax)
-# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
-	__re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
-# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
-
-#define btowc __btowc
-#endif
-
-/* This is for other GNU distributions with internationalized messages.  */
-#if HAVE_LIBINTL_H || defined _LIBC
-# include <libintl.h>
-#else
-# define gettext(msgid) (msgid)
-#endif
-
-#ifndef gettext_noop
-/* This define is so xgettext can find the internationalizable
-   strings.  */
-# define gettext_noop(String) String
-#endif
-
-/* The `emacs' switch turns on certain matching commands
-   that make sense only in Emacs. */
-#ifdef emacs
-
-# include "lisp.h"
-# include "buffer.h"
-# include "syntax.h"
-
-#else  /* not emacs */
-
-/* If we are not linking with Emacs proper,
-   we can't use the relocating allocator
-   even if config.h says that we can.  */
-# undef REL_ALLOC
-
-# if defined STDC_HEADERS || defined _LIBC
-#  include <stdlib.h>
-# else
-char *malloc ();
-char *realloc ();
-# endif
-
-/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
-   If nothing else has been done, use the method below.  */
-# ifdef INHIBIT_STRING_HEADER
-#  if !(defined HAVE_BZERO && defined HAVE_BCOPY)
-#   if !defined bzero && !defined bcopy
-#    undef INHIBIT_STRING_HEADER
-#   endif
-#  endif
-# endif
-
-/* This is the normal way of making sure we have a bcopy and a bzero.
-   This is used in most programs--a few other programs avoid this
-   by defining INHIBIT_STRING_HEADER.  */
-# ifndef INHIBIT_STRING_HEADER
-#  if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC
-#   include <string.h>
-#   ifndef bzero
-#    ifndef _LIBC
-#     define bzero(s, n)	(memset (s, '\0', n), (s))
-#    else
-#     define bzero(s, n)	__bzero (s, n)
-#    endif
-#   endif
-#  else
-#   include <strings.h>
-#   ifndef memcmp
-#    define memcmp(s1, s2, n)	bcmp (s1, s2, n)
-#   endif
-#   ifndef memcpy
-#    define memcpy(d, s, n)	(bcopy (s, d, n), (d))
-#   endif
-#  endif
-# endif
-
-/* Define the syntax stuff for \<, \>, etc.  */
-
-/* This must be nonzero for the wordchar and notwordchar pattern
-   commands in re_match_2.  */
-# ifndef Sword
-#  define Sword 1
-# endif
-
-# ifdef SWITCH_ENUM_BUG
-#  define SWITCH_ENUM_CAST(x) ((int)(x))
-# else
-#  define SWITCH_ENUM_CAST(x) (x)
-# endif
-
-/* How many characters in the character set.  */
-# define CHAR_SET_SIZE 256
-
-# ifdef SYNTAX_TABLE
-
-extern char *re_syntax_table;
-
-# else /* not SYNTAX_TABLE */
-
-static char re_syntax_table[CHAR_SET_SIZE];
-
-static void
-init_syntax_once ()
-{
-   register int c;
-   static int done = 0;
-
-   if (done)
-     return;
-
-   bzero (re_syntax_table, sizeof re_syntax_table);
-
-   for (c = 'a'; c <= 'z'; c++)
-     re_syntax_table[c] = Sword;
-
-   for (c = 'A'; c <= 'Z'; c++)
-     re_syntax_table[c] = Sword;
-
-   for (c = '0'; c <= '9'; c++)
-     re_syntax_table[c] = Sword;
-
-   re_syntax_table['_'] = Sword;
-
-   done = 1;
-}
-
-# endif /* not SYNTAX_TABLE */
-
-# define SYNTAX(c) re_syntax_table[c]
-
-#endif /* not emacs */
-
-/* Get the interface, including the syntax bits.  */
-#include "regex.h"
-
-/* isalpha etc. are used for the character classes.  */
-#include <ctype.h>
-
-/* Jim Meyering writes:
-
-   "... Some ctype macros are valid only for character codes that
-   isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
-   using /bin/cc or gcc but without giving an ansi option).  So, all
-   ctype uses should be through macros like ISPRINT...  If
-   STDC_HEADERS is defined, then autoconf has verified that the ctype
-   macros don't need to be guarded with references to isascii. ...
-   Defining isascii to 1 should let any compiler worth its salt
-   eliminate the && through constant folding."
-   Solaris defines some of these symbols so we must undefine them first.  */
-
-#undef ISASCII
-#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
-# define ISASCII(c) 1
-#else
-# define ISASCII(c) isascii(c)
-#endif
-
-#ifdef isblank
-# define ISBLANK(c) (ISASCII (c) && isblank (c))
-#else
-# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-#endif
-#ifdef isgraph
-# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-#else
-# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-#endif
-
-#undef ISPRINT
-#define ISPRINT(c) (ISASCII (c) && isprint (c))
-#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-#define ISALNUM(c) (ISASCII (c) && isalnum (c))
-#define ISALPHA(c) (ISASCII (c) && isalpha (c))
-#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-#define ISLOWER(c) (ISASCII (c) && islower (c))
-#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-#define ISSPACE(c) (ISASCII (c) && isspace (c))
-#define ISUPPER(c) (ISASCII (c) && isupper (c))
-#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
-
-#ifndef NULL
-# define NULL (void *)0
-#endif
-
-/* We remove any previous definition of `SIGN_EXTEND_CHAR',
-   since ours (we hope) works properly with all combinations of
-   machines, compilers, `char' and `unsigned char' argument types.
-   (Per Bothner suggested the basic approach.)  */
-#undef SIGN_EXTEND_CHAR
-#if __STDC__
-# define SIGN_EXTEND_CHAR(c) ((signed char) (c))
-#else  /* not __STDC__ */
-/* As in Harbison and Steele.  */
-# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
-#endif
-
-/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
-   use `alloca' instead of `malloc'.  This is because using malloc in
-   re_search* or re_match* could cause memory leaks when C-g is used in
-   Emacs; also, malloc is slower and causes storage fragmentation.  On
-   the other hand, malloc is more portable, and easier to debug.
-
-   Because we sometimes use alloca, some routines have to be macros,
-   not functions -- `alloca'-allocated space disappears at the end of the
-   function it is called in.  */
-
-#ifdef REGEX_MALLOC
-
-# define REGEX_ALLOCATE malloc
-# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
-# define REGEX_FREE free
-
-#else /* not REGEX_MALLOC  */
-
-/* Emacs already defines alloca, sometimes.  */
-# ifndef alloca
-
-/* Make alloca work the best possible way.  */
-#  ifdef __GNUC__
-#   define alloca __builtin_alloca
-#  else /* not __GNUC__ */
-#   if HAVE_ALLOCA_H
-#    include <alloca.h>
-#   endif /* HAVE_ALLOCA_H */
-#  endif /* not __GNUC__ */
-
-# endif /* not alloca */
-
-# define REGEX_ALLOCATE alloca
-
-/* Assumes a `char *destination' variable.  */
-# define REGEX_REALLOCATE(source, osize, nsize)				\
-  (destination = (char *) alloca (nsize),				\
-   memcpy (destination, source, osize))
-
-/* No need to do anything to free, after alloca.  */
-# define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
-
-#endif /* not REGEX_MALLOC */
-
-/* Define how to allocate the failure stack.  */
-
-#if defined REL_ALLOC && defined REGEX_MALLOC
-
-# define REGEX_ALLOCATE_STACK(size)				\
-  r_alloc (&failure_stack_ptr, (size))
-# define REGEX_REALLOCATE_STACK(source, osize, nsize)		\
-  r_re_alloc (&failure_stack_ptr, (nsize))
-# define REGEX_FREE_STACK(ptr)					\
-  r_alloc_free (&failure_stack_ptr)
-
-#else /* not using relocating allocator */
-
-# ifdef REGEX_MALLOC
-
-#  define REGEX_ALLOCATE_STACK malloc
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
-#  define REGEX_FREE_STACK free
-
-# else /* not REGEX_MALLOC */
-
-#  define REGEX_ALLOCATE_STACK alloca
-
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize)			\
-   REGEX_REALLOCATE (source, osize, nsize)
-/* No need to explicitly free anything.  */
-#  define REGEX_FREE_STACK(arg)
-
-# endif /* not REGEX_MALLOC */
-#endif /* not using relocating allocator */
-
-
-/* True if `size1' is non-NULL and PTR is pointing anywhere inside
-   `string1' or just past its end.  This works if PTR is NULL, which is
-   a good thing.  */
-#define FIRST_STRING_P(ptr) 					\
-  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
-
-/* (Re)Allocate N items of type T using malloc, or fail.  */
-#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
-#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
-#define RETALLOC_IF(addr, n, t) \
-  if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
-#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
-
-#define BYTEWIDTH 8 /* In bits.  */
-
-#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
-
-#undef MAX
-#undef MIN
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
-typedef char boolean;
-#define false 0
-#define true 1
-
-static int re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp,
-					const char *string1, int size1,
-					const char *string2, int size2,
-					int pos,
-					struct re_registers *regs,
-					int stop));
-
-/* These are the command codes that appear in compiled regular
-   expressions.  Some opcodes are followed by argument bytes.  A
-   command code can specify any interpretation whatsoever for its
-   arguments.  Zero bytes may appear in the compiled regular expression.  */
-
-typedef enum
-{
-  no_op = 0,
-
-  /* Succeed right away--no more backtracking.  */
-  succeed,
-
-        /* Followed by one byte giving n, then by n literal bytes.  */
-  exactn,
-
-        /* Matches any (more or less) character.  */
-  anychar,
-
-        /* Matches any one char belonging to specified set.  First
-           following byte is number of bitmap bytes.  Then come bytes
-           for a bitmap saying which chars are in.  Bits in each byte
-           are ordered low-bit-first.  A character is in the set if its
-           bit is 1.  A character too large to have a bit in the map is
-           automatically not in the set.  */
-  charset,
-
-        /* Same parameters as charset, but match any character that is
-           not one of those specified.  */
-  charset_not,
-
-        /* Start remembering the text that is matched, for storing in a
-           register.  Followed by one byte with the register number, in
-           the range 0 to one less than the pattern buffer's re_nsub
-           field.  Then followed by one byte with the number of groups
-           inner to this one.  (This last has to be part of the
-           start_memory only because we need it in the on_failure_jump
-           of re_match_2.)  */
-  start_memory,
-
-        /* Stop remembering the text that is matched and store it in a
-           memory register.  Followed by one byte with the register
-           number, in the range 0 to one less than `re_nsub' in the
-           pattern buffer, and one byte with the number of inner groups,
-           just like `start_memory'.  (We need the number of inner
-           groups here because we don't have any easy way of finding the
-           corresponding start_memory when we're at a stop_memory.)  */
-  stop_memory,
-
-        /* Match a duplicate of something remembered. Followed by one
-           byte containing the register number.  */
-  duplicate,
-
-        /* Fail unless at beginning of line.  */
-  begline,
-
-        /* Fail unless at end of line.  */
-  endline,
-
-        /* Succeeds if at beginning of buffer (if emacs) or at beginning
-           of string to be matched (if not).  */
-  begbuf,
-
-        /* Analogously, for end of buffer/string.  */
-  endbuf,
-
-        /* Followed by two byte relative address to which to jump.  */
-  jump,
-
-	/* Same as jump, but marks the end of an alternative.  */
-  jump_past_alt,
-
-        /* Followed by two-byte relative address of place to resume at
-           in case of failure.  */
-  on_failure_jump,
-
-        /* Like on_failure_jump, but pushes a placeholder instead of the
-           current string position when executed.  */
-  on_failure_keep_string_jump,
-
-        /* Throw away latest failure point and then jump to following
-           two-byte relative address.  */
-  pop_failure_jump,
-
-        /* Change to pop_failure_jump if know won't have to backtrack to
-           match; otherwise change to jump.  This is used to jump
-           back to the beginning of a repeat.  If what follows this jump
-           clearly won't match what the repeat does, such that we can be
-           sure that there is no use backtracking out of repetitions
-           already matched, then we change it to a pop_failure_jump.
-           Followed by two-byte address.  */
-  maybe_pop_jump,
-
-        /* Jump to following two-byte address, and push a dummy failure
-           point. This failure point will be thrown away if an attempt
-           is made to use it for a failure.  A `+' construct makes this
-           before the first repeat.  Also used as an intermediary kind
-           of jump when compiling an alternative.  */
-  dummy_failure_jump,
-
-	/* Push a dummy failure point and continue.  Used at the end of
-	   alternatives.  */
-  push_dummy_failure,
-
-        /* Followed by two-byte relative address and two-byte number n.
-           After matching N times, jump to the address upon failure.  */
-  succeed_n,
-
-        /* Followed by two-byte relative address, and two-byte number n.
-           Jump to the address N times, then fail.  */
-  jump_n,
-
-        /* Set the following two-byte relative address to the
-           subsequent two-byte number.  The address *includes* the two
-           bytes of number.  */
-  set_number_at,
-
-  wordchar,	/* Matches any word-constituent character.  */
-  notwordchar,	/* Matches any char that is not a word-constituent.  */
-
-  wordbeg,	/* Succeeds if at word beginning.  */
-  wordend,	/* Succeeds if at word end.  */
-
-  wordbound,	/* Succeeds if at a word boundary.  */
-  notwordbound	/* Succeeds if not at a word boundary.  */
-
-#ifdef emacs
-  ,before_dot,	/* Succeeds if before point.  */
-  at_dot,	/* Succeeds if at point.  */
-  after_dot,	/* Succeeds if after point.  */
-
-	/* Matches any character whose syntax is specified.  Followed by
-           a byte which contains a syntax code, e.g., Sword.  */
-  syntaxspec,
-
-	/* Matches any character whose syntax is not that specified.  */
-  notsyntaxspec
-#endif /* emacs */
-} re_opcode_t;
-
-/* Common operations on the compiled pattern.  */
-
-/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
-
-#define STORE_NUMBER(destination, number)				\
-  do {									\
-    (destination)[0] = (number) & 0377;					\
-    (destination)[1] = (number) >> 8;					\
-  } while (0)
-
-/* Same as STORE_NUMBER, except increment DESTINATION to
-   the byte after where the number is stored.  Therefore, DESTINATION
-   must be an lvalue.  */
-
-#define STORE_NUMBER_AND_INCR(destination, number)			\
-  do {									\
-    STORE_NUMBER (destination, number);					\
-    (destination) += 2;							\
-  } while (0)
-
-/* Put into DESTINATION a number stored in two contiguous bytes starting
-   at SOURCE.  */
-
-#define EXTRACT_NUMBER(destination, source)				\
-  do {									\
-    (destination) = *(source) & 0377;					\
-    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;		\
-  } while (0)
-
-#ifdef DEBUG
-static void extract_number _RE_ARGS ((int *dest, unsigned char *source));
-static void
-extract_number (dest, source)
-    int *dest;
-    unsigned char *source;
-{
-  int temp = SIGN_EXTEND_CHAR (*(source + 1));
-  *dest = *source & 0377;
-  *dest += temp << 8;
-}
-
-# ifndef EXTRACT_MACROS /* To debug the macros.  */
-#  undef EXTRACT_NUMBER
-#  define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* DEBUG */
-
-/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
-   SOURCE must be an lvalue.  */
-
-#define EXTRACT_NUMBER_AND_INCR(destination, source)			\
-  do {									\
-    EXTRACT_NUMBER (destination, source);				\
-    (source) += 2; 							\
-  } while (0)
-
-#ifdef DEBUG
-static void extract_number_and_incr _RE_ARGS ((int *destination,
-					       unsigned char **source));
-static void
-extract_number_and_incr (destination, source)
-    int *destination;
-    unsigned char **source;
-{
-  extract_number (destination, *source);
-  *source += 2;
-}
-
-# ifndef EXTRACT_MACROS
-#  undef EXTRACT_NUMBER_AND_INCR
-#  define EXTRACT_NUMBER_AND_INCR(dest, src) \
-  extract_number_and_incr (&dest, &src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* DEBUG */
-
-/* If DEBUG is defined, Regex prints many voluminous messages about what
-   it is doing (if the variable `debug' is nonzero).  If linked with the
-   main program in `iregex.c', you can enter patterns and strings
-   interactively.  And if linked with the main program in `main.c' and
-   the other test files, you can run the already-written tests.  */
-
-#ifdef DEBUG
-
-/* We use standard I/O for debugging.  */
-# include <stdio.h>
-
-/* It is useful to test things that ``must'' be true when debugging.  */
-# include <assert.h>
-
-static int debug = 0;
-
-# define DEBUG_STATEMENT(e) e
-# define DEBUG_PRINT1(x) if (debug) printf (x)
-# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 				\
-  if (debug) print_partial_compiled_pattern (s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)			\
-  if (debug) print_double_string (w, s1, sz1, s2, sz2)
-
-
-/* Print the fastmap in human-readable form.  */
-
-void
-print_fastmap (fastmap)
-    char *fastmap;
-{
-  unsigned was_a_range = 0;
-  unsigned i = 0;
-
-  while (i < (1 << BYTEWIDTH))
-    {
-      if (fastmap[i++])
-	{
-	  was_a_range = 0;
-          putchar (i - 1);
-          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
-            {
-              was_a_range = 1;
-              i++;
-            }
-	  if (was_a_range)
-            {
-              printf ("-");
-              putchar (i - 1);
-            }
-        }
-    }
-  putchar ('\n');
-}
-
-
-/* Print a compiled pattern string in human-readable form, starting at
-   the START pointer into it and ending just before the pointer END.  */
-
-void
-print_partial_compiled_pattern (start, end)
-    unsigned char *start;
-    unsigned char *end;
-{
-  int mcnt, mcnt2;
-  unsigned char *p1;
-  unsigned char *p = start;
-  unsigned char *pend = end;
-
-  if (start == NULL)
-    {
-      printf ("(null)\n");
-      return;
-    }
-
-  /* Loop over pattern commands.  */
-  while (p < pend)
-    {
-      printf ("%d:\t", p - start);
-
-      switch ((re_opcode_t) *p++)
-	{
-        case no_op:
-          printf ("/no_op");
-          break;
-
-	case exactn:
-	  mcnt = *p++;
-          printf ("/exactn/%d", mcnt);
-          do
-	    {
-              putchar ('/');
-	      putchar (*p++);
-            }
-          while (--mcnt);
-          break;
-
-	case start_memory:
-          mcnt = *p++;
-          printf ("/start_memory/%d/%d", mcnt, *p++);
-          break;
-
-	case stop_memory:
-          mcnt = *p++;
-	  printf ("/stop_memory/%d/%d", mcnt, *p++);
-          break;
-
-	case duplicate:
-	  printf ("/duplicate/%d", *p++);
-	  break;
-
-	case anychar:
-	  printf ("/anychar");
-	  break;
-
-	case charset:
-        case charset_not:
-          {
-            register int c, last = -100;
-	    register int in_range = 0;
-
-	    printf ("/charset [%s",
-	            (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
-
-            assert (p + *p < pend);
-
-            for (c = 0; c < 256; c++)
-	      if (c / 8 < *p
-		  && (p[1 + (c/8)] & (1 << (c % 8))))
-		{
-		  /* Are we starting a range?  */
-		  if (last + 1 == c && ! in_range)
-		    {
-		      putchar ('-');
-		      in_range = 1;
-		    }
-		  /* Have we broken a range?  */
-		  else if (last + 1 != c && in_range)
-              {
-		      putchar (last);
-		      in_range = 0;
-		    }
-
-		  if (! in_range)
-		    putchar (c);
-
-		  last = c;
-              }
-
-	    if (in_range)
-	      putchar (last);
-
-	    putchar (']');
-
-	    p += 1 + *p;
-	  }
-	  break;
-
-	case begline:
-	  printf ("/begline");
-          break;
-
-	case endline:
-          printf ("/endline");
-          break;
-
-	case on_failure_jump:
-          extract_number_and_incr (&mcnt, &p);
-  	  printf ("/on_failure_jump to %d", p + mcnt - start);
-          break;
-
-	case on_failure_keep_string_jump:
-          extract_number_and_incr (&mcnt, &p);
-  	  printf ("/on_failure_keep_string_jump to %d", p + mcnt - start);
-          break;
-
-	case dummy_failure_jump:
-          extract_number_and_incr (&mcnt, &p);
-  	  printf ("/dummy_failure_jump to %d", p + mcnt - start);
-          break;
-
-	case push_dummy_failure:
-          printf ("/push_dummy_failure");
-          break;
-
-        case maybe_pop_jump:
-          extract_number_and_incr (&mcnt, &p);
-  	  printf ("/maybe_pop_jump to %d", p + mcnt - start);
-	  break;
-
-        case pop_failure_jump:
-	  extract_number_and_incr (&mcnt, &p);
-  	  printf ("/pop_failure_jump to %d", p + mcnt - start);
-	  break;
-
-        case jump_past_alt:
-	  extract_number_and_incr (&mcnt, &p);
-  	  printf ("/jump_past_alt to %d", p + mcnt - start);
-	  break;
-
-        case jump:
-	  extract_number_and_incr (&mcnt, &p);
-  	  printf ("/jump to %d", p + mcnt - start);
-	  break;
-
-        case succeed_n:
-          extract_number_and_incr (&mcnt, &p);
-	  p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-	  printf ("/succeed_n to %d, %d times", p1 - start, mcnt2);
-          break;
-
-        case jump_n:
-          extract_number_and_incr (&mcnt, &p);
-	  p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-	  printf ("/jump_n to %d, %d times", p1 - start, mcnt2);
-          break;
-
-        case set_number_at:
-          extract_number_and_incr (&mcnt, &p);
-	  p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-	  printf ("/set_number_at location %d to %d", p1 - start, mcnt2);
-          break;
-
-        case wordbound:
-	  printf ("/wordbound");
-	  break;
-
-	case notwordbound:
-	  printf ("/notwordbound");
-          break;
-
-	case wordbeg:
-	  printf ("/wordbeg");
-	  break;
-
-	case wordend:
-	  printf ("/wordend");
-
-# ifdef emacs
-	case before_dot:
-	  printf ("/before_dot");
-          break;
-
-	case at_dot:
-	  printf ("/at_dot");
-          break;
-
-	case after_dot:
-	  printf ("/after_dot");
-          break;
-
-	case syntaxspec:
-          printf ("/syntaxspec");
-	  mcnt = *p++;
-	  printf ("/%d", mcnt);
-          break;
-
-	case notsyntaxspec:
-          printf ("/notsyntaxspec");
-	  mcnt = *p++;
-	  printf ("/%d", mcnt);
-	  break;
-# endif /* emacs */
-
-	case wordchar:
-	  printf ("/wordchar");
-          break;
-
-	case notwordchar:
-	  printf ("/notwordchar");
-          break;
-
-	case begbuf:
-	  printf ("/begbuf");
-          break;
-
-	case endbuf:
-	  printf ("/endbuf");
-          break;
-
-        default:
-          printf ("?%d", *(p-1));
-	}
-
-      putchar ('\n');
-    }
-
-  printf ("%d:\tend of pattern.\n", p - start);
-}
-
-
-void
-print_compiled_pattern (bufp)
-    struct re_pattern_buffer *bufp;
-{
-  unsigned char *buffer = bufp->buffer;
-
-  print_partial_compiled_pattern (buffer, buffer + bufp->used);
-  printf ("%ld bytes used/%ld bytes allocated.\n",
-	  bufp->used, bufp->allocated);
-
-  if (bufp->fastmap_accurate && bufp->fastmap)
-    {
-      printf ("fastmap: ");
-      print_fastmap (bufp->fastmap);
-    }
-
-  printf ("re_nsub: %d\t", bufp->re_nsub);
-  printf ("regs_alloc: %d\t", bufp->regs_allocated);
-  printf ("can_be_null: %d\t", bufp->can_be_null);
-  printf ("newline_anchor: %d\n", bufp->newline_anchor);
-  printf ("no_sub: %d\t", bufp->no_sub);
-  printf ("not_bol: %d\t", bufp->not_bol);
-  printf ("not_eol: %d\t", bufp->not_eol);
-  printf ("syntax: %lx\n", bufp->syntax);
-  /* Perhaps we should print the translate table?  */
-}
-
-
-void
-print_double_string (where, string1, size1, string2, size2)
-    const char *where;
-    const char *string1;
-    const char *string2;
-    int size1;
-    int size2;
-{
-  int this_char;
-
-  if (where == NULL)
-    printf ("(null)");
-  else
-    {
-      if (FIRST_STRING_P (where))
-        {
-          for (this_char = where - string1; this_char < size1; this_char++)
-            putchar (string1[this_char]);
-
-          where = string2;
-        }
-
-      for (this_char = where - string2; this_char < size2; this_char++)
-        putchar (string2[this_char]);
-    }
-}
-
-void
-printchar (c)
-     int c;
-{
-  putc (c, stderr);
-}
-
-#else /* not DEBUG */
-
-# undef assert
-# define assert(e)
-
-# define DEBUG_STATEMENT(e)
-# define DEBUG_PRINT1(x)
-# define DEBUG_PRINT2(x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
-
-#endif /* not DEBUG */
-
-/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
-   also be assigned to arbitrarily: each pattern buffer stores its own
-   syntax, so it can be changed between regex compilations.  */
-/* This has no initializer because initialized variables in Emacs
-   become read-only after dumping.  */
-reg_syntax_t re_syntax_options;
-
-
-/* Specify the precise syntax of regexps for compilation.  This provides
-   for compatibility for various utilities which historically have
-   different, incompatible syntaxes.
-
-   The argument SYNTAX is a bit mask comprised of the various bits
-   defined in regex.h.  We return the old syntax.  */
-
-reg_syntax_t
-re_set_syntax (syntax)
-    reg_syntax_t syntax;
-{
-  reg_syntax_t ret = re_syntax_options;
-
-  re_syntax_options = syntax;
-#ifdef DEBUG
-  if (syntax & RE_DEBUG)
-    debug = 1;
-  else if (debug) /* was on but now is not */
-    debug = 0;
-#endif /* DEBUG */
-  return ret;
-}
-#ifdef _LIBC
-weak_alias (__re_set_syntax, re_set_syntax)
-#endif
-
-/* This table gives an error message for each of the error codes listed
-   in regex.h.  Obviously the order here has to be same as there.
-   POSIX doesn't require that we do anything for REG_NOERROR,
-   but why not be nice?  */
-
-static const char *re_error_msgid[] =
-  {
-    gettext_noop ("Success"),	/* REG_NOERROR */
-    gettext_noop ("No match"),	/* REG_NOMATCH */
-    gettext_noop ("Invalid regular expression"), /* REG_BADPAT */
-    gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */
-    gettext_noop ("Invalid character class name"), /* REG_ECTYPE */
-    gettext_noop ("Trailing backslash"), /* REG_EESCAPE */
-    gettext_noop ("Invalid back reference"), /* REG_ESUBREG */
-    gettext_noop ("Unmatched [ or [^"),	/* REG_EBRACK */
-    gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */
-    gettext_noop ("Unmatched \\{"), /* REG_EBRACE */
-    gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */
-    gettext_noop ("Invalid range end"),	/* REG_ERANGE */
-    gettext_noop ("Memory exhausted"), /* REG_ESPACE */
-    gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */
-    gettext_noop ("Premature end of regular expression"), /* REG_EEND */
-    gettext_noop ("Regular expression too big"), /* REG_ESIZE */
-    gettext_noop ("Unmatched ) or \\)"), /* REG_ERPAREN */
-  };
-
-/* Avoiding alloca during matching, to placate r_alloc.  */
-
-/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
-   searching and matching functions should not call alloca.  On some
-   systems, alloca is implemented in terms of malloc, and if we're
-   using the relocating allocator routines, then malloc could cause a
-   relocation, which might (if the strings being searched are in the
-   ralloc heap) shift the data out from underneath the regexp
-   routines.
-
-   Here's another reason to avoid allocation: Emacs
-   processes input from X in a signal handler; processing X input may
-   call malloc; if input arrives while a matching routine is calling
-   malloc, then we're scrod.  But Emacs can't just block input while
-   calling matching routines; then we don't notice interrupts when
-   they come in.  So, Emacs blocks input around all regexp calls
-   except the matching calls, which it leaves unprotected, in the
-   faith that they will not malloc.  */
-
-/* Normally, this is fine.  */
-#define MATCH_MAY_ALLOCATE
-
-/* When using GNU C, we are not REALLY using the C alloca, no matter
-   what config.h may say.  So don't take precautions for it.  */
-#ifdef __GNUC__
-# undef C_ALLOCA
-#endif
-
-/* The match routines may not allocate if (1) they would do it with malloc
-   and (2) it's not safe for them to use malloc.
-   Note that if REL_ALLOC is defined, matching would not use malloc for the
-   failure stack, but we would still use it for the register vectors;
-   so REL_ALLOC should not affect this.  */
-#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs
-# undef MATCH_MAY_ALLOCATE
-#endif
-
-
-/* Failure stack declarations and macros; both re_compile_fastmap and
-   re_match_2 use a failure stack.  These have to be macros because of
-   REGEX_ALLOCATE_STACK.  */
-
-
-/* Number of failure points for which to initially allocate space
-   when matching.  If this number is exceeded, we allocate more
-   space, so it is not a hard limit.  */
-#ifndef INIT_FAILURE_ALLOC
-# define INIT_FAILURE_ALLOC 5
-#endif
-
-/* Roughly the maximum number of failure points on the stack.  Would be
-   exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
-   This is a variable only so users of regex can assign to it; we never
-   change it ourselves.  */
-
-#ifdef INT_IS_16BIT
-
-# if defined MATCH_MAY_ALLOCATE
-/* 4400 was enough to cause a crash on Alpha OSF/1,
-   whose default stack limit is 2mb.  */
-long int re_max_failures = 4000;
-# else
-long int re_max_failures = 2000;
-# endif
-
-union fail_stack_elt
-{
-  unsigned char *pointer;
-  long int integer;
-};
-
-typedef union fail_stack_elt fail_stack_elt_t;
-
-typedef struct
-{
-  fail_stack_elt_t *stack;
-  unsigned long int size;
-  unsigned long int avail;		/* Offset of next open position.  */
-} fail_stack_type;
-
-#else /* not INT_IS_16BIT */
-
-# if defined MATCH_MAY_ALLOCATE
-/* 4400 was enough to cause a crash on Alpha OSF/1,
-   whose default stack limit is 2mb.  */
-int re_max_failures = 20000;
-# else
-int re_max_failures = 2000;
-# endif
-
-union fail_stack_elt
-{
-  unsigned char *pointer;
-  int integer;
-};
-
-typedef union fail_stack_elt fail_stack_elt_t;
-
-typedef struct
-{
-  fail_stack_elt_t *stack;
-  unsigned size;
-  unsigned avail;			/* Offset of next open position.  */
-} fail_stack_type;
-
-#endif /* INT_IS_16BIT */
-
-#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
-#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
-#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
-
-
-/* Define macros to initialize and free the failure stack.
-   Do `return -2' if the alloc fails.  */
-
-#ifdef MATCH_MAY_ALLOCATE
-# define INIT_FAIL_STACK()						\
-  do {									\
-    fail_stack.stack = (fail_stack_elt_t *)				\
-      REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
-									\
-    if (fail_stack.stack == NULL)					\
-      return -2;							\
-									\
-    fail_stack.size = INIT_FAILURE_ALLOC;				\
-    fail_stack.avail = 0;						\
-  } while (0)
-
-# define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
-#else
-# define INIT_FAIL_STACK()						\
-  do {									\
-    fail_stack.avail = 0;						\
-  } while (0)
-
-# define RESET_FAIL_STACK()
-#endif
-
-
-/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
-
-   Return 1 if succeeds, and 0 if either ran out of memory
-   allocating space for it or it was already too large.
-
-   REGEX_REALLOCATE_STACK requires `destination' be declared.   */
-
-#define DOUBLE_FAIL_STACK(fail_stack)					\
-  ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS)	\
-   ? 0									\
-   : ((fail_stack).stack = (fail_stack_elt_t *)				\
-        REGEX_REALLOCATE_STACK ((fail_stack).stack, 			\
-          (fail_stack).size * sizeof (fail_stack_elt_t),		\
-          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),	\
-									\
-      (fail_stack).stack == NULL					\
-      ? 0								\
-      : ((fail_stack).size <<= 1, 					\
-         1)))
-
-
-/* Push pointer POINTER on FAIL_STACK.
-   Return 1 if was able to do so and 0 if ran out of memory allocating
-   space to do so.  */
-#define PUSH_PATTERN_OP(POINTER, FAIL_STACK)				\
-  ((FAIL_STACK_FULL ()							\
-    && !DOUBLE_FAIL_STACK (FAIL_STACK))					\
-   ? 0									\
-   : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER,	\
-      1))
-
-/* Push a pointer value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_POINTER(item)					\
-  fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
-
-/* This pushes an integer-valued item onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_INT(item)					\
-  fail_stack.stack[fail_stack.avail++].integer = (item)
-
-/* Push a fail_stack_elt_t value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_ELT(item)					\
-  fail_stack.stack[fail_stack.avail++] =  (item)
-
-/* These three POP... operations complement the three PUSH... operations.
-   All assume that `fail_stack' is nonempty.  */
-#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
-#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
-#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
-
-/* Used to omit pushing failure point id's when we're not debugging.  */
-#ifdef DEBUG
-# define DEBUG_PUSH PUSH_FAILURE_INT
-# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
-#else
-# define DEBUG_PUSH(item)
-# define DEBUG_POP(item_addr)
-#endif
-
-
-/* Push the information about the state we will need
-   if we ever fail back to it.
-
-   Requires variables fail_stack, regstart, regend, reg_info, and
-   num_regs_pushed be declared.  DOUBLE_FAIL_STACK requires `destination'
-   be declared.
-
-   Does `return FAILURE_CODE' if runs out of memory.  */
-
-#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)	\
-  do {									\
-    char *destination;							\
-    /* Must be int, so when we don't save any registers, the arithmetic	\
-       of 0 + -1 isn't done as unsigned.  */				\
-    /* Can't be int, since there is not a shred of a guarantee that int	\
-       is wide enough to hold a value of something to which pointer can	\
-       be assigned */							\
-    active_reg_t this_reg;						\
-    									\
-    DEBUG_STATEMENT (failure_id++);					\
-    DEBUG_STATEMENT (nfailure_points_pushed++);				\
-    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);		\
-    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
-    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
-									\
-    DEBUG_PRINT2 ("  slots needed: %ld\n", NUM_FAILURE_ITEMS);		\
-    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);	\
-									\
-    /* Ensure we have enough space allocated for what we will push.  */	\
-    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)			\
-      {									\
-        if (!DOUBLE_FAIL_STACK (fail_stack))				\
-          return failure_code;						\
-									\
-        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",		\
-		       (fail_stack).size);				\
-        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
-      }									\
-									\
-    /* Push the info, starting with the registers.  */			\
-    DEBUG_PRINT1 ("\n");						\
-									\
-    if (1)								\
-      for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
-	   this_reg++)							\
-	{								\
-	  DEBUG_PRINT2 ("  Pushing reg: %lu\n", this_reg);		\
-	  DEBUG_STATEMENT (num_regs_pushed++);				\
-									\
-	  DEBUG_PRINT2 ("    start: %p\n", regstart[this_reg]);		\
-	  PUSH_FAILURE_POINTER (regstart[this_reg]);			\
-									\
-	  DEBUG_PRINT2 ("    end: %p\n", regend[this_reg]);		\
-	  PUSH_FAILURE_POINTER (regend[this_reg]);			\
-									\
-	  DEBUG_PRINT2 ("    info: %p\n      ",				\
-			reg_info[this_reg].word.pointer);		\
-	  DEBUG_PRINT2 (" match_null=%d",				\
-			REG_MATCH_NULL_STRING_P (reg_info[this_reg]));	\
-	  DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));	\
-	  DEBUG_PRINT2 (" matched_something=%d",			\
-			MATCHED_SOMETHING (reg_info[this_reg]));	\
-	  DEBUG_PRINT2 (" ever_matched=%d",				\
-			EVER_MATCHED_SOMETHING (reg_info[this_reg]));	\
-	  DEBUG_PRINT1 ("\n");						\
-	  PUSH_FAILURE_ELT (reg_info[this_reg].word);			\
-	}								\
-									\
-    DEBUG_PRINT2 ("  Pushing  low active reg: %ld\n", lowest_active_reg);\
-    PUSH_FAILURE_INT (lowest_active_reg);				\
-									\
-    DEBUG_PRINT2 ("  Pushing high active reg: %ld\n", highest_active_reg);\
-    PUSH_FAILURE_INT (highest_active_reg);				\
-									\
-    DEBUG_PRINT2 ("  Pushing pattern %p:\n", pattern_place);		\
-    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);		\
-    PUSH_FAILURE_POINTER (pattern_place);				\
-									\
-    DEBUG_PRINT2 ("  Pushing string %p: `", string_place);		\
-    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
-				 size2);				\
-    DEBUG_PRINT1 ("'\n");						\
-    PUSH_FAILURE_POINTER (string_place);				\
-									\
-    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);		\
-    DEBUG_PUSH (failure_id);						\
-  } while (0)
-
-/* This is the number of items that are pushed and popped on the stack
-   for each register.  */
-#define NUM_REG_ITEMS  3
-
-/* Individual items aside from the registers.  */
-#ifdef DEBUG
-# define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
-#else
-# define NUM_NONREG_ITEMS 4
-#endif
-
-/* We push at most this many items on the stack.  */
-/* We used to use (num_regs - 1), which is the number of registers
-   this regexp will save; but that was changed to 5
-   to avoid stack overflow for a regexp with lots of parens.  */
-#define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
-
-/* We actually push this many items.  */
-#define NUM_FAILURE_ITEMS				\
-  (((0							\
-     ? 0 : highest_active_reg - lowest_active_reg + 1)	\
-    * NUM_REG_ITEMS)					\
-   + NUM_NONREG_ITEMS)
-
-/* How many items can still be added to the stack without overflowing it.  */
-#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
-
-
-/* Pops what PUSH_FAIL_STACK pushes.
-
-   We restore into the parameters, all of which should be lvalues:
-     STR -- the saved data position.
-     PAT -- the saved pattern position.
-     LOW_REG, HIGH_REG -- the highest and lowest active registers.
-     REGSTART, REGEND -- arrays of string positions.
-     REG_INFO -- array of information about each subexpression.
-
-   Also assumes the variables `fail_stack' and (if debugging), `bufp',
-   `pend', `string1', `size1', `string2', and `size2'.  */
-
-#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
-{									\
-  DEBUG_STATEMENT (unsigned failure_id;)				\
-  active_reg_t this_reg;						\
-  const unsigned char *string_temp;					\
-									\
-  assert (!FAIL_STACK_EMPTY ());					\
-									\
-  /* Remove failure points and point to how many regs pushed.  */	\
-  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");				\
-  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);	\
-  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);	\
-									\
-  assert (fail_stack.avail >= NUM_NONREG_ITEMS);			\
-									\
-  DEBUG_POP (&failure_id);						\
-  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);		\
-									\
-  /* If the saved string location is NULL, it came from an		\
-     on_failure_keep_string_jump opcode, and we want to throw away the	\
-     saved NULL, thus retaining our current position in the string.  */	\
-  string_temp = POP_FAILURE_POINTER ();					\
-  if (string_temp != NULL)						\
-    str = (const char *) string_temp;					\
-									\
-  DEBUG_PRINT2 ("  Popping string %p: `", str);				\
-  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);	\
-  DEBUG_PRINT1 ("'\n");							\
-									\
-  pat = (unsigned char *) POP_FAILURE_POINTER ();			\
-  DEBUG_PRINT2 ("  Popping pattern %p:\n", pat);			\
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);			\
-									\
-  /* Restore register info.  */						\
-  high_reg = (active_reg_t) POP_FAILURE_INT ();				\
-  DEBUG_PRINT2 ("  Popping high active reg: %ld\n", high_reg);		\
-									\
-  low_reg = (active_reg_t) POP_FAILURE_INT ();				\
-  DEBUG_PRINT2 ("  Popping  low active reg: %ld\n", low_reg);		\
-									\
-  if (1)								\
-    for (this_reg = high_reg; this_reg >= low_reg; this_reg--)		\
-      {									\
-	DEBUG_PRINT2 ("    Popping reg: %ld\n", this_reg);		\
-									\
-	reg_info[this_reg].word = POP_FAILURE_ELT ();			\
-	DEBUG_PRINT2 ("      info: %p\n",				\
-		      reg_info[this_reg].word.pointer);			\
-									\
-	regend[this_reg] = (const char *) POP_FAILURE_POINTER ();	\
-	DEBUG_PRINT2 ("      end: %p\n", regend[this_reg]);		\
-									\
-	regstart[this_reg] = (const char *) POP_FAILURE_POINTER ();	\
-	DEBUG_PRINT2 ("      start: %p\n", regstart[this_reg]);		\
-      }									\
-  else									\
-    {									\
-      for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \
-	{								\
-	  reg_info[this_reg].word.integer = 0;				\
-	  regend[this_reg] = 0;						\
-	  regstart[this_reg] = 0;					\
-	}								\
-      highest_active_reg = high_reg;					\
-    }									\
-									\
-  set_regs_matched_done = 0;						\
-  DEBUG_STATEMENT (nfailure_points_popped++);				\
-} /* POP_FAILURE_POINT */
-
-
-
-/* Structure for per-register (a.k.a. per-group) information.
-   Other register information, such as the
-   starting and ending positions (which are addresses), and the list of
-   inner groups (which is a bits list) are maintained in separate
-   variables.
-
-   We are making a (strictly speaking) nonportable assumption here: that
-   the compiler will pack our bit fields into something that fits into
-   the type of `word', i.e., is something that fits into one item on the
-   failure stack.  */
-
-
-/* Declarations and macros for re_match_2.  */
-
-typedef union
-{
-  fail_stack_elt_t word;
-  struct
-  {
-      /* This field is one if this group can match the empty string,
-         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
-#define MATCH_NULL_UNSET_VALUE 3
-    unsigned match_null_string_p : 2;
-    unsigned is_active : 1;
-    unsigned matched_something : 1;
-    unsigned ever_matched_something : 1;
-  } bits;
-} register_info_type;
-
-#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
-#define IS_ACTIVE(R)  ((R).bits.is_active)
-#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
-#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
-
-
-/* Call this when have matched a real character; it sets `matched' flags
-   for the subexpressions which we are currently inside.  Also records
-   that those subexprs have matched.  */
-#define SET_REGS_MATCHED()						\
-  do									\
-    {									\
-      if (!set_regs_matched_done)					\
-	{								\
-	  active_reg_t r;						\
-	  set_regs_matched_done = 1;					\
-	  for (r = lowest_active_reg; r <= highest_active_reg; r++)	\
-	    {								\
-	      MATCHED_SOMETHING (reg_info[r])				\
-		= EVER_MATCHED_SOMETHING (reg_info[r])			\
-		= 1;							\
-	    }								\
-	}								\
-    }									\
-  while (0)
-
-/* Registers are set to a sentinel when they haven't yet matched.  */
-static char reg_unset_dummy;
-#define REG_UNSET_VALUE (&reg_unset_dummy)
-#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
-
-/* Subroutine declarations and macros for regex_compile.  */
-
-static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size,
-					      reg_syntax_t syntax,
-					      struct re_pattern_buffer *bufp));
-static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg));
-static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-				 int arg1, int arg2));
-static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-				  int arg, unsigned char *end));
-static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-				  int arg1, int arg2, unsigned char *end));
-static boolean at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p,
-					   reg_syntax_t syntax));
-static boolean at_endline_loc_p _RE_ARGS ((const char *p, const char *pend,
-					   reg_syntax_t syntax));
-static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr,
-					      const char *pend,
-					      char *translate,
-					      reg_syntax_t syntax,
-					      unsigned char *b));
-
-/* Fetch the next character in the uncompiled pattern---translating it
-   if necessary.  Also cast from a signed character in the constant
-   string passed to us by the user to an unsigned char that we can use
-   as an array index (in, e.g., `translate').  */
-#ifndef PATFETCH
-# define PATFETCH(c)							\
-  do {if (p == pend) return REG_EEND;					\
-    c = (unsigned char) *p++;						\
-    if (translate) c = (unsigned char) translate[c];			\
-  } while (0)
-#endif
-
-/* Fetch the next character in the uncompiled pattern, with no
-   translation.  */
-#define PATFETCH_RAW(c)							\
-  do {if (p == pend) return REG_EEND;					\
-    c = (unsigned char) *p++; 						\
-  } while (0)
-
-/* Go backwards one character in the pattern.  */
-#define PATUNFETCH p--
-
-
-/* If `translate' is non-null, return translate[D], else just D.  We
-   cast the subscript to translate because some data is declared as
-   `char *', to avoid warnings when a string constant is passed.  But
-   when we use a character as a subscript we must make it unsigned.  */
-#ifndef TRANSLATE
-# define TRANSLATE(d) \
-  (translate ? (char) translate[(unsigned char) (d)] : (d))
-#endif
-
-
-/* Macros for outputting the compiled pattern into `buffer'.  */
-
-/* If the buffer isn't allocated when it comes in, use this.  */
-#define INIT_BUF_SIZE  32
-
-/* Make sure we have at least N more bytes of space in buffer.  */
-#define GET_BUFFER_SPACE(n)						\
-    while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated)	\
-      EXTEND_BUFFER ()
-
-/* Make sure we have one more byte of buffer space and then add C to it.  */
-#define BUF_PUSH(c)							\
-  do {									\
-    GET_BUFFER_SPACE (1);						\
-    *b++ = (unsigned char) (c);						\
-  } while (0)
-
-
-/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
-#define BUF_PUSH_2(c1, c2)						\
-  do {									\
-    GET_BUFFER_SPACE (2);						\
-    *b++ = (unsigned char) (c1);					\
-    *b++ = (unsigned char) (c2);					\
-  } while (0)
-
-
-/* As with BUF_PUSH_2, except for three bytes.  */
-#define BUF_PUSH_3(c1, c2, c3)						\
-  do {									\
-    GET_BUFFER_SPACE (3);						\
-    *b++ = (unsigned char) (c1);					\
-    *b++ = (unsigned char) (c2);					\
-    *b++ = (unsigned char) (c3);					\
-  } while (0)
-
-
-/* Store a jump with opcode OP at LOC to location TO.  We store a
-   relative address offset by the three bytes the jump itself occupies.  */
-#define STORE_JUMP(op, loc, to) \
-  store_op1 (op, loc, (int) ((to) - (loc) - 3))
-
-/* Likewise, for a two-argument jump.  */
-#define STORE_JUMP2(op, loc, to, arg) \
-  store_op2 (op, loc, (int) ((to) - (loc) - 3), arg)
-
-/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP(op, loc, to) \
-  insert_op1 (op, loc, (int) ((to) - (loc) - 3), b)
-
-/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP2(op, loc, to, arg) \
-  insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b)
-
-
-/* This is not an arbitrary limit: the arguments which represent offsets
-   into the pattern are two bytes long.  So if 2^16 bytes turns out to
-   be too small, many things would have to change.  */
-/* Any other compiler which, like MSC, has allocation limit below 2^16
-   bytes will have to use approach similar to what was done below for
-   MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
-   reallocating to 0 bytes.  Such thing is not going to work too well.
-   You have been warned!!  */
-#if defined _MSC_VER  && !defined WIN32
-/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
-   The REALLOC define eliminates a flurry of conversion warnings,
-   but is not required. */
-# define MAX_BUF_SIZE  65500L
-# define REALLOC(p,s) realloc ((p), (size_t) (s))
-#else
-# define MAX_BUF_SIZE (1L << 16)
-# define REALLOC(p,s) realloc ((p), (s))
-#endif
-
-/* Extend the buffer by twice its current size via realloc and
-   reset the pointers that pointed into the old block to point to the
-   correct places in the new one.  If extending the buffer results in it
-   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
-#define EXTEND_BUFFER()							\
-  do { 									\
-    unsigned char *old_buffer = bufp->buffer;				\
-    if (bufp->allocated == MAX_BUF_SIZE) 				\
-      return REG_ESIZE;							\
-    bufp->allocated <<= 1;						\
-    if (bufp->allocated > MAX_BUF_SIZE)					\
-      bufp->allocated = MAX_BUF_SIZE; 					\
-    bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\
-    if (bufp->buffer == NULL)						\
-      return REG_ESPACE;						\
-    /* If the buffer moved, move all the pointers into it.  */		\
-    if (old_buffer != bufp->buffer)					\
-      {									\
-        b = (b - old_buffer) + bufp->buffer;				\
-        begalt = (begalt - old_buffer) + bufp->buffer;			\
-        if (fixup_alt_jump)						\
-          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
-        if (laststart)							\
-          laststart = (laststart - old_buffer) + bufp->buffer;		\
-        if (pending_exact)						\
-          pending_exact = (pending_exact - old_buffer) + bufp->buffer;	\
-      }									\
-  } while (0)
-
-
-/* Since we have one byte reserved for the register number argument to
-   {start,stop}_memory, the maximum number of groups we can report
-   things about is what fits in that byte.  */
-#define MAX_REGNUM 255
-
-/* But patterns can have more than `MAX_REGNUM' registers.  We just
-   ignore the excess.  */
-typedef unsigned regnum_t;
-
-
-/* Macros for the compile stack.  */
-
-/* Since offsets can go either forwards or backwards, this type needs to
-   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
-/* int may be not enough when sizeof(int) == 2.  */
-typedef long pattern_offset_t;
-
-typedef struct
-{
-  pattern_offset_t begalt_offset;
-  pattern_offset_t fixup_alt_jump;
-  pattern_offset_t inner_group_offset;
-  pattern_offset_t laststart_offset;
-  regnum_t regnum;
-} compile_stack_elt_t;
-
-
-typedef struct
-{
-  compile_stack_elt_t *stack;
-  unsigned size;
-  unsigned avail;			/* Offset of next open position.  */
-} compile_stack_type;
-
-
-#define INIT_COMPILE_STACK_SIZE 32
-
-#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
-#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
-
-/* The next available element.  */
-#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
-
-
-/* Set the bit for character C in a list.  */
-#define SET_LIST_BIT(c)                               \
-  (b[((unsigned char) (c)) / BYTEWIDTH]               \
-   |= 1 << (((unsigned char) c) % BYTEWIDTH))
-
-
-/* Get the next unsigned number in the uncompiled pattern.  */
-#define GET_UNSIGNED_NUMBER(num) 					\
-  { if (p != pend)							\
-     {									\
-       PATFETCH (c); 							\
-       while (ISDIGIT (c)) 						\
-         { 								\
-           if (num < 0)							\
-              num = 0;							\
-           num = num * 10 + c - '0'; 					\
-           if (p == pend) 						\
-              break; 							\
-           PATFETCH (c);						\
-         } 								\
-       } 								\
-    }
-
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-/* The GNU C library provides support for user-defined character classes
-   and the functions from ISO C amendement 1.  */
-# ifdef CHARCLASS_NAME_MAX
-#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
-# else
-/* This shouldn't happen but some implementation might still have this
-   problem.  Use a reasonable default value.  */
-#  define CHAR_CLASS_MAX_LENGTH 256
-# endif
-
-# ifdef _LIBC
-#  define IS_CHAR_CLASS(string) __wctype (string)
-# else
-#  define IS_CHAR_CLASS(string) wctype (string)
-# endif
-#else
-# define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
-
-# define IS_CHAR_CLASS(string)						\
-   (STREQ (string, "alpha") || STREQ (string, "upper")			\
-    || STREQ (string, "lower") || STREQ (string, "digit")		\
-    || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
-    || STREQ (string, "space") || STREQ (string, "print")		\
-    || STREQ (string, "punct") || STREQ (string, "graph")		\
-    || STREQ (string, "cntrl") || STREQ (string, "blank"))
-#endif
-
-#ifndef MATCH_MAY_ALLOCATE
-
-/* If we cannot allocate large objects within re_match_2_internal,
-   we make the fail stack and register vectors global.
-   The fail stack, we grow to the maximum size when a regexp
-   is compiled.
-   The register vectors, we adjust in size each time we
-   compile a regexp, according to the number of registers it needs.  */
-
-static fail_stack_type fail_stack;
-
-/* Size with which the following vectors are currently allocated.
-   That is so we can make them bigger as needed,
-   but never make them smaller.  */
-static int regs_allocated_size;
-
-static const char **     regstart, **     regend;
-static const char ** old_regstart, ** old_regend;
-static const char **best_regstart, **best_regend;
-static register_info_type *reg_info;
-static const char **reg_dummy;
-static register_info_type *reg_info_dummy;
-
-/* Make the register vectors big enough for NUM_REGS registers,
-   but don't make them smaller.  */
-
-static
-regex_grow_registers (num_regs)
-     int num_regs;
-{
-  if (num_regs > regs_allocated_size)
-    {
-      RETALLOC_IF (regstart,	 num_regs, const char *);
-      RETALLOC_IF (regend,	 num_regs, const char *);
-      RETALLOC_IF (old_regstart, num_regs, const char *);
-      RETALLOC_IF (old_regend,	 num_regs, const char *);
-      RETALLOC_IF (best_regstart, num_regs, const char *);
-      RETALLOC_IF (best_regend,	 num_regs, const char *);
-      RETALLOC_IF (reg_info,	 num_regs, register_info_type);
-      RETALLOC_IF (reg_dummy,	 num_regs, const char *);
-      RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
-
-      regs_allocated_size = num_regs;
-    }
-}
-
-#endif /* not MATCH_MAY_ALLOCATE */
-
-static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type
-						 compile_stack,
-						 regnum_t regnum));
-
-/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
-   Returns one of error codes defined in `regex.h', or zero for success.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate'
-   fields are set in BUFP on entry.
-
-   If it succeeds, results are put in BUFP (if it returns an error, the
-   contents of BUFP are undefined):
-     `buffer' is the compiled pattern;
-     `syntax' is set to SYNTAX;
-     `used' is set to the length of the compiled pattern;
-     `fastmap_accurate' is zero;
-     `re_nsub' is the number of subexpressions in PATTERN;
-     `not_bol' and `not_eol' are zero;
-
-   The `fastmap' and `newline_anchor' fields are neither
-   examined nor set.  */
-
-/* Return, freeing storage we allocated.  */
-#define FREE_STACK_RETURN(value)		\
-  return (free (compile_stack.stack), value)
-
-static reg_errcode_t
-regex_compile (pattern, size, syntax, bufp)
-     const char *pattern;
-     size_t size;
-     reg_syntax_t syntax;
-     struct re_pattern_buffer *bufp;
-{
-  /* We fetch characters from PATTERN here.  Even though PATTERN is
-     `char *' (i.e., signed), we declare these variables as unsigned, so
-     they can be reliably used as array indices.  */
-  register unsigned char c, c1;
-
-  /* A random temporary spot in PATTERN.  */
-  const char *p1;
-
-  /* Points to the end of the buffer, where we should append.  */
-  register unsigned char *b;
-
-  /* Keeps track of unclosed groups.  */
-  compile_stack_type compile_stack;
-
-  /* Points to the current (ending) position in the pattern.  */
-  const char *p = pattern;
-  const char *pend = pattern + size;
-
-  /* How to translate the characters in the pattern.  */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Address of the count-byte of the most recently inserted `exactn'
-     command.  This makes it possible to tell if a new exact-match
-     character can be added to that command or if the character requires
-     a new `exactn' command.  */
-  unsigned char *pending_exact = 0;
-
-  /* Address of start of the most recently finished expression.
-     This tells, e.g., postfix * where to find the start of its
-     operand.  Reset at the beginning of groups and alternatives.  */
-  unsigned char *laststart = 0;
-
-  /* Address of beginning of regexp, or inside of last group.  */
-  unsigned char *begalt;
-
-  /* Place in the uncompiled pattern (i.e., the {) to
-     which to go back if the interval is invalid.  */
-  const char *beg_interval;
-
-  /* Address of the place where a forward jump should go to the end of
-     the containing expression.  Each alternative of an `or' -- except the
-     last -- ends with a forward jump of this sort.  */
-  unsigned char *fixup_alt_jump = 0;
-
-  /* Counts open-groups as they are encountered.  Remembered for the
-     matching close-group on the compile stack, so the same register
-     number is put in the stop_memory as the start_memory.  */
-  regnum_t regnum = 0;
-
-#ifdef DEBUG
-  DEBUG_PRINT1 ("\nCompiling pattern: ");
-  if (debug)
-    {
-      unsigned debug_count;
-
-      for (debug_count = 0; debug_count < size; debug_count++)
-        putchar (pattern[debug_count]);
-      putchar ('\n');
-    }
-#endif /* DEBUG */
-
-  /* Initialize the compile stack.  */
-  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
-  if (compile_stack.stack == NULL)
-    return REG_ESPACE;
-
-  compile_stack.size = INIT_COMPILE_STACK_SIZE;
-  compile_stack.avail = 0;
-
-  /* Initialize the pattern buffer.  */
-  bufp->syntax = syntax;
-  bufp->fastmap_accurate = 0;
-  bufp->not_bol = bufp->not_eol = 0;
-
-  /* Set `used' to zero, so that if we return an error, the pattern
-     printer (for debugging) will think there's no pattern.  We reset it
-     at the end.  */
-  bufp->used = 0;
-
-  /* Always count groups, whether or not bufp->no_sub is set.  */
-  bufp->re_nsub = 0;
-
-#if !defined emacs && !defined SYNTAX_TABLE
-  /* Initialize the syntax table.  */
-   init_syntax_once ();
-#endif
-
-  if (bufp->allocated == 0)
-    {
-      if (bufp->buffer)
-	{ /* If zero allocated, but buffer is non-null, try to realloc
-             enough space.  This loses if buffer's address is bogus, but
-             that is the user's responsibility.  */
-          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
-        }
-      else
-        { /* Caller did not allocate a buffer.  Do it for them.  */
-          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
-        }
-      if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
-
-      bufp->allocated = INIT_BUF_SIZE;
-    }
-
-  begalt = b = bufp->buffer;
-
-  /* Loop through the uncompiled pattern until we're at the end.  */
-  while (p != pend)
-    {
-      PATFETCH (c);
-
-      switch (c)
-        {
-        case '^':
-          {
-            if (   /* If at start of pattern, it's an operator.  */
-                   p == pattern + 1
-                   /* If context independent, it's an operator.  */
-                || syntax & RE_CONTEXT_INDEP_ANCHORS
-                   /* Otherwise, depends on what's come before.  */
-                || at_begline_loc_p (pattern, p, syntax))
-              BUF_PUSH (begline);
-            else
-              goto normal_char;
-          }
-          break;
-
-
-        case '$':
-          {
-            if (   /* If at end of pattern, it's an operator.  */
-                   p == pend
-                   /* If context independent, it's an operator.  */
-                || syntax & RE_CONTEXT_INDEP_ANCHORS
-                   /* Otherwise, depends on what's next.  */
-                || at_endline_loc_p (p, pend, syntax))
-               BUF_PUSH (endline);
-             else
-               goto normal_char;
-           }
-           break;
-
-
-	case '+':
-        case '?':
-          if ((syntax & RE_BK_PLUS_QM)
-              || (syntax & RE_LIMITED_OPS))
-            goto normal_char;
-        handle_plus:
-        case '*':
-          /* If there is no previous pattern... */
-          if (!laststart)
-            {
-              if (syntax & RE_CONTEXT_INVALID_OPS)
-                FREE_STACK_RETURN (REG_BADRPT);
-              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
-                goto normal_char;
-            }
-
-          {
-            /* Are we optimizing this jump?  */
-            boolean keep_string_p = false;
-
-            /* 1 means zero (many) matches is allowed.  */
-            char zero_times_ok = 0, many_times_ok = 0;
-
-            /* If there is a sequence of repetition chars, collapse it
-               down to just one (the right one).  We can't combine
-               interval operators with these because of, e.g., `a{2}*',
-               which should only match an even number of `a's.  */
-
-            for (;;)
-              {
-                zero_times_ok |= c != '+';
-                many_times_ok |= c != '?';
-
-                if (p == pend)
-                  break;
-
-                PATFETCH (c);
-
-                if (c == '*'
-                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
-                  ;
-
-                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
-                  {
-                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-                    PATFETCH (c1);
-                    if (!(c1 == '+' || c1 == '?'))
-                      {
-                        PATUNFETCH;
-                        PATUNFETCH;
-                        break;
-                      }
-
-                    c = c1;
-                  }
-                else
-                  {
-                    PATUNFETCH;
-                    break;
-                  }
-
-                /* If we get here, we found another repeat character.  */
-               }
-
-            /* Star, etc. applied to an empty pattern is equivalent
-               to an empty pattern.  */
-            if (!laststart)
-              break;
-
-            /* Now we know whether or not zero matches is allowed
-               and also whether or not two or more matches is allowed.  */
-            if (many_times_ok)
-              { /* More than one repetition is allowed, so put in at the
-                   end a backward relative jump from `b' to before the next
-                   jump we're going to put in below (which jumps from
-                   laststart to after this jump).
-
-                   But if we are at the `*' in the exact sequence `.*\n',
-                   insert an unconditional jump backwards to the .,
-                   instead of the beginning of the loop.  This way we only
-                   push a failure point once, instead of every time
-                   through the loop.  */
-                assert (p - 1 > pattern);
-
-                /* Allocate the space for the jump.  */
-                GET_BUFFER_SPACE (3);
-
-                /* We know we are not at the first character of the pattern,
-                   because laststart was nonzero.  And we've already
-                   incremented `p', by the way, to be the character after
-                   the `*'.  Do we have to do something analogous here
-                   for null bytes, because of RE_DOT_NOT_NULL?  */
-                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
-		    && zero_times_ok
-                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
-                    && !(syntax & RE_DOT_NEWLINE))
-                  { /* We have .*\n.  */
-                    STORE_JUMP (jump, b, laststart);
-                    keep_string_p = true;
-                  }
-                else
-                  /* Anything else.  */
-                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
-
-                /* We've added more stuff to the buffer.  */
-                b += 3;
-              }
-
-            /* On failure, jump from laststart to b + 3, which will be the
-               end of the buffer after this jump is inserted.  */
-            GET_BUFFER_SPACE (3);
-            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
-                                       : on_failure_jump,
-                         laststart, b + 3);
-            pending_exact = 0;
-            b += 3;
-
-            if (!zero_times_ok)
-              {
-                /* At least one repetition is required, so insert a
-                   `dummy_failure_jump' before the initial
-                   `on_failure_jump' instruction of the loop. This
-                   effects a skip over that instruction the first time
-                   we hit that loop.  */
-                GET_BUFFER_SPACE (3);
-                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
-                b += 3;
-              }
-            }
-	  break;
-
-
-	case '.':
-          laststart = b;
-          BUF_PUSH (anychar);
-          break;
-
-
-        case '[':
-          {
-            boolean had_char_class = false;
-
-            if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-            /* Ensure that we have enough space to push a charset: the
-               opcode, the length count, and the bitset; 34 bytes in all.  */
-	    GET_BUFFER_SPACE (34);
-
-            laststart = b;
-
-            /* We test `*p == '^' twice, instead of using an if
-               statement, so we only need one BUF_PUSH.  */
-            BUF_PUSH (*p == '^' ? charset_not : charset);
-            if (*p == '^')
-              p++;
-
-            /* Remember the first position in the bracket expression.  */
-            p1 = p;
-
-            /* Push the number of bytes in the bitmap.  */
-            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
-
-            /* Clear the whole map.  */
-            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
-
-            /* charset_not matches newline according to a syntax bit.  */
-            if ((re_opcode_t) b[-2] == charset_not
-                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
-              SET_LIST_BIT ('\n');
-
-            /* Read in characters and ranges, setting map bits.  */
-            for (;;)
-              {
-                if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                PATFETCH (c);
-
-                /* \ might escape characters inside [...] and [^...].  */
-                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
-                  {
-                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-                    PATFETCH (c1);
-                    SET_LIST_BIT (c1);
-                    continue;
-                  }
-
-                /* Could be the end of the bracket expression.  If it's
-                   not (i.e., when the bracket expression is `[]' so
-                   far), the ']' character bit gets set way below.  */
-                if (c == ']' && p != p1 + 1)
-                  break;
-
-                /* Look ahead to see if it's a range when the last thing
-                   was a character class.  */
-                if (had_char_class && c == '-' && *p != ']')
-                  FREE_STACK_RETURN (REG_ERANGE);
-
-                /* Look ahead to see if it's a range when the last thing
-                   was a character: if this is a hyphen not at the
-                   beginning or the end of a list, then it's the range
-                   operator.  */
-                if (c == '-'
-                    && !(p - 2 >= pattern && p[-2] == '[')
-                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
-                    && *p != ']')
-                  {
-                    reg_errcode_t ret
-                      = compile_range (&p, pend, translate, syntax, b);
-                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
-                  }
-
-                else if (p[0] == '-' && p[1] != ']')
-                  { /* This handles ranges made up of characters only.  */
-                    reg_errcode_t ret;
-
-		    /* Move past the `-'.  */
-                    PATFETCH (c1);
-
-                    ret = compile_range (&p, pend, translate, syntax, b);
-                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
-                  }
-
-                /* See if we're at the beginning of a possible character
-                   class.  */
-
-                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
-                  { /* Leave room for the null.  */
-                    char str[CHAR_CLASS_MAX_LENGTH + 1];
-
-                    PATFETCH (c);
-                    c1 = 0;
-
-                    /* If pattern is `[[:'.  */
-                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                    for (;;)
-                      {
-                        PATFETCH (c);
-                        if ((c == ':' && *p == ']') || p == pend)
-                          break;
-			if (c1 < CHAR_CLASS_MAX_LENGTH)
-			  str[c1++] = c;
-			else
-			  /* This is in any case an invalid class name.  */
-			  str[0] = '\0';
-                      }
-                    str[c1] = '\0';
-
-                    /* If isn't a word bracketed by `[:' and `:]':
-                       undo the ending character, the letters, and leave
-                       the leading `:' and `[' (but set bits for them).  */
-                    if (c == ':' && *p == ']')
-                      {
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-                        boolean is_lower = STREQ (str, "lower");
-                        boolean is_upper = STREQ (str, "upper");
-			wctype_t wt;
-                        int ch;
-
-			wt = IS_CHAR_CLASS (str);
-			if (wt == 0)
-			  FREE_STACK_RETURN (REG_ECTYPE);
-
-                        /* Throw away the ] at the end of the character
-                           class.  */
-                        PATFETCH (c);
-
-                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                        for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
-			  {
-# ifdef _LIBC
-			    if (__iswctype (__btowc (ch), wt))
-			      SET_LIST_BIT (ch);
-# else
-			    if (iswctype (btowc (ch), wt))
-			      SET_LIST_BIT (ch);
-# endif
-
-			    if (translate && (is_upper || is_lower)
-				&& (ISUPPER (ch) || ISLOWER (ch)))
-			      SET_LIST_BIT (ch);
-			  }
-
-                        had_char_class = true;
-#else
-                        int ch;
-                        boolean is_alnum = STREQ (str, "alnum");
-                        boolean is_alpha = STREQ (str, "alpha");
-                        boolean is_blank = STREQ (str, "blank");
-                        boolean is_cntrl = STREQ (str, "cntrl");
-                        boolean is_digit = STREQ (str, "digit");
-                        boolean is_graph = STREQ (str, "graph");
-                        boolean is_lower = STREQ (str, "lower");
-                        boolean is_print = STREQ (str, "print");
-                        boolean is_punct = STREQ (str, "punct");
-                        boolean is_space = STREQ (str, "space");
-                        boolean is_upper = STREQ (str, "upper");
-                        boolean is_xdigit = STREQ (str, "xdigit");
-
-                        if (!IS_CHAR_CLASS (str))
-			  FREE_STACK_RETURN (REG_ECTYPE);
-
-                        /* Throw away the ] at the end of the character
-                           class.  */
-                        PATFETCH (c);
-
-                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
-                          {
-			    /* This was split into 3 if's to
-			       avoid an arbitrary limit in some compiler.  */
-                            if (   (is_alnum  && ISALNUM (ch))
-                                || (is_alpha  && ISALPHA (ch))
-                                || (is_blank  && ISBLANK (ch))
-                                || (is_cntrl  && ISCNTRL (ch)))
-			      SET_LIST_BIT (ch);
-			    if (   (is_digit  && ISDIGIT (ch))
-                                || (is_graph  && ISGRAPH (ch))
-                                || (is_lower  && ISLOWER (ch))
-                                || (is_print  && ISPRINT (ch)))
-			      SET_LIST_BIT (ch);
-			    if (   (is_punct  && ISPUNCT (ch))
-                                || (is_space  && ISSPACE (ch))
-                                || (is_upper  && ISUPPER (ch))
-                                || (is_xdigit && ISXDIGIT (ch)))
-			      SET_LIST_BIT (ch);
-			    if (   translate && (is_upper || is_lower)
-				&& (ISUPPER (ch) || ISLOWER (ch)))
-			      SET_LIST_BIT (ch);
-                          }
-                        had_char_class = true;
-#endif	/* libc || wctype.h */
-                      }
-                    else
-                      {
-                        c1++;
-                        while (c1--)
-                          PATUNFETCH;
-                        SET_LIST_BIT ('[');
-                        SET_LIST_BIT (':');
-                        had_char_class = false;
-                      }
-                  }
-                else
-                  {
-                    had_char_class = false;
-                    SET_LIST_BIT (c);
-                  }
-              }
-
-            /* Discard any (non)matching list bytes that are all 0 at the
-               end of the map.  Decrease the map-length byte too.  */
-            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
-              b[-1]--;
-            b += b[-1];
-          }
-          break;
-
-
-	case '(':
-          if (syntax & RE_NO_BK_PARENS)
-            goto handle_open;
-          else
-            goto normal_char;
-
-
-        case ')':
-          if (syntax & RE_NO_BK_PARENS)
-            goto handle_close;
-          else
-            goto normal_char;
-
-
-        case '\n':
-          if (syntax & RE_NEWLINE_ALT)
-            goto handle_alt;
-          else
-            goto normal_char;
-
-
-	case '|':
-          if (syntax & RE_NO_BK_VBAR)
-            goto handle_alt;
-          else
-            goto normal_char;
-
-
-        case '{':
-           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
-             goto handle_interval;
-           else
-             goto normal_char;
-
-
-        case '\\':
-          if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-          /* Do not translate the character after the \, so that we can
-             distinguish, e.g., \B from \b, even if we normally would
-             translate, e.g., B to b.  */
-          PATFETCH_RAW (c);
-
-          switch (c)
-            {
-            case '(':
-              if (syntax & RE_NO_BK_PARENS)
-                goto normal_backslash;
-
-            handle_open:
-              bufp->re_nsub++;
-              regnum++;
-
-              if (COMPILE_STACK_FULL)
-                {
-                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
-                            compile_stack_elt_t);
-                  if (compile_stack.stack == NULL) return REG_ESPACE;
-
-                  compile_stack.size <<= 1;
-                }
-
-              /* These are the values to restore when we hit end of this
-                 group.  They are all relative offsets, so that if the
-                 whole pattern moves because of realloc, they will still
-                 be valid.  */
-              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
-              COMPILE_STACK_TOP.fixup_alt_jump
-                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
-              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
-              COMPILE_STACK_TOP.regnum = regnum;
-
-              /* We will eventually replace the 0 with the number of
-                 groups inner to this one.  But do not push a
-                 start_memory for groups beyond the last one we can
-                 represent in the compiled pattern.  */
-              if (regnum <= MAX_REGNUM)
-                {
-                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
-                  BUF_PUSH_3 (start_memory, regnum, 0);
-                }
-
-              compile_stack.avail++;
-
-              fixup_alt_jump = 0;
-              laststart = 0;
-              begalt = b;
-	      /* If we've reached MAX_REGNUM groups, then this open
-		 won't actually generate any code, so we'll have to
-		 clear pending_exact explicitly.  */
-	      pending_exact = 0;
-              break;
-
-
-            case ')':
-              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
-
-              if (COMPILE_STACK_EMPTY)
-		{
-		  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-		    goto normal_backslash;
-		  else
-		    FREE_STACK_RETURN (REG_ERPAREN);
-		}
-
-            handle_close:
-              if (fixup_alt_jump)
-                { /* Push a dummy failure point at the end of the
-                     alternative for a possible future
-                     `pop_failure_jump' to pop.  See comments at
-                     `push_dummy_failure' in `re_match_2'.  */
-                  BUF_PUSH (push_dummy_failure);
-
-                  /* We allocated space for this jump when we assigned
-                     to `fixup_alt_jump', in the `handle_alt' case below.  */
-                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
-                }
-
-              /* See similar code for backslashed left paren above.  */
-              if (COMPILE_STACK_EMPTY)
-		{
-		  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-		    goto normal_char;
-		  else
-		    FREE_STACK_RETURN (REG_ERPAREN);
-		}
-
-              /* Since we just checked for an empty stack above, this
-                 ``can't happen''.  */
-              assert (compile_stack.avail != 0);
-              {
-                /* We don't just want to restore into `regnum', because
-                   later groups should continue to be numbered higher,
-                   as in `(ab)c(de)' -- the second group is #2.  */
-                regnum_t this_group_regnum;
-
-                compile_stack.avail--;
-                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
-                fixup_alt_jump
-                  = COMPILE_STACK_TOP.fixup_alt_jump
-                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
-                    : 0;
-                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
-                this_group_regnum = COMPILE_STACK_TOP.regnum;
-		/* If we've reached MAX_REGNUM groups, then this open
-		   won't actually generate any code, so we'll have to
-		   clear pending_exact explicitly.  */
-		pending_exact = 0;
-
-                /* We're at the end of the group, so now we know how many
-                   groups were inside this one.  */
-                if (this_group_regnum <= MAX_REGNUM)
-                  {
-                    unsigned char *inner_group_loc
-                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
-
-                    *inner_group_loc = regnum - this_group_regnum;
-                    BUF_PUSH_3 (stop_memory, this_group_regnum,
-                                regnum - this_group_regnum);
-                  }
-              }
-              break;
-
-
-            case '|':					/* `\|'.  */
-              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
-                goto normal_backslash;
-            handle_alt:
-              if (syntax & RE_LIMITED_OPS)
-                goto normal_char;
-
-              /* Insert before the previous alternative a jump which
-                 jumps to this alternative if the former fails.  */
-              GET_BUFFER_SPACE (3);
-              INSERT_JUMP (on_failure_jump, begalt, b + 6);
-              pending_exact = 0;
-              b += 3;
-
-              /* The alternative before this one has a jump after it
-                 which gets executed if it gets matched.  Adjust that
-                 jump so it will jump to this alternative's analogous
-                 jump (put in below, which in turn will jump to the next
-                 (if any) alternative's such jump, etc.).  The last such
-                 jump jumps to the correct final destination.  A picture:
-                          _____ _____
-                          |   | |   |
-                          |   v |   v
-                         a | b   | c
-
-                 If we are at `b', then fixup_alt_jump right now points to a
-                 three-byte space after `a'.  We'll put in the jump, set
-                 fixup_alt_jump to right after `b', and leave behind three
-                 bytes which we'll fill in when we get to after `c'.  */
-
-              if (fixup_alt_jump)
-                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
-
-              /* Mark and leave space for a jump after this alternative,
-                 to be filled in later either by next alternative or
-                 when know we're at the end of a series of alternatives.  */
-              fixup_alt_jump = b;
-              GET_BUFFER_SPACE (3);
-              b += 3;
-
-              laststart = 0;
-              begalt = b;
-              break;
-
-
-            case '{':
-              /* If \{ is a literal.  */
-              if (!(syntax & RE_INTERVALS)
-                     /* If we're at `\{' and it's not the open-interval
-                        operator.  */
-                  || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
-                  || (p - 2 == pattern  &&  p == pend))
-                goto normal_backslash;
-
-            handle_interval:
-              {
-                /* If got here, then the syntax allows intervals.  */
-
-                /* At least (most) this many matches must be made.  */
-                int lower_bound = -1, upper_bound = -1;
-
-                beg_interval = p - 1;
-
-                if (p == pend)
-                  {
-                    if (syntax & RE_NO_BK_BRACES)
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_EBRACE);
-                  }
-
-                GET_UNSIGNED_NUMBER (lower_bound);
-
-                if (c == ',')
-                  {
-                    GET_UNSIGNED_NUMBER (upper_bound);
-                    if (upper_bound < 0) upper_bound = RE_DUP_MAX;
-                  }
-                else
-                  /* Interval such as `{1}' => match exactly once. */
-                  upper_bound = lower_bound;
-
-                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
-                    || lower_bound > upper_bound)
-                  {
-                    if (syntax & RE_NO_BK_BRACES)
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_BADBR);
-                  }
-
-                if (!(syntax & RE_NO_BK_BRACES))
-                  {
-                    if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
-
-                    PATFETCH (c);
-                  }
-
-                if (c != '}')
-                  {
-                    if (syntax & RE_NO_BK_BRACES)
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_BADBR);
-                  }
-
-                /* We just parsed a valid interval.  */
-
-                /* If it's invalid to have no preceding re.  */
-                if (!laststart)
-                  {
-                    if (syntax & RE_CONTEXT_INVALID_OPS)
-                      FREE_STACK_RETURN (REG_BADRPT);
-                    else if (syntax & RE_CONTEXT_INDEP_OPS)
-                      laststart = b;
-                    else
-                      goto unfetch_interval;
-                  }
-
-                /* If the upper bound is zero, don't want to succeed at
-                   all; jump from `laststart' to `b + 3', which will be
-                   the end of the buffer after we insert the jump.  */
-                 if (upper_bound == 0)
-                   {
-                     GET_BUFFER_SPACE (3);
-                     INSERT_JUMP (jump, laststart, b + 3);
-                     b += 3;
-                   }
-
-                 /* Otherwise, we have a nontrivial interval.  When
-                    we're all done, the pattern will look like:
-                      set_number_at <jump count> <upper bound>
-                      set_number_at <succeed_n count> <lower bound>
-                      succeed_n <after jump addr> <succeed_n count>
-                      <body of loop>
-                      jump_n <succeed_n addr> <jump count>
-                    (The upper bound and `jump_n' are omitted if
-                    `upper_bound' is 1, though.)  */
-                 else
-                   { /* If the upper bound is > 1, we need to insert
-                        more at the end of the loop.  */
-                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
-
-                     GET_BUFFER_SPACE (nbytes);
-
-                     /* Initialize lower bound of the `succeed_n', even
-                        though it will be set during matching by its
-                        attendant `set_number_at' (inserted next),
-                        because `re_compile_fastmap' needs to know.
-                        Jump to the `jump_n' we might insert below.  */
-                     INSERT_JUMP2 (succeed_n, laststart,
-                                   b + 5 + (upper_bound > 1) * 5,
-                                   lower_bound);
-                     b += 5;
-
-                     /* Code to initialize the lower bound.  Insert
-                        before the `succeed_n'.  The `5' is the last two
-                        bytes of this `set_number_at', plus 3 bytes of
-                        the following `succeed_n'.  */
-                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
-                     b += 5;
-
-                     if (upper_bound > 1)
-                       { /* More than one repetition is allowed, so
-                            append a backward jump to the `succeed_n'
-                            that starts this interval.
-
-                            When we've reached this during matching,
-                            we'll have matched the interval once, so
-                            jump back only `upper_bound - 1' times.  */
-                         STORE_JUMP2 (jump_n, b, laststart + 5,
-                                      upper_bound - 1);
-                         b += 5;
-
-                         /* The location we want to set is the second
-                            parameter of the `jump_n'; that is `b-2' as
-                            an absolute address.  `laststart' will be
-                            the `set_number_at' we're about to insert;
-                            `laststart+3' the number to set, the source
-                            for the relative address.  But we are
-                            inserting into the middle of the pattern --
-                            so everything is getting moved up by 5.
-                            Conclusion: (b - 2) - (laststart + 3) + 5,
-                            i.e., b - laststart.
-
-                            We insert this at the beginning of the loop
-                            so that if we fail during matching, we'll
-                            reinitialize the bounds.  */
-                         insert_op2 (set_number_at, laststart, b - laststart,
-                                     upper_bound - 1, b);
-                         b += 5;
-                       }
-                   }
-                pending_exact = 0;
-                beg_interval = NULL;
-              }
-              break;
-
-            unfetch_interval:
-              /* If an invalid interval, match the characters as literals.  */
-               assert (beg_interval);
-               p = beg_interval;
-               beg_interval = NULL;
-
-               /* normal_char and normal_backslash need `c'.  */
-               PATFETCH (c);
-
-               if (!(syntax & RE_NO_BK_BRACES))
-                 {
-                   if (p > pattern  &&  p[-1] == '\\')
-                     goto normal_backslash;
-                 }
-               goto normal_char;
-
-#ifdef emacs
-            /* There is no way to specify the before_dot and after_dot
-               operators.  rms says this is ok.  --karl  */
-            case '=':
-              BUF_PUSH (at_dot);
-              break;
-
-            case 's':
-              laststart = b;
-              PATFETCH (c);
-              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
-              break;
-
-            case 'S':
-              laststart = b;
-              PATFETCH (c);
-              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
-              break;
-#endif /* emacs */
-
-
-            case 'w':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              laststart = b;
-              BUF_PUSH (wordchar);
-              break;
-
-
-            case 'W':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              laststart = b;
-              BUF_PUSH (notwordchar);
-              break;
-
-
-            case '<':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (wordbeg);
-              break;
-
-            case '>':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (wordend);
-              break;
-
-            case 'b':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (wordbound);
-              break;
-
-            case 'B':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (notwordbound);
-              break;
-
-            case '`':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (begbuf);
-              break;
-
-            case '\'':
-	      if (syntax & RE_NO_GNU_OPS)
-		goto normal_char;
-              BUF_PUSH (endbuf);
-              break;
-
-            case '1': case '2': case '3': case '4': case '5':
-            case '6': case '7': case '8': case '9':
-              if (syntax & RE_NO_BK_REFS)
-                goto normal_char;
-
-              c1 = c - '0';
-
-              if (c1 > regnum)
-                FREE_STACK_RETURN (REG_ESUBREG);
-
-              /* Can't back reference to a subexpression if inside of it.  */
-              if (group_in_compile_stack (compile_stack, (regnum_t) c1))
-                goto normal_char;
-
-              laststart = b;
-              BUF_PUSH_2 (duplicate, c1);
-              break;
-
-
-            case '+':
-            case '?':
-              if (syntax & RE_BK_PLUS_QM)
-                goto handle_plus;
-              else
-                goto normal_backslash;
-
-            default:
-            normal_backslash:
-              /* You might think it would be useful for \ to mean
-                 not to translate; but if we don't translate it
-                 it will never match anything.  */
-              c = TRANSLATE (c);
-              goto normal_char;
-            }
-          break;
-
-
-	default:
-        /* Expects the character in `c'.  */
-	normal_char:
-	      /* If no exactn currently being built.  */
-          if (!pending_exact
-
-              /* If last exactn not at current position.  */
-              || pending_exact + *pending_exact + 1 != b
-
-              /* We have only one byte following the exactn for the count.  */
-	      || *pending_exact == (1 << BYTEWIDTH) - 1
-
-              /* If followed by a repetition operator.  */
-              || *p == '*' || *p == '^'
-	      || ((syntax & RE_BK_PLUS_QM)
-		  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
-		  : (*p == '+' || *p == '?'))
-	      || ((syntax & RE_INTERVALS)
-                  && ((syntax & RE_NO_BK_BRACES)
-		      ? *p == '{'
-                      : (p[0] == '\\' && p[1] == '{'))))
-	    {
-	      /* Start building a new exactn.  */
-
-              laststart = b;
-
-	      BUF_PUSH_2 (exactn, 0);
-	      pending_exact = b - 1;
-            }
-
-	  BUF_PUSH (c);
-          (*pending_exact)++;
-	  break;
-        } /* switch (c) */
-    } /* while p != pend */
-
-
-  /* Through the pattern now.  */
-
-  if (fixup_alt_jump)
-    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
-
-  if (!COMPILE_STACK_EMPTY)
-    FREE_STACK_RETURN (REG_EPAREN);
-
-  /* If we don't want backtracking, force success
-     the first time we reach the end of the compiled pattern.  */
-  if (syntax & RE_NO_POSIX_BACKTRACKING)
-    BUF_PUSH (succeed);
-
-  free (compile_stack.stack);
-
-  /* We have succeeded; set the length of the buffer.  */
-  bufp->used = b - bufp->buffer;
-
-#ifdef DEBUG
-  if (debug)
-    {
-      DEBUG_PRINT1 ("\nCompiled pattern: \n");
-      print_compiled_pattern (bufp);
-    }
-#endif /* DEBUG */
-
-#ifndef MATCH_MAY_ALLOCATE
-  /* Initialize the failure stack to the largest possible stack.  This
-     isn't necessary unless we're trying to avoid calling alloca in
-     the search and match routines.  */
-  {
-    int num_regs = bufp->re_nsub + 1;
-
-    /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
-       is strictly greater than re_max_failures, the largest possible stack
-       is 2 * re_max_failures failure points.  */
-    if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
-      {
-	fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
-
-# ifdef emacs
-	if (! fail_stack.stack)
-	  fail_stack.stack
-	    = (fail_stack_elt_t *) xmalloc (fail_stack.size
-					    * sizeof (fail_stack_elt_t));
-	else
-	  fail_stack.stack
-	    = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
-					     (fail_stack.size
-					      * sizeof (fail_stack_elt_t)));
-# else /* not emacs */
-	if (! fail_stack.stack)
-	  fail_stack.stack
-	    = (fail_stack_elt_t *) malloc (fail_stack.size
-					   * sizeof (fail_stack_elt_t));
-	else
-	  fail_stack.stack
-	    = (fail_stack_elt_t *) realloc (fail_stack.stack,
-					    (fail_stack.size
-					     * sizeof (fail_stack_elt_t)));
-# endif /* not emacs */
-      }
-
-    regex_grow_registers (num_regs);
-  }
-#endif /* not MATCH_MAY_ALLOCATE */
-
-  return REG_NOERROR;
-} /* regex_compile */
-
-/* Subroutines for `regex_compile'.  */
-
-/* Store OP at LOC followed by two-byte integer parameter ARG.  */
-
-static void
-store_op1 (op, loc, arg)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg;
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg);
-}
-
-
-/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-store_op2 (op, loc, arg1, arg2)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg1, arg2;
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg1);
-  STORE_NUMBER (loc + 3, arg2);
-}
-
-
-/* Copy the bytes from LOC to END to open up three bytes of space at LOC
-   for OP followed by two-byte integer parameter ARG.  */
-
-static void
-insert_op1 (op, loc, arg, end)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg;
-    unsigned char *end;
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 3;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op1 (op, loc, arg);
-}
-
-
-/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-insert_op2 (op, loc, arg1, arg2, end)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg1, arg2;
-    unsigned char *end;
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 5;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op2 (op, loc, arg1, arg2);
-}
-
-
-/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
-   after an alternative or a begin-subexpression.  We assume there is at
-   least one character before the ^.  */
-
-static boolean
-at_begline_loc_p (pattern, p, syntax)
-    const char *pattern, *p;
-    reg_syntax_t syntax;
-{
-  const char *prev = p - 2;
-  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
-
-  return
-       /* After a subexpression?  */
-       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
-       /* After an alternative?  */
-    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
-}
-
-
-/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
-   at least one character after the $, i.e., `P < PEND'.  */
-
-static boolean
-at_endline_loc_p (p, pend, syntax)
-    const char *p, *pend;
-    reg_syntax_t syntax;
-{
-  const char *next = p;
-  boolean next_backslash = *next == '\\';
-  const char *next_next = p + 1 < pend ? p + 1 : 0;
-
-  return
-       /* Before a subexpression?  */
-       (syntax & RE_NO_BK_PARENS ? *next == ')'
-        : next_backslash && next_next && *next_next == ')')
-       /* Before an alternative?  */
-    || (syntax & RE_NO_BK_VBAR ? *next == '|'
-        : next_backslash && next_next && *next_next == '|');
-}
-
-
-/* Returns true if REGNUM is in one of COMPILE_STACK's elements and
-   false if it's not.  */
-
-static boolean
-group_in_compile_stack (compile_stack, regnum)
-    compile_stack_type compile_stack;
-    regnum_t regnum;
-{
-  int this_element;
-
-  for (this_element = compile_stack.avail - 1;
-       this_element >= 0;
-       this_element--)
-    if (compile_stack.stack[this_element].regnum == regnum)
-      return true;
-
-  return false;
-}
-
-
-/* Read the ending character of a range (in a bracket expression) from the
-   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
-   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
-   Then we set the translation of all bits between the starting and
-   ending characters (inclusive) in the compiled pattern B.
-
-   Return an error code.
-
-   We use these short variable names so we can use the same macros as
-   `regex_compile' itself.  */
-
-static reg_errcode_t
-compile_range (p_ptr, pend, translate, syntax, b)
-    const char **p_ptr, *pend;
-    RE_TRANSLATE_TYPE translate;
-    reg_syntax_t syntax;
-    unsigned char *b;
-{
-  unsigned this_char;
-
-  const char *p = *p_ptr;
-  unsigned int range_start, range_end;
-
-  if (p == pend)
-    return REG_ERANGE;
-
-  /* Even though the pattern is a signed `char *', we need to fetch
-     with unsigned char *'s; if the high bit of the pattern character
-     is set, the range endpoints will be negative if we fetch using a
-     signed char *.
-
-     We also want to fetch the endpoints without translating them; the
-     appropriate translation is done in the bit-setting loop below.  */
-  /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *.  */
-  range_start = ((const unsigned char *) p)[-2];
-  range_end   = ((const unsigned char *) p)[0];
-
-  /* Have to increment the pointer into the pattern string, so the
-     caller isn't still at the ending character.  */
-  (*p_ptr)++;
-
-  /* If the start is after the end, the range is empty.  */
-  if (range_start > range_end)
-    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
-
-  /* Here we see why `this_char' has to be larger than an `unsigned
-     char' -- the range is inclusive, so if `range_end' == 0xff
-     (assuming 8-bit characters), we would otherwise go into an infinite
-     loop, since all characters <= 0xff.  */
-  for (this_char = range_start; this_char <= range_end; this_char++)
-    {
-      SET_LIST_BIT (TRANSLATE (this_char));
-    }
-
-  return REG_NOERROR;
-}
-
-/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
-   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
-   characters can start a string that matches the pattern.  This fastmap
-   is used by re_search to skip quickly over impossible starting points.
-
-   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
-   area as BUFP->fastmap.
-
-   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
-   the pattern buffer.
-
-   Returns 0 if we succeed, -2 if an internal error.   */
-
-int
-re_compile_fastmap (bufp)
-     struct re_pattern_buffer *bufp;
-{
-  int j, k;
-#ifdef MATCH_MAY_ALLOCATE
-  fail_stack_type fail_stack;
-#endif
-#ifndef REGEX_MALLOC
-  char *destination;
-#endif
-
-  register char *fastmap = bufp->fastmap;
-  unsigned char *pattern = bufp->buffer;
-  unsigned char *p = pattern;
-  register unsigned char *pend = pattern + bufp->used;
-
-#ifdef REL_ALLOC
-  /* This holds the pointer to the failure stack, when
-     it is allocated relocatably.  */
-  fail_stack_elt_t *failure_stack_ptr;
-#endif
-
-  /* Assume that each path through the pattern can be null until
-     proven otherwise.  We set this false at the bottom of switch
-     statement, to which we get only if a particular path doesn't
-     match the empty string.  */
-  boolean path_can_be_null = true;
-
-  /* We aren't doing a `succeed_n' to begin with.  */
-  boolean succeed_n_p = false;
-
-  assert (fastmap != NULL && p != NULL);
-
-  INIT_FAIL_STACK ();
-  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
-  bufp->fastmap_accurate = 1;	    /* It will be when we're done.  */
-  bufp->can_be_null = 0;
-
-  while (1)
-    {
-      if (p == pend || *p == succeed)
-	{
-	  /* We have reached the (effective) end of pattern.  */
-	  if (!FAIL_STACK_EMPTY ())
-	    {
-	      bufp->can_be_null |= path_can_be_null;
-
-	      /* Reset for next path.  */
-	      path_can_be_null = true;
-
-	      p = fail_stack.stack[--fail_stack.avail].pointer;
-
-	      continue;
-	    }
-	  else
-	    break;
-	}
-
-      /* We should never be about to go beyond the end of the pattern.  */
-      assert (p < pend);
-
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-	{
-
-        /* I guess the idea here is to simply not bother with a fastmap
-           if a backreference is used, since it's too hard to figure out
-           the fastmap for the corresponding group.  Setting
-           `can_be_null' stops `re_search_2' from using the fastmap, so
-           that is all we do.  */
-	case duplicate:
-	  bufp->can_be_null = 1;
-          goto done;
-
-
-      /* Following are the cases which match a character.  These end
-         with `break'.  */
-
-	case exactn:
-          fastmap[p[1]] = 1;
-	  break;
-
-
-        case charset:
-          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
-	    if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
-              fastmap[j] = 1;
-	  break;
-
-
-	case charset_not:
-	  /* Chars beyond end of map must be allowed.  */
-	  for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
-            fastmap[j] = 1;
-
-	  for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
-	    if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
-              fastmap[j] = 1;
-          break;
-
-
-	case wordchar:
-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
-	    if (SYNTAX (j) == Sword)
-	      fastmap[j] = 1;
-	  break;
-
-
-	case notwordchar:
-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
-	    if (SYNTAX (j) != Sword)
-	      fastmap[j] = 1;
-	  break;
-
-
-        case anychar:
-	  {
-	    int fastmap_newline = fastmap['\n'];
-
-	    /* `.' matches anything ...  */
-	    for (j = 0; j < (1 << BYTEWIDTH); j++)
-	      fastmap[j] = 1;
-
-	    /* ... except perhaps newline.  */
-	    if (!(bufp->syntax & RE_DOT_NEWLINE))
-	      fastmap['\n'] = fastmap_newline;
-
-	    /* Return if we have already set `can_be_null'; if we have,
-	       then the fastmap is irrelevant.  Something's wrong here.  */
-	    else if (bufp->can_be_null)
-	      goto done;
-
-	    /* Otherwise, have to check alternative paths.  */
-	    break;
-	  }
-
-#ifdef emacs
-        case syntaxspec:
-	  k = *p++;
-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
-	    if (SYNTAX (j) == (enum syntaxcode) k)
-	      fastmap[j] = 1;
-	  break;
-
-
-	case notsyntaxspec:
-	  k = *p++;
-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
-	    if (SYNTAX (j) != (enum syntaxcode) k)
-	      fastmap[j] = 1;
-	  break;
-
-
-      /* All cases after this match the empty string.  These end with
-         `continue'.  */
-
-
-	case before_dot:
-	case at_dot:
-	case after_dot:
-          continue;
-#endif /* emacs */
-
-
-        case no_op:
-        case begline:
-        case endline:
-	case begbuf:
-	case endbuf:
-	case wordbound:
-	case notwordbound:
-	case wordbeg:
-	case wordend:
-        case push_dummy_failure:
-          continue;
-
-
-	case jump_n:
-        case pop_failure_jump:
-	case maybe_pop_jump:
-	case jump:
-        case jump_past_alt:
-	case dummy_failure_jump:
-          EXTRACT_NUMBER_AND_INCR (j, p);
-	  p += j;
-	  if (j > 0)
-	    continue;
-
-          /* Jump backward implies we just went through the body of a
-             loop and matched nothing.  Opcode jumped to should be
-             `on_failure_jump' or `succeed_n'.  Just treat it like an
-             ordinary jump.  For a * loop, it has pushed its failure
-             point already; if so, discard that as redundant.  */
-          if ((re_opcode_t) *p != on_failure_jump
-	      && (re_opcode_t) *p != succeed_n)
-	    continue;
-
-          p++;
-          EXTRACT_NUMBER_AND_INCR (j, p);
-          p += j;
-
-          /* If what's on the stack is where we are now, pop it.  */
-          if (!FAIL_STACK_EMPTY ()
-	      && fail_stack.stack[fail_stack.avail - 1].pointer == p)
-            fail_stack.avail--;
-
-          continue;
-
-
-        case on_failure_jump:
-        case on_failure_keep_string_jump:
-	handle_on_failure_jump:
-          EXTRACT_NUMBER_AND_INCR (j, p);
-
-          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
-             end of the pattern.  We don't want to push such a point,
-             since when we restore it above, entering the switch will
-             increment `p' past the end of the pattern.  We don't need
-             to push such a point since we obviously won't find any more
-             fastmap entries beyond `pend'.  Such a pattern can match
-             the null string, though.  */
-          if (p + j < pend)
-            {
-              if (!PUSH_PATTERN_OP (p + j, fail_stack))
-		{
-		  RESET_FAIL_STACK ();
-		  return -2;
-		}
-            }
-          else
-            bufp->can_be_null = 1;
-
-          if (succeed_n_p)
-            {
-              EXTRACT_NUMBER_AND_INCR (k, p);	/* Skip the n.  */
-              succeed_n_p = false;
-	    }
-
-          continue;
-
-
-	case succeed_n:
-          /* Get to the number of times to succeed.  */
-          p += 2;
-
-          /* Increment p past the n for when k != 0.  */
-          EXTRACT_NUMBER_AND_INCR (k, p);
-          if (k == 0)
-	    {
-              p -= 4;
-  	      succeed_n_p = true;  /* Spaghetti code alert.  */
-              goto handle_on_failure_jump;
-            }
-          continue;
-
-
-	case set_number_at:
-          p += 4;
-          continue;
-
-
-	case start_memory:
-        case stop_memory:
-	  p += 2;
-	  continue;
-
-
-	default:
-          abort (); /* We have listed all the cases.  */
-        } /* switch *p++ */
-
-      /* Getting here means we have found the possible starting
-         characters for one path of the pattern -- and that the empty
-         string does not match.  We need not follow this path further.
-         Instead, look at the next alternative (remembered on the
-         stack), or quit if no more.  The test at the top of the loop
-         does these things.  */
-      path_can_be_null = false;
-      p = pend;
-    } /* while p */
-
-  /* Set `can_be_null' for the last path (also the first path, if the
-     pattern is empty).  */
-  bufp->can_be_null |= path_can_be_null;
-
- done:
-  RESET_FAIL_STACK ();
-  return 0;
-} /* re_compile_fastmap */
-#ifdef _LIBC
-weak_alias (__re_compile_fastmap, re_compile_fastmap)
-#endif
-
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
-   this memory for recording register information.  STARTS and ENDS
-   must be allocated using the malloc library routine, and must each
-   be at least NUM_REGS * sizeof (regoff_t) bytes long.
-
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
-
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-
-void
-re_set_registers (bufp, regs, num_regs, starts, ends)
-    struct re_pattern_buffer *bufp;
-    struct re_registers *regs;
-    unsigned num_regs;
-    regoff_t *starts, *ends;
-{
-  if (num_regs)
-    {
-      bufp->regs_allocated = REGS_REALLOCATE;
-      regs->num_regs = num_regs;
-      regs->start = starts;
-      regs->end = ends;
-    }
-  else
-    {
-      bufp->regs_allocated = REGS_UNALLOCATED;
-      regs->num_regs = 0;
-      regs->start = regs->end = (regoff_t *) 0;
-    }
-}
-#ifdef _LIBC
-weak_alias (__re_set_registers, re_set_registers)
-#endif
-
-/* Searching routines.  */
-
-/* Like re_search_2, below, but only one string is specified, and
-   doesn't let you say where to stop matching. */
-
-int
-re_search (bufp, string, size, startpos, range, regs)
-     struct re_pattern_buffer *bufp;
-     const char *string;
-     int size, startpos, range;
-     struct re_registers *regs;
-{
-  return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
-		      regs, size);
-}
-#ifdef _LIBC
-weak_alias (__re_search, re_search)
-#endif
-
-
-/* Using the compiled pattern in BUFP->buffer, first tries to match the
-   virtual concatenation of STRING1 and STRING2, starting first at index
-   STARTPOS, then at STARTPOS + 1, and so on.
-
-   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
-
-   RANGE is how far to scan while trying to match.  RANGE = 0 means try
-   only at STARTPOS; in general, the last start tried is STARTPOS +
-   RANGE.
-
-   In REGS, return the indices of the virtual concatenation of STRING1
-   and STRING2 that matched the entire BUFP->buffer and its contained
-   subexpressions.
-
-   Do not consider matching one past the index STOP in the virtual
-   concatenation of STRING1 and STRING2.
-
-   We return either the position in the strings at which the match was
-   found, -1 if no match, or -2 if error (such as failure
-   stack overflow).  */
-
-int
-re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
-     struct re_pattern_buffer *bufp;
-     const char *string1, *string2;
-     int size1, size2;
-     int startpos;
-     int range;
-     struct re_registers *regs;
-     int stop;
-{
-  int val;
-  register char *fastmap = bufp->fastmap;
-  register RE_TRANSLATE_TYPE translate = bufp->translate;
-  int total_size = size1 + size2;
-  int endpos = startpos + range;
-
-  /* Check for out-of-range STARTPOS.  */
-  if (startpos < 0 || startpos > total_size)
-    return -1;
-
-  /* Fix up RANGE if it might eventually take us outside
-     the virtual concatenation of STRING1 and STRING2.
-     Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE.  */
-  if (endpos < 0)
-    range = 0 - startpos;
-  else if (endpos > total_size)
-    range = total_size - startpos;
-
-  /* If the search isn't to be a backwards one, don't waste time in a
-     search for a pattern that must be anchored.  */
-  if (bufp->used > 0 && range > 0
-      && ((re_opcode_t) bufp->buffer[0] == begbuf
-	  /* `begline' is like `begbuf' if it cannot match at newlines.  */
-	  || ((re_opcode_t) bufp->buffer[0] == begline
-	      && !bufp->newline_anchor)))
-    {
-      if (startpos > 0)
-	return -1;
-      else
-	range = 1;
-    }
-
-#ifdef emacs
-  /* In a forward search for something that starts with \=.
-     don't keep searching past point.  */
-  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
-    {
-      range = PT - startpos;
-      if (range <= 0)
-	return -1;
-    }
-#endif /* emacs */
-
-  /* Update the fastmap now if not correct already.  */
-  if (fastmap && !bufp->fastmap_accurate)
-    if (re_compile_fastmap (bufp) == -2)
-      return -2;
-
-  /* Loop through the string, looking for a place to start matching.  */
-  for (;;)
-    {
-      /* If a fastmap is supplied, skip quickly over characters that
-         cannot be the start of a match.  If the pattern can match the
-         null string, however, we don't need to skip characters; we want
-         the first null string.  */
-      if (fastmap && startpos < total_size && !bufp->can_be_null)
-	{
-	  if (range > 0)	/* Searching forwards.  */
-	    {
-	      register const char *d;
-	      register int lim = 0;
-	      int irange = range;
-
-              if (startpos < size1 && startpos + range >= size1)
-                lim = range - (size1 - startpos);
-
-	      d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
-
-              /* Written out as an if-else to avoid testing `translate'
-                 inside the loop.  */
-	      if (translate)
-                while (range > lim
-                       && !fastmap[(unsigned char)
-				   translate[(unsigned char) *d++]])
-                  range--;
-	      else
-                while (range > lim && !fastmap[(unsigned char) *d++])
-                  range--;
-
-	      startpos += irange - range;
-	    }
-	  else				/* Searching backwards.  */
-	    {
-	      register char c = (size1 == 0 || startpos >= size1
-                                 ? string2[startpos - size1]
-                                 : string1[startpos]);
-
-	      if (!fastmap[(unsigned char) TRANSLATE (c)])
-		goto advance;
-	    }
-	}
-
-      /* If can't match the null string, and that's all we have left, fail.  */
-      if (range >= 0 && startpos == total_size && fastmap
-          && !bufp->can_be_null)
-	return -1;
-
-      val = re_match_2_internal (bufp, string1, size1, string2, size2,
-				 startpos, regs, stop);
-#ifndef REGEX_MALLOC
-# ifdef C_ALLOCA
-      alloca (0);
-# endif
-#endif
-
-      if (val >= 0)
-	return startpos;
-
-      if (val == -2)
-	return -2;
-
-    advance:
-      if (!range)
-        break;
-      else if (range > 0)
-        {
-          range--;
-          startpos++;
-        }
-      else
-        {
-          range++;
-          startpos--;
-        }
-    }
-  return -1;
-} /* re_search_2 */
-#ifdef _LIBC
-weak_alias (__re_search_2, re_search_2)
-#endif
-
-/* This converts PTR, a pointer into one of the search strings `string1'
-   and `string2' into an offset from the beginning of that string.  */
-#define POINTER_TO_OFFSET(ptr)			\
-  (FIRST_STRING_P (ptr)				\
-   ? ((regoff_t) ((ptr) - string1))		\
-   : ((regoff_t) ((ptr) - string2 + size1)))
-
-/* Macros for dealing with the split strings in re_match_2.  */
-
-#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
-
-/* Call before fetching a character with *d.  This switches over to
-   string2 if necessary.  */
-#define PREFETCH()							\
-  while (d == dend)						    	\
-    {									\
-      /* End of string2 => fail.  */					\
-      if (dend == end_match_2) 						\
-        goto fail;							\
-      /* End of string1 => advance to string2.  */ 			\
-      d = string2;						        \
-      dend = end_match_2;						\
-    }
-
-
-/* Test if at very beginning or at very end of the virtual concatenation
-   of `string1' and `string2'.  If only one string, it's `string2'.  */
-#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
-#define AT_STRINGS_END(d) ((d) == end2)
-
-
-/* Test if D points to a character which is word-constituent.  We have
-   two special cases to check for: if past the end of string1, look at
-   the first character in string2; and if before the beginning of
-   string2, look at the last character in string1.  */
-#define WORDCHAR_P(d)							\
-  (SYNTAX ((d) == end1 ? *string2					\
-           : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
-   == Sword)
-
-/* Disabled due to a compiler bug -- see comment at case wordbound */
-#if 0
-/* Test if the character before D and the one at D differ with respect
-   to being word-constituent.  */
-#define AT_WORD_BOUNDARY(d)						\
-  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
-   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
-#endif
-
-/* Free everything we malloc.  */
-#ifdef MATCH_MAY_ALLOCATE
-# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
-# define FREE_VARIABLES()						\
-  do {									\
-    REGEX_FREE_STACK (fail_stack.stack);				\
-    FREE_VAR (regstart);						\
-    FREE_VAR (regend);							\
-    FREE_VAR (old_regstart);						\
-    FREE_VAR (old_regend);						\
-    FREE_VAR (best_regstart);						\
-    FREE_VAR (best_regend);						\
-    FREE_VAR (reg_info);						\
-    FREE_VAR (reg_dummy);						\
-    FREE_VAR (reg_info_dummy);						\
-  } while (0)
-#else
-# define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning. */
-#endif /* not MATCH_MAY_ALLOCATE */
-
-/* These values must meet several constraints.  They must not be valid
-   register values; since we have a limit of 255 registers (because
-   we use only one byte in the pattern for the register number), we can
-   use numbers larger than 255.  They must differ by 1, because of
-   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
-   be larger than the value for the highest register, so we do not try
-   to actually save any registers when none are active.  */
-#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
-#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
-
-/* Matching routines.  */
-
-#ifndef emacs   /* Emacs never uses this.  */
-/* re_match is like re_match_2 except it takes only a single string.  */
-
-int
-re_match (bufp, string, size, pos, regs)
-     struct re_pattern_buffer *bufp;
-     const char *string;
-     int size, pos;
-     struct re_registers *regs;
-{
-  int result = re_match_2_internal (bufp, NULL, 0, string, size,
-				    pos, regs, size);
-# ifndef REGEX_MALLOC
-#  ifdef C_ALLOCA
-  alloca (0);
-#  endif
-# endif
-  return result;
-}
-# ifdef _LIBC
-weak_alias (__re_match, re_match)
-# endif
-#endif /* not emacs */
-
-static boolean group_match_null_string_p _RE_ARGS ((unsigned char **p,
-						    unsigned char *end,
-						register_info_type *reg_info));
-static boolean alt_match_null_string_p _RE_ARGS ((unsigned char *p,
-						  unsigned char *end,
-						register_info_type *reg_info));
-static boolean common_op_match_null_string_p _RE_ARGS ((unsigned char **p,
-							unsigned char *end,
-						register_info_type *reg_info));
-static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2,
-				     int len, char *translate));
-
-/* re_match_2 matches the compiled pattern in BUFP against the
-   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
-   and SIZE2, respectively).  We start matching at POS, and stop
-   matching at STOP.
-
-   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
-   store offsets for the substring each group matched in REGS.  See the
-   documentation for exactly how many groups we fill.
-
-   We return -1 if no match, -2 if an internal error (such as the
-   failure stack overflowing).  Otherwise, we return the length of the
-   matched substring.  */
-
-int
-re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-     struct re_pattern_buffer *bufp;
-     const char *string1, *string2;
-     int size1, size2;
-     int pos;
-     struct re_registers *regs;
-     int stop;
-{
-  int result = re_match_2_internal (bufp, string1, size1, string2, size2,
-				    pos, regs, stop);
-#ifndef REGEX_MALLOC
-# ifdef C_ALLOCA
-  alloca (0);
-# endif
-#endif
-  return result;
-}
-#ifdef _LIBC
-weak_alias (__re_match_2, re_match_2)
-#endif
-
-/* This is a separate function so that we can force an alloca cleanup
-   afterwards.  */
-static int
-re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
-     struct re_pattern_buffer *bufp;
-     const char *string1, *string2;
-     int size1, size2;
-     int pos;
-     struct re_registers *regs;
-     int stop;
-{
-  /* General temporaries.  */
-  int mcnt;
-  unsigned char *p1;
-
-  /* Just past the end of the corresponding string.  */
-  const char *end1, *end2;
-
-  /* Pointers into string1 and string2, just past the last characters in
-     each to consider matching.  */
-  const char *end_match_1, *end_match_2;
-
-  /* Where we are in the data, and the end of the current string.  */
-  const char *d, *dend;
-
-  /* Where we are in the pattern, and the end of the pattern.  */
-  unsigned char *p = bufp->buffer;
-  register unsigned char *pend = p + bufp->used;
-
-  /* Mark the opcode just after a start_memory, so we can test for an
-     empty subpattern when we get to the stop_memory.  */
-  unsigned char *just_past_start_mem = 0;
-
-  /* We use this to map every character in the string.  */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Failure point stack.  Each place that can handle a failure further
-     down the line pushes a failure point on this stack.  It consists of
-     restart, regend, and reg_info for all registers corresponding to
-     the subexpressions we're currently inside, plus the number of such
-     registers, and, finally, two char *'s.  The first char * is where
-     to resume scanning the pattern; the second one is where to resume
-     scanning the strings.  If the latter is zero, the failure point is
-     a ``dummy''; if a failure happens and the failure point is a dummy,
-     it gets discarded and the next next one is tried.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
-  fail_stack_type fail_stack;
-#endif
-#ifdef DEBUG
-  static unsigned failure_id = 0;
-  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
-#endif
-
-#ifdef REL_ALLOC
-  /* This holds the pointer to the failure stack, when
-     it is allocated relocatably.  */
-  fail_stack_elt_t *failure_stack_ptr;
-#endif
-
-  /* We fill all the registers internally, independent of what we
-     return, for use in backreferences.  The number here includes
-     an element for register zero.  */
-  size_t num_regs = bufp->re_nsub + 1;
-
-  /* The currently active registers.  */
-  active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-  active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-
-  /* Information on the contents of registers. These are pointers into
-     the input strings; they record just what was matched (on this
-     attempt) by a subexpression part of the pattern, that is, the
-     regnum-th regstart pointer points to where in the pattern we began
-     matching and the regnum-th regend points to right after where we
-     stopped matching the regnum-th subexpression.  (The zeroth register
-     keeps track of what the whole pattern matches.)  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **regstart, **regend;
-#endif
-
-  /* If a group that's operated upon by a repetition operator fails to
-     match anything, then the register for its start will need to be
-     restored because it will have been set to wherever in the string we
-     are when we last see its open-group operator.  Similarly for a
-     register's end.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **old_regstart, **old_regend;
-#endif
-
-  /* The is_active field of reg_info helps us keep track of which (possibly
-     nested) subexpressions we are currently in. The matched_something
-     field of reg_info[reg_num] helps us tell whether or not we have
-     matched any of the pattern so far this time through the reg_num-th
-     subexpression.  These two fields get reset each time through any
-     loop their register is in.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
-  register_info_type *reg_info;
-#endif
-
-  /* The following record the register info as found in the above
-     variables when we find a match better than any we've seen before.
-     This happens as we backtrack through the failure points, which in
-     turn happens only if we have not yet matched the entire string. */
-  unsigned best_regs_set = false;
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **best_regstart, **best_regend;
-#endif
-
-  /* Logically, this is `best_regend[0]'.  But we don't want to have to
-     allocate space for that if we're not allocating space for anything
-     else (see below).  Also, we never need info about register 0 for
-     any of the other register vectors, and it seems rather a kludge to
-     treat `best_regend' differently than the rest.  So we keep track of
-     the end of the best match so far in a separate variable.  We
-     initialize this to NULL so that when we backtrack the first time
-     and need to test it, it's not garbage.  */
-  const char *match_end = NULL;
-
-  /* This helps SET_REGS_MATCHED avoid doing redundant work.  */
-  int set_regs_matched_done = 0;
-
-  /* Used when we pop values we don't care about.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **reg_dummy;
-  register_info_type *reg_info_dummy;
-#endif
-
-#ifdef DEBUG
-  /* Counts the total number of registers pushed.  */
-  unsigned num_regs_pushed = 0;
-#endif
-
-  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
-
-  INIT_FAIL_STACK ();
-
-#ifdef MATCH_MAY_ALLOCATE
-  /* Do not bother to initialize all the register variables if there are
-     no groups in the pattern, as it takes a fair amount of time.  If
-     there are groups, we include space for register 0 (the whole
-     pattern), even though we never use it, since it simplifies the
-     array indexing.  We should fix this.  */
-  if (bufp->re_nsub)
-    {
-      regstart = REGEX_TALLOC (num_regs, const char *);
-      regend = REGEX_TALLOC (num_regs, const char *);
-      old_regstart = REGEX_TALLOC (num_regs, const char *);
-      old_regend = REGEX_TALLOC (num_regs, const char *);
-      best_regstart = REGEX_TALLOC (num_regs, const char *);
-      best_regend = REGEX_TALLOC (num_regs, const char *);
-      reg_info = REGEX_TALLOC (num_regs, register_info_type);
-      reg_dummy = REGEX_TALLOC (num_regs, const char *);
-      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
-
-      if (!(regstart && regend && old_regstart && old_regend && reg_info
-            && best_regstart && best_regend && reg_dummy && reg_info_dummy))
-        {
-          FREE_VARIABLES ();
-          return -2;
-        }
-    }
-  else
-    {
-      /* We must initialize all our variables to NULL, so that
-         `FREE_VARIABLES' doesn't try to free them.  */
-      regstart = regend = old_regstart = old_regend = best_regstart
-        = best_regend = reg_dummy = NULL;
-      reg_info = reg_info_dummy = (register_info_type *) NULL;
-    }
-#endif /* MATCH_MAY_ALLOCATE */
-
-  /* The starting position is bogus.  */
-  if (pos < 0 || pos > size1 + size2)
-    {
-      FREE_VARIABLES ();
-      return -1;
-    }
-
-  /* Initialize subexpression text positions to -1 to mark ones that no
-     start_memory/stop_memory has been seen for. Also initialize the
-     register information struct.  */
-  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-    {
-      regstart[mcnt] = regend[mcnt]
-        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
-
-      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
-      IS_ACTIVE (reg_info[mcnt]) = 0;
-      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
-      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
-    }
-
-  /* We move `string1' into `string2' if the latter's empty -- but not if
-     `string1' is null.  */
-  if (size2 == 0 && string1 != NULL)
-    {
-      string2 = string1;
-      size2 = size1;
-      string1 = 0;
-      size1 = 0;
-    }
-  end1 = string1 + size1;
-  end2 = string2 + size2;
-
-  /* Compute where to stop matching, within the two strings.  */
-  if (stop <= size1)
-    {
-      end_match_1 = string1 + stop;
-      end_match_2 = string2;
-    }
-  else
-    {
-      end_match_1 = end1;
-      end_match_2 = string2 + stop - size1;
-    }
-
-  /* `p' scans through the pattern as `d' scans through the data.
-     `dend' is the end of the input string that `d' points within.  `d'
-     is advanced into the following input string whenever necessary, but
-     this happens before fetching; therefore, at the beginning of the
-     loop, `d' can be pointing at the end of a string, but it cannot
-     equal `string2'.  */
-  if (size1 > 0 && pos <= size1)
-    {
-      d = string1 + pos;
-      dend = end_match_1;
-    }
-  else
-    {
-      d = string2 + pos - size1;
-      dend = end_match_2;
-    }
-
-  DEBUG_PRINT1 ("The compiled pattern is:\n");
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
-  DEBUG_PRINT1 ("The string to match is: `");
-  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
-  DEBUG_PRINT1 ("'\n");
-
-  /* This loops over pattern commands.  It exits by returning from the
-     function if the match is complete, or it drops through if the match
-     fails at this starting point in the input data.  */
-  for (;;)
-    {
-#ifdef _LIBC
-      DEBUG_PRINT2 ("\n%p: ", p);
-#else
-      DEBUG_PRINT2 ("\n0x%x: ", p);
-#endif
-
-      if (p == pend)
-	{ /* End of pattern means we might have succeeded.  */
-          DEBUG_PRINT1 ("end of pattern ... ");
-
-	  /* If we haven't matched the entire string, and we want the
-             longest match, try backtracking.  */
-          if (d != end_match_2)
-	    {
-	      /* 1 if this match ends in the same string (string1 or string2)
-		 as the best previous match.  */
-	      boolean same_str_p = (FIRST_STRING_P (match_end)
-				    == MATCHING_IN_FIRST_STRING);
-	      /* 1 if this match is the best seen so far.  */
-	      boolean best_match_p;
-
-	      /* AIX compiler got confused when this was combined
-		 with the previous declaration.  */
-	      if (same_str_p)
-		best_match_p = d > match_end;
-	      else
-		best_match_p = !MATCHING_IN_FIRST_STRING;
-
-              DEBUG_PRINT1 ("backtracking.\n");
-
-              if (!FAIL_STACK_EMPTY ())
-                { /* More failure points to try.  */
-
-                  /* If exceeds best match so far, save it.  */
-                  if (!best_regs_set || best_match_p)
-                    {
-                      best_regs_set = true;
-                      match_end = d;
-
-                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
-
-                      for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-                        {
-                          best_regstart[mcnt] = regstart[mcnt];
-                          best_regend[mcnt] = regend[mcnt];
-                        }
-                    }
-                  goto fail;
-                }
-
-              /* If no failure points, don't restore garbage.  And if
-                 last match is real best match, don't restore second
-                 best one. */
-              else if (best_regs_set && !best_match_p)
-                {
-  	        restore_best_regs:
-                  /* Restore best match.  It may happen that `dend ==
-                     end_match_1' while the restored d is in string2.
-                     For example, the pattern `x.*y.*z' against the
-                     strings `x-' and `y-z-', if the two strings are
-                     not consecutive in memory.  */
-                  DEBUG_PRINT1 ("Restoring best registers.\n");
-
-                  d = match_end;
-                  dend = ((d >= string1 && d <= end1)
-		           ? end_match_1 : end_match_2);
-
-		  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-		    {
-		      regstart[mcnt] = best_regstart[mcnt];
-		      regend[mcnt] = best_regend[mcnt];
-		    }
-                }
-            } /* d != end_match_2 */
-
-	succeed_label:
-          DEBUG_PRINT1 ("Accepting match.\n");
-
-          /* If caller wants register contents data back, do it.  */
-          if (regs && !bufp->no_sub)
-	    {
-              /* Have the register data arrays been allocated?  */
-              if (bufp->regs_allocated == REGS_UNALLOCATED)
-                { /* No.  So allocate them with malloc.  We need one
-                     extra element beyond `num_regs' for the `-1' marker
-                     GNU code uses.  */
-                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
-                  regs->start = TALLOC (regs->num_regs, regoff_t);
-                  regs->end = TALLOC (regs->num_regs, regoff_t);
-                  if (regs->start == NULL || regs->end == NULL)
-		    {
-		      FREE_VARIABLES ();
-		      return -2;
-		    }
-                  bufp->regs_allocated = REGS_REALLOCATE;
-                }
-              else if (bufp->regs_allocated == REGS_REALLOCATE)
-                { /* Yes.  If we need more elements than were already
-                     allocated, reallocate them.  If we need fewer, just
-                     leave it alone.  */
-                  if (regs->num_regs < num_regs + 1)
-                    {
-                      regs->num_regs = num_regs + 1;
-                      RETALLOC (regs->start, regs->num_regs, regoff_t);
-                      RETALLOC (regs->end, regs->num_regs, regoff_t);
-                      if (regs->start == NULL || regs->end == NULL)
-			{
-			  FREE_VARIABLES ();
-			  return -2;
-			}
-                    }
-                }
-              else
-		{
-		  /* These braces fend off a "empty body in an else-statement"
-		     warning under GCC when assert expands to nothing.  */
-		  assert (bufp->regs_allocated == REGS_FIXED);
-		}
-
-              /* Convert the pointer data in `regstart' and `regend' to
-                 indices.  Register zero has to be set differently,
-                 since we haven't kept track of any info for it.  */
-              if (regs->num_regs > 0)
-                {
-                  regs->start[0] = pos;
-                  regs->end[0] = (MATCHING_IN_FIRST_STRING
-				  ? ((regoff_t) (d - string1))
-			          : ((regoff_t) (d - string2 + size1)));
-                }
-
-              /* Go through the first `min (num_regs, regs->num_regs)'
-                 registers, since that is all we initialized.  */
-	      for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs);
-		   mcnt++)
-		{
-                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
-                    regs->start[mcnt] = regs->end[mcnt] = -1;
-                  else
-                    {
-		      regs->start[mcnt]
-			= (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
-                      regs->end[mcnt]
-			= (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
-                    }
-		}
-
-              /* If the regs structure we return has more elements than
-                 were in the pattern, set the extra elements to -1.  If
-                 we (re)allocated the registers, this is the case,
-                 because we always allocate enough to have at least one
-                 -1 at the end.  */
-              for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++)
-                regs->start[mcnt] = regs->end[mcnt] = -1;
-	    } /* regs && !bufp->no_sub */
-
-          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
-                        nfailure_points_pushed, nfailure_points_popped,
-                        nfailure_points_pushed - nfailure_points_popped);
-          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
-
-          mcnt = d - pos - (MATCHING_IN_FIRST_STRING
-			    ? string1
-			    : string2 - size1);
-
-          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
-
-          FREE_VARIABLES ();
-          return mcnt;
-        }
-
-      /* Otherwise match next pattern command.  */
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-	{
-        /* Ignore these.  Used to ignore the n of succeed_n's which
-           currently have n == 0.  */
-        case no_op:
-          DEBUG_PRINT1 ("EXECUTING no_op.\n");
-          break;
-
-	case succeed:
-          DEBUG_PRINT1 ("EXECUTING succeed.\n");
-	  goto succeed_label;
-
-        /* Match the next n pattern characters exactly.  The following
-           byte in the pattern defines n, and the n bytes after that
-           are the characters to match.  */
-	case exactn:
-	  mcnt = *p++;
-          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
-
-          /* This is written out as an if-else so we don't waste time
-             testing `translate' inside the loop.  */
-          if (translate)
-	    {
-	      do
-		{
-		  PREFETCH ();
-		  if ((unsigned char) translate[(unsigned char) *d++]
-		      != (unsigned char) *p++)
-                    goto fail;
-		}
-	      while (--mcnt);
-	    }
-	  else
-	    {
-	      do
-		{
-		  PREFETCH ();
-		  if (*d++ != (char) *p++) goto fail;
-		}
-	      while (--mcnt);
-	    }
-	  SET_REGS_MATCHED ();
-          break;
-
-
-        /* Match any character except possibly a newline or a null.  */
-	case anychar:
-          DEBUG_PRINT1 ("EXECUTING anychar.\n");
-
-          PREFETCH ();
-
-          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
-              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
-	    goto fail;
-
-          SET_REGS_MATCHED ();
-          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
-          d++;
-	  break;
-
-
-	case charset:
-	case charset_not:
-	  {
-	    register unsigned char c;
-	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
-
-            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
-
-	    PREFETCH ();
-	    c = TRANSLATE (*d); /* The character to match.  */
-
-            /* Cast to `unsigned' instead of `unsigned char' in case the
-               bit list is a full 32 bytes long.  */
-	    if (c < (unsigned) (*p * BYTEWIDTH)
-		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-	      not = !not;
-
-	    p += 1 + *p;
-
-	    if (!not) goto fail;
-
-	    SET_REGS_MATCHED ();
-            d++;
-	    break;
-	  }
-
-
-        /* The beginning of a group is represented by start_memory.
-           The arguments are the register number in the next byte, and the
-           number of groups inner to this one in the next.  The text
-           matched within the group is recorded (in the internal
-           registers data structure) under the register number.  */
-        case start_memory:
-	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
-
-          /* Find out if this group can match the empty string.  */
-	  p1 = p;		/* To send to group_match_null_string_p.  */
-
-          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
-            REG_MATCH_NULL_STRING_P (reg_info[*p])
-              = group_match_null_string_p (&p1, pend, reg_info);
-
-          /* Save the position in the string where we were the last time
-             we were at this open-group operator in case the group is
-             operated upon by a repetition operator, e.g., with `(a*)*b'
-             against `ab'; then we want to ignore where we are now in
-             the string in case this attempt to match fails.  */
-          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
-                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
-                             : regstart[*p];
-	  DEBUG_PRINT2 ("  old_regstart: %d\n",
-			 POINTER_TO_OFFSET (old_regstart[*p]));
-
-          regstart[*p] = d;
-	  DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
-
-          IS_ACTIVE (reg_info[*p]) = 1;
-          MATCHED_SOMETHING (reg_info[*p]) = 0;
-
-	  /* Clear this whenever we change the register activity status.  */
-	  set_regs_matched_done = 0;
-
-          /* This is the new highest active register.  */
-          highest_active_reg = *p;
-
-          /* If nothing was active before, this is the new lowest active
-             register.  */
-          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
-            lowest_active_reg = *p;
-
-          /* Move past the register number and inner group count.  */
-          p += 2;
-	  just_past_start_mem = p;
-
-          break;
-
-
-        /* The stop_memory opcode represents the end of a group.  Its
-           arguments are the same as start_memory's: the register
-           number, and the number of inner groups.  */
-	case stop_memory:
-	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
-
-          /* We need to save the string position the last time we were at
-             this close-group operator in case the group is operated
-             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
-             against `aba'; then we want to ignore where we are now in
-             the string in case this attempt to match fails.  */
-          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
-                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
-			   : regend[*p];
-	  DEBUG_PRINT2 ("      old_regend: %d\n",
-			 POINTER_TO_OFFSET (old_regend[*p]));
-
-          regend[*p] = d;
-	  DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
-
-          /* This register isn't active anymore.  */
-          IS_ACTIVE (reg_info[*p]) = 0;
-
-	  /* Clear this whenever we change the register activity status.  */
-	  set_regs_matched_done = 0;
-
-          /* If this was the only register active, nothing is active
-             anymore.  */
-          if (lowest_active_reg == highest_active_reg)
-            {
-              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-            }
-          else
-            { /* We must scan for the new highest active register, since
-                 it isn't necessarily one less than now: consider
-                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
-                 new highest active register is 1.  */
-              unsigned char r = *p - 1;
-              while (r > 0 && !IS_ACTIVE (reg_info[r]))
-                r--;
-
-              /* If we end up at register zero, that means that we saved
-                 the registers as the result of an `on_failure_jump', not
-                 a `start_memory', and we jumped to past the innermost
-                 `stop_memory'.  For example, in ((.)*) we save
-                 registers 1 and 2 as a result of the *, but when we pop
-                 back to the second ), we are at the stop_memory 1.
-                 Thus, nothing is active.  */
-	      if (r == 0)
-                {
-                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-                }
-              else
-                highest_active_reg = r;
-            }
-
-          /* If just failed to match something this time around with a
-             group that's operated on by a repetition operator, try to
-             force exit from the ``loop'', and restore the register
-             information for this group that we had before trying this
-             last match.  */
-          if ((!MATCHED_SOMETHING (reg_info[*p])
-               || just_past_start_mem == p - 1)
-	      && (p + 2) < pend)
-            {
-              boolean is_a_jump_n = false;
-
-              p1 = p + 2;
-              mcnt = 0;
-              switch ((re_opcode_t) *p1++)
-                {
-                  case jump_n:
-		    is_a_jump_n = true;
-                  case pop_failure_jump:
-		  case maybe_pop_jump:
-		  case jump:
-		  case dummy_failure_jump:
-                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-		    if (is_a_jump_n)
-		      p1 += 2;
-                    break;
-
-                  default:
-                    /* do nothing */ ;
-                }
-	      p1 += mcnt;
-
-              /* If the next operation is a jump backwards in the pattern
-	         to an on_failure_jump right before the start_memory
-                 corresponding to this stop_memory, exit from the loop
-                 by forcing a failure after pushing on the stack the
-                 on_failure_jump's jump in the pattern, and d.  */
-              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
-                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
-		{
-                  /* If this group ever matched anything, then restore
-                     what its registers were before trying this last
-                     failed match, e.g., with `(a*)*b' against `ab' for
-                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
-                     against `aba' for regend[3].
-
-                     Also restore the registers for inner groups for,
-                     e.g., `((a*)(b*))*' against `aba' (register 3 would
-                     otherwise get trashed).  */
-
-                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
-		    {
-		      unsigned r;
-
-                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
-
-		      /* Restore this and inner groups' (if any) registers.  */
-                      for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1);
-			   r++)
-                        {
-                          regstart[r] = old_regstart[r];
-
-                          /* xx why this test?  */
-                          if (old_regend[r] >= regstart[r])
-                            regend[r] = old_regend[r];
-                        }
-                    }
-		  p1++;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
-
-                  goto fail;
-                }
-            }
-
-          /* Move past the register number and the inner group count.  */
-          p += 2;
-          break;
-
-
-	/* \<digit> has been turned into a `duplicate' command which is
-           followed by the numeric value of <digit> as the register number.  */
-        case duplicate:
-	  {
-	    register const char *d2, *dend2;
-	    int regno = *p++;   /* Get which register to match against.  */
-	    DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
-
-	    /* Can't back reference a group which we've never matched.  */
-            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
-              goto fail;
-
-            /* Where in input to try to start matching.  */
-            d2 = regstart[regno];
-
-            /* Where to stop matching; if both the place to start and
-               the place to stop matching are in the same string, then
-               set to the place to stop, otherwise, for now have to use
-               the end of the first string.  */
-
-            dend2 = ((FIRST_STRING_P (regstart[regno])
-		      == FIRST_STRING_P (regend[regno]))
-		     ? regend[regno] : end_match_1);
-	    for (;;)
-	      {
-		/* If necessary, advance to next segment in register
-                   contents.  */
-		while (d2 == dend2)
-		  {
-		    if (dend2 == end_match_2) break;
-		    if (dend2 == regend[regno]) break;
-
-                    /* End of string1 => advance to string2. */
-                    d2 = string2;
-                    dend2 = regend[regno];
-		  }
-		/* At end of register contents => success */
-		if (d2 == dend2) break;
-
-		/* If necessary, advance to next segment in data.  */
-		PREFETCH ();
-
-		/* How many characters left in this segment to match.  */
-		mcnt = dend - d;
-
-		/* Want how many consecutive characters we can match in
-                   one shot, so, if necessary, adjust the count.  */
-                if (mcnt > dend2 - d2)
-		  mcnt = dend2 - d2;
-
-		/* Compare that many; failure if mismatch, else move
-                   past them.  */
-		if (translate
-                    ? bcmp_translate (d, d2, mcnt, translate)
-                    : memcmp (d, d2, mcnt))
-		  goto fail;
-		d += mcnt, d2 += mcnt;
-
-		/* Do this because we've match some characters.  */
-		SET_REGS_MATCHED ();
-	      }
-	  }
-	  break;
-
-
-        /* begline matches the empty string at the beginning of the string
-           (unless `not_bol' is set in `bufp'), and, if
-           `newline_anchor' is set, after newlines.  */
-	case begline:
-          DEBUG_PRINT1 ("EXECUTING begline.\n");
-
-          if (AT_STRINGS_BEG (d))
-            {
-              if (!bufp->not_bol) break;
-            }
-          else if (d[-1] == '\n' && bufp->newline_anchor)
-            {
-              break;
-            }
-          /* In all other cases, we fail.  */
-          goto fail;
-
-
-        /* endline is the dual of begline.  */
-	case endline:
-          DEBUG_PRINT1 ("EXECUTING endline.\n");
-
-          if (AT_STRINGS_END (d))
-            {
-              if (!bufp->not_eol) break;
-            }
-
-          /* We have to ``prefetch'' the next character.  */
-          else if ((d == end1 ? *string2 : *d) == '\n'
-                   && bufp->newline_anchor)
-            {
-              break;
-            }
-          goto fail;
-
-
-	/* Match at the very beginning of the data.  */
-        case begbuf:
-          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
-          if (AT_STRINGS_BEG (d))
-            break;
-          goto fail;
-
-
-	/* Match at the very end of the data.  */
-        case endbuf:
-          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
-	  if (AT_STRINGS_END (d))
-	    break;
-          goto fail;
-
-
-        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
-           pushes NULL as the value for the string on the stack.  Then
-           `pop_failure_point' will keep the current value for the
-           string, instead of restoring it.  To see why, consider
-           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
-           then the . fails against the \n.  But the next thing we want
-           to do is match the \n against the \n; if we restored the
-           string value, we would be back at the foo.
-
-           Because this is used only in specific cases, we don't need to
-           check all the things that `on_failure_jump' does, to make
-           sure the right things get saved on the stack.  Hence we don't
-           share its code.  The only reason to push anything on the
-           stack at all is that otherwise we would have to change
-           `anychar's code to do something besides goto fail in this
-           case; that seems worse than this.  */
-        case on_failure_keep_string_jump:
-          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
-
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-          DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt);
-#else
-          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
-#endif
-
-          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
-          break;
-
-
-	/* Uses of on_failure_jump:
-
-           Each alternative starts with an on_failure_jump that points
-           to the beginning of the next alternative.  Each alternative
-           except the last ends with a jump that in effect jumps past
-           the rest of the alternatives.  (They really jump to the
-           ending jump of the following alternative, because tensioning
-           these jumps is a hassle.)
-
-           Repeats start with an on_failure_jump that points past both
-           the repetition text and either the following jump or
-           pop_failure_jump back to this on_failure_jump.  */
-	case on_failure_jump:
-        on_failure:
-          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
-
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-          DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt);
-#else
-          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
-#endif
-
-          /* If this on_failure_jump comes right before a group (i.e.,
-             the original * applied to a group), save the information
-             for that group and all inner ones, so that if we fail back
-             to this point, the group's information will be correct.
-             For example, in \(a*\)*\1, we need the preceding group,
-             and in \(zz\(a*\)b*\)\2, we need the inner group.  */
-
-          /* We can't use `p' to check ahead because we push
-             a failure point to `p + mcnt' after we do this.  */
-          p1 = p;
-
-          /* We need to skip no_op's before we look for the
-             start_memory in case this on_failure_jump is happening as
-             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
-             against aba.  */
-          while (p1 < pend && (re_opcode_t) *p1 == no_op)
-            p1++;
-
-          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
-            {
-              /* We have a new highest active register now.  This will
-                 get reset at the start_memory we are about to get to,
-                 but we will have saved all the registers relevant to
-                 this repetition op, as described above.  */
-              highest_active_reg = *(p1 + 1) + *(p1 + 2);
-              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
-                lowest_active_reg = *(p1 + 1);
-            }
-
-          DEBUG_PRINT1 (":\n");
-          PUSH_FAILURE_POINT (p + mcnt, d, -2);
-          break;
-
-
-        /* A smart repeat ends with `maybe_pop_jump'.
-	   We change it to either `pop_failure_jump' or `jump'.  */
-        case maybe_pop_jump:
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
-          {
-	    register unsigned char *p2 = p;
-
-            /* Compare the beginning of the repeat with what in the
-               pattern follows its end. If we can establish that there
-               is nothing that they would both match, i.e., that we
-               would have to backtrack because of (as in, e.g., `a*a')
-               then we can change to pop_failure_jump, because we'll
-               never have to backtrack.
-
-               This is not true in the case of alternatives: in
-               `(a|ab)*' we do need to backtrack to the `ab' alternative
-               (e.g., if the string was `ab').  But instead of trying to
-               detect that here, the alternative has put on a dummy
-               failure point which is what we will end up popping.  */
-
-	    /* Skip over open/close-group commands.
-	       If what follows this loop is a ...+ construct,
-	       look at what begins its body, since we will have to
-	       match at least one of that.  */
-	    while (1)
-	      {
-		if (p2 + 2 < pend
-		    && ((re_opcode_t) *p2 == stop_memory
-			|| (re_opcode_t) *p2 == start_memory))
-		  p2 += 3;
-		else if (p2 + 6 < pend
-			 && (re_opcode_t) *p2 == dummy_failure_jump)
-		  p2 += 6;
-		else
-		  break;
-	      }
-
-	    p1 = p + mcnt;
-	    /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
-	       to the `maybe_finalize_jump' of this case.  Examine what
-	       follows.  */
-
-            /* If we're at the end of the pattern, we can change.  */
-            if (p2 == pend)
-	      {
-		/* Consider what happens when matching ":\(.*\)"
-		   against ":/".  I don't really understand this code
-		   yet.  */
-  	        p[-3] = (unsigned char) pop_failure_jump;
-                DEBUG_PRINT1
-                  ("  End of pattern: change to `pop_failure_jump'.\n");
-              }
-
-            else if ((re_opcode_t) *p2 == exactn
-		     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
-	      {
-		register unsigned char c
-                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
-
-                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
-                  {
-  		    p[-3] = (unsigned char) pop_failure_jump;
-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
-                                  c, p1[5]);
-                  }
-
-		else if ((re_opcode_t) p1[3] == charset
-			 || (re_opcode_t) p1[3] == charset_not)
-		  {
-		    int not = (re_opcode_t) p1[3] == charset_not;
-
-		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
-			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-		      not = !not;
-
-                    /* `not' is equal to 1 if c would match, which means
-                        that we can't change to pop_failure_jump.  */
-		    if (!not)
-                      {
-  		        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-		  }
-	      }
-            else if ((re_opcode_t) *p2 == charset)
-	      {
-#ifdef DEBUG
-		register unsigned char c
-                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
-#endif
-
-#if 0
-                if ((re_opcode_t) p1[3] == exactn
-		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
-			  && (p2[2 + p1[5] / BYTEWIDTH]
-			      & (1 << (p1[5] % BYTEWIDTH)))))
-#else
-                if ((re_opcode_t) p1[3] == exactn
-		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4]
-			  && (p2[2 + p1[4] / BYTEWIDTH]
-			      & (1 << (p1[4] % BYTEWIDTH)))))
-#endif
-                  {
-  		    p[-3] = (unsigned char) pop_failure_jump;
-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
-                                  c, p1[5]);
-                  }
-
-		else if ((re_opcode_t) p1[3] == charset_not)
-		  {
-		    int idx;
-		    /* We win if the charset_not inside the loop
-		       lists every character listed in the charset after.  */
-		    for (idx = 0; idx < (int) p2[1]; idx++)
-		      if (! (p2[2 + idx] == 0
-			     || (idx < (int) p1[4]
-				 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
-			break;
-
-		    if (idx == p2[1])
-                      {
-  		        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-		  }
-		else if ((re_opcode_t) p1[3] == charset)
-		  {
-		    int idx;
-		    /* We win if the charset inside the loop
-		       has no overlap with the one after the loop.  */
-		    for (idx = 0;
-			 idx < (int) p2[1] && idx < (int) p1[4];
-			 idx++)
-		      if ((p2[2 + idx] & p1[5 + idx]) != 0)
-			break;
-
-		    if (idx == p2[1] || idx == p1[4])
-                      {
-  		        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-		  }
-	      }
-	  }
-	  p -= 2;		/* Point at relative address again.  */
-	  if ((re_opcode_t) p[-1] != pop_failure_jump)
-	    {
-	      p[-1] = (unsigned char) jump;
-              DEBUG_PRINT1 ("  Match => jump.\n");
-	      goto unconditional_jump;
-	    }
-        /* Note fall through.  */
-
-
-	/* The end of a simple repeat has a pop_failure_jump back to
-           its matching on_failure_jump, where the latter will push a
-           failure point.  The pop_failure_jump takes off failure
-           points put on by this pop_failure_jump's matching
-           on_failure_jump; we got through the pattern to here from the
-           matching on_failure_jump, so didn't fail.  */
-        case pop_failure_jump:
-          {
-            /* We need to pass separate storage for the lowest and
-               highest registers, even though we don't care about the
-               actual values.  Otherwise, we will restore only one
-               register from the stack, since lowest will == highest in
-               `pop_failure_point'.  */
-            active_reg_t dummy_low_reg, dummy_high_reg;
-            unsigned char *pdummy;
-            const char *sdummy;
-
-            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
-            POP_FAILURE_POINT (sdummy, pdummy,
-                               dummy_low_reg, dummy_high_reg,
-                               reg_dummy, reg_dummy, reg_info_dummy);
-          }
-	  /* Note fall through.  */
-
-	unconditional_jump:
-#ifdef _LIBC
-	  DEBUG_PRINT2 ("\n%p: ", p);
-#else
-	  DEBUG_PRINT2 ("\n0x%x: ", p);
-#endif
-          /* Note fall through.  */
-
-        /* Unconditionally jump (without popping any failure points).  */
-        case jump:
-	  EXTRACT_NUMBER_AND_INCR (mcnt, p);	/* Get the amount to jump.  */
-          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
-	  p += mcnt;				/* Do the jump.  */
-#ifdef _LIBC
-          DEBUG_PRINT2 ("(to %p).\n", p);
-#else
-          DEBUG_PRINT2 ("(to 0x%x).\n", p);
-#endif
-	  break;
-
-
-        /* We need this opcode so we can detect where alternatives end
-           in `group_match_null_string_p' et al.  */
-        case jump_past_alt:
-          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
-          goto unconditional_jump;
-
-
-        /* Normally, the on_failure_jump pushes a failure point, which
-           then gets popped at pop_failure_jump.  We will end up at
-           pop_failure_jump, also, and with a pattern of, say, `a+', we
-           are skipping over the on_failure_jump, so we have to push
-           something meaningless for pop_failure_jump to pop.  */
-        case dummy_failure_jump:
-          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
-          /* It doesn't matter what we push for the string here.  What
-             the code at `fail' tests is the value for the pattern.  */
-          PUSH_FAILURE_POINT (NULL, NULL, -2);
-          goto unconditional_jump;
-
-
-        /* At the end of an alternative, we need to push a dummy failure
-           point in case we are followed by a `pop_failure_jump', because
-           we don't want the failure point for the alternative to be
-           popped.  For example, matching `(a|ab)*' against `aab'
-           requires that we match the `ab' alternative.  */
-        case push_dummy_failure:
-          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
-          /* See comments just above at `dummy_failure_jump' about the
-             two zeroes.  */
-          PUSH_FAILURE_POINT (NULL, NULL, -2);
-          break;
-
-        /* Have to succeed matching what follows at least n times.
-           After that, handle like `on_failure_jump'.  */
-        case succeed_n:
-          EXTRACT_NUMBER (mcnt, p + 2);
-          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
-
-          assert (mcnt >= 0);
-          /* Originally, this is how many times we HAVE to succeed.  */
-          if (mcnt > 0)
-            {
-               mcnt--;
-	       p += 2;
-               STORE_NUMBER_AND_INCR (p, mcnt);
-#ifdef _LIBC
-               DEBUG_PRINT3 ("  Setting %p to %d.\n", p - 2, mcnt);
-#else
-               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p - 2, mcnt);
-#endif
-            }
-	  else if (mcnt == 0)
-            {
-#ifdef _LIBC
-              DEBUG_PRINT2 ("  Setting two bytes from %p to no_op.\n", p+2);
-#else
-              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
-#endif
-	      p[2] = (unsigned char) no_op;
-              p[3] = (unsigned char) no_op;
-              goto on_failure;
-            }
-          break;
-
-        case jump_n:
-          EXTRACT_NUMBER (mcnt, p + 2);
-          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
-
-          /* Originally, this is how many times we CAN jump.  */
-          if (mcnt)
-            {
-               mcnt--;
-               STORE_NUMBER (p + 2, mcnt);
-#ifdef _LIBC
-               DEBUG_PRINT3 ("  Setting %p to %d.\n", p + 2, mcnt);
-#else
-               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p + 2, mcnt);
-#endif
-	       goto unconditional_jump;
-            }
-          /* If don't have to jump any more, skip over the rest of command.  */
-	  else
-	    p += 4;
-          break;
-
-	case set_number_at:
-	  {
-            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
-
-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
-            p1 = p + mcnt;
-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-            DEBUG_PRINT3 ("  Setting %p to %d.\n", p1, mcnt);
-#else
-            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
-#endif
-	    STORE_NUMBER (p1, mcnt);
-            break;
-          }
-
-#if 0
-	/* The DEC Alpha C compiler 3.x generates incorrect code for the
-	   test  WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
-	   AT_WORD_BOUNDARY, so this code is disabled.  Expanding the
-	   macro and introducing temporary variables works around the bug.  */
-
-	case wordbound:
-	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
-	  if (AT_WORD_BOUNDARY (d))
-	    break;
-	  goto fail;
-
-	case notwordbound:
-	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
-	  if (AT_WORD_BOUNDARY (d))
-	    goto fail;
-	  break;
-#else
-	case wordbound:
-	{
-	  boolean prevchar, thischar;
-
-	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
-	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
-	    break;
-
-	  prevchar = WORDCHAR_P (d - 1);
-	  thischar = WORDCHAR_P (d);
-	  if (prevchar != thischar)
-	    break;
-	  goto fail;
-	}
-
-      case notwordbound:
-	{
-	  boolean prevchar, thischar;
-
-	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
-	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
-	    goto fail;
-
-	  prevchar = WORDCHAR_P (d - 1);
-	  thischar = WORDCHAR_P (d);
-	  if (prevchar != thischar)
-	    goto fail;
-	  break;
-	}
-#endif
-
-	case wordbeg:
-          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
-	  if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
-	    break;
-          goto fail;
-
-	case wordend:
-          DEBUG_PRINT1 ("EXECUTING wordend.\n");
-	  if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
-              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
-	    break;
-          goto fail;
-
-#ifdef emacs
-  	case before_dot:
-          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
- 	  if (PTR_CHAR_POS ((unsigned char *) d) >= point)
-  	    goto fail;
-  	  break;
-
-  	case at_dot:
-          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
- 	  if (PTR_CHAR_POS ((unsigned char *) d) != point)
-  	    goto fail;
-  	  break;
-
-  	case after_dot:
-          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
-          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
-  	    goto fail;
-  	  break;
-
-	case syntaxspec:
-          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
-	  mcnt = *p++;
-	  goto matchsyntax;
-
-        case wordchar:
-          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
-	  mcnt = (int) Sword;
-        matchsyntax:
-	  PREFETCH ();
-	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
-	  d++;
-	  if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
-	    goto fail;
-          SET_REGS_MATCHED ();
-	  break;
-
-	case notsyntaxspec:
-          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
-	  mcnt = *p++;
-	  goto matchnotsyntax;
-
-        case notwordchar:
-          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
-	  mcnt = (int) Sword;
-        matchnotsyntax:
-	  PREFETCH ();
-	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
-	  d++;
-	  if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
-	    goto fail;
-	  SET_REGS_MATCHED ();
-          break;
-
-#else /* not emacs */
-	case wordchar:
-          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
-	  PREFETCH ();
-          if (!WORDCHAR_P (d))
-            goto fail;
-	  SET_REGS_MATCHED ();
-          d++;
-	  break;
-
-	case notwordchar:
-          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
-	  PREFETCH ();
-	  if (WORDCHAR_P (d))
-            goto fail;
-          SET_REGS_MATCHED ();
-          d++;
-	  break;
-#endif /* not emacs */
-
-        default:
-          abort ();
-	}
-      continue;  /* Successfully executed one pattern command; keep going.  */
-
-
-    /* We goto here if a matching operation fails. */
-    fail:
-      if (!FAIL_STACK_EMPTY ())
-	{ /* A restart point is known.  Restore to that state.  */
-          DEBUG_PRINT1 ("\nFAIL:\n");
-          POP_FAILURE_POINT (d, p,
-                             lowest_active_reg, highest_active_reg,
-                             regstart, regend, reg_info);
-
-          /* If this failure point is a dummy, try the next one.  */
-          if (!p)
-	    goto fail;
-
-          /* If we failed to the end of the pattern, don't examine *p.  */
-	  assert (p <= pend);
-          if (p < pend)
-            {
-              boolean is_a_jump_n = false;
-
-              /* If failed to a backwards jump that's part of a repetition
-                 loop, need to pop this failure point and use the next one.  */
-              switch ((re_opcode_t) *p)
-                {
-                case jump_n:
-                  is_a_jump_n = true;
-                case maybe_pop_jump:
-                case pop_failure_jump:
-                case jump:
-                  p1 = p + 1;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  p1 += mcnt;
-
-                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
-                      || (!is_a_jump_n
-                          && (re_opcode_t) *p1 == on_failure_jump))
-                    goto fail;
-                  break;
-                default:
-                  /* do nothing */ ;
-                }
-            }
-
-          if (d >= string1 && d <= end1)
-	    dend = end_match_1;
-        }
-      else
-        break;   /* Matching at this starting point really fails.  */
-    } /* for (;;) */
-
-  if (best_regs_set)
-    goto restore_best_regs;
-
-  FREE_VARIABLES ();
-
-  return -1;         			/* Failure to match.  */
-} /* re_match_2 */
-
-/* Subroutine definitions for re_match_2.  */
-
-
-/* We are passed P pointing to a register number after a start_memory.
-
-   Return true if the pattern up to the corresponding stop_memory can
-   match the empty string, and false otherwise.
-
-   If we find the matching stop_memory, sets P to point to one past its number.
-   Otherwise, sets P to an undefined byte less than or equal to END.
-
-   We don't handle duplicates properly (yet).  */
-
-static boolean
-group_match_null_string_p (p, end, reg_info)
-    unsigned char **p, *end;
-    register_info_type *reg_info;
-{
-  int mcnt;
-  /* Point to after the args to the start_memory.  */
-  unsigned char *p1 = *p + 2;
-
-  while (p1 < end)
-    {
-      /* Skip over opcodes that can match nothing, and return true or
-	 false, as appropriate, when we get to one that can't, or to the
-         matching stop_memory.  */
-
-      switch ((re_opcode_t) *p1)
-        {
-        /* Could be either a loop or a series of alternatives.  */
-        case on_failure_jump:
-          p1++;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-
-          /* If the next operation is not a jump backwards in the
-	     pattern.  */
-
-	  if (mcnt >= 0)
-	    {
-              /* Go through the on_failure_jumps of the alternatives,
-                 seeing if any of the alternatives cannot match nothing.
-                 The last alternative starts with only a jump,
-                 whereas the rest start with on_failure_jump and end
-                 with a jump, e.g., here is the pattern for `a|b|c':
-
-                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
-                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
-                 /exactn/1/c
-
-                 So, we have to first go through the first (n-1)
-                 alternatives and then deal with the last one separately.  */
-
-
-              /* Deal with the first (n-1) alternatives, which start
-                 with an on_failure_jump (see above) that jumps to right
-                 past a jump_past_alt.  */
-
-              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
-                {
-                  /* `mcnt' holds how many bytes long the alternative
-                     is, including the ending `jump_past_alt' and
-                     its number.  */
-
-                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
-				                      reg_info))
-                    return false;
-
-                  /* Move to right after this alternative, including the
-		     jump_past_alt.  */
-                  p1 += mcnt;
-
-                  /* Break if it's the beginning of an n-th alternative
-                     that doesn't begin with an on_failure_jump.  */
-                  if ((re_opcode_t) *p1 != on_failure_jump)
-                    break;
-
-		  /* Still have to check that it's not an n-th
-		     alternative that starts with an on_failure_jump.  */
-		  p1++;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
-                    {
-		      /* Get to the beginning of the n-th alternative.  */
-                      p1 -= 3;
-                      break;
-                    }
-                }
-
-              /* Deal with the last alternative: go back and get number
-                 of the `jump_past_alt' just before it.  `mcnt' contains
-                 the length of the alternative.  */
-              EXTRACT_NUMBER (mcnt, p1 - 2);
-
-              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
-                return false;
-
-              p1 += mcnt;	/* Get past the n-th alternative.  */
-            } /* if mcnt > 0 */
-          break;
-
-
-        case stop_memory:
-	  assert (p1[1] == **p);
-          *p = p1 + 2;
-          return true;
-
-
-        default:
-          if (!common_op_match_null_string_p (&p1, end, reg_info))
-            return false;
-        }
-    } /* while p1 < end */
-
-  return false;
-} /* group_match_null_string_p */
-
-
-/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
-   It expects P to be the first byte of a single alternative and END one
-   byte past the last. The alternative can contain groups.  */
-
-static boolean
-alt_match_null_string_p (p, end, reg_info)
-    unsigned char *p, *end;
-    register_info_type *reg_info;
-{
-  int mcnt;
-  unsigned char *p1 = p;
-
-  while (p1 < end)
-    {
-      /* Skip over opcodes that can match nothing, and break when we get
-         to one that can't.  */
-
-      switch ((re_opcode_t) *p1)
-        {
-	/* It's a loop.  */
-        case on_failure_jump:
-          p1++;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-          p1 += mcnt;
-          break;
-
-	default:
-          if (!common_op_match_null_string_p (&p1, end, reg_info))
-            return false;
-        }
-    }  /* while p1 < end */
-
-  return true;
-} /* alt_match_null_string_p */
-
-
-/* Deals with the ops common to group_match_null_string_p and
-   alt_match_null_string_p.
-
-   Sets P to one after the op and its arguments, if any.  */
-
-static boolean
-common_op_match_null_string_p (p, end, reg_info)
-    unsigned char **p, *end;
-    register_info_type *reg_info;
-{
-  int mcnt;
-  boolean ret;
-  int reg_no;
-  unsigned char *p1 = *p;
-
-  switch ((re_opcode_t) *p1++)
-    {
-    case no_op:
-    case begline:
-    case endline:
-    case begbuf:
-    case endbuf:
-    case wordbeg:
-    case wordend:
-    case wordbound:
-    case notwordbound:
-#ifdef emacs
-    case before_dot:
-    case at_dot:
-    case after_dot:
-#endif
-      break;
-
-    case start_memory:
-      reg_no = *p1;
-      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
-      ret = group_match_null_string_p (&p1, end, reg_info);
-
-      /* Have to set this here in case we're checking a group which
-         contains a group and a back reference to it.  */
-
-      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
-        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
-
-      if (!ret)
-        return false;
-      break;
-
-    /* If this is an optimized succeed_n for zero times, make the jump.  */
-    case jump:
-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-      if (mcnt >= 0)
-        p1 += mcnt;
-      else
-        return false;
-      break;
-
-    case succeed_n:
-      /* Get to the number of times to succeed.  */
-      p1 += 2;
-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-
-      if (mcnt == 0)
-        {
-          p1 -= 4;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-          p1 += mcnt;
-        }
-      else
-        return false;
-      break;
-
-    case duplicate:
-      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
-        return false;
-      break;
-
-    case set_number_at:
-      p1 += 4;
-
-    default:
-      /* All other opcodes mean we cannot match the empty string.  */
-      return false;
-  }
-
-  *p = p1;
-  return true;
-} /* common_op_match_null_string_p */
-
-
-/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
-   bytes; nonzero otherwise.  */
-
-static int
-bcmp_translate (s1, s2, len, translate)
-     const char *s1, *s2;
-     register int len;
-     RE_TRANSLATE_TYPE translate;
-{
-  register const unsigned char *p1 = (const unsigned char *) s1;
-  register const unsigned char *p2 = (const unsigned char *) s2;
-  while (len)
-    {
-      if (translate[*p1++] != translate[*p2++]) return 1;
-      len--;
-    }
-  return 0;
-}
-
-/* Entry points for GNU code.  */
-
-/* re_compile_pattern is the GNU regular expression compiler: it
-   compiles PATTERN (of length SIZE) and puts the result in BUFP.
-   Returns 0 if the pattern was valid, otherwise an error string.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
-   are set in BUFP on entry.
-
-   We call regex_compile to do the actual compilation.  */
-
-const char *
-re_compile_pattern (pattern, length, bufp)
-     const char *pattern;
-     size_t length;
-     struct re_pattern_buffer *bufp;
-{
-  reg_errcode_t ret;
-
-  /* GNU code is written to assume at least RE_NREGS registers will be set
-     (and at least one extra will be -1).  */
-  bufp->regs_allocated = REGS_UNALLOCATED;
-
-  /* And GNU code determines whether or not to get register information
-     by passing null for the REGS argument to re_match, etc., not by
-     setting no_sub.  */
-  bufp->no_sub = 0;
-
-  /* Match anchors at newline.  */
-  bufp->newline_anchor = 1;
-
-  ret = regex_compile (pattern, length, re_syntax_options, bufp);
-
-  if (!ret)
-    return NULL;
-  return gettext (re_error_msgid[(int) ret]);
-}
-#ifdef _LIBC
-weak_alias (__re_compile_pattern, re_compile_pattern)
-#endif
-
-/* Entry points compatible with 4.2 BSD regex library.  We don't define
-   them unless specifically requested.  */
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-
-/* BSD has one and only one pattern buffer.  */
-static struct re_pattern_buffer re_comp_buf;
-
-char *
-#ifdef _LIBC
-/* Make these definitions weak in libc, so POSIX programs can redefine
-   these names if they don't use our functions, and still use
-   regcomp/regexec below without link errors.  */
-weak_function
-#endif
-re_comp (s)
-    const char *s;
-{
-  reg_errcode_t ret;
-
-  if (!s)
-    {
-      if (!re_comp_buf.buffer)
-	return gettext ("No previous regular expression");
-      return 0;
-    }
-
-  if (!re_comp_buf.buffer)
-    {
-      re_comp_buf.buffer = (unsigned char *) malloc (200);
-      if (re_comp_buf.buffer == NULL)
-        return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
-      re_comp_buf.allocated = 200;
-
-      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
-      if (re_comp_buf.fastmap == NULL)
-	return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
-    }
-
-  /* Since `re_exec' always passes NULL for the `regs' argument, we
-     don't need to initialize the pattern buffer fields which affect it.  */
-
-  /* Match anchors at newlines.  */
-  re_comp_buf.newline_anchor = 1;
-
-  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
-
-  if (!ret)
-    return NULL;
-
-  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-  return (char *) gettext (re_error_msgid[(int) ret]);
-}
-
-
-int
-#ifdef _LIBC
-weak_function
-#endif
-re_exec (s)
-    const char *s;
-{
-  const int len = strlen (s);
-  return
-    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
-}
-
-#endif /* _REGEX_RE_COMP */
-
-/* POSIX.2 functions.  Don't define these for Emacs.  */
-
-#ifndef emacs
-
-/* regcomp takes a regular expression as a string and compiles it.
-
-   PREG is a regex_t *.  We do not expect any fields to be initialized,
-   since POSIX says we shouldn't.  Thus, we set
-
-     `buffer' to the compiled pattern;
-     `used' to the length of the compiled pattern;
-     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
-       REG_EXTENDED bit in CFLAGS is set; otherwise, to
-       RE_SYNTAX_POSIX_BASIC;
-     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
-     `fastmap' to an allocated space for the fastmap;
-     `fastmap_accurate' to zero;
-     `re_nsub' to the number of subexpressions in PATTERN.
-
-   PATTERN is the address of the pattern string.
-
-   CFLAGS is a series of bits which affect compilation.
-
-     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
-     use POSIX basic syntax.
-
-     If REG_NEWLINE is set, then . and [^...] don't match newline.
-     Also, regexec will try a match beginning after every newline.
-
-     If REG_ICASE is set, then we considers upper- and lowercase
-     versions of letters to be equivalent when matching.
-
-     If REG_NOSUB is set, then when PREG is passed to regexec, that
-     routine will report only success or failure, and nothing about the
-     registers.
-
-   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
-   the return codes and their meanings.)  */
-
-int
-regcomp (preg, pattern, cflags)
-    regex_t *preg;
-    const char *pattern;
-    int cflags;
-{
-  reg_errcode_t ret;
-  reg_syntax_t syntax
-    = (cflags & REG_EXTENDED) ?
-      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
-
-  /* regex_compile will allocate the space for the compiled pattern.  */
-  preg->buffer = 0;
-  preg->allocated = 0;
-  preg->used = 0;
-
-  /* Try to allocate space for the fastmap.  */
-  preg->fastmap = (char *) malloc (1 << BYTEWIDTH);
-
-  if (cflags & REG_ICASE)
-    {
-      unsigned i;
-
-      preg->translate
-	= (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
-				      * sizeof (*(RE_TRANSLATE_TYPE)0));
-      if (preg->translate == NULL)
-        return (int) REG_ESPACE;
-
-      /* Map uppercase characters to corresponding lowercase ones.  */
-      for (i = 0; i < CHAR_SET_SIZE; i++)
-        preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
-    }
-  else
-    preg->translate = NULL;
-
-  /* If REG_NEWLINE is set, newlines are treated differently.  */
-  if (cflags & REG_NEWLINE)
-    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
-      syntax &= ~RE_DOT_NEWLINE;
-      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
-      /* It also changes the matching behavior.  */
-      preg->newline_anchor = 1;
-    }
-  else
-    preg->newline_anchor = 0;
-
-  preg->no_sub = !!(cflags & REG_NOSUB);
-
-  /* POSIX says a null character in the pattern terminates it, so we
-     can use strlen here in compiling the pattern.  */
-  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
-
-  /* POSIX doesn't distinguish between an unmatched open-group and an
-     unmatched close-group: both are REG_EPAREN.  */
-  if (ret == REG_ERPAREN) ret = REG_EPAREN;
-
-  if (ret == REG_NOERROR && preg->fastmap)
-    {
-      /* Compute the fastmap now, since regexec cannot modify the pattern
-	 buffer.  */
-      if (re_compile_fastmap (preg) == -2)
-	{
-	  /* Some error occured while computing the fastmap, just forget
-	     about it.  */
-	  free (preg->fastmap);
-	  preg->fastmap = NULL;
-	}
-    }
-
-  return (int) ret;
-}
-#ifdef _LIBC
-weak_alias (__regcomp, regcomp)
-#endif
-
-
-/* regexec searches for a given pattern, specified by PREG, in the
-   string STRING.
-
-   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
-   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
-   least NMATCH elements, and we set them to the offsets of the
-   corresponding matched substrings.
-
-   EFLAGS specifies `execution flags' which affect matching: if
-   REG_NOTBOL is set, then ^ does not match at the beginning of the
-   string; if REG_NOTEOL is set, then $ does not match at the end.
-
-   We return 0 if we find a match and REG_NOMATCH if not.  */
-
-int
-regexec (preg, string, nmatch, pmatch, eflags)
-    const regex_t *preg;
-    const char *string;
-    size_t nmatch;
-    regmatch_t pmatch[];
-    int eflags;
-{
-  int ret;
-  struct re_registers regs;
-  regex_t private_preg;
-  int len = strlen (string);
-  boolean want_reg_info = !preg->no_sub && nmatch > 0;
-
-  private_preg = *preg;
-
-  private_preg.not_bol = !!(eflags & REG_NOTBOL);
-  private_preg.not_eol = !!(eflags & REG_NOTEOL);
-
-  /* The user has told us exactly how many registers to return
-     information about, via `nmatch'.  We have to pass that on to the
-     matching routines.  */
-  private_preg.regs_allocated = REGS_FIXED;
-
-  if (want_reg_info)
-    {
-      regs.num_regs = nmatch;
-      regs.start = TALLOC (nmatch * 2, regoff_t);
-      if (regs.start == NULL)
-        return (int) REG_NOMATCH;
-      regs.end = regs.start + nmatch;
-    }
-
-  /* Perform the searching operation.  */
-  ret = re_search (&private_preg, string, len,
-                   /* start: */ 0, /* range: */ len,
-                   want_reg_info ? &regs : (struct re_registers *) 0);
-
-  /* Copy the register information to the POSIX structure.  */
-  if (want_reg_info)
-    {
-      if (ret >= 0)
-        {
-          unsigned r;
-
-          for (r = 0; r < nmatch; r++)
-            {
-              pmatch[r].rm_so = regs.start[r];
-              pmatch[r].rm_eo = regs.end[r];
-            }
-        }
-
-      /* If we needed the temporary register info, free the space now.  */
-      free (regs.start);
-    }
-
-  /* We want zero return to mean success, unlike `re_search'.  */
-  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
-}
-#ifdef _LIBC
-weak_alias (__regexec, regexec)
-#endif
-
-
-/* Returns a message corresponding to an error code, ERRCODE, returned
-   from either regcomp or regexec.   We don't use PREG here.  */
-
-size_t
-regerror (errcode, preg, errbuf, errbuf_size)
-    int errcode;
-    const regex_t *preg;
-    char *errbuf;
-    size_t errbuf_size;
-{
-  const char *msg;
-  size_t msg_size;
-
-  if (errcode < 0
-      || errcode >= (int) (sizeof (re_error_msgid)
-			   / sizeof (re_error_msgid[0])))
-    /* Only error codes returned by the rest of the code should be passed
-       to this routine.  If we are given anything else, or if other regex
-       code generates an invalid error code, then the program has a bug.
-       Dump core so we can fix it.  */
-    abort ();
-
-  msg = gettext (re_error_msgid[errcode]);
-
-  msg_size = strlen (msg) + 1; /* Includes the null.  */
-
-  if (errbuf_size != 0)
-    {
-      if (msg_size > errbuf_size)
-        {
-#if defined HAVE_MEMPCPY || defined _LIBC
-	  *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0';
-#else
-          memcpy (errbuf, msg, errbuf_size - 1);
-          errbuf[errbuf_size - 1] = 0;
-#endif
-        }
-      else
-        memcpy (errbuf, msg, msg_size);
-    }
-
-  return msg_size;
-}
-#ifdef _LIBC
-weak_alias (__regerror, regerror)
-#endif
-
-
-/* Free dynamically allocated space used by PREG.  */
-
-void
-regfree (preg)
-    regex_t *preg;
-{
-  if (preg->buffer != NULL)
-    free (preg->buffer);
-  preg->buffer = NULL;
-
-  preg->allocated = 0;
-  preg->used = 0;
-
-  if (preg->fastmap != NULL)
-    free (preg->fastmap);
-  preg->fastmap = NULL;
-  preg->fastmap_accurate = 0;
-
-  if (preg->translate != NULL)
-    free (preg->translate);
-  preg->translate = NULL;
-}
-#ifdef _LIBC
-weak_alias (__regfree, regfree)
-#endif
-
-#endif /* not emacs  */
diff -Nur grep-2.3/src/regex.c.rej grep-ja-2.3/src/regex.c.rej
--- grep-2.3/src/regex.c.rej	Mon Dec 20 23:07:44 1999
+++ grep-ja-2.3/src/regex.c.rej	Thu Jan  1 09:00:00 1970
@@ -1,848 +0,0 @@
-***************
-*** 18,23 ****
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-  
-  /* AIX requires this to be the first thing in the file. */
-  #if defined (_AIX) && !defined (REGEX_MALLOC)
---- 18,25 ----
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-+ /* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Aug. 19, 1993 by t^2  */
-  
-  /* AIX requires this to be the first thing in the file. */
-  #if defined (_AIX) && !defined (REGEX_MALLOC)
-***************
-*** 53,60 ****
-  #ifndef bcmp
-  #define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
-  #endif
-  #ifndef bcopy
-- #define bcopy(s, d, n)	memcpy ((d), (s), (n))
-  #endif
-  #ifndef bzero
-  #define bzero(s, n)	memset ((s), 0, (n))
---- 55,89 ----
-  #ifndef bcmp
-  #define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
-  #endif
-+ #ifdef HAVE_MEMMOVE
-  #ifndef bcopy
-+ #define bcopy(s, d, n)	memmove ((d), (s), (n))
-+ #endif
-+ #else
-+ #ifndef HAVE_BCOPY
-+ static void
-+ #ifdef __STDC__
-+ bcopy (const void *s0, void *d0, size_t n)
-+ #else
-+ bcopy (s, d, n)
-+      const void *s0;
-+      void *d;
-+      size_t n;
-+ #endif
-+ {
-+   const char *s = s0;
-+   char *d = d0;
-+ 
-+   if (s < d) {
-+     s += n, d += n;
-+     while (n--)
-+       *--d = *--s;
-+   }
-+   else
-+     while (n--)
-+       *d++ = *s++;
-+ }
-+ #endif
-  #endif
-  #ifndef bzero
-  #define bzero(s, n)	memset ((s), 0, (n))
-***************
-*** 605,610 ****
-            do
-  	    {
-                putchar ('/');
-  	      printchar (*p++);
-              }
-            while (--mcnt);
---- 650,659 ----
-            do
-  	    {
-                putchar ('/');
-+ 	      if (ismbchar (*p) && 2 <= mcnt) {
-+ 		printf ("/%.2s", (char *) p), p += 2, --mcnt;
-+ 		continue;
-+ 	      }
-  	      printchar (*p++);
-              }
-            while (--mcnt);
-***************
-*** 862,868 ****
-    printf ("no_sub: %d\t", bufp->no_sub);
-    printf ("not_bol: %d\t", bufp->not_bol);
-    printf ("not_eol: %d\t", bufp->not_eol);
--   printf ("syntax: %d\n", bufp->syntax);
-    /* Perhaps we should print the translate table?  */
-  }
-  
---- 918,924 ----
-    printf ("no_sub: %d\t", bufp->no_sub);
-    printf ("not_bol: %d\t", bufp->not_bol);
-    printf ("not_eol: %d\t", bufp->not_eol);
-+   printf ("syntax: %lu\n", bufp->syntax);
-    /* Perhaps we should print the translate table?  */
-  }
-  
-***************
-*** 961,967 ****
-  static void insert_op1 (), insert_op2 ();
-  static boolean at_begline_loc_p (), at_endline_loc_p ();
-  static boolean group_in_compile_stack ();
-  static reg_errcode_t compile_range ();
-  
-  /* Fetch the next character in the uncompiled pattern---translating it 
-     if necessary.  Also cast from a signed character in the constant
---- 1017,1025 ----
-  static void insert_op1 (), insert_op2 ();
-  static boolean at_begline_loc_p (), at_endline_loc_p ();
-  static boolean group_in_compile_stack ();
-+ #if 0
-  static reg_errcode_t compile_range ();
-+ #endif
-  
-  /* Fetch the next character in the uncompiled pattern---translating it 
-     if necessary.  Also cast from a signed character in the constant
-***************
-*** 970,976 ****
-  #define PATFETCH(c)							\
-    do {if (p == pend) return REG_EEND;					\
-      c = (unsigned char) *p++;						\
--     if (translate) c = translate[c]; 					\
-    } while (0)
-  
-  /* Fetch the next character in the uncompiled pattern, with no
---- 1028,1035 ----
-  #define PATFETCH(c)							\
-    do {if (p == pend) return REG_EEND;					\
-      c = (unsigned char) *p++;						\
-+     if (translate && !ismbchar (c))					\
-+       c = (unsigned char) translate[(unsigned char) c];			\
-    } while (0)
-  
-  /* Fetch the next character in the uncompiled pattern, with no
-***************
-*** 988,994 ****
-     cast the subscript to translate because some data is declared as
-     `char *', to avoid warnings when a string constant is passed.  But
-     when we use a character as a subscript we must make it unsigned.  */
-- #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
-  
-  
-  /* Macros for outputting the compiled pattern into `buffer'.  */
---- 1047,1055 ----
-     cast the subscript to translate because some data is declared as
-     `char *', to avoid warnings when a string constant is passed.  But
-     when we use a character as a subscript we must make it unsigned.  */
-+ #define TRANSLATE(d) (translate						\
-+ 		      ? (unsigned char) translate[(unsigned char) (d)]	\
-+ 		      : (d))
-  
-  
-  /* Macros for outputting the compiled pattern into `buffer'.  */
-***************
-*** 1158,1163 ****
-      || STREQ (string, "punct") || STREQ (string, "graph")		\
-      || STREQ (string, "cntrl") || STREQ (string, "blank"))
-  
-  /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
-     Returns one of error codes defined in `regex.h', or zero for success.
-  
---- 1219,1379 ----
-      || STREQ (string, "punct") || STREQ (string, "graph")		\
-      || STREQ (string, "cntrl") || STREQ (string, "blank"))
-  
-+ /* Handle charset(_not)?.
-+ 
-+    Structure of charset(_not)? in compiled pattern.
-+ 
-+      struct {
-+        unsinged char id;		charset(_not)?
-+        unsigned char sbc_size;
-+        unsigned char sbc_map[sbc_size];	same as original up to here.
-+        unsigned short mbc_size;		number of intervals.
-+        struct {
-+ 	 unsigned short beg;		beginning of interval.
-+ 	 unsigned short end;		end of interval.
-+        } intervals[mbc_size];
-+      }; */
-+ 
-+ static reg_errcode_t
-+ #ifdef __STDC__
-+ set_list_bits (unsigned short c1, unsigned short c2,
-+ 	       reg_syntax_t syntax, unsigned char *b, const char *translate)
-+ #else
-+ set_list_bits (c1, c2, syntax, b, translate)
-+      unsigned short c1, c2;
-+      reg_syntax_t syntax;
-+      unsigned char *b;
-+      const char *translate;
-+ #endif
-+ {
-+   unsigned char sbc_size = b[-1];
-+   unsigned short mbc_size = EXTRACT_UNSIGNED (&b[sbc_size]);
-+   unsigned short beg, end, upb;
-+ 
-+   if (c1 > c2)
-+     return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
-+   if (c1 < 1 << BYTEWIDTH) {
-+     upb = c2;
-+     if (1 << BYTEWIDTH <= upb)
-+       upb = (1 << BYTEWIDTH) - 1;	/* The last single-byte char */
-+     if (sbc_size <= upb / BYTEWIDTH) {
-+       /* Allocate maximum size so it never happens again.  */
-+       /* NOTE: memcpy() would not work here.  */
-+       bcopy (&b[sbc_size], &b[(1 << BYTEWIDTH) / BYTEWIDTH], 2 + mbc_size*4);
-+       bzero (&b[sbc_size], (1 << BYTEWIDTH) / BYTEWIDTH - sbc_size);
-+       b[-1] = sbc_size = (1 << BYTEWIDTH) / BYTEWIDTH;
-+     }
-+     if (!translate) {
-+       for (; c1 <= upb; c1++)
-+ 	if (!ismbchar (c1))
-+ 	  SET_LIST_BIT (c1);
-+     }
-+     else
-+       for (; c1 <= upb; c1++)
-+ 	if (!ismbchar (c1))
-+ 	  SET_LIST_BIT (TRANSLATE (c1));
-+     if (c2 < 1 << BYTEWIDTH)
-+       return REG_NOERROR;
-+     c1 = 0x8000;			/* The first wide char */
-+   }
-+   b = &b[sbc_size + 2];
-+ 
-+   /*                             intervals[beg]
-+          ●----------●          ●----------●
-+                          c1
-+                        ○----------------------●
-+ 
-+      上図のような区間のインデックス beg を決定する. */
-+   for (beg = 0, upb = mbc_size; beg < upb; ) {
-+     unsigned short mid = (beg + upb) >> 1;
-+ 
-+     if (c1 - 1 > EXTRACT_MBC (&b[mid*4 + 2]))
-+       beg = mid + 1;
-+     else
-+       upb = mid;
-+   }
-+ 
-+   /*                        intervals[end]
-+            ●-------●      ●----------●
-+                         c2
-+          ●---------------○
-+ 
-+      上図のような区間のインデックス end を決定する. */
-+   for (end = beg, upb = mbc_size; end < upb; ) {
-+     unsigned short mid = (end + upb) >> 1;
-+ 
-+     if (c2 >= EXTRACT_MBC (&b[mid*4]) - 1)
-+       end = mid + 1;
-+     else
-+       upb = mid;
-+   }
-+ 
-+   if (beg != end) {
-+     /* 既存の区間を少なくとも1つ統合する場合,
-+        区間の始点, 終点を修正する. */
-+     if (c1 > EXTRACT_MBC (&b[beg*4]))
-+       c1 = EXTRACT_MBC (&b[beg*4]);
-+     if (c2 < EXTRACT_MBC (&b[end*4 - 2]))
-+       c2 = EXTRACT_MBC (&b[end*4 - 2]);
-+   }
-+   if (end < mbc_size && end != beg + 1)
-+     /* 追加される区間の後ろに既存の区間を移動する. */
-+     /* NOTE: memcpy() would not work here.  */
-+     bcopy (&b[end*4], &b[(beg + 1)*4], (mbc_size - end)*4);
-+   STORE_MBC (&b[beg*4 + 0], c1);
-+   STORE_MBC (&b[beg*4 + 2], c2);
-+   mbc_size += beg + 1 - end;
-+   STORE_NUMBER (&b[-2], mbc_size);
-+   return REG_NOERROR;
-+ }
-+ 
-+ static int
-+ #ifdef __STDC__
-+ is_in_list (unsigned short c, const unsigned char *b)
-+ #else
-+ is_in_list (c, b)
-+      unsigned short c;
-+      const unsigned char *b;
-+ #endif
-+ {
-+   unsigned short size;
-+   int in = (re_opcode_t) b[-1] == charset_not;
-+ 
-+   size = *b++;
-+   if (c < 1 << BYTEWIDTH) {
-+     if (c / BYTEWIDTH < size && b[c / BYTEWIDTH] & 1 << c % BYTEWIDTH)
-+       in = !in;
-+   }
-+   else {
-+     unsigned short i, j;
-+ 
-+     b += size + 2;
-+     size = EXTRACT_UNSIGNED (&b[-2]);
-+ 
-+     /*                        intervals[i]
-+              ●-------●      ●--------●
-+                         c
-+                       ○----------------●
-+ 
-+      上図のような区間のインデックス i を決定する. */
-+     for (i = 0, j = size; i < j; ) {
-+       unsigned short k = (i + j) >> 1;
-+ 
-+       if (c > EXTRACT_MBC (&b[k*4 + 2]))
-+ 	i = k + 1;
-+       else
-+ 	j = k;
-+     }
-+     if (i < size && EXTRACT_MBC (&b[i*4]) <= c
-+ 	/* [...] から, 無効なマルチバイト文字を除外する.  ここでは簡単の
-+ 	   ため２バイト目が '\n' または '\0' だけを無効とした.  [^...] 
-+ 	   の場合は, 逆に無効なマルチバイト文字をマッチさせる.  */
-+ 	&& ((unsigned char) c != '\n' && (unsigned char) c != '\0'))
-+       in = !in;
-+   }
-+   return in;
-+ }
-+ 
-  /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
-     Returns one of error codes defined in `regex.h', or zero for success.
-  
-***************
-*** 1468,1479 ****
-          case '[':
-            {
-              boolean had_char_class = false;
-  
-              if (p == pend) return REG_EBRACK;
-  
-              /* Ensure that we have enough space to push a charset: the
-                 opcode, the length count, and the bitset; 34 bytes in all.  */
-- 	    GET_BUFFER_SPACE (34);
-  
-              laststart = b;
-  
---- 1684,1698 ----
-          case '[':
-            {
-              boolean had_char_class = false;
-+ 	    unsigned short c, c1;
-+ 	    int last_char = -1;
-  
-              if (p == pend) return REG_EBRACK;
-  
-              /* Ensure that we have enough space to push a charset: the
-                 opcode, the length count, and the bitset; 34 bytes in all.  */
-+ 	    /* + 2 + 4 for mbcharset(_not)? with just one interval.  */
-+ 	    GET_BUFFER_SPACE (34 + 2 + 4);
-  
-              laststart = b;
-  
-***************
-*** 2060,2076 ****
-              /* Read in characters and ranges, setting map bits.  */
-              for (;;)
-                {
-                  if (p == pend) return REG_EBRACK;
-  
--                 PATFETCH (c);
-  
-                  /* \ might escape characters inside [...] and [^...].  */
-                  if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
-                    {
-                      if (p == pend) return REG_EESCAPE;
-  
--                     PATFETCH (c1);
--                     SET_LIST_BIT (c1);
-                      continue;
-                    }
-  
---- 2279,2312 ----
-              /* Read in characters and ranges, setting map bits.  */
-              for (;;)
-                {
-+ 		int size;
-+ 
-                  if (p == pend) return REG_EBRACK;
-  
-+ 		if ((size = EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])))
-+ 		  /* Ensure the space is enough to hold another interval
-+ 		     of multi-byte chars in charset(_not)?.  */
-+ 		  GET_BUFFER_SPACE (32 + 2 + size*4 + 4);
-+ 
-+ 		PATFETCH_RAW (c);
-  
-                  /* \ might escape characters inside [...] and [^...].  */
-                  if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
-                    {
-                      if (p == pend) return REG_EESCAPE;
-  
-+ 		    PATFETCH_RAW (c1);
-+ 		    if (ismbchar (c1)) {
-+ 		      unsigned char c2;
-+ 
-+ 		      PATFETCH_RAW (c2);
-+ 		      c1 = c1 << 8 | c2;
-+ 		      (void) set_list_bits (c1, c1, syntax, b, translate);
-+ 		      last_char = c1;
-+ 		      continue;
-+ 		    }
-+ 		    SET_LIST_BIT (TRANSLATE (c1));
-+ 		    last_char = c1;
-                      continue;
-                    }
-  
-***************
-*** 2085,2101 ****
-                  if (had_char_class && c == '-' && *p != ']')
-                    return REG_ERANGE;
-  
-                  /* Look ahead to see if it's a range when the last thing
-                     was a character: if this is a hyphen not at the
-                     beginning or the end of a list, then it's the range
-                     operator.  */
-                  if (c == '-' 
-                      && !(p - 2 >= pattern && p[-2] == '[') 
-                      && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
-                      && *p != ']')
-                    {
--                     reg_errcode_t ret
--                       = compile_range (&p, pend, translate, syntax, b);
-                      if (ret != REG_NOERROR) return ret;
-                    }
-  
---- 2321,2359 ----
-                  if (had_char_class && c == '-' && *p != ']')
-                    return REG_ERANGE;
-  
-+ 		if (ismbchar (c)) {
-+ 		  unsigned char c2;
-+ 
-+ 		  PATFETCH_RAW (c2);
-+ 		  c = c << 8 | c2;
-+ 		}
-+ 
-                  /* Look ahead to see if it's a range when the last thing
-                     was a character: if this is a hyphen not at the
-                     beginning or the end of a list, then it's the range
-                     operator.  */
-                  if (c == '-' 
-+ #if 0 /* The original was: */
-                      && !(p - 2 >= pattern && p[-2] == '[') 
-                      && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
-+ #else /* I wonder why he did not write like this.
-+ 	 Have we got any problems?  */
-+ 		    && p != p1 + 1
-+ #endif
-                      && *p != ']')
-                    {
-+ 		    reg_errcode_t ret;
-+ 
-+ 		    assert (last_char >= 0);
-+ 		    PATFETCH_RAW (c1);
-+ 		    if (ismbchar (c1)) {
-+ 		      unsigned char c2;
-+ 
-+ 		      PATFETCH_RAW (c2);
-+ 		      c1 = c1 << 8 | c2;
-+ 		    }
-+ 		    ret = set_list_bits (last_char, c1, syntax, b, translate);
-+ 		    last_char = c1;
-                      if (ret != REG_NOERROR) return ret;
-                    }
-  
-***************
-*** 2104,2112 ****
-                      reg_errcode_t ret;
-  
-  		    /* Move past the `-'.  */
--                     PATFETCH (c1);
--                     
--                     ret = compile_range (&p, pend, translate, syntax, b);
-                      if (ret != REG_NOERROR) return ret;
-                    }
-  
---- 2362,2378 ----
-                      reg_errcode_t ret;
-  
-  		    /* Move past the `-'.  */
-+ 		    PATFETCH_RAW (c1);
-+ 
-+ 		    PATFETCH_RAW (c1);
-+ 		    if (ismbchar (c1)) {
-+ 		      unsigned char c2;
-+ 
-+ 		      PATFETCH_RAW (c2);
-+ 		      c1 = c1 << 8 | c2;
-+ 		    }
-+ 		    ret = set_list_bits (c, c1, syntax, b, translate);
-+ 		    last_char = c1;
-                      if (ret != REG_NOERROR) return ret;
-                    }
-  
-***************
-*** 1617,1637 ****
-                              SET_LIST_BIT (ch);
-                            }
-                          had_char_class = true;
-                        }
-                      else
-                        {
-                          c1++;
-                          while (c1--)    
-                            PATUNFETCH;
-                          SET_LIST_BIT ('[');
-                          SET_LIST_BIT (':');
-                          had_char_class = false;
-                        }
-                    }
-                  else
-                    {
-                      had_char_class = false;
--                     SET_LIST_BIT (c);
-                    }
-                }
-  
---- 1883,1913 ----
-                              SET_LIST_BIT (ch);
-                            }
-                          had_char_class = true;
-+ #ifdef DEBUG
-+ 			last_char = -1;
-+ #endif
-                        }
-                      else
-                        {
-                          c1++;
-                          while (c1--)    
-                            PATUNFETCH;
-+ #if 0 /* The original was: */
-                          SET_LIST_BIT ('[');
-                          SET_LIST_BIT (':');
-+ #else /* I think this is the right way.  */
-+ 			SET_LIST_BIT (TRANSLATE ('['));
-+ 			SET_LIST_BIT (TRANSLATE (':'));
-+ #endif
-                          had_char_class = false;
-+ 			last_char = ':';
-                        }
-                    }
-                  else
-                    {
-                      had_char_class = false;
-+ 		    (void) set_list_bits (c, c, syntax, b, translate);
-+ 		    last_char = c;
-                    }
-                }
-  
-***************
-*** 1639,1645 ****
-                 end of the map.  Decrease the map-length byte too.  */
-              while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
-                b[-1]--; 
--             b += b[-1];
-            }
-            break;
-  
---- 1915,1925 ----
-                 end of the map.  Decrease the map-length byte too.  */
-              while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
-                b[-1]--; 
-+ 	    if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH)
-+ 	      bcopy (&b[(1 << BYTEWIDTH) / BYTEWIDTH], &b[b[-1]],
-+ 		     2 + EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])*4);
-+ 	    b += b[-1] + 2 + EXTRACT_UNSIGNED (&b[b[-1]])*4;
-+ 	    break;
-            }
-            break;
-  
-***************
-*** 2767,2772 ****
-  	      pending_exact = b - 1;
-              }
-              
-  	  BUF_PUSH (c);
-            (*pending_exact)++;
-  	  break;
---- 3056,3065 ----
-  	      pending_exact = b - 1;
-              }
-              
-+ 	  if (c1) {
-+ 	    BUF_PUSH (c1);
-+ 	    (*pending_exact)++;
-+ 	  }
-  	  BUF_PUSH (c);
-            (*pending_exact)++;
-  	  break;
-***************
-*** 2892,2898 ****
-  static boolean
-  at_endline_loc_p (p, pend, syntax)
-      const char *p, *pend;
--     int syntax;
-  {
-    const char *next = p;
-    boolean next_backslash = *next == '\\';
---- 3185,3191 ----
-  static boolean
-  at_endline_loc_p (p, pend, syntax)
-      const char *p, *pend;
-+     reg_syntax_t syntax;
-  {
-    const char *next = p;
-    boolean next_backslash = *next == '\\';
-***************
-*** 2876,2888 ****
-          break;
-        else if (range > 0) 
-          {
--           range--; 
--           startpos++;
-          }
-        else
-          {
--           range++; 
--           startpos--;
-          }
-      }
-    return -1;
---- 3231,3266 ----
-          break;
-        else if (range > 0) 
-          {
-+ 	  const char *d = ((startpos >= size1 ? string2 - size1 : string1)
-+ 			   + startpos);
-+ 
-+ 	  if (ismbchar (*d)) {
-+ 	    range--, startpos++;
-+ 	    if (!range)
-+ 	      break;
-+ 	  }
-+           range--, startpos++;
-          }
-        else
-          {
-+           range++, startpos--;
-+ 	  {
-+ 	    const char *s, *d, *p;
-+ 
-+ 	    if (startpos < size1)
-+ 	      s = string1, d = string1 + startpos;
-+ 	    else
-+ 	      s = string2, d = string2 + startpos - size1;
-+ 	    for (p = d; p-- > s && ismbchar(*p); )
-+ 	      /* --p >= s だと 80[12]?86 で動かない可能性がある.  (huge
-+ 		 model 以外で, s のオフセットが 0 だった場合.)  */
-+ 	      ;
-+ 	    if (!((d - p) & 1)) {
-+ 	      if (!range)
-+ 		break;
-+ 	      range++, startpos--;
-+ 	    }
-+ 	  }
-          }
-      }
-    return -1;
-***************
-*** 3442,3449 ****
-  	    {
-  	      do
-  		{
-  		  PREFETCH ();
-- 		  if (translate[(unsigned char) *d++] != (char) *p++)
-                      goto fail;
-  		}
-  	      while (--mcnt);
---- 3820,3840 ----
-  	    {
-  	      do
-  		{
-+ 		  unsigned char c;
-+ 
-  		  PREFETCH ();
-+ 		  c = *d++;
-+ 		  if (ismbchar (c)) {
-+ 		    if (c != (unsigned char) *p++
-+ 			|| !--mcnt	/* パターンが正しくコンパイルさ
-+ 					   れている限り, このチェックは
-+ 					   冗長だが念のため.  */
-+ 			|| d == dend
-+ 			|| (unsigned char) *d++ != (unsigned char) *p++)
-+ 		      goto fail;
-+ 		    continue;
-+ 		  }
-+ 		  if ((unsigned char) translate[c] != (unsigned char) *p++)
-                      goto fail;
-  		}
-  	      while (--mcnt);
-***************
-*** 3480,3505 ****
-  	case charset:
-  	case charset_not:
-  	  {
-- 	    register unsigned char c;
-- 	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
-  
--             DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
-  
-  	    PREFETCH ();
-- 	    c = TRANSLATE (*d); /* The character to match.  */
-  
--             /* Cast to `unsigned' instead of `unsigned char' in case the
--                bit list is a full 32 bytes long.  */
-- 	    if (c < (unsigned) (*p * BYTEWIDTH)
-- 		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-- 	      not = !not;
-  
-- 	    p += 1 + *p;
-  
-  	    if (!not) goto fail;
-              
-  	    SET_REGS_MATCHED ();
-              d++;
-  	    break;
-  	  }
-  
---- 3901,3932 ----
-  	case charset:
-  	case charset_not:
-  	  {
-+ 	    register unsigned short c;
-+ 	    boolean not;
-  
-+ 	    DEBUG_PRINT2 ("EXECUTING charset%s.\n",
-+ 			  (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
-  
-  	    PREFETCH ();
-+ 	    c = (unsigned char) *d;
-+ 	    if (ismbchar (c)) {
-+ 	      c <<= 8;
-+ 	      if (d + 1 != dend)
-+ 		c |= (unsigned char) d[1];
-+ 	    }
-+ 	    else
-+ 	      c = TRANSLATE (c); /* The character to match.  */
-  
-+ 	    not = is_in_list (c, p);
-  
-+ 	    p += 1 + *p + 2 + EXTRACT_UNSIGNED (&p[1 + *p])*4;
-  
-  	    if (!not) goto fail;
-              
-  	    SET_REGS_MATCHED ();
-              d++;
-+ 	    if (d != dend && c >= 1 << BYTEWIDTH)
-+ 	      d++;
-  	    break;
-  	  }
-  
-***************
-*** 3665,3671 ****
-                            regstart[r] = old_regstart[r];
-  
-                            /* xx why this test?  */
--                           if ((int) old_regend[r] >= (int) regstart[r])
-                              regend[r] = old_regend[r];
-                          }     
-                      }
---- 4092,4098 ----
-                            regstart[r] = old_regstart[r];
-  
-                            /* xx why this test?  */
-+ 			  if (old_regend[r] >= regstart[r])
-                              regend[r] = old_regend[r];
-                          }     
-                      }
-***************
-*** 4895,4909 ****
-  		else if ((re_opcode_t) p1[3] == charset
-  			 || (re_opcode_t) p1[3] == charset_not)
-  		  {
-- 		    int not = (re_opcode_t) p1[3] == charset_not;
--                     
-- 		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
-- 			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-- 		      not = !not;
-  
--                     /* `not' is equal to 1 if c would match, which means
-                          that we can't change to pop_failure_jump.  */
-- 		    if (!not)
-                        {
-    		        p[-3] = (unsigned char) pop_failure_jump;
-                          DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
---- 5322,5333 ----
-  		else if ((re_opcode_t) p1[3] == charset
-  			 || (re_opcode_t) p1[3] == charset_not)
-  		  {
-+ 		    if (ismbchar (c))
-+ 		      c = c << 8 | p2[3];
-  
-+ 		    /* `is_in_list()' is TRUE if c would match, which means
-                          that we can't change to pop_failure_jump.  */
-+ 		    if (!is_in_list (c, p1 + 4))
-                        {
-    		        p[-3] = (unsigned char) pop_failure_jump;
-                          DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-***************
-*** 5458,5467 ****
-       register int len;
-       char *translate;
-  {
--   register unsigned char *p1 = s1, *p2 = s2;
-    while (len)
-      {
--       if (translate[*p1++] != translate[*p2++]) return 1;
-        len--;
-      }
-    return 0;
---- 5882,5898 ----
-       register int len;
-       char *translate;
-  {
-+   register unsigned char *p1 = s1, *p2 = s2, c;
-    while (len)
-      {
-+       c = *p1++;
-+       if (ismbchar(c)) {
-+ 	if (c != *p2++ || !--len || *p1++ != *p2++)
-+ 	  return 1;
-+       }
-+       else
-+ 	if (translate[c] != translate[*p2++])
-+ 	  return 1;
-        len--;
-      }
-    return 0;
-***************
-*** 5604,5610 ****
-      int cflags;
-  {
-    reg_errcode_t ret;
--   unsigned syntax
-      = (cflags & REG_EXTENDED) ?
-        RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
-  
---- 6035,6041 ----
-      int cflags;
-  {
-    reg_errcode_t ret;
-+   reg_syntax_t syntax
-      = (cflags & REG_EXTENDED) ?
-        RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
-  
diff -Nur grep-2.3/src/regex.h grep-ja-2.3/src/regex.h
--- grep-2.3/src/regex.h	Mon Dec 20 23:07:48 1999
+++ grep-ja-2.3/src/regex.h	Mon Dec 20 23:48:45 1999
@@ -20,6 +20,9 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jul. 10, 1993 by t^2  */
+
 #ifndef _REGEX_H
 #define _REGEX_H 1
 
@@ -396,6 +399,12 @@
 
 /* This is the structure we store register match data in.  See
    regex.texinfo for a full description of what registers match.  */
+
+#ifdef __GNUC__
+#define const __const__
+#else
+#define const
+#endif
 struct re_registers
 {
   unsigned num_regs;
diff -Nur grep-2.3/src/regex.h.orig grep-ja-2.3/src/regex.h.orig
--- grep-2.3/src/regex.h.orig	Thu Nov 19 11:49:27 1998
+++ grep-ja-2.3/src/regex.h.orig	Thu Jan  1 09:00:00 1970
@@ -1,572 +0,0 @@
-/* Definitions for data structures and routines for the regular
-   expression library, version 0.12.
-   Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc.
-
-   This file is part of the GNU C Library.  Its master source is NOT part of
-   the C library, however.  The master source lives in /gd/gnu/lib.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#ifndef _REGEX_H
-#define _REGEX_H 1
-
-/* Allow the use in C++ code.  */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* POSIX says that <sys/types.h> must be included (by the caller) before
-   <regex.h>.  */
-
-#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
-/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
-   should be there.  */
-# include <stddef.h>
-#endif
-
-/* The following two types have to be signed and unsigned integer type
-   wide enough to hold a value of a pointer.  For most ANSI compilers
-   ptrdiff_t and size_t should be likely OK.  Still size of these two
-   types is 2 for Microsoft C.  Ugh... */
-typedef long int s_reg_t;
-typedef unsigned long int active_reg_t;
-
-/* The following bits are used to determine the regexp syntax we
-   recognize.  The set/not-set meanings are chosen so that Emacs syntax
-   remains the value 0.  The bits are given in alphabetical order, and
-   the definitions shifted by one from the previous bit; thus, when we
-   add or remove a bit, only one other definition need change.  */
-typedef unsigned long int reg_syntax_t;
-
-/* If this bit is not set, then \ inside a bracket expression is literal.
-   If set, then such a \ quotes the following character.  */
-#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
-
-/* If this bit is not set, then + and ? are operators, and \+ and \? are
-     literals.
-   If set, then \+ and \? are operators and + and ? are literals.  */
-#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
-
-/* If this bit is set, then character classes are supported.  They are:
-     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
-     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
-   If not set, then character classes are not supported.  */
-#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
-
-/* If this bit is set, then ^ and $ are always anchors (outside bracket
-     expressions, of course).
-   If this bit is not set, then it depends:
-        ^  is an anchor if it is at the beginning of a regular
-           expression or after an open-group or an alternation operator;
-        $  is an anchor if it is at the end of a regular expression, or
-           before a close-group or an alternation operator.
-
-   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
-   POSIX draft 11.2 says that * etc. in leading positions is undefined.
-   We already implemented a previous draft which made those constructs
-   invalid, though, so we haven't changed the code back.  */
-#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
-
-/* If this bit is set, then special characters are always special
-     regardless of where they are in the pattern.
-   If this bit is not set, then special characters are special only in
-     some contexts; otherwise they are ordinary.  Specifically,
-     * + ? and intervals are only special when not after the beginning,
-     open-group, or alternation operator.  */
-#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
-
-/* If this bit is set, then *, +, ?, and { cannot be first in an re or
-     immediately after an alternation or begin-group operator.  */
-#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
-
-/* If this bit is set, then . matches newline.
-   If not set, then it doesn't.  */
-#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
-
-/* If this bit is set, then . doesn't match NUL.
-   If not set, then it does.  */
-#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
-
-/* If this bit is set, nonmatching lists [^...] do not match newline.
-   If not set, they do.  */
-#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
-
-/* If this bit is set, either \{...\} or {...} defines an
-     interval, depending on RE_NO_BK_BRACES.
-   If not set, \{, \}, {, and } are literals.  */
-#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
-
-/* If this bit is set, +, ? and | aren't recognized as operators.
-   If not set, they are.  */
-#define RE_LIMITED_OPS (RE_INTERVALS << 1)
-
-/* If this bit is set, newline is an alternation operator.
-   If not set, newline is literal.  */
-#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
-
-/* If this bit is set, then `{...}' defines an interval, and \{ and \}
-     are literals.
-  If not set, then `\{...\}' defines an interval.  */
-#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
-
-/* If this bit is set, (...) defines a group, and \( and \) are literals.
-   If not set, \(...\) defines a group, and ( and ) are literals.  */
-#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
-
-/* If this bit is set, then \<digit> matches <digit>.
-   If not set, then \<digit> is a back-reference.  */
-#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
-
-/* If this bit is set, then | is an alternation operator, and \| is literal.
-   If not set, then \| is an alternation operator, and | is literal.  */
-#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
-
-/* If this bit is set, then an ending range point collating higher
-     than the starting range point, as in [z-a], is invalid.
-   If not set, then when ending range point collates higher than the
-     starting range point, the range is ignored.  */
-#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
-
-/* If this bit is set, then an unmatched ) is ordinary.
-   If not set, then an unmatched ) is invalid.  */
-#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
-
-/* If this bit is set, succeed as soon as we match the whole pattern,
-   without further backtracking.  */
-#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
-
-/* If this bit is set, do not process the GNU regex operators.
-   If not set, then the GNU regex operators are recognized. */
-#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
-
-/* If this bit is set, turn on internal regex debugging.
-   If not set, and debugging was on, turn it off.
-   This only works if regex.c is compiled -DDEBUG.
-   We define this bit always, so that all that's needed to turn on
-   debugging is to recompile regex.c; the calling code can always have
-   this bit set, and it won't affect anything in the normal case. */
-#define RE_DEBUG (RE_NO_GNU_OPS << 1)
-
-/* This global variable defines the particular regexp syntax to use (for
-   some interfaces).  When a regexp is compiled, the syntax used is
-   stored in the pattern buffer, so changing this does not affect
-   already-compiled regexps.  */
-extern reg_syntax_t re_syntax_options;
-
-/* Define combinations of the above bits for the standard possibilities.
-   (The [[[ comments delimit what gets put into the Texinfo file, so
-   don't delete them!)  */
-/* [[[begin syntaxes]]] */
-#define RE_SYNTAX_EMACS 0
-
-#define RE_SYNTAX_AWK							\
-  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL			\
-   | RE_NO_BK_PARENS              | RE_NO_BK_REFS			\
-   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES			\
-   | RE_DOT_NEWLINE		  | RE_CONTEXT_INDEP_ANCHORS		\
-   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GNU_AWK						\
-  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)	\
-   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
-
-#define RE_SYNTAX_POSIX_AWK 						\
-  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS		\
-   | RE_INTERVALS	    | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GREP							\
-  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
-   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
-   | RE_NEWLINE_ALT)
-
-#define RE_SYNTAX_EGREP							\
-  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
-   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
-   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
-   | RE_NO_BK_VBAR)
-
-#define RE_SYNTAX_POSIX_EGREP						\
-  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
-
-/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
-#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
-
-#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
-
-/* Syntax bits common to both basic and extended POSIX regex syntax.  */
-#define _RE_SYNTAX_POSIX_COMMON						\
-  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
-   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
-
-#define RE_SYNTAX_POSIX_BASIC						\
-  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
-
-/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
-   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
-   isn't minimal, since other operators, such as \`, aren't disabled.  */
-#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
-  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
-
-#define RE_SYNTAX_POSIX_EXTENDED					\
-  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS			\
-   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES				\
-   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR				\
-   | RE_UNMATCHED_RIGHT_PAREN_ORD)
-
-/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
-   replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
-#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
-   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
-   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
-   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
-/* [[[end syntaxes]]] */
-
-/* Maximum number of duplicates an interval can allow.  Some systems
-   (erroneously) define this in other header files, but we want our
-   value, so remove any previous define.  */
-#ifdef RE_DUP_MAX
-# undef RE_DUP_MAX
-#endif
-/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
-#define RE_DUP_MAX (0x7fff)
-
-
-/* POSIX `cflags' bits (i.e., information for `regcomp').  */
-
-/* If this bit is set, then use extended regular expression syntax.
-   If not set, then use basic regular expression syntax.  */
-#define REG_EXTENDED 1
-
-/* If this bit is set, then ignore case when matching.
-   If not set, then case is significant.  */
-#define REG_ICASE (REG_EXTENDED << 1)
-
-/* If this bit is set, then anchors do not match at newline
-     characters in the string.
-   If not set, then anchors do match at newlines.  */
-#define REG_NEWLINE (REG_ICASE << 1)
-
-/* If this bit is set, then report only success or fail in regexec.
-   If not set, then returns differ between not matching and errors.  */
-#define REG_NOSUB (REG_NEWLINE << 1)
-
-
-/* POSIX `eflags' bits (i.e., information for regexec).  */
-
-/* If this bit is set, then the beginning-of-line operator doesn't match
-     the beginning of the string (presumably because it's not the
-     beginning of a line).
-   If not set, then the beginning-of-line operator does match the
-     beginning of the string.  */
-#define REG_NOTBOL 1
-
-/* Like REG_NOTBOL, except for the end-of-line.  */
-#define REG_NOTEOL (1 << 1)
-
-
-/* If any error codes are removed, changed, or added, update the
-   `re_error_msg' table in regex.c.  */
-typedef enum
-{
-#ifdef _XOPEN_SOURCE
-  REG_ENOSYS = -1,	/* This will never happen for this implementation.  */
-#endif
-
-  REG_NOERROR = 0,	/* Success.  */
-  REG_NOMATCH,		/* Didn't find a match (for regexec).  */
-
-  /* POSIX regcomp return error codes.  (In the order listed in the
-     standard.)  */
-  REG_BADPAT,		/* Invalid pattern.  */
-  REG_ECOLLATE,		/* Not implemented.  */
-  REG_ECTYPE,		/* Invalid character class name.  */
-  REG_EESCAPE,		/* Trailing backslash.  */
-  REG_ESUBREG,		/* Invalid back reference.  */
-  REG_EBRACK,		/* Unmatched left bracket.  */
-  REG_EPAREN,		/* Parenthesis imbalance.  */
-  REG_EBRACE,		/* Unmatched \{.  */
-  REG_BADBR,		/* Invalid contents of \{\}.  */
-  REG_ERANGE,		/* Invalid range end.  */
-  REG_ESPACE,		/* Ran out of memory.  */
-  REG_BADRPT,		/* No preceding re for repetition op.  */
-
-  /* Error codes we've added.  */
-  REG_EEND,		/* Premature end.  */
-  REG_ESIZE,		/* Compiled pattern bigger than 2^16 bytes.  */
-  REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
-} reg_errcode_t;
-
-/* This data structure represents a compiled pattern.  Before calling
-   the pattern compiler, the fields `buffer', `allocated', `fastmap',
-   `translate', and `no_sub' can be set.  After the pattern has been
-   compiled, the `re_nsub' field is available.  All other fields are
-   private to the regex routines.  */
-
-#ifndef RE_TRANSLATE_TYPE
-# define RE_TRANSLATE_TYPE char *
-#endif
-
-struct re_pattern_buffer
-{
-/* [[[begin pattern_buffer]]] */
-	/* Space that holds the compiled pattern.  It is declared as
-          `unsigned char *' because its elements are
-           sometimes used as array indexes.  */
-  unsigned char *buffer;
-
-	/* Number of bytes to which `buffer' points.  */
-  unsigned long int allocated;
-
-	/* Number of bytes actually used in `buffer'.  */
-  unsigned long int used;
-
-        /* Syntax setting with which the pattern was compiled.  */
-  reg_syntax_t syntax;
-
-        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
-           the fastmap, if there is one, to skip over impossible
-           starting points for matches.  */
-  char *fastmap;
-
-        /* Either a translate table to apply to all characters before
-           comparing them, or zero for no translation.  The translation
-           is applied to a pattern when it is compiled and to a string
-           when it is matched.  */
-  RE_TRANSLATE_TYPE translate;
-
-	/* Number of subexpressions found by the compiler.  */
-  size_t re_nsub;
-
-        /* Zero if this pattern cannot match the empty string, one else.
-           Well, in truth it's used only in `re_search_2', to see
-           whether or not we should use the fastmap, so we don't set
-           this absolutely perfectly; see `re_compile_fastmap' (the
-           `duplicate' case).  */
-  unsigned can_be_null : 1;
-
-        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
-             for `max (RE_NREGS, re_nsub + 1)' groups.
-           If REGS_REALLOCATE, reallocate space if necessary.
-           If REGS_FIXED, use what's there.  */
-#define REGS_UNALLOCATED 0
-#define REGS_REALLOCATE 1
-#define REGS_FIXED 2
-  unsigned regs_allocated : 2;
-
-        /* Set to zero when `regex_compile' compiles a pattern; set to one
-           by `re_compile_fastmap' if it updates the fastmap.  */
-  unsigned fastmap_accurate : 1;
-
-        /* If set, `re_match_2' does not return information about
-           subexpressions.  */
-  unsigned no_sub : 1;
-
-        /* If set, a beginning-of-line anchor doesn't match at the
-           beginning of the string.  */
-  unsigned not_bol : 1;
-
-        /* Similarly for an end-of-line anchor.  */
-  unsigned not_eol : 1;
-
-        /* If true, an anchor at a newline matches.  */
-  unsigned newline_anchor : 1;
-
-/* [[[end pattern_buffer]]] */
-};
-
-typedef struct re_pattern_buffer regex_t;
-
-/* Type for byte offsets within the string.  POSIX mandates this.  */
-typedef int regoff_t;
-
-
-/* This is the structure we store register match data in.  See
-   regex.texinfo for a full description of what registers match.  */
-struct re_registers
-{
-  unsigned num_regs;
-  regoff_t *start;
-  regoff_t *end;
-};
-
-
-/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
-   `re_match_2' returns information about at least this many registers
-   the first time a `regs' structure is passed.  */
-#ifndef RE_NREGS
-# define RE_NREGS 30
-#endif
-
-
-/* POSIX specification for registers.  Aside from the different names than
-   `re_registers', POSIX uses an array of structures, instead of a
-   structure of arrays.  */
-typedef struct
-{
-  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
-  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
-} regmatch_t;
-
-/* Declarations for routines.  */
-
-/* To avoid duplicating every routine declaration -- once with a
-   prototype (if we are ANSI), and once without (if we aren't) -- we
-   use the following macro to declare argument types.  This
-   unfortunately clutters up the declarations a bit, but I think it's
-   worth it.  */
-
-#if __STDC__
-
-# define _RE_ARGS(args) args
-
-#else /* not __STDC__ */
-
-# define _RE_ARGS(args) ()
-
-#endif /* not __STDC__ */
-
-/* Sets the current default syntax to SYNTAX, and return the old syntax.
-   You can also simply assign to the `re_syntax_options' variable.  */
-extern reg_syntax_t __re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
-extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
-
-/* Compile the regular expression PATTERN, with length LENGTH
-   and syntax given by the global `re_syntax_options', into the buffer
-   BUFFER.  Return NULL if successful, and an error string if not.  */
-extern const char *__re_compile_pattern
-  _RE_ARGS ((const char *pattern, size_t length,
-             struct re_pattern_buffer *buffer));
-extern const char *re_compile_pattern
-  _RE_ARGS ((const char *pattern, size_t length,
-             struct re_pattern_buffer *buffer));
-
-
-/* Compile a fastmap for the compiled pattern in BUFFER; used to
-   accelerate searches.  Return 0 if successful and -2 if was an
-   internal error.  */
-extern int __re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
-extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
-
-
-/* Search in the string STRING (with length LENGTH) for the pattern
-   compiled into BUFFER.  Start searching at position START, for RANGE
-   characters.  Return the starting position of the match, -1 for no
-   match, or -2 for an internal error.  Also return register
-   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
-extern int __re_search
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-            int length, int start, int range, struct re_registers *regs));
-extern int re_search
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-            int length, int start, int range, struct re_registers *regs));
-
-
-/* Like `re_search', but search in the concatenation of STRING1 and
-   STRING2.  Also, stop searching at index START + STOP.  */
-extern int __re_search_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, int range, struct re_registers *regs, int stop));
-extern int re_search_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, int range, struct re_registers *regs, int stop));
-
-
-/* Like `re_search', but return how many characters in STRING the regexp
-   in BUFFER matched, starting at position START.  */
-extern int __re_match
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-             int length, int start, struct re_registers *regs));
-extern int re_match
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-             int length, int start, struct re_registers *regs));
-
-
-/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
-extern int __re_match_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, struct re_registers *regs, int stop));
-extern int re_match_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, struct re_registers *regs, int stop));
-
-
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
-   for recording register information.  STARTS and ENDS must be
-   allocated with malloc, and must each be at least `NUM_REGS * sizeof
-   (regoff_t)' bytes long.
-
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
-
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-extern void __re_set_registers
-  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
-             unsigned num_regs, regoff_t *starts, regoff_t *ends));
-extern void re_set_registers
-  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
-             unsigned num_regs, regoff_t *starts, regoff_t *ends));
-
-#ifdef _REGEX_RE_COMP
-# ifndef _CRAY
-/* 4.2 bsd compatibility.  */
-extern char *re_comp _RE_ARGS ((const char *));
-extern int re_exec _RE_ARGS ((const char *));
-# endif
-#endif
-
-/* POSIX compatibility.  */
-extern int __regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern,
-				int __cflags));
-extern int regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern,
-			      int __cflags));
-
-extern int __regexec _RE_ARGS ((const regex_t *__preg,
-				const char *__string, size_t __nmatch,
-				regmatch_t __pmatch[], int __eflags));
-extern int regexec _RE_ARGS ((const regex_t *__preg,
-			      const char *__string, size_t __nmatch,
-			      regmatch_t __pmatch[], int __eflags));
-
-extern size_t __regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
-				    char *__errbuf, size_t __errbuf_size));
-extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
-				  char *__errbuf, size_t __errbuf_size));
-
-extern void __regfree _RE_ARGS ((regex_t *__preg));
-extern void regfree _RE_ARGS ((regex_t *__preg));
-
-
-#ifdef __cplusplus
-}
-#endif	/* C++ */
-
-#endif /* regex.h */
-
-/*
-Local variables:
-make-backup-files: t
-version-control: t
-trim-versions-without-asking: nil
-End:
-*/
diff -Nur grep-2.3/src/regex.h.rej grep-ja-2.3/src/regex.h.rej
--- grep-2.3/src/regex.h.rej	Mon Dec 20 23:07:48 1999
+++ grep-ja-2.3/src/regex.h.rej	Thu Jan  1 09:00:00 1970
@@ -1,80 +0,0 @@
-***************
-*** 16,21 ****
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-  
-  #ifndef __REGEXP_LIBRARY_H__
-  #define __REGEXP_LIBRARY_H__
---- 16,23 ----
-     You should have received a copy of the GNU General Public License
-     along with this program; if not, write to the Free Software
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-+ /* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jul. 10, 1993 by t^2  */
-  
-  #ifndef __REGEXP_LIBRARY_H__
-  #define __REGEXP_LIBRARY_H__
-***************
-*** 35,45 ****
-     remains the value 0.  The bits are given in alphabetical order, and
-     the definitions shifted by one from the previous bit; thus, when we
-     add or remove a bit, only one other definition need change.  */
-- typedef unsigned reg_syntax_t;
-  
-  /* If this bit is not set, then \ inside a bracket expression is literal.
-     If set, then such a \ quotes the following character.  */
-- #define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
-  
-  /* If this bit is not set, then + and ? are operators, and \+ and \? are
-       literals. 
---- 37,47 ----
-     remains the value 0.  The bits are given in alphabetical order, and
-     the definitions shifted by one from the previous bit; thus, when we
-     add or remove a bit, only one other definition need change.  */
-+ typedef unsigned long reg_syntax_t;
-  
-  /* If this bit is not set, then \ inside a bracket expression is literal.
-     If set, then such a \ quotes the following character.  */
-+ #define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long)1)
-  
-  /* If this bit is not set, then + and ? are operators, and \+ and \? are
-       literals. 
-***************
-*** 205,211 ****
-  #ifdef RE_DUP_MAX
-  #undef RE_DUP_MAX
-  #endif
-- #define RE_DUP_MAX ((1 << 15) - 1) 
-  
-  
-  /* POSIX `cflags' bits (i.e., information for `regcomp').  */
---- 207,213 ----
-  #ifdef RE_DUP_MAX
-  #undef RE_DUP_MAX
-  #endif
-+ #define RE_DUP_MAX ((int)(((unsigned)1 << 15) - 1))
-  
-  
-  /* POSIX `cflags' bits (i.e., information for `regcomp').  */
-***************
-*** 396,401 ****
-  #else /* not __STDC__ */
-  
-  #define _RE_ARGS(args) ()
-  
-  #endif /* not __STDC__ */
-  
---- 398,409 ----
-  #else /* not __STDC__ */
-  
-  #define _RE_ARGS(args) ()
-+ 
-+ #ifdef __GNUC__
-+ #define const __const__
-+ #else
-+ #define const
-+ #endif
-  
-  #endif /* not __STDC__ */
-  
diff -Nur grep-2.3/src/search.c grep-ja-2.3/src/search.c
--- grep-2.3/src/search.c	Mon Dec 20 23:07:51 1999
+++ grep-ja-2.3/src/search.c	Mon Dec 20 23:48:49 1999
@@ -16,6 +16,8 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
+/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
+   Last change: Jul. 9, 1993 by t^2  */
 /* Written August 1992 by Mike Haertel. */
 
 #ifdef HAVE_CONFIG_H
@@ -40,11 +42,6 @@
 /* Here is the matchers vector for the main program. */
 struct matcher matchers[] = {
   { "default", Gcompile, EGexecute },
-/* temporary */
-  { "jgrep", Gcompile, EGexecute },
-  { "jegrep", Ecompile, EGexecute },
-  { "jfgrep", Fcompile, Fexecute },
-/*          */
   { "grep", Gcompile, EGexecute },
   { "egrep", Ecompile, EGexecute },
   { "posix-egrep", Ecompile, EGexecute },
@@ -65,6 +62,7 @@
 /* KWset compiled pattern.  For Ecompile and Gcompile, we compile
    a list of strings, at least one of which is known to occur in
    any string matching the regexp. */
+#include "mbc.h"
 static kwset_t kwset;
 
 /* Last compiled fixed string known to exactly match the regexp.
diff -Nur grep-2.3/src/search.c.orig grep-ja-2.3/src/search.c.orig
--- grep-2.3/src/search.c.orig	Wed Dec  2 10:08:35 1998
+++ grep-ja-2.3/src/search.c.orig	Thu Jan  1 09:00:00 1970
@@ -1,436 +0,0 @@
-/* search.c - searching subroutines using dfa, kwset and regex for grep.
-   Copyright (C) 1992, 1998 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
-
-/* Written August 1992 by Mike Haertel. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#include <sys/types.h>
-#include "system.h"
-#include "grep.h"
-#include "regex.h"
-#include "dfa.h"
-#include "kwset.h"
-
-#define NCHAR (UCHAR_MAX + 1)
-
-static void Gcompile PARAMS((char *, size_t));
-static void Ecompile PARAMS((char *, size_t));
-static char *EGexecute PARAMS((char *, size_t, char **));
-static void Fcompile PARAMS((char *, size_t));
-static char *Fexecute PARAMS((char *, size_t, char **));
-static void kwsinit PARAMS((void));
-
-/* Here is the matchers vector for the main program. */
-struct matcher matchers[] = {
-  { "default", Gcompile, EGexecute },
-  { "grep", Gcompile, EGexecute },
-  { "egrep", Ecompile, EGexecute },
-  { "posix-egrep", Ecompile, EGexecute },
-  { "awk", Ecompile, EGexecute },
-  { "fgrep", Fcompile, Fexecute },
-  { 0, 0, 0 },
-};
-
-/* For -w, we also consider _ to be word constituent.  */
-#define WCHAR(C) (ISALNUM(C) || (C) == '_')
-
-/* DFA compiled regexp. */
-static struct dfa dfa;
-
-/* Regex compiled regexp. */
-static struct re_pattern_buffer regex;
-
-/* KWset compiled pattern.  For Ecompile and Gcompile, we compile
-   a list of strings, at least one of which is known to occur in
-   any string matching the regexp. */
-static kwset_t kwset;
-
-/* Last compiled fixed string known to exactly match the regexp.
-   If kwsexec() returns < lastexact, then we don't need to
-   call the regexp matcher at all. */
-static int lastexact;
-
-void
-dfaerror(mesg)
-  const char *mesg;
-{
-  fatal(mesg, 0);
-}
-
-static void
-kwsinit()
-{
-  static char trans[NCHAR];
-  int i;
-
-  if (match_icase)
-    for (i = 0; i < NCHAR; ++i)
-      trans[i] = TOLOWER(i);
-
-  if (!(kwset = kwsalloc(match_icase ? trans : (char *) 0)))
-    fatal("memory exhausted", 0);
-}
-
-/* If the DFA turns out to have some set of fixed strings one of
-   which must occur in the match, then we build a kwset matcher
-   to find those strings, and thus quickly filter out impossible
-   matches. */
-static void
-kwsmusts()
-{
-  struct dfamust *dm;
-  char *err;
-
-  if (dfa.musts)
-    {
-      kwsinit();
-      /* First, we compile in the substrings known to be exact
-	 matches.  The kwset matcher will return the index
-	 of the matching string that it chooses. */
-      for (dm = dfa.musts; dm; dm = dm->next)
-	{
-	  if (!dm->exact)
-	    continue;
-	  ++lastexact;
-	  if ((err = kwsincr(kwset, dm->must, strlen(dm->must))) != 0)
-	    fatal(err, 0);
-	}
-      /* Now, we compile the substrings that will require
-	 the use of the regexp matcher.  */
-      for (dm = dfa.musts; dm; dm = dm->next)
-	{
-	  if (dm->exact)
-	    continue;
-	  if ((err = kwsincr(kwset, dm->must, strlen(dm->must))) != 0)
-	    fatal(err, 0);
-	}
-      if ((err = kwsprep(kwset)) != 0)
-	fatal(err, 0);
-    }
-}
-
-static void
-Gcompile(pattern, size)
-     char *pattern;
-     size_t size;
-{
-  const char *err;
-
-  re_set_syntax(RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE);
-  dfasyntax(RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE, match_icase);
-
-  if ((err = re_compile_pattern(pattern, size, &regex)) != 0)
-    fatal(err, 0);
-
-  /* In the match_words and match_lines cases, we use a different pattern
-     for the DFA matcher that will quickly throw out cases that won't work.
-     Then if DFA succeeds we do some hairy stuff using the regex matcher
-     to decide whether the match should really count. */
-  if (match_words || match_lines)
-    {
-      /* In the whole-word case, we use the pattern:
-	 (^|[^A-Za-z_])(userpattern)([^A-Za-z_]|$).
-	 In the whole-line case, we use the pattern:
-	 ^(userpattern)$.
-	 BUG: Using [A-Za-z_] is locale-dependent!  */
-
-      char *n = malloc(size + 50);
-      int i = 0;
-
-      strcpy(n, "");
-
-      if (match_lines)
-	strcpy(n, "^\\(");
-      if (match_words)
-	strcpy(n, "\\(^\\|[^0-9A-Za-z_]\\)\\(");
-
-      i = strlen(n);
-      memcpy(n + i, pattern, size);
-      i += size;
-
-      if (match_words)
-	strcpy(n + i, "\\)\\([^0-9A-Za-z_]\\|$\\)");
-      if (match_lines)
-	strcpy(n + i, "\\)$");
-
-      i += strlen(n + i);
-      dfacomp(n, i, &dfa, 1);
-    }
-  else
-    dfacomp(pattern, size, &dfa, 1);
-
-  kwsmusts();
-}
-
-static void
-Ecompile(pattern, size)
-     char *pattern;
-     size_t size;
-{
-  const char *err;
-
-  if (strcmp(matcher, "posix-egrep") == 0)
-    {
-      re_set_syntax(RE_SYNTAX_POSIX_EGREP);
-      dfasyntax(RE_SYNTAX_POSIX_EGREP, match_icase);
-    }
-  else if (strcmp(matcher, "awk") == 0)
-    {
-      re_set_syntax(RE_SYNTAX_AWK);
-      dfasyntax(RE_SYNTAX_AWK, match_icase);
-    }
-  else
-    {
-      re_set_syntax(RE_SYNTAX_EGREP);
-      dfasyntax(RE_SYNTAX_EGREP, match_icase);
-    }
-
-  if ((err = re_compile_pattern(pattern, size, &regex)) != 0)
-    fatal(err, 0);
-
-  /* In the match_words and match_lines cases, we use a different pattern
-     for the DFA matcher that will quickly throw out cases that won't work.
-     Then if DFA succeeds we do some hairy stuff using the regex matcher
-     to decide whether the match should really count. */
-  if (match_words || match_lines)
-    {
-      /* In the whole-word case, we use the pattern:
-	 (^|[^A-Za-z_])(userpattern)([^A-Za-z_]|$).
-	 In the whole-line case, we use the pattern:
-	 ^(userpattern)$.
-	 BUG: Using [A-Za-z_] is locale-dependent!  */
-
-      char *n = malloc(size + 50);
-      int i = 0;
-
-      strcpy(n, "");
-
-      if (match_lines)
-	strcpy(n, "^(");
-      if (match_words)
-	strcpy(n, "(^|[^0-9A-Za-z_])(");
-
-      i = strlen(n);
-      memcpy(n + i, pattern, size);
-      i += size;
-
-      if (match_words)
-	strcpy(n + i, ")([^0-9A-Za-z_]|$)");
-      if (match_lines)
-	strcpy(n + i, ")$");
-
-      i += strlen(n + i);
-      dfacomp(n, i, &dfa, 1);
-    }
-  else
-    dfacomp(pattern, size, &dfa, 1);
-
-  kwsmusts();
-}
-
-static char *
-EGexecute(buf, size, endp)
-     char *buf;
-     size_t size;
-     char **endp;
-{
-  register char *buflim, *beg, *end, save;
-  int backref, start, len;
-  struct kwsmatch kwsm;
-  static struct re_registers regs; /* This is static on account of a BRAIN-DEAD
-				    Q@#%!# library interface in regex.c.  */
-
-  buflim = buf + size;
-
-  for (beg = end = buf; end < buflim; beg = end + 1)
-    {
-      if (kwset)
-	{
-	  /* Find a possible match using the KWset matcher. */
-	  beg = kwsexec(kwset, beg, buflim - beg, &kwsm);
-	  if (!beg)
-	    goto failure;
-	  /* Narrow down to the line containing the candidate, and
-	     run it through DFA. */
-	  end = memchr(beg, '\n', buflim - beg);
-	  if (!end)
-	    end = buflim;
-	  while (beg > buf && beg[-1] != '\n')
-	    --beg;
-	  save = *end;
-	  if (kwsm.index < lastexact)
-	    goto success;
-	  if (!dfaexec(&dfa, beg, end, 0, (int *) 0, &backref))
-	    {
-	      *end = save;
-	      continue;
-	    }
-	  *end = save;
-	  /* Successful, no backreferences encountered. */
-	  if (!backref)
-	    goto success;
-	}
-      else
-	{
-	  /* No good fixed strings; start with DFA. */
-	  save = *buflim;
-	  beg = dfaexec(&dfa, beg, buflim, 0, (int *) 0, &backref);
-	  *buflim = save;
-	  if (!beg)
-	    goto failure;
-	  /* Narrow down to the line we've found. */
-	  end = memchr(beg, '\n', buflim - beg);
-	  if (!end)
-	    end = buflim;
-	  while (beg > buf && beg[-1] != '\n')
-	    --beg;
-	  /* Successful, no backreferences encountered! */
-	  if (!backref)
-	    goto success;
-	}
-      /* If we've made it to this point, this means DFA has seen
-	 a probable match, and we need to run it through Regex. */
-      regex.not_eol = 0;
-      if ((start = re_search(&regex, beg, end - beg, 0, end - beg, &regs)) >= 0)
-	{
-	  len = regs.end[0] - start;
-	  if ((!match_lines && !match_words)
-	      || (match_lines && len == end - beg))
-	    goto success;
-	  /* If -w, check if the match aligns with word boundaries.
-	     We do this iteratively because:
-	     (a) the line may contain more than one occurence of the pattern, and
-	     (b) Several alternatives in the pattern might be valid at a given
-	     point, and we may need to consider a shorter one to find a word
-	     boundary. */
-	  if (match_words)
-	    while (start >= 0)
-	      {
-		if ((start == 0 || !WCHAR ((unsigned char) beg[start - 1]))
-		    && (len == end - beg
-			|| !WCHAR ((unsigned char) beg[start + len])))
-		  goto success;
-		if (len > 0)
-		  {
-		    /* Try a shorter length anchored at the same place. */
-		    --len;
-		    regex.not_eol = 1;
-		    len = re_match(&regex, beg, start + len, start, &regs);
-		  }
-		if (len <= 0)
-		  {
-		    /* Try looking further on. */
-		    if (start == end - beg)
-		      break;
-		    ++start;
-		    regex.not_eol = 0;
-		    start = re_search(&regex, beg, end - beg,
-				      start, end - beg - start, &regs);
-		    len = regs.end[0] - start;
-		  }
-	      }
-	}
-    }
-
- failure:
-  return 0;
-
- success:
-  *endp = end < buflim ? end + 1 : end;
-  return beg;
-}
-
-static void
-Fcompile(pattern, size)
-     char *pattern;
-     size_t size;
-{
-  char *beg, *lim, *err;
-
-  kwsinit();
-  beg = pattern;
-  do
-    {
-      for (lim = beg; lim < pattern + size && *lim != '\n'; ++lim)
-	;
-      if ((err = kwsincr(kwset, beg, lim - beg)) != 0)
-	fatal(err, 0);
-      if (lim < pattern + size)
-	++lim;
-      beg = lim;
-    }
-  while (beg < pattern + size);
-
-  if ((err = kwsprep(kwset)) != 0)
-    fatal(err, 0);
-}
-
-static char *
-Fexecute(buf, size, endp)
-     char *buf;
-     size_t size;
-     char **endp;
-{
-  register char *beg, *try, *end;
-  register size_t len;
-  struct kwsmatch kwsmatch;
-
-  for (beg = buf; beg <= buf + size; ++beg)
-    {
-      if (!(beg = kwsexec(kwset, beg, buf + size - beg, &kwsmatch)))
-	return 0;
-      len = kwsmatch.size[0];
-      if (match_lines)
-	{
-	  if (beg > buf && beg[-1] != '\n')
-	    continue;
-	  if (beg + len < buf + size && beg[len] != '\n')
-	    continue;
-	  goto success;
-	}
-      else if (match_words)
-	for (try = beg; len && try;)
-	  {
-	    if (try > buf && WCHAR((unsigned char) try[-1]))
-	      break;
-	    if (try + len < buf + size && WCHAR((unsigned char) try[len]))
-	      {
-		try = kwsexec(kwset, beg, --len, &kwsmatch);
-		len = kwsmatch.size[0];
-	      }
-	    else
-	      goto success;
-	  }
-      else
-	goto success;
-    }
-
-  return 0;
-
- success:
-  if ((end = memchr(beg + len, '\n', (buf + size) - (beg + len))) != 0)
-    ++end;
-  else
-    end = buf + size;
-  *endp = end;
-  while (beg > buf && beg[-1] != '\n')
-    --beg;
-  return beg;
-}
diff -Nur grep-2.3/src/search.c.rej grep-ja-2.3/src/search.c.rej
--- grep-2.3/src/search.c.rej	Mon Dec 20 23:07:51 1999
+++ grep-ja-2.3/src/search.c.rej	Thu Jan  1 09:00:00 1970
@@ -1,33 +0,0 @@
-***************
-*** 16,21 ****
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-     Written August 1992 by Mike Haertel. */
-  
-  #include <ctype.h>
-  
---- 16,23 ----
-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  
-     Written August 1992 by Mike Haertel. */
-+ /* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
-+    Last change: Jul. 9, 1993 by t^2  */
-  
-  #include <ctype.h>
-  
-***************
-*** 60,65 ****
-  #include "dfa.h"
-  #include "kwset.h"
-  #include "regex.h"
-  
-  #define NCHAR (UCHAR_MAX + 1)
-  
---- 62,68 ----
-  #include "dfa.h"
-  #include "kwset.h"
-  #include "regex.h"
-+ #include "mbc.h"
-  
-  #define NCHAR (UCHAR_MAX + 1)
-  
diff -Nur grep-2.3/tests/Makefile.in grep-ja-2.3/tests/Makefile.in
--- grep-2.3/tests/Makefile.in	Mon Feb 15 09:47:35 1999
+++ grep-ja-2.3/tests/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -108,9 +108,9 @@
 all: all-redirect
 .SUFFIXES:
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps tests/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile
 
-Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
 	cd $(top_builddir) \
 	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
@@ -123,10 +123,15 @@
 subdir = tests
 
 distdir: $(DISTFILES)
+	here=`cd $(top_builddir) && pwd`; \
+	top_distdir=`cd $(top_distdir) && pwd`; \
+	distdir=`cd $(distdir) && pwd`; \
+	cd $(top_srcdir) \
+	  && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tests/Makefile
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff -Nur grep-2.3/tests/batgen.awk grep-ja-2.3/tests/batgen.awk
--- grep-2.3/tests/batgen.awk	Mon Dec 20 23:07:51 1999
+++ grep-ja-2.3/tests/batgen.awk	Thu Jan  1 09:00:00 1970
@@ -1,10 +0,0 @@
-BEGIN { print "@echo off"; }
-$0 !~ /^#/ && NF == 3 {
-	printf "echo #%d --\n", ++n
-	print "set R=0";
-	print "echo " $3 ">tmp.in";
-	print "grep -E -e \"" $2 "\" tmp.in >nul";
-	print "if errorlevel 1 set R=1";
-	print "if errorlevel 2 set R=2";
-	printf "if not %R% == " $1 " echo Spencer test #%d failed\n", n
-}
diff -Nur grep-2.3/tests/check.bat grep-ja-2.3/tests/check.bat
--- grep-2.3/tests/check.bat	Mon Dec 20 23:07:51 1999
+++ grep-ja-2.3/tests/check.bat	Thu Jan  1 09:00:00 1970
@@ -1,14 +0,0 @@
-@echo off
-rem
-rem Regression test for GNU e?grep.
-rem
-
-rem The Khadafy test is brought to you by Scott Anderson . . .
-grep -E -f tests/khadafy.reg tests/khadafy.lin > khadafy.out
-fc tests\khadafy.lin khadafy.out
-
-rem . . . and the following by Henry Spencer.
-
-gawk -F: -f tests/batgen.awk tests/spencer.dos > tmp.bat
-
-tmp
diff -Nur grep-2.3/tests/spencer.dos grep-ja-2.3/tests/spencer.dos
--- grep-2.3/tests/spencer.dos	Mon Dec 20 23:07:51 1999
+++ grep-ja-2.3/tests/spencer.dos	Thu Jan  1 09:00:00 1970
@@ -1,122 +0,0 @@
-0:abc:abc
-1:abc:xbc
-1:abc:axc
-1:abc:abx
-0:abc:xabcy
-0:abc:ababc
-0:ab*c:abc
-0:ab*bc:abc
-0:ab*bc:abbc
-0:ab*bc:abbbbc
-0:ab+bc:abbc
-1:ab+bc:abc
-1:ab+bc:abq
-0:ab+bc:abbbbc
-0:ab?bc:abbc
-0:ab?bc:abc
-1:ab?bc:abbbbc
-0:ab?c:abc
-0:^abc$:abc
-1:^abc$:abcc
-0:^abc:abcc
-1:^abc$:aabc
-0:abc$:aabc
-0:^:abc
-0:$:abc
-0:a.c:abc
-0:a.c:axc
-0:a.*c:axyzc
-1:a.*c:axyzd
-1:a[bc]d:abc
-0:a[bc]d:abd
-1:a[b-d]e:abd
-0:a[b-d]e:ace
-0:a[b-d]:aac
-0:a[-b]:a-
-0:a[b-]:a-
-1:a[b-a]:-
-2:a[]b:-
-2:a[:-
-0:a]:a]
-0:a[]]b:a]b
-0:a[^bc]d:aed
-1:a[^bc]d:abd
-0:a[^-b]c:adc
-1:a[^-b]c:a-c
-1:a[^]b]c:a]c
-0:a[^]b]c:adc
-0:ab|cd:abc
-0:ab|cd:abcd
-0:()ef:def
-0:()*:-
-1:*a:-
-0:^*:-
-0:$*:-
-1:(*)b:-
-1:$b:b
-2:a\\:-
-0:a\(b:a(b
-0:a\(*b:ab
-0:a\(*b:a((b
-1:a\x:a\x
-2:abc):-
-2:(abc:-
-0:((a)):abc
-0:(a)b(c):abc
-0:a+b+c:aabbabc
-0:a**:-
-0:a*?:-
-0:(a*)*:-
-0:(a*)+:-
-0:(a|)*:-
-0:(a*|b)*:-
-0:(a+|b)*:ab
-0:(a+|b)+:ab
-0:(a+|b)?:ab
-0:[^ab]*:cde
-0:(^)*:-
-0:(ab|)*:-
-2:)(:-
-1:abc:
-1:abc:
-0:a*:
-0:([abc])*d:abbbcd
-0:([abc])*bcd:abcd
-0:a|b|c|d|e:e
-0:(a|b|c|d|e)f:ef
-0:((a*|b))*:-
-0:abcd*efg:abcdefg
-0:ab*:xabyabbbz
-0:ab*:xayabbbz
-0:(ab|cd)e:abcde
-0:[abhgefdc]ij:hij
-1:^(ab|cd)e:abcde
-0:(abc|)ef:abcdef
-0:(a|b)c*d:abcd
-0:(ab|ab*)bc:abc
-0:a([bc]*)c*:abc
-0:a([bc]*)(c*d):abcd
-0:a([bc]+)(c*d):abcd
-0:a([bc]*)(c+d):abcd
-0:a[bcd]*dcdcde:adcdcde
-1:a[bcd]+dcdcde:adcdcde
-0:(ab|a)b*c:abc
-0:((a)(b)c)(d):abcd
-0:[A-Za-z_][A-Za-z0-9_]*:alpha
-0:^a(bc+|b[eh])g|.h$:abh
-0:(bc+d$|ef*g.|h?i(j|k)):effgz
-0:(bc+d$|ef*g.|h?i(j|k)):ij
-1:(bc+d$|ef*g.|h?i(j|k)):effg
-1:(bc+d$|ef*g.|h?i(j|k)):bcdd
-0:(bc+d$|ef*g.|h?i(j|k)):reffgz
-1:((((((((((a)))))))))):-
-0:(((((((((a))))))))):a
-1:multiple words of text:uh-uh
-0:multiple words:multiple words, yeah
-0:(.*)c(.*):abcde
-1:\((.*),:(.*)\)
-1:[k]:ab
-0:abcd:abcd
-0:a(bc)d:abcd
-0:a[-]?c:ac
-0:(....).*\1:beriberi
diff -Nur grep-2.3/vms/Makefile.in grep-ja-2.3/vms/Makefile.in
--- grep-2.3/vms/Makefile.in	Mon Feb 15 09:43:50 1999
+++ grep-ja-2.3/vms/Makefile.in	Tue Dec 21 00:24:22 1999
@@ -122,7 +122,7 @@
 	@for file in $(DISTFILES); do \
 	  d=$(srcdir); \
 	  if test -d $$d/$$file; then \
-	    cp -pr $$/$$file $(distdir)/$$file; \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
 	  else \
 	    test -f $(distdir)/$$file \
 	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
