/*

                    $VER: MM_MaintCfg.rexx 0.20  (26.04.96)

                           (C) 1995/96 Robert Hofmann

*/

parse arg args

options cache
options failat 99
options results

signal on break_c
signal on break_d
signal on break_e
signal on break_f
signal on halt
signal on ioerr
signal on syntax

address 'MAILMANAGER'


Main:

	call Init
	call Header
	call Parse_Args(args)
	call Maint_Cfgs

call Quit(0, 'All done.')
exit


break_c:; break_d:; break_e:; break_f:; halt:

	signal off break_c
	signal off break_d
	signal off break_e
	signal off break_f
	signal off halt

	return_code		=	5
	error_line    = 0
	error_msg			= 'Execution halted!!!'
	rc						= 0
signal Exit


Command: procedure Expose system.

	parse arg cmd

	address command cmd

	if rc>5 then call Log('*** WARNING: Command "'cmd'" returned' rc'.')
return rc


Exit:

	select
		when return_code>=40 then error = 'INTERNAL-ERROR:'
		when return_code>=30 then error = 'IO-ERROR:'
		when return_code>=20 then error = 'ERROR:'
		when return_code>=10 then error = 'WARNING:'
		when return_code>=5  then error = 'INFO:'
		otherwise									error = ''
	end

  call Log()
	call Log('***' strip(error error_msg) '***', '+')
	call Log(,'\')

	call setclip('MM_LogPre', system.mm.logpre)

exit return_code


Get_Arg: procedure Expose args system.

  arg keyword, mode, old

	uargs	= upper(args)
	p			= find(uargs, keyword)

	if p=0	then
		do
			p = pos(' 'keyword'=', ' 'uargs)

			if p>0 then	args	= overlay(' ', args, p+length(keyword))

      p = find(upper(args), keyword)
		end

	system.cmdopt.keyword	= p>0

	select
		when mode=0	then
			if p>0 then
				do
					ret		= 1
					args	= delword(args, p, 1)
				end
			else ret	= old

		when mode=1 then
			if p>0 then
				do
					left	= subword(args, 1, p-1)
					rest	= subword(args, p+1)

					if left(rest, 1)='"' then	parse var rest . '"'	ret '"'	rest
					else											parse var rest				ret			rest

					args	= strip(left strip(rest))
				end
			else ret	= old

		when mode=2 then
			do
				if left(args, 1)='"'	then	parse var args . '"'	ret '"'	args
				else												parse var args				ret 		args

				if strip(ret)=''			then	ret = old
			end

		otherwise exit 99
	end

	args	= strip(args)
	ret		= strip(ret, 'b', '" ')

return ret


Get_Version: procedure

	parse arg mode

	parse value sourceline(3-mode) with . . ver .
	parse var ver tst 'ß' .

	if ~datatype(strip(tst, 'b', '/ce '), 'N') then
		if ~mode then ver = Get_Version(1)
		else exit 99

return ver


Header:

	call Log(,'/')
	call Log('***' system.prg.id '***', '+')
	call Log(' 'system.prg.cr)
	call Log()

return


Include_Lib: procedure

	parse arg lib, prio
	if right(upper(lib), 8)~='.LIBRARY' then lib=lib'.library'
	if prio='' then prio=0

	if ~show('l', lib) then
		if ~addlib(lib, prio, -30, 0) then
			do
				say '*** ERROR: Could not open' lib'!!! ***'
				exit 10
			end
return


Init:

	system.						= 0

	MM_GetTaskPri				'system.taskpri'
	call								pragma('p', system.taskpri)

  system.prg.name		= 'MM_MaintCfg'
	system.prg.ver		= Get_Version(0)
	system.prg.id			= system.prg.name 'v'system.prg.ver
	system.prg.cr			= '(C) 1995/96 Robert Hofmann'
	system.tmpfile		= 'T:'system.prg.name'.tmp'
	system.mm.logpre  = getclip('MM_LogPre')
	system.prg.logpre = system.mm.logpre'|'
	call               	setclip('MM_LogPre', system.prg.logpre)
	system.cmdopts		= 'CFG/K,MAXBACKUP/K/N'

	MM_GetCfgPaths			'system.mm'
	MM_Version					'system.mm'

	call Include_Lib('rexxsupport')
return


IOerr:

	signal off ioerr

	return_code		= 20
	error_line    = sigl
	error_msg			= 'IO-error' rc 'at line' sigl '['errortext(rc)']')
	rc						= 0
signal Exit


Log: procedure Expose system.

	parse arg text, pre

	tmp		= word('PRG MM', (pre~='')+1)
	text	= system.tmp.logpre || pre' 'text

	MM_WriteLog 'text' '2'
return


Maint_Cfgs: procedure Expose system.

	if ~exists(system.arg.cfg) then
		do
			call Log('*** ERROR: Unable to locate' system.arg.cfg'!!!')
			return
		end

	config	= system.arg.cfg

	call Log(' CFG =' config', MAXBACKUP =' system.arg.maxbackup)

	call Command('c:list >'system.tmpfile config',#? lformat "%p%n"')
	MM_ReadStem system.tmpfile 'tmp'
	call delete(system.tmpfile)

	tmp2.		= 0

	do n=0 to tmp.count-1
		parse var tmp.n . ',' nr
		tmp2.nr			= config','nr
		tmp2.count	= max(tmp2.count, nr)
	end

	backup.	= 0
	cnt			= 0

	do n=1 to tmp2.count
		if tmp2.n=0 then iterate

		backup.cnt	= tmp2.n
		cnt					= cnt+1
	end

	backup.count	= cnt
	maxnr					= cnt-1
	drop						tmp. tmp2.

	call Log(' Found' backup.count 'backup-configs')

	if backup.count>system.arg.maxbackup then
		do
			do n=1 to system.arg.maxbackup
				new	= config','n
				nr	= maxnr-system.arg.maxbackup+n
				old	= backup.nr

				call Log(' Moving' old '->' new'...')

				call delete(new)
				call rename(old, new)
			end

			do n=system.arg.maxbackup+1 to maxnr-system.arg.maxbackup+1
				call Log(' Deleting' system.arg.cfg','n'...')
				call delete(system.arg.cfg','n)
			end
		end
	else call Log(' Nothing to do...')

return


Parse_Args: procedure Expose system.

	parse arg args

	tpl		= system.cmdopts',?/S,'
	args	= translate(args, '  ', '9'x'=')

	pk		= pos('/K', tpl)
	ps		= pos('/S', tpl)

	select
		when pk=0	& ps=0	then	p	= 0
		when pk=0 & ps>0	then  p	= ps
		when ps=0 & pk>0	then	p	= pk
		otherwise								p	= min(pk, ps)
	end

	p			= lastpos(',', left(tpl, p))
	tpl		= substr(tpl',', p+1) || left(tpl, max(p-1, 0))

	do while tpl~=''
		parse var tpl template ',' tpl
		parse var template keyword '/' .

		bool	= pos('/S',	template)>0
		key		= pos('/K', template)>0
		must	= pos('/A', template)>0
		num		= pos('/N', template)>0

		select
			when must then		system.arg.keyword	= '0'x
			when bool	then		system.arg.keyword	= 0
			when num	then		system.arg.keyword	= 0

			otherwise					system.arg.keyword	= ''
		end

		if bool | key	then	mode	= ~bool
		else								mode	= 2

		system.arg.keyword	= Get_Arg(keyword, mode, system.arg.keyword)

		if keyword='?' & system.arg.keyword=1 then leave

		if must & system.arg.keyword='0'x then
			do
				tmp	= template 'missing!!!'

				say
				say ' ***' tmp '***'

				signal Usage
			end

		if num & ~datatype(system.arg.keyword, 'N') then
			if ~must & system.arg.keyword='' then	system.arg.keyword	= 0
			else
				do
					tmp	= 'Numeric value expected for' template', but is "'system.arg.keyword'"!!!'

					say
					say ' ***' tmp '***'

					signal Usage
				end
	end

	tmp	= '?'; if system.arg.tmp then signal Usage

	if args~='' then call Quit(10, 'Unknown option(s):' args)


	if system.arg.cfg=''				then
		if system.mm.release<429	then	system.arg.cfg				= 'MM:Config/MailManager.cfg'
		else														system.arg.cfg				= system.mm.cfgfile

	if system.arg.maxbackup<=0	then	system.arg.maxbackup	= 5

return


Quit:

	parse arg return_code, error_msg

	error_line    = 0
	rc						= 0
signal Exit


Syntax:

	signal off syntax

	return_code		= 40
	error_line    = sigl
	error_msg			= 'Syntax-error' rc 'at line' sigl '['errortext(rc)']'
	rc						= 0
signal Exit


Usage:

	rx.			= ''
	rx.0.0	= '[rx] '
	rx.0.1	= '[.rexx]'
	m				=	pos('/e', system.prg.ver)>0
	tmp			= rx.m.0 || system.prg.name || rx.m.1

	say
	say 'Usage:' tmp system.cmdopts
	say
call Quit(0, 'Usage requested.')

