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

  1. Path: sparky!uunet!stanford.edu!agate!spool.mu.edu!howland.reston.ans.net!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 02/09
  5. Message-ID: <10312277@MVB.SAIC.COM>
  6. Date: Mon, 25 Jan 1993 21:33:49 GMT
  7. Lines: 1082
  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 46
  13. Archive-name: vms_share/part02
  14. Supersedes: vms_share: Volume 3, Issue 87-89
  15.  
  16. -+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+
  17. Vk
  18. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Max_TPU_Line_Length
  19. X$`20IfDebug`20"-I-DBGPARAM,`20Max_TPU_Line_Length=`20",`20Max_TPU_Line_Length
  20. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Max_Share_Length
  21. X$`20IfDebug`20"-I-DBGPARAM,`20Max_Share_Length`20`20`20=`20",`20Max_Share_Leng
  22. Vth
  23. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Debugging
  24. X$`20IfDebug`20"-I-DBGPARAM,`20Debugging`20`20`20`20`20`20`20`20`20`20=`20",
  25. V`20Debugging
  26. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Logging
  27. X$`20IfDebug`20"-I-DBGPARAM,`20Logging`20`20`20`20`20`20`20`20`20`20`20`20=`20"
  28. V,`20Logging
  29. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Part_Size
  30. X$`20IfDebug`20"-I-DBGPARAM,`20Part_Size`20`20`20`20`20`20`20`20`20`20=`20",
  31. V`20Part_Size
  32. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Compression
  33. X$`20IfDebug`20"-I-DBGPARAM,`20Compression`20`20`20`20`20`20`20`20=`20",`20Comp
  34. Vression
  35. X$`20write/error=CPF_error2`20SHARE_PARAMS`20DirKeep
  36. X$`20IfDebug`20"-I-DBGPARAM,`20DirKeep`20`20`20`20`20`20`20`20`20`20`20`20=`20"
  37. V,`20DirKeep
  38. X$`20write/error=CPF_error2`20SHARE_PARAMS`20VersKeep
  39. X$`20IfDebug`20"-I-DBGPARAM,`20VersKeep`20`20`20`20`20`20`20`20`20`20`20=`20",
  40. V`20VersKeep
  41. X$`20write/error=CPF_error2`20SHARE_PARAMS`20Real_Name
  42. X$`20IfDebug`20"-I-DBGPARAM,`20Real_Name`20`20`20`20`20`20`20`20`20`20=`20",
  43. V`20Real_Name
  44. X$`20write/error=CPF_error2`20SHARE_PARAMS`20ShareFile
  45. X$`20IfDebug`20"-I-DBGPARAM,`20ShareFile`20`20`20`20`20`20`20`20`20`20=`20",
  46. V`20ShareFile
  47. X$
  48. X$`20FileCount`20=`200
  49. X$`20gosub`20Scan_For_Files`09`09`09!`20Scan`20directory`20for`20matching`20fil
  50. Ves
  51. X$`20close`20SHARE_PARAMS
  52. X$`20return
  53. X$
  54. X$
  55. X$CPF_error1:
  56. X$`20em`20"-E-CPFCRE,`20Unable`20to`20create`20parameter`20file"
  57. X$`20goto`20abort
  58. X$CPF_error2:
  59. X$`20em`20"-E-CPFAPP,`20Unable`20to`20append`20parameters`20to`20parameter`20fi
  60. Vle"
  61. X$`20goto`20abort
  62. X$!`0C
  63. X$!`20-------------------------------------------------------------------------
  64. V--
  65. X$!`20SCAN`20FOR`20FILES
  66. X$!
  67. X$!`20`20`20Scan`20the`20file`20system`20for`20the`20files`20specified`20for
  68. V`20the`20user;`20then`20add`20them
  69. X$!`20`20`20if`20required`20into`20the`20parameter`20list`20of`20files`20to`20b
  70. Ve`20packed.
  71. X$!
  72. X$!`20-------------------------------------------------------------------------
  73. V--
  74. X$Scan_For_Files:
  75. X$Next_File_Spec:
  76. X$`20if`20filespec`20.nes.`20""
  77. X$`20`20`20then
  78. X$`20`20`20`20`20pattern`20`20`20`20`20=`20f$element(0,",",filespec)
  79. X$`20`20`20`20`20filespec`20`20`20`20=`20filespec`20-`20pattern`20-`20","
  80. X$`20`20`20`20`20File_Device`20=`20f$parse(pattern,,,"DEVICE")
  81. X$
  82. X$`20`20`20!`20Make`20sure`20the`20syntax`20of`20the`20pattern`20is`20a`20legal
  83. V`20filespec
  84. X$`20`20`20`20`20if`20File_Device`20.eqs.`20""
  85. X$`20`20`20`20`20`20`20then
  86. X$`20`20`20`20`20`20`20`20`20em`20"-E-BADFILE,`20Bad`20file`20specification`20'
  87. V",`20pattern,`20"'"
  88. X$`20`20`20`20`20`20`20`20`20goto`20abort
  89. X$`20`20`20`20`20endif
  90. X$
  91. X$`20`20`20!`20Action`20the`20filespec...
  92. X$`20`20`20`20`20if`20DirKeep`20.and.`20File_Device`20.nes.`20Cur_Device
  93. X$`20`20`20`20`20`20`20then
  94. X$`20`20`20`20`20`20`20`20`20em`20"-E-NOTCURDEV,`20Skipped`20",`20pattern,`20"
  95. V`20:`20does`20not`20refer`20to`20current`20device"
  96. X$`20`20`20`20`20`20`20else
  97. X$`20`20`20`20`20`20`20`20`20fileversion`20=`20f$parse(pattern,,,"VERSION")
  98. X$`20`20`20`20`20`20`20`20`20searchstring=`20f$parse(pattern-fileversion,"`5B
  99. V`5D")-";"`20+`20fileversion
  100. X$`20`20`20`20`20`20`20`20`20Previous_File`20=`20""
  101. X$`20`20`20`20`20`20`20`20`20gosub`20Next_File
  102. X$`20`20`20`20`20endif
  103. X$`20`20`20`20`20goto`20Next_File_Spec
  104. X$`20endif
  105. X$`20return
  106. X$
  107. X$
  108. X$Next_File:
  109. X$`20File`20=`20f$search(searchstring)
  110. X$`20if`20File`20.eqs.`20""
  111. X$`20`20`20then
  112. X$`20`20`20`20`20em`20"-W-NOMATCH,`20No`20files`20matching`20",`20pattern
  113. X$`20`20`20`20`20return
  114. X$`20endif
  115. X$
  116. X$ProcessNextFile:
  117. X$`20gosub`20Check_Out_File
  118. X$`20Previous_File`20=`20File
  119. X$`20File`20=`20f$search(searchstring)
  120. X$`20if`20File`20.nes.`20""`20.and`20File`20.nes.`20Previous_File`20then`20$
  121. V`20goto`20ProcessNextFile
  122. X$`20return
  123. X$!`0C
  124. X$!`20-------------------------------------------------------------------------
  125. V--
  126. X$!`20CHECK`20OUT`20FILE
  127. X$!
  128. X$!`20`20`20Given`20the`20latest`20filename`20that`20matches`20the`20user's`20f
  129. Vilespec,`20examine`20it
  130. X$!`20`20`20to`20see`20if`20it's`20a`20candidate`20for`20selection.`20If`20it
  131. V`20is,`20record`20its`20name,
  132. X$!`20`20`20checksum`20and`20record`20attributes`20in`20the`20parameter`20file.
  133. V
  134. X$!
  135. X$!`20`20`20Files`20are`20rejected`20if`20they
  136. X$!`20`20`20`20`20`20-`20Are`20directories
  137. X$!`09-`20Fall`20outside`20the`20range`20of`20dates`20specified`20by`20/BEFORE
  138. V`20and`20/SINCE
  139. X$!`09-`20Match`20one`20of`20the`20exclusion`20clauses`20(/EXCLUDE`20etc)
  140. X$!`09-`20Are`20not`20in`20the`20directory`20tree`20starting`20at`20the`20curre
  141. Vnt`20directory
  142. X$!`09`20`20(unless`20the`20/NODIRECTORY`20option`20is`20given)
  143. X$!`09-`20Resemble`20a`20sharefile`20part
  144. X$!`09-`20Have`20an`20unsupported`20record`20type`20or`20size
  145. X$!`09-`20If`20they`20are`20not`20confirmed`20by`20the`20user`20(/CONFIRM)
  146. X$!
  147. X$!`20-------------------------------------------------------------------------
  148. V--
  149. X$Check_Out_File:
  150. X$!`20Get`20the`20elements`20of`20the`20filename`20that`20we`20need
  151. X$`20File_Dir`20`20`20`20`20`20=`20f$parse(File,,,"DIRECTORY")
  152. X$`20File_Name`20`20`20`20`20=`20f$parse(File,,,"NAME")
  153. X$`20File_Type`20`20`20`20`20=`20f$parse(File,,,"TYPE")`20
  154. X$`20File_Version`20`20=`20f$parse(File,,,"VERSION")
  155. X$`20File_Filename`20=`20File_Name`20+`20File_Type
  156. X$
  157. X$`20SubFile`20`20`20`20`20`20`20=`20File
  158. X$
  159. X$
  160. X$!`20------------------------------------------------------------------------
  161. X$!`20Ignore`20directories`20always
  162. X$!`20------------------------------------------------------------------------
  163. X$`20if`20File_Type`20.eqs.`20".DIR"`20then`20$`20return
  164. X$
  165. X$
  166. X$!`20------------------------------------------------------------------------
  167. X$!`20Scan`20the`20exclusions`20list`20element`20by`20element`20to`20find`20any
  168. V`20that`20match
  169. X$!`20this`20one.`20An`20`60*'`20Wildcard`20may`20be`20used`20to`20represent
  170. V`20a`20complete`20field`20of
  171. X$!`20the`20file,`20such`20as`20the`20directory,`20filename,`20type,`20or`20ver
  172. Vsion.`20It`20may`20not
  173. X$!`20be`20used`20to`20represent`20a`20partial`20field`20of`20any`20of`20these.
  174. V
  175. X$!`20------------------------------------------------------------------------
  176. X$`20if`20Exclude`20.nes.`20""
  177. X$`20`20`20then
  178. X$`20`20`20`20`20N=0
  179. X$`20`20`20Exclude_Loop:
  180. X$`20`20`20`20`20Epattern`20=`20f$element(N,",",Exclude)
  181. X$`20`20`20`20`20if`20Epattern`20.nes.`20","
  182. X$`20`20`20`20`20`20`20then
  183. X$
  184. X$`20`20`20`20`20`20`20`20`20p`20=`20f$parse(Epattern,"`5B*`5D",,"DIRECTORY")
  185. X$`20`20`20`20`20`20`20`20`20xdir`20`20=`20p`20.eqs.`20"`5B*`5D"`20`20.or.`20p
  186. V`20.eqs.`20File_Dir
  187. X$`20`20`20`20`20`20`20`20`20p`20=`20f$parse(Epattern,"*",,"NAME")
  188. X$`20`20`20`20`20`20`20`20`20xname`20=`20p`20.eqs.`20"*"`20`20`20`20.or.`20p
  189. V`20.eqs.`20File_Name
  190. X$`20`20`20`20`20`20`20`20`20p`20=`20f$parse(Epattern,".*",,"TYPE")
  191. X$`20`20`20`20`20`20`20`20`20xtype`20=`20p`20.eqs.`20".*"`20`20`20.or.`20p`20.e
  192. Vqs.`20File_Type
  193. X$`20`20`20`20`20`20`20`20`20p`20=`20f$parse(Epattern,";*",,"VERSION")
  194. X$`20`20`20`20`20`20`20`20`20xvers`20=`20p`20.eqs.`20";*"`20`20`20.or.`20p`20.e
  195. Vqs.`20File_Version
  196. X$`20`20`20`20`20`20`20`20`20if`20xdir`20.and.`20xname`20.and.`20xtype`20.and.
  197. V`20xvers
  198. X$`20`20`20`20`20`20`20`20`20`20`20then
  199. X$`20`20`20`20`20`20`20`20`20`20`20`20`20if`20Debugging`20.ge.`20Debug_Rejected
  200. V
  201. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20then
  202. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20em`20"-I-REJEXC,`20Skipped
  203. V`20",`20File,`20"`20:`20matches`20/EXCLUDE=",`20Epattern
  204. X$`20`20`20`20`20`20`20`20`20`20`20`20`20endif
  205. X$`20`20`20`20`20`20`20`20`20`20`20`20`20return
  206. X$`20`20`20`20`20`20`20`20`20endif
  207. X$
  208. X$`20`20`20`20`20`20`20`20`20N=N+1
  209. X$`20`20`20`20`20`20`20`20`20goto`20Exclude_Loop
  210. X$`20`20`20`20`20endif
  211. X$`20endif
  212. X$
  213. X$
  214. X$!`20------------------------------------------------------------------------
  215. X$!`20Date`20based`20file`20selection;`20Before/Since`20dates`20already`20in
  216. V`20COMPARISON`20format
  217. X$!`20------------------------------------------------------------------------
  218. X$`20Date`20=`20f$cvtime(f$file(File,Criteria),"COMPARISON")
  219. X$`20if`20Before`20.nes.`20""`20.and.`20Date`20.ges.`20Before
  220. X$`20`20`20then
  221. X$`20`20`20`20`20if`20Debugging`20.ge.`20Debug_Rejected
  222. X$`20`20`20`20`20`20`20then
  223. X$`20`20`20`20`20`20`20`20`20em`20"-I-REJBEF,`20Skipped`20",`20File,`20"`20:
  224. V`20",`20Criteria,`20"`20date`20not`20/BEFORE=",`20Before
  225. X$`20`20`20`20`20endif
  226. X$`20`20`20`20`20return
  227. X$`20endif
  228. X$`20if`20Since`20`20.nes.`20""`20.and.`20Date`20.lts.`20Since`20
  229. X$`20`20then
  230. X$`20`20`20`20`20if`20Debugging`20.ge.`20Debug_Rejected
  231. X$`20`20`20`20`20`20`20then
  232. X$`20`20`20`20`20`20`20`20`20em`20"-I-REJAFT,`20Skipped`20",`20File,`20"`20:
  233. V`20",`20Criteria,`20"`20date`20not`20/AFTER=",`20After
  234. X$`20`20`20`20`20endif
  235. X$`20`20`20`20return
  236. X$`20endif
  237. X$
  238. X$
  239. X$!`20------------------------------------------------------------------------
  240. X$!`20If`20the`20/DIRECTORY`20option`20has`20been`20specified,`20Ensure`20that
  241. V`20the`20file`20exists
  242. X$!`20at`20or`20below`20the`20current`20directory`20tree.`20This`20prevents`20r
  243. Vandom`20top`20level
  244. X$!`20directories`20being`20created`20when`20the`20share`20file`20is`20unpacked
  245. V.`20The
  246. X$!`20subdirectory`20structure`20is`20preserved.
  247. X$!
  248. X$!`20If`20current`20directory`20is`20the`20MFD`20(`5B000000`5D)`20then`20we
  249. V`20should`20allow`20any
  250. X$!`20underlying`20directory`20on`20the`20same`20device,`20otherwise`20we`20jus
  251. Vt`20allow`20a`20sub
  252. X$!`20directory`20of`20the`20current`20one.`20In`20either`20case,`20convert`20i
  253. Vt`20to`20a`20subdirectory
  254. X$!`20format
  255. X$!`20------------------------------------------------------------------------
  256. X$`20if`20DirKeep
  257. X$`20`20`20then
  258. X$
  259. X$`20`20`20`20`20Subfile`20`20=`20SubFile`20-`20File_Device`09!`20Strip`20devic
  260. Ve`20name
  261. X$
  262. X$`20`20`20`20!`20Massage`20directory`20name`20into`20a`20suitable`20subdirecto
  263. Vry`20format
  264. X$`20`20`20`20`20if`20Cur_Directory`20.eqs.`20"`5B000000`5D"
  265. X$`20`20`20`20`20`20`20then
  266. X$`20`20`20`20`20`20`20!`20Convert`20`5B000000.xxx`5D`20and`20`5Bxxx`5D`20into
  267. V`20`5B.xxx`5D
  268. X$`20`20`20`20`20`20`20`20`20if`20f$locate("`5B000000`5D",SubFile)`20.eq.`200
  269. V`20then`20$`20SubFile`20=`20SubFile`20-`20"`5B000000`5D"
  270. X$`20`20`20`20`20`20`20`20`20if`20f$locate("`5B000000.",SubFile)`20.eq.`200`20t
  271. Vhen`20$`20SubFile`20=`20SubFile`20-`20"000000"
  272. X$`20`20`20`20`20`20`20`20`20if`20f$locate("`5B.",SubFile)`20`20`20`20`20`20
  273. V`20.ne.`200`20then`20$`20SubFile`20=`20"`5B."`20+`20(SubFile`20-`20"`5B")
  274. X$`20`20`20`20`20`20`20else
  275. X$`20`20`20`20`20`20`20!`20Strip`20off`20the`20leading`20current`20directory
  276. V`20to`20leave`20a`20subdirectory
  277. X$`20`20`20`20`20`20`20`20`20if`20f$locate(Cur_Directory-"`5D",SubFile)`20.ne.
  278. V`200
  279. X$`20`20`20`20`20`20`20`20`20`20`20then
  280. X$`20`20`20`20`20`20`20`20`20`20`20`20`20em`20"-W-NOTINTREE,`20Skipped`20",`20S
  281. VubFile,`20"`20:`20not`20a`20valid`20subdirectory"
  282. X$`20`20`20`20`20`20`20`20`20`20`20`20`20return
  283. X$`20`20`20`20`20`20`20`20`20endif
  284. X$`20`20`20`20`20`20`20`20`20SubFile`20=`20"`5B"`20+`20(SubFile`20-`20(Cur_Dire
  285. Vctory-"`5D"))
  286. X$`20`20`20`20`20endif
  287. X$`20`20`20`20`20SubFile`20=`20SubFile`20-`20"`5B`5D"`09!`20Don't`20need`20a
  288. V`20null`20directory`20spec
  289. X$`20endif
  290. X$
  291. X$
  292. X$!`20------------------------------------------------------------------------
  293. X$!`20Check`20that`20the`20filename`20does`20not`20resemble`20a`20share`20file
  294. V`20part.`20This`20check
  295. X$!`20is`20probably`20redundant`20now`20as`20the`20files`20to`20be`20packaged
  296. V`20are`20determined
  297. X$!`20before`20any`20share`20file`20parts`20are`20created.`20However,`20leave
  298. V`20it`20here`20for`20the
  299. X$!`20present.
  300. X$!`20------------------------------------------------------------------------
  301. X$`20if`20File_Dir`20.eqs.`20f$parse(ShareFile,,,"DIRECTORY")
  302. X$`20`20`20then
  303. X$`20`20`20`20`20if`20File_Name`20.eqs.`20f$parse(ShareFile,,,"NAME")
  304. X$`20`20`20`20`20`20`20then
  305. X$`20`20`20`20`20`20`20`20`20`20if`20f$locate("-OF-",File_Type)`20.ne.`20f$leng
  306. Vth(File_Type)
  307. X$`20`20`20`20`20`20`20`20`20`20`20`20then
  308. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20x`20=`20File_Type`20-`20"."`20-`20"
  309. V-OF-"
  310. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20f$type(x)`20.eqs.`20"INTEGER"
  311. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20then
  312. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20em`20"-W-SHRFILPART,
  313. V`20Skipped`20",`20Subfile,`20"`20:`20Looks`20like`20sharefile`20part"
  314. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return
  315. X$`20`20`20`20`20`20`20`20`20`20`20`20`20`20endif
  316. X$`20`20`20`20`20`20`20`20`20`20endif
  317. X$`20`20`20`20`20endif
  318. X$`20endif
  319. X$
  320. X$
  321. X$!`20------------------------------------------------------------------------
  322. X$!`20Get`20file's`20record`20attributes
  323. X$!`20------------------------------------------------------------------------
  324. X$`20Gosub`20Get_File_Record_Attributes
  325. X$`20if`20(Attributes`20.eqs.`20"UNKNOWN")
  326. X$`20`20`20then
  327. X$`20`20`20`20`20`20em`20"-W-RFMNOTSUP,`20Skipped`20",`20Subfile,`20"`20:`20Uns
  328. Vupported`20record`20format`20(RFM=''rfmmode',RAT=''ratmode')"
  329. X$`20`20`20`20`20`20return
  330. X$`20endif
  331. X$
  332. X$`20if`20(Recsiz`20.ge.`20Max_TPU_Line_Length)
  333. X$`20`20`20then
  334. X$`20`20`20`20`20`20em`20"-W-RECTOOBIG,`20Skipped`20",`20Subfile,`20"`20:`20Max
  335. V`20Record`20size`20of`20''Recsiz'`20exceeds`20system`20limit`20of`20''Max_TPU_
  336. VLine_Length'"
  337. X$`20`20`20`20`20`20return
  338. X$`20endif
  339. X$
  340. X$
  341. X$
  342. X$!`20------------------------------------------------------------------------
  343. X$!`20Get`20file`20checksum;`20note`20that`20the`20CHECKSUM`20command`20is`20cu
  344. Vrrently`20undocumented
  345. X$!`20------------------------------------------------------------------------
  346. X$`20define/user`20sys$output`20nl:
  347. X$`20define/user`20sys$error`20`20nl:
  348. X$`20checksum`20`26File
  349. X$`20if`20.not.`20$status
  350. X$`20`20`20then
  351. X$`20`20`20`20`20em`20"-W-RECFMTERR,`20",`20Subfile,`20"`20:`20Record`20format
  352. V`20cannot`20be`20processed"
  353. X$`20`20`20`20`20return
  354. X$`20endif
  355. X$
  356. X$
  357. X$!`20------------------------------------------------------------------------
  358. X$!`20If`20the`20user`20has`20requested`20it,`20confirm`20this`20selection`20in
  359. Vteractively
  360. X$!`20------------------------------------------------------------------------
  361. X$`20if`20Confirm
  362. X$`20`20`20then
  363. X$`20`20`20`20`20read`20/end=NotConfirmed`20/prompt="Select`20''Subfile'`20?
  364. V`20(Y/N)`20`5BN`5D`20"`20sys$command`20reply
  365. X$`20`20`20`20`20if`20.not.`20reply`20then`20$`20return
  366. X$`20endif
  367. X$
  368. X$
  369. X$!`20------------------------------------------------------------------------
  370. X$!`20Log`20this`20file`20as`20selected
  371. X$!`20------------------------------------------------------------------------
  372. X$`20if`20logging`20`20`20.ge.`20Log_Selected`20`20`20`20`20then`20$`20em`20"-I
  373. V-SELECT,`20",`20SubFile
  374. X$`20if`20debugging`20.ge.`20DEBUG_ShowParams`20then`20$`20em`20"-I-DBGPARAM,
  375. V`20",`20SubFile,`20",`20Attributes='",`20Attributes,"'"
  376. X$
  377. X$
  378. X$!`20------------------------------------------------------------------------
  379. X$!`20All`20checks`20passed;`20add`20new`20entry`20to`20the`20parameter`20file
  380. X$!`20------------------------------------------------------------------------
  381. X$`20write`20SHARE_PARAMS`20SubFile,`20"`20",`20CheckSum$CheckSum,`20"`20",`20"
  382. V""''Attributes'"""
  383. X$`20FileCount`20=`20FileCount`20+`201
  384. X$NotConfirmed:
  385. X$`20return
  386. X$
  387. X$
  388. X$!`0C
  389. X$!`20-------------------------------------------------------------------------
  390. V--
  391. X$!`20GET`20FILE`20RECORD`20ATTRIBUTES
  392. X$!
  393. X$!`20`20`20The`20file`20record`20attributes`20are`20returned,`20in`20a`20form
  394. V`20that`20can`20be`20passed
  395. X$!`20`20`20directly`20to`20CONVERT/FDL,`20so`20that`20the`20record`20structure
  396. V`20of`20the`20selected
  397. X$!`20`20`20file`20can`20be`20re-instated`20later.
  398. X$!
  399. X$!`20`20`20TPU,`20used`20to`20encode`20files,`20always`20writes`20files`20out
  400. V`20in`20a`20variable`20length
  401. X$!`20`20`20format`20with`20carriage`20return`20controls.`20`20If`20this`20is
  402. V`20the`20format`20of`20the
  403. X$!`20`20`20original`20file`20no`20conversion`20is`20needed`20so`20we`20return
  404. V`20null`20attributes
  405. X$!
  406. X$!`20`20`20A`20return`20type`20of`20"UNKNOWN"`20indicates`20a`20record`20type
  407. V`20that`20we`20do`20not`20support.
  408. X$!
  409. X$!`20`20`20The`20record`20size`20of`20a`20file`20is`20also`20returned`20so`20t
  410. Vhat`20it`20can`20be`20tested
  411. X$!`20`20`20against`20the`20maximum`20record`20size`20supported`20by`20this`20T
  412. VPU.`20We`20can`20therefore
  413. X$!`20`20`20reject`20files`20with`20records`20that`20are`20too`20long`20early
  414. V`20on`20in`20the`20packing
  415. X$!`20`20`20process.
  416. X$!
  417. X$!`20-------------------------------------------------------------------------
  418. V--
  419. X$Get_File_Record_Attributes:
  420. X$`20rfmmode`20=`20f$file_attributes(File,"RFM")`09!`20Get`20file`20information
  421. V
  422. X$`20recsiz`20`20=`20f$file_attributes(File,"MRS")
  423. X$`20ratmode`20=`20f$file_attributes(File,"RAT")
  424. X$`20fsz`20`20`20`20`20=`20f$file_attributes(File,"FSZ")
  425. X$
  426. X$!`20Convert`20the`20record`20format`20to`20an`20FDL`20spec
  427. X$`20Format`20`20=`20""
  428. X$`20if`20rfmmode`20.eqs.`20"STMLF"`20then`20$`20Format`20=`20"FORMAT`20STREAM_
  429. VLF"
  430. X$`20if`20rfmmode`20.eqs.`20"STMCR"`20then`20$`20Format`20=`20"FORMAT`20STREAM_
  431. VCR"
  432. X$`20if`20rfmmode`20.eqs.`20"STM"`20`20`20then`20$`20Format`20=`20"FORMAT`20STR
  433. VEAM"
  434. X$`20if`20rfmmode`20.eqs.`20"FIX"`20`20`20then`20$`20Format`20=`20"FORMAT`20FIX
  435. V;SIZE`20''recsiz'"
  436. X$`20if`20rfmmode`20.eqs.`20"VAR"`20`20`20then`20$`20Format`20=`20"FORMAT`20VAR
  437. VIABLE"
  438. X$`20if`20rfmmode`20.eqs.`20"VFC"`20`20`20then`20$`20Format`20=`20"FORMAT`20VFC
  439. V;CONTROL_FIELD`20''fsz'"
  440. X$
  441. X$!`20Convert`20the`20record`20attributes`20to`20an`20FDL`20spec
  442. X$`20Attributes`20=`20""
  443. X$`20if`20ratmode`20.eqs.`20""`20`20`20`20then`20$`20Attributes`20=`20"CARRIAGE
  444. V_CONTROL`20NONE"
  445. X$`20if`20ratmode`20.eqs.`20"CR"`20`20then`20$`20Attributes`20=`20"CARRIAGE_CON
  446. VTROL`20CARRIAGE_RETURN"
  447. X$`20if`20ratmode`20.eqs.`20"PRN"`20then`20$`20Attributes`20=`20"CARRIAGE_CONTR
  448. VOL`20PRINT"
  449. X$`20if`20ratmode`20.eqs.`20"FTN"`20then`20$`20Attributes`20=`20"CARRIAGE_CONTR
  450. VOL`20FORTRAN"
  451. X$
  452. X$!`20Check`20for`20unsupported`20formats;`20return`20an`20unknown`20FDL`20if
  453. V`20found
  454. X$`20if`20Format`20.eqs.`20""`20.or.`20Attributes`20.eqs.`20""
  455. X$`20`20`20then
  456. X$`20`20`20`20`20Attributes`20=`20"UNKNOWN"
  457. X$`20`20`20`20`20return
  458. X$`20endif
  459. X$
  460. X$!`20Return`20the`20complete`20FDL`20spec;`20special`20case`20the`20standard
  461. V`20format
  462. X$`20if`20rfmmode`20.eqs.`20"VAR"`20.and.`20ratmode`20.eqs.`20"CR"
  463. X$`20`20`20then`20$`20Attributes`20=`20""
  464. X$`20`20`20else`20$`20Attributes`20=`20Format`20+`20";"`20+`20Attributes
  465. X$`20endif
  466. X$`20return
  467. X$
  468. X$`20`20`20`20
  469. X$!`0C
  470. X$!`20-------------------------------------------------------------------------
  471. V--
  472. X$!`20RENAME`20PARTS
  473. X$!
  474. X$!`20`20`20This`20routine`20renames`20the`20parts`20generated`20by`20the`20pac
  475. Vking`20routine`20so`20that
  476. X$!`20`20`20the`20names`20have`20the`20format`20`20`20xxx.nnn-OF-mmm.`20We`20ne
  477. Ved`20to`20know`20in`20advance
  478. X$!`20`20`20how`20many`20parts`20are`20generated.
  479. X$!
  480. X$!`20-------------------------------------------------------------------------
  481. V--
  482. X$Rename_Parts:
  483. X$!`20Get`20the`20number`20of`20parts`20written`20by`20the`20packing`20code
  484. X$`20open/read/error=RP_Error1`20SHARE_PARAMS`20`26TempFile
  485. X$`20read/end=RP_Error2`20SHARE_PARAMS`20NumParts
  486. X$`20close`20SHARE_PARAMS
  487. X$
  488. X$!`20OK,`20make`20sure`20that`20we`20read`20a`20sensible`20number`20of`20parts
  489. V`20(in`20case`20tpu`20failed)
  490. X$`20if`20f$type(NumParts)`20.nes.`20"INTEGER"
  491. X$`20`20`20then
  492. X$`20`20`20`20`20em`20"-F-NUMPTSNOTINT,`20TPU`20has`20returned`20a`20non`20inte
  493. Vger`20part`20count!"
  494. X$`20`20`20`20`20goto`20abort
  495. X$`20endif
  496. X$`20if`20NumParts`20.le.`200
  497. X$`20`20`20then
  498. X$`20`20`20`20`20em`20"-F-NUMPTSNOTPOS,`20TPU`20has`20returned`20a`20negative/z
  499. Vero`20part`20count!"
  500. X$`20`20`20`20`20goto`20abort
  501. X$`20endif
  502. X$
  503. X$`20NumParts`20=`20f$integer(NumParts)
  504. X$`20L=f$length(f$string(NumParts))
  505. X$
  506. X$!`20Rename`20the`20parts
  507. X$`20if`20Logging`20.ge.`20Log_RenameParts
  508. X$`20`20`20then
  509. X$`20`20`20`20`20em`20"-I-RENAME,`20Renaming`20parts`20to`20",`20f$fao(format1,
  510. VShareFile,L,L,NumParts)
  511. X$`20endif
  512. X$
  513. X$`20N`20=`200
  514. X$RP_Loop:
  515. X$`20N`20=`20N+1
  516. X$`20if`20N`20.le.`20NumParts
  517. X$`20`20`20then
  518. X$`20`20`20`20`20NewPart`20=`20f$fao(format2,ShareFile,L,N,L,NumParts)
  519. X$`20`20`20`20`20if`20f$search(ShareFile+"''N'")`20.eqs.`20""
  520. X$`20`20`20`20`20`20`20then`20$`20em`20"-E-MISSPART,`20Unable`20to`20find`20",
  521. V`20ShareFile,`20N
  522. X$`20`20`20`20`20`20`20else`20$`20rename`20'ShareFile''N'`20'NewPart'
  523. X$`20`20`20`20`20endif
  524. X$`20`20`20`20`20goto`20RP_Loop
  525. X$`20endif
  526. X$`20return
  527. X$
  528. X$RP_Error1:
  529. X$`20em`20"-F-RPOPEN,`20Unable`20to`20open`20return`20parameter`20file"
  530. X$`20goto`20abort
  531. X$RP_Error2:
  532. X$`20em`20"-F-RPREAD,`20Unable`20to`20read`20part`20count`20from`20return`20par
  533. Vameter`20file"
  534. X$`20goto`20abort
  535. X$
  536. X$!`0C
  537. X$!`20-------------------------------------------------------------------------
  538. V--
  539. X$!`20CREATE`20PACKAGE`20INDEX
  540. X$!
  541. X$!`20`20`20If`20selected,`20we`20create`20the`20package`20index`20file`20suita
  542. Vble`20for`20using
  543. X$!`20`20`20with`20a`20file`20server`20that`20recognizes`20package`20files.`20T
  544. Vhe`20package`20file
  545. X$!`20`20`20takes`20its`20name`20from`20the`20sharefile,`20with`20a`20suffix
  546. V`20selected`20by`20the
  547. X$!`20`20`20user`20(default`20=`20".$PACKAGE")
  548. X$!
  549. X$!`20-------------------------------------------------------------------------
  550. V--
  551. X$Create_Package_Index:
  552. X$!`20Create`20the`20package`20index
  553. X$`20if`20PackageIdx`20.nes.`20""
  554. X$`20`20`20then
  555. X$`20`20`20`20`20PackIndex`20=`20f$parse(PackageIdx+";",ShareFile)`20-`20";"
  556. X$`20`20`20`20`20if`20Logging`20.ge.`20Log_PackageIndex
  557. X$`20`20`20`20`20`20`20then
  558. X$`20`20`20`20`20`20`20`20`20em`20"-I-CREPKGIDX,`20Creating`20package`20index
  559. V`20",`20PackIndex
  560. X$`20`20`20`20`20endif
  561. X$
  562. X$`20`20`20`20`20open/write/error=CPI_error1`20SHARE_PACKIDX`20`26PackIndex
  563. X$`20`20`20`20`20N=0
  564. X$RP_PKIND_LOOP:
  565. X$`20`20`20`20`20N=N+1
  566. X$`20`20`20`20`20if`20N`20.le.`20NumParts
  567. X$`20`20`20`20`20`20`20then
  568. X$`20`20`20`20`20`20`20`20`20NewPart`20=`20f$fao(format2,ShareFile,L,N,L,NumPar
  569. Vts)
  570. X$`20`20`20`20`20`20`20`20`20write/error=CPI_error2`20SHARE_PACKIDX`20f$parse(N
  571. VewPart,,,"NAME"),f$parse(NewPart,,,"TYPE")
  572. X$`20`20`20`20`20`20`20`20`20goto`20RP_PKIND_LOOP
  573. X$`20`20`20`20`20endif
  574. X$`20`20`20`20`20close`20SHARE_PACKIDX
  575. X$`20endif
  576. X$`20return
  577. X$
  578. X$
  579. X$!`20ERRORS
  580. X$CPI_Error1:
  581. X$`20em`20"-F-RPPACKCRE,`20Unable`20to`20create`20package`20index`20file"
  582. X$`20goto`20abort
  583. X$CPI_Error2:
  584. X$`20em`20"-F-RPPACKWRITE,`20Unable`20to`20write`20part`20name`20to`20package
  585. V`20index`20file"
  586. X$`20goto`20abort
  587. X$
  588. X$
  589. X$!`0C
  590. X$!`20-------------------------------------------------------------------------
  591. V--
  592. X$!`20PACK`20FILES
  593. X$!
  594. X$!`20`20`20This`20routine`20processes`20the`20parameter`20list`20in`20file`20"
  595. VTempFile",`20packs`20the
  596. X$!`20`20`20files`20specified`20and`20produces`20the`20multiple`20parts`20of
  597. V`20the`20share`20file.
  598. X$!
  599. X$!`20-------------------------------------------------------------------------
  600. V--
  601. X$PackFiles:
  602. X$`20edit/tpu/nodisplay/nosection/com=sys$input`20`26TempFile
  603. X!`20--------------------------------------------------------------------------
  604. V-
  605. 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
  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`20
  607. 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+
  608. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20O`20V`20E`20R`20V`20I
  609. V`20E`20W`20`20`20O`20F`20`20`20V`20M`20S`20_`20S`20H`20A`20R`20E`20`20`20`20
  610. V`20`20`20`20`20`20`20`20`20`20`20+
  611. 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
  612. 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
  613. 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+
  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`20`20`20`20`20`20`20To`20package`20a`20series`20of`20files`20into
  618. V`20a`20format`20that`20can`20be`20`20`20`20`20`20`20`20`20`20+
  619. X!`20+`20`20`20`20`20`20`20`20`20successfully`20mailed`20through`20most`20netwo
  620. Vrks`20without`20damage.`20`20`20`20`20`20`20+
  621. 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
  622. 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
  623. 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+
  624. X!`20+`20`20`20`20`20`20`20`20`20Characters`20prone`20to`20translation`20by`20m
  625. Vailers/networks`20are`20`20`20`20`20`20`20`20`20+
  626. X!`20+`20`20`20`20`20`20`20`20`20encoded`20into`20a`20form`20that`20will`20(hop
  627. Vefully)`20not`20be`20altered`20`20`20`20`20`20`20`20+
  628. X!`20+`20`20`20`20`20`20`20`20`20but`20we`20cannot`20recover`20if`20they`20ARE
  629. V`20altered`20despite`20the`20`20`20`20`20`20`20`20`20`20`20+
  630. X!`20+`20`20`20`20`20`20`20`20`20encoding.`20A`20checksum`20is`20included`20so
  631. V`20we`20can`20at`20least`20detect`20`20`20`20`20`20+
  632. X!`20+`20`20`20`20`20`20`20`20`20corruption.`20`20`20`20`20`20`20`20`20`20`20
  633. 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
  634. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  635. 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
  636. 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
  637. 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+
  638. X!`20+`20`20`20`20`20`20`20`20`20Files`20are`20packaged`20into`20a`20single`20s
  639. Velf-unpacking`20share`20file`20`20`20`20`20`20+
  640. X!`20+`20`20`20`20`20`20`20`20`20which`20is`20split`20into`20multiple`20parts,
  641. V`20each`20small`20enough`20to`20be`20`20`20`20`20+
  642. X!`20+`20`20`20`20`20`20`20`20`20mailed`20out`20without`20truncation`20(the`20p
  643. Vart`20size`20is`20configurable)`20`20`20+
  644. 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
  645. 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
  646. 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+
  647. 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
  648. 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
  649. 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+
  650. X!`20+`20`20`20Version`208.2`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20And
  651. Vy`20Harper`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20December`20199
  652. V2`20+
  653. 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
  654. 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
  655. 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+
  656. 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
  657. 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
  658. 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+
  659. 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
  660. 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
  661. 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+
  662. 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`20R
  663. V`20E`20S`20T`20R`20I`20C`20T`20I`20O`20N`20S`20`20`20`20`20`20`20`20`20`20`20
  664. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  665. 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
  666. 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
  667. 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+
  668. X!`20+`20`20`20`20`20`20`20`20`201.`20This`20version`20does`20not`20support`20t
  669. Vhe`20UDF`20(undefined`20record)`20`20`20`20`20+
  670. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20format.`20All`20other`20record`20form
  671. Vats`20are`20supported`20although`20only`20+
  672. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20the`20carriage`20control`20record`20a
  673. Vttribute`20is`20preserved.`20`20`20`20`20`20`20`20`20`20+
  674. 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
  675. 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
  676. 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+
  677. X!`20+`20`20`20`20`20`20`20`20`202.`20Text`20files`20are`20fully`20supported.
  678. V`20Binary`20files`20should`20be`20`20`20`20`20`20`20+
  679. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20supported`20because`20all`20non-print
  680. Ving`20characters`20are`20encoded`20`20`20`20+
  681. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20to`20a`20printable`20escape`20sequenc
  682. Ve.`20However,`20it`20is`20advisable`20to`20`20+
  683. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20stick`20to`20plain`20text`20files`20w
  684. Vhere`20possible.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  685. 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
  686. 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
  687. 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+
  688. X!`20+`20`20`20`20`20`20`20`20`203.`20Because`20the`20files`20are`20intended
  689. V`20to`20be`20mailed,`20the`20encoding`20`20`20`20+
  690. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20relies`20on`20the`20integrity`20of
  691. V`20the`20underlying`20mailer`20and`20network.+
  692. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20If`20files`20are`20corrupted,`20we
  693. V`20are`20unable`20to`20recover.`20`20`20`20`20`20`20`20`20`20`20`20+
  694. 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
  695. 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
  696. 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+
  697. 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
  698. 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
  699. 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+
  700. 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
  701. V`20`20`20`20C`20R`20E`20D`20I`20T`20S`20`20`20`20`20`20`20`20`20`20`20`20`20
  702. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  703. 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
  704. 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
  705. 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+
  706. X!`20+`20`20`20`20`20`20`20`20`20All`20due`20credit`20must`20go`20to`20the`20fo
  707. Vllowing`20people:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  708. 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
  709. 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
  710. 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+
  711. X!`20+`20`20`20`20`20`20`20`20`201.`20`20`20James`20Gray`20for`20the`20first
  712. V`20version`20of`20VMS_SHARE`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  713. X!`20+`20`20`20`20`20`20`20`20`202.`20`20`20Michael`20Bednarek`20for`20the`20or
  714. Viginal`20idea`20and`20prototype`20`20`20`20`20`20`20+
  715. 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
  716. 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
  717. 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+
  718. X!`20+`20`20`20`20`20`20`20`20`20Credits`20are`20also`20due`20to`20the`20variou
  719. Vs`20people`20who`20have`20submitted`20`20`20+
  720. X!`20+`20`20`20`20`20`20`20`20`20ideas`20and`20code`20fragments`20for`20some
  721. V`20of`20the`20features`20of`20VMS_SHARE`20`20+
  722. X!`20+`20`20`20`20`20`20`20`20`20including`20the`20following`20for`20major`20fe
  723. Vatures:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  724. 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
  725. 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
  726. 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+
  727. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20Mark`20Pizzolato,`20for`20run-l
  728. Vength`20encoding`20and`20attributes`20`20`20`20`20+
  729. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20Dick`20Munroe,`20for`20better
  730. V`20part`20name`20conventions`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  731. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20Joe`20Meadows,`20for`20various
  732. V`20useful`20updates`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
  733. V`20+
  734. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20Wolfgang`20Moeller,`20for`20dir
  735. Vectory/version`20stripping`20`20`20`20`20`20`20`20`20`20+
  736. 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
  737. 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
  738. 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+
  739. X!`20+-------------------------------------------------------------------------
  740. V+
  741. X`0C
  742. X!`20+--------------------------------------------------------------------+
  743. X!`20+`20Initialisation`20routine`20to`20set`20up`20global`20constant`20values
  744. V`20`20`20`20`20`20`20`20`20`20`20`20+
  745. X!`20+--------------------------------------------------------------------+
  746. X
  747. XPROCEDURE`20Initialize;
  748. XLOCAL`20Ascii_Code;
  749. X
  750. X`20FAC_unpack`20`20`20`20`20`20`20`20`20`20:=`20"UNPACK";`09!`20Facility`20nam
  751. Ve`20of`20unpack`20code
  752. X
  753. X!`20Various`20Logging`20levels`20-`20activate`20if`20'Logging'`20is`20at`20lea
  754. Vst`20this`20high
  755. X`20LOG_ShowStats`20`20`20`20`20`20`20:=`202;`09!`20Log`20statistics`20of`20buf
  756. Vfer`20compression
  757. X`20LOG_ShowFile`20`20`20`20`20`20`20`20:=`201;`09!`20Log`20filename`20being
  758. V`20processed
  759. X`20LOG_ShowParts`20`20`20`20`20`20`20:=`201;`09!`20Log`20number`20of`20parts
  760. V`20written`20out
  761. X
  762. X!`20Various`20DEBUG`20levels`20-`20activate`20if`20`60Debugging'`20is`20at`20l
  763. Veast`20this`20high
  764. X`20DEBUG_PackTPU`20`20`20`20`20`20`20:=`204;`09!`20Shows`20TPU`20unpacking`20c
  765. Vode`20being`20generated
  766. X`20DEBUG_FindBreak`20`20`20`20`20:=`203;`09!`20Shows`20the`20search`20for`20a
  767. V`20part`20breakpoint
  768. X`20DEBUG_PartSplit`20`20`20`20`20:=`203;`09!`20Shows`20sizes`20of`20buffers
  769. V`20prior`20to`20splitting
  770. X`20DEBUG_AddToPrologue`20:=`202;`09!`20Shows`20files`20added`20to`20share`20fi
  771. Vle`20prologue
  772. X`20DEBUG_SIMess`20`20`20`20`20`20`20`20:=`201;`09!`20Show`20both`20Success`20a
  773. Vnd`20Informational`20messages
  774. X
  775. X!`20Various`20COMPRESS`20techniques
  776. X`20COMPRESS_LZW`20`20`20`20`20`20`20`20:=`202;`09!`20Lempel-Ziv-Welch`20Compre
  777. Vssion
  778. X`20COMPRESS_RunLength`20`20:=`201;`09!`20Run-length`20encoding
  779. X`20COMPRESS_None`20`20`20`20`20`20`20:=`200;`09!`20No`20special`20compression
  780. X
  781. X!`20Define`20separator`20flags`20and`20associated`20variables,`20used`20to`20s
  782. Veparate`20parts
  783. X`20Part_Begin`20`20`20`20`20`20`20`20`20:=`20"-+-+-+-+-+-+-+-+";
  784. X`20Part_End`20`20`20`20`20`20`20`20`20`20`20:=`20"+-+-+-+-+-+-+-+-";
  785. X
  786. X!`20Define`20separator`20lines`20for`20user`20data
  787. X`20FAO_Start_Part`20`20`20`20`20:=`20Part_Begin`20+`20"`20START`20OF`20PART
  788. V`20!UL`20"`20+`20Part_Begin;
  789. X`20FAO_End_Part`20`20`20`20`20`20`20:=`20Part_End`20`20`20+`20"`20`20END`20
  790. V`20OF`20PART`20!UL`20"`20+`20Part_End;
  791. X
  792. X!`20Define`20separator`20lines`20for`20DCL`20portions`20of`20the`20code
  793. X`20FAO_start_label`20`20`20`20:=`20"$PART!UL:";
  794. X`20FAO_end_goto`20`20`20`20`20`20`20:=`20"$`20GOTO`20PART!UL";`09!`20Format
  795. V`20strings`20for`20DCL`20part`20separators
  796. X
  797. X!`20Constants
  798. X`20MaxHexEnc`20`20`20`20`20`20`20`20`20`20:=`20255;`09!`20Max`20number`20encod
  799. Veable`20in`202`20hex`20digits
  800. X`20EOL`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20:=`203;`09!`20Record`20l
  801. Vength`20overhead`20in`20file,`20per`20record
  802. X`20Max_Parts`20`20`20`20`20`20`20`20`20`20:=`20999;
  803. X`20FakeEOL_Flag`20`20`20`20`20`20`20:=`20"`7E";`09!`20Used`20during`20lzw`20se
  804. Varches`20to`20cross`20lines
  805. X`20Initial_Flag`20`20`20`20`20`20`20:=`20"X";
  806. X`20Continuation_Flag`20`20:=`20"V";
  807. X`20TPU_separators`20`20`20`20`20:=`20"`5B`5D(),=;>*";
  808. X
  809. X!`20Flags`20to`20mark`20encoded`20characters
  810. X`20Run_Flag`20`20`20`20`20`20`20`20`20`20`20:=`20"`26";`09!`20Flag`20for`20run
  811. V`20length`20encoding`20"`26nnhh"
  812. X`20Quote_Flag`20`20`20`20`20`20`20`20`20:=`20"`60";`09!`20Flag`20for`20quoted
  813. V`20chars`20`20`20`20`20`20`20`20"`60hh"
  814. X`20LZW_Flag`20`20`20`20`20`20`20`20`20`20`20:=`20"`5C";`09!`20Flag`20of`20LZW
  815. V`20coded`20substrings`20"`5Cbbll"
  816. X
  817. X!`20Set`20up`20the`20ascii`20code`20string`20and`20the`20quotable`20characters
  818. V`20string
  819. X`20Quote_Chars`20`20`20`20`20`20`20`20:=`20"";
  820. X`20Ascii_Code`20`20`20`20`20`20`20`20`20:=`200;
  821. X`20LOOP
  822. X`20`20`20EXITIF`20Ascii_Code`20>`20255;
  823. X`20`20`20`20`20IF`20(Ascii_Code`20<`2032)`20OR`20(Ascii_Code`20>=`20127)`20THE
  824. VN
  825. X`20`20`20`20`20`20`20Quote_Chars`20:=`20Quote_Chars`20+`20ASCII(Ascii_Code)
  826. V`09!`20Ones`20to`20be`20escaped
  827. X`20`20`20`20`20ENDIF;
  828. X`20`20`20`20`20Ascii_Code`20:=`20Ascii_Code`20+`201;
  829. X`20ENDLOOP;
  830. X
  831. X
  832. X!`20Extra`20printable`20characters`20that`20get`20munged;`20treat`20them`20as
  833. V`20non-printing
  834. X`20Quote_Chars`20:=`20Quote_Chars`20+`20"`20`5B`5D`5E`7B`7C`7D`7E"`20+`20Quote
  835. V_Flag`20+`20Run_Flag`20+`20LZW_Flag;
  836. XENDPROCEDURE;
  837. X`0C
  838. X!`20+--------------------------------------------------------------------+
  839. 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
  840. 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
  841. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  842. X!`20+`20`20`20`20`20`20`20`20`20`20G`20E`20N`20E`20R`20A`20L`20`20`20U`20T`20I
  843. V`20L`20I`20T`20Y`20`20`20R`20O`20U`20T`20I`20N`20E`20S`20`20`20`20`20`20`20
  844. V`20`20`20`20+
  845. 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
  846. 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
  847. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  848. X!`20+`20`20`20This`20section`20provides`20a`20number`20of`20miscellaneous`20si
  849. Vmple`20routines`20`20+
  850. X!`20+`20`20`20to`20assist`20in`20the`20general`20packing`20code.`20`20`20`20
  851. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  852. 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
  853. 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
  854. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  855. X!`20+`20`20`20Version`208.2`20`20`20`20`20`20`20`20`20`20`20Andy`20Harper`20
  856. V`20`20`20`20`20`20`20`20`20`20`20`20December`201992`20`20`20`20`20`20+
  857. 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
  858. 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
  859. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  860. 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
  861. 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
  862. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  863. 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
  864. 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
  865. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  866. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20R`20O`20U`20T`20I
  867. V`20N`20E`20`20`20S`20U`20M`20M`20A`20R`20Y`20`20`20`20`20`20`20`20`20`20`20
  868. V`20`20`20`20`20`20`20`20`20`20+
  869. 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
  870. 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
  871. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  872. X!`20+`20`20`20Inform`20`20`20`20`20`20General`20messages`20and`20information
  873. V`20a`20la`20VMS`20format`20`20`20`20`20+
  874. 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
  875. 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
  876. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  877. X!`20+`20`20`20SizeBuffer`20`20Routine`20to`20return`20the`20size,`20in`20bytes
  878. V,`20of`20a`20buffer`20`20`20`20+
  879. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20allowing`20for`20the`20end
  880. V`20of`20line`20mark;`20to`20approximate`20`20`20`20+
  881. X!`20+`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20how`20much`20disk`20space
  882. V`20it`20will`20occupy`20when`20written.`20`20`20`20`20+
  883. 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
  884. 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
  885. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  886. X!`20+`20`20`20MoveInfo`20`20`20`20Routine`20to`20move`20data`20from`20one`20bu
  887. Vffer`20to`20another`20`20`20`20`20`20+
  888. 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
  889. 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
  890. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  891. X!`20+`20`20`20CopyLine`20`20`20`20Like`20COPY_TEXT`20but`20adds`20a`20new`20li
  892. Vne`20after`20it`20`20`20`20`20`20`20`20`20`20+
  893. 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
  894. 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
  895. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  896. X!`20+`20`20`20ReuseBuffer`20Empty`20a`20specified`20buffer`20and`20position
  897. V`20to`20it`20`20`20`20`20`20`20`20`20`20+
  898. 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
  899. 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
  900. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  901. X!`20+`20`20`20StripFile`20`20`20Parse`20the`20file`20name`20and`20remove`20unw
  902. Vanted`20bits`20`20`20`20`20`20`20`20`20+
  903. 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
  904. 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
  905. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  906. X!`20+`20`20`20FindString`20`20Locate`20substring`20within`20a`20string,`20righ
  907. Vtmost`20occurence+
  908. 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
  909. 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
  910. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  911. X!`20+`20`20`20RightMost`20`20`20Return`20rightmost`20`60n'`20characters`20of
  912. V`20a`20string`20`20`20`20`20`20`20`20`20`20+
  913. 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
  914. 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
  915. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  916. X!`20+--------------------------------------------------------------------+
  917. X`0C
  918. X!`20----------------------------------------------------------------------
  919. X!`20Issue`20a`20message`20in`20standard`20VMS`20syntax
  920. X!`20----------------------------------------------------------------------
  921. X
  922. XPROCEDURE`20Inform(Xsev,Xident,Xtext)
  923. X`20`20MESSAGE(`20FAO("%!AS-!AS-!AS,`20!AS",`20Facility,`20Xsev,`20Xident,`20Xt
  924. Vext)`20)
  925. XENDPROCEDURE;
  926. X
  927. X
  928. X
  929. X!`20----------------------------------------------------------------------
  930. X!`20Return`20the`20size,`20in`20bytes,`20of`20a`20buffer`20full`20of`20charact
  931. Vers`20taking`20account
  932. X!`20of`20the`20space`20occupied`20by`20the`20record`20header.`20`20This`20give
  933. Vs`20an`20approximation
  934. X!`20to`20the`20amount`20of`20disk`20space`20the`20buffer`20will`20occupy`20whe
  935. Vn`20it`20is`20written`20out
  936. X!`20to`20disk
  937. X!`20----------------------------------------------------------------------
  938. X
  939. XPROCEDURE`20SizeBuffer(Xbuffer)
  940. XLOCAL`20Size_Chars,`20Size_Lines;
  941. X`20`20`20Size_Chars`20:=`20LENGTH(CREATE_RANGE(BEGINNING_OF(Xbuffer),END_OF(Xb
  942. Vuffer),NONE));
  943. X`20`20`20Size_Lines`20:=`20GET_INFO(Xbuffer,"RECORD_COUNT");
  944. X`20`20`20RETURN(`20Size_Chars`20+`20EOL`20*`20Size_Lines`20);
  945. XENDPROCEDURE;
  946. X
  947. X
  948. X
  949. X!`20----------------------------------------------------------------------
  950. X!`20Move`20a`20buffer`20of`20information`20to`20the`20current`20point`20in`20a
  951. Vnother`20buffer
  952. X!`20----------------------------------------------------------------------
  953. X
  954. XPROCEDURE`20MoveInfo(FromBuf,`20ToBuf)
  955. X`20`20`20POSITION(ToBuf);
  956. X`20`20`20MOVE_TEXT(FromBuf);
  957. XENDPROCEDURE;
  958. X
  959. X
  960. X
  961. X!`20----------------------------------------------------------------------
  962. X!`20This`20routine`20works`20like`20COPY_TEXT`20but`20adds`20a`20new`20line
  963. V`20at`20the`20end.`20Care
  964. X!`20is`20taken`20when`20inserting`20the`20text`20not`20to`20exceed`20the`20max
  965. Vimum`20record
  966. X!`20length,`20by`20creating`20a`20blank`20line`20first`20and`20then`20copying
  967. V`20the`20text
  968. X!`20into`20it.
  969. X!`20----------------------------------------------------------------------
  970. X
  971. XPROCEDURE`20CopyLine(NewText)
  972. X`20`20`20SPLIT_LINE;
  973. X`20`20`20MOVE_HORIZONTAL(-1);
  974. X`20`20`20COPY_TEXT(NewText);
  975. X`20`20`20MOVE_HORIZONTAL(1);
  976. XENDPROCEDURE;
  977. X
  978. X
  979. X
  980. X!`20----------------------------------------------------------------------
  981. X!`20This`20routine`20re-initializes`20a`20particular`20buffer`20for`20use`20by
  982. V`20emptying
  983. X!`20it`20and`20then`20positioning`20to`20it.
  984. X!`20----------------------------------------------------------------------
  985. X
  986. XPROCEDURE`20ReuseBuffer(Xbuffer)
  987. X`20`20`20ERASE(Xbuffer);
  988. X`20`20`20POSITION(Xbuffer);
  989. XENDPROCEDURE;
  990. X
  991. X
  992. X`0C
  993. X!`20----------------------------------------------------------------------
  994. X!`20This`20routine`20implements`20the`20optional`20stripping`20of`20directory
  995. V`20name`20and
  996. X!`20version`20number`20from`20the`20name`20stored`20in`20the`20archive`20file.
  997. V`20NOTE`20that
  998. X!`20specifying`20the`20keyword`20DIRECTORY`20to`20FILE_PARSE`20has`20to`20be
  999. V`20avoided`20as`20this
  1000. X!`20returns`20the`20FULL`20directory`20spec,`20not`20the`20relative`20spec`20t
  1001. Vhat`20we`20want.
  1002. X!`20----------------------------------------------------------------------
  1003. XPROCEDURE`20StripFile(File);
  1004. X
  1005. X`20`20CASE`202*DirKeep+Verskeep`20FROM`200`20TO`203
  1006. X`20`20`20`20`5B0`5D:`20File`20:=`20FILE_PARSE(File,"","",NAME,TYPE);`09`09!
  1007. V`20/NODIR/NOVER
  1008. X`20`20`20`20`5B1`5D:`20File`20:=`20FILE_PARSE(File,"","",NAME,TYPE,VERSION);
  1009. V`09!`20/NODIR/VER
  1010. X`20`20`20`20`5B2`5D:`20File`20:=`20File`20-`20FILE_PARSE(File,"","",VERSION);
  1011. V`09`09!`20/DIR/NOVER
  1012. X`20`20`20`20`5B3`5D:;`09`09`09`09`09`09`09!`20/DIR/VER
  1013. X`20`20`20`20`5BOUTRANGE`5D:`20Inform("F","BADDIRVER",`20FAO("DIR=!UL,VERS=!UL"
  1014. V,DirKeep,VersKeep));`20ABORT;
  1015. X`20`20ENDCASE;
  1016. X
  1017. X`20`20RETURN(File);
  1018. XENDPROCEDURE;
  1019. X`0C
  1020. X!`20--------------------------------------------------------------------------
  1021. V--
  1022. X!`20FINDSTRING
  1023. X!
  1024. X!`20`20`20`20Given`20a`20substring`20and`20a`20string,`20locate`20the`20positi
  1025. Von`20of`20the`20substring
  1026. X!`20`20`20`20within`20the`20string.`20`20This`20is`20like`20the`20built-in`20I
  1027. VNDEX`20except`20that`20the
  1028. X!`20`20`20`20rightmost`20occurrence`20is`20found`20rather`20than`20the`20leftm
  1029. Vost`20occurrence
  1030. X!
  1031. X!`20`20`20`20If`20the`20last`20parameter`20is`20non-zero,`20use`20it`20as`20th
  1032. Ve`20initial`20start`20position
  1033. X!`20`20`20`20to`20avoid`20rescanning`20strings`20we've`20already`20scanned`20o
  1034. Vnce.
  1035. X!
  1036. X!`20--------------------------------------------------------------------------
  1037. V--
  1038. X
  1039. XPROCEDURE`20FindString(substring,origstring,Start);
  1040. XLOCAL`20p,s;
  1041. X
  1042. X`20!`20Find`20starting`20point`20for`20search,`20and`20match`20length
  1043. X`20`20`20`20s`20:=`20LENGTH(substring);
  1044. X`20`20`20`20p`20:=`20LENGTH(origstring)-s+1;
  1045. X`20`20`20`20IF`20(Start`20<>`200)`20AND`20(Start`20<`20p)`20THEN`20p`20:=`20St
  1046. Vart;`20ENDIF;
  1047. X
  1048. X`20!`20Scan`20backwards`20to`20find`20latest`20match;`20return`20position
  1049. X`20`20`20`20LOOP
  1050. X`20`20`20`20`20`20`20EXITIF`20p<1;
  1051. X`20`20`20`20`20`20`20IF`20substring`20=`20SUBSTR(origstring,p,s)`20THEN`20RETU
  1052. VRN(p);`20ENDIF;
  1053. X`20`20`20`20`20`20`20p:=p-1;
  1054. X`20`20`20`20ENDLOOP;
  1055. X
  1056. X`20!`20No`20match
  1057. X`20`20`20`20RETURN(0);
  1058. X
  1059. XENDPROCEDURE;
  1060. X
  1061. X
  1062. X
  1063. X!`20--------------------------------------------------------------------------
  1064. V--
  1065. X!`20RIGHTMOST
  1066. X!
  1067. X!`20`20`20Returns`20the`20RIGHTMOST`20`60n'`20characters`20of`20a`20string.
  1068. X!
  1069. X!`20--------------------------------------------------------------------------
  1070. V--
  1071. X
  1072. XPROCEDURE`20RightMost(OrigString,n)
  1073. XLOCAL`20l;
  1074. X`20`20`20l`20:=`20LENGTH(OrigString);
  1075. X`20`20`20IF`20l`20>`20n
  1076. X`20`20`20`20`20THEN
  1077. X`20`20`20`20`20`20`20`20RETURN(`20SUBSTR(OrigString,l-n+1,n)`20);
  1078. X`20`20`20`20`20ELSE
  1079. X`20`20`20`20`20`20`20`20RETURN(OrigString);
  1080. X`20`20`20ENDIF;
  1081. XENDPROCEDURE
  1082. X
  1083. X
  1084. X`0C
  1085. X!`20+--------------------------------------------------------------------+
  1086. 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
  1087. 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
  1088. V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20+
  1089. X!`20+`20`20`20`20`20`20`20`20`20`20`20P`20A`20R`20T`20`20`20S`20P`20L`20I`20T
  1090. V`20T`20I`20N`20G`20`20`20R`20O`20U`20T`20I`20N`20E`20S`20`20`20`20`20`20`20
  1091. V`20`20`20`20`20+
  1092. +-+-+-+-+-+-+-+-  END  OF PART 2 +-+-+-+-+-+-+-+-
  1093.