Merge from vendor branch TNF:
[pkgsrcv2.git] / japanese / grep / patches / patch-aa
1 $NetBSD$
2
3 \e$B!|!|!|!|!|\e(B GNU grep version 2.0 + multi-byte extension 1.04 \e$B!|!|!|!|!|\e(B
4 \e$B!|!|!|!|!|\e(B                              Jun. 2, 1994 by t^2 \e$B!|!|!|!|!|\e(B
5
6   \e$B$3$N%U%!%$%k$O\e(B GNU grep version 2.0 (grep-2.0) \e$B$N%=!<%9%3!<%I$+$i\e(B, \e$B$=\e(B
7   \e$B$N%^%k%A%P%$%HJ8;zBP1~HG\e(B grep-2.0+mb1.04 \e$B$N%=!<%9%3!<%I$r@8@.$9$k$?$a\e(B
8   \e$B$N:9J,$r4^$s$G$$$^$9\e(B. grep-2.0 \e$B$N%=!<%9$rE83+$7$F$"$k%G%#%l%/%H%j$G\e(B
9
10       % patch -p1 < \e$B$3$N%U%!%$%k\e(B
11
12   \e$B$J$I$H$7$F%Q%C%A$rEv$F$F$/$@$5$$\e(B. \e$B$=$N8e\e(B README.MB \e$B$rFI$s$G$/$@$5$$\e(B.
13
14 \e$B")\e(B810  \e$BJ!2,;TCf1{6hG_8w1`CDCO\e(B 7-207
15 TEL/FAX: 092-731-4025 (TEL/FAX \e$B<+F0@ZBX$(\e(B)
16          092-724-6342 (TEL \e$B$N$_\e(B)
17 E-mail: NBC02362@niftyserve.or.jp                       t^2 (\e$BC+K\9'9@\e(B)
18 \f
19 diff -ru2N grep-2.0/ChangeLog.MB grep+mb1.04/ChangeLog.MB
20 --- grep-2.0/ChangeLog.MB       Thu Jan  1 09:00:00 1970
21 +++ grep+mb1.04/ChangeLog.MB    Thu Jun  2 17:01:42 1994
22 @@ -0,0 +1,219 @@
23 +Thu Jun  2 16:58:03 1994  Takahiro Tanimoto  (tt@isaac)
24 +
25 +       * Version 2.0 + multi-byte extension 1.04 released.
26 +
27 +Sat Mar  5 16:30:16 1994  Takahiro Tanimoto  (tt@isaac)
28 +
29 +       * README.MSC: PC-9800 \e$B%7%j!<%:MQ\e(B MS-C 6.00A \e$B$N\e(B, \e$B%o%$%k%I%+!<%IE8\e(B
30 +       \e$B3+%k!<%A%s$N%P%0$KBP=h$7$?\e(B.  \e$B0JA0$N\e(B stdargv.diff \e$B$r$3$l$KE}9g$7\e(B, 
31 +       \e$B:o=|$7$?\e(B.  (Thanks to \e$BJ!9@K.$5$s\e(B <GFE00522@niftyserve.or.jp>)
32 +
33 +Thu Aug 19 04:26:09 1993  Takahiro Tanimoto  (tt@isaac)
34 +
35 +       * regex.c (re_compile_fastmap): charset_not \e$B$N\e(B fastmap \e$B$N:n@.=h\e(B
36 +       \e$BM}$,4V0c$C$F$$$F\e(B, regex \e$B$N\e(B fastmap \e$B$r;HMQ$9$k>l9g\e(B (e?grep \e$B$G$O\e(B 
37 +       fastmap \e$B$r;HMQ$7$F$$$J$$$?$a\e(B, \e$B$3$NLdBj$OI=LL$K$O8=$l$J$$\e(B), \e$B@55,\e(B
38 +       \e$BI=8=$N@hF,$N\e(B [^\e$B#A\e(B] \e$B$d\e(B [^a] \e$B$KNc$($P\e(B \e$B#B\e(B \e$B$,%^%C%A$7$J$+$C$?\e(B.
39 +       (Thanks to \e$B>.20NIM4$5$s\e(B <JAE03716@niftyserve.or.jp>)
40 +
41 +Tue Aug 10 01:29:05 1993  Takahiro Tanimoto  (tt@isaac)
42 +
43 +       * regex.c (set_list_bits): \e$BJ8;z%/%i%9Cf$N%^%k%A%P%$%HJ8;z$N:GE,\e(B
44 +       \e$B2=$G\e(B, \e$B6h4V=*E@$N99?7=hM}ItJ,$K%P%0$,$"$j\e(B, [\e$B#A\e(B-\e$B#C#E\e(B-\e$B#G#B\e(B-\e$B#D\e(B] \e$B$r:G\e(B
45 +       \e$BE,2=$9$k$H\e(B [\e$B#A\e(B-\e$B#G\e(B] \e$B$@$,\e(B, \e$B$3$l$,\e(B [\e$B#A\e(B-\e$B#E\e(B] \e$B$H$J$C$F$7$^$C$F$$$?\e(B. 
46 +       \e$B$?$@$7\e(B, regex \e$B$G$O$J$/\e(B dfa \e$B$,;HMQ$5$l$k>l9g$K$O$3$N%P%0$OI=LL$K\e(B
47 +       \e$B$O8=$l$J$$\e(B.
48 +
49 +Fri Jul 23 03:22:13 1993  Takahiro Tanimoto  (tt@isaac)
50 +
51 +       * Version 2.0 + multi-byte extension 1.03 released.
52 +
53 +       * DEFS.dos: strcmpi \e$B$r\e(B stricmp \e$B$KJQ99\e(B.
54 +
55 +       * grep.c (main): MS-DOS \e$B$N>l9g\e(B, argv[0] \e$B$r2C9)$7$?J8;zNs$X$N%]%$\e(B
56 +       \e$B%s%?$r\e(B argv[0] \e$B$X$b%;%C%H$9$k\e(B.  getopt \e$B$,=PNO$9$k%a%C%;!<%8$b2C\e(B
57 +       \e$B9)$5$l$?J8;zNs$H$J$k\e(B.
58 +
59 +       * grep.c (main): MS-C 6.00A \e$B$N\e(B stdargv.asm \e$B$N%P%0$r%U%#%C%/%9$7\e(B
60 +       \e$B$?$?$a\e(B, argv[0] == "" \e$B$N$H$-$N=hM}$r:o=|$7$?\e(B.
61 +
62 +       * stdargv.diff: \e$BDI2C\e(B.
63 +
64 +Tue Jul 13 07:04:13 1993  Takahiro Tanimoto  (tt@isaac)
65 +
66 +       * Version 2.0 + multi-byte extension 1.02 released.
67 +
68 +Mon Jul 12 00:20:36 1993  Takahiro Tanimoto  (tt@isaac)
69 +
70 +       * grep.c: HAVE_STRCASECMP \e$B$,\e(B #define \e$B$5$l$F$$$J$$$H$-\e(B, \e$B0lJ}$NJ8\e(B
71 +       \e$B;zNs$@$1$r>.J8;z$K$7$F$+$iHf3S$9$k4X?t$rDj5A$7$F$$$?$,\e(B, \e$B;H$$J}$,\e(B
72 +       \e$B0-$+$C$?\e(B.  \e$B$=$l$r\e(B strcasecmp() \e$B$HF1$8$b$N$KJQ99$7$?\e(B.
73 +
74 +       * DEFS.dos: HAVE_STRCMPI \e$B$r\e(B #define \e$B$9$kBe$o$j$K\e(B,
75 +       HAVE_STRCASECMP \e$B$r\e(B #define \e$B$7\e(B, strcasecmp \e$B$r\e(B strcmpi \e$B$K\e(B #define 
76 +       \e$B$7$?\e(B.
77 +
78 +Sat Jul 10 01:05:04 1993  Takahiro Tanimoto  (tt@isaac)
79 +
80 +       * Version 2.0 + multi-byte extension 1.01 released.
81 +
82 +       * grep.c (main): MSDOS \e$B$N>l9g\e(B, argv[0] \e$B$r>.J8;z$K$7$F\e(B prog \e$B$K%;%C\e(B
83 +       \e$B%H$9$k\e(B.  \e$B$^$?\e(B, \e$B3HD%;R$O<h$j=|$/\e(B.
84 +
85 +       * obstack.h: chunk_size \e$B$N7?$r\e(B size_t \e$B$+$i\e(B unsigned \e$B$KJQ99\e(B.
86 +       old-C \e$B$N>l9g\e(B, size_t \e$B$,Dj5A$5$l$F$$$J$$>uBV$H$J$C$?$?$a\e(B.
87 +
88 +       * regex.h: \e$BDj?t$N8e$K\e(B U, UL \e$B$r$D$1$k$H\e(B old-C \e$B$G%3%s%Q%$%k$G$-$J\e(B
89 +       \e$B$$\e(B.  \e$B$3$l$i$r%-%c%9%H$KJQ99$7$?\e(B.
90 +
91 +       * regex.h: RE_DUP_MAX \e$B$NDj5A$r\e(B 16 \e$B%S%C%H\e(B int \e$B$N%^%7%s$G$b%*!<%P\e(B
92 +       \e$B%U%m!<$7$J$$=q$-J}$K=$@5\e(B.
93 +
94 +       * obstack.h: struct obstack \e$B$N%a%s%P\e(B chunk_size \e$B$N7?$r\e(B size_t \e$B$H\e(B
95 +       \e$B$7$?\e(B.  PTR_INT_TYPE \e$B$r30It$+$i\e(B #define \e$B$G$-$k$h$&$K$7$?\e(B.  MSDOS 
96 +       \e$B$G\e(B SMALL MODEL \e$B0J30$N>l9g\e(B, __PTR_TO_INT, __INT_TO_PTR \e$B$H$H$b$K\e(B,
97 +       \e$B%]%$%s%?$H\e(B long \e$B$rJQ49$9$k$h$&$K$7$?\e(B.
98 +
99 +       * grep.c (fillbuf, grep): read() \e$B$NJV$jCM$N@5Ii$K$h$k%(%i!<%A%'%C\e(B
100 +       \e$B%/$r\e(B, -1 \e$B$KEy$7$$$+$I$&$+$G9T$&$h$&$KJQ99\e(B.
101 +
102 +       * grep.c: totalcc, totalnl \e$B$r\e(B unsigned long \e$B$KJQ99$7\e(B, prline() 
103 +       \e$BCf$N\e(B printf() \e$B$N=q<0$r9g$o$;$?\e(B.
104 +
105 +       * DEFS.dos: BUFSALLOC \e$B$r\e(B 4096 \e$B$K\e(B #define.  (See reset() in
106 +       grep.c.)
107 +
108 +       * getpagesize.h: MSDOS \e$B$N>l9g\e(B, \e$B%Z!<%8%5%$%:$O\e(B 4096 \e$B$H$7$?\e(B.
109 +
110 +       * dfa.c: STDC_HEADERS \e$B$^$?$O\e(B HAVE_STRING_H \e$B$N$H$-\e(B, bcopy, bzero 
111 +       \e$B$r%^%/%mE83+$9$k\e(B.
112 +
113 +Fri Jul  9 13:16:50 1993  Takahiro Tanimoto  (tt@isaac)
114 +
115 +       * mbc.c, mbc.h, ...: ismbchar() \e$B$r%b%8%e!<%kKh$KFHN)$7$FDj5A$9$k\e(B
116 +       \e$B$N$r$d$a\e(B, \e$B%b%8%e!<%k$rDI2C$7$?\e(B.
117 +
118 +       * search.c (Fexecute): fgrep \e$B$r%^%k%A%P%$%HJ8;z$KBP1~$5$;$?\e(B.
119 +
120 +Wed Jul  7 17:02:33 1993  Takahiro Tanimoto  (tt@isaac)
121 +
122 +       * kwset.c (bmexec): 8 \e$B%S%C%H%/%j!<%s$G$J$$$H$3$m$r=$@5\e(B.
123 +
124 +       * \e$B%Y!<%9$r\e(B grep-2.0 \e$B$XJQ99\e(B.
125 +
126 +Sun Jul  4 08:48:12 1993  Takahiro Tanimoto  (tt@isaac)
127 +
128 +       * regex.c (re_match_2): \e$B%*%j%8%J%k$N%P%0\e(B.  maybe_finalize_jump 
129 +       \e$B$N=hM}Cf\e(B, start_memory/stop_memory \e$B$r%9%-%C%W$9$k$H$3$m$G\e(B, \e$B0z?t\e(B
130 +       \e$B$N%9%-%C%W$r$7$F$$$J$$%P%0$r=$@5\e(B.  \e$BNc$($P\e(B "([a-n]+).*\1" \e$B$,@5$7\e(B
131 +       \e$B$/\e(B "abcxyzab" \e$B$K%^%C%A$9$k$h$&$K$J$C$?\e(B.
132 +
133 +Sat Jul  3 06:51:33 1993  Takahiro Tanimoto  (tt@isaac)
134 +
135 +       * Version 1.6 + multi-byte extension 1.00 released.
136 +
137 +Sat Jul  3 04:29:14 1993  Takahiro Tanimoto  (tt at pc98)
138 +
139 +       * grep.c (bufprev): -b \e$B%*%W%7%g%s$GI=<($9$k%P%$%H%*%U%;%C%H$r\e(B 
140 +       long \e$B$K$9$k$?$a$K\e(B bufprev \e$B$r\e(B long \e$B$H$7$?\e(B.  bufprev \e$B0J30$OJQ99$7\e(B
141 +       \e$B$F$$$J$$$?$a\e(B, 1 \e$B9T$N%5%$%:$,\e(B int \e$B$NHO0O$r1[$($k$H@5$7$/=hM}$5$l\e(B
142 +       \e$B$J$$\e(B.  \e$B$^$?\e(B, DOS \e$B$G$O\e(B CR+LF \e$B$r\e(B 1 \e$B%P%$%H$H$7$F%+%&%s%H$7$F$7$^$&\e(B.
143 +       (\e$B<jH4$-\e(B)
144 +
145 +       * regex.c (re_match_2): \e$BJ8;z%/%i%9$N=hM}Cf$N\e(B 16 \e$B%S%C%H\e(B int \e$B$G@5\e(B
146 +       \e$B>oF0:n$7$J$$ItJ,$r=$@5\e(B.
147 +
148 +       * regex.c (re_exec): re_search() \e$B$X$N:G8e$N0z?t$r\e(B 0 \e$B$+$i\e(B NULL \e$B$X\e(B
149 +       \e$B=$@5\e(B.
150 +
151 +       * regex.c (re_match): re_match_2() \e$B$X$N#2HVL\$N0z?t$r\e(B 0 \e$B$+$i\e(B 
152 +       NULL \e$B$X=$@5\e(B.
153 +
154 +       * regex.c (re_search): re_search_2() \e$B$X$N#2HVL\$N0z?t$r\e(B 0 \e$B$+$i\e(B 
155 +       NULL \e$B$X=$@5\e(B.
156 +
157 +       * grep.c (main): MS-C \e$B$N\e(B setargv \e$B$N%P%0$N$;$$$G\e(B, grep "\\" foo 
158 +       \e$B$H$9$k$H\e(B argv[0] == "" \e$B$H$J$C$F$7$^$&\e(B.  argv[0] == "" \e$B$N$H$-$O6/\e(B
159 +       \e$B@)E*$K\e(B "grep" \e$B$^$?$O\e(B "egrep" \e$B$r%;%C%H$9$k$h$&$K$7$?\e(B.
160 +
161 +Fri Jul  2 19:25:58 1993  Takahiro Tanimoto  (tt at pc98)
162 +
163 +       * grep.c (main): \e$BJQ?t\e(B prog \e$B$N@_Dj$r\e(B DOS \e$BMQ$K=$@5$7$?\e(B.  \e$B$=$N:]\e(B, 
164 +       \e$B%*%j%8%J%k$N$d$jJ}$O$^$:$+$C$?$N$G=$@5$7$?\e(B.
165 +
166 +       * grep.c: MSDOS \e$B$N$H$-\e(B errno \e$B$H\e(B sys_errlist \e$B$N@k8@$r$7$J$$$h$&$K\e(B
167 +       \e$B=$@5$7$?\e(B.
168 +
169 +       * regex.c (set_list_bits): \e$B;HMQ$7$F$$$J$+$C$?JQ?t$r:o=|\e(B.
170 +
171 +       * Makefile.msc: DOS \e$B%5%]!<%H$N$?$aDI2C\e(B.
172 +
173 +Fri Jun 11 04:14:22 1993  Takahiro Tanimoto  (tt@isaac)
174 +
175 +       * grep.c: version \e$BJ8;zNs$,8E$$$^$^$@$C$?\e(B.
176 +
177 +Tue May 25 00:10:49 1993  Takahiro Tanimoto  (tt@isaac)
178 +
179 +       * Version 1.6 + multi-byte extension 0.02 released.
180 +
181 +Mon May 24 15:57:31 1993  Takahiro Tanimoto  (tt@isaac)
182 +
183 +       * regex.c (re_search_2): \e$B8eJ}$X\e(B advance \e$B$9$k:]$N%P%0$r=$@5\e(B.
184 +
185 +Sat May 22 02:03:41 1993  Takahiro Tanimoto  (tt@isaac)
186 +
187 +       * regex.c (re_compile_fastmap): exactn \e$B$G\e(B translate \e$B$9$k$N$r$d$a\e(B
188 +       \e$B$?\e(B.  re_compile_pattern \e$B$G0lEY\e(B translate \e$B$5$l$F$$$k$O$:\e(B.
189 +
190 +       * regex.c (re_match_2): exactn \e$B$N=hM}ItJ,$G\e(B, #if 0 \e$B$r\e(B #if 1 \e$B$K$7\e(B
191 +       \e$B$?>l9g\e(B, \e$B@5$7$$=hM}$r9T$C$F$$$J$+$C$?$N$r=$@5\e(B.
192 +
193 +Fri May 21 20:04:07 1993  Takahiro Tanimoto  (tt@isaac)
194 +
195 +       * regex.[ch]: mbcharset, mbcharset_not \e$B$rGQ;_\e(B.  \e$BBe$o$j$K\e(B 
196 +       charset, charset_not \e$B$,%^%k%A%P%$%HJ8;z$r$bJ];}$9$k\e(B.
197 +
198 +       * grep.c (main): \e$B2<5-$NJQ99$KH<$C$F\e(B, "^.*(" ... ")" \e$B$rIU2C$9$k=h\e(B
199 +       \e$BM}$r:o=|$7$?\e(B.
200 +
201 +       * dfa.c (regcompile): searchflag \e$B$,\e(B ON \e$B$N$H$-\e(B, \e$B@55,I=8=$r\e(B "^.*("
202 +       ... ")" \e$B$H$7$F%3%s%Q%$%k$9$k$h$&$K$7$?\e(B.  \e$B0JA0$O\e(B grep.c \e$B$NCf$GF1\e(B
203 +       \e$B$8$3$H$r9T$C$F$$$?\e(B.
204 +
205 +       * dfa.c (lex): \e$BJ8;z%/%i%9$G%^%k%A%P%$%HJ8;z$N#1J8;zL\$N=89g$+$i\e(B,
206 +       \e$B%7%s%0%k%P%$%HJ8;z$r=|30$9$k=hM}$rDI2C$7$?\e(B.
207 +
208 +       * dfa.c (lex): \e$BJ8;z%/%i%9$G%7%s%0%k%P%$%HJ8;z$N>e8B$,4V0c$C$F$$\e(B
209 +       \e$B$?$N$r=$@5$7$?\e(B.
210 +
211 +Wed May 19 01:27:07 1993  Takahiro Tanimoto  (tt@isaac)
212 +
213 +       * regex.c: !__STDC__ \e$B$N$H$-$K\e(B const \e$B$r\e(B #define.
214 +
215 +       * dfa.h: \e$B%*%j%8%J%k$G$O\e(B !STDC_HEADERS \e$B$N$H$-$K\e(B const \e$B$r\e(B #define 
216 +       \e$B$7$F$$$?$,\e(B, \e$B$3$l$r\e(B !__STDC__ \e$B$N$H$-$K\e(B #define \e$B$9$k$h$&$KJQ99$7$?\e(B.
217 +
218 +       * configure.in: bcopy(), memmove() \e$B$N%A%'%C%/$rDI2C\e(B.
219 +
220 +       * dfa.c (reginit): cs_tok[] \e$B$N=i4|2=$rDI2C$7$?\e(B.  -i \e$B%U%i%0$rIU$1\e(B
221 +       \e$B$?>l9g$NIT6q9g$r=$@5\e(B.
222 +
223 +Tue May 18 18:14:04 1993  Takahiro Tanimoto  (tt@albert)
224 +
225 +       * dfa.h: regex.h \e$B$G$N\e(B RE_MBCTYPE_??? \e$B$NCM$H0lCW$5$;$?\e(B.
226 +
227 +       * regex.[ch] (RE_TRANSLATED_RANGE): mbsed-0.01 \e$B$G9T$C$?3HD%$rM"\e(B
228 +       \e$BF~$7$?\e(B.
229 +
230 +Sat May 15 04:27:32 1993  Takahiro Tanimoto  (tt@isaac)
231 +
232 +       * \e$B%^%k%A%P%$%HJ8;zBP1~HG$,0lDL$j40@.$7$?\e(B.
233 +
234 +\f
235 +Local Variables:
236 +mode: indented-text
237 +left-margin: 8
238 +fill-column: 72
239 +fill-prefix: " "
240 +version-control: never
241 +End:
242 diff -ru2N grep-2.0/DEFS.dos grep+mb1.04/DEFS.dos
243 --- grep-2.0/DEFS.dos   Thu Jan  1 09:00:00 1970
244 +++ grep+mb1.04/DEFS.dos        Fri Jul 23 03:23:31 1993
245 @@ -0,0 +1,15 @@
246 +#define STDC_HEADERS 1
247 +#define HAVE_STRING_H 1
248 +#define HAVE_MEMCHR 1
249 +#define HAVE_STRERROR 1
250 +#define HAVE_MEMMOVE 1
251 +#define HAVE_STRCASECMP 1
252 +#define strcasecmp stricmp
253 +
254 +#define BUFSALLOC 4096
255 +
256 +#ifndef M_I86SM
257 +#define __PTR_TO_INT(P) ((long)(P))
258 +#define __INT_TO_PTR(P) ((char *)(P))
259 +#define PTR_INT_TYPE long
260 +#endif
261 diff -ru2N grep-2.0/MANIFEST.MB grep+mb1.04/MANIFEST.MB
262 --- grep-2.0/MANIFEST.MB        Thu Jan  1 09:00:00 1970
263 +++ grep+mb1.04/MANIFEST.MB     Sat Mar  5 16:37:46 1994
264 @@ -0,0 +1,11 @@
265 +ChangeLog.MB           Revision history of multi-byte extension to grep.
266 +DEFS.dos               Definitions for DOS.
267 +MANIFEST.MB            This file.
268 +Makefile.msc           Makefile for MS-C version 6.
269 +README.MB              Documentation for multi-byte extension.
270 +README.MSC             Patch for source/startup/... of MS-C 6.00A
271 +mbc.c                  Multi-byte char handler.
272 +mbc.h                  Interface to mbc.c.
273 +tests/batgen.awk       DOS version of scriptgen.awk.
274 +tests/check.bat                DOS version of check.sh
275 +tests/spencer.dos      Input for batgen.
276 diff -ru2N grep-2.0/Makefile.in grep+mb1.04/Makefile.in
277 --- grep-2.0/Makefile.in        Mon May  3 05:54:24 1993
278 +++ grep+mb1.04/Makefile.in     Mon Jul 12 02:02:28 1993
279 @@ -16,4 +16,7 @@
280  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
281  
282 +# Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
283 +# Last change: Jul. 12, 1993 by t^2
284 +
285  SHELL = /bin/sh
286  
287 @@ -40,4 +43,11 @@
288  DEFS=-DGREP @DEFS@
289  
290 +# Things you might set to MBCTYPE_DEF to spec. default multi-byte char type.
291 +# -DEUC                        will make default multi-byte char type EUC and
292 +# -DSJIS               SJIS.
293 +#                      If you do not set EUC/SJIS, grep assumes no multi-byte
294 +#                      char as default.
295 +MBCTYPE_DEF=-DEUC
296 +
297  # Extra libraries.
298  LIBS=@LIBS@
299 @@ -69,9 +79,9 @@
300  #### End of system configuration section. ####
301  
302 -SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c
303 -OBJS=grep.o getopt.o regex.o dfa.o kwset.o obstack.o search.o
304 +SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c mbc.c
305 +OBJS=grep.o getopt.o regex.o dfa.o kwset.o obstack.o search.o mbc.o
306  
307  .c.o:
308 -       $(CC) $(CFLAGS) $(DEFS) -I$(srcdir) -c $<
309 +       $(CC) $(CFLAGS) $(DEFS) $(MBCTYPE_DEF) -I$(srcdir) -c $<
310  
311  all: grep check.done
312 @@ -120,7 +130,9 @@
313  dist:
314         V=`sed -n '/version\\[/s/.*\\([0-9][0-9]*\\.[0-9]*\\).*/\\1/p' \
315 +       grep.c`+mb`sed -n '/^ + multi-byte/s/[^0-9]*\\([0-9.]*\\).*/\\1/p' \
316         grep.c`; \
317         mkdir grep-$$V; mkdir grep-$$V/tests; \
318 -       for f in `awk '{print $$1}' MANIFEST`; do ln $$f grep-$$V/$$f; done; \
319 +       for f in `awk '{print $$1}' MANIFEST MANIFEST.MB`; \
320 +       do ln $$f grep-$$V/$$f; done; \
321         tar cvhf - grep-$$V | gzip > grep-$$V.tar.z; \
322         rm -fr grep-$$V
323 @@ -132,2 +144,3 @@
324  kwset.o obstack.o: obstack.h
325  regex.o search.o: regex.h
326 +grep.o regex.o dfa.o search.o mbc.o: mbc.h
327 diff -ru2N grep-2.0/Makefile.msc grep+mb1.04/Makefile.msc
328 --- grep-2.0/Makefile.msc       Thu Jan  1 09:00:00 1970
329 +++ grep+mb1.04/Makefile.msc    Fri Jul 23 04:03:17 1993
330 @@ -0,0 +1,138 @@
331 +# Generated automatically from Makefile.in by configure.
332 +# Makefile for GNU grep
333 +# Copyright (C) 1992 Free Software Foundation, Inc.
334 +
335 +# This program is free software; you can redistribute it and/or modify
336 +# it under the terms of the GNU General Public License as published by
337 +# the Free Software Foundation; either version 2, or (at your option)
338 +# any later version.
339 +
340 +# This program is distributed in the hope that it will be useful,
341 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
342 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
343 +# GNU General Public License for more details.
344 +
345 +# You should have received a copy of the GNU General Public License
346 +# along with this program; if not, write to the Free Software
347 +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
348 +
349 +# Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
350 +# Last change: Jul. 23, 1993 by t^2
351 +
352 +#### Start of system configuration section. ####
353 +
354 +srcdir=.
355 +VPATH=.
356 +
357 +AWK=gawk
358 +INSTALL=cp
359 +INSTALL_PROGRAM=$(INSTALL)
360 +INSTALL_DATA=$(INSTALL)
361 +
362 +CC=cl -nologo -D__STDC__ -AL
363 +LINT=lint
364 +
365 +# Things you might add to DEFS:
366 +# -DSTDC_HEADERS       If you have ANSI C headers and libraries.
367 +# -DHAVE_UNISTD_H      If you have unistd.h.
368 +# -DUSG                        If you have System V/ANSI C string
369 +#                      and memory functions and headers.
370 +# -D__CHAR_UNSIGNED__  If type `char' is unsigned.
371 +#                      gcc defines this automatically.
372 +#
373 +# For DOS, add those to DEFS.dos.
374 +
375 +# Things you might set to MBCTYPE_DEF to spec. default multi-byte char type.
376 +# -DEUC                        will make default multi-byte char type EUC and
377 +# -DSJIS               SJIS.
378 +#                      If you do not set EUC/SJIS, grep assumes no multi-byte
379 +#                      char as default.
380 +MBCTYPE_DEF=-DSJIS
381 +
382 +# Extra libraries.
383 +LIBS=setargv/noe/st:30000
384 +ALLOCA=
385 +
386 +CFLAGS=-Ox
387 +LDFLAGS=$(CFLAGS)
388 +
389 +prefix=
390 +exec_prefix=$(prefix)
391 +
392 +# Prefix for installed program, normally empty or `g'.
393 +binprefix= 
394 +# Prefix for installed man page, normally empty or `g'.
395 +manprefix= 
396 +
397 +# Where to install executables.
398 +bindir=$(exec_prefix)/bin
399 +
400 +# Where to install man pages.
401 +mandir=$(prefix)/man/man1
402 +
403 +# Extension for man pages.
404 +manext=1
405 +
406 +# How to make a hard link.
407 +LN=cp
408 +
409 +#### End of system configuration section. ####
410 +
411 +SRCS=grep.c getopt.c regex.c dfa.c kwset.c obstack.c search.c mbc.c
412 +OBJS=grep.obj getopt.obj regex.obj dfa.obj kwset.obj obstack.obj search.obj mbc.obj
413 +
414 +.c.obj:
415 +       cat DEFS.dos $< > $*_.c
416 +       $(CC) $(CFLAGS) $(MBCTYPE_DEF) -I$(srcdir) -c -Fo$@ $*_.c
417 +       rm $*_.c
418 +
419 +all: grep.exe check.don
420 +
421 +# For Saber C.
422 +grep.loa: $(SRCS)
423 +       #load $(CFLAGS) $(DEFS) -I$(srcdir) (SRCS)
424 +
425 +# For Lint.
426 +grep.lin: $(SRCS)
427 +       $(LINT) $(CFLAGS) $(DEFS) -I$(srcdir) $(SRCS)
428 +
429 +install: all
430 +       $(INSTALL_PROGRAM) grep.exe $(bindir)/$(binprefix)grep.exe
431 +       rm -f $(bindir)/$(binprefix)egrep.exe
432 +       $(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)egrep.exe
433 +       rm -f $(bindir)/$(binprefix)fgrep.exe
434 +       $(LN) $(bindir)/$(binprefix)grep.exe $(bindir)/$(binprefix)fgrep.exe
435 +
436 +check:
437 +       tests\check
438 +       echo done >check.don
439 +
440 +check.don: grep.exe
441 +       tests\check
442 +       echo done >check.don
443 +
444 +grep.exe: $(OBJS)
445 +       echo $(OBJS:.obj =.obj+)+>link.tmp
446 +       echo $(LIBS)>>link.tmp
447 +       echo $@/noi;>>link.tmp
448 +       link @link.tmp
449 +       rm link.tmp
450 +
451 +clean:
452 +       rm -f grep.exe *.obj check.don tmp.bat tmp.in khadafy.out
453 +
454 +mostlycl: clean
455 +
456 +distclea: clean
457 +       rm -f Makefile config.sta
458 +
459 +realclea: distclea
460 +       rm -f TAGS
461 +
462 +# Some header file dependencies that really ought to be automatically deduced.
463 +dfa.obj search.obj: dfa.h
464 +grep.obj search.obj: grep.h
465 +kwset.obj search.obj: kwset.h
466 +kwset.obj obstack.obj: obstack.h
467 +regex.obj search.obj: regex.h
468 +grep.obj regex.obj dfa.obj search.obj mbc.obj: mbc.h
469 diff -ru2N grep-2.0/README.MB grep+mb1.04/README.MB
470 --- grep-2.0/README.MB  Thu Jan  1 09:00:00 1970
471 +++ grep+mb1.04/README.MB       Thu Jun  2 17:03:37 1994
472 @@ -0,0 +1,327 @@
473 +\e$B!|!|!|!|!|\e(B GNU grep version 2.0 + multi-byte extension 1.04 \e$B!|!|!|!|!|\e(B
474 +\e$B!|!|!|!|!|\e(B                              Jun. 2, 1994 by t^2 \e$B!|!|!|!|!|\e(B
475 +
476 +    grep-2.0+mb1.04 -- \e$B%^%k%A%P%$%HJ8;zBP1~HG\e(B GNU grep
477 +
478 +\e$B!|35MW\e(B
479 +
480 +    GNU \e$B%W%m%8%'%/%H$K$h$k\e(B grep, egrep, fgrep (\e$B0J2<C1$K\e(B grep) \e$B$r%^%k%A%P\e(B
481 +    \e$B%$%HJ8;zBP1~2=$7$?$b$N$G$9\e(B.
482 +
483 +\e$B!|;HMQK!\e(B
484 +
485 +    grep \e$B$+$i$N3HD%ItJ,$@$1$r@bL@$7$^$9\e(B.
486 +
487 +    \e$BA}$($?%*%W%7%g%s$O0J2<$NDL$j$G$9\e(B.
488 +
489 +        -Wctype=ASCII
490 +            \e$B%^%k%A%P%$%HJ8;z$r9MN8$7$^$;$s\e(B.  \e$B$3$N%*%W%7%g%s$r;HMQ$7$?>l\e(B
491 +            \e$B9g\e(B, grep \e$B$N%*%j%8%J%k$HF1$8F0:n$K$J$k$O$:$G$9\e(B.
492 +
493 +        -Wctype=EUC
494 +            \e$B%^%k%A%P%$%HJ8;z$H$7$F\e(B EUC \e$B$rG'<1$7$^$9\e(B.
495 +
496 +        -Wctype=SJIS
497 +            \e$B%^%k%A%P%$%HJ8;z$H$7$F\e(B Shift-JIS \e$B$rG'<1$7$^$9\e(B.
498 +
499 +        MS-DOS \e$B0J30$N%7%9%F%`$G\e(B, Makefile(.in)? \e$B$r=q$-49$($:$K%$%s%9%H!<\e(B
500 +        \e$B%k$7$?>l9g\e(B, \e$B%G%U%)%k%H$G$O\e(B EUC \e$B$rG'<1$7$^$9\e(B.  MS-DOS \e$B$G$O%G%U%)\e(B
501 +        \e$B%k%H$G\e(B Shift-JIS \e$B$rG'<1$7$^$9\e(B.
502 +
503 +\e$B!|\e(B GREM104.LZH (MS-DOS \e$BHG<B9T7A<0$r4^$`%"!<%+%$%V\e(B) \e$B$K$D$$$F\e(B (\e$B$=$l0J30$N\e(B
504 +   \e$B7ABV$GF~<j$5$l$?J}$OL5;k$7$F$/$@$5$$\e(B)
505 +
506 +    1. \e$B%"!<%+%$%V$K4^$^$l$F$$$k%U%!%$%k\e(B
507 +
508 +       \e$B%*%j%8%J%k$+$iA4$/<j$r2C$($F$$$J$$%U%!%$%k\e(B
509 +
510 +           AUTHORS      \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B AUTHORS
511 +           CHANGELO     \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B ChangeLog
512 +           COPYING      \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B COPYING
513 +           MANIFEST     \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B MANIFEST
514 +           NEWS         \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B NEWS
515 +           PROJECTS     \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B PROJECTS
516 +           README       \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k\e(B README
517 +
518 +       grep+mb \e$BMQ$N%U%!%$%k\e(B
519 +
520 +           CHANGELO.MB  grep+mb \e$B$NJQ99MzNr\e(B
521 +           README.MB    \e$B$3$N%U%!%$%k\e(B
522 +
523 +       MS-DOS \e$BHG\e(B grep+mb \e$BMQ$N%U%!%$%k\e(B
524 +
525 +           GREP.CAT     \e$B%*%j%8%J%k$N%=!<%9$K4^$^$l$F$$$k%^%K%e%"%k%Z!<%8\e(B.
526 +                        grep.man \e$B$r\e(B GNU roff \e$B$G%U%)!<%^%C%H$7$?$b$N\e(B.
527 +           GREP.EXE     MS-DOS \e$BHG\e(B grep-2.0+mb1.04 \e$B$N<B9T7A<0\e(B
528 +           READMAN.SED  sed \e$B$r;}$C$F$$$k?M$X$*$^$1\e(B
529 +                        (sed -f readman.sed grep.cat)
530 +
531 +    2. GREP.EXE \e$B$K$D$$$F\e(B
532 +
533 +        grep-2.0+mb1.04 \e$B$r\e(B MS-C 6.00A \e$B$G%3%s%Q%$%k$7$?$b$N$G$9\e(B.
534 +
535 +        \e$B%G%U%)%k%H$G\e(B Shift-JIS \e$B4A;z%3!<%I$r4^$`%Q%?!<%s$d%F%-%9%H$r=hM}\e(B
536 +        \e$B$G$-$^$9\e(B.
537 +
538 +        setargv.obj \e$B$rAH$_9~$s$G$"$j$^$9$N$G\e(B, MS-DOS \e$B$G%]%T%e%i!<$J%?%$\e(B
539 +        \e$B%W$N%o%$%k%I%+!<%I$,;HMQ$G$-$^$9\e(B.  UNIX \e$B$N\e(B csh \e$B%i%$%/$J%o%$%k%I\e(B
540 +        \e$B%+!<%IE83+%k!<%A%s$rMQ0U$7$h$&$+$H$b;W$C$?$N$G$9$,\e(B, MS-DOS \e$B$NB>\e(B
541 +        \e$B$N%3%^%s%I$H$N@09g@-$,<h$l$J$$$7\e(B, \e$B%*%j%8%J%k$r$J$k$Y$/B:=E$7$?$+$C\e(B
542 +        \e$B$?$N$GCGG0$7$^$7$?\e(B.
543 +
544 +    3. \e$B%$%s%9%H!<%k\e(B
545 +
546 +        GREP.EXE \e$B$O\e(B, grep \e$B$O$b$A$m$s\e(B, egrep, fgrep \e$B$N5!G=$r4^$s$G$$$^$9\e(B.
547 +        grep \e$B$K\e(B -E \e$B%*%W%7%g%s$rM?$($k$H\e(B egrep \e$B$NF0:n\e(B, -F \e$B%*%W%7%g%s$rM?\e(B
548 +        \e$B$($k$H\e(B fgrep \e$B$NF0:n$r$7$^$9\e(B.  \e$B$^$?\e(B, GREP.EXE \e$B$r\e(B EGREP.EXE,
549 +        FGREP.EXE \e$B$H$$$&L>A0$G%3%T!<$7$F\e(B egrep, fgrep \e$B$H$7$F5/F0$9$k$H\e(B, 
550 +        \e$B$=$NL>A0$K$U$5$o$7$$F0:n$r$7$^$9\e(B.  \e$B%O!<%I%G%#%9%/$KM>M5$N$J$$J}\e(B
551 +        \e$B0J30$O\e(B,
552 +
553 +            A>copy grep.exe a:\bin
554 +            A>copy grep.exe a:\bin\egrep.exe
555 +            A>copy grep.exe a:\bin\fgrep.exe
556 +
557 +        \e$B$J$I$H$7$F$4;HMQ$K$J$i$l$k$3$H$r$*4+$a$7$^$9\e(B.  \e$B$I$&$7$F$b%O!<%I\e(B
558 +        \e$B%G%#%9%/$NL5BL;H$$$r$7$?$/$J$1$l$P\e(B,
559 +
560 +            @echo off
561 +            grep -E %1 %2 %3 %4 %5 %6 %7 %8 %9
562 +
563 +        \e$B$J$I$N%P%C%A%U%!%$%k$r:n@.$9$k$H$$$&<j$b$"$j$^$9\e(B.
564 +
565 +    4. \e$B%3%^%s%I%i%$%s0z?t$K$D$$$F\e(B
566 +
567 +        \e$BA0=R$7$?$H$*$j\e(B MS-C \e$B$N\e(B setargv.obj \e$B$r%j%s%/$7$F$$$^$9$N$G\e(B, \e$B$=$N\e(B
568 +        \e$B;EMM$K=>$o$J$1$l$P$J$j$^$;$s\e(B.
569 +
570 +        \e$B#1$D#1$D$N0z?t$O6uGr$G6h@Z$j$^$9\e(B.  \e$B0z?t$K6uGr\e(B, ", \, <, >, | \e$B$r\e(B
571 +        \e$B4^$`$H$-$O%/%)!<%F%#%s%0$,I,MW$G$9\e(B.  \e$B$=$NJ}K!$O\e(B COMMAND.COM \e$B$N%P\e(B
572 +        \e$B%0=-$$;EMM$H\e(B, \e$B$5$i$K\e(B setargv.obj \e$B$K$bLdBj$,$"$j\e(B, \e$B$+$J$jFq$7$$$N\e(B
573 +        \e$B$G$3$3$G$O@bL@$r>J$-$^$9\e(B.  \e$B3F<+8&5f$7$F$/$@$5$$\e(B.  \e$B0lHV4JC1$J$N$O\e(B,
574 +        \e$B8!:w%Q%?!<%s$r%U%!%$%k$K$7$F\e(B
575 +
576 +            grep -f \e$B%U%!%$%kL>\e(B
577 +
578 +        \e$B$H$9$k$3$H$G$9\e(B.
579 +
580 +    5. \e$B%^%K%e%"%k\e(B
581 +
582 +        roff \e$B7O$N%U%)!<%^%C%?$r;H$($J$$?M$N$?$a$K\e(B GNU roff \e$B$G%U%)!<%^%C\e(B
583 +        \e$B%H:Q$_$N%^%K%e%"%k$rMQ0U$7$^$7$?\e(B.  \e$B%\!<%k%I%U%'!<%9\e(B, \e$B%"%s%@!<%i\e(B
584 +        \e$B%$%sBP1~$N\e(B less \e$B$J$I$G$*FI$_$/$@$5$$\e(B.  \e$B%(%G%#%?$J$I$G$O\e(B ^H \e$B$,F~$C\e(B
585 +        \e$B$F$$$FFI$_$K$/$$$H;W$$$^$9\e(B.
586 +
587 +            s/.^H//g
588 +
589 +        \e$B$H$$$&\e(B sed \e$B$N%W%m%0%i%`$KDL$;$P\e(B, \e$BDL>o$N%F%-%9%H%U%!%$%k$,F@$i$l\e(B
590 +        \e$B$^$9\e(B.  (^H \e$B$H$$$&$N$O%3%s%H%m!<%k%3!<%I$rD>@\Kd$a$3$`$H$$$&0UL#\e(B
591 +        \e$B$G$9\e(B.)
592 +
593 +\e$B!|%$%s%9%H!<%k\e(B (MS-DOS \e$B0J30\e(B)
594 +
595 +    \e$B%G%U%)%k%H$N%^%k%A%P%$%HJ8;z$N@_Dj$O\e(B, Makefile.in \e$B$NCf$G;XDj$7$^$9\e(B. 
596 +    \e$B%G%U%)%k%H$r\e(B Shift-JIS \e$B$H$9$k>l9g$H\e(B, \e$B%G%U%)%k%H$G%^%k%A%P%$%HJ8;z$r\e(B
597 +    \e$B;HMQ$7$J$$>l9g$O\e(B Makefile.in \e$B$N\e(B MBCTYPE_DEF \e$B%^%/%m$NDj5A$r$=$l$>$l0J\e(B
598 +    \e$B2<$N$h$&$KJQ$($F$/$@$5$$\e(B.
599 +
600 +        MBCTYPE_DEF=-DSJIS              (\e$B%G%U%)%k%H$G\e(B Shift-JIS \e$B$N>l9g\e(B)
601 +        MBCTYPE_DEF=                    (\e$B%G%U%)%k%H$G;HMQ$7$J$$>l9g\e(B)
602 +
603 +    \e$B$$$:$l$N>l9g$G$b5/F0;~$N%*%W%7%g%s$K$h$j%^%k%A%P%$%HJ8;z%3!<%I$NA*Br\e(B
604 +    \e$B$,2DG=$G$9\e(B.
605 +
606 +    \e$B$=$NB>$N:n6H$O\e(B, \e$B%*%j%8%J%k$N\e(B grep \e$B$HF1MM$G$9$N$G\e(B INSTALL \e$B$r$*FI$_$/\e(B
607 +    \e$B$@$5$$\e(B.
608 +
609 +\e$B!|%$%s%9%H!<%k\e(B (MS-DOS \e$BHG\e(B.  \e$B$3$3$G$$$&%$%s%9%H!<%k$H$$$&$N$O\e(B, \e$B%=!<%9$+$i\e(B
610 +  \e$B$N%$%s%9%H!<%k$N$3$H$G$9\e(B)
611 +
612 +    MS-C 6.00A \e$B$r;HMQ$7$F\e(B, \e$B%G%U%)%k%H$G\e(B Shift-JIS \e$B$rG'<1$9$k\e(B grep \e$B$r:n@.\e(B
613 +    \e$B$9$k>l9g$O\e(B, README.MSC \e$B$KL\$rDL$7$F\e(B, \e$BI,MW$J$i%i%$%V%i%j$K%Q%C%A$rEv\e(B
614 +    \e$B$F$?8e\e(B,
615 +
616 +        A>nmake -f makefile.msc
617 +
618 +    \e$B$H$9$k$@$1$G#O#K$G$9\e(B.  grep.exe \e$B$r:n@.8e\e(B, \e$B<+F0E*$K%F%9%H$r9T$$$^$9\e(B. 
619 +    \e$B$=$N:]\e(B, grep \e$B$+$i$N%(%i!<%a%C%;!<%8$,$$$/$D$+I=<($5$l$^$9$,\e(B, \e$B$=$l$O\e(B
620 +    \e$B0[>o$G$O$"$j$^$;$s\e(B.  \e$B%(%i!<$r4^$`%Q%?!<%s$rEO$7$?;~$K\e(B, \e$B=*N;%9%F!<%?\e(B
621 +    \e$B%9$,\e(B 2 \e$B$H$J$k$3$H$r3NG'$7$F$$$k$@$1$G$9\e(B.  \e$BK\Ev$K0[>o$,$"$C$?>l9g$O\e(B 
622 +    "Spencer test #nn faild" (nn \e$B$O?t;z\e(B) \e$B$HI=<($5$l$^$9\e(B.
623 +
624 +    \e$B%F%9%H$K%Q%9$7$?$i\e(B, grep.exe \e$B$rE,Ev$J%G%#%l%/%H%j$K%3%T!<$7$F$/$@$5\e(B
625 +    \e$B$$\e(B.  \e$B$=$N:]\e(B, \e$BL>A0$r\e(B egrep.exe, fgrep.exe \e$B$HJQ$($k$@$1$G\e(B, \e$B$=$l$>$l\e(B 
626 +    egrep, fgrep \e$B$NF0:n$r$7$^$9\e(B.  \e$B$=$3$G\e(B, \e$BNc$($P\e(B a:\bin \e$B$X%$%s%9%H!<%k$9\e(B
627 +    \e$B$k>l9g\e(B,
628 +
629 +        A>copy grep.exe a:\bin
630 +        A>copy grep.exe a:\bin\egrep.exe
631 +        A>copy grep.exe a:\bin\fgrep.exe
632 +
633 +    \e$B$J$I$H$7$^$9\e(B.
634 +
635 +    \e$B$=$NB>$N=hM}7O$r;HMQ$9$k>l9g$d\e(B, \e$B%G%U%)%k%H$r\e(B Shift-JIS \e$B0J30$K$9$k>l\e(B
636 +    \e$B9g$O\e(B Makefile.msc \e$B$r;29M$K\e(B Makefile \e$B$r=q$$$F$/$@$5$$\e(B. \e$B$J$*\e(B, \e$B%F%9%H$K\e(B
637 +    \e$B$O\e(B awk (gawk) \e$B$,I,MW$G$9\e(B.
638 +
639 +\e$B!|%P%0\e(B
640 +
641 +    1. \e$B$$$o$f$k\e(B JIS \e$B$K$OBP1~$7$F$$$^$;$s\e(B.  \e$B>-MhBP1~$9$kM=Dj$b$"$j$^$;$s\e(B.
642 +
643 +    2. \e$B%^%k%A%P%$%HJ8;z%3!<%I$O$"$^$j873J$K$O9M$($F$$$^$;$s\e(B.
644 +
645 +        EUC       \e$B#1%P%$%HL\\e(B ... 0x80 - 0xff
646 +        EUC       \e$B#2%P%$%HL\\e(B ... 0x01 - 0xff (0x0a \e$B$r=|$/\e(B)
647 +
648 +        Shift-JIS \e$B#1%P%$%HL\\e(B ... 0x80 - 0x9f, 0xe0 - 0xff
649 +        Shift-JIS \e$B#2%P%$%HL\\e(B ... 0x01 - 0xff (0x0a \e$B$r=|$/\e(B)
650 +
651 +       \e$B$H$7$F=hM}$7$F$$$^$9\e(B.  \e$BH>3Q%+%J$b;H$($^$9\e(B.  EUC \e$B$N\e(B SS3 (0x8f) \e$B$K\e(B
652 +       \e$B;O$^$k#3%P%$%H%3!<%I$O;H$($^$;$s\e(B.  (\e$B;d$O$3$l$r%5%]!<%H$7$F$$$k%7\e(B
653 +       \e$B%9%F%`$r8+$?$3$H$,$J$$\e(B...)
654 +
655 +    3. -b \e$B%*%W%7%g%s$GI=<($5$l$k%P%$%H%*%U%;%C%H$O\e(B DOS \e$B$N>l9g\e(B CR+LF \e$B$r\e(B 1 
656 +       \e$B$H$7$F%+%&%s%H$7$?CM$K$J$j$^$9\e(B.  (\e$B<jH4$-\e(B)
657 +
658 +\e$B!|%"%k%4%j%:%`\e(B (dfa.[ch] \e$B$N%^%k%A%P%$%HJ8;zBP1~2=\e(B)
659 +
660 +    \e$B0JA0$OGyA3$H\e(B, DFA \e$B$rD>@\\e(B EUC \e$B$d\e(B Shift-JIS \e$B$N$h$&$JJ8;z<o$NB?$$%3!<%I\e(B
661 +    \e$B%;%C%H$KBP1~$5$;$k$N$O\e(B, \e$BHs>o$KFq$7$$$H;W$C$F$$$^$7$?\e(B.  \e$B$H$3$m$,$"$k\e(B
662 +    \e$BF|\e(B, \e$B<+:n%i%$%V%i%j$N%F%9%HMQ$K\e(B, \e$B@55,I=8=$r\e(B DFA \e$B$XJQ49$9$k4JC1$J%W%m\e(B
663 +    \e$B%0%i%`$r=q$$$?$H$-$K\e(B, \e$BFMA3$&$^$$%"%$%G%#%"$,A.$$$?$N$G$9\e(B.  \e$B%^%k%A%P\e(B
664 +    \e$B%$%HJ8;z$H$$$($I$b7k6I$O%P%$%H$NJB$S$G$9\e(B.  \e$B%^%k%A%P%$%HJ8;z$r\e(B, \e$B$9$Y\e(B
665 +    \e$B$F%P%$%HC10L$KJ,2r$7$F\e(B, \e$B@55,I=8=$r:n$C$F$7$^$($P$h$+$C$?$N$G$9\e(B.
666 +
667 +    \e$B8@MU$G$O$&$^$/I=8=$G$-$J$$$N$G\e(B, \e$B0J2<$N5-9f$r;HMQ$7\e(B, \e$B$I$&$$$&$U$&$K%P\e(B
668 +    \e$B%$%HC10L$KJ,2r$7$F$$$k$N$+\e(B, \e$BNc$r5s$2$^$9\e(B.
669 +
670 +            a, b, c ... \e$B%7%s%0%k%P%$%HJ8;z\e(B.
671 +            x, y, z ... \e$B%^%k%A%P%$%HJ8;z$N#1J8;zL\\e(B.
672 +
673 +        . (\e$BG$0U$N#1J8;z\e(B)
674 +          ==> [a-c]|[x-z][a-z]
675 +
676 +          (\e$B%7%s%0%k%P%$%HJ8;z$+\e(B, \e$B$^$?$O%^%k%A%P%$%HJ8;z$N#1J8;zL\$H\e(B
677 +          \e$BG$0U$N#1J8;z$NO"@\\e(B.)
678 +
679 +        [xb-zx] (xb \e$B$+$i\e(B zx \e$B$NHO0O$N%^%k%A%P%$%HJ8;z\e(B)
680 +          ==> x[b-z]|y[a-z]|z[a-x]
681 +
682 +        yb*
683 +          ==> (yb)*
684 +
685 +    \e$B<B:]$K$O@55,I=8=$r:n$j=P$9$N$G$O$J$/\e(B, \e$B@55,I=8=$rJ,2r$7$?%H!<%/%s$rD>\e(B
686 +    \e$B@\@8@.$7$F$$$^$9\e(B.  \e$B$3$NJU\e(B, \e$B6=L#$,$"$kJ}$O%=!<%9$r8+$?$[$&$,Aa$$$H;W\e(B
687 +    \e$B$$$^$9\e(B.  (\e$B$"$^$j%(%l%,%s%H$G$O$"$j$^$;$s$N$G%=!<%9$r$8$C$/$j8+$i$l$k\e(B
688 +    \e$B$N$OCQ$:$+$7$$5$$b$7$^$9$,\e(B...)
689 +
690 +    \e$B$3$l$@$1$G$O\e(B, \e$BNc$($P$"$k%F%-%9%H$+$i\e(B xy \e$B$H$$$&J8;z$rC5$=$&$H$9$k$H\e(B,
691 +    xxyy \e$B$N$h$&$JJ8;z$NJB$S$K$^$GH?1~$7$F$7$^$$$^$9\e(B.  \e$B$=$3$G\e(B, \e$B%^%k%A%P%$\e(B
692 +    \e$B%H%b!<%I$N$H$-$K$OI,$:\e(B "^.*(" + \e$B%f!<%6%Q%?!<%s\e(B + ")" \e$B$H$7$F=hM}$7$^\e(B
693 +    \e$B$9\e(B.  '.*' \e$B$K$h$j\e(B, '.' \e$B$O%^%k%A%P%$%HJ8;z$N0lIt$K$O%^%C%A$7$^$;$s$+$i\e(B, 
694 +    \e$BF,=P$7$G$-$k$o$1$G$9\e(B.
695 +
696 +\e$B!|\e(B dfa.[ch], regex.[ch] \e$B$N3HD%;EMM\e(B
697 +
698 +    dfa.[ch], regex.[ch] \e$B%b%8%e!<%k$O\e(B mbc.[ch] \e$B%b%8%e!<%k$K0MB8$7$F$$$^\e(B
699 +    \e$B$9\e(B.  \e$B$^$?\e(B, \e$B$3$l$O%*%j%8%J%k$N;EMM$G$9$,\e(B, dfa.[ch] \e$B$r;HMQ$9$k>l9g$O\e(B 
700 +    regex.h \e$B$NDj5A$,I,MW$G$9\e(B.
701 +
702 +    \e$B%^%k%A%P%$%HJ8;z$N%?%$%W$O\e(B, mbc.[ch] \e$B$N\e(B mbcinit() \e$B$G@_Dj$7$^$9\e(B.
703 +    mbc.h \e$B$KDj5A$5$l$F$$$k%^%/%m\e(B MBCTYPE_ASCII, MBCTYPE_EUC,
704 +    MBCTYPE_SJIS \e$B$N$$$:$l$+$r\e(B mbcinit() \e$B$KEO$7$F$/$@$5$$\e(B.
705 +
706 +    dfa.[ch] \e$B$O\e(B, \e$B%Q%?!<%s$N%3%s%Q%$%k;~$K$@$1\e(B, \e$B$3$N\e(B mbc.[ch] \e$B$N@_Dj$r;2\e(B
707 +    \e$B>H$7$^$9\e(B.  \e$B%Q%?!<%s%^%C%A%s%0$N:]$O\e(B, \e$B%3%s%Q%$%k;~$K@_Dj$5$l$F$$$?\e(B, 
708 +    \e$B%^%k%A%P%$%HJ8;z$N%?%$%W$r8!:w$7$^$9\e(B.
709 +
710 +    \e$B0lJ}\e(B, regex.[ch] \e$B$O\e(B, \e$B%Q%?!<%s%3%s%Q%$%k;~\e(B, \e$B%^%C%A%s%0;~$NN>J}$G\e(B 
711 +    mbc.[ch] \e$B$N@_Dj$r;2>H$7$^$9\e(B.  \e$B$,\e(B, \e$B$3$NN><T$G\e(B mbc.[ch] \e$B$N@_Dj$rJQ99$9\e(B
712 +    \e$B$k$3$H$O$G$-$^$;$s\e(B.  \e$B$D$^$j\e(B, Shift-JIS \e$B$G5-=R$5$l$?%Q%?!<%s$r\e(B, EUC 
713 +    \e$B%F%-%9%H$+$i8!:w$9$k$H$$$C$?F0:n$O$G$-$^$;$s\e(B.  \e$BCm0U$7$F$/$@$5$$\e(B.
714 +
715 +    \e$B%^%k%A%P%$%HJ8;zBP1~$KH<$C$FCm0U$9$Y$-@55,I=8=$r0J2<$K5-$7$^$9\e(B.
716 +
717 +        .       \e$BG$0U$N#1%P%$%HJ8;z\e(B, \e$B@5Ev$J%^%k%A%P%$%HJ8;z$K%^%C%A$7$^$9\e(B. 
718 +                \e$B!V@5Ev$J%^%k%A%P%$%HJ8;z!W$H$O\e(B, \e$B%^%k%A%P%$%HJ8;z$N#1J8;z\e(B
719 +                \e$BL\$K\e(B, '\0' \e$B$^$?$O\e(B '\n' \e$B0J30$,B3$/J8;z$N$3$H$G$9\e(B.
720 +
721 +        [x-y]   \e$BJ8;z%3!<%I\e(B (\e$BFbItI=8=\e(B) \e$B$,\e(B x \e$B$+$i\e(B y \e$B$NHO0O$K$"$kG$0U$N#1J8\e(B
722 +                \e$B;z$K%^%C%A$7$^$9\e(B.  \e$B$3$l$b\e(B . \e$B$HF1$8$/\e(B, \e$B@5Ev$G$J$$J8;z$K$O\e(B
723 +                \e$B%^%C%A$7$^$;$s\e(B.
724 +
725 +        [^x-y]  \e$BJ8;z%3!<%I\e(B (\e$BFbItI=8=\e(B) \e$B$,\e(B x \e$B$+$i\e(B y \e$B$NHO0O$K$J$$G$0U$N#1J8\e(B
726 +                \e$B;z$K%^%C%A$7$^$9\e(B.  \e$B@5Ev$G$J$$J8;z$K$b%^%C%A$7$^$9\e(B.
727 +
728 +    \e$B%^%k%A%P%$%HJ8;z$NFbItI=8=$OC1$K#1%P%$%HL\$r>e0L%P%$%H\e(B, \e$B#2%P%$%HL\$r\e(B
729 +    \e$B2<0L%P%$%H$H$7$?#1#6%S%C%HId9f$J$7@0?t$G$9\e(B.  Shift-JIS \e$B$G$b\e(B EUC \e$B$G$b\e(B
730 +
731 +        \e$B#1%P%$%H\e(B ASCII \e$BJ8;z\e(B < \e$BH>3Q%+%JJ8;z\e(B < \e$BA43QJ8;z\e(B
732 +
733 +    \e$B$H$$$&Bg>.4X78$,@.$jN)$C$F$$$^$9\e(B.
734 +
735 +\e$B!|$=$NB>\e(B
736 +
737 +    1. \e$B%*%j%8%J%k$N\e(B GNU grep \e$B$NCx:n8"$O\e(B Free Software Foundation, Inc. 
738 +       \e$B$,M-$7$F$$$^$9\e(B. \e$B%Q%C%AItJ,\e(B (grep-mb.diff) \e$B$NCx:n8"$O;d\e(B (t^2) \e$B$,M-\e(B
739 +       \e$B$7$F$$$^$9\e(B.
740 +
741 +    2. GNU grep \e$B$N%=!<%9%3!<%I$O3F=j$N\e(B ftp \e$B%5%$%H\e(B, \e$B$b$7$/$O\e(B Nifty-serve 
742 +       \e$B$N\e(B FUNIX \e$B$N%G!<%?%i%$%V%i%j$+$iF~<j2DG=$G$9\e(B. GNU grep \e$B$+$i\e(B 
743 +       grep+mb \e$B$X$N:9J,\e(B grep-mb.diff \e$B$O\e(B, \e$B;d$,\e(B FUNIX \e$B$XEPO?$7\e(B, \e$BF21`OBO:;a\e(B 
744 +       (dohzono@sdsft.kme.mei.co.jp) \e$B$,\e(B fj.sources \e$B$X%]%9%H$7$F$/$@$5$C\e(B
745 +       \e$B$F$$$^$9\e(B.
746 +
747 +    3. \e$B:9J,\e(B grep-mb.diff \e$B$N:FG[I[$O<+M3$G$9\e(B. \e$B$3$l$K4X$7$F$O\e(B FSF \e$B$N5,Dj$K\e(B
748 +       \e$B=>$&I,MW$b$"$j$^$;$s\e(B. \e$B$7$+$7:9J,$rE,MQ$7$?7k2L$N%=!<%9%3!<%I\e(B, \e$B$*\e(B
749 +       \e$B$h$S<B9T7A<0$G$N:FG[I[$N:]$O\e(B GNU GENERAL PUBLIC LICENSE (COPYING 
750 +       \e$B;2>H\e(B) \e$B$K=>$C$F$/$@$5$$\e(B.
751 +
752 +       grep+mb \e$B$K2?$i$+$N2~JQ$r2C$($?$b$N$r:FG[I[$9$k:]$b\e(B, GNU GENERAL
753 +       PUBLIC LICENSE \e$B$K=>$&$h$&$KCm0U$7$F$/$@$5$$\e(B. \e$B$^$?\e(B grep+mb \e$B$K4^$^\e(B
754 +       \e$B$l$k%3!<%I\e(B (dfa.[ch] \e$B$d\e(B regex.[ch]) \e$B$rMxMQ$7$?%W%m%0%i%`$rG[I[$9\e(B
755 +       \e$B$k:]$b\e(B GNU GENERAL PUBLIC LICENSE \e$B$N3:EvItJ,$K=>$C$F$/$@$5$$\e(B.
756 +
757 +       \e$B$^$?5AL3$G$O$"$j$^$;$s$,:FG[I[$5$l$kJ}$O;v8e$K$G$bO"Mm$r$/$@$5$$\e(B. 
758 +       \e$B$=$7$F2DG=$J8B$j\e(B, \e$B?7$7$$%P!<%8%g%s$X$N%"%C%W%G!<%H$KEX$a\e(B, \e$BMxMQ<T\e(B
759 +       \e$B$+$i$NO"Mm$,;d$KFO$/$h$&$KG[N8$7$F$/$@$5$$\e(B.
760 +
761 +    4. \e$B$3$N%W%m%0%i%`$OL5J]>Z$G$9\e(B.
762 +
763 +    5. grep+mb \e$B$K2?$i$+$NIT6q9g$,H/@8$7$?>l9g\e(B, (FSF \e$B$d\e(B, \e$B%*%j%8%J%k$N:n<T\e(B
764 +       \e$B$G$O$J$/\e(B) \e$B;d$KO"Mm$7$F$/$@$5$$\e(B. \e$BG[I[$7$??M$,4uK>$7$F$$$k>l9g$O\e(B, 
765 +       \e$B$=$N?M$KO"Mm$7$F$/$@$5$$\e(B.
766 +
767 +    6. \e$B$4<ALd\e(B/\e$B$4MWK>\e(B/\e$B$*<8$j\e(B, \e$B$=$NB>$bBg4?7^$G$9\e(B. \e$B$G$-$k$+$.$j%5%]!<%H$7\e(B
768 +       \e$B$^$9\e(B.
769 +
770 +\e$B!|<U<-\e(B
771 +
772 +    \e$B86:n<T$*$h$S\e(B FSF \e$B$K46<U$7$^$9\e(B.
773 +
774 +    \e$B%I%-%e%a%s%H:n@.$K4X$7$F=u8@$r$/$@$5$C$?F21`OBO:;a\e(B 
775 +    (dohzono@sdsft.kme.mei.co.jp) \e$B$K46<U$7$^$9\e(B.
776 +
777 +    \e$B$3$l$^$GE>:\\e(B/\e$B%P%0Js9p$r$/$@$5$C$?J}!9$K46<U$7$^$9\e(B. \e$B<BL>$r5s$2$5$;$F\e(B
778 +    \e$BD:$-$?$+$C$?$N$G$9$,%O!<%I%G%#%9%/$N%H%i%V%k$G$[$H$s$I$N%a!<%k$r>C<:\e(B
779 +    \e$B$5$;$F$7$^$$$^$7$?\e(B.
780 +
781 +    \e$B:G8e$K\e(B, \e$B5.=E$J%G%#%9%/%9%Z!<%9$r\e(B grep+mb \e$B$N$?$a$K3d$$$F$4;HMQD:$$$F\e(B
782 +    \e$B$$$k$9$Y$F$NMxMQ<T$NJ}!9$K46<U$7$^$9\e(B.
783 +
784 +\e$B!|!V;d!W$NO"Mm@h\e(B
785 +
786 +    \e$B")\e(B810  \e$BJ!2,;TCf1{6hG_8w1`CDCO\e(B 7-207               (\e$BCm\e(B: \e$BE>5o$7$^$7$?\e(B)
787 +    TEL/FAX: 092-731-4025 (TEL/FAX \e$B<+F0@ZBX$(\e(B)
788 +             092-724-6342 (TEL \e$B$N$_\e(B)
789 +    E-mail: NBC02362@niftyserve.or.jp                           \e$BC+K\9'9@\e(B
790 +\f
791 +# Local variables:
792 +# mode: indented-text
793 +# indent-tabs-mode: nil
794 +# tab-stop-list: (4 8 16 24 32 40 48 56 64 72 80)
795 +# left-margin: 4
796 +# fill-column: 72
797 +# fill-prefix: "    "
798 +# version-control: never
799 +# End:
800 diff -ru2N grep-2.0/README.MSC grep+mb1.04/README.MSC
801 --- grep-2.0/README.MSC Thu Jan  1 09:00:00 1970
802 +++ grep+mb1.04/README.MSC      Sat Mar  5 16:14:14 1994
803 @@ -0,0 +1,99 @@
804 +PC-9801 \e$BMQ\e(B MS-C version 6.00A \e$B$N0z?t$N%;%C%H%"%C%W%k!<%A%s$K$O%P%0$,$"$j\e(B
805 +\e$B$^$9\e(B.
806 +
807 +#include <stdio.h>
808 +
809 +int
810 +main(int argc, char **argv)
811 +{
812 +  int i;
813 +
814 +  for (i = 0; i <= argc; i++)
815 +    printf("argv[%d] == %s\n", i, argv[i]);
816 +  return 0;
817 +}
818 +
819 +\e$B$r%3%s%Q%$%k\e(B, \e$B%j%s%/$7$?\e(B FOO.EXE \e$B$K\e(B
820 +
821 +  A>foo "\\" abc
822 +
823 +\e$B$J$I$N0z?t$rEO$7$F<B9T$9$k$H\e(B, \e$B%P%0$,3NG'$G$-$^$9\e(B.  \e$B$^$?\e(B, \e$B%o%$%k%I%+!<%I\e(B
824 +\e$BE83+%k!<%A%s$K$b%P%0$,$"$j\e(B, \e$B>e5-$N%W%m%0%i%`$r\e(B SETARGV.OBJ \e$B$H$H$b$K%j%s\e(B
825 +\e$B%/$7$F\e(B
826 +
827 +  A>foo \DOS\*.com
828 +
829 +\e$B$J$I$N0z?t$G<B9T$9$k$H\e(B, \e$B$*$+$7$JE83+$N;EJ}$r$7$F$7$^$$$^$9\e(B.
830 +
831 +\e$B$3$N%P%0$O\e(B SOURCE/STARTUP \e$B2<$N\e(B DOS/STDARGV.ASM \e$B$*$h$S\e(B WILD.C \e$B$K0J2<$N%Q%C\e(B
832 +\e$B%A$rEv$F$k$H=$@5$G$-$k$h$&$G$9\e(B.  \e$B%Q%C%A$rEv$F$F\e(B STARTUP.BAT \e$B$G%3%s%Q%$%k\e(B
833 +\e$B$7$F$/$@$5$$\e(B. \e$B$=$N8e\e(B, \e$BNc$($P%i!<%8%b%G%kMQ$N%i%$%V%i%j$r=$@5$9$k>l9g\e(B,
834 +L/DOS/STDARGV.OBJ, L/DOS/_SETARGV.OBJ, L/WILD.OBJ \e$B$r$=$l$>$l\e(B 
835 +KSTDARGV.OBJ, _KSTARGV.OBJ, KWILD.OBJ \e$B$H%j%M!<%`$7\e(B,
836 +
837 +  lib \msc6\lib\llibce.lib-+dos\kstdargv.obj-+dos\_kstargv.obj-+kwild.obj;
838 +
839 +\e$B$J$I$H$7$F%b%8%e!<%k$r99?7$7$F$/$@$5$$\e(B.  \e$BG0$N$?$a$3$N:n6H$r9T$&A0$K\e(B,
840 +
841 +  lib \msc6\lib\llibce.lib*kstdargv.obj*_kstargv.obj*kwild.obj;
842 +
843 +\e$B$J$I$G\e(B, kstdargv.obj, _kstargv.obj, kwild.obj \e$B$N%P%C%/%"%C%W$r$H$C$FCV$/\e(B
844 +\e$B$H$$$$$G$7$g$&\e(B.
845 +
846 +\e$B$J$*\e(B, \e$B$3$N%Q%C%A$OEvA3$N$3$H$J$,$iL5J]>Z$G$9\e(B.
847 +
848 +Mar. 5, 1994                                                      t^2
849 +
850 +*** stdargv.org        Mon Oct  8 19:50:46 1990
851 +--- stdargv.asm        Thu Jul 22 17:50:44 1993
852 +***************
853 +*** 409,415 ****
854 +       shr     cx,1
855 +       adc     dx,cx           ; add 1 for every pair of backslashes
856 +       test    al,1            ; plus 1 for the " if odd number of \
857 +!      jz      arg310          ; [J1]
858 +       jmp     arg210          ; [J1]
859 +  ;
860 +  ; Command line is fully parsed - compute number of bytes needed
861 +--- 409,415 ----
862 +       shr     cx,1
863 +       adc     dx,cx           ; add 1 for every pair of backslashes
864 +       test    al,1            ; plus 1 for the " if odd number of \
865 +!      jnz     arg310          ; ! Jul.21.93 t^2
866 +       jmp     arg210          ; [J1]
867 +  ;
868 +  ; Command line is fully parsed - compute number of bytes needed
869 +
870 +*** wild.org   Mon Oct  8 19:49:48 1990
871 +--- wild.c     Sat Mar  5 00:42:12 1994
872 +***************
873 +*** 186,197 ****
874 +      char    *ptr2 = arg;                    // [J1]
875 +  
876 +      if(ptr != arg) {                        // [J1]
877 +!         while(ptr2 + 1 != ptr && *ptr2 != SLASHCHAR && *ptr2 != FWDSLASHCHAR
878 +!                 && *ptr2 != ':') {          // [J1]
879 +              if(iskanji(*ptr2))  ptr2++;     // [J1]
880 +              ptr2++;                         // [J1]
881 +          }                                   // [J1]
882 +!         ptr = ptr2;                         // [J1]
883 +      }                                       // [J1]
884 +  
885 +      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
886 +--- 186,201 ----
887 +      char    *ptr2 = arg;                    // [J1]
888 +  
889 +      if(ptr != arg) {                        // [J1]
890 +!      char *ptr3 = arg;
891 +! 
892 +!         while (ptr2 < ptr) {
893 +!          if (*ptr2 == SLASHCHAR || *ptr2 == FWDSLASHCHAR
894 +!              || *ptr2 == ':')
895 +!              ptr3 = ptr2;
896 +              if(iskanji(*ptr2))  ptr2++;     // [J1]
897 +              ptr2++;                         // [J1]
898 +          }                                   // [J1]
899 +!      ptr = ptr3;
900 +      }                                       // [J1]
901 +  
902 +      if (*ptr == ':' && ptr != arg+1) /* weird name, just add it as is */
903 diff -ru2N grep-2.0/configure grep+mb1.04/configure
904 --- grep-2.0/configure  Sat May 22 13:20:23 1993
905 +++ grep+mb1.04/configure       Fri Jul  9 13:05:45 1993
906 @@ -566,5 +566,5 @@
907  fi
908  
909 -for func in getpagesize memchr strerror valloc
910 +for func in getpagesize memchr strerror valloc bcopy memmove strcasecmp
911  do
912  trfunc=HAVE_`echo $func | tr '[a-z]' '[A-Z]'`
913 diff -ru2N grep-2.0/configure.in grep+mb1.04/configure.in
914 --- grep-2.0/configure.in       Sat May 22 13:20:16 1993
915 +++ grep+mb1.04/configure.in    Fri Jul  9 13:05:32 1993
916 @@ -12,5 +12,5 @@
917  AC_SIZE_T
918  AC_ALLOCA
919 -AC_HAVE_FUNCS(getpagesize memchr strerror valloc)
920 +AC_HAVE_FUNCS(getpagesize memchr strerror valloc bcopy memmove strcasecmp)
921  AC_CHAR_UNSIGNED
922  AC_CONST
923 diff -ru2N grep-2.0/dfa.c grep+mb1.04/dfa.c
924 --- grep-2.0/dfa.c      Mon May 31 08:02:20 1993
925 +++ grep+mb1.04/dfa.c   Sat Jul 10 01:17:14 1993
926 @@ -18,4 +18,6 @@
927  /* Written June, 1988 by Mike Haertel
928     Modified July, 1988 by Arthur David Olson to assist BMG speedups  */
929 +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
930 +   Last change: Jul. 10, 1993 by t^2  */
931  
932  #include <assert.h>
933 @@ -35,4 +37,8 @@
934  #undef index
935  #define index strchr
936 +#undef bcopy
937 +#define bcopy(s, d, n) memcpy(d, s, n)
938 +#undef bzero
939 +#define bzero(d, n) memset(d, 0, n)
940  #else
941  #include <strings.h>
942 @@ -71,4 +77,5 @@
943  #include "dfa.h"
944  #include "regex.h"
945 +#include "mbc.h"
946  
947  #if __STDC__
948 @@ -141,5 +148,8 @@
949      fprintf(stderr, "END");
950    else if (t < NOTCHAR)
951 -    fprintf(stderr, "%c", t);
952 +    if (t & 0x80)
953 +      fprintf(stderr, "0x%02x", (unsigned char)t);
954 +    else
955 +      fprintf(stderr, "%c", t);
956    else
957      {
958 @@ -239,4 +249,16 @@
959  }
960  
961 +static int
962 +isemptyset(s)
963 +     charclass s;
964 +{
965 +  int i;
966 +
967 +  for (i = 0; i < CHARCLASS_INTS; i++)
968 +    if (s[i])
969 +      return 0;
970 +  return 1;
971 +}
972 +
973  /* A pointer to the current dfa is kept here during parsing. */
974  static struct dfa *dfa;
975 @@ -259,5 +281,6 @@
976  
977  /* Syntax bits controlling the behavior of the lexical analyzer. */
978 -static int syntax_bits, syntax_bits_set;
979 +static unsigned long syntax_bits;
980 +static int syntax_bits_set;
981  
982  /* Flag for case-folding letters into sets. */
983 @@ -267,5 +290,5 @@
984  void
985  dfasyntax(bits, fold)
986 -     int bits;
987 +     unsigned long bits;
988       int fold;
989  {
990 @@ -289,4 +312,66 @@
991  static int minrep, maxrep;     /* Repeat counts for {m,n}. */
992  
993 +static charclass cs_cset[8];
994 +static token cs_tok[8] = {0, 0, 0, 0, 0, 0, 0, 0};
995 +
996 +static enum {
997 +  MBEXTTOK_NONE = -1,
998 +  MBEXTTOK_NOTCHAR = 256,
999 +  MBEXTTOK_ORMBC = MBEXTTOK_NOTCHAR,
1000 +  MBEXTTOK_ORMBC_NL,
1001 +  MBEXTTOK_CLASS,
1002 +  MBEXTTOK_INVCLASS,
1003 +} mbexttok = MBEXTTOK_NONE;
1004 +
1005 +static charclass mbcset_set;
1006 +static charclass mbcset_all;
1007 +static charclass mbcset[128];  /* 128*256/8 = 4 Kbytes */
1008 +
1009 +/* \e$BIQHK$K;HMQ$5$l$k\e(B (\e$B$H;W$o$l$k\e(B) \e$BJ8;z=89g$r%H!<%/%s$H$7$FJV$9\e(B.
1010 +   n = 0 ... 1\e$B%P%$%HJ8;zA4BN$N=89g\e(B.
1011 +       1 ... 2\e$B%P%$%HJ8;z$N\e(B1\e$B%P%$%HL\A4BN$N=89g\e(B.
1012 +       2 ... 2\e$B%P%$%HJ8;z$N\e(B2\e$B%P%$%HL\A4BN$N=89g\e(B.
1013 +      +4 ... '\n'\e$B$r=|30$7$J$$\e(B. */
1014 +static token
1015 +setcodeset(n)
1016 +     int n;
1017 +{
1018 +  token c;
1019 +
1020 +  if (!cs_tok[n]) {
1021 +    zeroset(cs_cset[n]);
1022 +    switch (n) {
1023 +    case 0:
1024 +    case 4:
1025 +      /* 1\e$B%P%$%HJ8;zA4BN$N=89g\e(B. */
1026 +      for (c = 0; c < NOTCHAR; c++)
1027 +       if (ismbchar(c))
1028 +         setbit(c, cs_cset[n]);
1029 +      notset(cs_cset[n]);
1030 +      break;
1031 +    case 1:
1032 +    case 5:
1033 +      /* 2\e$B%P%$%HJ8;z$N\e(B1\e$BJ8;zL\A4BN$N=89g\e(B. */
1034 +      for (c = 0; c < NOTCHAR; c++)
1035 +       if (ismbchar(c))
1036 +         setbit(c, cs_cset[n]);
1037 +      break;
1038 +    case 2:
1039 +    case 6:
1040 +      /* 2\e$B%P%$%HJ8;z$N\e(B2\e$BJ8;zL\A4BN$N=89g\e(B. */
1041 +      notset(cs_cset[n]);
1042 +      break;
1043 +    }
1044 +    if (!(n & 4)) {
1045 +      if (syntax_bits & RE_DOT_NOT_NULL || n != 0)
1046 +       clrbit('\0', cs_cset[n]);
1047 +      if (!(syntax_bits & RE_DOT_NEWLINE) || n != 0)
1048 +       clrbit('\n', cs_cset[n]);
1049 +    }
1050 +    cs_tok[n] = CSET + charclass_index(cs_cset[n]);
1051 +  }
1052 +  return cs_tok[n];
1053 +}
1054 +
1055  /* Note that characters become unsigned here. */
1056  #define FETCH(c, eoferr)             \
1057 @@ -362,4 +447,5 @@
1058       it means that just about every case begins with
1059       "if (backslash) ...".  */
1060 +  mbexttok = MBEXTTOK_NONE;
1061    for (i = 0; i < 2; ++i)
1062      {
1063 @@ -543,14 +629,19 @@
1064           if (backslash)
1065             goto normal_char;
1066 +         if (current_mbctype != MBCTYPE_ASCII)
1067 +           mbexttok = MBEXTTOK_ORMBC;
1068 +         laststart = 0;
1069 +         return setcodeset(0);
1070 +
1071 +       case 'w':
1072 +         if (!backslash)
1073 +           goto normal_char;
1074           zeroset(ccl);
1075 -         notset(ccl);
1076 -         if (!(syntax_bits & RE_DOT_NEWLINE))
1077 -           clrbit('\n', ccl);
1078 -         if (syntax_bits & RE_DOT_NOT_NULL)
1079 -           clrbit('\0', ccl);
1080 +         for (c2 = 0; c2 < NOTCHAR; ++c2)
1081 +           if (ISALNUM(c2))
1082 +             setbit(c2, ccl);
1083           laststart = 0;
1084           return lasttok = CSET + charclass_index(ccl);
1085  
1086 -       case 'w':
1087         case 'W':
1088           if (!backslash)
1089 @@ -558,8 +649,7 @@
1090           zeroset(ccl);
1091           for (c2 = 0; c2 < NOTCHAR; ++c2)
1092 -           if (ISALNUM(c2))
1093 +           if (!ISALNUM(c2) && !ismbchar(c2))
1094               setbit(c2, ccl);
1095 -         if (c == 'W')
1096 -           notset(ccl);
1097 +         mbexttok = MBEXTTOK_ORMBC_NL;
1098           laststart = 0;
1099           return lasttok = CSET + charclass_index(ccl);
1100 @@ -579,4 +669,6 @@
1101           do
1102             {
1103 +             unsigned char ch = 0, c2h = 0;
1104 +
1105               /* Nobody ever said this had to be fast. :-)
1106                  Note that if we're looking at some other [:...:]
1107 @@ -599,4 +691,8 @@
1108               if (c == '\\' && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
1109                 FETCH(c, "Unbalanced [");
1110 +             if (ismbchar(c)) {
1111 +               ch = (unsigned char)c;
1112 +               FETCH(c, "Multi-byte char incomplete");
1113 +             }
1114               FETCH(c1, "Unbalanced [");
1115               if (c1 == '-')
1116 @@ -616,19 +712,83 @@
1117                           && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
1118                         FETCH(c2, "Unbalanced [");
1119 +                     if (ismbchar(c2)) {
1120 +                       c2h = (unsigned char)c2;
1121 +                       FETCH(c2, "Multi-byte char incomplete");
1122 +                     }
1123                       FETCH(c1, "Unbalanced [");
1124                     }
1125                 }
1126 -             else
1127 +             else {
1128 +               c2h = ch;
1129                 c2 = c;
1130 -             while (c <= c2)
1131 -               {
1132 -                 setbit(c, ccl);
1133 -                 if (case_fold)
1134 -                   if (ISUPPER(c))
1135 -                     setbit(tolower(c), ccl);
1136 -                   else if (ISLOWER(c))
1137 -                     setbit(toupper(c), ccl);
1138 -                 ++c;
1139 +             }
1140 +             if (ch < c2h || (ch == c2h && c <= c2)) {
1141 +               if (ch == 0) {
1142 +                 ch = (unsigned char)c2;
1143 +                 if (c2h > 0)
1144 +                   ch = NOTCHAR - 1;
1145 +                 for (; (unsigned char)c <= ch; c++) {
1146 +                   setbit(c, ccl);
1147 +                   if (case_fold) {
1148 +                     if (ISUPPER(c))
1149 +                       setbit(tolower(c), ccl);
1150 +                     else if (ISLOWER(c))
1151 +                       setbit(toupper(c), ccl);
1152 +                   }
1153 +                 }
1154 +                 ch = 0x80;
1155 +                 c = 0x00;
1156                 }
1157 +               if (ch <= c2h) {
1158 +                 if (mbexttok < 0) {
1159 +                   mbexttok = MBEXTTOK_CLASS;
1160 +                   zeroset(mbcset_set);
1161 +                   zeroset(mbcset_all);
1162 +                 }
1163 +                 if (ch < c2h && c != 0x00) {  /* \e$B:G=i$NH>C<\e(B */
1164 +                   int t;
1165 +
1166 +                   if (ismbchar(ch)
1167 +                       && ((t = tstbit(ch, mbcset_set))
1168 +                           || !tstbit(ch, mbcset_all))) {
1169 +                     if (!t) {
1170 +                       setbit(ch, mbcset_set);
1171 +                       zeroset(mbcset[ch - 0x80]);
1172 +                     }
1173 +                     for (; c < NOTCHAR; c++)
1174 +                       setbit(c, mbcset[ch - 0x80]);
1175 +                   }
1176 +                   ch++;
1177 +                   c = 0x00;
1178 +                 }
1179 +                 if (ch < c2h || (ch == c2h && c == 0x00 && c2 == 0xff)) {
1180 +                   if (c == 0x00 && c2 == 0xff)
1181 +                     c2h++;
1182 +                   for (; ch < c2h; ch++)
1183 +                     if (ismbchar(ch)) {
1184 +                       clrbit(ch, mbcset_set);
1185 +                       setbit(ch, mbcset_all);
1186 +                     }
1187 +                   if (c == 0x00 && c2 == 0xff)
1188 +                     c2h--;
1189 +                   c = 0x00;
1190 +                 }
1191 +                 if (ch <= c2h) {
1192 +                   int t;
1193 +
1194 +                   /* \e$B$3$3$G$OI,$:\e(B c <= c2 \e$B$H$J$C$F$$$k\e(B. */
1195 +                   if (ismbchar(ch)
1196 +                       && ((t = tstbit(ch, mbcset_set))
1197 +                           || !tstbit(ch, mbcset_all))) {
1198 +                     if (!t) {
1199 +                       setbit(ch, mbcset_set);
1200 +                       zeroset(mbcset[ch - 0x80]);
1201 +                     }
1202 +                     for (; c <= c2; c++)
1203 +                       setbit(c, mbcset[ch - 0x80]);
1204 +                   }
1205 +                 }
1206 +               }
1207 +             }
1208             skip:
1209               ;
1210 @@ -640,5 +800,20 @@
1211               if (syntax_bits & RE_HAT_LISTS_NOT_NEWLINE)
1212                 clrbit('\n', ccl);
1213 +             if (mbexttok == MBEXTTOK_CLASS) {
1214 +               mbexttok = MBEXTTOK_INVCLASS;
1215 +               if (!isemptyset(mbcset_set)) {
1216 +                 for (c = 0x80; c <= 0xff; c++)
1217 +                   if (tstbit(c, mbcset_set))
1218 +                     notset(mbcset[c - 0x80]);
1219 +               }
1220 +               notset(mbcset_all);
1221 +             }
1222 +             else
1223 +               mbexttok = MBEXTTOK_ORMBC_NL;
1224             }
1225 +         if (current_mbctype != MBCTYPE_ASCII)
1226 +           for (c = 0x80; c <= 0xff; c++)
1227 +             if (ismbchar(c))
1228 +               clrbit(c, ccl);
1229           laststart = 0;
1230           return lasttok = CSET + charclass_index(ccl);
1231 @@ -647,4 +822,8 @@
1232         normal_char:
1233           laststart = 0;
1234 +         if (ismbchar(c)) {
1235 +           FETCH(mbexttok, "Multi-byte char incomplete");
1236 +           return c;
1237 +         }
1238           if (case_fold && ISALPHA(c))
1239             {
1240 @@ -746,5 +925,67 @@
1241  atom()
1242  {
1243 -  if ((tok >= 0 && tok < NOTCHAR) || tok >= CSET || tok == BACKREF
1244 +  if (mbexttok >= 0) {
1245 +    if (mbexttok < MBEXTTOK_NOTCHAR) {
1246 +      addtok(tok);
1247 +      addtok(mbexttok);
1248 +      addtok(CAT);
1249 +    }
1250 +    else
1251 +      switch (mbexttok) {
1252 +      case MBEXTTOK_ORMBC:
1253 +      case MBEXTTOK_ORMBC_NL:
1254 +       addtok(tok);
1255 +       if (mbexttok == MBEXTTOK_ORMBC) {
1256 +         addtok(setcodeset(1));
1257 +         addtok(setcodeset(2));
1258 +       }
1259 +       else {
1260 +         addtok(setcodeset(5));
1261 +         addtok(setcodeset(6));
1262 +       }
1263 +       addtok(CAT);
1264 +       addtok(OR);
1265 +       break;
1266 +      case MBEXTTOK_CLASS:
1267 +      case MBEXTTOK_INVCLASS:
1268 +       {
1269 +         token c;
1270 +
1271 +         addtok(tok);
1272 +         if (!isemptyset(mbcset_set))
1273 +           for (c = 0x80; c <= 0xff; c++)
1274 +             if (tstbit(c, mbcset_set)) {
1275 +               /* Make sure all bits in mbcset_all valid. */
1276 +               clrbit(c, mbcset_all);
1277 +               addtok(c);
1278 +               if (mbexttok == MBEXTTOK_CLASS) {
1279 +                 clrbit('\n', mbcset[c - 0x80]);
1280 +                 clrbit('\0', mbcset[c - 0x80]);
1281 +               }
1282 +               else {
1283 +                 setbit('\n', mbcset[c - 0x80]);
1284 +                 setbit('\0', mbcset[c - 0x80]);
1285 +               }
1286 +               addtok(CSET + charclass_index(mbcset[c - 0x80]));
1287 +               addtok(CAT);
1288 +               addtok(OR);
1289 +             }
1290 +         if (!isemptyset(mbcset_all)) {
1291 +           addtok(CSET + charclass_index(mbcset_all));
1292 +           if (mbexttok == MBEXTTOK_CLASS)
1293 +             addtok(setcodeset(2));
1294 +           else
1295 +             addtok(setcodeset(6));
1296 +           addtok(CAT);
1297 +           addtok(OR);
1298 +         }
1299 +       }
1300 +       break;
1301 +      default:
1302 +       break;
1303 +      }
1304 +    tok = lex();
1305 +  }
1306 +  else if ((tok >= 0 && tok < NOTCHAR) || tok >= CSET || tok == BACKREF
1307        || tok == BEGLINE || tok == ENDLINE || tok == BEGWORD
1308        || tok == ENDWORD || tok == LIMWORD || tok == NOTLIMWORD)
1309 @@ -1904,4 +2145,6 @@
1310  
1311    d->musts = 0;
1312 +
1313 +  bzero(cs_tok, sizeof cs_tok);
1314  }
1315  
1316 @@ -1916,8 +2159,8 @@
1317    if (case_fold)       /* dummy folding in service of dfamust() */
1318      {
1319 -      char *copy;
1320 +      char *copy, *p;
1321        int i;
1322  
1323 -      copy = malloc(len);
1324 +      p = copy = malloc(len + 7);
1325        if (!copy)
1326         dfaerror("out of memory");
1327 @@ -1925,23 +2168,61 @@
1328        /* This is a kludge. */
1329        case_fold = 0;
1330 +      if (current_mbctype != MBCTYPE_ASCII && searchflag) {
1331 +       *p++ = '^';
1332 +       *p++ = '.';
1333 +       *p++ = '*';
1334 +       if (!(syntax_bits & RE_NO_BK_PARENS))
1335 +         *p++ = '\\';
1336 +       *p++ = '(';
1337 +      }
1338        for (i = 0; i < len; ++i)
1339         if (ISUPPER(s[i]))
1340 -         copy[i] = tolower(s[i]);
1341 +         *p++ = tolower((unsigned char)s[i]);
1342         else
1343 -         copy[i] = s[i];
1344 +         *p++ = s[i];
1345 +      if (current_mbctype != MBCTYPE_ASCII && searchflag) {
1346 +       if (!(syntax_bits & RE_NO_BK_PARENS))
1347 +         *p++ = '\\';
1348 +       *p++ = ')';
1349 +      }
1350  
1351        dfainit(d);
1352 -      dfaparse(copy, len, d);
1353 -      free(copy);
1354 +      dfaparse(copy, p - copy, d);
1355        dfamust(d);
1356        d->cindex = d->tindex = d->depth = d->nleaves = d->nregexps = 0;
1357 +      bzero(cs_tok, sizeof cs_tok);
1358        case_fold = 1;
1359 -      dfaparse(s, len, d);
1360 +      if (current_mbctype != MBCTYPE_ASCII && searchflag) {
1361 +       bcopy(s, copy + (syntax_bits & RE_NO_BK_PARENS ? 4 : 5), len);
1362 +       dfaparse(copy, p - copy, d);
1363 +      }
1364 +      else
1365 +       dfaparse(s, len, d);
1366        dfaanalyze(d, searchflag);
1367 +      free(copy);
1368      }
1369    else
1370      {
1371          dfainit(d);
1372 -        dfaparse(s, len, d);
1373 +       if (current_mbctype != MBCTYPE_ASCII && searchflag) {
1374 +         char *copy, *p;
1375 +
1376 +         p = copy = malloc(len + 7);
1377 +         *p++ = '^';
1378 +         *p++ = '.';
1379 +         *p++ = '*';
1380 +         if (!(syntax_bits & RE_NO_BK_PARENS))
1381 +           *p++ = '\\';
1382 +         *p++ = '(';
1383 +         bcopy(s, p, len);
1384 +         p += len;
1385 +         if (!(syntax_bits & RE_NO_BK_PARENS))
1386 +           *p++ = '\\';
1387 +         *p++ = ')';
1388 +         dfaparse(copy, p - copy, d);
1389 +         free(copy);
1390 +       }
1391 +       else
1392 +         dfaparse(s, len, d);
1393         dfamust(d);
1394          dfaanalyze(d, searchflag);
1395 diff -ru2N grep-2.0/dfa.h grep+mb1.04/dfa.h
1396 --- grep-2.0/dfa.h      Mon Apr 12 06:17:22 1993
1397 +++ grep+mb1.04/dfa.h   Wed Jul  7 17:02:13 1993
1398 @@ -15,4 +15,6 @@
1399     along with this program; if not, write to the Free Software
1400     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
1401 +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
1402 +   Last change: Jul. 7, 1993 by t^2  */
1403  
1404  /* Written June, 1988 by Mike Haertel */
1405 @@ -306,5 +308,5 @@
1406  /* dfasyntax() takes two arguments; the first sets the syntax bits described
1407     earlier in this file, and the second sets the case-folding flag. */
1408 -extern void dfasyntax(int, int);
1409 +extern void dfasyntax(unsigned long, int);
1410  
1411  /* Compile the given string of the given length into the given struct dfa.
1412 diff -ru2N grep-2.0/getpagesize.h grep+mb1.04/getpagesize.h
1413 --- grep-2.0/getpagesize.h      Fri May 21 14:18:58 1993
1414 +++ grep+mb1.04/getpagesize.h   Sat Jul 10 02:19:10 1993
1415 @@ -1,2 +1,4 @@
1416 +/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
1417 +   Last change: Jul. 10, 1993 by t^2  */
1418  #ifdef BSD
1419  #ifndef BSD4_1
1420 @@ -35,5 +37,9 @@
1421  #endif /* no EXEC_PAGESIZE */
1422  #else /* !HAVE_SYS_PARAM_H */
1423 +#ifndef MSDOS
1424  #define getpagesize() 8192     /* punt totally */
1425 +#else
1426 +#define getpagesize() 4096
1427 +#endif
1428  #endif /* !HAVE_SYS_PARAM_H */
1429  #endif /* no _SC_PAGESIZE */
1430 diff -ru2N grep-2.0/grep.c grep+mb1.04/grep.c
1431 --- grep-2.0/grep.c     Sun May 23 14:52:52 1993
1432 +++ grep+mb1.04/grep.c  Thu Jun  2 17:01:53 1994
1433 @@ -17,4 +17,6 @@
1434  
1435     Written July 1992 by Mike Haertel.  */
1436 +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
1437 +   Last change: Jun. 2, 1994 by t^2  */
1438  
1439  #include <errno.h>
1440 @@ -22,6 +24,8 @@
1441  
1442  #ifndef errno
1443 +#ifndef MSDOS
1444  extern int errno;
1445  #endif
1446 +#endif
1447  
1448  #ifdef STDC_HEADERS
1449 @@ -59,4 +63,5 @@
1450  #include "getpagesize.h"
1451  #include "grep.h"
1452 +#include "mbc.h"
1453  
1454  #undef MAX
1455 @@ -315,6 +320,6 @@
1456    cc = read(bufdesc, buffer + bufsalloc, bufalloc - bufsalloc);
1457  #endif
1458 -  if (cc > 0)
1459 -    buflim = buffer + bufsalloc + cc;
1460 +  if (cc != -1)
1461 +    buflim = buffer + bufsalloc + (unsigned)cc;
1462    else
1463      buflim = buffer + bufsalloc;
1464 @@ -332,10 +337,10 @@
1465  
1466  /* Internal variables to keep track of byte count, context, etc. */
1467 -static size_t totalcc;         /* Total character count before bufbeg. */
1468 +static unsigned long totalcc;  /* Total character count before bufbeg. */
1469  static char *lastnl;           /* Pointer after last newline counted. */
1470  static char *lastout;          /* Pointer after last character output;
1471                                    NULL if no character has been output
1472                                    or if it's conceptually before bufbeg. */
1473 -static size_t totalnl;         /* Total newline count before lastnl. */
1474 +static unsigned long totalnl;  /* Total newline count before lastnl. */
1475  static int pending;            /* Pending lines of output. */
1476  
1477 @@ -363,5 +368,5 @@
1478      {
1479        nlscan(beg);
1480 -      printf("%d%c", ++totalnl, sep);
1481 +      printf("%lu%c", ++totalnl, sep);
1482        lastnl = lim;
1483      }
1484 @@ -519,5 +524,5 @@
1485    for (;;)
1486      {
1487 -      if (fillbuf(save) < 0)
1488 +      if (fillbuf(save) == -1)
1489         {
1490           error(filename, errno);
1491 @@ -564,8 +569,10 @@
1492  }
1493  
1494 -static char version[] = "GNU grep version 2.0";
1495 +static char version[] = "GNU grep version 2.0\
1496 + + multi-byte extension 1.04";
1497  
1498  #define USAGE \
1499 -  "usage: %s [-[[AB] ]<num>] [-[CEFGVchilnqsvwx]] [-[ef]] <expr> [<files...>]\n"
1500 +  "usage: %s [-[[AB] ]<num>] [-[CEFGVchilnqsvwx]] [-W ctype=...]\n\
1501 +            [-[ef]] <expr> [<files...>]\n"
1502  
1503  static void
1504 @@ -594,4 +601,32 @@
1505  }  
1506  
1507 +#ifndef HAVE_STRCASECMP
1508 +
1509 +static int
1510 +#ifdef __STDC__
1511 +strcasecmp(const char *s1, const char *s2)
1512 +#else
1513 +strcasecmp(s1, s2)
1514 +     char *s1, *s2;
1515 +#endif
1516 +{
1517 +  unsigned char c1, c2;
1518 +
1519 +  while ((c1 = *s1++)) {
1520 +    if ((unsigned char)(c1 - 'A') <= (unsigned char)('Z' - 'A'))
1521 +      c1 += 'a' - 'A';
1522 +    c2 = *s2++;
1523 +    if ((unsigned char)(c2 - 'A') <= (unsigned char)('Z' - 'A'))
1524 +      c2 += 'a' - 'A';
1525 +    if (c1 != c2) {
1526 +      --s2;
1527 +      break;
1528 +    }
1529 +  }
1530 +  return c1 - (unsigned char)*s2;
1531 +}
1532 +
1533 +#endif
1534 +
1535  int
1536  main(argc, argv)
1537 @@ -607,7 +642,27 @@
1538    extern int optind;
1539  
1540 -  prog = argv[0];
1541 -  if (prog && strrchr(prog, '/'))
1542 -    prog = strrchr(prog, '/') + 1;
1543 +  if ((prog = argv[0]) && prog[0]) {
1544 +    char c, *p;
1545 +#ifdef MSDOS
1546 +    static char progname[8 + 1];
1547 +#endif
1548 +
1549 +    for (p = prog; (c = *p++); )
1550 +      if (c == '/'
1551 +#ifdef MSDOS
1552 +         || c == '\\' || c == ':'
1553 +#endif
1554 +         )
1555 +       prog = p;
1556 +#ifdef MSDOS
1557 +    for (p = progname; p < &progname[8] && (c = *prog++) && c != '.'; ) {
1558 +      if ((unsigned char)(c - 'A') <= (unsigned char)('Z' - 'A'))
1559 +       c += 'a' - 'A';
1560 +      *p++ = c;
1561 +    }
1562 +    *p++ = '\0';
1563 +    prog = argv[0] = progname;
1564 +#endif
1565 +  }
1566  
1567    keys = NULL;
1568 @@ -620,5 +675,5 @@
1569    matcher = NULL;
1570  
1571 -  while ((opt = getopt(argc, argv, "0123456789A:B:CEFGVX:bce:f:hiLlnqsvwxy"))
1572 +  while ((opt = getopt(argc, argv, "0123456789A:B:CEFGVX:bce:f:hiLlnqsvwxyW:"))
1573          != EOF)
1574      switch (opt)
1575 @@ -747,4 +802,19 @@
1576        case 'x':
1577         match_lines = 1;
1578 +       break;
1579 +      case 'W':
1580 +       if (strcasecmp(optarg, "ctype=ASCII") == 0) {
1581 +         mbcinit(MBCTYPE_ASCII);
1582 +         break;
1583 +       }
1584 +       if (strcasecmp(optarg, "ctype=EUC") == 0) {
1585 +         mbcinit(MBCTYPE_EUC);
1586 +         break;
1587 +       }
1588 +       if (strcasecmp(optarg, "ctype=SJIS") == 0) {
1589 +         mbcinit(MBCTYPE_SJIS);
1590 +         break;
1591 +       }
1592 +       fatal("unknown argument to -Wctype", 0);
1593         break;
1594        default:
1595 diff -ru2N grep-2.0/kwset.c grep+mb1.04/kwset.c
1596 --- grep-2.0/kwset.c    Mon May  3 04:26:20 1993
1597 +++ grep+mb1.04/kwset.c Fri Jul  9 14:54:46 1993
1598 @@ -19,4 +19,6 @@
1599     The author may be reached (Email) at the address mike@ai.mit.edu,
1600     or (US mail) as Mike Haertel c/o Free Software Foundation. */
1601 +/* Multi-byte extension added Jul, 1993 by t^2 (Takahiro Tanimoto)
1602 +   Last change: Jul. 9, 1993 by t^2  */
1603  
1604  /* The algorithm implemented by these routines bears a startling resemblence
1605 @@ -592,5 +594,5 @@
1606        if (d != 0)
1607         continue;
1608 -      if (tp[-2] == gc)
1609 +      if (U(tp[-2]) == gc)
1610         {
1611           for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i)
1612 diff -ru2N grep-2.0/mbc.c grep+mb1.04/mbc.c
1613 --- grep-2.0/mbc.c      Thu Jan  1 09:00:00 1970
1614 +++ grep+mb1.04/mbc.c   Fri Jul  9 14:38:28 1993
1615 @@ -0,0 +1,98 @@
1616 +/* Functions for multi-byte support.
1617 +   Created for grep multi-byte extension Jul., 1993 by t^2 (Takahiro Tanimoto)
1618 +   Last change: Jul. 9, 1993 by t^2  */
1619 +#include "mbc.h"
1620 +
1621 +static const unsigned char mbctab_ascii[] = {
1622 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1623 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1624 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1625 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1626 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1627 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1628 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1629 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1630 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1631 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1632 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1633 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1634 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1635 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1636 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1637 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1638 +};
1639 +
1640 +static const unsigned char mbctab_euc[] = {
1641 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1642 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1643 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1644 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1645 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1646 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1647 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1648 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1649 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1650 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1651 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1652 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1653 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1654 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1655 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1656 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
1657 +};
1658 +
1659 +static const unsigned char mbctab_sjis[] = {
1660 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1661 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1662 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1663 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1664 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1665 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1666 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1667 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1668 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1669 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1670 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1671 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1672 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1673 +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1674 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1675 +  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
1676 +};
1677 +
1678 +#ifdef EUC
1679 +const unsigned char *mbctab = mbctab_euc;
1680 +int current_mbctype = MBCTYPE_EUC;
1681 +#else
1682 +#ifdef SJIS
1683 +const unsigned char *mbctab = mbctab_sjis;
1684 +int current_mbctype = MBCTYPE_SJIS;
1685 +#else
1686 +const unsigned char *mbctab = mbctab_ascii;
1687 +int current_mbctype = MBCTYPE_ASCII;
1688 +#endif
1689 +#endif
1690 +
1691 +void
1692 +#ifdef __STDC__
1693 +mbcinit(int mbctype)
1694 +#else
1695 +mbcinit(mbctype)
1696 +     int mbctype;
1697 +#endif
1698 +{
1699 +  switch (mbctype) {
1700 +  case MBCTYPE_ASCII:
1701 +    mbctab = mbctab_ascii;
1702 +    current_mbctype = MBCTYPE_ASCII;
1703 +    break;
1704 +  case MBCTYPE_EUC:
1705 +    mbctab = mbctab_euc;
1706 +    current_mbctype = MBCTYPE_EUC;
1707 +    break;
1708 +  case MBCTYPE_SJIS:
1709 +    mbctab = mbctab_sjis;
1710 +    current_mbctype = MBCTYPE_SJIS;
1711 +    break;
1712 +  }
1713 +}
1714 diff -ru2N grep-2.0/mbc.h grep+mb1.04/mbc.h
1715 --- grep-2.0/mbc.h      Thu Jan  1 09:00:00 1970
1716 +++ grep+mb1.04/mbc.h   Fri Jul  9 14:40:03 1993
1717 @@ -0,0 +1,38 @@
1718 +#ifndef MBC_H
1719 +#define MBC_H 1
1720 +/* Definitions for multi-byte support.
1721 +   Created for grep multi-byte extension Jul., 1993 by t^2 (Takahiro Tanimoto)
1722 +   Last change: Jul. 9, 1993 by t^2  */
1723 +
1724 +#ifndef const
1725 +#ifndef __STDC__
1726 +#ifdef __GNUC__
1727 +#define const __const__
1728 +#define volatile __volatile__
1729 +#else
1730 +#define const
1731 +#define volatile
1732 +#endif
1733 +#endif
1734 +#endif
1735 +
1736 +#ifndef _
1737 +#ifdef __STDC__
1738 +#define _(x) x
1739 +#else
1740 +#define _(x) ()
1741 +#endif
1742 +#endif
1743 +
1744 +#define MBCTYPE_ASCII 0
1745 +#define MBCTYPE_EUC 1
1746 +#define MBCTYPE_SJIS 2
1747 +
1748 +extern const unsigned char *mbctab;
1749 +extern int current_mbctype;
1750 +
1751 +void mbcinit _((int));
1752 +
1753 +#define ismbchar(c) mbctab[(unsigned char)c]
1754 +
1755 +#endif /* !MBC_H */
1756 diff -ru2N grep-2.0/obstack.h grep+mb1.04/obstack.h
1757 --- grep-2.0/obstack.h  Sat May 22 11:55:23 1993
1758 +++ grep+mb1.04/obstack.h       Sat Jul 10 04:47:06 1993
1759 @@ -15,4 +15,6 @@
1760  along with this program; if not, write to the Free Software
1761  Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
1762 +/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
1763 +   Last change: Jul. 10, 1993 by t^2  */
1764  
1765  /* Summary:
1766 @@ -136,4 +138,5 @@
1767  #endif
1768  
1769 +#ifndef PTR_INT_TYPE
1770  #ifdef __STDC__
1771  #define PTR_INT_TYPE ptrdiff_t
1772 @@ -141,4 +144,5 @@
1773  #define PTR_INT_TYPE long
1774  #endif
1775 +#endif
1776  
1777  struct _obstack_chunk          /* Lives at front of each chunk. */
1778 @@ -151,5 +155,5 @@
1779  struct obstack         /* control current object in current chunk */
1780  {
1781 -  long chunk_size;             /* preferred size to allocate chunks in */
1782 +  unsigned chunk_size;         /* preferred size to allocate chunks in */
1783    struct _obstack_chunk* chunk;        /* address of current struct obstack_chunk */
1784    char *object_base;           /* address of object we are building */
1785 diff -ru2N grep-2.0/regex.c grep+mb1.04/regex.c
1786 --- grep-2.0/regex.c    Fri May 21 14:11:40 1993
1787 +++ grep+mb1.04/regex.c Thu Aug 19 04:37:03 1993
1788 @@ -19,4 +19,6 @@
1789     along with this program; if not, write to the Free Software
1790     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
1791 +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
1792 +   Last change: Aug. 19, 1993 by t^2  */
1793  
1794  /* AIX requires this to be the first thing in the file. */
1795 @@ -54,6 +56,33 @@
1796  #define bcmp(s1, s2, n)        memcmp ((s1), (s2), (n))
1797  #endif
1798 +#ifdef HAVE_MEMMOVE
1799  #ifndef bcopy
1800 -#define bcopy(s, d, n) memcpy ((d), (s), (n))
1801 +#define bcopy(s, d, n) memmove ((d), (s), (n))
1802 +#endif
1803 +#else
1804 +#ifndef HAVE_BCOPY
1805 +static void
1806 +#ifdef __STDC__
1807 +bcopy (const void *s0, void *d0, size_t n)
1808 +#else
1809 +bcopy (s, d, n)
1810 +     const void *s0;
1811 +     void *d;
1812 +     size_t n;
1813 +#endif
1814 +{
1815 +  const char *s = s0;
1816 +  char *d = d0;
1817 +
1818 +  if (s < d) {
1819 +    s += n, d += n;
1820 +    while (n--)
1821 +      *--d = *--s;
1822 +  }
1823 +  else
1824 +    while (n--)
1825 +      *d++ = *s++;
1826 +}
1827 +#endif
1828  #endif
1829  #ifndef bzero
1830 @@ -124,4 +153,5 @@
1831  /* Get the interface, including the syntax bits.  */
1832  #include "regex.h"
1833 +#include "mbc.h"
1834  
1835  /* isalpha etc. are used for the character classes.  */
1836 @@ -462,4 +492,19 @@
1837  
1838  #endif /* DEBUG */
1839 +
1840 +#define STORE_MBC(p, c) \
1841 +  ((p)[0] = (unsigned char) ((c) >> 8), (p)[1] = (unsigned char) (c))
1842 +#define STORE_MBC_AND_INCR(p, c) \
1843 +  (*(p)++ = (unsigned char) ((c) >> 8), *(p)++ = (unsigned char) (c))
1844 +
1845 +#define EXTRACT_MBC(p) \
1846 +  ((unsigned char) (p)[0] << 8 | (unsigned char) (p)[1])
1847 +#define EXTRACT_MBC_AND_INCR(p) \
1848 +  ((p) += 2, (unsigned char) (p)[-2] << 8 | (unsigned char) (p)[-1])
1849 +
1850 +#define EXTRACT_UNSIGNED(p) \
1851 +  ((unsigned char) (p)[0] | (unsigned char) (p)[1] << 8)
1852 +#define EXTRACT_UNSIGNED_AND_INCR(p) \
1853 +  ((p) += 2, (unsigned char) (p)[-2] | (unsigned char) (p)[-1] << 8)
1854  \f
1855  /* If DEBUG is defined, Regex prints many voluminous messages about what
1856 @@ -558,4 +603,8 @@
1857             {
1858                putchar ('/');
1859 +             if (ismbchar (*p) && 2 <= mcnt) {
1860 +               printf ("/%.2s", (char *) p), p += 2, --mcnt;
1861 +               continue;
1862 +             }
1863               printchar (*p++);
1864              }
1865 @@ -618,7 +667,14 @@
1866               printchar (last);
1867  
1868 -           putchar (']');
1869 -
1870             p += 1 + *p;
1871 +           {
1872 +             unsigned short i, size;
1873 +
1874 +             size = EXTRACT_UNSIGNED_AND_INCR (p);
1875 +             for (i = 0; i < size; i++)
1876 +               printf ("%.2s-%.2s", (char *) p, (char *) p + 2),
1877 +               p += 4;
1878 +           }
1879 +           putchar (']');
1880           }
1881           break;
1882 @@ -779,5 +835,5 @@
1883    printf ("not_bol: %d\t", bufp->not_bol);
1884    printf ("not_eol: %d\t", bufp->not_eol);
1885 -  printf ("syntax: %d\n", bufp->syntax);
1886 +  printf ("syntax: %lu\n", bufp->syntax);
1887    /* Perhaps we should print the translate table?  */
1888  }
1889 @@ -878,5 +934,7 @@
1890  static boolean at_begline_loc_p (), at_endline_loc_p ();
1891  static boolean group_in_compile_stack ();
1892 +#if 0
1893  static reg_errcode_t compile_range ();
1894 +#endif
1895  
1896  /* Fetch the next character in the uncompiled pattern---translating it 
1897 @@ -887,5 +945,6 @@
1898    do {if (p == pend) return REG_EEND;                                  \
1899      c = (unsigned char) *p++;                                          \
1900 -    if (translate) c = translate[c];                                   \
1901 +    if (translate && !ismbchar (c))                                    \
1902 +      c = (unsigned char) translate[(unsigned char) c];                        \
1903    } while (0)
1904  
1905 @@ -905,5 +964,7 @@
1906     `char *', to avoid warnings when a string constant is passed.  But
1907     when we use a character as a subscript we must make it unsigned.  */
1908 -#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
1909 +#define TRANSLATE(d) (translate                                                \
1910 +                     ? (unsigned char) translate[(unsigned char) (d)]  \
1911 +                     : (d))
1912  
1913  
1914 @@ -1075,4 +1136,159 @@
1915      || STREQ (string, "cntrl") || STREQ (string, "blank"))
1916  \f
1917 +/* Handle charset(_not)?.
1918 +
1919 +   Structure of charset(_not)? in compiled pattern.
1920 +
1921 +     struct {
1922 +       unsinged char id;               charset(_not)?
1923 +       unsigned char sbc_size;
1924 +       unsigned char sbc_map[sbc_size];        same as original up to here.
1925 +       unsigned short mbc_size;                number of intervals.
1926 +       struct {
1927 +        unsigned short beg;            beginning of interval.
1928 +        unsigned short end;            end of interval.
1929 +       } intervals[mbc_size];
1930 +     }; */
1931 +
1932 +static reg_errcode_t
1933 +#ifdef __STDC__
1934 +set_list_bits (unsigned short c1, unsigned short c2,
1935 +              reg_syntax_t syntax, unsigned char *b, const char *translate)
1936 +#else
1937 +set_list_bits (c1, c2, syntax, b, translate)
1938 +     unsigned short c1, c2;
1939 +     reg_syntax_t syntax;
1940 +     unsigned char *b;
1941 +     const char *translate;
1942 +#endif
1943 +{
1944 +  unsigned char sbc_size = b[-1];
1945 +  unsigned short mbc_size = EXTRACT_UNSIGNED (&b[sbc_size]);
1946 +  unsigned short beg, end, upb;
1947 +
1948 +  if (c1 > c2)
1949 +    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
1950 +  if (c1 < 1 << BYTEWIDTH) {
1951 +    upb = c2;
1952 +    if (1 << BYTEWIDTH <= upb)
1953 +      upb = (1 << BYTEWIDTH) - 1;      /* The last single-byte char */
1954 +    if (sbc_size <= upb / BYTEWIDTH) {
1955 +      /* Allocate maximum size so it never happens again.  */
1956 +      /* NOTE: memcpy() would not work here.  */
1957 +      bcopy (&b[sbc_size], &b[(1 << BYTEWIDTH) / BYTEWIDTH], 2 + mbc_size*4);
1958 +      bzero (&b[sbc_size], (1 << BYTEWIDTH) / BYTEWIDTH - sbc_size);
1959 +      b[-1] = sbc_size = (1 << BYTEWIDTH) / BYTEWIDTH;
1960 +    }
1961 +    if (!translate) {
1962 +      for (; c1 <= upb; c1++)
1963 +       if (!ismbchar (c1))
1964 +         SET_LIST_BIT (c1);
1965 +    }
1966 +    else
1967 +      for (; c1 <= upb; c1++)
1968 +       if (!ismbchar (c1))
1969 +         SET_LIST_BIT (TRANSLATE (c1));
1970 +    if (c2 < 1 << BYTEWIDTH)
1971 +      return REG_NOERROR;
1972 +    c1 = 0x8000;                       /* The first wide char */
1973 +  }
1974 +  b = &b[sbc_size + 2];
1975 +
1976 +  /*                             intervals[beg]
1977 +         \e$B!|\e(B----------\e$B!|\e(B          \e$B!|\e(B----------\e$B!|\e(B
1978 +                         c1
1979 +                       \e$B!{\e(B----------------------\e$B!|\e(B
1980 +
1981 +     \e$B>e?^$N$h$&$J6h4V$N%$%s%G%C%/%9\e(B beg \e$B$r7hDj$9$k\e(B. */
1982 +  for (beg = 0, upb = mbc_size; beg < upb; ) {
1983 +    unsigned short mid = (beg + upb) >> 1;
1984 +
1985 +    if (c1 - 1 > EXTRACT_MBC (&b[mid*4 + 2]))
1986 +      beg = mid + 1;
1987 +    else
1988 +      upb = mid;
1989 +  }
1990 +
1991 +  /*                        intervals[end]
1992 +           \e$B!|\e(B-------\e$B!|\e(B      \e$B!|\e(B----------\e$B!|\e(B
1993 +                        c2
1994 +         \e$B!|\e(B---------------\e$B!{\e(B
1995 +
1996 +     \e$B>e?^$N$h$&$J6h4V$N%$%s%G%C%/%9\e(B end \e$B$r7hDj$9$k\e(B. */
1997 +  for (end = beg, upb = mbc_size; end < upb; ) {
1998 +    unsigned short mid = (end + upb) >> 1;
1999 +
2000 +    if (c2 >= EXTRACT_MBC (&b[mid*4]) - 1)
2001 +      end = mid + 1;
2002 +    else
2003 +      upb = mid;
2004 +  }
2005 +
2006 +  if (beg != end) {
2007 +    /* \e$B4{B8$N6h4V$r>/$J$/$H$b\e(B1\e$B$DE}9g$9$k>l9g\e(B,
2008 +       \e$B6h4V$N;OE@\e(B, \e$B=*E@$r=$@5$9$k\e(B. */
2009 +    if (c1 > EXTRACT_MBC (&b[beg*4]))
2010 +      c1 = EXTRACT_MBC (&b[beg*4]);
2011 +    if (c2 < EXTRACT_MBC (&b[end*4 - 2]))
2012 +      c2 = EXTRACT_MBC (&b[end*4 - 2]);
2013 +  }
2014 +  if (end < mbc_size && end != beg + 1)
2015 +    /* \e$BDI2C$5$l$k6h4V$N8e$m$K4{B8$N6h4V$r0\F0$9$k\e(B. */
2016 +    /* NOTE: memcpy() would not work here.  */
2017 +    bcopy (&b[end*4], &b[(beg + 1)*4], (mbc_size - end)*4);
2018 +  STORE_MBC (&b[beg*4 + 0], c1);
2019 +  STORE_MBC (&b[beg*4 + 2], c2);
2020 +  mbc_size += beg + 1 - end;
2021 +  STORE_NUMBER (&b[-2], mbc_size);
2022 +  return REG_NOERROR;
2023 +}
2024 +
2025 +static int
2026 +#ifdef __STDC__
2027 +is_in_list (unsigned short c, const unsigned char *b)
2028 +#else
2029 +is_in_list (c, b)
2030 +     unsigned short c;
2031 +     const unsigned char *b;
2032 +#endif
2033 +{
2034 +  unsigned short size;
2035 +  int in = (re_opcode_t) b[-1] == charset_not;
2036 +
2037 +  size = *b++;
2038 +  if (c < 1 << BYTEWIDTH) {
2039 +    if (c / BYTEWIDTH < size && b[c / BYTEWIDTH] & 1 << c % BYTEWIDTH)
2040 +      in = !in;
2041 +  }
2042 +  else {
2043 +    unsigned short i, j;
2044 +
2045 +    b += size + 2;
2046 +    size = EXTRACT_UNSIGNED (&b[-2]);
2047 +
2048 +    /*                        intervals[i]
2049 +             \e$B!|\e(B-------\e$B!|\e(B      \e$B!|\e(B--------\e$B!|\e(B
2050 +                        c
2051 +                      \e$B!{\e(B----------------\e$B!|\e(B
2052 +
2053 +     \e$B>e?^$N$h$&$J6h4V$N%$%s%G%C%/%9\e(B i \e$B$r7hDj$9$k\e(B. */
2054 +    for (i = 0, j = size; i < j; ) {
2055 +      unsigned short k = (i + j) >> 1;
2056 +
2057 +      if (c > EXTRACT_MBC (&b[k*4 + 2]))
2058 +       i = k + 1;
2059 +      else
2060 +       j = k;
2061 +    }
2062 +    if (i < size && EXTRACT_MBC (&b[i*4]) <= c
2063 +       /* [...] \e$B$+$i\e(B, \e$BL58z$J%^%k%A%P%$%HJ8;z$r=|30$9$k\e(B.  \e$B$3$3$G$O4JC1$N\e(B
2064 +          \e$B$?$a#2%P%$%HL\$,\e(B '\n' \e$B$^$?$O\e(B '\0' \e$B$@$1$rL58z$H$7$?\e(B.  [^...] 
2065 +          \e$B$N>l9g$O\e(B, \e$B5U$KL58z$J%^%k%A%P%$%HJ8;z$r%^%C%A$5$;$k\e(B.  */
2066 +       && ((unsigned char) c != '\n' && (unsigned char) c != '\0'))
2067 +      in = !in;
2068 +  }
2069 +  return in;
2070 +}
2071 +\f
2072  /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
2073     Returns one of error codes defined in `regex.h', or zero for success.
2074 @@ -1385,4 +1601,6 @@
2075            {
2076              boolean had_char_class = false;
2077 +           unsigned short c, c1;
2078 +           int last_char = -1;
2079  
2080              if (p == pend) return REG_EBRACK;
2081 @@ -1390,5 +1608,6 @@
2082              /* Ensure that we have enough space to push a charset: the
2083                 opcode, the length count, and the bitset; 34 bytes in all.  */
2084 -           GET_BUFFER_SPACE (34);
2085 +           /* + 2 + 4 for mbcharset(_not)? with just one interval.  */
2086 +           GET_BUFFER_SPACE (34 + 2 + 4);
2087  
2088              laststart = b;
2089 @@ -1407,5 +1626,5 @@
2090  
2091              /* Clear the whole map.  */
2092 -            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
2093 +           bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH + 2);
2094  
2095              /* charset_not matches newline according to a syntax bit.  */
2096 @@ -1417,7 +1636,14 @@
2097              for (;;)
2098                {
2099 +               int size;
2100 +
2101                  if (p == pend) return REG_EBRACK;
2102  
2103 -                PATFETCH (c);
2104 +               if ((size = EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])))
2105 +                 /* Ensure the space is enough to hold another interval
2106 +                    of multi-byte chars in charset(_not)?.  */
2107 +                 GET_BUFFER_SPACE (32 + 2 + size*4 + 4);
2108 +
2109 +               PATFETCH_RAW (c);
2110  
2111                  /* \ might escape characters inside [...] and [^...].  */
2112 @@ -1426,6 +1652,16 @@
2113                      if (p == pend) return REG_EESCAPE;
2114  
2115 -                    PATFETCH (c1);
2116 -                    SET_LIST_BIT (c1);
2117 +                   PATFETCH_RAW (c1);
2118 +                   if (ismbchar (c1)) {
2119 +                     unsigned char c2;
2120 +
2121 +                     PATFETCH_RAW (c2);
2122 +                     c1 = c1 << 8 | c2;
2123 +                     (void) set_list_bits (c1, c1, syntax, b, translate);
2124 +                     last_char = c1;
2125 +                     continue;
2126 +                   }
2127 +                   SET_LIST_BIT (TRANSLATE (c1));
2128 +                   last_char = c1;
2129                      continue;
2130                    }
2131 @@ -1442,4 +1678,11 @@
2132                    return REG_ERANGE;
2133  
2134 +               if (ismbchar (c)) {
2135 +                 unsigned char c2;
2136 +
2137 +                 PATFETCH_RAW (c2);
2138 +                 c = c << 8 | c2;
2139 +               }
2140 +
2141                  /* Look ahead to see if it's a range when the last thing
2142                     was a character: if this is a hyphen not at the
2143 @@ -1447,10 +1690,25 @@
2144                     operator.  */
2145                  if (c == '-' 
2146 +#if 0 /* The original was: */
2147                      && !(p - 2 >= pattern && p[-2] == '[') 
2148                      && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
2149 +#else /* I wonder why he did not write like this.
2150 +        Have we got any problems?  */
2151 +                   && p != p1 + 1
2152 +#endif
2153                      && *p != ']')
2154                    {
2155 -                    reg_errcode_t ret
2156 -                      = compile_range (&p, pend, translate, syntax, b);
2157 +                   reg_errcode_t ret;
2158 +
2159 +                   assert (last_char >= 0);
2160 +                   PATFETCH_RAW (c1);
2161 +                   if (ismbchar (c1)) {
2162 +                     unsigned char c2;
2163 +
2164 +                     PATFETCH_RAW (c2);
2165 +                     c1 = c1 << 8 | c2;
2166 +                   }
2167 +                   ret = set_list_bits (last_char, c1, syntax, b, translate);
2168 +                   last_char = c1;
2169                      if (ret != REG_NOERROR) return ret;
2170                    }
2171 @@ -1461,7 +1719,15 @@
2172  
2173                     /* Move past the `-'.  */
2174 -                    PATFETCH (c1);
2175 -                    
2176 -                    ret = compile_range (&p, pend, translate, syntax, b);
2177 +                   PATFETCH_RAW (c1);
2178 +
2179 +                   PATFETCH_RAW (c1);
2180 +                   if (ismbchar (c1)) {
2181 +                     unsigned char c2;
2182 +
2183 +                     PATFETCH_RAW (c2);
2184 +                     c1 = c1 << 8 | c2;
2185 +                   }
2186 +                   ret = set_list_bits (c, c1, syntax, b, translate);
2187 +                   last_char = c1;
2188                      if (ret != REG_NOERROR) return ret;
2189                    }
2190 @@ -1474,5 +1740,5 @@
2191                      char str[CHAR_CLASS_MAX_LENGTH + 1];
2192  
2193 -                    PATFETCH (c);
2194 +                   PATFETCH_RAW (c);
2195                      c1 = 0;
2196  
2197 @@ -1534,4 +1800,7 @@
2198                            }
2199                          had_char_class = true;
2200 +#ifdef DEBUG
2201 +                       last_char = -1;
2202 +#endif
2203                        }
2204                      else
2205 @@ -1540,7 +1809,13 @@
2206                          while (c1--)    
2207                            PATUNFETCH;
2208 +#if 0 /* The original was: */
2209                          SET_LIST_BIT ('[');
2210                          SET_LIST_BIT (':');
2211 +#else /* I think this is the right way.  */
2212 +                       SET_LIST_BIT (TRANSLATE ('['));
2213 +                       SET_LIST_BIT (TRANSLATE (':'));
2214 +#endif
2215                          had_char_class = false;
2216 +                       last_char = ':';
2217                        }
2218                    }
2219 @@ -1548,5 +1823,6 @@
2220                    {
2221                      had_char_class = false;
2222 -                    SET_LIST_BIT (c);
2223 +                   (void) set_list_bits (c, c, syntax, b, translate);
2224 +                   last_char = c;
2225                    }
2226                }
2227 @@ -1556,5 +1832,9 @@
2228              while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
2229                b[-1]--; 
2230 -            b += b[-1];
2231 +           if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH)
2232 +             bcopy (&b[(1 << BYTEWIDTH) / BYTEWIDTH], &b[b[-1]],
2233 +                    2 + EXTRACT_UNSIGNED (&b[(1 << BYTEWIDTH) / BYTEWIDTH])*4);
2234 +           b += b[-1] + 2 + EXTRACT_UNSIGNED (&b[b[-1]])*4;
2235 +           break;
2236            }
2237            break;
2238 @@ -2023,5 +2303,6 @@
2239                   not to translate; but if we don't translate it
2240                   it will never match anything.  */
2241 -              c = TRANSLATE (c);
2242 +             if (!ismbchar (c))
2243 +               c = TRANSLATE (c);
2244                goto normal_char;
2245              }
2246 @@ -2032,4 +2313,11 @@
2247          /* Expects the character in `c'.  */
2248         normal_char:
2249 +
2250 +         c1 = 0;
2251 +         if (ismbchar (c)) {
2252 +           c1 = c;
2253 +           PATFETCH_RAW (c);
2254 +         }
2255 +
2256               /* If no exactn currently being built.  */
2257            if (!pending_exact 
2258 @@ -2039,5 +2327,6 @@
2259                
2260                /* We have only one byte following the exactn for the count.  */
2261 -             || *pending_exact == (1 << BYTEWIDTH) - 1
2262 +             || *pending_exact >= (c1 ? (1 << BYTEWIDTH) - 2
2263 +                                      : (1 << BYTEWIDTH) - 1)
2264  
2265                /* If followed by a repetition operator.  */
2266 @@ -2059,4 +2348,8 @@
2267              }
2268              
2269 +         if (c1) {
2270 +           BUF_PUSH (c1);
2271 +           (*pending_exact)++;
2272 +         }
2273           BUF_PUSH (c);
2274            (*pending_exact)++;
2275 @@ -2184,5 +2477,5 @@
2276  at_endline_loc_p (p, pend, syntax)
2277      const char *p, *pend;
2278 -    int syntax;
2279 +    reg_syntax_t syntax;
2280  {
2281    const char *next = p;
2282 @@ -2220,4 +2513,5 @@
2283  
2284  
2285 +#if 0 /* We use set_list_bits() now.  */
2286  /* Read the ending character of a range (in a bracket expression) from the
2287     uncompiled pattern *P_PTR (which ends at PEND).  We assume the
2288 @@ -2275,4 +2569,5 @@
2289    return REG_NOERROR;
2290  }
2291 +#endif
2292  \f
2293  /* Failure stack declarations and macros; both re_compile_fastmap and
2294 @@ -2638,18 +2933,65 @@
2295  
2296          case charset:
2297 +         /* NOTE: Charset for single-byte chars never contain
2298 +                  multi-byte char.  See set_list_bits().  */
2299            for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
2300             if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
2301                fastmap[j] = 1;
2302 +         {
2303 +           unsigned short size;
2304 +           unsigned char c, end;
2305 +
2306 +           p += p[-1] + 2;
2307 +           size = EXTRACT_UNSIGNED (&p[-2]);
2308 +           for (j = 0; j < size; j++)
2309 +             /* set bits for 1st bytes of multi-byte chars.  */
2310 +             for (c = (unsigned char) p[j*4],
2311 +                  end = (unsigned char) p[j*4 + 2];
2312 +                  c <= end; c++)
2313 +               /* NOTE: Charset for multi-byte chars might contain
2314 +                        single-byte chars.  We must reject them. */
2315 +               if (ismbchar (c))
2316 +                 fastmap[c] = 1;
2317 +         }
2318           break;
2319  
2320  
2321         case charset_not:
2322 +         /* S: set of all single-byte chars.
2323 +            M: set of all first bytes that can start multi-byte chars.
2324 +            s: any set of single-byte chars.
2325 +            m: any set of first bytes that can start multi-byte chars.
2326 +
2327 +            We assume S+M = U.
2328 +              ___      _   _
2329 +              s+m = (S*s+M*m).  */
2330           /* Chars beyond end of map must be allowed.  */
2331 +         /* NOTE: Charset_not for single-byte chars might contain
2332 +                  multi-byte chars.  See set_list_bits(). */
2333           for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
2334 -            fastmap[j] = 1;
2335 +           if (!ismbchar (j))
2336 +             fastmap[j] = 1;
2337  
2338           for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
2339             if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
2340 -              fastmap[j] = 1;
2341 +             if (!ismbchar (j))
2342 +               fastmap[j] = 1;
2343 +         {
2344 +           unsigned short size;
2345 +           unsigned short c, beg;
2346 +
2347 +           p += p[-1] + 2;
2348 +           size = EXTRACT_UNSIGNED (&p[-2]);
2349 +           c = 0x00;
2350 +           for (j = 0; j < size; j++) {
2351 +             for (beg = (unsigned char) p[j*4 + 0]; c <= beg; c++)
2352 +               if (ismbchar (c))
2353 +                 fastmap[c] = 1;
2354 +             c = (unsigned char) p[j*4 + 2];
2355 +           }
2356 +           for (beg = 0xff; c <= beg; c++)
2357 +             if (ismbchar (c))
2358 +               fastmap[c] = 1;
2359 +         }
2360            break;
2361  
2362 @@ -2964,4 +3306,5 @@
2363               register int lim = 0;
2364               int irange = range;
2365 +             unsigned char c;
2366  
2367                if (startpos < size1 && startpos + range >= size1)
2368 @@ -2973,11 +3316,23 @@
2369                   inside the loop.  */
2370               if (translate)
2371 -                while (range > lim
2372 -                       && !fastmap[(unsigned char)
2373 -                                  translate[(unsigned char) *d++]])
2374 +               while (range > lim) {
2375 +                 c = *d++;
2376 +                 if (ismbchar (c)) {
2377 +                   if (fastmap[c])
2378 +                     break;
2379 +                   d++;
2380 +                   range -= 2;
2381 +                   continue;
2382 +                 }
2383 +                 if (fastmap[(unsigned char) translate[c]])
2384 +                   break;
2385                    range--;
2386 +               }
2387               else
2388 -                while (range > lim && !fastmap[(unsigned char) *d++])
2389 +               while (range > lim && (c = *d++, !fastmap[c])) {
2390 +                 if (ismbchar (c))
2391 +                   d++, range--;
2392                    range--;
2393 +               }
2394  
2395               startpos += irange - range;
2396 @@ -3012,11 +3367,34 @@
2397        else if (range > 0) 
2398          {
2399 -          range--; 
2400 -          startpos++;
2401 +         const char *d = ((startpos >= size1 ? string2 - size1 : string1)
2402 +                          + startpos);
2403 +
2404 +         if (ismbchar (*d)) {
2405 +           range--, startpos++;
2406 +           if (!range)
2407 +             break;
2408 +         }
2409 +          range--, startpos++;
2410          }
2411        else
2412          {
2413 -          range++; 
2414 -          startpos--;
2415 +          range++, startpos--;
2416 +         {
2417 +           const char *s, *d, *p;
2418 +
2419 +           if (startpos < size1)
2420 +             s = string1, d = string1 + startpos;
2421 +           else
2422 +             s = string2, d = string2 + startpos - size1;
2423 +           for (p = d; p-- > s && ismbchar(*p); )
2424 +             /* --p >= s \e$B$@$H\e(B 80[12]?86 \e$B$GF0$+$J$$2DG=@-$,$"$k\e(B.  (huge
2425 +                model \e$B0J30$G\e(B, s \e$B$N%*%U%;%C%H$,\e(B 0 \e$B$@$C$?>l9g\e(B.)  */
2426 +             ;
2427 +           if (!((d - p) & 1)) {
2428 +             if (!range)
2429 +               break;
2430 +             range++, startpos--;
2431 +           }
2432 +         }
2433          }
2434      }
2435 @@ -3578,6 +3956,19 @@
2436               do
2437                 {
2438 +                 unsigned char c;
2439 +
2440                   PREFETCH ();
2441 -                 if (translate[(unsigned char) *d++] != (char) *p++)
2442 +                 c = *d++;
2443 +                 if (ismbchar (c)) {
2444 +                   if (c != (unsigned char) *p++
2445 +                       || !--mcnt      /* \e$B%Q%?!<%s$,@5$7$/%3%s%Q%$%k$5\e(B
2446 +                                          \e$B$l$F$$$k8B$j\e(B, \e$B$3$N%A%'%C%/$O\e(B
2447 +                                          \e$B>iD9$@$,G0$N$?$a\e(B.  */
2448 +                       || d == dend
2449 +                       || (unsigned char) *d++ != (unsigned char) *p++)
2450 +                     goto fail;
2451 +                   continue;
2452 +                 }
2453 +                 if ((unsigned char) translate[c] != (unsigned char) *p++)
2454                      goto fail;
2455                 }
2456 @@ -3588,6 +3979,26 @@
2457               do
2458                 {
2459 +#if 0
2460 +                 /* \e$BB>$NItJ,$G$O\e(B, string1 \e$B$H\e(B string2 \e$B$K%^%k%A%P%$%HJ8;z\e(B
2461 +                    \e$B$,8Y$k$N$r5v$7$F$$$J$$\e(B.  \e$B$3$N$3$H$rB.EY$r5>@7$K$7$F\e(B
2462 +                    \e$B$b%A%'%C%/$9$k>l9g$O\e(B, \e$B$3$3$H<!$N\e(B `#if 0' \e$B$r\e(B `#if 1' 
2463 +                    \e$B$KJQ$($k$3$H\e(B.  */
2464 +                 unsigned char c;
2465 +
2466 +#endif
2467                   PREFETCH ();
2468 +#if 0
2469 +                 c = *d++;
2470 +                 if (ismbchar (c)) {
2471 +                   if (c != (unsigned char) *p++
2472 +                       || !--mcnt
2473 +                       || d == dend)
2474 +                     goto fail;
2475 +                   c = *d++;
2476 +                 }
2477 +                 if (c != (unsigned char) *p++) goto fail;
2478 +#else
2479                   if (*d++ != (char) *p++) goto fail;
2480 +#endif
2481                 }
2482               while (--mcnt);
2483 @@ -3602,4 +4013,14 @@
2484  
2485            PREFETCH ();
2486 +         if (ismbchar (*d)) {
2487 +           if (d + 1 == dend || d[1] == '\n' || d[1] == '\0')
2488 +             /* \e$BL58z$J%^%k%A%P%$%HJ8;z$K$O%^%C%A$5$;$J$$\e(B.  \e$B$3$3$G$O\e(B, \e$B4J\e(B
2489 +                \e$BC1$N$?$a#2%P%$%HL\$,\e(B '\n', '\0' \e$B$N$b$N$@$1$rL58z$H$9$k\e(B.  */
2490 +             goto fail;
2491 +           SET_REGS_MATCHED ();
2492 +           DEBUG_PRINT2 ("  Matched `%d'.\n", EXTRACT_MBC (&d[0]));
2493 +           d += 2;
2494 +           break;
2495 +         }
2496  
2497            if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
2498 @@ -3616,19 +4037,23 @@
2499         case charset_not:
2500           {
2501 -           register unsigned char c;
2502 -           boolean not = (re_opcode_t) *(p - 1) == charset_not;
2503 +           register unsigned short c;
2504 +           boolean not;
2505  
2506 -            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
2507 +           DEBUG_PRINT2 ("EXECUTING charset%s.\n",
2508 +                         (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
2509  
2510             PREFETCH ();
2511 -           c = TRANSLATE (*d); /* The character to match.  */
2512 +           c = (unsigned char) *d;
2513 +           if (ismbchar (c)) {
2514 +             c <<= 8;
2515 +             if (d + 1 != dend)
2516 +               c |= (unsigned char) d[1];
2517 +           }
2518 +           else
2519 +             c = TRANSLATE (c); /* The character to match.  */
2520  
2521 -            /* Cast to `unsigned' instead of `unsigned char' in case the
2522 -               bit list is a full 32 bytes long.  */
2523 -           if (c < (unsigned) (*p * BYTEWIDTH)
2524 -               && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
2525 -             not = !not;
2526 +           not = is_in_list (c, p);
2527  
2528 -           p += 1 + *p;
2529 +           p += 1 + *p + 2 + EXTRACT_UNSIGNED (&p[1 + *p])*4;
2530  
2531             if (!not) goto fail;
2532 @@ -3636,4 +4061,6 @@
2533             SET_REGS_MATCHED ();
2534              d++;
2535 +           if (d != dend && c >= 1 << BYTEWIDTH)
2536 +             d++;
2537             break;
2538           }
2539 @@ -3801,5 +4228,5 @@
2540  
2541                            /* xx why this test?  */
2542 -                          if ((int) old_regend[r] >= (int) regstart[r])
2543 +                         if (old_regend[r] >= regstart[r])
2544                              regend[r] = old_regend[r];
2545                          }     
2546 @@ -4052,5 +4479,5 @@
2547                      || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
2548               {
2549 -               register unsigned char c
2550 +               register unsigned short c
2551                    = *p2 == (unsigned char) endline ? '\n' : p2[2];
2552                 p1 = p + mcnt;
2553 @@ -4069,13 +4496,10 @@
2554                          || (re_opcode_t) p1[3] == charset_not)
2555                   {
2556 -                   int not = (re_opcode_t) p1[3] == charset_not;
2557 -                    
2558 -                   if (c < (unsigned char) (p1[4] * BYTEWIDTH)
2559 -                       && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
2560 -                     not = !not;
2561 +                   if (ismbchar (c))
2562 +                     c = c << 8 | p2[3];
2563  
2564 -                    /* `not' is equal to 1 if c would match, which means
2565 +                   /* `is_in_list()' is TRUE if c would match, which means
2566                          that we can't change to pop_failure_jump.  */
2567 -                   if (!not)
2568 +                   if (!is_in_list (c, p1 + 4))
2569                        {
2570                         p[-3] = (unsigned char) pop_failure_jump;
2571 @@ -4632,8 +5056,15 @@
2572       char *translate;
2573  {
2574 -  register unsigned char *p1 = s1, *p2 = s2;
2575 +  register unsigned char *p1 = s1, *p2 = s2, c;
2576    while (len)
2577      {
2578 -      if (translate[*p1++] != translate[*p2++]) return 1;
2579 +      c = *p1++;
2580 +      if (ismbchar(c)) {
2581 +       if (c != *p2++ || !--len || *p1++ != *p2++)
2582 +         return 1;
2583 +      }
2584 +      else
2585 +       if (translate[c] != translate[*p2++])
2586 +         return 1;
2587        len--;
2588      }
2589 @@ -4778,5 +5209,5 @@
2590  {
2591    reg_errcode_t ret;
2592 -  unsigned syntax
2593 +  reg_syntax_t syntax
2594      = (cflags & REG_EXTENDED) ?
2595        RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
2596 diff -ru2N grep-2.0/regex.h grep+mb1.04/regex.h
2597 --- grep-2.0/regex.h    Fri May 21 14:11:43 1993
2598 +++ grep+mb1.04/regex.h Sat Jul 10 04:38:03 1993
2599 @@ -17,4 +17,6 @@
2600     along with this program; if not, write to the Free Software
2601     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
2602 +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
2603 +   Last change: Jul. 10, 1993 by t^2  */
2604  
2605  #ifndef __REGEXP_LIBRARY_H__
2606 @@ -36,9 +38,9 @@
2607     the definitions shifted by one from the previous bit; thus, when we
2608     add or remove a bit, only one other definition need change.  */
2609 -typedef unsigned reg_syntax_t;
2610 +typedef unsigned long reg_syntax_t;
2611  
2612  /* If this bit is not set, then \ inside a bracket expression is literal.
2613     If set, then such a \ quotes the following character.  */
2614 -#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
2615 +#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long)1)
2616  
2617  /* If this bit is not set, then + and ? are operators, and \+ and \? are
2618 @@ -206,5 +208,5 @@
2619  #undef RE_DUP_MAX
2620  #endif
2621 -#define RE_DUP_MAX ((1 << 15) - 1) 
2622 +#define RE_DUP_MAX ((int)(((unsigned)1 << 15) - 1))
2623  
2624  
2625 @@ -397,4 +399,10 @@
2626  
2627  #define _RE_ARGS(args) ()
2628 +
2629 +#ifdef __GNUC__
2630 +#define const __const__
2631 +#else
2632 +#define const
2633 +#endif
2634  
2635  #endif /* not __STDC__ */
2636 diff -ru2N grep-2.0/search.c grep+mb1.04/search.c
2637 --- grep-2.0/search.c   Mon May  3 06:02:00 1993
2638 +++ grep+mb1.04/search.c        Fri Jul  9 14:55:21 1993
2639 @@ -17,4 +17,6 @@
2640  
2641     Written August 1992 by Mike Haertel. */
2642 +/* Multi-byte extension added Jul., 1993 by t^2 (Takahiro Tanimoto)
2643 +   Last change: Jul. 9, 1993 by t^2  */
2644  
2645  #include <ctype.h>
2646 @@ -61,4 +63,5 @@
2647  #include "kwset.h"
2648  #include "regex.h"
2649 +#include "mbc.h"
2650  
2651  #define NCHAR (UCHAR_MAX + 1)
2652 @@ -434,8 +437,9 @@
2653       char **endp;
2654  {
2655 -  register char *beg, *try, *end;
2656 +  register char *beg, *try, *end, *p, *lim;
2657    register size_t len;
2658    struct kwsmatch kwsmatch;
2659  
2660 +  lim = buf;
2661    for (beg = buf; beg <= buf + size; ++beg)
2662      {
2663 @@ -456,4 +460,8 @@
2664             if (try > buf && WCHAR((unsigned char) try[-1]))
2665               break;
2666 +           for (p = try; p-- > lim && ismbchar(*p); )
2667 +             ;
2668 +           if (!((try - p) & 1))
2669 +             break;
2670             if (try + len < buf + size && WCHAR((unsigned char) try[len]))
2671               {
2672 @@ -464,6 +472,12 @@
2673               goto success;
2674           }
2675 -      else
2676 -       goto success;
2677 +      else {
2678 +       for (p = beg; p-- > lim && ismbchar(*p); )
2679 +         ;
2680 +       if ((beg - p) & 1)
2681 +         goto success;
2682 +       if (lim + 1 < beg)
2683 +         lim = beg - 1;
2684 +      }
2685      }
2686  
2687 diff -ru2N grep-2.0/tests/batgen.awk grep+mb1.04/tests/batgen.awk
2688 --- grep-2.0/tests/batgen.awk   Thu Jan  1 09:00:00 1970
2689 +++ grep+mb1.04/tests/batgen.awk        Sat Jul 10 02:10:24 1993
2690 @@ -0,0 +1,10 @@
2691 +BEGIN { print "@echo off"; }
2692 +$0 !~ /^#/ && NF == 3 {
2693 +       printf "echo #%d --\n", ++n
2694 +       print "set R=0";
2695 +       print "echo " $3 ">tmp.in";
2696 +       print "grep -E -e \"" $2 "\" tmp.in >nul";
2697 +       print "if errorlevel 1 set R=1";
2698 +       print "if errorlevel 2 set R=2";
2699 +       printf "if not %R% == " $1 " echo Spencer test #%d failed\n", n
2700 +}
2701 diff -ru2N grep-2.0/tests/check.bat grep+mb1.04/tests/check.bat
2702 --- grep-2.0/tests/check.bat    Thu Jan  1 09:00:00 1970
2703 +++ grep+mb1.04/tests/check.bat Fri Jul  9 17:05:30 1993
2704 @@ -0,0 +1,14 @@
2705 +@echo off
2706 +rem
2707 +rem Regression test for GNU e?grep.
2708 +rem
2709 +
2710 +rem The Khadafy test is brought to you by Scott Anderson . . .
2711 +grep -E -f tests/khadafy.reg tests/khadafy.lin > khadafy.out
2712 +fc tests\khadafy.lin khadafy.out
2713 +
2714 +rem . . . and the following by Henry Spencer.
2715 +
2716 +gawk -F: -f tests/batgen.awk tests/spencer.dos > tmp.bat
2717 +
2718 +tmp
2719 diff -ru2N grep-2.0/tests/spencer.dos grep+mb1.04/tests/spencer.dos
2720 --- grep-2.0/tests/spencer.dos  Thu Jan  1 09:00:00 1970
2721 +++ grep+mb1.04/tests/spencer.dos       Sat Jul 10 02:12:59 1993
2722 @@ -0,0 +1,122 @@
2723 +0:abc:abc
2724 +1:abc:xbc
2725 +1:abc:axc
2726 +1:abc:abx
2727 +0:abc:xabcy
2728 +0:abc:ababc
2729 +0:ab*c:abc
2730 +0:ab*bc:abc
2731 +0:ab*bc:abbc
2732 +0:ab*bc:abbbbc
2733 +0:ab+bc:abbc
2734 +1:ab+bc:abc
2735 +1:ab+bc:abq
2736 +0:ab+bc:abbbbc
2737 +0:ab?bc:abbc
2738 +0:ab?bc:abc
2739 +1:ab?bc:abbbbc
2740 +0:ab?c:abc
2741 +0:^abc$:abc
2742 +1:^abc$:abcc
2743 +0:^abc:abcc
2744 +1:^abc$:aabc
2745 +0:abc$:aabc
2746 +0:^:abc
2747 +0:$:abc
2748 +0:a.c:abc
2749 +0:a.c:axc
2750 +0:a.*c:axyzc
2751 +1:a.*c:axyzd
2752 +1:a[bc]d:abc
2753 +0:a[bc]d:abd
2754 +1:a[b-d]e:abd
2755 +0:a[b-d]e:ace
2756 +0:a[b-d]:aac
2757 +0:a[-b]:a-
2758 +0:a[b-]:a-
2759 +1:a[b-a]:-
2760 +2:a[]b:-
2761 +2:a[:-
2762 +0:a]:a]
2763 +0:a[]]b:a]b
2764 +0:a[^bc]d:aed
2765 +1:a[^bc]d:abd
2766 +0:a[^-b]c:adc
2767 +1:a[^-b]c:a-c
2768 +1:a[^]b]c:a]c
2769 +0:a[^]b]c:adc
2770 +0:ab|cd:abc
2771 +0:ab|cd:abcd
2772 +0:()ef:def
2773 +0:()*:-
2774 +1:*a:-
2775 +0:^*:-
2776 +0:$*:-
2777 +1:(*)b:-
2778 +1:$b:b
2779 +2:a\\:-
2780 +0:a\(b:a(b
2781 +0:a\(*b:ab
2782 +0:a\(*b:a((b
2783 +1:a\x:a\x
2784 +2:abc):-
2785 +2:(abc:-
2786 +0:((a)):abc
2787 +0:(a)b(c):abc
2788 +0:a+b+c:aabbabc
2789 +0:a**:-
2790 +0:a*?:-
2791 +0:(a*)*:-
2792 +0:(a*)+:-
2793 +0:(a|)*:-
2794 +0:(a*|b)*:-
2795 +0:(a+|b)*:ab
2796 +0:(a+|b)+:ab
2797 +0:(a+|b)?:ab
2798 +0:[^ab]*:cde
2799 +0:(^)*:-
2800 +0:(ab|)*:-
2801 +2:)(:-
2802 +1:abc:
2803 +1:abc:
2804 +0:a*:
2805 +0:([abc])*d:abbbcd
2806 +0:([abc])*bcd:abcd
2807 +0:a|b|c|d|e:e
2808 +0:(a|b|c|d|e)f:ef
2809 +0:((a*|b))*:-
2810 +0:abcd*efg:abcdefg
2811 +0:ab*:xabyabbbz
2812 +0:ab*:xayabbbz
2813 +0:(ab|cd)e:abcde
2814 +0:[abhgefdc]ij:hij
2815 +1:^(ab|cd)e:abcde
2816 +0:(abc|)ef:abcdef
2817 +0:(a|b)c*d:abcd
2818 +0:(ab|ab*)bc:abc
2819 +0:a([bc]*)c*:abc
2820 +0:a([bc]*)(c*d):abcd
2821 +0:a([bc]+)(c*d):abcd
2822 +0:a([bc]*)(c+d):abcd
2823 +0:a[bcd]*dcdcde:adcdcde
2824 +1:a[bcd]+dcdcde:adcdcde
2825 +0:(ab|a)b*c:abc
2826 +0:((a)(b)c)(d):abcd
2827 +0:[A-Za-z_][A-Za-z0-9_]*:alpha
2828 +0:^a(bc+|b[eh])g|.h$:abh
2829 +0:(bc+d$|ef*g.|h?i(j|k)):effgz
2830 +0:(bc+d$|ef*g.|h?i(j|k)):ij
2831 +1:(bc+d$|ef*g.|h?i(j|k)):effg
2832 +1:(bc+d$|ef*g.|h?i(j|k)):bcdd
2833 +0:(bc+d$|ef*g.|h?i(j|k)):reffgz
2834 +1:((((((((((a)))))))))):-
2835 +0:(((((((((a))))))))):a
2836 +1:multiple words of text:uh-uh
2837 +0:multiple words:multiple words, yeah
2838 +0:(.*)c(.*):abcde
2839 +1:\((.*),:(.*)\)
2840 +1:[k]:ab
2841 +0:abcd:abcd
2842 +0:a(bc)d:abcd
2843 +0:a[\ 1-\ 3]?c:a\ 2c
2844 +0:(....).*\1:beriberi