From: Malcolm Dunnett [nothome@spammers.are.scum]
Sent: Wednesday, March 05, 2003 11:29 AM
To: Info-VAX@Mvb.Saic.Com
Subject: Re: DCL COPY

In article <J8ldwWhPW3Os@vms.mppmu.mpg.de>, 
     huber@mppmu.mpg.de (Joseph Huber) writes:
> 
> Look into the help for CONV$_Routines  .
> 
> The simpliest sequence for a 1-to-one copy would be:
> 
>       CALL CONV$PASS_FILES(inputfilename , outputfilename)
>       CALL CONV$PASS_OPTIONS
>       CALL CONV$CONVERT
>  

   I believe that convert always does a conversion on the 
file, as opposed to a straight copy. For simple file structures
the two are pretty much the same - though convert may be
slower as it is doing a record-by-record copy rather than
a block copy. For indexed files ( particularly those with
lots of keys ) convert can be a whole lot slower than a
block mode copy would be.

  I'd recommend looking into using callable backup to do
the copy, or write a routine to copy the file using
RMS block IO ( sample below, not guaranteed to meet 
your needs ): 

.TITLE	COPY_FILE
.IDENT  /V2.0/
;
;	COPY AN RMS FILE - USING BLOCK I/O
;
;	MODULE		:	COPY_FILE
;	AUTHOR		:	M.DUNNETT
;	DATE		:	FEB 12/82
;

$FABDEF
$RABDEF

	.PSECT	$LOCAL PIC,USR,CON,REL,LCL,NOSHR,NOEXE,RD,WRT

	;
	;	DEFINE FABS
	;

INPFAB:		$FAB	FAC = <BIO,GET>

OUTFAB:		$FAB	FAC = <BIO,PUT> ,-
			FOP = <SUP,CBT>

	;
	;	DEFINE RABS
	;	

INPRAB:		$RAB	FAB = INPFAB,-
			BKT = 0 ,-
			RAC = SEQ,-
			UBF = BUFFER_SPACE ,-
			USZ = 16384

OUTRAB:		$RAB	FAB = OUTFAB ,-
			RAC = SEQ,-
			BKT = 0 ,-
			RBF = BUFFER_SPACE

	;
	;	DEFINE BUFFER AREA
	;

BUFFER_SPACE:	.BLKB	16384

	.PSECT $CODE,PIC,CON,REL,LCL,SHR,EXE,RD,NOWRT

;
;	STAT = COPY_FILE(INP.FLE$,OUT.FLE$)
;

	.ENTRY COPY_FILE,^M<R2,R3,R4>

	MOVAL	INPFAB,R2
	MOVAL	OUTFAB,R3

	MOVL	4(AP),R4		; GET INPUT FILE NAME
	MOVB	(R4),FAB$B_FNS(R2)
	MOVL	4(R4),FAB$L_FNA(R2)

	MOVL	8(AP),R4		; GET OUTPUT FILE NAME
	MOVB	(R4),FAB$B_FNS(R3)
	MOVL	4(R4),FAB$L_FNA(R3)

	$OPEN	FAB=(R2)	; OPEN INPUT FILE

	BLBS	R0,1$		; GIVE UP IF OPEN FAILS
	RET

1$:	$CONNECT RAB=INPRAB	; CONNECT RECORD ACCESS STREAM

	BLBS	R0,2$
	RET

2$:	;
	;	COPY ALL RELEVANT FAB FIELDS INTO OUTFAB IN PREPARATION
	;	FOR THE $CREATE
	;

	MOVL	FAB$L_ALQ(R2),FAB$L_ALQ(R3)	; ALLOCATION QUANTITY
	MOVB	FAB$B_BKS(R2),FAB$B_BKS(R3)	; BUCKET SIZE
	MOVW	FAB$W_BLS(R2),FAB$W_BLS(R3)	; BLOCK SIZE
	MOVW	FAB$W_DEQ(R2),FAB$W_DEQ(R3)	; DFLT EXTEND QUANTITY
	MOVB	FAB$B_FSZ(R2),FAB$B_FSZ(R3)	; FIXED AREA SIZE
	MOVL	FAB$L_MRN(R2),FAB$L_MRN(R3)	; MAX RECORD NUMBER
	MOVW	FAB$W_MRS(R2),FAB$W_MRS(R3)	; MAX RECORD SIZE
	MOVB	FAB$B_ORG(R2),FAB$B_ORG(R3)	; ORGANIZATION
	MOVB	FAB$B_RAT(R2),FAB$B_RAT(R3)	; RECORD ATTRIBUTES
	MOVB	FAB$B_RFM(R2),FAB$B_RFM(R3)	; RECORD FORMAT


	$CREATE	FAB=(R3)	; CREATE OUTPUT FILE

	BLBS	R0,3$
	RET

3$:	$CONNECT  RAB=OUTRAB	; CONNECT OUTPUT STREAM

	BLBS	R0,4$
	RET

4$:	MOVAL	INPRAB,R2
	MOVAL	OUTRAB,R3

5$:	;
	;	COPY THE FILE NOW
	;

	$READ	RAB=(R2)	; READ A BUNCH OF STUFF
	BLBC	R0,6$

	MOVW	RAB$W_RSZ(R2),RAB$W_RSZ(R3)  ; COPY RECORD SIZE

	$WRITE	RAB=(R3)	; WRITE IT TO OUTPUT FILE

	BLBS	R0,5$
	RET

	
6$:	$CLOSE	FAB=INPFAB
	$CLOSE	FAB=OUTFAB

	RET

	.END