/* テキストからtokenを切り出す：ｺﾒﾝﾄｽｷｯﾌﾟ付き（中間コード化時：切り放し不可）*/

#include "deftype.h"
#include "stk.h"

int STKTokenGet(unchar token[],unchar *(*text),unchar *(*btext))
/* "〜"は文字列となり、その中にセパレーターがあってもいい */
/* '〜'は１文字コードとなり、その中にセパレーターがあってもいい */
/* ;で始まるトークンがあったとき、行末までスキップする */
/* text → token : text=次の取り出し位置 */
// btext <- このトークンの先頭位置
/* return : OK=token , ENDOK=tokenなし=終了 , >0=エラー */
{
unchar *txt,*tkn,c,c0;
short i;
	txt=*text;
    SKIP:;
	/* セパレーター飛ばし */
	while (kstrchar(STKSEP,*txt)>=0) txt++;
	if (*txt==0) return(ENDOK); /* all END */
	
	/* token先頭 → 切り出し */
	/* token中に"'があったら、次の"'までは文字列/１文字として扱う */
	/* ;で始まるトークンがあったとき、行末までスキップする */
	i=0;
	*btext=txt; // このトークンの開始位置
	tkn=token;
	while (c=*txt,c!=0 && kstrchar(STKSEP,c)<0) {
	    if (c==SYMCMT) { // コメントスキップ
		if (i>0) break; // コメントの直前までをトークンとする
		// ';'から始まるときは行末までスキップ
		while (c=*txt++,c!=CRLF && c!=0);
		if (c==0) return(ENDOK); // コメントのまま最後まで行った
		goto SKIP;
	    }
	    if (++i>TKLEN) return(TKNOVER); /* １トークンが長すぎる */
	    *tkn++=c;
	    txt++;
	    if (c==SYMSTR||c==SYMCODE) { /* 文字列/１文字 */
		c0=c; /* ｾﾊﾟﾚｰﾀｰ記録:"'以外にも簡単に対応できるようになっている */
		while (c=*txt,c!=CRLF && c!=0) {
	    		if (++i>TKLEN) return(TKNOVER); /* １トークンが長すぎる */
			*tkn++=c;
			txt++;
			if (c==c0) break; /* 後ろの閉じ文字を入れて終了 */
		}
		if (c!=c0) return(STRCERR); /* "'が閉じていない */
		/*break;*/
	    }
	}
	*tkn=0;	   /* EOS */
	*text=txt; /* tokenの直後の位置 */
	return(OK);
}
