home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / vmsnet / sources / 478 < prev    next >
Encoding:
Internet Message Format  |  1993-01-05  |  24.7 KB

  1. Path: sparky!uunet!zaphod.mps.ohio-state.edu!sdd.hp.com!usc!news.service.uci.edu!network.ucsd.edu!mvb.saic.com!vmsnet-sources
  2. Newsgroups: vmsnet.sources
  3. From: moeller@gwdgv1.gwdg.de
  4. Subject: VMS_UNSHARE.COM (updated for VMS_SHARE 8.1), part 01/01
  5. Message-ID: <9908855@MVB.SAIC.COM>
  6. Reply-To: moeller@gwdgv1.gwdg.de
  7. Organization: GWDG Goettingen, F.R.Germany
  8. Date: Mon, 04 Jan 1993 20:56:09 GMT
  9. Lines: 641
  10. Approved: Mark.Berryman@Mvb.Saic.Com
  11.  
  12. Submitted-by: moeller@gwdgv1.gwdg.de
  13. Posting-number: Volume 4, Issue 32
  14. Archive-name: vms_unshare/part01
  15.  
  16. This is an update of the command procedure previously
  17. posted to INFO-VAX under the name of UNSHAR.COM which
  18. understands files "packed" by VMS_SHARE versions up to 8.1.
  19.  
  20. The purpose of VMS_UNSHARE is to "unpack" VMS_SHARE'd files
  21. without executing *them* (for security reasons).
  22.  
  23. VMS_UNSHARE also makes sure that files get created only
  24. in or below the caller's current default directory.
  25.  
  26. NB. this file is packed by VMS_SHARE 6.10, so it can be unpacked
  27.     by the old version of UNSHAR (if you have it).
  28.  
  29. Wolfgang J. Moeller, GWDG, D-3400 Goettingen, F.R.Germany | Disclaimer ...
  30. PSI%(0262)45050352008::MOELLER      Phone: +49 551 201516 | No claim intended!
  31. Internet: moeller@gwdgv1.dnet.gwdg.de   | This space intentionally left blank.
  32.  
  33. $! ................... Cut between dotted lines and save. ...................
  34. $!...........................................................................
  35. $! VAX/VMS archive file created by VMS_SHARE V06.10 7-FEB-1989.
  36. $!
  37. $! VMS_SHARE was written by James Gray (Gray:OSBUSouth@Xerox.COM) from
  38. $! VMS_SHAR by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au).
  39. $!
  40. $! To unpack, simply save, concatinate all parts into one file and
  41. $! execute (@) that file.
  42. $!
  43. $! This archive was created by user MOELLER
  44. $! on 19-DEC-1992 01:19:59.73.
  45. $!
  46. $! It contains the following 1 file:
  47. $!        VMS_UNSHARE.COM
  48. $!
  49. $!============================================================================
  50. $ SET SYMBOL/SCOPE=( NOLOCAL, NOGLOBAL )
  51. $ VERSION = F$GETSYI( "VERSION" )
  52. $ IF VERSION .GES "V4.4" THEN GOTO VERSION_OK
  53. $ WRITE SYS$OUTPUT "You are running VMS ''VERSION'; ", -
  54.     "VMS_SHARE V06.10 7-FEB-1989 requires VMS V4.4 or higher."
  55. $ EXIT 44 ! SS$_ABORT
  56. $VERSION_OK:
  57. $ GOTO START
  58. $!
  59. $UNPACK_FILE:
  60. $ WRITE SYS$OUTPUT "Creating ''FILE_IS'"
  61. $ DEFINE/USER_MODE SYS$OUTPUT NL:
  62. $ EDIT/TPU/COMMAND=SYS$INPUT/NODISPLAY/OUTPUT='FILE_IS'/NOSECTION -
  63.     VMS_SHARE_DUMMY.DUMMY
  64. b_part := CREATE_BUFFER( "{Part}", GET_INFO( COMMAND_LINE, "file_name" ) )
  65. ; s_file_spec := GET_INFO( COMMAND_LINE, "output_file" ); SET( OUTPUT_FILE
  66. , b_part, s_file_spec ); b_errors := CREATE_BUFFER( "{Errors}" ); i_errors
  67. := 0; pat_beg_1 := ANCHOR & "-+-+-+ Beginning"; pat_beg_2 := LINE_BEGIN
  68. & "+-+-+-+ Beginning"; pat_end := ANCHOR & "+-+-+-+-+ End"; POSITION
  69. ( BEGINNING_OF( b_part ) ); LOOP EXITIF SEARCH( SPAN( ' ' )@r_trail
  70. & LINE_END, FORWARD) = 0; POSITION( r_trail ); ERASE( r_trail ); ENDLOOP
  71. ; POSITION( BEGINNING_OF( b_part ) ); i_append_line := 0; LOOP EXITIF MARK
  72. ( NONE ) = END_OF( b_part ); s_x := ERASE_CHARACTER( 1 )
  73. ; IF s_x = '+' THEN r_skip := SEARCH( pat_beg_1, FORWARD, EXACT ); IF r_skip
  74. <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ERASE_LINE; ENDIF
  75. ; ENDIF; IF s_x = '-' THEN r_skip := SEARCH( pat_end, FORWARD, EXACT )
  76. ; IF r_skip <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); m_skip
  77. := MARK( NONE ); r_skip := SEARCH( pat_beg_2, FORWARD, EXACT ); IF r_skip
  78. <> 0 THEN POSITION( END_OF( r_skip ) ); MOVE_HORIZONTAL( -CURRENT_OFFSET )
  79. ; MOVE_VERTICAL( 1 ); MOVE_HORIZONTAL( -1 ); ELSE POSITION( END_OF( b_part )
  80. ); ENDIF; ERASE( CREATE_RANGE( m_skip, MARK( NONE ), NONE ) ); ENDIF; ENDIF
  81. ; IF s_x = 'V' THEN s_x := ''; IF i_append_line <> 0 THEN APPEND_LINE
  82. ; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF; i_append_line := 1
  83. ; MOVE_VERTICAL( 1 ); ENDIF; IF s_x = 'X' THEN s_x := ''; IF i_append_line
  84. <> 0 THEN APPEND_LINE; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF
  85. ; i_append_line := 0; MOVE_VERTICAL( 1 ); ENDIF; IF s_x <> '' THEN i_errors
  86. := i_errors + 1; s_text := CURRENT_LINE; POSITION( b_errors ); COPY_TEXT
  87. ( "The following line could not be unpacked properly:" ); SPLIT_LINE
  88. ; COPY_TEXT( s_x ); COPY_TEXT( s_text ); POSITION( b_part ); MOVE_VERTICAL
  89. ( 1 ); ENDIF; ENDLOOP; POSITION( BEGINNING_OF( b_part ) ); LOOP r_x := SEARCH
  90. ( "`", FORWARD, EXACT ); EXITIF r_x = 0; POSITION( r_x ); ERASE_CHARACTER( 1
  91. ); COPY_TEXT( ASCII( INT( ERASE_CHARACTER( 3 ) ) ) ); ENDLOOP
  92. ; IF i_errors = 0 THEN SET( NO_WRITE, b_errors, ON ); ELSE POSITION
  93. ( BEGINNING_OF( b_errors ) ); COPY_TEXT( FAO
  94. ( "The following !UL errors were detected while unpacking !AS", i_errors
  95. , s_file_spec ) ); SPLIT_LINE; SET( OUTPUT_FILE, b_errors, "SYS$COMMAND" )
  96. ; ENDIF; EXIT;
  97. $ DELETE VMS_SHARE_DUMMY.DUMMY;*
  98. $ CHECKSUM 'FILE_IS
  99. $ WRITE SYS$OUTPUT " CHECKSUM ", -
  100.   F$ELEMENT( CHECKSUM_IS .EQ. CHECKSUM$CHECKSUM, ",", "failed!!,passed." )
  101. $ RETURN
  102. $!
  103. $START:
  104. $ FILE_IS = "VMS_UNSHARE.COM"
  105. $ CHECKSUM_IS = 1716071061
  106. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  107. X$!*****`009VMS_UNSHARE.COM: unpack VMS_SHARE files without executing them.
  108. X$!`009Apart from a temporary file in SYS$SCRATCH, this procedure will
  109. X$!`009create files only in or below the current default directory.
  110. X$!
  111. X$! p1:  file[s] to UNSHARe, may be comma-separated list,
  112. X$!`009may contain wildcards, provided that a DIRECTORY command
  113. X$!`009with the same p1 lists the files in part order.
  114. X$!
  115. X$! Written by W.J.Moeller 04-dec-1989 (after VMS_SHARE 7.1-004)
  116. X$! mod 06-dec-1989 wjm: add support for older versions
  117. V$! fix 15-dec-1989 wjm: f$edit(,"trim") won't work when argument has 1 '"' in
  118. X it
  119. V$! fix 07-apr-1990 wjm: support 6.3's "`096`096" escape (comes as "`096096" i
  120. Xn 6.10)
  121. X$! mod 07-apr-1990 wjm: add support for 7.2
  122. X$! mod 18-sep-1992 wjm: 1 fix, add support for 8.1
  123. V$! fix 23-nov-1992 wjm: don't try to rename between SYS$SCRATCH and destinati
  124. Xon
  125. X$!
  126. X$!`009... supports VMS_SHARE 8.1
  127. X$!`009`009     VMS_SHARE 7.1-001 thru -004, 7.2-007
  128. X$!`009`009     VMS_SHARE 6.10, 6.3
  129. X$!`009`009     VMS_SHAR 5.4
  130. X$!`009`009and maybe more ...
  131. X$!
  132. X$! Acknowledgements:
  133. X$!`009VMS_SHAR: Copyright (c) 1987, by Michael Bednarek
  134. X$!`009VMS_SHARE 6.x: Copyright `169 1988, by James Gray
  135. X$! `009VMS_SHARE 7.x and up: Written by Andy Harper, Kings College London UK
  136. X$!`009`009`009`009<UDAA055@ELM.CC.KCL.AC.UK>
  137. X$!
  138. X$!*****
  139. X$!
  140. X$ v = 'f$verify(f$trnlnm("UNSHAR_VERIFY"),f$env("verify_image"))'
  141. X$ set = "set"
  142. X$ set symbol/scope=(nolocal,noglobal)
  143. X$!
  144. X$ on warning then goto err_on
  145. X$!
  146. X$ SS$_FORMAT = %x00BC`009`009! %SYSTEM-F-FORMAT, invalid media format
  147. X$ RMS$_NMF = %x182CA
  148. X$!
  149. X$ sum_files = 0
  150. X$ sum_skip = 0
  151. X$ sum_cksum = 0
  152. X$ sum_ckskp = 0
  153. X$!
  154. X$ sharvers = ""`009`009! unknown yet
  155. X$ recfm = ""`009`009! void unless set by 8.x
  156. X$!
  157. X$ f = f$parse("UNSHAR_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  158. X$ e = "write sys$error  ""%UNSHAR"", "
  159. X$ w = "write sys$output ""%UNSHAR"", "
  160. X$ vmsv = f$getsyi("version")
  161. X$ vmsv = f$extract(1,f$length(vmsv)-1,vmsv)`009! ... w/o initial letter
  162. X$ if vmsv.ges."4.4" then $ goto START
  163. X$ e "-F-VMSVERSION, Must run at least VMS 4.4"
  164. X$ return %x10000674`009! F, SS$_SYSVERDIF (signalled)
  165. X$!
  166. X$!
  167. X$!*****`009GOSUBroutine: fetch 'line' from input
  168. X$!
  169. X$getline_init:`009`009`009`009`009!GOSUB entry
  170. X$ define UNSHAR_INPUTS`009'p1'
  171. X$ oldfn = ""
  172. X$ gosub getline_open
  173. X$ return 1
  174. X$!
  175. X$getline_open:`009`009`009`009`009!internal GOSUB
  176. X$ fn = f$search("UNSHAR_INPUTS",1)
  177. X$ if fn.eqs."".or.fn.eqs.oldfn then return RMS$_NMF`009! trigger ON WARNING
  178. X$ oldfn = fn
  179. X$ w "-I-Opening input file ",fn
  180. X$ open/read UNSHAR_INPUT 'fn'
  181. X$ return 1
  182. X$!
  183. X$getline:`009`009`009`009`009!GOSUB entry
  184. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  185. X$ return 1
  186. X$getline_eof:
  187. X$ close UNSHAR_INPUT
  188. X$ gosub getline_open
  189. X$ goto getline
  190. X$!
  191. X$!
  192. X$!*****`009start of UNSHARing
  193. X$!
  194. X$START:
  195. X$ gosub getline_init
  196. X$!
  197. X$!*****`009search for "$START:" label
  198. X$sloop:
  199. X$ gosub getline
  200. X$ if f$edit(f$element(0," ",line),"upcase").nes."$START:" then goto sloop
  201. X$ if f$edit(f$extract(7,f$length(line)-7,line),"trim").nes."" then goto sloop
  202. X$!
  203. X$!*****`009decide upon version by looking at the line(s) after "$START:"
  204. X$!`009`009end of input may also occur
  205. X$nextfile:
  206. X$ gosub getline
  207. X$ if f$edit(line,"trim").eqs."" then gosub getline`009! void line in 6.x
  208. X$!
  209. X$ if f$edit(line,"trim").nes."$!" then goto next_not_8`009! so far 8.1 only
  210. X$   gosub getline
  211. X$   if f$edit(line,"trim").eqs."$ create 'f'" then goto share801`009!8.1
  212. X$   goto expect_end`009`009`009`009`009! ???
  213. X$next_not_8:
  214. X$!
  215. X$ if f$edit(line,"trim").eqs."$ create 'f'" then goto share702`009`009!7.2
  216. X$ if f$edit(line,"trim").eqs."$ create/nolog 'f'" then goto share701`009!7.1
  217. X$ x1 = f$element(0,"""",line)
  218. X$ if x1.eqs."$ FILE_IS = " then goto share6`009`009`009`009!6.x
  219. X$ if x1.eqs."$File_is=" then goto share5`009`009`009`009!5.x
  220. X$ if f$extract(0,10,line).nes."$Goto Part" then goto expect_end`009`009!5.x
  221. X$!
  222. X$!*****`009skip to "$Part<n>:" (VMS_SHAR only)
  223. X$ lab = "$"+f$element(1," ",line)
  224. X$gloop:
  225. X$ gosub getline
  226. X$ if f$element(0,":",line).nes.lab then goto gloop
  227. X$ if f$edit(line-(lab+":"),"trim").nes."" then goto gloop
  228. X$ goto nextfile
  229. X$!
  230. X$!*****`009come back here when file 'f' has been written
  231. X$!`009and 'sharvers','outfn','cksum','recfm' are known
  232. X$unpack:
  233. X$ close UNSHAR_TEMP
  234. X$!
  235. X$ ospec = f$parse(outfn,"[]",,,"syntax_only")
  236. X$!
  237. V$!*****`009make sure that output files will be created in the current directo
  238. Xry
  239. X$!`009`009`009`009`009`009or in a subdirectory thereof
  240. X$!
  241. X$ dummy = f$parse("DUMMY.DUMMY;1","[]",,,"syntax_only")
  242. X$ defdir = dummy - "DUMMY.DUMMY;1"
  243. X$ if defdir.eqs.dummy then return 4`009! must not happen
  244. X$ defdirlen = f$length(defdir)
  245. X$retry_dir:
  246. X$ outdir = ospec-(f$parse(ospec,,,"name","syntax_only")+-
  247. X`009`009f$parse(ospec,,,"type","syntax_only")+-
  248. X`009`009f$parse(ospec,,,"version","syntax_only"))
  249. X$ if outdir.nes.ospec then`009-`009`009! need properly formed dir
  250. X  if outdir.eqs.defdir .or.`009-`009`009`009! same directory
  251. V     (f$extract(0,defdirlen-1,outdir).eqs.f$extract(0,defdirlen-1,defdir).and
  252. X.-
  253. X     f$extract(defdirlen-1,1,outdir).eqs.".") then -`009! subdirectory
  254. X`009goto dir_ok
  255. X$ e "-F-DIRCHANGED, ",f$fao("directory for file !AS changed!/"+-
  256. X`009"to the current directory !AS,!/"+-
  257. X`009"because the SHARE file specifies an improper directory name.",-
  258. X`009outfn,defdir)
  259. X$ ospec = f$parse(defdir,outfn,,,"syntax_only")
  260. X$ goto retry_dir`009`009`009! verify again, just in case ...
  261. X$dir_ok:
  262. X$!
  263. X$ if f$parse(ospec).nes."" then goto no_credir
  264. X$ dn = f$parse(ospec,,,"device")+f$parse(ospec,"[]",,"directory")
  265. X$ w "-I-Creating directory ",dn
  266. X$ create/dir 'dn'
  267. X$ goto no_skip`009`009! can't be duplicate
  268. X$no_credir:
  269. V$ if f$length(f$parse(ospec,,,"version","syntax_only")).lt.2 then goto no_ski
  270. Xp
  271. X$!
  272. X$!*****`009check for duplicate file only if version is given (7.x and up)
  273. X$!
  274. X$ if f$search(ospec) .eqs. "" then goto no_skip
  275. X$ e "-W-SKIPPED, File ''outfn' exists - skipped."
  276. X$ sum_skip = sum_skip + 1
  277. X$ delete/nolog 'f'*
  278. X$ goto nextfile
  279. X$no_skip:
  280. X$!
  281. X$ w "-I-Unpacking file ",outfn
  282. X$ gosub unpack_'sharvers'
  283. X$ delete/nolog 'f'*
  284. X$!
  285. X$ if recfm.eqs."" then goto fdl_skip
  286. X$   copy 'outfn' 'f'`009`009! move the file we just created to a safe place
  287. X$   delete/nolog 'outfn1'
  288. X$   open/write UNSHAR_TEMP 'f'
  289. X$   write UNSHAR_TEMP "RECORD"
  290. X$   write UNSHAR_TEMP recfm
  291. X$   close UNSHAR_TEMP
  292. X$   w "-I-CONVRFM, converting record format to ",recfm
  293. X$   convert/fdl='f' 'f'-1 'outfn'
  294. X$   delete/nolog 'f'*
  295. X$fdl_skip:
  296. X$!
  297. X$ if cksum.eqs."""""" then goto cksum_skip`009`009`009! new with 8.x
  298. X$ CHECKSUM 'ospec'
  299. X$ sum_files = sum_files + 1
  300. X$ IF CHECKSUM$CHECKSUM .eqs. cksum then goto nextfile`009! all o.k.
  301. X$ e "-E-CHKSUMFAIL, Checksum of ''outfn' failed."
  302. X$ sum_cksum = sum_cksum + 1
  303. X$ goto nextfile
  304. X$!
  305. X$cksum_skip:
  306. X$ w "-W-CHKSUMSKIP, checksum validation unavailable for ",outfn
  307. X$ sum_files = sum_files + 1
  308. X$ sum_ckskp = sum_ckskp + 1
  309. X$ goto nextfile
  310. X$!
  311. V$!***************************************************************************
  312. X***
  313. X$getline:`009`009`009`009`009!GOSUB entry
  314. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  315. X$ return 1
  316. X$getline_eof:
  317. X$ close UNSHAR_INPUT
  318. X$ gosub getline_open
  319. X$ goto getline
  320. X$!
  321. V$!*****`009VMS_SHARE 8.1 ****************************************************
  322. X******
  323. X$share801:
  324. X$ if sharvers.eqs."" then sharvers = 801
  325. X$ if sharvers.ne.801 then return SS$_FORMAT
  326. X$ open/write UNSHAR_TEMP 'f'
  327. X$ w "-I-Working on next file ..."
  328. X$cloop8:
  329. X$ gosub getline
  330. X$ if f$extract(0,14,line).eqs."$ call unpack " then goto cloop8end
  331. X$ write UNSHAR_TEMP line
  332. X$ goto cloop8
  333. X$cloop8end:
  334. X$ long_line = f$edit(line,"trim,compress")`009! this line may be continued
  335. X$lloop8:
  336. V$   if f$extract(f$length(long_line)-1,1,long_line).nes."-" then goto lloop8e
  337. Xnd
  338. X$   long_line = f$extract(0,f$length(long_line)-1,long_line)
  339. X$   gosub getline
  340. X$   long_line = f$edit(long_line + line,"trim,compress")
  341. X$   goto lloop8
  342. X$lloop8end:
  343. X$ outfn = f$element(3," ",long_line)
  344. X$ cksum = f$element(4," ",long_line)`009`009`009! maybe ""
  345. X$ recfm = long_line - ("$ call unpack " + outfn + " " + cksum + " ")
  346. X$ if f$extract(0,1,recfm).eqs."""" .and.-
  347. X     f$extract(f$length(recfm)-1,1,recfm).eqs."""" then -
  348. X`009recfm = f$extract(1,f$length(recfm)-2,recfm)`009! unquote quoted string
  349. X$ recfm = f$edit(recfm,"trim")
  350. X$ goto unpack
  351. X$!
  352. X$!*****
  353. X$!
  354. X$unpack_801:`009!GOSUB`009`009`009! from VMS_SHARE 8.1 with /COMPRESS
  355. X$! `009`009`009! NOTE: this will also work for files w/o /COMPRESS,
  356. X$!`009`009`009!`009since Run_Flag='&' is always escaped by 8.1
  357. X$ define/user sys$output nl:
  358. X$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='ospec'
  359. XPROCEDURE GetHex LOCAL x1,x2;x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,
  360. XERASE_CHARACTER(1))-1;RETURN 16*x1+x2;ENDPROCEDURE;
  361. XPROCEDURE SkipPartsep LOOP EXITIF INDEX(ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;
  362. XENDLOOP;ENDPROCEDURE;
  363. XPROCEDURE ExpandChar CASE CURRENT_CHARACTER FROM ' ' TO 'z' ["&"]
  364. V:ERASE_CHARACTER(1);x:=GetHex;COPY_TEXT(ASCII(GetHex)*x);["`096"]:ERASE_CHARA
  365. XCTER(
  366. X1);COPY_TEXT(ASCII(GetHex));[" "]:ERASE_CHARACTER(1);[OUTRANGE,INRANGE]
  367. X:MOVE_HORIZONTAL(1);ENDCASE;ENDPROCEDURE;PROCEDURE ProcessLine s:=
  368. VERASE_CHARACTER(1);LOOP EXITIF CURRENT_OFFSET>=LENGTH(CURRENT_LINE);ExpandCha
  369. Xr;
  370. XENDLOOP;IF s="V" THEN APPEND_LINE;ENDIF;ENDPROCEDURE;
  371. XPROCEDURE AdvanceLine MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);
  372. VENDPROCEDURE;PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE
  373. X)=
  374. XEND_OF(b);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;
  375. XELSE ProcessLine;AdvanceLine;ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,
  376. X"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=
  377. XGET_INFO(COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,
  378. XGET_INFO(COMMAND_LINE,"output_file"));QUIT;
  379. X$ return
  380. X$!
  381. X$!*****
  382. X$!
  383. X$getline:`009`009`009`009`009!GOSUB entry
  384. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  385. X$ return 1
  386. X$getline_eof:
  387. X$ close UNSHAR_INPUT
  388. X$ gosub getline_open
  389. X$ goto getline
  390. X$!
  391. V$!*****`009VMS_SHARE 7.1-001 thru -004, 7.2-007 *****************************
  392. X******
  393. X$share701:
  394. X$ if sharvers.eqs."" then sharvers = 701
  395. X$ if sharvers.ne.701 then return SS$_FORMAT
  396. X$ goto share7
  397. X$share702:
  398. X$ if sharvers.eqs."" then sharvers = 702
  399. X$ if sharvers.ne.702 then return SS$_FORMAT
  400. X$share7:
  401. X$ open/write UNSHAR_TEMP 'f'
  402. X$ w "-I-Working on next file ..."
  403. X$cloop7:
  404. X$ gosub getline
  405. X$ if f$extract(0,14,line).eqs."$ CALL UNPACK " then goto cloop7end
  406. X$ write UNSHAR_TEMP line
  407. X$ goto cloop7
  408. X$cloop7end:
  409. X$ outfn = f$element(3," ",f$edit(line,"compress"))
  410. X$ cksum = f$element(4," ",f$edit(line,"compress"))
  411. X$ goto unpack
  412. X$!
  413. X$!*****
  414. X$!
  415. X$unpack_701:`009!GOSUB`009`009`009`009! from VMS_SHARE 7.1-004
  416. X$ define/user sys$output nl:
  417. X$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='ospec'
  418. XPROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  419. XSUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");
  420. Xbuff:=CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(buff))
  421. X;LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  422. XBEGINNING_OF(buff));g:=0;LOOP EXITIF MARK(NONE)=END_OF(buff);x:=
  423. XERASE_CHARACTER(1);IF g = 0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x=
  424. X"V" THEN APPEND_LINE;MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;
  425. XIF x="+" THEN g:=1;ERASE_LINE;ENDIF;ELSE IF x="-" THEN g:=0;ENDIF;ERASE_LINE;
  426. VENDIF;ENDLOOP;p:="`096";POSITION(BEGINNING_OF(buff));LOOP r:=SEARCH(p,FORWARD
  427. X);
  428. XEXITIF r=0;POSITION(r);ERASE(r);COPY_TEXT(ASCII(INT(ERASE_CHARACTER(3))));
  429. XENDLOOP;o:=GET_INFO(COMMAND_LINE,"output_file");WRITE_FILE(buff,o);
  430. XENDPROCEDURE;Unpacker;EXIT;
  431. X$ return
  432. X$!
  433. X$!*****
  434. X$!
  435. X$getline:`009`009`009`009`009!GOSUB entry
  436. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  437. X$ return 1
  438. X$getline_eof:
  439. X$ close UNSHAR_INPUT
  440. X$ gosub getline_open
  441. X$ goto getline
  442. X$!
  443. X$!*****
  444. X$!
  445. X$unpack_702:`009!GOSUB`009`009`009`009! from VMS_SHARE 7.2-007
  446. X$ define/user sys$output nl:
  447. X$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='ospec'
  448. XPROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  449. XSUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  450. XCREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  451. XLOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  452. XBEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  453. XIF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  454. XMOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  455. XERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  456. X1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  457. VPOSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`096",FORWARD);EXITIF r=0;POSITION(
  458. Xr);
  459. XERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  460. XCOPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  461. X"output_file"));ENDPROCEDURE;Unpacker;QUIT;
  462. X$ return
  463. V$!***************************************************************************
  464. X***
  465. X$!
  466. X$getline:`009`009`009`009`009!GOSUB entry
  467. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  468. X$ return 1
  469. X$getline_eof:
  470. X$ close UNSHAR_INPUT
  471. X$ gosub getline_open
  472. X$ goto getline
  473. X$!
  474. V$!*****`009VMS_SHARE 6.10 ***************************************************
  475. X******
  476. X$share6:
  477. X$ if sharvers.eqs."" then sharvers = 610
  478. X$ if sharvers.ne.610 then return SS$_FORMAT
  479. X$!
  480. X$ line = f$edit(line-x1,"trim")
  481. X$ outfn = f$element(1,"""",line)
  482. X$ if line.nes.""""+outfn+"""" then goto err_unx
  483. X$ gosub getline
  484. X$ if f$element(0,"=",line).nes."$ CHECKSUM_IS " then goto err_unx
  485. X$ cksum = f$edit(line-"$ CHECKSUM_IS = ","trim")
  486. X$ if f$type(cksum).nes."INTEGER" then goto err_unx
  487. X$ gosub getline
  488. X$ if f$edit(line,"trim").nes."$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY" then -
  489. X`009goto err_unx
  490. X$!*****`009do it
  491. X$ open/write UNSHAR_TEMP 'f'
  492. X$ w "-I-Working on ",outfn
  493. X$cloop6:
  494. X$ gosub getline
  495. X$ if f$extract(0,19,line).eqs."$ GOSUB UNPACK_FILE" then goto cloop6end
  496. X$ write UNSHAR_TEMP line
  497. X$ goto cloop6
  498. X$cloop6end:
  499. X$ goto unpack
  500. X$!
  501. X$!*****
  502. X$!
  503. X$unpack_610:`009!GOSUB`009`009`009`009! from VMS_SHARE 6.10
  504. X$ define/user sys$output nl:
  505. X$ EDIT/TPU/NOSECT/NODISP/COMM=SYS$INPUT 'f'/OUTPUT='ospec'
  506. Vb_part := CREATE_BUFFER( "`123Part`125", GET_INFO( COMMAND_LINE, "file_name"
  507. X ) )
  508. X; s_file_spec := GET_INFO( COMMAND_LINE, "output_file" ); SET( OUTPUT_FILE
  509. V, b_part, s_file_spec ); b_errors := CREATE_BUFFER( "`123Errors`125" ); i_err
  510. Xors`032
  511. X:= 0; pat_beg_1 := ANCHOR & "-+-+-+ Beginning"; pat_beg_2 := LINE_BEGIN`032
  512. X& "+-+-+-+ Beginning"; pat_end := ANCHOR & "+-+-+-+-+ End"; POSITION
  513. X( BEGINNING_OF( b_part ) ); LOOP EXITIF SEARCH( SPAN( ' ' )@r_trail`032
  514. X& LINE_END, FORWARD) = 0; POSITION( r_trail ); ERASE( r_trail ); ENDLOOP
  515. X; POSITION( BEGINNING_OF( b_part ) ); i_append_line := 0; LOOP EXITIF MARK
  516. X( NONE ) = END_OF( b_part ); s_x := ERASE_CHARACTER( 1 )
  517. V; IF s_x = '+' THEN r_skip := SEARCH( pat_beg_1, FORWARD, EXACT ); IF r_skip`
  518. X032
  519. X<> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ERASE_LINE; ENDIF
  520. X; ENDIF; IF s_x = '-' THEN r_skip := SEARCH( pat_end, FORWARD, EXACT )
  521. V; IF r_skip <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); m_skip`0
  522. X32
  523. X:= MARK( NONE ); r_skip := SEARCH( pat_beg_2, FORWARD, EXACT ); IF r_skip`032
  524. X<> 0 THEN POSITION( END_OF( r_skip ) ); MOVE_HORIZONTAL( -CURRENT_OFFSET )
  525. V; MOVE_VERTICAL( 1 ); MOVE_HORIZONTAL( -1 ); ELSE POSITION( END_OF( b_part`03
  526. X2
  527. X) ); ENDIF; ERASE( CREATE_RANGE( m_skip, MARK( NONE ), NONE ) ); ENDIF; ENDIF
  528. X; IF s_x = 'V' THEN s_x := ''; IF i_append_line <> 0 THEN APPEND_LINE
  529. X; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF; i_append_line := 1
  530. V; MOVE_VERTICAL( 1 ); ENDIF; IF s_x = 'X' THEN s_x := ''; IF i_append_line`03
  531. X2
  532. X<> 0 THEN APPEND_LINE; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF
  533. V; i_append_line := 0; MOVE_VERTICAL( 1 ); ENDIF; IF s_x <> '' THEN i_errors`0
  534. X32
  535. X:= i_errors + 1; s_text := CURRENT_LINE; POSITION( b_errors ); COPY_TEXT
  536. X( "The following line could not be unpacked properly:" ); SPLIT_LINE
  537. X; COPY_TEXT( s_x ); COPY_TEXT( s_text ); POSITION( b_part ); MOVE_VERTICAL
  538. X( 1 ); ENDIF; ENDLOOP; POSITION( BEGINNING_OF( b_part ) ); LOOP r_x := SEARCH
  539. X( "`096", FORWARD, EXACT ); EXITIF r_x = 0; POSITION( r_x ); ERASE_CHARACTER
  540. X( 1 );`032
  541. VIF CURRENT_CHARACTER = "`096" THEN MOVE_HORIZONTAL( 1 ); ELSE`009! wjm added
  542. X ...
  543. X       COPY_TEXT( ASCII( INT( ERASE_CHARACTER( 3 ) ) ) );`032
  544. XENDIF;`009`009`009`009`009`009`009  ! ... for 6.03 - "`096`096"
  545. X`009`009`009`009`009`009`009  ENDLOOP`009
  546. X; IF i_errors = 0 THEN SET( NO_WRITE, b_errors, ON ); ELSE POSITION
  547. X( BEGINNING_OF( b_errors ) ); COPY_TEXT( FAO
  548. X( "The following !UL errors were detected while unpacking !AS", i_errors
  549. X, s_file_spec ) ); SPLIT_LINE; SET( OUTPUT_FILE, b_errors, "SYS$COMMAND" )
  550. X; ENDIF; EXIT;`032
  551. X$ return
  552. V$!***************************************************************************
  553. X***
  554. X$!
  555. X$getline:`009`009`009`009`009!GOSUB entry
  556. X$ read/end=getline_eof UNSHAR_INPUT line`009!REPEATED for faster access...
  557. X$ return 1
  558. X$getline_eof:
  559. X$ close UNSHAR_INPUT
  560. X$ gosub getline_open
  561. X$ goto getline
  562. X$!
  563. V$!*****`009VMS_SHAR 5.04 ****************************************************
  564. X******
  565. X$share5:
  566. X$ if sharvers.eqs."" then sharvers = 504
  567. X$ if sharvers.ne.504 then return SS$_FORMAT
  568. X$!
  569. X$ line = f$edit(line-x1,"trim")
  570. X$ outfn = f$element(1,"""",line)
  571. X$ if line.nes.""""+outfn+"""" then goto err_unx
  572. X$ gosub getline
  573. X$ if f$element(0,"=",line).nes."$Check_Sum_is" then goto err_unx
  574. X$ cksum = f$edit(line-"$Check_Sum_is=","trim")
  575. X$ if f$type(cksum).nes."INTEGER" then goto err_unx
  576. X$ gosub getline
  577. X$ if f$edit(line,"trim").nes."$Copy SYS$Input VMS_SHAR_DUMMY.DUMMY" then -
  578. X`009goto err_unx
  579. X$!*****`009do it
  580. X$ open/write UNSHAR_TEMP 'f'
  581. X$ w "-I-Working on ",outfn
  582. X$cloop5:
  583. X$ gosub getline
  584. X$ if f$extract(0,19,line).eqs."$GoSub Convert_File" then goto cloop5end
  585. X$ write UNSHAR_TEMP line
  586. X$ goto cloop5
  587. X$cloop5end:
  588. X$ goto unpack
  589. X$!
  590. X$!*****
  591. X$!
  592. X$unpack_504:`009!GOSUB`009`009`009`009! from VMS_SHAR 5.04-wjm
  593. X$ define/user sys$output nl:
  594. X$ EDIT/TPU/NOSECT/NODISP/COMM=SYS$INPUT 'f'/OUTPUT='ospec'
  595. Xf:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
  596. Xo:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o);
  597. XPosition(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V";
  598. XMove_Vertical(1);x:=Erase_Character(1);Append_Line;
  599. XMove_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1);
  600. XExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop
  601. Xx:=Search("`096",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1);
  602. XIf Current_Character='`096' then Move_Horizontal(1);else
  603. XCopy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit;
  604. X$ return
  605. V$!***************************************************************************
  606. X***
  607. X$!
  608. X$!*****`009no more files ...`032
  609. X$expect_end:
  610. X$ if f$edit(line,"trim").eqs."$ v=f$verify(v)" then -`009! 7.1-004
  611. X`009gosub getline
  612. X$ if f$edit(line,"trim,upcase,collapse").nes."$EXIT" then goto err_unx
  613. X$ close UNSHAR_INPUT
  614. X$eoi:
  615. X$ xstat=1
  616. X$ goto done
  617. X$!
  618. X$!***** error handling
  619. X$err_on:
  620. X$ xstat=$status
  621. X$ set noon
  622. X$ if xstat.eq.RMS$_NMF then goto err_eoi
  623. X$ e f$fao("-F-VMS error !AS!/-!AS",f$string(xstat),f$message(xstat)-"%")
  624. X$ xstat=(xstat.and.%xFFFFFFF8).or.%x10000004
  625. X$ goto done
  626. X$err_unx:
  627. X$ e "-E-UNXCMD, unexpected command in file: "+line
  628. X$ xstat=%x10000002
  629. X$ goto done
  630. X$err_eoi:
  631. X$ e "-E-UNXEOF, unexpected end of input file(s)"
  632. X$ xstat=%x10000002
  633. X$!
  634. X$!*****`009final cleanup
  635. X$done:
  636. X$ if f$search(f).eqs."" then goto notemp
  637. X$ close/nolog UNSHAR_TEMP
  638. X$ delete/nolog 'f'*
  639. X$notemp:
  640. X$ close/nolog UNSHAR_INPUT
  641. X$ deassign UNSHAR_INPUTS
  642. X$!
  643. X$ w "-I-Summary: "+-
  644. X    f$fao("!SL file!%S created, !SL checksum error!%S, !SL file!%S skipped",-
  645. X`009  sum_files,sum_cksum,sum_skip)
  646. X$ if sum_ckskp.gt.0 then -
  647. X`009w "-W-Checksum NOT checked on " +-
  648. X`009  f$fao("!SL file!%S - NO GUARANTEES",sum_ckskp)
  649. X$!
  650. X$ exit xstat+f$ver(v,f$env("verify_image"))*0
  651. $ GOSUB UNPACK_FILE
  652. $ EXIT
  653.