*
* BM法による文字列サーチ
* (C) 1997 AIG-Soft

	.xref	__bm_comp
	.xref	__bm_exec

*
* int BMsrch(unchar *txt,unchar *ptrn,unchar *(*top))
* ret=0:一致 , <>0:不一致
* txtはEOS(0x00)で終わる文字列
*
	.offset 4
txt:	.ds.l	1	* テキスト
ptrn:	.ds.l	1	* パターン
top:	.ds.l	1	* 発見先頭位置
*
	.text
	.even

	.xdef	_BMsrch
_BMsrch:
	move.l	ptrn(sp),-(sp)
	bsr	__bm_comp	* 前処理
	addq.l	#4,sp
	tst.l	d0
	bpl	@f
	moveq.l	#-2,d0
	rts			* パターンが長すぎる(-2)
	*
@@:	move.l	txt(sp),a0	* a0=テキスト先頭
	move.l	a0,a1
@@:	tst.b	(a1)+
	bne	@b
	subq.l	#1,a1		* a1=EOSのアドレス＝テキスト末尾
	movem.l	a0-a1,-(sp)
	bsr	__bm_exec	* サーチ : a0.l=サーチ成功位置
	addq.l	#4*2,sp
	bne	1f		* 不一致(-1)
	*
	move.l	top(sp),a1
	cmp.l	#0,d1		* top==NULLなら返さない
	beq	1f
	move.l	a0,(a1)		* topを返す
1:	rts

	.end
