home *** CD-ROM | disk | FTP | other *** search
- 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