*******************************************************************************
* Init v1.0.1
*******************************************************************************
* INFO	execute some system inits
* SYNOPSIS	success = Init[]
*	d0
* OUT	success	FALSE=ERROR; TRUE=OK!
* MODIFIES	_DOSBase	dos.library ptr
*	_StdOut	standard output filehandle
*	CmdLnPtr	ptr to start of command line
*	CmdLnLen	length of command line
* REQUIRES	_DOSName	address of "dos.library",0
*******************************************************************************

	function Init[],d1/a0-a1/a6:d0.l

	move.l	a0,CmdLnPtr	;store command line
	move.l	d0,CmdLnLen	;data

	movea.l	4.w,a6
	lea.l	_DOSName,a1
	moveq.l	#0,d0
	jsr	(_LVOOpenLibrary,a6)
	move.l	d0,_DOSBase

	when.s d0
	 movea.l	d0,a6
	 jsr	(_LVOOutPut,a6)
	 move.l	d0,_StdOut	;still TRUE (~0)
	ewhen

	efunc

*******************************************************************************
* CleanUp v1.0.3
*******************************************************************************
* INFO	frees allocated system resources
* SYNOPSIS	CleanUp[]
* REQUIRES	_DOSBase	dos.library ptr
*******************************************************************************

	procedure CleanUp[],d0-d1/a0-a1/a6

	move.l	InFileHnd,d1	;source file handle
	when.s d1.l
	 movea.l	_DOSBase,a6
	 jsr	(_LVOClose,a6)
	ewhen

	move.l	WrkBufLen,d0	;free allocated buf
	when.s d0.l
	 movea.l	4.w,a6
	 movea.l	WrkBufAdr,a1
	 jsr	(_LVOFreeMem,a6)
	ewhen

	movea.l	_DOSBase,a1
	movea.l	4.w,a6
	jsr	(_LVOCloseLibrary,a6)

	moveq.l	#0,d0	;retcode
	eproc

*******************************************************************************
* Print v1.0.0
*******************************************************************************
* INFO	prints a text to the standard output if quiet mode is OFF
* SYNOPSIS	Print[TxtPtr]
*	      d2
* IN	TxtPtr	ptr to NULL-terminated text string
* REQUIRES	_DOSBase	dos.library ptr
*	_StdOut	standard output handle
*******************************************************************************

	procedure Print[d2],d0-d3/a0-a1/a6

	move.b	flags,d0
	andi.b	#1<<F_QUIETMODE,d0

	when.s ~d0.b		;if quiet mode OFF
	 movea.l	d2,a0
.findend	 tst.b	(a0)+
	 bne.s	.findend	;find end of string
	 move.l	a0,d3
	 sub.l	d2,d3	;length
	 movea.l	_DOSBase,a6
	 move.l	_StdOut,d1
	 jsr	(_LVOWrite,a6)
	ewhen

	eproc

*******************************************************************************
* ShowResult v1.1.0
*******************************************************************************
* INFO	prints out the texts associated to a given errcode
* SYNOPSIS	ShowResult[ErrCode]
*	           d0
* IN	ErrCode	0=OK, else E_xxxxxx (see defs.i)
*******************************************************************************

	procedure ShowResult[d0]
	when.s d0
	 Print[#txt_error]	;"ERROR: "
	ewhen
	Print[(ErrTab,d0.l*4)]	;print msg
	eproc

*******************************************************************************
* SkipSpaces v1.0.0
*******************************************************************************
* INFO	starting from the current position in a string, returns the
*	position of the 1st character different from ' '
* SYNOPSIS	SkipSpaces[StrPtr]
*	           a0
* IN	StrPtr	ptr to a string
* MODIFIES	a0.l	position of the 1st char <>' '
*******************************************************************************

	procedure SkipSpaces[a0]
.find	cmpi.b	#' ',(a0)+
	beq.s	.find
	subq.l	#1,a0
	eproc

*******************************************************************************
* Valu v1.0.2
*******************************************************************************
* INFO	converts a decimal ASCII string to an unsigned long integer
* SYNOPSIS	IntVal = Valu[StrPtr]
*	d0	a0
* IN	StrPtr	ptr to numerical string
* OUT	IntVal	unsigned integer
* MODIFIES	a0.l	ptr after string
* NOTE	it stops at the 1st char not inside ['0'...'9']
*******************************************************************************

	function Valu[a0],d1-d2:d0
	moveq.l	#0,d0
	moveq.l	#0,d1
	do
	 move.b	(a0)+,d1	;get a digit (d)
	 subi.b	#'0',d1	;convert to int
	 bcs.s	.exit	;if <0...
	 cmpi.b	#9,d1
	 bhi.s	.exit	;if >9...
	 move.l	d0,d2	;IntVal
	 add.l	d0,d0	;2*IntVal
	 lsl.l	#3,d2	;8*IntVal
	 add.l	d2,d0	;10*IntVal
	 add.l	d1,d0	;10*IntVal+d -> IntVal
	loop
.exit
	efunc

*******************************************************************************
* Stru v1.0.0
*******************************************************************************
* INFO	converts an unsigned long integer to a NULL-terminated, decimal
*	ASCII string
* SYNOPSIS	Stru[Int,Dest,Len]
*	     d0  a0   d1
* IN	Int	integer to convert
*	Dest	ptr to destination buffer
*	Len	the string will be exactly Len chars long
*		(MUST be >0!!!)
* NOTE	the destination buffer MUST be at least Len+1 bytes long!
*******************************************************************************

	procedure	Stru[d0/a0/d1],d0-d2/a0
	adda.l	d1,a0	;last digit adr+1
	clr.b	(a0)	;final BLANK
	subq.l	#1,d1
	expire d1=d1
	 divul.l	#10,d2:d0	;last digit
	 addi.b	#'0',d2	;convert to ASCII
	 move.b	d2,-(a0)	;store
	nexp
	eproc

*******************************************************************************
* GetFileSize v1.0.1
*******************************************************************************
* INFO	returns the size in bytes of a file
* SYNOPSIS	Size=GetFileSize[Hnd]
*	d0	d1
* IN	Hnd	filehandle
* OUT	d0	0 on failure
* REQUIRES	_DOSName	address of "dos.library",0
* NOTE	uses TmpBuf (must be on a 4 bytes boundary)
*******************************************************************************

	function GetFileSize[d1],d1-d2/a0-a1/a6:d0
	move.l	#TmpBuf,d2
	movea.l	_DOSBase,a6
	jsr	(_LVOExamineFH,a6)
	when.s d0.l
	 lea.l	TmpBuf,a0
	 move.l	(fib_Size,a0),d0
	ewhen
	efunc
