#include "defines.h"
#include "acmp.h"

unchar *handaku(unchar *str,unchar *buff)
/* 全角ひらがな／カタカナの後ろが濁点／半濁点の時、それを結合する */
{
unsint c,cb,fd;
unchar *buff0;
/* 半濁点結合可能文字群（濁点結合も可能）*/
#define	HANDAKU	"はひふへほハヒフヘホ"
/* 濁点結合可能文字群（半濁点分を除く）*/
#define	DAKU "ウかきくけこさしすせそたちつてとカキクケコサシスセソタチツテト"
	
	buff0=buff;
	cb=0; // １つ前の文字（全角のみ記録）
	while ((c=*str++)!=0) {
		if (!check_kanji1(c)) { /* 半角文字 */
			*buff++=c;
			cb=0;
			continue;
		}
		/* 全角文字 */
		c=(c<<8)|*str++;
		if (c==0x814a||c==0x814b) { // 濁点／半濁点
			// 前の文字は結合可能？
			fd=(kstrchar(HANDAKU,cb)>=0); /* 半濁点結合可能文字 */
			if (fd || kstrchar(DAKU,cb)>=0) { /* 濁点結合可能文字 */
				switch (c) {
				    case 0x814a: /* 濁点 */
					if (cb==0x8345) c=0x8394; // 'ウ' -> 'ヴ'
					else c=cb+1; /* +1のコードが濁点 */
					buff-=2; // １文字前を変更
					break;
				    case 0x814b: /* 半濁点 */
					if (fd) {
						c=cb+2; /* +2のコードが半濁点 */
						buff-=2; // １文字前を変更
					}
					// 半濁点結合可能文字以外は結合せず
					break;
				}
			} // 結合不可である
			cb=0; // 結合処理をした/結合不可(絶対に次に結合しない印)
		} else {
			// 濁点／半濁点ではない全角文字
			cb=c; // 記録
		}
		*buff++=(c>>8);
		*buff++=(unchar)c;
	}
	*buff=0;
	return(buff0);
}

#if 0
main()
{
unchar buff[80];
	printf("%s->\n","は゜ひ゛ふハ゜ヒ゛フ");
	printf("%s\n",handaku("は゜ひ゛ふハ゜ヒ゛フ",buff));
	printf("%s->\n","ウ゛か゛き゜ケ゛コ゜ウ.かき");
	printf("%s\n",handaku("ウ゛か゛き゜ケ゛コ゜ウ.かき",buff));
}
#endif
