__mdwopt__stubs__private__ * 1

	GET	hdr.mdwopt

OS_Module	* &1E

	GBLA	SWIBASE
	MACRO
	DefSWI	$n
$n	*	SWIBASE
X$n	*	SWIBASE :OR: &20000
SWIBASE	SETA	SWIBASE + 1
	MEND

MDWOpt_SWIBASE	* &9FFC0

SWIBASE	SETA	MDWOpt_SWIBASE

	DefSWI	MDWOpt_InitArgs
	DefSWI	MDWOpt_ReadArgs
	DefSWI	MDWOpt_ParseCommandString
	DefSWI	MDWOpt_AddLongOption
	DefSWI	MDWOpt_ReconstituteCommandString


	IMPORT	malloc


	EXPORT	mdwopt

	EXPORT	mdwopt_init_args
	EXPORT	mdwopt_read_args
	EXPORT	mdwopt_parse_command_string
	EXPORT	mdwopt_add_long_option
	EXPORT	mdwopt_reconstitute_string

	EXPORT	xmdwopt_init_args
	EXPORT	xmdwopt_read_args
	EXPORT	xmdwopt_parse_command_string
	EXPORT	xmdwopt_add_long_option
	EXPORT	xmdwopt_reconstitute_string

	EXPORT	mdwopt_global


	AREA	|mdwopt$$code|, CODE, READONLY

mdwopt	ROUT
	MOV	ip,sp
	STMDB	sp!,{a1-a4}
	STMDB	sp!,{v1-v3,fp,ip,lr,pc}
	SUB	fp,ip,#&14
ok	LDMIB	ip,{v1,v2}
	TEQ	v1,#0		; no mdwopt data block?
	LDREQ	v1,=mdwopt_global ; use the default
	LDR	a1,[v1,#optvar-mdwopt_global] ; called MDWOpt_InitArgs?
	TEQ	a1,#0
	BNE	gotvarbuf
	MOV	a1,#0		; ... no - do so
	LDR	a2,[fp,#8]	; (stacked |argv|)
	LDR	a2,[a2]
	LDR	a3,[ip,#8]	; (stacked |flags|)
	SWI	XMDWOpt_InitArgs
	BVS	retry		; the module may not be loaded
	SUB	a1,a1,#40
	BL	malloc		; claim a buffer for the variable
	TEQ	a1,#0		; if 0, we have a Problem :-(
	MOVEQ	a1,#'?'
	LDMEQDB	fp,{v1-v3,fp,sp,pc}^
	STR	a1,[v1,#optvar-mdwopt_global] ; store the buffer address
	MOV	a1,v1		; now fill in the data block
	LDR	a2,[fp,#8]	; (stacked |argv|)
	LDR	a2,[a2]
	LDR	a3,[fp,#8+&14]	; (stacked |flags|)
	SWI	XMDWOpt_InitArgs
gotvarbuf
	LDMIB	fp,{a1-a4}	; restore args from stack
	SWI	XMDWOpt_ReadArgs
	LDR	v1,[fp,#&14]	; (stacked |longind|)
	TEQ	v1,#0
	STRNE	r2,[v1]
	MOV	a1,r1
	LDMDB	fp,{v1-v3,fp,sp,pc}^
retry	LDR	lr,[r0]
	SUB	lr,lr,#&100
	TEQ	lr,#&E6		; unknown SWI error?
	BNE	gotvarbuf	; no - allow MDWOpt_ReadArgs to fall over
	MOV	r0,#1		; else load module and retry
	ADR	r1,mdwopt_mod
	SWI	OS_Module	; cause SIGOSERROR on failure :-)
	B	ok

mdwopt_mod
	=	"System:Modules.MDWOpt",0
	ALIGN


	AREA	|mdwopt_init_args$$code|, CODE, READONLY

mdwopt_init_args
	STMFD	sp!,{lr}
	SWI	MDWOpt_InitArgs
	LDMFD	sp!,{pc}


	AREA	|xmdwopt_init_args$$code|, CODE, READONLY

xmdwopt_init_args
	STMFD	sp!,{a3,lr}
	SWI	XMDWOpt_InitArgs
	LDMFD	sp!,{a3,lr}
	MOVVSS	pc,lr
	TEQ	a3,#0
	STRNE	a1,[a3]
	MOV	a1,#0
	MOVS	pc,lr


	AREA	|mdwopt_read_args$$code|, CODE, READONLY

mdwopt_read_args
	MOV	ip,sp
	STMDB	sp!,{v1,v2,fp,ip,lr,pc}
	SUB	fp,ip,#4
	LDMIA	ip,{v1,v2}
	SWI	MDWOpt_ReadArgs
	LDR	a1,[ip,#8]
	TEQ	a1,#0
	STRNE	a3,[a1]		; long option index
	LDR	a1,[ip,#12]
	TEQ	a1,#0
	STRNE	a4,[a1]		; number
	LDR	a1,[ip,#16]
	TEQ	a1,#0
	STRNE	v1,[a1]		; ptr to parameter string
	LDR	a1,[ip,#20]
	TEQ	a1,#0
	STRNE	v2,[a1]		; index of next arg
	MOV	a1,a2		; option word/char
	LDMDB	fp,{v1,v2,fp,sp,pc}^


	AREA	|xmdwopt_read_args$$code|, CODE, READONLY

xmdwopt_read_args
	MOV	ip,sp
	STMDB	sp!,{v1,v2,fp,ip,lr,pc}
	SUB	fp,ip,#4
	LDMIA	ip,{v1,v2}
	SWI	XMDWOpt_ReadArgs
	LDMVSDB	fp,{v1,v2,fp,sp,pc}^
	LDR	a1,[ip,#8]
	TEQ	a1,#0
	STRNE	a2,[a1]		; option word/char
	LDR	a1,[ip,#12]
	TEQ	a1,#0
	STRNE	a3,[a1]		; long option index
	LDR	a1,[ip,#16]
	TEQ	a1,#0
	STRNE	a4,[a1]		; number
	LDR	a1,[ip,#20]
	TEQ	a1,#0
	STRNE	v1,[a1]		; ptr to parameter string
	LDR	a1,[ip,#24]
	TEQ	a1,#0
	STRNE	v2,[a1]		; index of next arg
	MOV	a1,#0
	LDMDB	fp,{v1,v2,fp,sp,pc}^


	AREA	|mdwopt_parse_command_string$$code|, CODE, READONLY

mdwopt_parse_command_string
	STMFD	sp!,{lr}
	SWI	MDWOpt_ParseCommandString
	LDMFD	sp!,{pc}^


	AREA	|xmdwopt_parse_command_string$$code|, CODE, READONLY

xmdwopt_parse_command_string
	STMFD	sp!,{a3,lr}
	SWI	XMDWOpt_ParseCommandString
	LDMFD	sp!,{a3,lr}
	MOVVSS	pc,lr
	TEQ	a3,#0
	STRNE	a1,[a3]
	MOV	a1,#0
	MOVS	pc,lr


	AREA	|mdwopt_add_long_option$$code|, CODE, READONLY

mdwopt_add_long_option
	MOV	ip,sp
	STMDB	sp!,{a2,a3,v1-v3,fp,ip,lr,pc}
	SUB	fp,ip,#4
	LDMIA	ip,{v1-v3}
	LDR	a2,[a2]
	LDR	a3,[a3]
	SWI	MDWOpt_AddLongOption
	LDMIA	sp,{v2,v3}
	TEQ	v2,#0
	STRNE	a2,[v2]
	TEQ	v3,#0
	STRNE	a3,[v3]
	LDMDB	fp,{v1-v3,fp,sp,pc}^


	AREA	|xmdwopt_add_long_option$$code|, CODE, READONLY

xmdwopt_add_long_option
	MOV	ip,sp
	STMDB	sp!,{a2,a3,v1-v3,fp,ip,lr,pc}
	SUB	fp,ip,#4
	LDMIA	ip,{v1-v3}
	LDR	a2,[a2]
	LDR	a3,[a3]
	SWI	XMDWOpt_AddLongOption
	LDMVSDB	fp,{v1-v3,fp,sp,pc}^
	LDMIA	sp,{v2,v3}
	TEQ	v2,#0
	STRNE	a2,[v2]
	TEQ	v3,#0
	STRNE	a3,[v3]
	MOV	a1,#0
	LDMDB	fp,{v1-v3,fp,sp,pc}^


	AREA	|mdwopt_reconstitute_command_string$$code|, CODE, READONLY

mdwopt_reconstitute_command_string
	STMFD	sp!,{lr}
	SWI	MDWOpt_ReconstituteCommandString
	LDMFD	sp!,{pc}^


	AREA	|xmdwopt_reconstitute_command_string$$code|, CODE, READONLY

xmdwopt_reconstitute_command_string
	STMFD	sp!,{lr}
	SWI	XMDWOpt_ReconstituteCommandString
	LDMVSFD	sp!,{pc}^
	LDR	a2,[sp,#4]
	TEQ	a2,#0
	STRNE	a1,[a2]
	MOV	a1,#0
	LDMFD	sp!,{pc}^


	AREA	|mdwopt_global$$data|, DATA

mdwopt_global
optarg	&	0
optopt	&	0
optind	&	0
opterr	&	1
optprog	&	0
	&	0, 0, 0, 0
optvar	&	0


	END
