ETENVP.ASM -- Prepare Environment

NAME SETENVP
PAGE 60,132
;[]------------------------------------------------------------[]
;| SETENVP.ASM -- Prepare Environment |
;| |
;| Turbo-C Run Time Library version 2.0 |
;| |
;| Copyright (c) 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



Learn More :