**************************************************************************
* 正規表現によるパターン照合
*  (C) 1997 by AIG-Soft
**************************************************************************

	.include	re.mac

	.xref	__re_comp
	.xref	__re_exec
	.xref	re_regs

**************************************************************************
* int InitGrep(unchar *pat,unsint *work,int size)
* pat = 検索文字列
* size= ワークエリアサイズ
* work= NFAワークエリア先頭
* ret=ワークエリア中の利用バイト数
*   >0 : ok
*   <0 : err
*
	.offset	4
pat:		.ds.l	1	* パターン
work:		.ds.l	1	* 変換結果格納領域先頭のアドレス
size:		.ds.l	1	* 　　　〃　　　　サイズ
*
	.text
	.even
*
	.xdef	_InitGrep
_InitGrep:
	movem.l	pat(sp),d0/d1/d2	* d0=pat,d1=work,d2=size
	add.l	d2,d2			* *2 for word
					* 2000/02/02修正
					* 実はサイズはもう一度re_comp内で計算されるのでこれで良い
***	subq.l	#1,d2
	add.l	d1,d2			* work+size*2->workend+1
	*
	movem.l	d0/d1/d2,-(sp)		* workend,work,pat
	bsr	__re_comp		* -> d0.l/a0.l
	lea	4*3(sp),sp
	rts

**************************************************************************
* 正規表現による検索を行う
* int Grep(unchar *txt,unchar *txtend,unsint *cpat,unlong *deque,int dequesz
*								,int lastchar,int mode)
	.offset	4
txt:		.ds.l	1
txtend:		.ds.l	1	* NULLならtxt〜EOSまで
cpat:		.ds.l	1	* コンパイル済みパターン
deque:		.ds.l	1
dequesz:	.ds.l	1	* longサイズでの配列個数
lastchar:	.ds.l	1	* 直前の文字（通常はLFになるようにする）
mode:		.ds.l	1	*   0:一致する最長の文字列を探す
				* <>0:文字列が一致したらすぐ帰る
	.text
	.even

	.xdef	_Grep
_Grep:
	movem.l	txt(sp),a0-a1	* a0=txt,a1=txtend
	cmp.l	#0,a1
	bne	1f
	* txtend==NULLのときは自動的にEOSを探して設定する
	move.l	a0,a1
@@:	tst.b	(a1)+
	bne	@b
	subq.l	#1,a1		* a1=txtend
	*
1:	movem.l	deque(sp),d0-d1	* d0=deque,d1=dequesz
	add.l	d1,d1		* *2 for word
	add.l	d1,d1		* *4 for long : 2000/02/01追加
	add.l	d0,d1		* workend+1
				* 2000/02/01修正
				* ここから前にスタックでデータが格納されるからこれで良い
	*
	move.l	cpat(sp),a2
	tst.l	mode(sp)
	beq	@f
	ori.w	#reFASTRETN,(a2)	* 最初の一致で帰ってくる時
@@:
	move.l	lastchar(sp),-(sp)
	movem.l	d0-d1,-(sp)	* workend,work
	movem.l	a0-a2,-(sp)	* cpat,txtend,txt
	bsr	__re_exec	* 検索
	lea	4*6(sp),sp
	rts

**************************************************************************
* 直前のGrepの結果を得る
* unchar *ResultGrep(unchar *(*cpend))
*
	.offset	4
cpend:		.ds.l	1
*
	.text
	.even
*
	.xdef	_ResultGrep
_ResultGrep:
	move.l	cpend(sp),a1
	lea	re_regs(pc),a0
	move.l	reTAIL(a0),(a1)	* 一致部分末尾+1
	move.l	reHEAD(a0),d0	* 一致部分先頭
	rts

**************************************************************************

	.end
