$!Hunter $! $!I have here news versions of the SAS MXSUM routines provided in [.CONTRIB] $! $!Martin $! $!****************************************************************************** $! Martin Egger, Ph.D., Computing Services - Head of System/User Support Group $! University of Bern, P.O. Box, Laenggassstrasse 51, CH-3012 Bern, Switzerland $! Phone: ++41 (0)31 65 38 45, Fax: ++41 (0)31 65 38 65, Telex: 753 112 unib ch $! RFC: egger@id.unibe.ch, X.400: S=egger;OU=id;O=unibe;P=switch;A=arcom;C=ch; $! HEPNET/SPAN: 20579::49202::egger, DECnet (Switzerland): 49202::egger $!****************************************************************************** $! $!--- cut --- $! $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created by VMS_SHARE Version 8.2 $! On 19-FEB-1993 09:40:10.94 By user SYSTEM $! $! The VMS_SHARE software that created this archive $! was written by Andy Harper, Kings College London UK $! -- December 1992 $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. MX_LOCAL.SAS;27 $! 2. MX_SMTP.SAS;35 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking file ", P1 $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE; PROCEDURE SkipPartsep LOOP EXITIF MARK(NONE)=END_OF(b);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=END_OF(b); IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;ELSE ProcessLine; MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=GET_INFO( COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO( COMMAND_LINE,"output_file"));QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X X`09/* X`09`09Generate`20mail`20accounting`20listing`20from X`09`09MX`20LOCAL`20accounting`20records X X`20`20`20`20`20`20`20`20`20`20`09V`201.3 X`09`09Fl`20/`2021.7.92:`20original`20code X`09`09Eg`20/`2025.9.92:`20cleanup`20and`20more`20reports X`09`09Eg`20/`2016.10.92:`20more`20reports X`09`09`09`09`09`09`20`20`20`20`20`20`09*/ X X`09/*`20libraries`20*/ X X`20`20`20`20`20`20`20`20libname`20lib`20'sys$scratch'`20;`20 X X`09/*`20Read`20data`20*/ X X`20`20`20`20`20`20`20`09data`20lib.local`20;`20 X`20`20`20`20`20`20`20`20`20`20`20infile`20'mx_local_dat'`20; X`20`20`20`20`20`20`20`20`20`20`20format`20source`20$`20char60.`20; X`20`20`20`20`20`20`20`20`20`20`20format`20user`20$`20char24.`20; X`20 X`20`20`20`20`20`20`20`20`20`20`20input`20 X`09`20`20`20date`201-2 X`09`20`20`20@13`20time`20time5. X`20`20`20`20`20`20`20`20`20`20`20@'SOURCE='`20source`20$`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20@'USER='`20user`20$ X`20`20`20`20`20`20`20`20`20`20`20@'SIZE='`20bytes`20; X X`20`20`20`20`20`20`20`20`20`20`20source`20=`20compress(source,'"<>,')`20; X`20`20`20`20`20`20`20`20`20`20`20source`20=`20upcase(source)`20; X`09`20`20`20if`20source`20=`20''`20then`20do`20; X`09`20`20`20`20`20`20source`20=`20'POSTMASTER@UBECLU.UNIBE.CH'`20; X`20`20`20`20`20`20`20`20`20`20`20end`20; X`09 X`20`20`20`20`20`20`20`20`20`20`20user`20=`20compress(user,'",')`20; X`20`20`20`20`20`20`20`20`20`20`20user`20=`20upcase(user)`20; X X`09`20`20`20time`20=`20time`20/`203600`20; X X`20`20`20`20`20`20`20`20`20`20`20label`20source`20=`20'Source*------'`20; X`20`20`20`20`20`20`20`20`20`20`20label`20user`20=`20'User*----'`20; X`20`20`20`20`20`20`20`20`20`20`20label`20bytes`20=`20'Bytes*received*--------' V`20; X X X`09/*`20generate`20reports`20*/ X X`20`20`20`20`20`20`20`20/*`20source`20*/ X X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.local`20out=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20source`20user`20bytes`20; X X`20`20`20`20`20`20`20`20proc`20means`20noprint`20n`20data=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20source`20; X`20`20`20`20`20`20`20`20`20`20`20var`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.source`20sum=bytes`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.source`20noobs`20label`20unifo Vrm`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20source`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20;`20 X`20`20`20`20`20`20`20`20`20`20`20title`20'Incoming`20mail:`20sender`20of`20mes Vsages'`20; X`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20local`20receiver`20*/ X X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.local`20out=lib.user`20; X`20`20`20`20`20`20`20`20`20`20`20by`20user`20source`20bytes`20; X`20 X`20`20`20`20`20`20`20`20proc`20means`20sum`20noprint`20n`20data=lib.user`20; X`20`20`20`20`20`20`20`20`20`20`20by`20user`20; X`20`20`20`20`20`20`20`20`20`20`20var`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.user`20sum=bytes`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.user`20uniform`20label`20noobs V`20split='*'`20;`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20var`20user`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20;`20`20 X`20`20`20`20`20`20`20`20`20`20`20title`20'Incoming`20mail:`20local`20receiver V`20of`20messages'`20; X`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20top`2045`20sources`20`26`20local`20receiver`20*/ V`20 X`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.source`20out=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20descending`20bytes`20source`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.source`20(obs=45)`20label`20no Vobs`20uniform`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20source`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Incoming`20mail:`20sender`20of`20mes Vsages`20(top`2045)'`20; X X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.user`20out=lib.user`20; X`20`20`20`20`20`20`20`20`20`20`20by`20descending`20bytes`20user`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.user`20(obs=45)`20label`20noob Vs`20uniform`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20user`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Incoming`20mail:`20local`20receiver V`20of`20messages`20(top`2045)'`20; X`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20average`20message`20size`20*/`20`20`20 X X`20`20`20`20`20`20`20`20proc`20means`20data=lib.local`20;`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20 X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.aver`20mean=`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Mean`20incoming`20message`20size' V`20; X`20`20`20`20`20`20`20`20`20 X`09/*`20date`20chart`20of`20arriving`20messages`20*/ X X`20`20`20`20`20`20`20`20proc`20chart`20data=lib.local`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Date`20of`20arriving`20messages'`20; V X`20`20`20`20`20`20`20`20`20`20`20hbar`20date`20/`20midpoints`20=`201`202`203 V`204`205`206`207`208`209`2010`2011`2012`2013`2014`2015`2016`2017`2018 X`09`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`2019`2020`2021`2022`2023`2024`2025`2026`2027`2028`2029`2030`2031; X X`09/*`20time`20chart`20of`20arriving`20messages`20*/ X X`20`20`20`20`20`20`20`20proc`20chart`20data=lib.local`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Time`20of`20arriving`20messages'`20; V X`20`20`20`20`20`20`20`20`20`20`20hbar`20time`20/`20midpoints`20=`200`201`202 V`203`204`205`206`207`208`209`2010`2011`2012 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`2013`2014`2015`2016`2017`2018`2019`2020`2021`2022 V`2023`20; X $ call unpack MX_LOCAL.SAS;27 1616728619 "" $! $ create 'f' X X`09/* X`09`09Generate`20mail`20accounting`20listing`20from X`09`09MX`20SMTP`20accounting`20records X X`20`20`20`20`20`20`20`20`20`20`09V`201.3 X`09`09Fl`20/`2021.7.92:`20original`20code X`09`09Eg`20/`2025.9.92:`20cleanup`20and`20more`20reports X`09`09Eg`20/`2016.10.92:`20more`20reports X`09`09`09`09`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`09*/ X X`09/*`20libraries`20*/ X X`20`20`20`20`20`20`20`20libname`20lib`20'sys$scratch'`20;`20 X X`09/*`20read`20data`20*/ X X`20`20`20`20`20`20`20`09data`20lib.smtp;`20 X`20`20`20`20`20`20`20`20`20`20`20infile`20'mx_smtp_dat'`20; X`20`20`20`20`20`20`20`20`20`20`20format`20source`20$`20char60.`20; X`20`20`20`20`20`20`20`20`20`20`20format`20host`20$`20char60.`20; X`20 X`20`20`20`20`20`20`20`20`20`20`20input`20 X`09`20`20`20date`201-2 X`09`20`20`20@13`20time`20time5. X`20`20`20`20`20`20`20`20`20`20`20@'SOURCE='`20source`20$`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20@'HOST='`20host`20$ X`20`20`20`20`20`20`20`20`20`20`20@'BYTES_SENT='`20bytes`20; X X`20`20`20`20`20`20`20`20`20`20`20source`20=`20compress(source,'"<>,')`20; X`20`20`20`20`20`20`20`20`20`20`20source`20=`20upcase(source)`20; X X`09`20`20`20if`20source`20=`20''`20then`20do`20; X`09`20`20`20`20`20`20source`20=`20'POSTMASTER@UBECLU.UNIBE.CH'`20; X`20`20`20`20`20`20`20`20`20`20`20end`20; X X`20`20`20`20`20`20`20`20`20`20`20host`20=`20compress(host,'",')`20; X`20`20`20`20`20`20`20`20`20`20`20host`20=`20upcase(host)`20; X X`09`20`20`20time`20=`20time`20/`203600`20; X X`20`20`20`20`20`20`20`20`20`20`20label`20source`20=`20'Source*------'`20; X`20`20`20`20`20`20`20`20`20`20`20label`20host`20=`20'Host*----'`20; X`20`20`20`20`20`20`20`20`20`20`20label`20bytes`20=`20'Bytes*sent*----'`20; X X X`09/*`20generate`20reports`20*/ X X`20`20`20`20`20`20`20`20/*`20local`20senders`20*/ X X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.smtp`20out=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20source`20host`20bytes`20; X X`20`20`20`20`20`20`20`20proc`20means`20noprint`20n`20data=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20source`20; X`20`20`20`20`20`20`20`20`20`20`20var`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.source`20sum=bytes`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.source`20noobs`20label`20unifo Vrm`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20source`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Leaving`20mail:`20local`20sender`20o Vf`20messages'`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20top`2045`20local`20senders`20*/`20 X`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.source`20out=lib.source`20; X`20`20`20`20`20`20`20`20`20`20`20by`20descending`20bytes`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.source`20(obs=45)`20label`20no Vobs`20uniform`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20source`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Leaving`20mail:`20local`20sender`20o Vf`20messages`20(top`2045)'`20; X X`20`20`20`20`20`20`20`20/*`20hosts`20receiving`20messages`20*/`20 X`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20proc`20sort`20data=lib.smtp`20out=lib.hosts`20; X`20`20`20`20`20`20`20`20`20`20`20by`20host`20; X X`20`20`20`20`20`20`20`20proc`20means`20noprint`20n`20data=lib.hosts`20; X`20`20`20`20`20`20`20`20`20`20`20by`20host`20; X`20`20`20`20`20`20`20`20`20`20`20var`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.hosts`20sum=bytes`20; X X`20`20`20`20`20`20`20`20proc`20print`20data=lib.hosts`20noobs`20label`20unifor Vm`20split='*'`20; X`20`20`20`20`20`20`20`20`20`20`20var`20host`20_freq_`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20sum`20bytes`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Leaving`20mail:`20hosts`20receiving V`20messages'`20; X X`20`20`20`20`20`20`20`20/*`20average`20message`20size`20*/`20`20`20 X X`20`20`20`20`20`20`20`20proc`20means`20data=lib.smtp`20; X`20`20`20`20`20`20`20`20`20`20`20output`20out=lib.aver`20mean=`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Mean`20sent`20message`20size'`20; X X`09/*`20date`20chart`20of`20leaving`20messages`20*/ X X`20`20`20`20`20`20`20`20proc`20chart`20data=lib.smtp`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Date`20of`20leaving`20messages'`20; X`20`20`20`20`20`20`20`20`20`20`20hbar`20date`20/`20midpoints`20=`201`202`203 V`204`205`206`207`208`209`2010`2011`2012`2013`2014`2015`2016`2017`2018 X`09`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`2019`2020`2021`2022`2023`2024`2025`2026`2027`2028`2029`2030`2031; X X`09/*`20time`20chart`20of`20leaving`20messages`20*/ X X`20`20`20`20`20`20`20`20proc`20chart`20data=lib.smtp`20; X`20`20`20`20`20`20`20`20`20`20`20title`20'Time`20of`20leaving`20messages'`20; X`20`20`20`20`20`20`20`20`20`20`20hbar`20time`20/`20midpoints`20=`200`201`202 V`203`204`205`206`207`208`209`2010`2011`2012 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`2013`2014`2015`2016`2017`2018`2019`2020`2021`2022 V`2023`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20 $ call unpack MX_SMTP.SAS;35 2135311142 "" $ v=f$verify(v) $ exit