
* Maxon C++ Library:
* Modul "GetEnv"
* Jens Gelhar 28.01.92, 08.04.94, 20.09.94

	xdef	_getenv,getenv__PCc

	xref	_DosBase,malloc__Ui

GetVar	= -906

_getenv:
getenv__PCc:
	movem.l	d1-d7/a0-a2/a6,-(a7)
	move.l	a7,a2
	move.l	_DosBase,a6
	cmp.w	#36,20(a6)		; mindestens V36
	blt	fail
	moveq	#32,d6			; Buffer-Größe
	sub.l	d6,a7
try	move.l	11*4+4(a2),d1		; Name
	move.l	a7,d2			; Buffer
	move.l	d6,d3			; Size
	moveq	#0,d4			; Flags
	jsr	GetVar(a6)
	tst.l	d0
	bmi.b	fail
	addq.l	#1,d0			; Nullbyte gehört dazu!
	cmp.l	d6,d0
	blo.b	found
	; nochmal mir größerem Buffer versuchen:
	sub.l	d6,a7
	add.l	d6,d6
	bra.b	try
found	; Wert mit Länge d0 liegt auf Stack
	move.l	11*4+4(a2),a1		; Name
	move.l	VarList,a0
find	; Prüfen, ob Wert schon in Liste:
	cmp.w	#0,a0
	beq.b	new
	cmp.l	4(a0),d1
	bne.b	next
	cmp.l	8(a0),d0
	beq.b	here
next	move.l	(a0),a0
	bra.b	find
new	movem.l	d0/d1,-(a7)
	add.l	#14,d0
	move.l	d0,-(a7)
	jsr	malloc__Ui
	addq.l	#4,a7
	move.l	d0,a0
	movem.l	(a7)+,d0/d1
	cmp.w	#0,a0
	beq.b	fail
	move.l	VarList,(a0)
	move.l	a0,VarList
here	; d0/d1 bei a0 einfügen:
	move.l	d1,4(a0)
	move.l	d0,8(a0)
	lea	12(a0),a0
	move.l	a0,d0
	move.l	a7,a1
	subq.l	#1,d2
copy	move.b	(a1)+,(a0)+
	dbeq.b	d2,copy
	clr.b	(a0)
	bra.b	okay
fail	moveq	#0,d0
okay	move.l	a2,a7
	movem.l	(a7)+,d1-d7/a0-a2/a6
	rts

	SECTION "data",DATA

VarList:
	dc.l 0

	end
