*************************************************************************
*_envset：子プロセス実行のために、環境文字列ポインタ配列から		*
*	ＯＳの環境構造に変換して自分のヒープエリアにセットし		*
*	そのポインタをかえす						*
*	char		*_envset(env);					*
*	char		*env[];						*
*************************************************************************
* Copyright 1990 SHARP/Hudson		(1990/05/05)
* Arraned for __main3 1993 AIG-SOFT	(1993/04/25)
* 1993/08/17 malloc() -> newmalloc()

	xdef	__envset

	xref	_environ
	xref	_newmalloc
	xref	_free

	.offset	4
env	ds.l	1

	.text
__envset:
	move.l	env(sp),d0		* 環境の指定があるか
	bne	envadok			* ある -> それを使う
	move.l	_environ,d0		* ない時は親の環境をそのまま使う
	rts
	* ユーザー指定の環境を格納するのに必要なエリアサイズを求める -> d2
envadok:
	move.l	d0,a2
	moveq.l	#0,d2
nxtenv:
	move.l	(a2)+,d1
	beq	envadlen
	move.l	d1,a1
	moveq.l	#0,d1
envlen:
	addq.l	#1,d1
	tst.b	(a1)+
	bne	envlen
	add.l	d1,d2
	bra	nxtenv
envadlen:
	addq.l	#6,d2			. 88/01/16 addq.l	#5,d2
	and.l	#$FFFFFE,d2		* .evenと同じ処理
	movem.l	d0,-(sp)		* push 環境アドレス
	move.l	d2,-(sp)		* 環境サイズを持って
	jsr	_newmalloc		* malloc(size)
	tst.l	d0			* error check
	beq	enverr			* error
	movem.l	d0,-(sp)		* 確保された環境格納アドレス
	jsr	_free			* でもすぐ開放する（これでいいのかなあ）
	movem.l	(sp)+,a0-a2		* a0=環境格納アドレス a1=環境サイズ a2=環境アドレス
	* ユーザー環境のコピー
	move.l	a0,d0			* d0 = 環境格納アドレス
	move.l	a1,(a0)+		* まず環境サイズを入れる
nxtptr:
	move.l	(a2)+,d1		* env[i]
	beq	ptrend			* ==NULL
	move.l	d1,a1			* a1=env[i]
ptrcpy:
	move.b	(a1)+,(a0)+		* copy environment
	bne	ptrcpy
	bra	nxtptr
ptrend:
	clr.b	(a0)			* 最後にもう１つ0x00を入れておく
	rts				* d0 = 新環境格納アドレス

enverr:	* エラー
	moveq.l	#-1,d0
	addq.w	#8,sp
	rts
