; In 1.0 : execute a command in a certain directory.
; by Kyzer/CSG
;
	incdir	include:
	include	lvo.i
	include	dos/dos.i

stackframe=-12
rdargs=-12
dir=-8
cmd=-4

print	MACRO
	lea	\1,a4
	move.l	a4,d1
	IFC	'\2',''
	moveq	#0,d2
	ELSEIF
	lea	\2,a4
	move.l	a4,d2
	ENDC
	jsr	_LVOVPrintf(a6)
	ENDM

	move.l	4.w,a6
	lea	dosname(pc),a1	; dos.library v37+
	moveq.l	#37,d0
	jsr	_LVOOpenLibrary(a6)
	tst.l	d0
	bne.s	start
	moveq	#10,d0
	rts
start	move.l	d0,a6
	link	a5,#stackframe

	lea	templat(pc),a0
	move.l	a0,d1
	lea	dir(a5),a0	; to fill dir and cmd
	move.l	a0,d2
	clr.l	(a0)+
	clr.l	(a0)+
	moveq	#0,d3
	jsr	_LVOReadArgs(a6)
	move.l	d0,rdargs(a5)
	bne.s	.gotarg
	print	about(pc)
	bra	.exit
.gotarg	move.l	dir(a5),d1
	move.l	#ACCESS_READ,d2
	jsr	_LVOLock(a6)
	tst.l	d0
	bne.s	.gotdir
	print	nodir(pc),dir(a5)
	bra.s	.free
.gotdir	move.l	d0,d1
	jsr	_LVOCurrentDir(a6)
	move.l	d0,d7
	jsr	_LVOOutput(a6)
	move.l	d0,d3
	moveq	#0,d2
	move.l	cmd(a5),d1
	jsr	_LVOExecute(a6)
	tst.l	d0
	bne.s	.didcmd
	print	nocmd(pc),cmd(a5)
.didcmd	move.l	d7,d1
	jsr	_LVOCurrentDir(a6)
	move.l	d0,d1
	jsr	_LVOUnLock(a6)
.free	move.l	rdargs(a5),d1
	jsr	_LVOFreeArgs(a6)
.exit	move.l	a6,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
	unlk	a5
	moveq	#0,d0
	rts

dosname	dc.b	"dos.library",0
templat	dc.b	"DIRECTORY/A,DO=COMMAND/A/F",0
nodir	dc.b	"Can't change to '%s' directory",10,0
nocmd	dc.b	"Error occurred executing '%s'",10,0
	dc.b	"$VER: "
about	dc.b	"In 1.0 (24.4.97) FREEWARE by Kyzer/CSG",10
	dc.b	"In <directory> do <command>",10,0

