; In 1.1 : execute a command in a certain directory.
; by Kyzer/CSG
; $VER: In.asm 1.1 (09.04.98)
;
	incdir	include:
	include	lvo/exec_lib.i
	include	lvo/dos_lib.i
	include	dos/dos.i

stackf	MACRO	; stack_symbol, stackelement_symbol
	IFND	\1
\1	set	0
	ENDC
\1	set	\1-4
\2	equ	\1
	ENDM

	stackf	stk, cmd	; these two filled
	stackf	stk, dir	; by ReadArgs()
	stackf	stk, rdargs	; result of ReadArgs()
	stackf	stk, fib	; FileInfoBlock
arg=dir

In	link	a5,#stk
	move.l	4.w,a6
	moveq	#20,d6
	lea	dosname(pc),a1	; dos.library v37+
	moveq.l	#37,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,a6
	tst.l	d0
	beq	.nodos

	lea	templat(pc),a0
	move.l	a0,d1
	lea	arg(a5),a0
	move.l	a0,d2
	clr.l	(a0)+
	clr.l	(a0)+
	moveq	#0,d3
	jsr	_LVOReadArgs(a6)
	move.l	d0,rdargs(a5)
	beq.s	.noargs

	moveq	#DOS_FIB,d1
	moveq	#0,d2
	jsr	_LVOAllocDosObject(a6)
	move.l	d0,fib(a5)
	beq.s	.nofib

	move.l	dir(a5),d1
	moveq	#ACCESS_READ,d2
	jsr	_LVOLock(a6)
	move.l	d0,d7
	move.l	d0,d1
	beq.s	.nolock
	move.l	fib(a5),d2
	jsr	_LVOExamine(a6)
	move.l	d7,d1
	tst.l	d0
	beq.s	.noexam

	move.l	fib(a5),a0
	tst.l	fib_DirEntryType(a0)
	bgt.s	.isdir
	move.l	#ERROR_OBJECT_WRONG_TYPE,d1
	jsr	_LVOSetIoErr(a6)
	bra.s	.notdir

.isdir	move.l	d7,d1
	jsr	_LVOCurrentDir(a6)
	move.l	d0,d7

	move.l	cmd(a5),d1
	moveq	#0,d2
	jsr	_LVOSystemTagList(a6)
	move.l	d0,d6

	move.l	d7,d1
	jsr	_LVOCurrentDir(a6)
	move.l	d0,d1
.notdir
.noexam	jsr	_LVOUnLock(a6)
.nolock	moveq	#DOS_FIB,d1
	move.l	fib(a5),d2
	jsr	_LVOFreeDosObject(a6)
.nofib

.noargs	move.l	rdargs(a5),d1
	bne.s	.argsok
	lea	info(pc),a0
	move.l	a0,d1
	jsr	_LVOPutStr(a6)	; put info if args failed
	move.l	rdargs(a5),d1
.argsok	jsr	_LVOFreeArgs(a6)
	jsr	_LVOIoErr(a6)
	move.l	d0,d1
	moveq	#0,d2
	jsr	_LVOPrintFault(a6)
	move.l	a6,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
.nodos	move.l	d6,d0
	unlk	a5
	rts

dosname	dc.b	"dos.library",0
templat	dc.b	"DIRECTORY/A,DO=COMMAND/A/F",0
	dc.b	"$VER: "
info	dc.b	"In 1.1 (09.04.98) by Kyzer/CSG",10
	dc.b	"Usage: in <directory> do <command>",10,10,0
