$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created by VMS_SHARE Version 8.3 $! On 1-JUN-1993 11:46:40.76 By user GOATHUNTER (@WKUVX1.BITNET) $! $! 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. FAOMSG.DESC;1 $! 2. FAOMSG.DSJ;1 $! $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 = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ 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' XThis`20file`20features`20code`20previously`20published`20in`20the`20May/June V`201993`20issue`20of`20 XDigital`20Systems`20Journal.`20It`20was`20originally`20run`20as`20part`20of V`20Hunter`20Goatley's`20 Xarticle,`20"MACRO`20Made`20Easy:`20Readin',`20Writin',`20and`20MACRO,"`20which V`20ran`20on`20page`20 X35.`20The`20article`20describes`20the`20$FAO`20system`20service`20and`20the V`20MESSAGE`20utility.`20 XBoth`20provide`20the`20OpenVMS`20programmer`20with`20an`20easy-to-use`20way V`20to`20produce`20 Xnice-looking`20output`20from`20programs.`20These`20methods`20can`20be`20used V`20by`20programmers`20 Xusing`20all`20OpenVMS`20languages,`20not`20just`20MACRO-32. $ call unpack FAOMSG.DESC;1 2098744408 "" $! $ create 'f' X`09.TITLE`09ACCT_MSG X`09.IDENT`09/01-000/ X!++ X! X!`20`20File:`09ACCT_MSG.MSG X! X!`20`20Author:`09Hunter`20Goatley X! X!`20`20Description: X! X!`09Sample`20message`20file. X! X!`20`20Modification`20history: X! X!`0901-000`09`09Hunter`20Goatley`09`09`20`205-MAR-1993`2015:35 X!`09`09Genesis. X! X!-- X`09.FACILITY`09ACCT,1/PREFIX=ACCT_ X X`09.SEVERITY`09INFORMATIONAL XUICFOUND`09/FAO_COUNT=2 XADDACCT`09`09/FAO_COUN VT=2 XACCTEXISTS`09/FAO_COUNT=2 XRDBADDMSGU`09 X X`09.SEVERITY`09WARNING X XPWDERR`09`09/FAO_COUNT=1 X X`09.SEVERITY`09ERROR XINVMAJOR`09/FAO_COUNT V=2 XGROUPLOW`09 XDIRERR`09`09/FAO_COUNT= V2 XUICIDERR`09- X`09`09/FAO_COUNT=2 X X`09.SEVERITY`09FATAL XNOTEMPLATE`09/FAO_COUN VT=1 X X`09.END X X`0C X XDirective`20`20Description X XCharacter`20string`20insertion: X X!AC`09`20`20`20Inserts`20an`20ASCIC`20string. X!AD`09`20`20`20Inserts`20a`20string`20whose`20length`20and`20address`20are`20p Vassed`20as`20parameters. X!AF`09`20`20`20Like`20!AD,`20except`20all`20nonprintable`20ASCII`20codes`20are V`20replaced`20with`20".". X!AS`09`20`20`20Inserts`20an`20ASCID`20character`20string. X!AZ`09`20`20`20Inserts`20an`20ASCIZ`20character`20string. X XZero-filled`20numeric`20conversion: X X!OB`09`20`20`20Converts`20a`20byte`20to`20octal`20notation. X!OW`09`20`20`20Converts`20a`20word`20to`20octal`20notation. X!OL`09`20`20`20Converts`20a`20longword`20to`20octal`20notation. X!XB`09`20`20`20Converts`20a`20byte`20to`20hexadecimal`20notation. X!XW`09`20`20`20Converts`20a`20word`20to`20hexadecimal`20notation. X!XL`09`20`20`20Converts`20a`20longword`20to`20hexadecimal`20notation. X!ZB`09`20`20`20Converts`20a`20byte`20to`20decimal`20notation. X!ZW`09`20`20`20Converts`20a`20word`20to`20decimal`20notation. X!ZL`09`20`20`20Converts`20a`20longword`20to`20decimal`20notation. X XBlank-filled`20numeric`20conversion: X X!UB`09`20`20`20Converts`20an`20unsigned`20byte`20to`20decimal`20notation. X!UW`09`20`20`20Converts`20an`20unsigned`20word`20to`20decimal`20notation. X!UL`09`20`20`20Converts`20an`20unsigned`20longword`20to`20decimal`20notation. X!SB`09`20`20`20Converts`20a`20signed`20byte`20to`20decimal`20notation. X!SW`09`20`20`20Converts`20a`20signed`20word`20to`20decimal`20notation. X!SL`09`20`20`20Converts`20a`20signed`20longword`20to`20decimal`20notation. X XSpecial`20formatting: X X!/`09`20`20`20Inserts`20a`20carriage`20return`20and`20a`20line`20feed. X!_`09`20`20`20Inserts`20a`20tab. X!`5E`09`20`20`20Inserts`20a`20form`20feed. X!!`09`20`20`20Inserts`20an`20exclamation`20point`20(!). X!%T`09`20`20`20Converts`20a`20quadword`20binary`20time`20to`20an`20ASCII`20tim Ve.`20`20If`200`20is`20passed X`09`09in,`20the`20current`20system`20time`20is`20inserted. X!%D`09`20`20`20Converts`20a`20quadword`20binary`20time`20to`20an`20ASCII`20dat Ve`20and`20time`20string. X`09`09If`200`20is`20passed`20in,`20the`20current`20system`20date`20and`20time V`20is X`09`09inserted. X!%I`09`20`20`20Converts`20a`20longword`20integer`20to`20a`20named`20UIC`20in V`20the`20format X`09`09`5Bgroup-identifier,member-identifier`5D. X!%U`09`20`20`20Converts`20a`20longword`20integer`20to`20a`20numeric`20UIC. X!%S`09`20`20`20Inserts`20an`20"s"`20if`20the`20most`20recently`20converted`20n Vumber`20is`20not`201. X!n<...!>`20`20`20Left-justifies`20and`20blank-fills`20in`20an`20n-wide`20field V. X!n*c`09`20`20`20Repeats`20the`20character`20(c)`20n`20times. X!n%C`09`20`20`20Inserts`20a`20character`20string`20when`20the`20most`20recentl Vy`20evaluated X`09`09argument`20has`20the`20value`20n.`20(Multilingual) X!%E`09`20`20`20Inserts`20a`20character`20string`20when`20the`20value`20of`20th Ve`20most`20recently X`09`09evaluated`20argument`20does`20not`20match`20any`20preceding`20n%C X`09`09directives.`20(Multilingual) X!%F`09`20`20`20Marks`20the`20end`20of`20a`20plurals`20statement. X XArgument`20interpretation: X X!-`09`20`20`20Reuses`20the`20last`20argument. X!+`09`20`20`20Skips`20the`20next`20argument. X $ call unpack FAOMSG.DSJ;1 2081254914 "" $ v=f$verify(v) $ exit