home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / vmsnet / sources / 493 < prev    next >
Encoding:
Internet Message Format  |  1993-01-25  |  47.9 KB

  1. Path: sparky!uunet!usc!news.service.uci.edu!unogate!mvb.saic.com!vmsnet-sources
  2. Newsgroups: vmsnet.sources
  3. From: "Andy, Systems Manager" <UDAA055@ELM.CC.KCL.AC.UK>
  4. Subject: VMS_SHARE V8.2, part 03/09
  5. Message-ID: <10312283@MVB.SAIC.COM>
  6. Date: Mon, 25 Jan 1993 21:34:08 GMT
  7. Lines: 1099
  8. Followup-To: vmsnet.sources.d
  9. Approved: Mark.Berryman@Mvb.Saic.Com
  10.  
  11. Submitted-by: "Andy, Systems Manager" <UDAA055@ELM.CC.KCL.AC.UK>
  12. Posting-number: Volume 4, Issue 47
  13. Archive-name: vms_share/part03
  14. Supersedes: vms_share: Volume 3, Issue 87-89
  15.  
  16. -+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
  17. 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
  18. 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
  19. V`20`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
  21. Vum`20fixed`20size`20so`20`20`20+
  22. X!`20+`20`20`20that`20it`20can`20pass`20unscathed`20through`20mailers`20that
  23. V`20truncate`20long`20`20`20`20+
  24. X!`20+`20`20`20messages.`20`20These`20routines`20deal`20with`20splitting`20the
  25. V`20share`20file`20`20`20`20`20+
  26. X!`20+`20`20`20into`20smaller`20manageable`20parts,`20each`20of`20which`20may
  27. V`20be`20mailed`20`20`20`20`20`20`20+
  28. X!`20+`20`20`20without`20corruption.`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  29. 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
  30. V`20`20`20`20`20`20`20+
  31. 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
  32. 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
  33. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  34. 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
  35. 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
  36. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  37. X!`20+`20`20`208.0`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Andy
  38. V`20Harper`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20September`201992
  39. V`20`20+
  40. 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
  41. 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
  42. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  43. 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
  44. 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
  45. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  46. 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
  47. 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
  48. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  49. 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
  50. 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
  51. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  52. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T
  53. V`20I`20N`20E`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20
  54. V`20`20`20`20`20`20`20`20`20`20+
  55. 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
  56. 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
  57. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  58. 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
  59. 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
  60. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  61. X!`20+`20`20`20WritePart`20`20`20Routine`20to`20write`20a`20buffer`20to`20disk
  62. V`20(to`20specified`20part)+
  63. 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
  64. 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
  65. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  66. X!`20+`20`20`20FlushPart`20`20`20If`20the`20part`20buffer`20contains`20data,
  67. V`20flush`20it`20to`20disk`20`20`20+
  68. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20and`20update`20the`20Part
  69. V`20Number.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  70. V`20`20`20`20+
  71. 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
  72. 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
  73. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  74. X!`20+`20`20`20Find_Break`20`20Locate`20the`20line`20in`20the`20buffer`20which
  75. V`20straddles`20a`20given+
  76. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20size`20in`20bytes.`20Uses
  77. V`20a`20binary`20search`20algorithm`20for`20`20`20`20+
  78. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20speed.`20`20`20`20`20`20`20
  79. 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
  80. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  81. 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
  82. 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
  83. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  84. X!`20+`20`20`20Terminate_Part`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  85. 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
  86. V`20`20`20`20`20`20`20`20`20`20+
  87. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Determine`20the`20best`20par
  88. Vt`20separator`20flags`20to`20use;`20add`20`20+
  89. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20them`20to`20the`20part`20buf
  90. Vfer`20and`20remaining`20data,`20then`20`20`20`20`20+
  91. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20empty`20the`20part`20buffer
  92. 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
  93. V`20`20`20`20`20`20`20+
  94. 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
  95. 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
  96. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  97. X!`20+`20`20`20Add_To_Part`20Given`20a`20buffer`20full`20of`20data,`20add`20it
  98. V`20to`20the`20current`20`20`20+
  99. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Part`20buffer,`20splitting
  100. V`20where`20necessary`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  101. 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
  102. 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
  103. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  104. X!`20+`20`20`20Add_To_Part_Nosplit`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  105. 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
  106. V`20`20`20`20`20`20`20+
  107. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Adds`20a`20buffer`20to`20the
  108. V`20the`20current`20part`20but`20takes`20care`20+
  109. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20not`20to`20split`20it`20`20
  110. 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
  111. V`20`20`20`20`20`20`20`20`20`20`20+
  112. 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
  113. 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
  114. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  115. X!`20+--------------------------------------------------------------------+
  116. 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
  117. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  118. X!`20----------------------------------------------------------------------
  119. X!`20Write`20the`20named`20buffer`20to`20disk`20as`20the`20given`20sharefile
  120. V`20part
  121. X!`20----------------------------------------------------------------------
  122. X
  123. XPROCEDURE`20WritePart(Xbuffer,Part)
  124. XLOCAL`20f;
  125. X
  126. X!`20Trap`20any`20errors`20writing`20to`20a`20file`20(disk`20quota`20etc.)
  127. X`20`20`20ON_ERROR
  128. X`20`20`20`20`20Inform("E","FILWRERR",`20"Error`20writing`20part`20to`20file
  129. V`20"`20+`20f);
  130. X`20`20`20`20`20ABORT;
  131. X`20`20`20ENDON_ERROR;
  132. X
  133. X!`20Write`20out`20the`20buffer
  134. X`20`20`20f`20:=`20Share_File+STR(Part);
  135. X`20`20`20WRITE_FILE(Xbuffer,f);
  136. X`20`20`20ERASE(Xbuffer);
  137. XENDPROCEDURE;
  138. X
  139. X
  140. X
  141. X
  142. X!`20----------------------------------------------------------------------
  143. X!`20If`20the`20part`20buffer`20is`20not`20empty,`20update`20the`20part`20numbe
  144. Vr`20and`20flush`20its
  145. X!`20contents`20to`20disk.`20Treat`20part`201`20especially`20as`20we`20need`20t
  146. Vo`20do`20some
  147. X!`20final`20massaging`20of`20its`20contents,`20so`20save`20it`20in`20a`20separ
  148. Vate`20buffer.
  149. X!`20----------------------------------------------------------------------
  150. X
  151. XPROCEDURE`20FlushPart
  152. X
  153. X`20`20IF`20GET_INFO(PartBuffer,"RECORD_COUNT")`20>`200
  154. X`20`20`20`20`20THEN
  155. X`20`20`20`20`20`20`20`20PartNo`20:=`20PartNo`20+`201;
  156. X`20`20`20`20`20`20`20`20IF`20PartNo`20=`201
  157. X`20`20`20`20`20`20`20`20`20`20`20THEN`20MoveInfo(PartBuffer,`20Part1Buffer);
  158. X`20`20`20`20`20`20`20`20`20`20`20ELSE`20WritePart(PartBuffer,`20PartNo);
  159. X`20`20`20`20`20`20`20`20ENDIF;
  160. X`20`20ENDIF;
  161. X
  162. XENDPROCEDURE;
  163. X`0C
  164. X!`20----------------------------------------------------------------------
  165. X!`20This`20routine`20uses`20a`20fast`20binary`20search`20algorithm`20to`20find
  166. V`20the`20first`20line`20in`20the
  167. X!`20given`20buffer`20which`20straddles`20a`20given`20break`20point`20-`20I.E.
  168. V`20where`20the`20size`20of`20the
  169. X!`20buffer`20up`20to`20and`20including`20that`20line`20would`20just`20go`20ove
  170. Vr`20the`20'Max_Size'`20value
  171. X!`20(bytes).`20This`20allows`20us`20to`20quickly`20determine`20where`20a`20buf
  172. Vfer`20should`20be`20split
  173. X!`20when`20chopping`20up`20the`20info`20into`20several`20small`20parts.
  174. X!`20----------------------------------------------------------------------
  175. X
  176. XPROCEDURE`20Find_Break(Xbuffer,Max_Size)
  177. XLOCAL`20m,`20mb,`20Size,`20Line_Size,`20Low,`20High,`20New_Line,`20Cur_Line;
  178. X
  179. X`20`20Low`20`20`20`20`20`20:=`200;
  180. X`20`20High`20`20`20`20`20:=`20GET_INFO(Xbuffer,"RECORD_COUNT")`20-`201;
  181. X`20`20Cur_Line`20:=`200;
  182. X
  183. X`20`20mb`20:=`20BEGINNING_OF(Xbuffer);
  184. X`20`20POSITION(mb);
  185. X
  186. X`20`20LOOP
  187. X`20`20`20`20`20New_Line`20:=`20(Low+High)`20/`202;
  188. X`20`20`20`20`20MOVE_VERTICAL(New_Line-Cur_Line);
  189. X`20`20`20`20`20Cur_Line`20:=`20New_Line;
  190. X
  191. X`20`20`20`20`20Size:=LENGTH(CREATE_RANGE(mb,MARK(NONE),NONE))+EOL*Cur_Line;
  192. X`20`20`20`20`20Line_Size`20:=`20LENGTH(CURRENT_LINE)`20+`20EOL;
  193. X
  194. X`20`20`20`20`20IF`20Debugging`20>=`20DEBUG_FindBreak
  195. X`20`20`20`20`20`20`20THEN
  196. X`20`20`20`20`20`20`20`20`20m:="At`20line:`20!UL`20(Range:`20!UL-!UL),`20Length
  197. V:`20!UL,`20Buffer`20Size:`20!UL/!UL";
  198. X`20`20`20`20`20`20`20`20`20Inform("I","DBGFNDBRK",FAO(m,Cur_Line,Low,High,Line
  199. V_Size,Size,Max_Size));
  200. X`20`20`20`20`20ENDIF;
  201. X
  202. X`20`20`20`20`20EXITIF`20(Size`20<`20Max_Size)`20AND`20(Size+Line_Size>=Max_Siz
  203. Ve);
  204. X
  205. X`20`20`20`20`20IF`20Size`20`20`20`20`20`20`20`20`20`20`20`20`20<`20`20Max_Size
  206. V`20THEN`20Low`20`20:=`20Cur_Line`20+`201;`20ENDIF;
  207. X`20`20`20`20`20IF`20Size`20+`20Line_Size`20>=`20Max_Size`20THEN`20High`20:=
  208. V`20Cur_Line`20-`201;`20ENDIF;
  209. X
  210. X`20`20`20`20`20EXITIF`20Low`20>=`20High;
  211. X`20`20ENDLOOP;
  212. X
  213. X!`20TPU`20IS`20NOT`20CLEVER`20AT`20HANDLING`20NULL`20RANGES`20SO,`20IF`20THE
  214. V`20BREAK`20POINT`20IS`20ON`20THE
  215. X!`20FIRST`20LINE`20OF`20THE`20BUFFER,`20WE`20HAVE`20TO`20KLUDGE`20AROUND`20IT.
  216. V`20DO`20THIS`20BY`20RETURNING
  217. X!`20A`20ZERO`20VALUE`20TO`20MEAN`20A`20NULL`20RANGE,`20OTHERWISE`20RETURN`20TH
  218. VE`20RANGE`20ITSELF.
  219. X`20`20IF`20Cur_Line`20>`200
  220. X`20`20`20`20THEN
  221. X`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
  222. X`20`20`20`20`20`20RETURN(`20CREATE_RANGE(`20mb,`20MARK(NONE),`20NONE`20)`20);
  223. X`20`20ENDIF;
  224. X
  225. X`20`20RETURN(0);`20`20
  226. XENDPROCEDURE;
  227. X`0C
  228. X!`20----------------------------------------------------------------------
  229. X!`20Inserts`20a`20suitable`20part`20separator`20into`20the`20part`20buffer`20a
  230. Vnd`20into`20the
  231. X!`20current`20work`20buffer.
  232. X!
  233. X!`20The`20type`20of`20part`20separator`20is`20determined`20by`20looking`20at
  234. V`20the`20data`20in`20the`20buffer
  235. X!`20immediately`20following`20the`20break`20point.`20If`20it`20starts`20with
  236. V`20'$'`20then`20we`20are
  237. X!`20splitting`20the`20buffer`20at`20the`20DCL`20code`20which`20is`20part`20of
  238. V`20the`20unpacking`20control
  239. X!`20thus`20we`20can`20use`20$GOTO`20and`20a`20label.`20`20If`20not,`20then`20w
  240. Ve`20are`20in`20the`20midst`20of`20user
  241. X!`20data`20and`20should`20use`20the`20special`20flag`20lines.
  242. X!
  243. X!`20----------------------------------------------------------------------
  244. X
  245. XPROCEDURE`20Terminate_Part(Part,`20Xbuffer)
  246. XLOCAL`20end_text;
  247. X
  248. X`20`20`20POSITION(`20BEGINNING_OF(Xbuffer)`20);
  249. X
  250. X`20`20`20IF`20(CURRENT_CHARACTER`20=`20"$")
  251. X`20`20`20`20`20`20THEN`09`09`09!`20Executable`20DCL`20code`20insert`20GOTO/lab
  252. Vel`20pair
  253. X`20`20`20`20`20`20`20`20`20end_text`20`20:=`20FAO(FAO_end_goto,`20Part+1);
  254. X`20`20`20`20`20`20`20`20`20CopyLine(`20FAO(FAO_start_label,`20Part+1)`20);
  255. X`20`20`20`20`20`20ELSE`09`09`09!`20User`20data,`20insert`20recognizable`20sepa
  256. Vrators
  257. X`20`20`20`20`20`20`20`20`20end_text`20`20:=`20FAO(FAO_end_part,`20Part);
  258. X`20`20`20`20`20`20`20`20`20CopyLine(`20FAO(FAO_start_part,`20Part+1)`20);
  259. X`20`20`20ENDIF;`20`20`20`20`20`20`20`20
  260. X
  261. X`20`20`20POSITION(END_OF(PartBuffer));
  262. X`20`20`20COPY_TEXT(end_text);
  263. X
  264. X`20`20`20FlushPart;
  265. X
  266. XENDPROCEDURE;
  267. X`0C
  268. X!`20----------------------------------------------------------------------
  269. X!
  270. X!`20Add`20a`20given`20work`20buffer`20to`20the`20current`20part`20of`20the`20s
  271. Vharefile,`20creating
  272. X!`20one`20or`20more`20new`20parts`20if`20necessary`20as`20the`20maximum`20part
  273. V`20size`20is`20exceeded.
  274. X!`20Each`20time`20the`20part`20buffer`20fills`20up,`20it`20is`20flushed`20out.
  275. V
  276. X!
  277. X!`20----------------------------------------------------------------------
  278. X
  279. XPROCEDURE`20Add_To_Part(Xbuffer)
  280. XLOCAL`20m,`20r,`20Size_Xbuffer,`20Size_PartBuffer;
  281. X
  282. X`20`20LOOP
  283. X`20`20`20`20Size_Xbuffer`20`20`20`20:=`20SizeBuffer(Xbuffer);
  284. X`20`20`20`20Size_PartBuffer`20:=`20SizeBuffer(PartBuffer);`20
  285. X
  286. X`20`20`20`20IF`20Debugging`20>=`20DEBUG_PartSplit
  287. X`20`20`20`20`20`20THEN
  288. X`20`20`20`20`20`20`20m:="Max_bytes:`20!UL,`20Size`20Part`20buffer:`20!UL,`20Si
  289. Vze`20to`20add:`20!UL";
  290. X`20`20`20`20`20`20`20Inform("I","DBGADDPART",FAO(m,Max_Bytes,Size_PartBuffer,S
  291. Vize_Xbuffer));
  292. X`20`20`20`20ENDIF;
  293. X
  294. X`20`20`20`20EXITIF`20Size_PartBuffer`20+`20Size_Xbuffer`20`20<=`20`20Max_Bytes
  295. V`20;
  296. X
  297. X`20`20`20`20r`20:=`20Find_Break(Xbuffer,Max_Bytes`20-`20Size_PartBuffer);
  298. X`20`20`20`20IF`20r`20<>`200
  299. X`20`20`20`20`20`20THEN
  300. X`20`20`20`20`20`20`20`20POSITION(`20END_OF(PartBuffer)`20);
  301. X`20`20`20`20`20`20`20`20MoveInfo(r,PartBuffer);
  302. X`20`20`20`20ENDIF;
  303. X
  304. X`20`20`20`20Terminate_Part(PartNo+1,`20Xbuffer);
  305. X`20`20ENDLOOP;
  306. X
  307. X`20`20MoveInfo(Xbuffer,`20PartBuffer);
  308. X
  309. XENDPROCEDURE;
  310. X`0C
  311. X!`20----------------------------------------------------------------------
  312. X!`20Adds`20an`20unsplittable`20buffer`20to`20the`20current`20part.`20Buffers
  313. V`20are`20unsplittable
  314. X!`20if:
  315. X!`20`20`201.`20They`20contain`20the`20TPU`20unpack`20code
  316. X!`20`20`202.`20They`20contain`20DCL`20code`20that`20has,`20or`20might`20have,
  317. V`20continuation`20lines.
  318. X!`20----------------------------------------------------------------------
  319. X
  320. XPROCEDURE`20Add_To_Part_Nosplit(Xbuffer)
  321. XLOCAL`20s;
  322. X
  323. X`20`20s`20:=`20SizeBuffer(Xbuffer);
  324. X
  325. X!`20We`20can't`20deal`20with`20large`20unsplittable`20buffers`20bigger`20than
  326. V`20the`20part`20size
  327. X`20`20IF`20s`20>`20Max_Bytes
  328. X`20`20`20`20THEN
  329. X`20`20`20`20`20`20Inform("F","CANTSPLIT","Unsplittable`20buffer`20bigger`20tha
  330. Vn`20part`20size");
  331. X`20`20`20`20`20`20Inform("I","MINPARTSIZE",`20FAO("Need`20minimum`20part`20siz
  332. Ve`20of`20!UL`20block!%S",(s+511)/512));
  333. X`20`20`20`20`20`20ABORT;
  334. X`20`20ENDIF;
  335. X
  336. X!`20If`20this`20buffer`20would`20be`20split`20then`20flush`20the`20current`20p
  337. Vart`20and`20start`20a`20new
  338. X!`20one
  339. X`20`20IF`20SizeBuffer(PartBuffer)+s`20>`20Max_Bytes
  340. X`20`20`20`20THEN
  341. X`20`20`20`20`20`20Terminate_Part(PartNo+1,`20Xbuffer);
  342. X`20`20ENDIF;
  343. X
  344. X`20`20Add_To_Part(Xbuffer);
  345. XENDPROCEDURE;
  346. X`0C
  347. X!`20+--------------------------------------------------------------------+
  348. 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
  349. 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
  350. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  351. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20T`20P`20U`20`20`20C`20O`20D`20E`20
  352. V`20`20C`20O`20M`20P`20R`20E`20S`20S`20I`20O`20N`20`20`20`20`20`20`20`20`20`20
  353. V`20`20`20`20`20`20`20+
  354. 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
  355. 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
  356. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  357. 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
  358. 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
  359. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  360. X!`20+`20`20`20`20Part`20of`20the`20created`20share`20file`20contains`20some
  361. V`20TPU`20code`20which`20`20`20`20`20+
  362. X!`20+`20`20`20`20is`20executed`20to`20perform`20the`20unpacking.`20`20In`20ord
  363. Ver`20to`20save`20space`20`20`20+
  364. X!`20+`20`20`20`20we`20arrange`20to`20pack`20lines`20of`20TPU`20code`20into`20t
  365. Vhe`20smallest`20possible`20+
  366. X!`20+`20`20`20`20space`20by`20compressing`20spaces`20and`20new`20lines`20where
  367. Vver`20feasible`20but`20+
  368. X!`20+`20`20`20`20keeping`20the`20total`20line`20length`20below`20the`20maximum
  369. V`20for`20this`20share`20`20+
  370. X!`20+`20`20`20`20file.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  371. 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
  372. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  373. 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
  374. 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
  375. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  376. 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
  377. V`20Andy`20Harper`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20September`201992
  378. V`20+
  379. 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
  380. 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
  381. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  382. 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
  383. 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
  384. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  385. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T`20I`20N`20E
  386. V`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  387. V`20`20`20`20`20`20`20`20`20+
  388. 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
  389. 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
  390. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  391. X!`20+`20`20`20`20PackTPU`20`20`20`20`20Takes`20a`20line`20of`20TPU`20code`20an
  392. Vd`20adds`20it`20to`20the`20current`20+
  393. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20buffer.`20The`20current
  394. V`20buffer`20is`20assumed`20to`20be`20the`20TPU`20+
  395. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20code`20that`20will`20form
  396. V`20the`20unpacking`20part`20of`20the`20share`20+
  397. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20file.`20We`20remove`20as
  398. V`20much`20redundant`20info`20(spaces`20etc.)+
  399. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20as`20possible`20to`20save
  400. V`20space.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  401. V`20`20`20`20+
  402. 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
  403. 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
  404. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  405. X!`20+`20`20`20`20AddDCL`20`20`20`20`20`20Add`20additional`20DCL`20to`20an`20ex
  406. Visting`20line,`20forcing`20a`20`20`20+
  407. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20continuation`20line`20if
  408. V`20necessary.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  409. 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
  410. 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
  411. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  412. 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
  413. 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
  414. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  415. X!`20+--------------------------------------------------------------------+
  416. X`0C
  417. X!`20---------------------------------------------------------------------
  418. X!`20The`20main`20portion`20of`20the`20unpacking`20code`20written`20to`20the
  419. V`20sharefile`20is`20in
  420. X!`20the`20form`20of`20a`20TPU`20procedure.`20To`20save`20space,`20the`20TPU
  421. V`20code`20is`20packed`20to
  422. X!`20remove`20unnecessary`20spaces`20and`20newlines.`20We`20also`20ensure`20tha
  423. Vt`20lines`20do
  424. X!`20not`20exceed`20the`20maximum`20share`20file`20line`20length.`20Lines`20are
  425. V`20always`20split
  426. X!`20just`20after`20a`20character`20in`20the`20set`20`60TPU_Separators'.`20Note
  427. V`20that`20this
  428. X!`20set`20does`20NOT`20include`20spaces`20or`20quote`20symbols`20to`20avoid
  429. V`20splitting`20in`20the
  430. X!`20midst`20of`20strings`20(which`20may`20not`20split`20across`20lines`20in
  431. V`20TPU).
  432. X!`20---------------------------------------------------------------------
  433. XPROCEDURE`20PackTPU(NewTPUCode)
  434. XLOCAL`20s,c;
  435. X
  436. X!`20Append`20the`20new`20TPU`20code`20to`20the`20end`20of`20the`20current`20li
  437. Vne,`20trimming`20blanks`20first
  438. X`20`20s`20:=`20NewTPUCode;
  439. X`20`20EDIT(s,TRIM);
  440. X`20`20COPY_TEXT(s);
  441. X
  442. X!`20If`20it`20doesn't`20end`20in`20an`20acceptable`20separator,`20then`20add
  443. V`20a`20space`20to`20delimit
  444. X!`20it`20from`20the`20next`20one`20added.
  445. X`20`20c`20:=`20SUBSTR(s,LENGTH(s),1);
  446. X`20`20IF`20INDEX(TPU_separators,c)`20=`200`20THEN`20COPY_TEXT("`20");`20ENDIF;
  447. V
  448. X
  449. X
  450. X!`20If`20the`20current`20line`20is`20now`20too`20long,`20find`20a`20point`20to
  451. V`20split`20it
  452. X`20`20IF`20LENGTH(CURRENT_LINE)`20>`20Max_Share_Length
  453. X`20`20`20`20THEN
  454. X
  455. X`20`20`20`20!`20Find`20a`20TPU`20separator`20character`20on`20which`20to`20spl
  456. Vit
  457. X`20`20`20`20`20`20LOOP
  458. X`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
  459. X`20`20`20`20`20`20`20`20POSITION(`20SEARCH(`20ANY(TPU_separators),REVERSE)`20)
  460. V;
  461. X`20`20`20`20`20`20`20`20EXITIF`20CURRENT_OFFSET`20<`20Max_Share_Length;
  462. X`20`20`20`20`20`20ENDLOOP;
  463. 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
  464. X`20`20`20`20!`20Split`20just`20past`20the`20TPU`20separator`20and`20reposition
  465. V`20at`20the`20end`20of`20the`20line
  466. X`20`20`20`20`20`20MOVE_HORIZONTAL(1);
  467. X`20`20`20`20`20`20SPLIT_LINE;
  468. X`20`20`20`20`20`20MOVE_HORIZONTAL(`20LENGTH(CURRENT_LINE)`20);
  469. X`20`20ENDIF;
  470. X
  471. X
  472. X`20`20IF`20Debugging`20>=`20DEBUG_PackTPU
  473. X`20`20`20`20THEN
  474. X`20`20`20`20`20`20Inform("I","DBGPKTPU","Adding`20"""+s+""",`20To`20give:`20""
  475. V"`20+`20CURRENT_LINE+"""")
  476. X`20`20ENDIF;
  477. X
  478. XENDPROCEDURE;
  479. X
  480. X
  481. X!`20----------------------------------------------------------------------
  482. X!
  483. X!`20Add`20a`20parameter`20to`20an`20incomplete`20line`20of`20DCL,`20forcing
  484. V`20a`20DCL`20continuation
  485. X!`20if`20the`20resulting`20DCL`20line`20exceeds`20the`20maximum`20share`20file
  486. V`20length.
  487. X!
  488. X!`20This`20is`20used`20only`20for`20generating`20DCL`20lines`20that`20contain
  489. V`20variable
  490. X!`20such`20as`20filenames`20and`20attributes.`20Without`20this,`20some`20fussy
  491. V`20mailers`20might
  492. X!`20truncate`20these`20important`20lines`20and`20lose`20key`20data.
  493. X!
  494. X!`20----------------------------------------------------------------------
  495. X
  496. XPROCEDURE`20AddDCL(DCLParameter)
  497. X`20`20IF`20CURRENT_OFFSET`20+`20LENGTH(DCLParameter)`20>`20Max_Share_Length
  498. X`20`20`20`20THEN
  499. X`20`20`20`20`20`20COPY_TEXT("-");`20SPLIT_LINE;`20COPY_TEXT("`20");
  500. X`20`20ENDIF;
  501. X`20`20COPY_TEXT(DCLParameter);
  502. XENDPROCEDURE;
  503. X`0C
  504. X!`20--------------------------------------------------------------------------
  505. V-
  506. 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
  507. 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
  508. 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+
  509. 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
  510. V`20F`20E`20R`20`20`20E`20N`20C`20O`20D`20I`20N`20G`20`20`20`20`20`20`20`20`20
  511. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  512. 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
  513. 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
  514. 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+
  515. 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
  516. 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
  517. 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+
  518. X!`20+`20`20`20This`20set`20of`20routines`20provides`20the`20various`20mechanis
  519. Vms`20for`20encoding`20the`20+
  520. X!`20+`20`20`20data`20in`20a`20buffer`20so`20that`20it`20may`20pass`20unchanged
  521. V`20through`20intolerant`20`20`20`20`20+
  522. X!`20+`20`20`20network`20MAIL`20systems,`20and`20be`20accurately`20reconstructe
  523. Vd`20at`20the`20receiving+
  524. X!`20+`20`20`20end.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  525. 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
  526. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  527. 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
  528. 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
  529. 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+
  530. X!`20+`20`20`20Four`20types`20of`20encoding`20are`20attempted`20here:`20`20`20
  531. 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+
  532. X!`20+`20`20`20`20`201.`20`20Simplified`20LZW`20common`20substring`20encoding
  533. 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+
  534. X!`20+`20`20`20`20`202.`20`20Run-length`20encoding`20of`20a`20run`20of`20the
  535. V`20same`20character`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  536. X!`20+`20`20`20`20`203.`20`20Quoting`20(escaping)`20of`20specific`20characters
  537. V`20that`20MAILERS`20mangle`20`20`20+
  538. X!`20+`20`20`20`20`204.`20`20Wrapping`20of`20long`20lines`20and`20flagging`20th
  539. Ve`20start`20and`20continuation`20`20+
  540. X!`20+`20`20`20`20`20`20`20`20`20lines`20so`20generated`20in`20order`20to`20rej
  541. Voin`20them`20later.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  542. 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
  543. 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
  544. 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+
  545. 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
  546. 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
  547. 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+
  548. X!`20+`20`20`20Version`208.2`20`20`20`20`20`20`20`20`20`20`20`20`20Andy`20Harpe
  549. Vr`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20December`201992`20`20
  550. V`20`20+
  551. 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
  552. 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
  553. 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+
  554. 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
  555. 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
  556. 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+
  557. 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
  558. V`20I`20N`20E`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20
  559. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  560. 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
  561. 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
  562. 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+
  563. 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
  564. 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
  565. 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+
  566. X!`20+`20`20`20SplitNeeded`20`20`20`20`20`20`20`20`20`20`20Checks`20the`20line
  567. V`20length`20to`20determine`20whether`20a`20`20`20+
  568. 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
  569. V`20continuation`20is`20required.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  570. V`20`20`20`20`20`20`20`20+
  571. 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
  572. 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
  573. 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+
  574. X!`20+`20`20`20BreakLongLine`20`20`20`20`20`20`20`20`20Inserts`20continuation
  575. V`20line`20if`20needed`20`20`20`20`20`20`20`20`20`20`20`20`20+
  576. 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
  577. 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
  578. 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+
  579. X!`20+`20`20`20PutText`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Like`20COPY_
  580. VTEXT`20but`20splits`20the`20line`20first`20if`20the`20+
  581. 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
  582. V`20resulting`20line`20would`20be`20too`20long.`20`20`20`20`20`20`20`20`20`20
  583. V`20`20`20`20`20+
  584. 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
  585. 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
  586. 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+
  587. X!`20+`20`20`20EncodeQuotable`20`20`20`20`20`20`20`20Encodes`20a`20character
  588. V`20to`20its`20quoted`20form`20`20`20`20`20`20`20`20`20`20+
  589. 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
  590. 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
  591. 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+
  592. X!`20+`20`20`20QUEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20If`20character
  593. V`20is`20quoteable,`20then`20encode`20it`20`20`20`20`20`20`20+
  594. 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
  595. 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
  596. 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+
  597. X!`20+`20`20`20RLEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20Encode`20a`20r
  598. Vun`20of`20the`20same`20character`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  599. 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
  600. 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
  601. 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+
  602. X!`20+`20`20`20LZEncode`20`20`20`20`20`20`20`20`20`20`20`20`20`20Encode`20a`20s
  603. Vubstring`20using`20modified`20LZW`20encoding`20`20+
  604. 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
  605. 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
  606. 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+
  607. X!`20+`20`20`20QuoteBuffer`20`20`20`20`20`20`20`20`20`20`20Scan`20buffer,`20app
  608. Vly`20line`20wrapping`20and`20quoting`20`20`20`20+
  609. 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
  610. 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
  611. 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+
  612. X!`20+`20`20`20CompressBuffer`20`20`20`20`20`20`20`20As`20QuoteBuffer,`20but
  613. V`20also`20do`20run`20length`20encoding`20+
  614. 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
  615. 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
  616. 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+
  617. X!`20+`20`20`20ShrinkBuffer`20`20`20`20`20`20`20`20`20`20As`20QuoteBuffer,`20bu
  618. Vt`20also`20do`20LZW`20compression`20`20`20`20`20+
  619. 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
  620. 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
  621. 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+
  622. X!`20+`20`20`20Encode_Buffer`20`20`20`20`20`20`20`20`20Apply`20encoding`20to
  623. V`20a`20complete`20buffer.`20This`20is`20the+
  624. 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
  625. V`20only`20routine`20that`20should`20be`20called`20from`20outside`20+
  626. 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
  627. V`20the`20module.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  628. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  629. 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
  630. 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
  631. 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+
  632. X!`20--------------------------------------------------------------------------
  633. V-
  634. X`0C
  635. X!`20--------------------------------------------------------------------------
  636. V----
  637. X!`20SPLIT`20NEEDED
  638. X!
  639. X!`20`20`20`20`20Checks`20to`20see`20if`20the`20current`20line`20will`20be`20lo
  640. Vnger`20than`20the`20maximum`20line
  641. X!`20`20`20`20`20length`20if`20the`20text`20parameter`20is`20inserted`20at`20th
  642. Ve`20current`20point.
  643. X!
  644. X!`20--------------------------------------------------------------------------
  645. V----
  646. X
  647. XPROCEDURE`20SplitNeeded(`20x`20)
  648. XLOCAL`20l;
  649. X
  650. X`20`20l`20:=`20LENGTH(CURRENT_LINE);
  651. X
  652. X`20`20IF`20(CURRENT_OFFSET`20+`20x`20>=`20Max_Share_Length)`20OR`20(l`20+`20x
  653. V`20>`20Max_TPU_Line_Length)
  654. X`20`20`20`20THEN
  655. X`20`20`20`20`20`20`20RETURN`20(1);`09!`20TRUE`20-`20Line`20split`20is`20requir
  656. Ved
  657. X`20`20`20`20ELSE
  658. X`20`20`20`20`20`20`20RETURN`20(0);`09!`20FALSE-`20Line`20split`20not`20needed
  659. X`20`20ENDIF;
  660. X
  661. XENDPROCEDURE
  662. X
  663. X
  664. X
  665. X!`20----------------------------------------------------------------
  666. X!`20BREAK`20LONG`20LINE
  667. X!
  668. X!`20`20`20`20Checks`20the`20current`20position`20within`20the`20line;`20if`20p
  669. Vast`20the`20max
  670. X!`20`20`20`20permitted`20length,`20then`20splits`20the`20line`20to`20form`20a
  671. V`20continuation
  672. X!`20`20`20`20line
  673. X
  674. X!`20----------------------------------------------------------------
  675. X
  676. XPROCEDURE`20BreakLongLine
  677. X`20`20IF`20SplitNeeded(0)
  678. X`20`20`20`20THEN
  679. X`20`20`20`20`20`20Split_Line;`20COPY_TEXT(Continuation_Flag);
  680. X`20`20ENDIF;
  681. XENDPROCEDURE
  682. X
  683. X
  684. X!`20--------------------------------------------------------------------------
  685. V----
  686. X!`20PUT`20TEXT
  687. X!
  688. X!`20`20`20This`20routine`20inserts`20new`20text`20at`20the`20current`20point
  689. X!`20`20`20and`20returns`20the`20total`20length`20of`20the`20text`20added.
  690. X!
  691. X!`20--------------------------------------------------------------------------
  692. V---
  693. X!
  694. XPROCEDURE`20PutText(`20NewText`20)
  695. XLOCAL`20x,y;
  696. X
  697. X`20`20x`20:=`20LENGTH(NewText);
  698. X`20`20IF`20SplitNeeded(x)
  699. X`20`20`20`20`20THEN
  700. X`20`20`20`20`20`20`20Split_Line;`20COPY_TEXT(Continuation_Flag);`20x`20:=`20x
  701. V`20+`202;
  702. X`20`20ENDIF;
  703. X
  704. X`20`20COPY_TEXT(`20NewText`20);
  705. X`20`20RETURN`20(x);
  706. X
  707. XENDPROCEDURE;
  708. X
  709. X
  710. X`0C
  711. X!`20--------------------------------------------------------------------------
  712. V--
  713. X!`20ENCODE`20QUOTEABLE
  714. X!
  715. X!`20`20`20`20Replace`20the`20current`20character`20by`20its`20quoted`20equival
  716. Vent;`20also`20returns`20the
  717. X!`20`20`20`20length`20of`20the`20text`20written.`20The`20encoding`20has`20this
  718. V`20form:
  719. X!
  720. X!`20`20`20`20`20`20`20`60nn
  721. X!
  722. X!`20`20`20`20where:
  723. X!`20`20`20`20`20`20`20`60`20`20`20`20`20`20is`20the`20flag`20used`20to`20mark
  724. V`20the`20start`20of`20a`20single`20quoted`20character
  725. X!`20`20`20`20`20`20`20nn`20`20`20`20`20is`20the`20hex`20coded`20ASCII`20code
  726. V`20of`20the`20quoted`20character
  727. X!
  728. X!`20--------------------------------------------------------------------------
  729. V--
  730. X
  731. XPROCEDURE`20EncodeQuoteable
  732. XLOCAL`20EncodedString;
  733. X
  734. X`20`20EncodedString`20:=`20FAO("!AS!2XL",Quote_Flag,ASCII(ERASE_CHARACTER(1)))
  735. V;
  736. X`20`20RETURN`20(PutText(EncodedString));
  737. X
  738. XENDPROCEDURE;
  739. X
  740. X
  741. X
  742. X
  743. X!`20--------------------------------------------------------------------------
  744. V--
  745. X!`20QU`20ENCODE
  746. X!
  747. X!`20`20`20`20If`20the`20current`20character`20is`20a`20Non-Printing`20or`20tro
  748. Vublesome`20character,`20then
  749. X!`20`20`20`20encode`20it`20to`20an`20escaped`20format.
  750. X!
  751. X!`20--------------------------------------------------------------------------
  752. V--
  753. X
  754. XPROCEDURE`20QUEncode
  755. XLOCAL`20c,m,Size;
  756. X`20`20c`20:=`20CURRENT_CHARACTER;
  757. X`20`20IF`20c`20<>`20""
  758. X`20`20`20`20THEN
  759. X`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
  760. X`20`20`20`20`20`20`20`20THEN
  761. X`20`20`20`20`20`20`20`20`20`20Size`20:=`20EncodeQuoteable;
  762. X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(-Size);
  763. X`20`20`20`20`20`20`20`20`20`20m`20:=`20MARK(NONE);`09`09!`20Note`20its`20posit
  764. Vion
  765. X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(Size-1);`09!`20Back`20to`20last
  766. V`20char`20of`20escape`20sequence
  767. X`20`20`20`20`20`20`20`20`20`20RETURN(m);
  768. X`20`20`20`20`20`20ENDIF;
  769. X`20`20ENDIF;
  770. X`20`20RETURN(MARK(NONE));`09`09`09!`20Returns`20mark`20on`20current`20characte
  771. Vr
  772. XENDPROCEDURE
  773. X
  774. X
  775. X`0C
  776. X!`20--------------------------------------------------------------------------
  777. V----
  778. X!`20RL`20ENCODE
  779. X!
  780. X!`20`20`20This`20routine`20replaces`20a`20run`20of`20similar`20characters,`20s
  781. Vtarting`20at`20the`20current
  782. X!`20`20`20character`20and`20of`20length`20RunSize,`20by`20a`20coded`20escape
  783. V`20sequence.`20The`20encoding
  784. X!`20`20`20has`20this`20form:
  785. X!
  786. X!`20`20`20`20`20`20`26nnxx
  787. X!
  788. X!`20`20`20where:
  789. X!`20`20`20`20`20`20`20`26`20`20`20`20`20`20`20is`20the`20run-length`20flag
  790. X!`20`20`20`20`20`20`20nn`20`20`20`20`20`20is`20the`20count`20of`20the`20charac
  791. Vters
  792. X!`20`20`20`20`20`20`20xx`20`20`20`20`20`20is`20the`20hex`20code`20of`20the`20c
  793. Vharacter.
  794. X!
  795. X!`20`20`20Note`20that,`20due`20to`20the`20HEX`20coding`20scheme,`20a`20single
  796. V`20run`20cannot
  797. X!`20`20`20exceed`20`60MaxHexEnc'`20characters.`20Longer`20runs`20must`20be`20b
  798. Vroken`20down.`20Any
  799. X!`20`20`20run`20left`20over`20is`20left`20unencoded`20if`20its`20length`20is
  800. V`20less`20than`20the
  801. X!`20`20`20minimum`20run`20length.
  802. X!
  803. X!`20--------------------------------------------------------------------------
  804. V---
  805. X
  806. XPROCEDURE`20RLEncode(c,RunSize,MinRunLength)
  807. XLOCAL`20Size,EncodedString;
  808. X`20`20LOOP
  809. X`20`20`20`20EXITIF`20RunSize`20<`20MinRunLength;
  810. X`20`20`20`20Size`20:=`20RunSize;
  811. X`20`20`20`20IF`20Size`20>`20MaxHexEnc`20THEN`20Size:=MaxHexEnc`20ENDIF;
  812. X`20`20`20`20ERASE_CHARACTER(Size);
  813. X`20`20`20`20EncodedString`20:=`20FAO("!AS!2XL!2XL",Run_Flag,Size,ASCII(c));
  814. X`20`20`20`20PutText(`20EncodedString`20);
  815. X`20`20`20`20RunSize`20:=`20RunSize`20-`20Size;
  816. X`20`20ENDLOOP;
  817. XENDPROCEDURE;
  818. X
  819. X
  820. X`0C
  821. X!`20--------------------------------------------------------------------------
  822. V--
  823. X!`20LZ`20ENCODE
  824. X!
  825. X!`20`20`20This`20routine`20replaces`20a`20substring,`20delimited`20by`20`60s'
  826. V`20and`20the`20current
  827. X!`20`20`20position,`20by`20a`20modified`20format`20of`20LZW`20encoding.`20The
  828. V`20encoding`20has
  829. X!`20`20`20this`20form:
  830. X!
  831. X!`20`20`20`20`20`20`20`5Cbbnn
  832. X!
  833. X!`20`20`20Where:
  834. X!`20`20`20`20`20`20`20`5C`09is`20the`20flag`20to`20mark`20the`20start`20of`20a
  835. V`20coded`20substring.
  836. X!`20`20`20`20`20`20`20bb`09is`20a`20hex`20coded`20backwards`20count`20to`20the
  837. V`20start`20of`20the
  838. X!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20matching`20substring`20occurring
  839. V`20earlier`20in`20the`20buffer.
  840. X!`20`20`20`20`20`20`20nn`20`20`20`20`20`20is`20a`20hex`20coded`20substring`20l
  841. Vength.
  842. X!
  843. X!`20`20`20Within`20the`20encoded`20range,`20characters`20may`20have`20been`20p
  844. Vreviously`20quoted,
  845. X!`20`20`20so`20we`20first`20check`20if`20there`20is`20a`20space`20saving`20bef
  846. Vore`20encoding.`20If`20not,
  847. X!`20`20`20nothing`20is`20done.`20Because`20of`20the`20hex`20encoding`20scheme,
  848. V`20the`20maximum
  849. X!`20`20`20backwards`20count`20and,`20by`20implication,`20the`20length,`20is
  850. V`20restricted`20to`20MaxHexEnc
  851. X!`20`20`20characters.`20This`20gives`20a`20reasonable`20compression`20ratio
  852. V`20but`20could`20in`20the
  853. X!`20`20`20future`20be`20extended`20to`20provide`20longer`20substrings`20occurr
  854. Ving`20further`20back.
  855. X!
  856. X!`20`20`20Finally,`20the`20checking`20for`20line`20length`20exceeded`20is`20co
  857. Vmplicated`20by`20allowing
  858. X!`20`20`20substrings`20to`20match`20across`20(and`20including)`20end`20of`20li
  859. Vne.
  860. X!
  861. X!`20--------------------------------------------------------------------------
  862. V--
  863. X
  864. XPROCEDURE`20LZEncode(s,l,p,n)
  865. XLOCAL`20EncodedString,b,EraseRange,NewLength;
  866. X`20`20IF`20p`20>`200`09`09`09`09`09!`20Provided`20we`20had`20a`20match
  867. X`20`20`20`20THEN
  868. X`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
  869. X`20`20`20`20`20`20EraseRange`20:=`20CREATE_RANGE(s,MARK(NONE));
  870. X`20`20`20`20`20`20b`20:=`20l-p+1;
  871. X`20`20`20`20`20`20EncodedString`20:=`20FAO("!AS!2XL!2XL",LZW_Flag,b,n);
  872. X
  873. X`20`20`20`20`20`20IF`20LENGTH(EraseRange)`20>`20LENGTH(EncodedString)`09!`20..
  874. V`20`20And`20its`20long`20enough
  875. X`20`20`20`20`20`20`20`20THEN
  876. X`20`20`20`20`20`20
  877. X`20`20`20`20`20`20`20`20!`20If`20the`20combined`20remaining`20length`20of`20th
  878. Ve`20line`20is`20too`20long,`20split`20it
  879. X`20`20`20`20`20`20`20`20`20`20NewLength`20:=`20LENGTH(CURRENT_LINE)`20-`20CURR
  880. VENT_OFFSET;
  881. X`20`20`20`20`20`20`20`20`20`20POSITION(EraseRange);
  882. X`20`20`20`20`20`20`20`20`20`20NewLength`20:=`20NewLength`20+`20CURRENT_OFFSET;
  883. V
  884. X`20`20`20`20`20`20`20`20`20`20IF`20NewLength`20>`20Max_TPU_Line_Length`20THEN
  885. V`20SPLIT_LINE;`20ENDIF;
  886. X
  887. X`20`20`20`20`20`20`20`20!`20Erase`20the`20text`20and,`20if`20necessary,`20re-i
  888. Vnsert`20the`20new`20line`20marker
  889. X`20`20`20`20`20`20`20`20`20`20ERASE(EraseRange);
  890. X`20`20`20`20`20`20`20`20`20`20IF`20CURRENT_OFFSET`20=`200`20THEN`20COPY_TEXT(I
  891. Vnitial_Flag);`20ENDIF;
  892. X
  893. X`09!`20Write`20the`20coded`20string
  894. X`20`20`20`20`20`20`20`20`20`20PutText(EncodedString);
  895. X`20`20`20`20`20`20`20`20ELSE
  896. X`20`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(1);
  897. X`20`20`20`20`20`20ENDIF;
  898. X`20`20ENDIF;
  899. XENDPROCEDURE
  900. X
  901. X
  902. X`0C
  903. X!`20----------------------------------------------------------------
  904. X!`20QUOTE`20BUFFER
  905. X!
  906. X!`20`20`20`20This`20routine`20scans`20the`20current`20buffer`20and`20quotes
  907. V`20all`20non-
  908. X!`20`20`20`20printable`20characters`20listed`20in`20Quote_chars.`20Additionall
  909. Vy,`20long
  910. X!`20`20`20`20lines`20are`20wrapped`20and`20line`20continuation`20markers`20add
  911. Ved.
  912. X!
  913. X!`20`20`20`20This`20is`20used`20if`20NO`20compression`20is`20requested`20by
  914. V`20the`20user
  915. X!
  916. X!`20----------------------------------------------------------------
  917. X
  918. XPROCEDURE`20QuoteBuffer
  919. XLOCAL`20c;
  920. X
  921. X`20`20LOOP
  922. X`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
  923. X`20`20`20`20COPY_TEXT(Initial_Flag);
  924. X
  925. X`20`20`20`20LOOP`20!`20Thru`20current`20line
  926. X`20`20`20`20`20`20c`20:=`20CURRENT_CHARACTER;
  927. X`20`20`20`20`20`20EXITIF`20c`20=`20"";`09`09!`20NULL`20=`20End`20of`20line
  928. X
  929. X`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
  930. X`20`20`20`20`20`20`20`20THEN`20EncodeQuoteable;
  931. X`20`20`20`20`20`20`20`20ELSE`20MOVE_HORIZONTAL(1);`20BreakLongLine;
  932. X`20`20`20`20`20`20ENDIF;
  933. X
  934. X`20`20`20`20ENDLOOP;
  935. X
  936. X`20`20`20`20MOVE_HORIZONTAL(1);`09`09`09`09!`20next`20line
  937. X`20`20ENDLOOP;
  938. XENDPROCEDURE
  939. X
  940. X
  941. X`0C
  942. X!`20----------------------------------------------------------------
  943. X!`20COMPRESS`20BUFFER
  944. X!
  945. X!`20`20`20`20This`20routine`20performs`20a`20similar`20function`20to`20QuoteBu
  946. Vffer,`20quoting
  947. X!`20`20`20`20non-printable`20characters`20and`20wrapping/marking`20long`20line
  948. Vs`20but
  949. X!`20`20`20`20performs`20additional`20compression`20in`20the`20form`20of`20run-
  950. Vlength
  951. X!`20`20`20`20encoding.
  952. X!
  953. X!`20----------------------------------------------------------------
  954. X
  955. XPROCEDURE`20CompressBuffer
  956. XLOCAL`20c,RunSize;
  957. X
  958. X`20`20LOOP
  959. X`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
  960. X`20`20`20`20COPY_TEXT(Initial_Flag);
  961. X
  962. X`20`20`20`20LOOP
  963. X`20`20`20`20`20`20`20`20c`20:=`20CURRENT_CHARACTER;
  964. X`20`20`20`20`20`20`20`20EXITIF`20c`20=`20"";`09`09!`20NULL`20=`20End`20of`20li
  965. Vne
  966. X
  967. X`20`20`20`20`20`20`20`20RunSize`20:=`20LENGTH(SEARCH(ANCHOR+SPAN(c),`20FORWARD
  968. V,`20EXACT));
  969. X`20`20`20`20`20`20`20`20IF`20INDEX(Quote_Chars,c)`20>`200
  970. X`20`20`20`20`20`20`20`20`20`20`20THEN`09`09`09!`20Come`20here`20to`20deal`20wi
  971. Vth`20quotable`20char
  972. X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20RunSize`20<`202
  973. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN`20EncodeQuoteable;
  974. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE`20RLEncode(c,RunSize,2);
  975. X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
  976. X`20`20`20`20`20`20`20`20`20`20`20ELSE`09`09`09!`20Come`20here`20to`20deal`20wi
  977. Vth`20non-quotable`20char
  978. X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20RunSize`20<`206
  979. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN`20MOVE_HORIZONTAL(1);`20Brea
  980. VkLongLine;
  981. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE`20RLEncode(c,RunSize,6);
  982. X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
  983. X`20`20`20`20`20`20`20`20ENDIF;
  984. X
  985. X`20`20`20`20ENDLOOP;
  986. X
  987. X`20`20`20`20MOVE_HORIZONTAL(1);`09`09`09`09!`20next`20line
  988. X`20`20ENDLOOP;
  989. X
  990. XENDPROCEDURE
  991. X
  992. X
  993. X`0C
  994. X!`20----------------------------------------------------------------
  995. X!`20SHRINK`20BUFFER
  996. X!
  997. X!`20`20`20`20Performs`20a`20similar`20function`20to`20QUOTE`20BUFFER`20(I.E.
  998. V`20quoting`20non
  999. X!`20`20`20`20printable`20characters`20and`20wrapping/marking`20long`20lines)
  1000. V`20but`20adds
  1001. X!`20`20`20`20the`20additional`20function`20of`20LZW-style`20substring`20compre
  1002. Vssion
  1003. X!
  1004. X!`20----------------------------------------------------------------
  1005. X
  1006. XPROCEDURE`20ShrinkBuffer
  1007. XLOCAL`20c,cp,Rbegin,InpMem,TestString,MatchPosn,LastMatch;
  1008. X
  1009. X`20`20`20TestString`20:=`20"";
  1010. X`20`20`20InpMem`20`20`20`20`20:=`20"";
  1011. X`20`20`20Rbegin`20`20`20`20`20:=`20MARK(NONE);
  1012. X`20`20`20LastMatch`20`20:=`200;
  1013. X`20`20`20LOOP
  1014. X`20`20`20`20`20`20EXITIF`20MARK(NONE)`20=`20END_OF(CURRENT_BUFFER);
  1015. X`20`20`20`20`20`20COPY_TEXT(Initial_Flag);
  1016. X
  1017. X`20`20`20`20`20`20LOOP
  1018. X`20`20`20`20`20`20`20`20`20c:=CURRENT_CHARACTER;
  1019. X`20`20`20`20`20`20`20`20`20cp:=c;
  1020. X`20`20`20`20`20`20`20`20`20IF`20c=""`20THEN`20cp`20:=`20FakeEOL_Flag;`20ENDIF;
  1021. V
  1022. X
  1023. X`20`20`20`20`20`20`20`20`20IF`20LENGTH(TestString)`20>`201
  1024. X`20`20`20`20`20`20`20`20`20`20`20THEN
  1025. X`20`20`20`20`20`20`20`20`20`20`20`20`20MatchPosn`20:=`20FindString(TestString+
  1026. Vcp,InpMem,LastMatch);
  1027. X`20`20`20`20`20`20`20`20`20`20`20`20`20IF`20(MatchPosn`20=`200)`20OR`20(c=Fake
  1028. VEOL_Flag)
  1029. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20THEN
  1030. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LZEncode(Rbegin,LENGTH(InpM
  1031. Vem),LastMatch,LENGTH(TestString));
  1032. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20InpMem`20`20`20`20`20:=`20R
  1033. VightMost(InpMem+TestString,MaxHexEnc);
  1034. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LastMatch`20`20:=`200;
  1035. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20TestString`20:=`20cp;
  1036. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Rbegin`20`20`20`20`20:=`20Q
  1037. VUEncode;
  1038. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ELSE
  1039. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20LastMatch`20`20:=`20MatchPo
  1040. Vsn;
  1041. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20TestString`20:=`20TestStrin
  1042. Vg`20+`20cp;
  1043. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20QUEncode;
  1044. X`20`20`20`20`20`20`20`20`20`20`20`20`20ENDIF;
  1045. X`20`20`20`20`20`20`20`20`20`20`20ELSE
  1046. X`20`20`20`20`20`20`20`20`20`20`20`20`20TestString:=`20TestString`20+`20cp;
  1047. X`20`20`20`20`20`20`20`20`20`20`20`20`20QUEncode;
  1048. X`20`20`20`20`20`20`20`20`20ENDIF;
  1049. X
  1050. X`20`20`20`20`20`20`20`20`20IF`20c`20=`20FakeEOL_Flag`20THEN`20TestString`20:=
  1051. V`20"";`20InpMem`20:=`20"";`20ENDIF;
  1052. X
  1053. X`20`20`20`20`20`20`20`20`20EXITIF`20c="";
  1054. X`20`20`20`20`20`20`20`20`20MOVE_HORIZONTAL(1);`20BreakLongLine;
  1055. X
  1056. X`20`20`20`20`20`20ENDLOOP;
  1057. X
  1058. X`20`20`20`20`20`20MOVE_HORIZONTAL(1);
  1059. X`20`20`20ENDLOOP;
  1060. X`20`20`20
  1061. X`20`20`20IF`20LENGTH(TestString)`20>`202
  1062. X`20`20`20`20`20THEN
  1063. X`20`20`20`20`20`20`20MOVE_HORIZONTAL(-1);
  1064. X`20`20`20`20`20`20`20LZEncode(Rbegin,LENGTH(InpMem),LastMatch,LENGTH(TestStrin
  1065. Vg)-1);
  1066. X`20`20`20ENDIF;
  1067. XENDPROCEDURE;
  1068. X
  1069. X
  1070. X`0C
  1071. X!`20----------------------------------------------------------------
  1072. X!`20ENCODE`20BUFFER
  1073. X!
  1074. X!`20`20`20This`20routine`20is`20the`20interface`20to`20the`20buffer`20encoding
  1075. V`20methods.
  1076. X!`20`20`20It`20selects`20the`20compression`20technique`20to`20be`20used`20base
  1077. Vd`20on`20the
  1078. X!`20`20`20user`20specified`20`60compression'`20value.`20If`20selected,`20it
  1079. V`20will`20also
  1080. X!`20`20`20issue`20statistics`20after`20compression`20to`20indicate`20the`20eff
  1081. Vectiveness
  1082. X!`20`20`20of`20any`20selected`20compression`20method.
  1083. X!
  1084. X!`20----------------------------------------------------------------
  1085. X
  1086. XPROCEDURE`20Encode_Buffer(XBuffer)
  1087. XLOCAL`20f,l1,l2,b1,b2,c;
  1088. X
  1089. X!`20Collect`20initial`20sizing`20statistics
  1090. X`20`20l1:=GET_INFO(Xbuffer,"RECORD_COUNT");
  1091. X`20`20b1:=SizeBuffer(Xbuffer);
  1092. X
  1093. X!`20Show`20size`20if`20suitable`20log`20level`20enabled
  1094. X`20`20IF`20Logging`20>=`20LOG_ShowStats
  1095. X`20`20`20`20THEN
  1096. X`20`20`20`20`20`20f:="!8%T,`20Records:`20!UL,`20Bytes:`20!UL";
  1097. X`20`20`20`20`20`20Inform("I","ORIGSIZE",FAO(f,0,l1,b1));
  1098. X`20`20ENDIF;
  1099. X
  1100. X!`20Encode`20buffer,`20using`20the`20user's`20requested`20compression
  1101. X!`20Always`20quote`20non-printable`20chars`20and`20wrap`20lines`20regardless
  1102. X`20`20POSITION(`20BEGINNING_OF(XBuffer)`20);
  1103. X`20`20IF`20Compression`20=`20COMPRESS_None`20`20`20`20`20`20THEN`20QuoteBuffer
  1104. V;`20`20`20`20ENDIF;
  1105. X`20`20IF`20Compression`20=`20COMPRESS_Runlength`20THEN`20CompressBuffer;`20END
  1106. VIF;
  1107. X`20`20IF`20Compression`20=`20COMPRESS_LZW`20`20`20`20`20`20`20THEN`20ShrinkBuf
  1108. Vfer;`20`20`20ENDIF;
  1109. +-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
  1110.