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