home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!usc!news.service.uci.edu!unogate!mvb.saic.com!vmsnet-sources
- Newsgroups: vmsnet.sources
- From: "Andy, Systems Manager" <UDAA055@ELM.CC.KCL.AC.UK>
- Subject: VMS_SHARE V8.2, part 03/09
- Message-ID: <10312283@MVB.SAIC.COM>
- Date: Mon, 25 Jan 1993 21:34:08 GMT
- Lines: 1099
- Followup-To: vmsnet.sources.d
- Approved: Mark.Berryman@Mvb.Saic.Com
-
- 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 +-+-+-+-+-+-+-+-
-