/* tokenペアの中間コードレベルサーチ（実行時）*/
/* if/elif-else-endif/break/continue等のtokenペアを探す */
// text  <- ペアの次のトークンのアドレス
// btext <- ペアトークンのアドレス
// ネスティング対応(max short範囲)

#include "stk.h"

int STKSearchPair(STKCOM *tbl,int st,int st2,int ed,int ed2,unchar *(*text),unchar *(*btext))
{
short nest=1; // 最初の１つはあるから
unchar c,len,*ctext;
	ctext=*text;
	do {
		*btext=ctext; /* これから始まる中間コードの先頭アドレス記録 */
		c=*ctext++;
		if (c<=SCCMD) { /* 比較対象はコマンドのみ */
			len=*ctext++; // コマンドだから偶数バイト化は不要
			// if (c&FJUMP) c^=FJUMP;
			c&=(~FJUMP);
			if (*(STKCOM **)ctext==tbl) {
				// st,edはコマンドテーブルの要素番号である
				if (c==st||c==st2) nest++;
				else
				if (c==ed||(nest==1 && c==-ed2)||c==ed2) nest--;
				// ed2<0はnest=1の時しか有効にならない
				/* st2,ed2==0なら絶対に一致しない */
				/* 中間コードに0はないから */
			}
			ctext+=len;
		} else { /* その他はスキップ */
			if (c==SCEND) return(ENDOK); // SCENDのときは飛ばさず帰る
			ctext+=EvenLen(*ctext++); // 偶数バイト化付き
		}
	} while (nest>0);
	*text=ctext;
	return(OK);
}
