1Path: kddlab!cs.titech!wnoc-tyo-news!sh.wide!wnoc-kyo!oskgate0.mei!synapse!kgway!manmos
2From: manmos@knowledge.co.jp (Hideo "Sir MaNMOS" Morisita)
3Newsgroups: fj.sources
4Subject: Japanese extention for texindex
5Message-ID: <MANMOS.93Jul13113502@kgway.knowledge.co.jp>
6Date: 13 Jul 93 02:35:02 GMT
7Sender: manmos@kgway.knowledge.co.jp
8Followup-To: fj.sources.d
9Distribution: fj
10Organization: Knowledge. Co., Osaka, Japan
11Lines: 643
12
13
14$B?92<(J $B$*Be41MM(J $B#M#a#N#M#O#S!w%J%l%C%8$G$9!#(J
15
16$B0JA0!"(Jtexinfo$B$NF|K\8l3HD%$,(Jfj$B$KN.$l$^$7$?$,!"$=$lMQ$N(Jtexindex$B$ON.$l$J(J
17$B$+$C$?$h$&$G$9$N$G!":n$C$F$_$^$7$?!#(J
18
19texindex.c 1.45$B$N3HD%$H$7$F:n$C$F$"$j$^$9!#(J(texindex.c 1.45$B$O(J
20texinfo-2.15 $B$+$i(J texinfo-3.0$B$^$GF1$8$b$N$G$9(J)
21
22$B;HMQJ}K!$O(J
23
24patch < $B$3$N%U%!%$%k(J
25
26$B$H$7!"(JMakefile$B$N(J DEFS$B$N=j$K(J -DEUC or -DSJIS$B$rDj5A$7$F%3%s%Q%$%k$7$F2<(J
27$B$5$$!#(J
28
29$B%$%s%G%C%/%9=g$O(J
30
31ASCII$B5-9f(J->ASCII & JIS208 $B?t;z(J -> ASCII & JIS208 $B%"%k%U%!%Y%C%H(J ->
32JIS201 & JIS208 $B2>L>(J
33
34$B$K$J$C$F$$$^$9!#(J
35
36$B8+=P$7$O!"2>L>#1J8;z$E$D$K$J$C$F$$$^$9!#!J$"9T$+9T$H$+$G$J$$!"$=$&$9$k(J
37$B$N$b%F!<%V%k$r:n$l$PFq$7$/$O$J$$$G$9$,!D!K(J
38
39--------------------------------(cur me)-----------------------------
40*** texindex.c	Sat Dec 12 01:19:49 1992
41--- jtexindex.c	Tue Jul 13 11:15:17 1993
42***************
43*** 1,6 ****
44  /* Prepare TeX index dribble output into an actual index.
45
46!    Version 1.45
47
48     Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
49
50--- 1,6 ----
51  /* Prepare TeX index dribble output into an actual index.
52
53!    Version 1.45-j1.00
54
55     Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
56
57***************
58*** 607,612 ****
59--- 607,618 ----
60        while (bracelevel)
61  	{
62  	  c = *p++;
63+ #ifdef	SJIS
64+ 	  if ( iskanji(c)) {
65+ 		  p++;
66+ 		  continue;
67+ 	  }
68+ #endif
69  	  if (c == '{')
70  	    bracelevel++;
71  	  if (c == '}')
72***************
73*** 650,655 ****
74--- 656,667 ----
75    while (bracelevel)
76      {
77        c = *p++;
78+ #ifdef	SJIS
79+ 	  if (iskanji(c)) {
80+ 		  p++;
81+ 		  continue;
82+ 	  }
83+ #endif
84        if (c == '{')
85  	bracelevel++;
86        if (c == '}')
87***************
88*** 678,685 ****
89  /* Vector used to translate characters for comparison.
90     This is how we make all alphanumerics follow all else,
91     and ignore case in the first sorting.  */
92! int char_order[256];
93
94  void
95  init_char_order ()
96  {
97--- 690,1071 ----
98  /* Vector used to translate characters for comparison.
99     This is how we make all alphanumerics follow all else,
100     and ignore case in the first sorting.  */
101! int char_order[0x10000];			/* japanese */
102!
103! #ifdef	EUC
104! #define	KANJI
105! #endif
106!
107! #ifdef	SJIS
108! #define	KANJI
109! #endif
110!
111! #ifdef		KANJI
112!
113! #ifndef		EUC
114! #	ifndef		SJIS
115! #		define	EUC
116! #	endif
117! #else
118! #	ifdef	SJIS
119! #		error
120! #	endif
121! #endif
122!
123! #ifdef		EUC
124! #define		JIS_NUM_0		0xa3b0
125! #define		JIS_NUM_9		(JIS_NUM_0 + '9'- '0')
126! #define		JIS_ALPH_A		0xa3c1
127! #define		JIS_ALPH_Z		(JIS_ALPH_A + 'Z'-'A')
128! #define		JIS_ALPH_a		0xa3e1
129! #define		JIS_HIRA_SMALL_A	0xa4a1
130! #define		JIS_HIRA_NN			0xa4f3
131! #define		JIS_KATA_SMALL_A	0xa5a1
132! #define		JIS_KATA_SMALL_KE	0xa5f6
133! #define		JIS_HIRA_U			0xa4a6
134! #define		JIS_KATA_U			0xa5a6
135! #define		JIS_KATA_VU			0xa5f4
136!
137! #define		JIS_KATA_UPPER		0xa5
138! #define		JIS_HIRA_UPPER		0xa4
139!
140! #define		JIS_HIRA_A		0xa4a2
141! #define		JIS_KATA_A		0xa5a2
142!
143! #define		JIS_DAKUTEN		0xa1ab
144! #define		JIS_HANDAKUTEN	0xa1ac
145! #define		JIS_CHOUON		0xa2ac
146!
147! int kana[] = {
148! /*	          .        [      ]      ,        .       wo      a		*/
149! 	0xa1a1, 0xa1a3, 0xa1d6, 0xa1d7, 0xa1a2, 0xa1a6, 0xa5f2, 0xa5a1,
150! /*    i       u       e       o       ya      yu      yo      tsu   */
151! 	0xa5a3, 0xa5a5, 0xa5a7, 0xa5a9, 0xa5e3, 0xa5e5, 0xa5e7, 0xa5c3,
152! /*     -       a       i       u       e       o      ka      ki    */
153! 	0xa1bc, 0xa5a2, 0xa5a4, 0xa5a6, 0xa5a8, 0xa5aa, 0xa5ab, 0xa5ad,
154! /*    ku      ke      ko      sa      si      su     se       so	*/
155! 	0xa5af,	0xa5b1, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b9, 0xa5bb, 0xa5bd,
156! /*    ta      ti      tu      te      to      na     ni       nu	*/
157! 	0xa5bf, 0xa5c1, 0xa5c4, 0xa5c6, 0xa5c8, 0xa5ca, 0xa5cb, 0xa5cc,
158! /*    ne      no      ha      hi      hu      he      ho      ma 	*/
159! 	0xa5cd, 0xa5ce, 0xa5cf, 0xa5d2, 0xa5d5, 0xa5d8, 0xa5db, 0xa5de,
160! /*    mi      mu      me      mo      ya      yu      yo      ra	*/
161! 	0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e4, 0xa5e6, 0xa5e8, 0xa5e9,
162! /*	  ri      ru      re      ro      wa      nn      ""      maru  */
163! 	0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ef, 0xa5f3,	JIS_DAKUTEN,JIS_HANDAKUTEN
164! };
165!
166! int daku[] = {0xa5ac, 0xa5ae, 0xa5b0, 0xa5b2, 0xa5b4, /* $B%,(J*/
167! 	 	      0xa5b6, 0xa5b8, 0xa5ba, 0xa5bc, 0xa5be, /* $B%6(J */
168! 			  0xa5c0, 0xa5c2, 0xa5c5, 0xa5c7, 0xa5c9, /* $B%@(J */
169! 			  0xa5d0, 0xa5d3, 0xa5d6, 0xa5d9, 0xa5dc}; /* $B%P(J */
170! int	handaku[] = {0xa5d1, 0xa5d4, 0xa5d7, 0xa5da, 0xa5dd}; /* $B%Q(J */
171! int dakuall[] = {0xa4ac, 0xa4ae, 0xa4b0, 0xa4b2, 0xa4b4, /* $B$,(J */
172! 	 	      0xa4b6, 0xa4b8, 0xa4ba, 0xa4bc, 0xa4be, /* $B$6(J */
173! 			  0xa4c0, 0xa4c2, 0xa4c5, 0xa4c7, 0xa4c9, /* $B$@(J */
174! 			  0xa4d0, 0xa4d3, 0xa4d6, 0xa4d9, 0xa4dc, /* $B$P(J */
175! 			  0xa5ac, 0xa5ae, 0xa5b0, 0xa5b2, 0xa5b4, /* $B%,(J */
176! 	 	      0xa5b6, 0xa5b8, 0xa5ba, 0xa5bc, 0xa5be, /* $B%6(J */
177! 			  0xa5c0, 0xa5c2, 0xa5c5, 0xa5c7, 0xa5c9, /* $B%@(J */
178! 			  0xa5d0, 0xa5d3, 0xa5d6, 0xa5d9, 0xa5dc}; /* $B%P(J */
179! int	handakuall[] = {0xa4d1, 0xa4d4, 0xa4d7, 0xa4da, 0xa4dd, /* $B$Q(J */
180! 					0xa5d1, 0xa5d4, 0xa5d7, 0xa5da, 0xa5dd}; /* $B%Q(J */
181!
182!
183! iskanji(c)							/* japanses extention */
184! int	c;
185! {
186! 	if ( !(c & 0x80 )) return 0;
187! 	if ( c == 0x8e ) return 0;
188! 	return 1;
189! }
190!
191! is201kana(c)							/* japanses extention */
192! int	c;
193! {
194! 	if ( c == 0x8e ) return 1;
195! 	else return 0;
196! }
197! #else							/* SJIS */
198! #define		JIS_NUM_0		0x824f
199! #define		JIS_NUM_9		(JIS_NUM_0 + '9'- '0')
200! #define		JIS_ALPH_A		0x8260
201! #define		JIS_ALPH_Z		(JIS_ALPH_A + 'Z'-'A')
202! #define		JIS_ALPH_a		0x8281
203! #define		JIS_HIRA_SMALL_A	0x829f
204! #define		JIS_HIRA_NN			0x82f1
205! #define		JIS_KATA_SMALL_A	0x8340
206! #define		JIS_KATA_SMALL_KE	0x8396
207! #define		JIS_HIRA_U			0x82a4
208! #define		JIS_KATA_U			0x83a5
209! #define		JIS_KATA_VU			0x8394
210!
211! #define		JIS_KATA_UPPER		0x83
212! #define		JIS_HIRA_UPPER		0x82
213!
214! #define		JIS_HIRA_A		0x82a0
215! #define		JIS_KATA_A		0x8341
216!
217! #define		JIS_DAKUTEN		0x814a
218! #define		JIS_HANDAKUTEN	0x814b
219! #define		JIS_CHOUON		0x815b
220!
221! int kana[] = {
222! /*	          .        [      ]      ,        .       wo      a		*/
223! 	0x813f, 0x8142, 0x8175, 0x8176, 0x8141, 0x8145, 0x8392, 0x8340,
224! /*    i       u       e       o       ya      yu      yo      tsu   */
225! 	0x8342, 0x8344, 0x8346, 0x8348, 0x8383, 0x8385, 0x8387, 0x8362,
226! /*     -       a       i       u       e       o      ka      ki    */
227! 	0x815b, 0x8341, 0x8343, 0x8345, 0x8347, 0x8349, 0x834a, 0x834c,
228! /*    ku      ke      ko      sa      si      su     se       so	*/
229! 	0x834e,	0x8350, 0x8352, 0x8354, 0x8356, 0x8358, 0x835a, 0x835c,
230! /*    ta      ti      tu      te      to      na     ni       nu	*/
231! 	0x835e, 0x8360, 0x8363, 0x8365, 0x8367, 0x8369, 0x836a, 0x836b,
232! /*    ne      no      ha      hi      hu      he      ho      ma 	*/
233! 	0x836c, 0x836d, 0x836e, 0x8371, 0x8374, 0x8377, 0x837a, 0x837d,
234! /*    mi      mu      me      mo      ya      yu      yo      ra	*/
235! 	0x837e, 0x8380, 0x8381, 0x8382, 0x8384, 0x8386, 0x8388, 0x8389,
236! /*	  ri      ru      re      ro      wa      nn      ""      maru  */
237! 	0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8393,	JIS_DAKUTEN,JIS_HANDAKUTEN
238! };
239!
240! int daku[] = {0x834b, 0x834d, 0x834f, 0x8351, 0x8353, /* $B%,(J*/
241! 	 	      0x8355, 0x8357, 0x8359, 0x835b, 0x835d, /* $B%6(J */
242! 			  0x835f, 0x8361, 0x8364, 0x8366, 0x8367, /* $B%@(J */
243! 			  0x836f, 0x8372, 0x8375, 0x8378, 0x837b}; /* $B%P(J */
244! int	handaku[] = {0x8370, 0x8373, 0x8376, 0x8379, 0x837c}; /* $B%Q(J */
245! int dakuall[] = {0x82aa, 0xa2ac, 0x82a3, 0x82b0, 0x82b2, /* $B$,(J */
246! 	 	      0x82b4, 0x82b6, 0x82b8, 0x82ba, 0x82bc, /* $B$6(J */
247! 			  0x82be, 0x82c0, 0x82c3, 0x82c5, 0x82c7, /* $B$@(J */
248! 			  0x82ce, 0x82d1, 0x82d4, 0x82d7, 0x82da, /* $B$P(J */
249!
250! 			  0x834b, 0x834d, 0x834f, 0x8351, 0x8353, /* $B%,(J*/
251! 	 	      0x8355, 0x8357, 0x8359, 0x835b, 0x835d, /* $B%6(J */
252! 			  0x835f, 0x8361, 0x8364, 0x8366, 0x8367, /* $B%@(J */
253! 			  0x836f, 0x8372, 0x8375, 0x8378, 0x837b}; /* $B%P(J */
254! int	handakuall[] = {0x82cf, 0x82d2, 0x82d5, 0x82d8, 0x82db, /* $B$Q(J */
255! 				    0x8370, 0x8373, 0x8376, 0x8379, 0x837c}; /* $B%Q(J */
256!
257! iskanji(c)							/* japanses extention */
258! int	c;
259! {
260! 	c &= 0xff;
261! 	if (( c >= 0x81 && c <= 0x9f ) ||
262! 		( c >= 0xe0 && c <= 0xea )) return 1;
263! 	return 0;
264! }
265!
266! is201kana(c)							/* japanses extention */
267! int	c;
268! {
269! 	if ( c >= 0xa0 && c <= 0xdf ) return 1;
270! 	else return 0;
271! }
272! #endif
273!
274!
275! kana_char_order()				/* japanese */
276! {
277! 	unsigned	int		c,i,j,cc;
278!
279! 	for ( c = 0x8000 ; c < 0x10000 ; c++ )
280! 		char_order[c] = c;
281!
282! 	/* NUMERIC */
283! 	for ( c = JIS_NUM_0 , i = '0' + 512; c <= JIS_NUM_9 ; i++,c++)
284! 		char_order[c] = i;
285!
286! 	/* ALPHABET */
287! 	for ( c = JIS_ALPH_A , i = 'a' + 512; c <= JIS_ALPH_Z ; i++,c++) {
288! 		char_order[c] = i;
289! 		char_order[c+JIS_ALPH_a - JIS_ALPH_A] = i;
290! 	}
291!
292! 	/* KANA */
293! 	for ( c = JIS_HIRA_SMALL_A ; c <= JIS_HIRA_NN ; c++ ) {
294! 		char_order[c] = c+512;
295! 		cc = c+JIS_KATA_SMALL_A-JIS_HIRA_SMALL_A;
296! #ifdef	SJIS
297! 		if ( cc > 0x837e ) cc ++;
298! #endif
299! 		char_order[cc] = c+512;
300! 		if (isdaku(c) ) {
301! 			char_order[c] = c+512-1;
302! 			char_order[cc] = c+512-1;
303! 		} else if (ishandaku(c) ) {
304! 			char_order[c] = c+512-2;
305! 			char_order[cc] = c+512-2;
306! 		}
307! 	}
308! 	for ( c = JIS_KATA_VU ; c <= JIS_KATA_SMALL_KE ; c++ ) {
309! 		char_order[c] = c+512;
310! 		if (c == JIS_KATA_VU ) {
311! 			char_order[c] = JIS_KATA_U + 512;
312! 		}
313! 	}
314! }
315!
316!
317! #ifdef	EUC
318! #define	KANA_BYTES	2
319! #else
320! #define	KANA_BYTES	2
321! #endif
322
323+ static	convert_htoz(str,ret)
324+ unsigned	char	*str;
325+ int		*ret;
326+ {
327+ 	int		c,c2;
328+
329+ 	int		num = KANA_BYTES;
330+
331+ #ifdef	EUC
332+ 	str++;
333+ #endif
334+ 	c = *str++;
335+ 	if (!is201kana(*str)) {
336+ 		if (c >= 0xa0 && c <= 0xdf)
337+ 			*ret = kana[c - 0xa0];
338+ 		else *ret = 0x8e00 + c;
339+ 		return num;
340+ 	}
341+ #ifdef	EUC
342+ 	str++;
343+ #endif
344+ 	num += KANA_BYTES;
345+
346+ 	if ( (c2 = *str++) == 0xde) {		/* $BByE@(J */
347+ 		if      (c >= 0xb6 && c <= 0xba)		/* line-ga */
348+ 			c = daku[c - 0xb6];
349+ 		else if (c >= 0xbb && c <= 0xbf)		/* line-za */
350+ 			c = daku[c - 0xbb+5];
351+ 		else if (c >= 0xc0 && c <= 0xc4)		/* line-da */
352+ 			c = daku[c - 0xc0+10];
353+ 		else if (c >= 0xca && c <= 0xce)		/* line-ba */
354+ 			c = daku[c - 0xca+15];
355+ 		else if ( c == 0xb3 )					/* vu */
356+ 			c = JIS_KATA_VU;
357+ 	} else if (c2 == 0xdf) {					/* $BH>ByE@(J */
358+ 		if (c >= 0xca && c <= 0xce)				/* line-pa */
359+ 			c = handaku[c - 0xca];
360+ 	} else if ( c2 == 0xb1 ) {					/* $BD92;(J */
361+ 		if (c >= 0xa0 && c <= 0xdd)
362+ 			*ret = kana[c - 0xa0];
363+ 		else *ret = 0x8e00 + c;
364+ 	}
365+ 	if ( c < 0x100 ) c += 0x8e00;
366+
367+ 	return num;
368+ }
369+
370+ isadddaku(c)
371+ {
372+ 	int	i;
373+ 	for ( i = 0 ; i < sizeof(dakuall) / sizeof(dakuall[1]) ; i++ )
374+ 		if ( dakuall[i]-1 == c ) return 1;
375+ 	return 0;
376+ }
377+
378+ isaddhandaku(c)
379+ {
380+ 	int	i;
381+ 	for ( i = 0 ; i < sizeof(handakuall) / sizeof(handakuall[1]) ; i++ )
382+ 		if ( handakuall[i]-2 == c ) return 1;
383+ 	return 0;
384+ }
385+
386+ isdaku(c)
387+ {
388+ 	int	i;
389+ 	for ( i = 0 ; i < sizeof(dakuall) / sizeof(dakuall[1]) ; i++ )
390+ 		if ( dakuall[i] == c ) return 1;
391+ 	return 0;
392+ }
393+
394+ ishandaku(c)
395+ {
396+ 	int	i;
397+ 	for ( i = 0 ; i < sizeof(handakuall) / sizeof(handakuall[1]) ; i++ )
398+ 		if ( handakuall[i] == c ) return 1;
399+ 	return 0;
400+ }
401+
402+ int	mbchar(str,ret)
403+ unsigned	char	*str;
404+ int		*ret;
405+ {
406+ 	int		c = *str++;
407+ 	int		cc,ccc;
408+ 	if ( !iskanji(c) && !is201kana(c)) {
409+ 		*ret = c & 0xff;
410+ 		return 1;
411+ 	}
412+ 	if ( iskanji (c) ) {
413+ 		cc = ((c & 0xff) << 8) | ((*str++) & 0xff);
414+ 		ccc = (((*str++ ) & 0xff) << 8 ) | ((*str++) & 0xff);
415+
416+ 		if ( ccc == JIS_DAKUTEN ) {
417+ 			if ( isadddaku(cc)) cc++;
418+ 			else if ( cc == JIS_KATA_U || cc == JIS_HIRA_U )
419+ 				cc = JIS_KATA_VU;
420+ 			*ret = cc;
421+ 			return 4;
422+ 		} else if ( ccc == JIS_HANDAKUTEN ) {
423+ 			if ( isaddhandaku(cc)) cc+=2;
424+ 			*ret = cc;
425+ 			return 4;
426+ 		} else if ( ccc == JIS_CHOUON ) {
427+ 			*ret = cc;
428+ 			return 4;
429+ 		} else {
430+ 			*ret = cc;
431+ 			return 2;
432+ 		}
433+ 	} else if ( is201kana(c)) {
434+ 		/* EUC */
435+ 		return convert_htoz(str-1,ret);
436+ 	}
437+ }
438+
439+ xinitial(str,c)
440+ unsigned	char	*str;
441+ int		c;
442+ {
443+ 	int		up;
444+ 	if (isdaku(c)) c--;
445+ 	else if (ishandaku(c)) c-=2;
446+ 	else if ( c == JIS_KATA_VU ) c = JIS_KATA_U;
447+
448+ 	if ((up= (c & 0xff00) >>8) == JIS_KATA_UPPER ) {		/* katakana */
449+ 		c += JIS_HIRA_SMALL_A - JIS_KATA_SMALL_A;
450+ #ifdef	SJIS
451+ 		if ( c > 0x837e ) c ++;
452+ #endif
453+ 	}
454+ 	*str++ = (c >> 8 ) & 0xfff;
455+ 	*str++ = c & 0xff;
456+ 	*str= 0;
457+ }
458+
459+ make_initial(src,dst)
460+ unsigned char *src,*dst;
461+ {
462+ 	int		len;
463+ 	int		c;
464+
465+ 	len = mbchar(src,&c);
466+ 	if ( len == 1 ) {
467+ 		dst[0] =c;
468+ 		dst[1] = 0;
469+ 	} else {
470+ 		xinitial(dst,c);
471+ 		len = 2;
472+ 	}
473+ 	return len;
474+ }
475+ #endif
476+
477  void
478  init_char_order ()
479  {
480***************
481*** 695,700 ****
482--- 1081,1089 ----
483        char_order[i] = 512 + i;
484        char_order[i + 'A' - 'a'] = 512 + i;
485      }
486+ #ifdef	KANJI
487+ 	kana_char_order();						/* japanese */
488+ #endif
489  }
490
491  /* Compare two fields (each specified as a start pointer and a character count)
492***************
493*** 741,751 ****
494  	  if (p1 == e1)
495  	    c1 = 0;
496  	  else
497  	    c1 = *p1++;
498  	  if (p2 == e2)
499  	    c2 = 0;
500  	  else
501! 	    c2 = *p2++;
502
503  	  if (char_order[c1] != char_order[c2])
504  	    return char_order[c1] - char_order[c2];
505--- 1130,1149 ----
506  	  if (p1 == e1)
507  	    c1 = 0;
508  	  else
509+ #ifdef	KANJI
510+ 		  p1 += mbchar(p1,&c1);	/* japanese */
511+ #else
512  	    c1 = *p1++;
513+ #endif
514+
515  	  if (p2 == e2)
516  	    c2 = 0;
517  	  else
518! #ifdef	KANJI
519! 		  p2 += mbchar(p2,&c2);	/* japanese */
520! #else
521! 	   c2 = *p2++;
522! #endif
523
524  	  if (char_order[c1] != char_order[c2])
525  	    return char_order[c1] - char_order[c2];
526***************
527*** 763,777 ****
528  	  if (p1 == e1)
529  	    c1 = 0;
530  	  else
531  	    c1 = *p1++;
532  	  if (p2 == e2)
533  	    c2 = 0;
534  	  else
535! 	    c2 = *p2++;
536!
537! 	  if (c1 != c2)
538! 	    /* Reverse sign here so upper case comes out last.  */
539! 	    return c2 - c1;
540  	  if (!c1)
541  	    break;
542  	}
543--- 1161,1194 ----
544  	  if (p1 == e1)
545  	    c1 = 0;
546  	  else
547+ #ifdef	KANJI
548+ 		  p1 += mbchar(p1,&c1);	/* japanese */
549+ #else
550  	    c1 = *p1++;
551+ #endif
552  	  if (p2 == e2)
553  	    c2 = 0;
554  	  else
555! #ifdef	KANJI
556! 		  p2 += mbchar(p2,&c2);	/* japanese */
557! #else
558!  	    c2 = *p2++;
559! #endif
560! #ifdef	KANJI
561! 	  if ( iskanji(c1) || is201kana(c1)) {
562! 		  if (c1 != c2)
563! 			  /* Reverse sign here so upper case comes out last.  */
564! 			  return c2 - c1;
565! 	  } else {
566! 		  if (c1 != c2)
567! 			  return c1 - c2;
568! 	  }
569! #else
570!
571!  	  if (c1 != c2)
572!  	    /* Reverse sign here so upper case comes out last.  */
573!  	    return c2 - c1;
574! #endif
575  	  if (!c1)
576  	    break;
577  	}
578***************
579*** 1135,1141 ****
580  /* When we need a string of length 1 for the value of lastinitial,
581     store it here.  */
582
583! char lastinitial1[2];
584
585  /* Initialize static storage for writing an index. */
586
587--- 1552,1558 ----
588  /* When we need a string of length 1 for the value of lastinitial,
589     store it here.  */
590
591! char lastinitial1[3];				/* japanese */
592
593  /* Initialize static storage for writing an index. */
594
595***************
596*** 1168,1174 ****
597    int nosecondary;
598    int initiallength;
599    char *initial;
600!   char initial1[2];
601    register char *p;
602
603    /* First, analyze the parts of the entry fed to us this time. */
604--- 1585,1591 ----
605    int nosecondary;
606    int initiallength;
607    char *initial;
608!   char initial1[3];							/* japanese */
609    register char *p;
610
611    /* First, analyze the parts of the entry fed to us this time. */
612***************
613*** 1184,1193 ****
614    else
615      {
616        initial = initial1;
617        initial1[0] = *p;
618        initial1[1] = 0;
619        initiallength = 1;
620!
621        if (initial1[0] >= 'a' && initial1[0] <= 'z')
622  	initial1[0] -= 040;
623      }
624--- 1601,1615 ----
625    else
626      {
627        initial = initial1;
628+ #ifdef	KANJI
629+ 	  initiallength = make_initial(p,initial1);	/* japanese */
630+ #else
631+       initial = initial1;
632        initial1[0] = *p;
633        initial1[1] = 0;
634        initiallength = 1;
635! #endif
636!
637        if (initial1[0] >= 'a' && initial1[0] <= 'z')
638  	initial1[0] -= 040;
639      }
640***************
641*** 1227,1232 ****
642--- 1649,1656 ----
643  	    {
644  	      lastinitial = lastinitial1;
645  	      *lastinitial1 = *initial1;
646+ 	      lastinitial1[1] = initial1[1];
647+ 	      lastinitial1[2] = initial1[2];
648  	    }
649  	  else
650  	    {
651--------------------------------(cur me)-----------------------------
652--
653   ___      $B$o$7$O!";3?a?'$N$+$9$F!<$i$,Bg9%$-$G$N$%(J
654 [[o o]]             $B$U$)$C$U$)$C$U$)(J
655   'J'   $B?92<(J $B$*Be41MM(J $B#M#a#N#M#O#S(J $B1QIW!w#k#n#o#w#l#e#d#g#e(J
656