/*

                        $VER: MM_SearchMsgs  1.0  (15-3-97)

                            ©1997 Neil Williams

*/

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 Parse_Args(strip(args))
        call Header

        call SearchMsgs


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


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', '/c '), '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


Init:

        system.                                         = 0

        system.prg.ver          = Get_Version(0)
        system.prg.name         = 'MM_SearchMsgs'
        system.prg.id           = system.prg.name 'v'system.prg.ver
        system.prg.cfg          = 'MM:Config/'system.prg.name'.cfg'
        system.prg.cr           = '©1997 Neil Williams'
        system.tmpfile          = 'T:'system.prg.name'.tmp'
        system.mm.logpre        = getclip('MM_LogPre')
        system.prg.logpre       = system.mm.logpre'|'
        system.prg.loglevel     = 3
        call                                                            setclip('MM_LogPre', system.prg.logpre)
        system.cmdopts          = 'FROM/K,TO/K,SUBJECT/K,FILE/K'

        call Include_Lib('rexxsupport')
return


Include_Lib: procedure Expose system.

        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 call Quit(20, 'Could not open' lib'!!!')

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, level

        if ~datatype(level, 'N') then level = system.prg.loglevel

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

        MM_WriteLog 'text' level
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)


        /* additional checks... */


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

        say
        say 'Usage:' rx.m.0 || system.prg.name || rx.m.1 system.cmdopts
        say
call Quit(0, 'Usage requested.')




SearchMsgs:

    call open(fh,system.arg.file,"W")

    drop AREAS. SEARCH. RMSG.
    MM_GetAreas AREAS

    do i = 0 to AREAS.COUNT-1

       call Log('Searching area : 'AREAS.i)

       MM_SearchMsgs AREAS.i SEARCH '"'system.arg.from'"' '"'system.arg.to'"' '"'system.arg.subject'"'

       if SEARCH.COUNT ~= 0 then call Log(' ... found 'SEARCH.COUNT' messages')
       else call Log(' ... no messages found')

       do j = 0 to SEARCH.COUNT-1
          MM_ReadMsg AREAS.i SEARCH.j RMSG

          writeln(fh,' ')
          writeln(fh,'-----------------------------------------------------------------------------')
          writeln(fh,'From:    'RMSG.FROM' 'RMSG.FROMADDR'  To: 'RMSG.TO' 'RMSG.TOADDR)
          writeln(fh,'Subject: 'RMSG.SUBJ'    Date: 'RMSG.DATE'    AREA: 'AREAS.i)
          writeln(fh,'-----------------------------------------------------------------------------')

          do k = 0 to RMSG.HEAD.COUNT-1
             writeln(fh,RMSG.HEAD.k)
             end
          do k = 0 to RMSG.TEXT.COUNT-1
             writeln(fh,RMSG.TEXT.k)
             end
          do k = 0 to RMSG.FOOT.COUNT-1
             writeln(fh,RMSG.FOOT.k)
             end

          writeln(fh,' ')
          end /* do j */

       end /* do i */

    call close(fh)

return

