118 lines
2.2 KiB
NASM
118 lines
2.2 KiB
NASM
|
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
|
|||
|
|