dos_compilers/Borland Turbo C v2/SETENVP.ASM
2024-07-02 06:22:27 -07:00

118 lines
2.2 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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