/*****************************************************************************/
/* ＳＴＫ外部コマンド：コマンドライン */
/*****************************************************************************/

#include <stdlib.h>
#include "defines.h"
#include "stk.h"

/*****************************************************************************/

static int Sargenv(NSTACK nstk[],int mode)
// コマンドラインと環境変数
{
int ret;
unchar *str;
extern STKSYS *stksys;
STKSYS *sys;
	sys=stksys; // 省メモリーのためローカル変数に置き換える
	if (mode>=2) str=Cadrs(NN0);
	switch (mode) {
		case 0:	// ARGC → num(0)
			ret=sys->argc;
			break;
		case 1: // work(1:NADRS) num(0) argv → なし
			/* argv[num]をworkに格納する */
			if (NN0>=sys->argc) return(ARGERR);
			return(ARYStoreB(&NS1,sys->argv[NN0],0));
		
		case 2:	// str(0:NADRS/NSTR1) putenv → ret(0)
			// str:"name=string"
			ret=putenv(str);
			break;
		case 3:	// work(1:NADRS) str(NADRS/NSTR1:0) getenv → ret(0)
			if (str==NULL) return(NULLERR); // envにNULLは無効
			str=getenv(str);
			if ((ret=ARYStoreB(&NS1,str,0))) return(ret);
			ret=(str==NULL? 1:0);
			break;
	}
	NN0=(long)ret;
	return(NOK);
}

/*****************************************************************************/

static int Sexec(NSTACK nstk[],int mode)
/* ＯＳコマンド実行 */
/* (argv1 argv2{NADRS/NSTR} ...).(NNUM:1) path(NADRS/NSTR1:0) EXEC → ret(0) */
{
#define AMAX	64
unchar *argv[AMAX];
int ret,i;
NSTACK ns;
	if (NN1>AMAX) return(ARGOVER); /* 引数が多すぎる */
	if ((argv[0]=Cadrs(NN0))==NULL) return(NULLERR); // pathにNULLは無効
	for (i=1;i<=NN1;i++) {
		if ((ret=STKChgVarNumSub(NSTR1,&ns))) return(ret);
		argv[i]=Cadrs(ns.num);
	}
	argv[i]=NULL;
	/* 実行 */
	NN0=(long)xspawnvp(argv[0],argv);
	return(NOK);
}

/*****************************************************************************/
/* コマンドテーブル */

STKCOM comtbl[]={
	 {NULL		,NULL	,TNONE,0,0}
	,{"ARGC"	,Sargenv,TNONE,1,0}		// コマンドライン引数数
	,{"ARGV"	,Sargenv,TNUM TADRS,0,1}	// コマンドライン引数
	,{"PUTENV"	,Sargenv,TSTR1,1,2}		// 環境変数設定
	,{"GETENV"	,Sargenv,TSTR1 TADRS,1,3}	// 環境変数読み出し
	,{"EXEC"	,Sexec	,TSTR1 TNUM,1,0}	// 子プロセス実行
	,{NULL		,NULL	,TNONE,0,0}
};

/*****************************************************************************/
