	NAME	SETENVP
	PAGE	60,132
;[]------------------------------------------------------------[]
;|	SETENVP.ASM -- Prepare Environment			|
;|								|
;|	Turbo-C Run Time Library	version 2.0		|
;|								|
;|	Copyright (c) 1987,1988 by Borland International Inc.	|
;|	All Rights Reserved.					|
;[]------------------------------------------------------------[]

	INCLUDE RULES.ASI

;	Segment and Group declarations

Header@

;	External references

ExtProc@	malloc, __CDECL__
ExtProc@	abort, __CDECL__

ExtSym@		_envseg, WORD, __CDECL__
ExtSym@		_envLng, WORD, __CDECL__
ExtSym@		_envSize, WORD, __CDECL__
dPtrExt@	environ, __CDECL__

	SUBTTL	Prepare Environment
	PAGE
;/*							*/
;/*-----------------------------------------------------*/
;/*							*/
;/*	Prepare Environment				*/
;/*	-------------------				*/
;/*							*/
;/*-----------------------------------------------------*/
;/*							*/

CSeg@

PubProc@	_setenvp, __CDECL__

;	Allocate a buffer to hold environment variables

IF	LDATA EQ 0
		mov	cx, _envLng@
		push	cx
		call	malloc@
		pop	cx
		mov	di, ax
		or	ax, ax
		jz	_Failed		; Memory allocation failed
		push	ds
		push	ds
		pop	es
		mov	ds, _envseg@
		xor	si, si
		cld
		rep	movsb
		pop	ds
		mov	di, ax
ELSE
		mov	es, _envseg@
		xor	di, di
ENDIF

;	Allocate a buffer to hold envp array

		push	es		; Save Environment Segment address
		push	_envSize@
		call	malloc@
		add	sp, 2
		mov	bx, ax
		pop	es		; Restore Environment Segment address
IF	LDATA
		mov	word ptr environ@, ax
		mov	word ptr environ@+2, dx
		push	ds
		mov	ds, dx
		or	ax, dx
ELSE
		mov	word ptr environ@, ax
		or	ax, ax
ENDIF
		jnz	SetEnviron	; Memory allocation failed
_Failed		label	near		; Memory allocation failed
		jmp	abort@


;	Now, store environment variables address

SetEnviron	label	near
		xor	ax, ax
		mov	cx, -1
SetEnviron0	label	near
		mov	[bx], di
IF	LDATA
		mov	[bx+2], es
		add	bx, 4
ELSE
		add	bx, 2
ENDIF
		repnz	scasb
		cmp	es:[di], al
		jne	SetEnviron0	; Set next pointer
IF	LDATA
		mov	[bx], ax
		mov	[bx+2], ax
		pop	ds
ELSE
		mov	[bx], ax
ENDIF
		ret
EndProc@	_setenvp, __CDECL__

CsegEnd@
	END
