Thread View: vmsnet.sources
1 messages
1 total messages
Started by Andy, Systems Manager
Mon, 25 Jan 1993 21:34
VMS_SHARE V8.2, part 03/09
Author: Andy, Systems Manager
Date: Mon, 25 Jan 1993 21:34
Date: Mon, 25 Jan 1993 21:34
1099 lines
50150 bytes
50150 bytes
Submitted-by: "Andy, Systems Manager" <UDAA055@ELM.CC.KCL.AC.UK>
Posting-number: Volume 4, Issue 47
Archive-name: vms_share/part03
Supersedes: vms_share: Volume 3, Issue 87-89
-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20The`20share`20file`20is`20constrained`20to`20be`20of`20a`20maxim
Vum`20fixed`20size`20so`20`20`20+
X!`20+`20`20`20that`20it`20can`20pass`20unscathed`20through`20mailers`20that
V`20truncate`20long`20`20`20`20+
X!`20+`20`20`20messages.`20`20These`20routines`20deal`20with`20splitting`20the
V`20share`20file`20`20`20`20`20+
X!`20+`20`20`20into`20smaller`20manageable`20parts,`20each`20of`20which`20may
V`20be`20mailed`20`20`20`20`20`20`20+
X!`20+`20`20`20without`20corruption.`20`20`20`20`20`20`20`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`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`208.0`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Andy
V`20Harper`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20September`201992
V`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T
V`20I`20N`20E`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20WritePart`20`20`20Routine`20to`20write`20a`20buffer`20to`20disk
V`20(to`20specified`20part)+
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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20FlushPart`20`20`20If`20the`20part`20buffer`20contains`20data,
V`20flush`20it`20to`20disk`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20and`20update`20the`20Part
V`20Number.`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+
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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Find_Break`20`20Locate`20the`20line`20in`20the`20buffer`20which
V`20straddles`20a`20given+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20size`20in`20bytes.`20Uses
V`20a`20binary`20search`20algorithm`20for`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20speed.`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`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Terminate_Part`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`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`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Determine`20the`20best`20par
Vt`20separator`20flags`20to`20use;`20add`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20them`20to`20the`20part`20buf
Vfer`20and`20remaining`20data,`20then`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20empty`20the`20part`20buffer
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`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Add_To_Part`20Given`20a`20buffer`20full`20of`20data,`20add`20it
V`20to`20the`20current`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Part`20buffer,`20splitting
V`20where`20necessary`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Add_To_Part_Nosplit`20`20`20`20`20`20`20`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`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Adds`20a`20buffer`20to`20the
V`20the`20current`20part`20but`20takes`20care`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20not`20to`20split`20it`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`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+--------------------------------------------------------------------+
X`0C`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20
X!`20----------------------------------------------------------------------
X!`20Write`20the`20named`20buffer`20to`20disk`20as`20the`20given`20sharefile
V`20part
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20WritePart(Xbuffer,Part)
XLOCAL`20f;
X
X!`20Trap`20any`20errors`20writing`20to`20a`20file`20(disk`20quota`20etc.)
X`20`20`20ON_ERROR
X`20`20`20`20`20Inform("E","FILWRERR",`20"Error`20writing`20part`20to`20file
V`20"`20+`20f);
X`20`20`20`20`20ABORT;
X`20`20`20ENDON_ERROR;
X
X!`20Write`20out`20the`20buffer
X`20`20`20f`20:=`20Share_File+STR(Part);
X`20`20`20WRITE_FILE(Xbuffer,f);
X`20`20`20ERASE(Xbuffer);
XENDPROCEDURE;
X
X
X
X
X!`20----------------------------------------------------------------------
X!`20If`20the`20part`20buffer`20is`20not`20empty,`20update`20the`20part`20numbe
Vr`20and`20flush`20its
X!`20contents`20to`20disk.`20Treat`20part`201`20especially`20as`20we`20need`20t
Vo`20do`20some
X!`20final`20massaging`20of`20its`20contents,`20so`20save`20it`20in`20a`20separ
Vate`20buffer.
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20FlushPart
X
X`20`20IF`20GET_INFO(PartBuffer,"RECORD_COUNT")`20>`200
X`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20PartNo`20:=`20PartNo`20+`201;
X`20`20`20`20`20`20`20`20IF`20PartNo`20=`201
X`20`20`20`20`20`20`20`20`20`20`20THEN`20MoveInfo(PartBuffer,`20Part1Buffer);
X`20`20`20`20`20`20`20`20`20`20`20ELSE`20WritePart(PartBuffer,`20PartNo);
X`20`20`20`20`20`20`20`20ENDIF;
X`20`20ENDIF;
X
XENDPROCEDURE;
X`0C
X!`20----------------------------------------------------------------------
X!`20This`20routine`20uses`20a`20fast`20binary`20search`20algorithm`20to`20find
V`20the`20first`20line`20in`20the
X!`20given`20buffer`20which`20straddles`20a`20given`20break`20point`20-`20I.E.
V`20where`20the`20size`20of`20the
X!`20buffer`20up`20to`20and`20including`20that`20line`20would`20just`20go`20ove
Vr`20the`20'Max_Size'`20value
X!`20(bytes).`20This`20allows`20us`20to`20quickly`20determine`20where`20a`20buf
Vfer`20should`20be`20split
X!`20when`20chopping`20up`20the`20info`20into`20several`20small`20parts.
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20Find_Break(Xbuffer,Max_Size)
XLOCAL`20m,`20mb,`20Size,`20Line_Size,`20Low,`20High,`20New_Line,`20Cur_Line;
X
X`20`20Low`20`20`20`20`20`20:=`200;
X`20`20High`20`20`20`20`20:=`20GET_INFO(Xbuffer,"RECORD_COUNT")`20-`201;
X`20`20Cur_Line`20:=`200;
X
X`20`20mb`20:=`20BEGINNING_OF(Xbuffer);
X`20`20POSITION(mb);
X
X`20`20LOOP
X`20`20`20`20`20New_Line`20:=`20(Low+High)`20/`202;
X`20`20`20`20`20MOVE_VERTICAL(New_Line-Cur_Line);
X`20`20`20`20`20Cur_Line`20:=`20New_Line;
X
X`20`20`20`20`20Size:=LENGTH(CREATE_RANGE(mb,MARK(NONE),NONE))+EOL*Cur_Line;
X`20`20`20`20`20Line_Size`20:=`20LENGTH(CURRENT_LINE)`20+`20EOL;
X
X`20`20`20`20`20IF`20Debugging`20>=`20DEBUG_FindBreak
X`20`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20`20m:="At`20line:`20!UL`20(Range:`20!UL-!UL),`20Length
V:`20!UL,`20Buffer`20Size:`20!UL/!UL";
X`20`20`20`20`20`20`20`20`20Inform("I","DBGFNDBRK",FAO(m,Cur_Line,Low,High,Line
V_Size,Size,Max_Size));
X`20`20`20`20`20ENDIF;
X
X`20`20`20`20`20EXITIF`20(Size`20<`20Max_Size)`20AND`20(Size+Line_Size>=Max_Siz
Ve);
X
X`20`20`20`20`20IF`20Size`20`20`20`20`20`20`20`20`20`20`20`20`20<`20`20Max_Size
V`20THEN`20Low`20`20:=`20Cur_Line`20+`201;`20ENDIF;
X`20`20`20`20`20IF`20Size`20+`20Line_Size`20>=`20Max_Size`20THEN`20High`20:=
V`20Cur_Line`20-`201;`20ENDIF;
X
X`20`20`20`20`20EXITIF`20Low`20>=`20High;
X`20`20ENDLOOP;
X
X!`20TPU`20IS`20NOT`20CLEVER`20AT`20HANDLING`20NULL`20RANGES`20SO,`20IF`20THE
V`20BREAK`20POINT`20IS`20ON`20THE
X!`20FIRST`20LINE`20OF`20THE`20BUFFER,`20WE`20HAVE`20TO`20KLUDGE`20AROUND`20IT.
V`20DO`20THIS`20BY`20RETURNING
X!`20A`20ZERO`20VALUE`20TO`20MEAN`20A`20NULL`20RANGE,`20OTHERWISE`20RETURN`20TH
VE`20RANGE`20ITSELF.
X`20`20IF`20Cur_Line`20>`200
X`20`20`20`20THEN
X`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
X`20`20`20`20`20`20RETURN(`20CREATE_RANGE(`20mb,`20MARK(NONE),`20NONE`20)`20);
X`20`20ENDIF;
X
X`20`20RETURN(0);`20`20
XENDPROCEDURE;
X`0C
X!`20----------------------------------------------------------------------
X!`20Inserts`20a`20suitable`20part`20separator`20into`20the`20part`20buffer`20a
Vnd`20into`20the
X!`20current`20work`20buffer.
X!
X!`20The`20type`20of`20part`20separator`20is`20determined`20by`20looking`20at
V`20the`20data`20in`20the`20buffer
X!`20immediately`20following`20the`20break`20point.`20If`20it`20starts`20with
V`20'$'`20then`20we`20are
X!`20splitting`20the`20buffer`20at`20the`20DCL`20code`20which`20is`20part`20of
V`20the`20unpacking`20control
X!`20thus`20we`20can`20use`20$GOTO`20and`20a`20label.`20`20If`20not,`20then`20w
Ve`20are`20in`20the`20midst`20of`20user
X!`20data`20and`20should`20use`20the`20special`20flag`20lines.
X!
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20Terminate_Part(Part,`20Xbuffer)
XLOCAL`20end_text;
X
X`20`20`20POSITION(`20BEGINNING_OF(Xbuffer)`20);
X
X`20`20`20IF`20(CURRENT_CHARACTER`20=`20"$")
X`20`20`20`20`20`20THEN`09`09`09!`20Executable`20DCL`20code`20insert`20GOTO/lab
Vel`20pair
X`20`20`20`20`20`20`20`20`20end_text`20`20:=`20FAO(FAO_end_goto,`20Part+1);
X`20`20`20`20`20`20`20`20`20CopyLine(`20FAO(FAO_start_label,`20Part+1)`20);
X`20`20`20`20`20`20ELSE`09`09`09!`20User`20data,`20insert`20recognizable`20sepa
Vrators
X`20`20`20`20`20`20`20`20`20end_text`20`20:=`20FAO(FAO_end_part,`20Part);
X`20`20`20`20`20`20`20`20`20CopyLine(`20FAO(FAO_start_part,`20Part+1)`20);
X`20`20`20ENDIF;`20`20`20`20`20`20`20`20
X
X`20`20`20POSITION(END_OF(PartBuffer));
X`20`20`20COPY_TEXT(end_text);
X
X`20`20`20FlushPart;
X
XENDPROCEDURE;
X`0C
X!`20----------------------------------------------------------------------
X!
X!`20Add`20a`20given`20work`20buffer`20to`20the`20current`20part`20of`20the`20s
Vharefile,`20creating
X!`20one`20or`20more`20new`20parts`20if`20necessary`20as`20the`20maximum`20part
V`20size`20is`20exceeded.
X!`20Each`20time`20the`20part`20buffer`20fills`20up,`20it`20is`20flushed`20out.
V
X!
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20Add_To_Part(Xbuffer)
XLOCAL`20m,`20r,`20Size_Xbuffer,`20Size_PartBuffer;
X
X`20`20LOOP
X`20`20`20`20Size_Xbuffer`20`20`20`20:=`20SizeBuffer(Xbuffer);
X`20`20`20`20Size_PartBuffer`20:=`20SizeBuffer(PartBuffer);`20
X
X`20`20`20`20IF`20Debugging`20>=`20DEBUG_PartSplit
X`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20m:="Max_bytes:`20!UL,`20Size`20Part`20buffer:`20!UL,`20Si
Vze`20to`20add:`20!UL";
X`20`20`20`20`20`20`20Inform("I","DBGADDPART",FAO(m,Max_Bytes,Size_PartBuffer,S
Vize_Xbuffer));
X`20`20`20`20ENDIF;
X
X`20`20`20`20EXITIF`20Size_PartBuffer`20+`20Size_Xbuffer`20`20<=`20`20Max_Bytes
V`20;
X
X`20`20`20`20r`20:=`20Find_Break(Xbuffer,Max_Bytes`20-`20Size_PartBuffer);
X`20`20`20`20IF`20r`20<>`200
X`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20POSITION(`20END_OF(PartBuffer)`20);
X`20`20`20`20`20`20`20`20MoveInfo(r,PartBuffer);
X`20`20`20`20ENDIF;
X
X`20`20`20`20Terminate_Part(PartNo+1,`20Xbuffer);
X`20`20ENDLOOP;
X
X`20`20MoveInfo(Xbuffer,`20PartBuffer);
X
XENDPROCEDURE;
X`0C
X!`20----------------------------------------------------------------------
X!`20Adds`20an`20unsplittable`20buffer`20to`20the`20current`20part.`20Buffers
V`20are`20unsplittable
X!`20if:
X!`20`20`201.`20They`20contain`20the`20TPU`20unpack`20code
X!`20`20`202.`20They`20contain`20DCL`20code`20that`20has,`20or`20might`20have,
V`20continuation`20lines.
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20Add_To_Part_Nosplit(Xbuffer)
XLOCAL`20s;
X
X`20`20s`20:=`20SizeBuffer(Xbuffer);
X
X!`20We`20can't`20deal`20with`20large`20unsplittable`20buffers`20bigger`20than
V`20the`20part`20size
X`20`20IF`20s`20>`20Max_Bytes
X`20`20`20`20THEN
X`20`20`20`20`20`20Inform("F","CANTSPLIT","Unsplittable`20buffer`20bigger`20tha
Vn`20part`20size");
X`20`20`20`20`20`20Inform("I","MINPARTSIZE",`20FAO("Need`20minimum`20part`20siz
Ve`20of`20!UL`20block!%S",(s+511)/512));
X`20`20`20`20`20`20ABORT;
X`20`20ENDIF;
X
X!`20If`20this`20buffer`20would`20be`20split`20then`20flush`20the`20current`20p
Vart`20and`20start`20a`20new
X!`20one
X`20`20IF`20SizeBuffer(PartBuffer)+s`20>`20Max_Bytes
X`20`20`20`20THEN
X`20`20`20`20`20`20Terminate_Part(PartNo+1,`20Xbuffer);
X`20`20ENDIF;
X
X`20`20Add_To_Part(Xbuffer);
XENDPROCEDURE;
X`0C
X!`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20T`20P`20U`20`20`20C`20O`20D`20E`20
V`20`20C`20O`20M`20P`20R`20E`20S`20S`20I`20O`20N`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20Part`20of`20the`20created`20share`20file`20contains`20some
V`20TPU`20code`20which`20`20`20`20`20+
X!`20+`20`20`20`20is`20executed`20to`20perform`20the`20unpacking.`20`20In`20ord
Ver`20to`20save`20space`20`20`20+
X!`20+`20`20`20`20we`20arrange`20to`20pack`20lines`20of`20TPU`20code`20into`20t
Vhe`20smallest`20possible`20+
X!`20+`20`20`20`20space`20by`20compressing`20spaces`20and`20new`20lines`20where
Vver`20feasible`20but`20+
X!`20+`20`20`20`20keeping`20the`20total`20line`20length`20below`20the`20maximum
V`20for`20this`20share`20`20+
X!`20+`20`20`20`20file.`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`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`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`208.0`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20Andy`20Harper`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20September`201992
V`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T`20I`20N`20E
V`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20PackTPU`20`20`20`20`20Takes`20a`20line`20of`20TPU`20code`20an
Vd`20adds`20it`20to`20the`20current`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20buffer.`20The`20current
V`20buffer`20is`20assumed`20to`20be`20the`20TPU`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20code`20that`20will`20form
V`20the`20unpacking`20part`20of`20the`20share`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20file.`20We`20remove`20as
V`20much`20redundant`20info`20(spaces`20etc.)+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20as`20possible`20to`20save
V`20space.`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+
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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20AddDCL`20`20`20`20`20`20Add`20additional`20DCL`20to`20an`20ex
Visting`20line,`20forcing`20a`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20continuation`20line`20if
V`20necessary.`20`20`20`20`20`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`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`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`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20+
X!`20+--------------------------------------------------------------------+
X`0C
X!`20---------------------------------------------------------------------
X!`20The`20main`20portion`20of`20the`20unpacking`20code`20written`20to`20the
V`20sharefile`20is`20in
X!`20the`20form`20of`20a`20TPU`20procedure.`20To`20save`20space,`20the`20TPU
V`20code`20is`20packed`20to
X!`20remove`20unnecessary`20spaces`20and`20newlines.`20We`20also`20ensure`20tha
Vt`20lines`20do
X!`20not`20exceed`20the`20maximum`20share`20file`20line`20length.`20Lines`20are
V`20always`20split
X!`20just`20after`20a`20character`20in`20the`20set`20`60TPU_Separators'.`20Note
V`20that`20this
X!`20set`20does`20NOT`20include`20spaces`20or`20quote`20symbols`20to`20avoid
V`20splitting`20in`20the
X!`20midst`20of`20strings`20(which`20may`20not`20split`20across`20lines`20in
V`20TPU).
X!`20---------------------------------------------------------------------
XPROCEDURE`20PackTPU(NewTPUCode)
XLOCAL`20s,c;
X
X!`20Append`20the`20new`20TPU`20code`20to`20the`20end`20of`20the`20current`20li
Vne,`20trimming`20blanks`20first
X`20`20s`20:=`20NewTPUCode;
X`20`20EDIT(s,TRIM);
X`20`20COPY_TEXT(s);
X
X!`20If`20it`20doesn't`20end`20in`20an`20acceptable`20separator,`20then`20add
V`20a`20space`20to`20delimit
X!`20it`20from`20the`20next`20one`20added.
X`20`20c`20:=`20SUBSTR(s,LENGTH(s),1);
X`20`20IF`20INDEX(TPU_separators,c)`20=`200`20THEN`20COPY_TEXT("`20");`20ENDIF;
V
X
X
X!`20If`20the`20current`20line`20is`20now`20too`20long,`20find`20a`20point`20to
V`20split`20it
X`20`20IF`20LENGTH(CURRENT_LINE)`20>`20Max_Share_Length
X`20`20`20`20THEN
X
X`20`20`20`20!`20Find`20a`20TPU`20separator`20character`20on`20which`20to`20spl
Vit
X`20`20`20`20`20`20LOOP
X`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
X`20`20`20`20`20`20`20`20POSITION(`20SEARCH(`20ANY(TPU_separators),REVERSE)`20)
V;
X`20`20`20`20`20`20`20`20EXITIF`20CURRENT_OFFSET`20<`20Max_Share_Length;
X`20`20`20`20`20`20ENDLOOP;
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
X`20`20`20`20!`20Split`20just`20past`20the`20TPU`20separator`20and`20reposition
V`20at`20the`20end`20of`20the`20line
X`20`20`20`20`20`20MOVE_HORIZONTAL(1);
X`20`20`20`20`20`20SPLIT_LINE;
X`20`20`20`20`20`20MOVE_HORIZONTAL(`20LENGTH(CURRENT_LINE)`20);
X`20`20ENDIF;
X
X
X`20`20IF`20Debugging`20>=`20DEBUG_PackTPU
X`20`20`20`20THEN
X`20`20`20`20`20`20Inform("I","DBGPKTPU","Adding`20"""+s+""",`20To`20give:`20""
V"`20+`20CURRENT_LINE+"""")
X`20`20ENDIF;
X
XENDPROCEDURE;
X
X
X!`20----------------------------------------------------------------------
X!
X!`20Add`20a`20parameter`20to`20an`20incomplete`20line`20of`20DCL,`20forcing
V`20a`20DCL`20continuation
X!`20if`20the`20resulting`20DCL`20line`20exceeds`20the`20maximum`20share`20file
V`20length.
X!
X!`20This`20is`20used`20only`20for`20generating`20DCL`20lines`20that`20contain
V`20variable
X!`20such`20as`20filenames`20and`20attributes.`20Without`20this,`20some`20fussy
V`20mailers`20might
X!`20truncate`20these`20important`20lines`20and`20lose`20key`20data.
X!
X!`20----------------------------------------------------------------------
X
XPROCEDURE`20AddDCL(DCLParameter)
X`20`20IF`20CURRENT_OFFSET`20+`20LENGTH(DCLParameter)`20>`20Max_Share_Length
X`20`20`20`20THEN
X`20`20`20`20`20`20COPY_TEXT("-");`20SPLIT_LINE;`20COPY_TEXT("`20");
X`20`20ENDIF;
X`20`20COPY_TEXT(DCLParameter);
XENDPROCEDURE;
X`0C
X!`20--------------------------------------------------------------------------
V-
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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20B`20U`20F
V`20F`20E`20R`20`20`20E`20N`20C`20O`20D`20I`20N`20G`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20This`20set`20of`20routines`20provides`20the`20various`20mechanis
Vms`20for`20encoding`20the`20+
X!`20+`20`20`20data`20in`20a`20buffer`20so`20that`20it`20may`20pass`20unchanged
V`20through`20intolerant`20`20`20`20`20+
X!`20+`20`20`20network`20MAIL`20systems,`20and`20be`20accurately`20reconstructe
Vd`20at`20the`20receiving+
X!`20+`20`20`20end.`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`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`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Four`20types`20of`20encoding`20are`20attempted`20here:`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+
X!`20+`20`20`20`20`201.`20`20Simplified`20LZW`20common`20substring`20encoding
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+
X!`20+`20`20`20`20`202.`20`20Run-length`20encoding`20of`20a`20run`20of`20the
V`20same`20character`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`203.`20`20Quoting`20(escaping)`20of`20specific`20characters
V`20that`20MAILERS`20mangle`20`20`20+
X!`20+`20`20`20`20`204.`20`20Wrapping`20of`20long`20lines`20and`20flagging`20th
Ve`20start`20and`20continuation`20`20+
X!`20+`20`20`20`20`20`20`20`20`20lines`20so`20generated`20in`20order`20to`20rej
Voin`20them`20later.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Version`208.2`20`20`20`20`20`20`20`20`20`20`20`20`20Andy`20Harpe
Vr`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20December`201992`20`20
V`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T
V`20I`20N`20E`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20SplitNeeded`20`20`20`20`20`20`20`20`20`20`20Checks`20the`20line
V`20length`20to`20determine`20whether`20a`20`20`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`20continuation`20is`20required.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20BreakLongLine`20`20`20`20`20`20`20`20`20Inserts`20continuation
V`20line`20if`20needed`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20PutText`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Like`20COPY_
VTEXT`20but`20splits`20the`20line`20first`20if`20the`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`20resulting`20line`20would`20be`20too`20long.`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20EncodeQuotable`20`20`20`20`20`20`20`20Encodes`20a`20character
V`20to`20its`20quoted`20form`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20QUEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20If`20character
V`20is`20quoteable,`20then`20encode`20it`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20RLEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20Encode`20a`20r
Vun`20of`20the`20same`20character`20`20`20`20`20`20`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20LZEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20Encode`20a`20s
Vubstring`20using`20modified`20LZW`20encoding`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20QuoteBuffer`20`20`20`20`20`20`20`20`20`20`20Scan`20buffer,`20app
Vly`20line`20wrapping`20and`20quoting`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20CompressBuffer`20`20`20`20`20`20`20`20As`20QuoteBuffer,`20but
V`20also`20do`20run`20length`20encoding`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20ShrinkBuffer`20`20`20`20`20`20`20`20`20`20As`20QuoteBuffer,`20bu
Vt`20also`20do`20LZW`20compression`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20+`20`20`20Encode_Buffer`20`20`20`20`20`20`20`20`20Apply`20encoding`20to
V`20a`20complete`20buffer.`20This`20is`20the+
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`20only`20routine`20that`20should`20be`20called`20from`20outside`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`20the`20module.`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`20`20`20`20`20`20`20`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`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
X!`20--------------------------------------------------------------------------
V-
X`0C
X!`20--------------------------------------------------------------------------
V----
X!`20SPLIT`20NEEDED
X!
X!`20`20`20`20`20Checks`20to`20see`20if`20the`20current`20line`20will`20be`20lo
Vnger`20than`20the`20maximum`20line
X!`20`20`20`20`20length`20if`20the`20text`20parameter`20is`20inserted`20at`20th
Ve`20current`20point.
X!
X!`20--------------------------------------------------------------------------
V----
X
XPROCEDURE`20SplitNeeded(`20x`20)
XLOCAL`20l;
X
X`20`20l`20:=`20LENGTH(CURRENT_LINE);
X
X`20`20IF`20(CURRENT_OFFSET`20+`20x`20>=`20Max_Share_Length)`20OR`20(l`20+`20x
V`20>`20Max_TPU_Line_Length)
X`20`20`20`20THEN
X`20`20`20`20`20`20`20RETURN`20(1);`09!`20TRUE`20-`20Line`20split`20is`20requir
Ved
X`20`20`20`20ELSE
X`20`20`20`20`20`20`20RETURN`20(0);`09!`20FALSE-`20Line`20split`20not`20needed
X`20`20ENDIF;
X
XENDPROCEDURE
X
X
X
X!`20----------------------------------------------------------------
X!`20BREAK`20LONG`20LINE
X!
X!`20`20`20`20Checks`20the`20current`20position`20within`20the`20line;`20if`20p
Vast`20the`20max
X!`20`20`20`20permitted`20length,`20then`20splits`20the`20line`20to`20form`20a
V`20continuation
X!`20`20`20`20line
X
X!`20----------------------------------------------------------------
X
XPROCEDURE`20BreakLongLine
X`20`20IF`20SplitNeeded(0)
X`20`20`20`20THEN
X`20`20`20`20`20`20Split_Line;`20COPY_TEXT(Continuation_Flag);
X`20`20ENDIF;
XENDPROCEDURE
X
X
X!`20--------------------------------------------------------------------------
V----
X!`20PUT`20TEXT
X!
X!`20`20`20This`20routine`20inserts`20new`20text`20at`20the`20current`20point
X!`20`20`20and`20returns`20the`20total`20length`20of`20the`20text`20added.
X!
X!`20--------------------------------------------------------------------------
V---
X!
XPROCEDURE`20PutText(`20NewText`20)
XLOCAL`20x,y;
X
X`20`20x`20:=`20LENGTH(NewText);
X`20`20IF`20SplitNeeded(x)
X`20`20`20`20`20THEN
X`20`20`20`20`20`20`20Split_Line;`20COPY_TEXT(Continuation_Flag);`20x`20:=`20x
V`20+`202;
X`20`20ENDIF;
X
X`20`20COPY_TEXT(`20NewText`20);
X`20`20RETURN`20(x);
X
XENDPROCEDURE;
X
X
X`0C
X!`20--------------------------------------------------------------------------
V--
X!`20ENCODE`20QUOTEABLE
X!
X!`20`20`20`20Replace`20the`20current`20character`20by`20its`20quoted`20equival
Vent;`20also`20returns`20the
X!`20`20`20`20length`20of`20the`20text`20written.`20The`20encoding`20has`20this
V`20form:
X!
X!`20`20`20`20`20`20`20`60nn
X!
X!`20`20`20`20where:
X!`20`20`20`20`20`20`20`60`20`20`20`20`20`20is`20the`20flag`20used`20to`20mark
V`20the`20start`20of`20a`20single`20quoted`20character
X!`20`20`20`20`20`20`20nn`20`20`20`20`20is`20the`20hex`20coded`20ASCII`20code
V`20of`20the`20quoted`20character
X!
X!`20--------------------------------------------------------------------------
V--
X
XPROCEDURE`20EncodeQuoteable
XLOCAL`20EncodedString;
X
X`20`20EncodedString`20:=`20FAO("!AS!2XL",Quote_Flag,ASCII(ERASE_CHARACTER(1)))
V;
X`20`20RETURN`20(PutText(EncodedString));
X
XENDPROCEDURE;
X
X
X
X
X!`20--------------------------------------------------------------------------
V--
X!`20QU`20ENCODE
X!
X!`20`20`20`20If`20the`20current`20character`20is`20a`20Non-Printing`20or`20tro
Vublesome`20character,`20then
X!`20`20`20`20encode`20it`20to`20an`20escaped`20format.
X!
X!`20--------------------------------------------------------------------------
V--
X
XPROCEDURE`20QUEncode
XLOCAL`20c,m,Size;
X`20`20c`20:=`20CURRENT_CHARACTER;
X`20`20IF`20c`20<>`20""
X`20`20`20`20THEN
X`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
X`20`20`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20`20`20Size`20:=`20EncodeQuoteable;
X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(-Size);
X`20`20`20`20`20`20`20`20`20`20m`20:=`20MARK(NONE);`09`09!`20Note`20its`20posit
Vion
X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(Size-1);`09!`20Back`20to`20last
V`20char`20of`20escape`20sequence
X`20`20`20`20`20`20`20`20`20`20RETURN(m);
X`20`20`20`20`20`20ENDIF;
X`20`20ENDIF;
X`20`20RETURN(MARK(NONE));`09`09`09!`20Returns`20mark`20on`20current`20characte
Vr
XENDPROCEDURE
X
X
X`0C
X!`20--------------------------------------------------------------------------
V----
X!`20RL`20ENCODE
X!
X!`20`20`20This`20routine`20replaces`20a`20run`20of`20similar`20characters,`20s
Vtarting`20at`20the`20current
X!`20`20`20character`20and`20of`20length`20RunSize,`20by`20a`20coded`20escape
V`20sequence.`20The`20encoding
X!`20`20`20has`20this`20form:
X!
X!`20`20`20`20`20`20`26nnxx
X!
X!`20`20`20where:
X!`20`20`20`20`20`20`20`26`20`20`20`20`20`20`20is`20the`20run-length`20flag
X!`20`20`20`20`20`20`20nn`20`20`20`20`20`20is`20the`20count`20of`20the`20charac
Vters
X!`20`20`20`20`20`20`20xx`20`20`20`20`20`20is`20the`20hex`20code`20of`20the`20c
Vharacter.
X!
X!`20`20`20Note`20that,`20due`20to`20the`20HEX`20coding`20scheme,`20a`20single
V`20run`20cannot
X!`20`20`20exceed`20`60MaxHexEnc'`20characters.`20Longer`20runs`20must`20be`20b
Vroken`20down.`20Any
X!`20`20`20run`20left`20over`20is`20left`20unencoded`20if`20its`20length`20is
V`20less`20than`20the
X!`20`20`20minimum`20run`20length.
X!
X!`20--------------------------------------------------------------------------
V---
X
XPROCEDURE`20RLEncode(c,RunSize,MinRunLength)
XLOCAL`20Size,EncodedString;
X`20`20LOOP
X`20`20`20`20EXITIF`20RunSize`20<`20MinRunLength;
X`20`20`20`20Size`20:=`20RunSize;
X`20`20`20`20IF`20Size`20>`20MaxHexEnc`20THEN`20Size:=MaxHexEnc`20ENDIF;
X`20`20`20`20ERASE_CHARACTER(Size);
X`20`20`20`20EncodedString`20:=`20FAO("!AS!2XL!2XL",Run_Flag,Size,ASCII(c));
X`20`20`20`20PutText(`20EncodedString`20);
X`20`20`20`20RunSize`20:=`20RunSize`20-`20Size;
X`20`20ENDLOOP;
XENDPROCEDURE;
X
X
X`0C
X!`20--------------------------------------------------------------------------
V--
X!`20LZ`20ENCODE
X!
X!`20`20`20This`20routine`20replaces`20a`20substring,`20delimited`20by`20`60s'
V`20and`20the`20current
X!`20`20`20position,`20by`20a`20modified`20format`20of`20LZW`20encoding.`20The
V`20encoding`20has
X!`20`20`20this`20form:
X!
X!`20`20`20`20`20`20`20`5Cbbnn
X!
X!`20`20`20Where:
X!`20`20`20`20`20`20`20`5C`09is`20the`20flag`20to`20mark`20the`20start`20of`20a
V`20coded`20substring.
X!`20`20`20`20`20`20`20bb`09is`20a`20hex`20coded`20backwards`20count`20to`20the
V`20start`20of`20the
X!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20matching`20substring`20occurring
V`20earlier`20in`20the`20buffer.
X!`20`20`20`20`20`20`20nn`20`20`20`20`20`20is`20a`20hex`20coded`20substring`20l
Vength.
X!
X!`20`20`20Within`20the`20encoded`20range,`20characters`20may`20have`20been`20p
Vreviously`20quoted,
X!`20`20`20so`20we`20first`20check`20if`20there`20is`20a`20space`20saving`20bef
Vore`20encoding.`20If`20not,
X!`20`20`20nothing`20is`20done.`20Because`20of`20the`20hex`20encoding`20scheme,
V`20the`20maximum
X!`20`20`20backwards`20count`20and,`20by`20implication,`20the`20length,`20is
V`20restricted`20to`20MaxHexEnc
X!`20`20`20characters.`20This`20gives`20a`20reasonable`20compression`20ratio
V`20but`20could`20in`20the
X!`20`20`20future`20be`20extended`20to`20provide`20longer`20substrings`20occurr
Ving`20further`20back.
X!
X!`20`20`20Finally,`20the`20checking`20for`20line`20length`20exceeded`20is`20co
Vmplicated`20by`20allowing
X!`20`20`20substrings`20to`20match`20across`20(and`20including)`20end`20of`20li
Vne.
X!
X!`20--------------------------------------------------------------------------
V--
X
XPROCEDURE`20LZEncode(s,l,p,n)
XLOCAL`20EncodedString,b,EraseRange,NewLength;
X`20`20IF`20p`20>`200`09`09`09`09`09!`20Provided`20we`20had`20a`20match
X`20`20`20`20THEN
X`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
X`20`20`20`20`20`20EraseRange`20:=`20CREATE_RANGE(s,MARK(NONE));
X`20`20`20`20`20`20b`20:=`20l-p+1;
X`20`20`20`20`20`20EncodedString`20:=`20FAO("!AS!2XL!2XL",LZW_Flag,b,n);
X
X`20`20`20`20`20`20IF`20LENGTH(EraseRange)`20>`20LENGTH(EncodedString)`09!`20..
V`20`20And`20its`20long`20enough
X`20`20`20`20`20`20`20`20THEN
X`20`20`20`20`20`20
X`20`20`20`20`20`20`20`20!`20If`20the`20combined`20remaining`20length`20of`20th
Ve`20line`20is`20too`20long,`20split`20it
X`20`20`20`20`20`20`20`20`20`20NewLength`20:=`20LENGTH(CURRENT_LINE)`20-`20CURR
VENT_OFFSET;
X`20`20`20`20`20`20`20`20`20`20POSITION(EraseRange);
X`20`20`20`20`20`20`20`20`20`20NewLength`20:=`20NewLength`20+`20CURRENT_OFFSET;
V
X`20`20`20`20`20`20`20`20`20`20IF`20NewLength`20>`20Max_TPU_Line_Length`20THEN
V`20SPLIT_LINE;`20ENDIF;
X
X`20`20`20`20`20`20`20`20!`20Erase`20the`20text`20and,`20if`20necessary,`20re-i
Vnsert`20the`20new`20line`20marker
X`20`20`20`20`20`20`20`20`20`20ERASE(EraseRange);
X`20`20`20`20`20`20`20`20`20`20IF`20CURRENT_OFFSET`20=`200`20THEN`20COPY_TEXT(I
Vnitial_Flag);`20ENDIF;
X
X`09!`20Write`20the`20coded`20string
X`20`20`20`20`20`20`20`20`20`20PutText(EncodedString);
X`20`20`20`20`20`20`20`20ELSE
X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(1);
X`20`20`20`20`20`20ENDIF;
X`20`20ENDIF;
XENDPROCEDURE
X
X
X`0C
X!`20----------------------------------------------------------------
X!`20QUOTE`20BUFFER
X!
X!`20`20`20`20This`20routine`20scans`20the`20current`20buffer`20and`20quotes
V`20all`20non-
X!`20`20`20`20printable`20characters`20listed`20in`20Quote_chars.`20Additionall
Vy,`20long
X!`20`20`20`20lines`20are`20wrapped`20and`20line`20continuation`20markers`20add
Ved.
X!
X!`20`20`20`20This`20is`20used`20if`20NO`20compression`20is`20requested`20by
V`20the`20user
X!
X!`20----------------------------------------------------------------
X
XPROCEDURE`20QuoteBuffer
XLOCAL`20c;
X
X`20`20LOOP
X`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
X`20`20`20`20COPY_TEXT(Initial_Flag);
X
X`20`20`20`20LOOP`20!`20Thru`20current`20line
X`20`20`20`20`20`20c`20:=`20CURRENT_CHARACTER;
X`20`20`20`20`20`20EXITIF`20c`20=`20"";`09`09!`20NULL`20=`20End`20of`20line
X
X`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
X`20`20`20`20`20`20`20`20THEN`20EncodeQuoteable;
X`20`20`20`20`20`20`20`20ELSE`20MOVE_HORIZONTAL(1);`20BreakLongLine;
X`20`20`20`20`20`20ENDIF;
X
X`20`20`20`20ENDLOOP;
X
X`20`20`20`20MOVE_HORIZONTAL(1);`09`09`09`09!`20next`20line
X`20`20ENDLOOP;
XENDPROCEDURE
X
X
X`0C
X!`20----------------------------------------------------------------
X!`20COMPRESS`20BUFFER
X!
X!`20`20`20`20This`20routine`20performs`20a`20similar`20function`20to`20QuoteBu
Vffer,`20quoting
X!`20`20`20`20non-printable`20characters`20and`20wrapping/marking`20long`20line
Vs`20but
X!`20`20`20`20performs`20additional`20compression`20in`20the`20form`20of`20run-
Vlength
X!`20`20`20`20encoding.
X!
X!`20----------------------------------------------------------------
X
XPROCEDURE`20CompressBuffer
XLOCAL`20c,RunSize;
X
X`20`20LOOP
X`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
X`20`20`20`20COPY_TEXT(Initial_Flag);
X
X`20`20`20`20LOOP
X`20`20`20`20`20`20`20`20c`20:=`20CURRENT_CHARACTER;
X`20`20`20`20`20`20`20`20EXITIF`20c`20=`20"";`09`09!`20NULL`20=`20End`20of`20li
Vne
X
X`20`20`20`20`20`20`20`20RunSize`20:=`20LENGTH(SEARCH(ANCHOR+SPAN(c),`20FORWARD
V,`20EXACT));
X`20`20`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
X`20`20`20`20`20`20`20`20`20`20`20THEN`09`09`09!`20Come`20here`20to`20deal`20wi
Vth`20quotable`20char
X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20RunSize`20<`202
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN`20EncodeQuoteable;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE`20RLEncode(c,RunSize,2);
X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
X`20`20`20`20`20`20`20`20`20`20`20ELSE`09`09`09!`20Come`20here`20to`20deal`20wi
Vth`20non-quotable`20char
X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20RunSize`20<`206
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN`20MOVE_HORIZONTAL(1);`20Brea
VkLongLine;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE`20RLEncode(c,RunSize,6);
X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
X`20`20`20`20`20`20`20`20ENDIF;
X
X`20`20`20`20ENDLOOP;
X
X`20`20`20`20MOVE_HORIZONTAL(1);`09`09`09`09!`20next`20line
X`20`20ENDLOOP;
X
XENDPROCEDURE
X
X
X`0C
X!`20----------------------------------------------------------------
X!`20SHRINK`20BUFFER
X!
X!`20`20`20`20Performs`20a`20similar`20function`20to`20QUOTE`20BUFFER`20(I.E.
V`20quoting`20non
X!`20`20`20`20printable`20characters`20and`20wrapping/marking`20long`20lines)
V`20but`20adds
X!`20`20`20`20the`20additional`20function`20of`20LZW-style`20substring`20compre
Vssion
X!
X!`20----------------------------------------------------------------
X
XPROCEDURE`20ShrinkBuffer
XLOCAL`20c,cp,Rbegin,InpMem,TestString,MatchPosn,LastMatch;
X
X`20`20`20TestString`20:=`20"";
X`20`20`20InpMem`20`20`20`20`20:=`20"";
X`20`20`20Rbegin`20`20`20`20`20:=`20MARK(NONE);
X`20`20`20LastMatch`20`20:=`200;
X`20`20`20LOOP
X`20`20`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
X`20`20`20`20`20`20COPY_TEXT(Initial_Flag);
X
X`20`20`20`20`20`20LOOP
X`20`20`20`20`20`20`20`20`20c:=CURRENT_CHARACTER;
X`20`20`20`20`20`20`20`20`20cp:=c;
X`20`20`20`20`20`20`20`20`20IF`20c=""`20THEN`20cp`20:=`20FakeEOL_Flag;`20ENDIF;
V
X
X`20`20`20`20`20`20`20`20`20IF`20LENGTH(TestString)`20>`201
X`20`20`20`20`20`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20`20`20`20`20`20MatchPosn`20:=`20FindString(TestString+
Vcp,InpMem,LastMatch);
X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20(MatchPosn`20=`200)`20OR`20(c=Fake
VEOL_Flag)
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LZEncode(Rbegin,LENGTH(InpM
Vem),LastMatch,LENGTH(TestString));
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20InpMem`20`20`20`20`20:=`20R
VightMost(InpMem+TestString,MaxHexEnc);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LastMatch`20`20:=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20TestString`20:=`20cp;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Rbegin`20`20`20`20`20:=`20Q
VUEncode;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LastMatch`20`20:=`20MatchPo
Vsn;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20TestString`20:=`20TestStrin
Vg`20+`20cp;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20QUEncode;
X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
X`20`20`20`20`20`20`20`20`20`20`20ELSE
X`20`20`20`20`20`20`20`20`20`20`20`20`20TestString:=`20TestString`20+`20cp;
X`20`20`20`20`20`20`20`20`20`20`20`20`20QUEncode;
X`20`20`20`20`20`20`20`20`20ENDIF;
X
X`20`20`20`20`20`20`20`20`20IF`20c`20=`20FakeEOL_Flag`20THEN`20TestString`20:=
V`20"";`20InpMem`20:=`20"";`20ENDIF;
X
X`20`20`20`20`20`20`20`20`20EXITIF`20c="";
X`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(1);`20BreakLongLine;
X
X`20`20`20`20`20`20ENDLOOP;
X
X`20`20`20`20`20`20MOVE_HORIZONTAL(1);
X`20`20`20ENDLOOP;
X`20`20`20
X`20`20`20IF`20LENGTH(TestString)`20>`202
X`20`20`20`20`20THEN
X`20`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
X`20`20`20`20`20`20`20LZEncode(Rbegin,LENGTH(InpMem),LastMatch,LENGTH(TestStrin
Vg)-1);
X`20`20`20ENDIF;
XENDPROCEDURE;
X
X
X`0C
X!`20----------------------------------------------------------------
X!`20ENCODE`20BUFFER
X!
X!`20`20`20This`20routine`20is`20the`20interface`20to`20the`20buffer`20encoding
V`20methods.
X!`20`20`20It`20selects`20the`20compression`20technique`20to`20be`20used`20base
Vd`20on`20the
X!`20`20`20user`20specified`20`60compression'`20value.`20If`20selected,`20it
V`20will`20also
X!`20`20`20issue`20statistics`20after`20compression`20to`20indicate`20the`20eff
Vectiveness
X!`20`20`20of`20any`20selected`20compression`20method.
X!
X!`20----------------------------------------------------------------
X
XPROCEDURE`20Encode_Buffer(XBuffer)
XLOCAL`20f,l1,l2,b1,b2,c;
X
X!`20Collect`20initial`20sizing`20statistics
X`20`20l1:=GET_INFO(Xbuffer,"RECORD_COUNT");
X`20`20b1:=SizeBuffer(Xbuffer);
X
X!`20Show`20size`20if`20suitable`20log`20level`20enabled
X`20`20IF`20Logging`20>=`20LOG_ShowStats
X`20`20`20`20THEN
X`20`20`20`20`20`20f:="!8%T,`20Records:`20!UL,`20Bytes:`20!UL";
X`20`20`20`20`20`20Inform("I","ORIGSIZE",FAO(f,0,l1,b1));
X`20`20ENDIF;
X
X!`20Encode`20buffer,`20using`20the`20user's`20requested`20compression
X!`20Always`20quote`20non-printable`20chars`20and`20wrap`20lines`20regardless
X`20`20POSITION(`20BEGINNING_OF(XBuffer)`20);
X`20`20IF`20Compression`20=`20COMPRESS_None`20`20`20`20`20`20THEN`20QuoteBuffer
V;`20`20`20`20ENDIF;
X`20`20IF`20Compression`20=`20COMPRESS_Runlength`20THEN`20CompressBuffer;`20END
VIF;
X`20`20IF`20Compression`20=`20COMPRESS_LZW`20`20`20`20`20`20`20THEN`20ShrinkBuf
Vfer;`20`20`20ENDIF;
+-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads