#include "defines.h"
#include "amacro.h"
#include "astdio.h"
#include "vsiki.h"

int vsiki_readF(unchar *line,long *num,int fpr,int pmode,VARSYS *gvar,VARSYS *lvar)
/* ファイル＋継続付き式評価処理（ローカル変数対応）*/
{
unchar c;
int ret;
	do {
		while (c=*line,c==SPC||c==TAB) line++;
		if (c==0) {ret=0; break;} /* 式評価終了 */
		// ファイル指定？
		if (c=='.') { // 先頭が'.'で始まる時＝ファイル名指定
		    #define	LMAX	128
		    unchar buff[LMAX],fname[MAXPATH],*p,*f;
		    FILE *fp;
			// .File.ext ; そのファイルの内容を実行する
			// ファイル名抽出
			// '.'の次からSPC/TAB/'\n',',',EOSまでの間
			f=fname;
			p=line; // 最初の'.'を飛ばしてスタート
			while (c=*++p,c!=SPC && c!=TAB && c!='\n' && c!=',' && c!=0) {
				*f++=c;
			}
			*f=0; // EOS
			// セパレーターまで飛ばす
			while (c=*p,c!='\n' && c!=',' && c!=0) p++;
			line=p;
			fp=fopen(fname,"rt");
			if (fp==NULL) {
				ret=100;
				printsn("ファイルが見つかりません：",fname);
				break;
			}
			if (fpr) { /* 中間報告 */
				printsn("ファイル実行：",fname);
			}
			while (fgets(buff,LMAX,fp)!=NULL) {
				p=buff;
				while (c=*p,c==SPC||c==TAB) p++;
				if (c!=0 && c!='\n') {
					if (c==';') continue; // コメント行
					// ネスティング；再起呼びだし
					ret=vsiki_readF(p,num,fpr,pmode,gvar,lvar);
					if (ret>0) break;
				} // 空行はスキップ
			}
			fclose(fp);
			if (ret>0) return(ret);
			c=*line;
			if (c=='\n'|c==0) return(0); // ファイル名の後ろはない
		}
		/* 式評価 */
		ret=vsiki(&line,num,gvar,lvar);
		if (fpr) { /* 中間報告 */
			if (ret<=0) {
				prints(" = ");
				PrintBase(*num,pmode);
				crlf();
			}
		}
	} while (ret<0);
	return(ret);
}
