home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / compress / 3129 < prev    next >
Encoding:
Internet Message Format  |  1992-08-29  |  15.2 KB

  1. Path: sparky!uunet!mcsun!sunic!dkuug!uts!nbivax.nbi.dk!engelhardt
  2. From: engelhardt@nbivax.nbi.dk
  3. Newsgroups: comp.compression
  4. Subject: Re: Need Info and Advice re VMS DCX Routines
  5. Message-ID: <1992Aug28.180652.989@nbivax.nbi.dk>
  6. Date: 28 Aug 92 16:06:52 GMT
  7. References: <1992Aug26.132902.1@lib.haifa.ac.il>
  8. Organization: Niels Bohr Institute and Nordita, Copenhagen
  9. Lines: 394
  10.  
  11. In article <1992Aug26.132902.1@lib.haifa.ac.il>, jody@lib.haifa.ac.il (Yosef
  12. Branse) writes:
  13.  
  14. > 1) Is it correct to assume that since the DCX routines are part of VMS, they
  15. > will be "better" (however that may be defined - faster, more reliable, etc.)
  16. > than other available compression packages for processing files in our system (a
  17. > VAX 6320 running VMS 5.4-3, soon to upgrade to 5.5)?
  18.  
  19. No. They are slow (on compression) and offer poor compression. The only
  20. advantage of the DCX$ routines is, that they allow decompression of a single
  21. record. If you need this, and don't want to code your own stuff, you might want
  22. to look into DCX.
  23.  
  24. > 2) Does anyone else have experience exploiting these routines? Would you
  25. > recommend them? 
  26.  
  27. I've used them a few times. They can be handy in a few situations, but I would
  28. not generally recommend them. But they still might do what you need.
  29.  
  30. > 3) Are there any publically available packages based on DCX?
  31.  
  32. Yes, LIBRARY comes with your favorite OS. Check
  33. HELP LIBRARY/DATA Qualifier_Value
  34.  
  35. > 4) Assuming that the answer to 1) is yes and 3) is no - would the advantage of
  36. > DCX be sufficient to warrant trying to master it? Or would it be best to just
  37. > use something already available?  
  38.  
  39. Depends on what you are trying to do. If you need fast unpacking of individual
  40. records then DCX$ might be what you want.
  41.  
  42.  
  43. I have included below my sig an example (stolen from the manual) in FORTRAN on
  44. the use of the DCX routines. If you have the FORTRAN compiler you could try
  45. them out. They compress/decompress a file to a file. You could also try
  46. LIBRARY/TEXT/DATA=REDUCE --- with suitable values in the /CREATE qualifier it
  47. should give similar results.
  48.  
  49.     --- Allan.
  50.  
  51. PS: One catch: If the compressed record is longer than about 32k, DCX will not
  52. work. The routines below will ignore these records.
  53. -- 
  54. Internet:     Allan.Engelhardt@nbi.dk        |  Allan Engelhardt
  55. HEPnet:       NBIVAX::ENGELHARDT             |  Niels Bohr Institute
  56. Bitnet/EARN:  ENGELH at CERNVM               |  Blegdamsvej 17
  57. Phone direct: (+45)31424284<dial-tone>355    |  DK-2100 Copenhagen
  58. Fax:          (+45)31421016                  |  DENMARK
  59. $! ------------------ CUT HERE -----------------------
  60. $ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
  61. $!
  62. $! This archive created by VMS_SHARE Version 7.2-011  26-Jun-1992
  63. $!   On 28-AUG-1992 18:00:23.94   By user ENGELHARDT (Allan Engelhardt, NBI/Aleph <Allan.Engelhardt@nbi.dk>)
  64. $!
  65. $! This VMS_SHARE Written by:
  66. $!    Andy Harper, Kings College London UK
  67. $!
  68. $! Acknowledgements to:
  69. $!    James Gray       - Original VMS_SHARE
  70. $!    Michael Bednarek - Original Concept and implementation
  71. $!
  72. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  73. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  74. $!
  75. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  76. $!       1. DCXCOMP.FOR;9
  77. $!       2. DCXEXP.FOR;10
  78. $!
  79. $set="set"
  80. $set symbol/scope=(nolocal,noglobal)
  81. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  82. $e="write sys$error  ""%UNPACK"", "
  83. $w="write sys$output ""%UNPACK"", "
  84. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  85. $ ve=f$getsyi("version")
  86. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START
  87. $ e "-E-OLDVER, Must run at least VMS 4.4"
  88. $ v=f$verify(v)
  89. $ exit 44
  90. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  91. $ x = P1 - f$parse(P1,,,"version")
  92. $ y = f$search(x)
  93. $ if y .eqs. "" then $ goto file_absent
  94. $ x = f$integer(f$parse(P1,,,"version")-";")
  95. $ y = f$integer(f$parse(y,,,"version")-";")
  96. $ if x .gt. y then $ goto file_absent
  97. $ if f$mode() .eqs. "INTERACTIVE" then $ goto file_interactive
  98. $ if x .eq. y then e "-W-EXISTS, File ''P1' exists. Skipped."
  99. $ if x .ne. y then e "-W-NEWERVERSION, of File ''P1' exists. Skipped."
  100. $file_delete:
  101. $ delete 'f'*
  102. $ exit
  103. $file_interactive:
  104. $ if x .eq. y then e "-W-EXISTS, File ''P1' exists."
  105. $ if x .ne. y then e "-W-NEWERVERSION, of File ''P1' exists."
  106. $ read/error=file_delete/end=file_delete-
  107.   /prompt="Create new version [y/n]: " -
  108.   sys$command x
  109. $ if .not. x then $ e "-W-SKIPPED, File ''P1' skipped."
  110. $ if .not. x then $ goto file_delete
  111. $ P1 = P1 - f$parse(P1,,,"version")
  112. $file_absent:
  113. $ if f$parse(P1) .nes. "" then $ goto dirok
  114. $ dn=f$parse(P1,,,"DIRECTORY")
  115. $ w "-I-CREDIR, Creating directory ''dn'."
  116. $ create/dir 'dn'
  117. $ if $status then $ goto dirok
  118. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  119. $ delete 'f'*
  120. $ exit
  121. $dirok:
  122. $ w "-I-PROCESS, Processing file ''P1'."
  123. $ if .not. f$verify() then $ define/user sys$output nl:
  124. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  125. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  126. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  127. CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  128. LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  129. BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  130. IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  131. MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  132. ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  133. 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  134. POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r);
  135. ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  136. COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  137. "output_file"));ENDPROCEDURE;Unpacker;QUIT;
  138. $ delete/nolog 'f'*
  139. $ CHECKSUM 'P1'
  140. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  141. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  142. $ ENDSUBROUTINE
  143. $START:
  144. $ create 'f'
  145. X      PROGRAM DCXCOMP
  146. XC----------------------------------------------------------------------
  147. XC-
  148. XC-   Purpose and Methods : Compress a file using DCX routine.
  149. XC-   This program is taken from the DCX manual.
  150. XC-
  151. XC-   Inputs  :`20
  152. XC-   Outputs :`20
  153. XC-   Controls:`20
  154. XC-
  155. XC-   Created  11-NOV-1990   Allan Engelhardt
  156. XC   Modified :- Allan Engelhardt       2-AUG-1991  `20
  157. XC-
  158. XC----------------------------------------------------------------------
  159. X      IMPLICIT NONE
  160. X      INTEGER STATUS,IOSTAT,IO_OK,STATUS_OK
  161. X      PARAMETER( IO_OK = 0 , STATUS_OK = 1 )
  162. X      INCLUDE '($FORDEF)'
  163. X      EXTERNAL DCX$_AGAIN
  164. X      INTEGER CONTEXT
  165. X      INTEGER MAP,MAP_LEN
  166. X      CHARACTER*256 NORM_NAME, COMP_NAME
  167. X      INTEGER*2 NORM_LEN,COMP_LEN
  168. X      INTEGER NORM_LUN,COMP_LUN
  169. X      LOGICAL EOF
  170. X      CHARACTER*32767 RECORD,RECORD2
  171. X      INTEGER RECORD_LEN,RECORD2_LEN
  172. X      INTEGER GET_MAP,WRITE_MAP
  173. X      INTEGER DCX$ANALYZE_INIT,DCX$ANALYZE_DONE,DCX$COMPRESS_INIT,
  174. X     &   DCX$COMPRESS_DATA,DCX$COMPRESS_DONE,LIB$GET_INPUT,LIB$GET_LUN,
  175. X     &   LIB$FREE_VM
  176. X
  177. X      STATUS = LIB$GET_INPUT(NORM_NAME,'File to compress: ',NORM_LEN)
  178. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  179. X      STATUS = LIB$GET_LUN(NORM_LUN)
  180. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  181. X      OPEN(UNIT=NORM_LUN,FILE=NORM_NAME(1:NORM_LEN),CARRIAGECONTROL=
  182. X     &   'NONE',STATUS='OLD')
  183. X      STATUS = DCX$ANALYZE_INIT(CONTEXT)
  184. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  185. X      STATUS = GET_MAP(NORM_LUN,CONTEXT,MAP,MAP_LEN)
  186. X      DO WHILE ( STATUS.EQ.%LOC(DCX$_AGAIN) )`20
  187. X         REWIND(UNIT=NORM_LUN)
  188. X         STATUS = GET_MAP(NORM_LUN,CONTEXT,MAP,MAP_LEN)
  189. X      ENDDO
  190. X
  191. X      WRITE(*,'(1X,A,1X,I)') 'Length of map is:',MAP_LEN
  192. X`20
  193. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  194. X      STATUS = DCX$ANALYZE_DONE(CONTEXT)
  195. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  196. X      REWIND(UNIT=NORM_LUN)
  197. X      STATUS = LIB$GET_LUN(COMP_LUN)
  198. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  199. X      STATUS = LIB$GET_INPUT(COMP_NAME,'File for compressed records: ',
  200. X     &   COMP_LEN)
  201. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  202. X      OPEN(UNIT=COMP_LUN,FILE=COMP_NAME(1:COMP_LEN),STATUS='NEW',
  203. X     &   FORM='UNFORMATTED')
  204. X      STATUS = DCX$COMPRESS_INIT(CONTEXT,MAP)
  205. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  206. X      CALL WRITE_MAP(COMP_LUN,%VAL(MAP),MAP_LEN)
  207. X      EOF = .FALSE.
  208. X      READ(UNIT=NORM_LUN,FMT='(Q,A)',IOSTAT=IOSTAT) RECORD_LEN,RECORD(1:
  209. X     &   RECORD_LEN)
  210. X      IF ( IOSTAT.NE.IO_OK ) THEN
  211. X         CALL ERRSNS(,,,,STATUS)
  212. X         IF ( STATUS.NE.FOR$_ENDDURREA ) THEN
  213. X            CALL LIB$SIGNAL(%VAL(STATUS))
  214. X         ELSE
  215. X            EOF = .TRUE.
  216. X            STATUS = STATUS_OK
  217. X         ENDIF
  218. X      ENDIF
  219. X      DO WHILE ( .NOT.EOF )`20
  220. X         STATUS = DCX$COMPRESS_DATA(CONTEXT,RECORD(1:RECORD_LEN),
  221. X     &      RECORD2,RECORD2_LEN)
  222. X         IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  223. X         WRITE(UNIT=COMP_LUN) RECORD2(1:RECORD2_LEN)
  224. X         READ(UNIT=NORM_LUN,FMT='(Q,A)',IOSTAT=IOSTAT) RECORD_LEN,
  225. X     &      RECORD(1:RECORD_LEN)
  226. X         IF ( IOSTAT.NE.IO_OK ) THEN
  227. X            CALL ERRSNS(,,,,STATUS)
  228. X            IF ( STATUS.NE.FOR$_ENDDURREA ) THEN
  229. X               CALL LIB$SIGNAL(%VAL(STATUS))
  230. X            ELSE
  231. X               EOF = .TRUE.
  232. X               STATUS = STATUS_OK
  233. X            ENDIF
  234. X         ENDIF
  235. X      ENDDO
  236. X      CLOSE(NORM_LUN)
  237. X      CLOSE(COMP_LUN)
  238. X      STATUS = LIB$FREE_VM(MAP_LEN,MAP)
  239. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  240. X      STATUS = DCX$COMPRESS_DONE(CONTEXT)
  241. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  242. XC----------------------------------------------------------------------
  243. X      END
  244. X
  245. X      INTEGER FUNCTION GET_MAP(LUN,CONTEXT,MAP,MAP_LEN)
  246. XC----------------------------------------------------------------------
  247. XC-
  248. XC-   Created  11-NOV-1990   Allan Engelhardt
  249. XC-
  250. XC----------------------------------------------------------------------
  251. X      IMPLICIT NONE
  252. X      INTEGER LUN,CONTEXT,MAP,MAP_LEN
  253. X      INTEGER STATUS,IOSTAT,IO_OK,STATUS_OK
  254. X      PARAMETER( IO_OK = 0 , STATUS_OK = 1 )
  255. X      INCLUDE '($FORDEF)'
  256. X      LOGICAL EOF
  257. X      CHARACTER*32767 RECORD
  258. X      INTEGER RECORD_LEN
  259. X      INTEGER DCX$ANALYZE_DATA,DCX$MAKE_MAP
  260. X
  261. X      EOF = .FALSE.
  262. X      READ(UNIT=LUN,FMT='(Q,A)',IOSTAT=IOSTAT) RECORD_LEN,RECORD
  263. X      IF ( IOSTAT.NE.IO_OK ) THEN
  264. X         CALL ERRSNS(,,,,STATUS)
  265. X         IF ( STATUS.NE.FOR$_ENDDURREA ) THEN
  266. X            CALL LIB$SIGNAL(%VAL(STATUS))
  267. X         ELSE
  268. X            EOF = .TRUE.
  269. X            STATUS = STATUS_OK
  270. X         ENDIF
  271. X      ENDIF
  272. X      DO WHILE ( .NOT.EOF )`20
  273. X         IF ( RECORD_LEN.LT.32767/2 ) THEN
  274. X            STATUS = DCX$ANALYZE_DATA(CONTEXT,RECORD(1:RECORD_LEN))
  275. X         ELSE
  276. X         ENDIF
  277. X         STATUS = DCX$ANALYZE_DATA(CONTEXT,RECORD(1:RECORD_LEN))
  278. X         IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  279. X         READ(UNIT=LUN,FMT='(Q,A)',IOSTAT=IOSTAT) RECORD_LEN,RECORD
  280. X         IF ( IOSTAT.NE.IO_OK ) THEN
  281. X            CALL ERRSNS(,,,,STATUS)
  282. X            IF ( STATUS.NE.FOR$_ENDDURREA ) THEN
  283. X               CALL LIB$SIGNAL(%VAL(STATUS))
  284. X            ELSE
  285. X               EOF = .TRUE.
  286. X               STATUS = STATUS_OK
  287. X            ENDIF
  288. X         ENDIF
  289. X      ENDDO
  290. X      STATUS = DCX$MAKE_MAP(CONTEXT,MAP,MAP_LEN)
  291. X      GET_MAP = STATUS
  292. XC----------------------------------------------------------------------
  293. X  999 RETURN
  294. X      END
  295. X
  296. X      SUBROUTINE WRITE_MAP(LUN,MAP,MAP_LEN)
  297. XC----------------------------------------------------------------------
  298. XC-
  299. XC-   Created  11-NOV-1990   Allan Engelhardt
  300. XC-
  301. XC----------------------------------------------------------------------
  302. X      IMPLICIT NONE
  303. X      INTEGER LUN,MAP_LEN
  304. X      BYTE    MAP(MAP_LEN)
  305. X      WRITE(UNIT=LUN) MAP_LEN
  306. X      WRITE(UNIT=LUN) MAP
  307. XC----------------------------------------------------------------------
  308. X  999 RETURN
  309. X      END
  310. $ CALL UNPACK DCXCOMP.FOR;9 1078018887
  311. $ create 'f'
  312. X      PROGRAM DCXEXP
  313. XC----------------------------------------------------------------------
  314. XC-
  315. XC-   Purpose and Methods : Expand a compressed file using DCX$ routines.
  316. XC-   From the DCX$ manual.
  317. XC-
  318. XC-   Inputs  :
  319. XC-   Outputs :
  320. XC-   Controls:
  321. XC-
  322. XC-   Created  11-NOV-1990   Allan Engelhardt
  323. XC   Modified :- Allan Engelhardt       2-AUG-1991  `20
  324. XC-
  325. XC----------------------------------------------------------------------
  326. X      IMPLICIT NONE
  327. X      CHARACTER*256 OLD_FILE,NEW_FILE
  328. X      INTEGER*2 OLD_LEN,NEW_LEN
  329. X      INTEGER OLD_LUN,NEW_LUN
  330. X      INTEGER MAP,MAP_LEN
  331. X      EXTERNAL EXPAND_DATA
  332. X      INTEGER LIB$GET_LUN,LIB$GET_INPUT,LIB$GET_VM,LIB$FREE_VM
  333. X      INTEGER STATUS,IOSTAT
  334. X
  335. X      STATUS = LIB$GET_LUN(OLD_LUN)
  336. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  337. X      STATUS = LIB$GET_INPUT(OLD_FILE,'File to expand: ',OLD_LEN)
  338. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  339. X      OPEN(UNIT=OLD_LUN,STATUS='OLD',FILE=OLD_FILE(1:OLD_LEN),FORM=
  340. X     &   'UNFORMATTED')
  341. X      STATUS = LIB$GET_LUN(NEW_LUN)
  342. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  343. X      STATUS = LIB$GET_INPUT(NEW_FILE,'File to hold expanded data: ',
  344. X     &   NEW_LEN)
  345. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  346. X      OPEN(UNIT=NEW_LUN,STATUS='NEW',FILE=NEW_FILE(1:NEW_LEN),RECL=2048,
  347. X     &   CARRIAGECONTROL='NONE',RECORDTYPE='FIXED')
  348. X      READ(UNIT=OLD_LUN) MAP_LEN
  349. X      STATUS = LIB$GET_VM(MAP_LEN,MAP)
  350. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  351. X      CALL EXPAND_DATA(%VAL(MAP),MAP_LEN,OLD_LUN,NEW_LUN)
  352. X      STATUS = LIB$FREE_VM(MAP_LEN,MAP)
  353. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  354. XC----------------------------------------------------------------------
  355. X      END
  356. X
  357. X      SUBROUTINE EXPAND_DATA(MAP,MAP_LEN,OLD_LUN,NEW_LUN)
  358. XC----------------------------------------------------------------------
  359. XC-
  360. XC-   Created  11-NOV-1990   Allan Engelhardt
  361. XC-
  362. XC----------------------------------------------------------------------
  363. X      IMPLICIT NONE
  364. X      INTEGER MAP_LEN,OLD_LUN,NEW_LUN
  365. X      BYTE    MAP(MAP_LEN)
  366. X      INTEGER STATUS,IOSTAT,IO_OK,STATUS_OK
  367. X      PARAMETER( IO_OK = 0 , STATUS_OK = 1 )
  368. X      INCLUDE '($FORDEF)'
  369. X      INTEGER CONTEXT
  370. X      LOGICAL EOF
  371. X      CHARACTER*32767 RECORD,RECORD2
  372. X      INTEGER RECORD_LEN,RECORD2_LEN
  373. X      INTEGER DCX$EXPAND_INIT,DCX$EXPAND_DATA,DCX$EXPAND_DONE
  374. X
  375. X      READ(UNIT=OLD_LUN) MAP
  376. X      STATUS = DCX$EXPAND_INIT(CONTEXT,%LOC(MAP(1)))
  377. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  378. X      EOF = .FALSE.
  379. X      READ(UNIT=OLD_LUN,IOSTAT=IOSTAT) RECORD_LEN
  380. X      IF ( IOSTAT.NE.IO_OK ) THEN
  381. X         CALL ERRSNS(,,,,STATUS)
  382. X         IF ( STATUS.NE.FOR$_ENDDURREA ) THEN
  383. X            CALL LIB$SIGNAL(%VAL(STATUS))
  384. X         ELSE
  385. X            EOF = .TRUE.
  386. X            STATUS = STATUS_OK
  387. X         ENDIF
  388. X      ENDIF
  389. X      DO WHILE ( .NOT.EOF )
  390. X         READ(UNIT=OLD_LUN,FMT='(Q,A)') RECORD_LEN,RECORD
  391. X         STATUS = DCX$EXPAND_DATA(CONTEXT,RECORD(1:RECORD_LEN),RECORD2,
  392. X     &      RECORD2_LEN)
  393. X         IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  394. X         WRITE(UNIT=NEW_LUN,FMT='(A)') RECORD2(1:RECORD2_LEN)
  395. X      ENDDO
  396. X      STATUS = DCX$EXPAND_DONE(CONTEXT)
  397. X      IF ( .NOT.STATUS ) CALL LIB$SIGNAL(%VAL(STATUS))
  398. X
  399. XC----------------------------------------------------------------------
  400. X  999 RETURN
  401. X      END
  402. $ CALL UNPACK DCXEXP.FOR;10 122726531
  403. $ v=f$verify(v)
  404. $ EXIT
  405.