[comp.os.vms] VMS_SHAR 4.04

u3369429@murdu.OZ (Michael Bednarek) (09/16/87)

Oh boy, am I embarassed. How could this happen?

In short: In VMS_SHAR, the TPU code checking for lines which need splitting
was wrong. I should have noticed much earlier when somebody from the net
(???) noticed that both occurrences of "79" should be changed to "78".
The real problem, however, was that I subtracted 1 from Length(Current_Line).
Why did I do that?

Anyway, wiping the egg from my face (until next time),

Michael Bednarek		
Institute of Applied Economic and Social Research (IAESR)
Melbourne University, Parkville 3052, AUSTRALIA, Phone : +61 3 344 5744
Domain: u3369429@{murdu.oz.au | ucsvc.dn.mu.oz.au}  or  mb@munnari.oz.au
"bang": ...UUNET.UU.NET!munnari!{murdu.oz | ucsvc.dn.mu.oz}!u3369429

"POST NO BILLS."

....................... Cut between dotted lines and save ......................
$!..............................................................................
$! VAX/VMS archive file created by VMS_SHAR V-4.04 15-Sep-1987
$! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au)
$! To unpack, simply save and execute (@) this file.
$!
$! This archive was created by U3369429 (Michael Bednarek)
$!      on Wednesday 16-SEP-1987 09:28:44.75
$!
$! It contains the following 1 file:
$! VMS_SHAR.COM
$!==============================================================================
$ Set Symbol/Scope=(NoLocal,NoGlobal)
$ Version=F$GetSYI("VERSION") ! See what VMS version we have here:
$ If Version.ges."V4.4" then goto Version_OK
$ Write SYS$Output "Sorry, you are running VMS ",Version, -
                ", but this procedure requires V4.4 or higher."
$ Exit 44
$Version_OK: CR[0,8]=13
$ Pass_or_Failed="failed!,passed."
$ Goto Start
$Convert_File:
$ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd
$No_Error1: Define/User_Mode SYS$Output NL:
$ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' -
        VMS_SHAR_DUMMY.DUMMY
f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
o:=Get_Info(Command_Line,"Output_File");Set (Output_File,b,o);
Position (Beginning_of(b));Loop x:=Erase_Character(1); Loop ExitIf x<>"V";
Move_Vertical(1);x:=Erase_Character(1);Append_Line;Move_Horizontal
(-Current_Offset);EndLoop;Move_Vertical(1);ExitIf Mark(None)=End_of(b)
EndLoop;Exit;
$ Delete VMS_SHAR_DUMMY.DUMMY;*
$ Checksum 'File_is
$ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR
$ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd
$No_Error2: Return
$Start:
$ File_is="VMS_SHAR.COM"
$ Check_Sum_is=1246787938
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$ Verify='F$Verify(0)
X$ Facility_Name=        "VMS_SHAR"
X$ Facility_Version=     "V-4.04 15-Sep-1987"
X$!
X$ SS$_Abort=44
X$ On Control_Y then goto Abort
X$ On Error then Continue
X$!
X$!Michael Bednarek              u3369429@{murdu.oz.au | ucsvc.dn.mu.oz.au}
X$!Institute of Applied Economic -- or --
X$!  and Social Research (IAESR) ...{UUNET.UU.NET | seismo.CSS.GOV}!munnari!
X$!Melbourne University             {murdu.oz | ucsvc.dn.mu.oz}!u3369429
X$!Parkville 3052, Phone : +61 3 344 5744
X$!AUSTRALIA
X$!
X$! Copyright (c) 1987, by Michael Bednarek
X$! The distribution of this file is unrestricted as long as this notice
X$! remains intact.
X$!
X$! Usage: @VMS_SHAR file[,file...]  sharfile
X$! where file     are file names, separated by commas, possibly including
X$!                wild-card characters, of those files that are to be packaged.
X$!       sharfile is the resulting self-unpacking archive file.
X$! VAX/VMS version 4.4 or higher
X$!
X$ User=F$Edit(F$GetJPI("","USERNAME"),"COLLAPSE")
X$ If F$Type(Real_Name).nes."" then User=User+" ("+Real_Name+")"
X$ Set="Set"
X$ Set Symbol/Scope=(NoLocal,NoGlobal)
X$ Say="Write SYS$Output"
X$ Say Facility_Name," ",Facility_Version
X$ Say ""
X$ If P1.eqs."" then Inquire P1 "_File(s) to package"
X$ If P1.eqs."" then Exit SS$_Abort
X$ If P2.eqs."" then Inquire P2 "_Output Archive"
X$ If P2.eqs."" then Exit SS$_Abort
X$ File_List=P1
X$ Shar_File=F$Parse(P2)-";"
X$ MAX_PART_SIZE=31      ! 31 blocks will keep us below 16000 bytes
X$! As this procedure adds a 'X' in the first position of every line, the
X$! resulting file can still become larger than MAX_PART_SIZE
X$ BEL[0,7]=7
X$ nParts=1
X$ Part_Size=0
X$ nE=-1
X$ nF=1
X$Next_Element: nF=nF-1 ! Collect all filenames
X$ nE=nE+1
X$ Element=F$Element(nE,",",File_List)
X$ If Element.eqs."," then goto Elements_Done
X$ Previous_File="no file"
X$Next_File: nF=nF+1
X$ File'nF=F$Search(Element)
X$ If File'nF.eqs.Previous_File then goto Next_Element
X$ If File'nF.nes."" then goto Look
X$ If Previous_File.eqs."no file" then -
X        Say "%VMS_SHAR-I-FNF, file not found: ",Element
X$ Goto Next_Element
X$Abort: Close/Error=Anyway Out
X$Anyway:Exit SS$_Abort
X$Look: Previous_File=File'nF
X$ Say "looking at ",File'nF
X$ If F$Element(0,";",File'nF).nes.Shar_File then goto Not_Silly
X$ Say "You can't have your outputfile among the input files!"
X$ Exit SS$_Abort
X$Not_Silly: Size'nF=F$File_Attributes(File'nF,"EOF")
X$ Part_Size=Part_Size+Size'nF
X$ If Part_Size.le.MAX_PART_SIZE then goto Next_File
X$ nParts=nParts+1
X$ Part_Size=0
X$ Goto Next_File
X$Elements_Done: If nF.gt.0 then goto Intro
X$ Say "%VMS_SHAR-W-SEARCHFAIL, error searching for",P1
X$ Say "-VMS_SHAR-E-FNF, file not found. No file to package. Nothing done."
X$ Exit SS$_Abort
X$Intro: Time=F$CVTime(,,"Weekday")+" "+F$CVTime(,"Absolute","DateTime")
X$ Part_Name=""
X$ Of_Name=""
X$ If nParts.lt.2 then goto Only_One1
X$ Of_Name=F$FAO("_OF_!ZL",nParts)
X$ i=1   ! i=LOG10(nParts)+1
X$ If nParts.gt.9 then i=2
X$ If nParts.gt.99 then i=3      ! We don't expect more than 999 files
X$ Part_Name=F$FAO("!#ZL",i,1)
X$Only_One1: Copy NL: 'Shar_File''Part_Name''Of_Name
X$ Open/Append Out 'Shar_File''Part_Name''Of_Name
X$ Write Out F$FAO("!23*. Cut between dotted lines and save !22*.")
X$ Write Out F$FAO("$!!!78*.")
X$ Write Out "$! VAX/VMS archive file created by ",Facility_Name," ", -
X                Facility_Version
X$ Write Out "$! which was written by Michael Bednarek ",-
X                "(U3369429@ucsvc.dn.mu.oz.au)"
X$ Write Out "$! To unpack, simply save and execute (@) this file.
X$ Write Out "$!"
X$ Write Out "$! This archive was created by ''User'"
X$ Write Out "$!      on ''Time'"
X$ Write Out "$!"
X$ If nParts.lt.2 then goto Only_One2
X$ Write Out "$! ATTENTION: To keep each article below ", -
X        F$Integer(MAX_PART_SIZE*512)," bytes, this program"
X$ Write Out "$!            has been transmitted in ",nParts," parts."
X$ Write Out "$! You should concatenate ALL parts to ONE file and execute ", -
X        "(@) that file."
X$ Write Out "$!"
X$Only_One2: Write Out F$FAO("$!! It contains the following !UL file!%S:",nF)
X$ Files=""
X$ n=0
X$Next_Name: n=n+1
X$ Name=F$Parse(File'n,,,"NAME")+F$Parse(File'n,,,"TYPE")
X$ If F$Length(Files)+F$Length(Name).le.77 then goto Same_Line
X$ Write Out "$!",Files
X$ Files=""
X$Same_Line: Files=Files+" "+Name
X$ If n.lt.nF then Goto Next_Name
X$ Write Out "$!",Files
X$ Close Out
X$ Append SYS$Input 'Shar_File''Part_Name''Of_Name
X$ Deck/Dollars="SUBROUTINE_EOF" 
V$!=============================================================================
X=
X$ Set Symbol/Scope=(NoLocal,NoGlobal)
X$ Version=F$GetSYI("VERSION") ! See what VMS version we have here:
X$ If Version.ges."V4.4" then goto Version_OK
X$ Write SYS$Output "Sorry, you are running VMS ",Version, -
X                ", but this procedure requires V4.4 or higher."
X$ Exit 44
X$Version_OK: CR[0,8]=13
X$ Pass_or_Failed="failed!,passed."
X$ Goto Start
X$Convert_File:
X$ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd
X$No_Error1: Define/User_Mode SYS$Output NL:
X$ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' -
X        VMS_SHAR_DUMMY.DUMMY
Xf:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
Xo:=Get_Info(Command_Line,"Output_File");Set (Output_File,b,o);
XPosition (Beginning_of(b));Loop x:=Erase_Character(1); Loop ExitIf x<>"V";
XMove_Vertical(1);x:=Erase_Character(1);Append_Line;Move_Horizontal
X(-Current_Offset);EndLoop;Move_Vertical(1);ExitIf Mark(None)=End_of(b)
XEndLoop;Exit;
X$ Delete VMS_SHAR_DUMMY.DUMMY;*
X$ Checksum 'File_is
X$ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR
X$ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd
X$No_Error2: Return
X$Start:
XSUBROUTINE_EOF
X$ n=0
X$Extract_Next: n=n+1
X$ Name=F$Parse(File'n,,,"NAME")+F$Parse(File'n,,,"TYPE")
V$ Part_Size=F$File_Attributes("''Shar_File'''Part_Name'''Of_Name'","EOF")+Size'
Xn
X$ If Part_Size.le.MAX_PART_SIZE then goto Same_Part1
X$ Open/Append Out 'Shar_File''Part_Name''Of_Name
X$! Warning: this will not work if in the course of packaging the files it
X$! turns out that by adding all those "X"s an archive suddenly needs more than
X$! one part. The probability for this is rather low, though, because the
X$! combined files are on average 256*(Number of files) bytes shorter than
X$! their individual block numbers added.
X$ Part_Name=F$FAO("!#ZL",i,F$Integer(Part_Name)+1)
X$ If Size'n.le.MAX_PART_SIZE then goto Fits
X$ Say ""
X$ Say "The file ",File'n
X$ Say "is ",F$Integer(Size'n-MAX_PART_SIZE),-
X        " blocks larger than MAX_PART_SIZE.",BEL
X$ Say "You will have to carve up that file manually."
X$ Say "I'll attempt to increment the part number appropriately"
X$ Current_Part=F$Integer(Part_Name)
X$ Part_Name=F$FAO("!#ZL",i,F$Integer(Size'n/MAX_PART_SIZE)+Current_Part)
X$ Current_Part=F$FAO("!#ZL",i,Current_Part)
X$ Say "The file ",Shar_File,Part_Name,Of_Name," should be split into",BEL
X$ Say Shar_File,Current_Part,Of_Name," to ",Shar_File,Part_Name,Of_Name
X$ Say "NOTE: the common suffix ",Of_Name," is now also wrong."
X$ Say "I'm afraid you have to rename all files manually."
X$ Read/End_of_File=Fits/Prompt="Enter <RETURN> to continue " SYS$Command ddd
X$Fits: Write Out "$ Goto Part''Part_name'"
X$ Close Out
X$ Say ""
X$ Say "Now writing to ",Shar_File,Part_Name,Of_Name
X$ Copy NL: 'Shar_File''Part_Name''Of_Name
X$ Open/Append Out 'Shar_File''Part_Name''Of_Name
X$ Write Out "$Part''Part_Name':"
X$Same_Part1: Say "appending ",File'n
X$ If F$TRNLNM("Out").eqs."" then Open/Append Out 'Shar_File''Part_Name''Of_Name
X$ Write Out "$ File_is=""''Name'"""
X$ Checksum &File'n
X$ Write Out "$ Check_Sum_is=''CHECKSUM$CHECKSUM'"
X$ Write Out "$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY"
X$ Close Out
X$ Define/User_Mode SYS$Output NL:
X$ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output=VMS_SHAR_DUMMY.DUMMY -
X        &File'n
Xf:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
XSet (Output_File,b,File_Parse(Get_Info(Command_Line,"Output_File")));
XPosition (Beginning_of(b));Loop x:="X"; If Length(Current_Line)>79 then
XMove_Horizontal(79);Split_Line;Move_Vertical(-1);x:="V";EndIf;Copy_Text(x);
XMove_Horizontal(-1);Move_Vertical(1);ExitIf Mark(None)=End_of(b);EndLoop;Exit;
X$ Append VMS_SHAR_DUMMY.DUMMY 'Shar_File''Part_Name''Of_Name
X$ Delete VMS_SHAR_DUMMY.DUMMY;*
X$ Append SYS$Input 'Shar_File''Part_Name''Of_Name
X$ Deck/Dollars="Just_1"
X$ GoSub Convert_File
XJust_1
X$ If n.lt.nF then goto Extract_Next
X$ Append SYS$Input 'Shar_File''Part_Name''Of_Name
X$ Deck/Dollars="The End"
X$ Exit
XThe End
X$ Say F$FAO("SHAR-file ''Shar_File' was written in !SL part!%S",-
X        F$Integer(nParts))
X$ Directory/Size=Used/Date=Created 'Shar_File'*
X$ Verify=F$Verify(Verify)
$ GoSub Convert_File
$ Exit