#include <stdio.h>
#include <process.h>
#include <error.h>
#include "defines.h"
#include "aig.h"

int execute_fname(argv,fname,flook,fask,fkbclr)
const unchar *argv,*fname;
int flook,fask,fkbclr;
/* argv  : コマンド文字列 "コマンド名 オプション * : *にファイル名が入る */
/* fname : 与えるファイル名 */
{
int no,p,len,i;
unchar argvv[256],*argp[128];
	if (fask) flook=1; /* 確認する時は表示する */
	
	/* 引数の数を数える */
	no=GetTokenNo(argv," \t");
	if (no>127) return(-2); /* コマンド名＋オプション＋ファイル名の数が多すぎる */
	/* 127 = 256(引数列の最大長さ) , １引数最小バイト数２(?,00) , -1 */
	
	/* コマンド文字列分解＆ファイル名挿入 */
	/* argv -> argvv[](token) , argp[](point) */
	for (p=0,i=0;i<no;i++) {
		argp[i]=&argvv[p];
		GetToken(argv,i+1,argp[i]," \t");
		if (strcmp(argp[i],"*")==0) strcpy(argp[i],fname);
		len=strlen(argp[i])+1; /* with 00 */
		if (p+len>255) return(-3); /* 引数が長すぎる */
		if (flook) {
			/* コマンドライン表示 */
			prints(argp[i]);
			if (i==no-1) crlf();
			else spc();
		}
		p+=len;
	}
	argp[no]=NULL; /* end of argment */
	
	if (fask) {
		prints("execute ? (Y/N) : ");
		i=kywait(fkbclr); /* 'Y'/'N' */
		if (i==-1) return(-4); /* No */
		if (i==-2) {
			crlf();
			return(-5); /* ESC */
		}
		prints("\r\x1b[0K");
	}
	
	/* プログラム起動 */
	i=spawnvp(P_WAIT,argp[0],argp); /* まずはspawnで起動してみる */
	if (i==-1) { /* spawnで起動出来ない時＝内部コマンドの可能性有り */
		len=errno; /* エラー番号を保存 */
		/* パラメーター結合 */
		for (p=0,i=0;i<256;i++) {
			if (argvv[i]==0) {
				p++;
				if (p==no) break;
				argvv[i]=' ';
			}
		}
		/* systemで起動してみる */
		i=system(argvv);
		if (i==-1) errno=len; /* systemでも起動出来ない時は完全なエラーなのでエラー番号を戻す */
		/* 起動出来た時は内部コマンドだった */
	}
	return(i);
}
