From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:38:51.61 To: EVERHART CC: Subj: FEBRUARY94.XCOPY Message-Id: <9404091921.AA24042@uu7.psi.com> X-Fileserver: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:22:32 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: FEBRUARY94.XCOPY To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : XCOPY $! By : @WKUVX1.BITNET $! Date : 8-APR-1994 05:34:34.06 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. XCOPY.C;1 $! 2. XCOPY.CLD;1 $! 3. XCOPY.HLP;1 $! 4. XCOPY.OPT;1 $! 5. XCOPY.PAS;1 $! 6. XCOPYBLD.COM;1 $! 7. XCOPYMSG.MSG;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X/* X`20*`20XCOPY.C`20-`20copy`20files`20block`20by`20block. X`20*`20Copyright`20(C)`20Nick`20Brown`201989-1993.`20All`20rights`20reserved. V X`20*/ X X#include`20stdio X#include`20fab X#include`20rab X#include`20xab X#include`20nam X#include`20rmsdef X#include`20devdef X#include`20climsgdef X#include`20ssdef X#include`20descrip X X/* X`20*`20The`20next`20declaration`20allows`20us`20to`20access`20external`20VMS V`20symbols. X`20*/ Xtypedef`20int`20EXTERNAL`20(); X X/* X`20*`20Possible`20responses`20to`20confirmation`20prompt. X`20*/ X#define`20OK_NO`200 X#define`20OK_YES`201 X#define`20OK_ALL`202 X#define`20OK_QUIT`203 X X/* X`20*`20Names`20of`20the`20DCL`20symbols`20we`20set`20on`20failure. X`20*/ X$DESCRIPTOR(block_symbol_des,`20"XCOPY_FAILED_BLOCK"); X$DESCRIPTOR(file_symbol_des,`20"XCOPY_FAILED_FILE"); X#define`20SYMBOL_TABLE`201 X X/* X`20*`20The`20number`20of`20blocks`20we`20copy`20in`20each`20RMS`20read/write V`20operation. X`20*/ X#define`20RMS_IOSIZE_MIN`201 X#define`20RMS_IOSIZE_DEFAULT`204 X#define`20RMS_IOSIZE_MAX`20127 X X#define`20DISK_BLOCKSIZE`20512 X X#define`20MAX_BUFFER`2065535 X X/* X`20*`20The`20number`20of`20trace`20messages,`20if`20no`20value`20is`20given`20 Von`20/TRACE. X`20*/ X#define`20NTRACES`2010 X X/* X`20*`20Filespec`20used`20as`20default`20when`20parsing`20output`20filename. X`20*/ X#define`20HERE`20"SYS$DISK:`5B`5D*.*" X X/* X`20*`20Variables`20that`20match`20CLI`20parameters,`20and`20so`20have`20to`20b Ve`20global. X`20*`20These`20are`20recognisable`20by`20their`20capitalised`20first`20letter. V X`20*/ Xstatic`20int`20Log; Xstatic`20int`20Trace; Xstatic`20int`20Confirm; Xstatic`20int`20Interval; Xstatic`20int`20Interval_seen; Xstatic`20int`20First_block; Xstatic`20int`20New_file; Xstatic`20int`20Last_block; Xstatic`20int`20Last_block_seen; Xstatic`20int`20Rms_iosize; X X/* X`20*`20Function`20to`20handle`20unexpected`20events`20(that`20indicate`20inter Vnal`20errors). X`20*/ Xstatic Xvoid Xpanic`20(char`20*s) X`7B X`20`20EXTERNAL`20xcopy_panic; X`20`20lib$stop(xcopy_panic,`202,`20strlen(s),`20s); X`7D X X/* X`20*`20Function`20to`20get`20user`20confirmation`20of`20copy. X`20*/ Xstatic Xint Xok_to_copy`20(int`20input_len,`20char`20*input_name, X`20`20`20`20`20`20`20`20`20`20`20`20int`20output_len,`20char`20*output_name, V`20int`20first_block) X`7B X`20`20char`20message`20`5B255`5D; X`20`20$DESCRIPTOR(message_des,`20message); X`20`20char`20reply`20`5B255`5D; X`20`20$DESCRIPTOR(reply_des,`20reply); X`20`20$DESCRIPTOR(text_create,`20"Copy`20!AD`20to`20!AD`20(Y,N,A,Q):`20"); X`20`20$DESCRIPTOR(text_resume, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20"Resume`20copy`20of`20!AD`20to`20 V!AD`20at`20block`20!UL`20(Y,N,A,Q):`20"); X`20`20char`20*prmlst`20`5B5`5D; X`20`20char`20*control; X`20`20int`20result; X`20`20short`20outlen; X`20`20short`20replen; X X`20`20prmlst`5B0`5D`20=`20input_len; X`20`20prmlst`5B1`5D`20=`20input_name; X`20`20prmlst`5B2`5D`20=`20output_len; X`20`20prmlst`5B3`5D`20=`20output_name; X`20`20prmlst`5B4`5D`20=`20first_block; X X`20`20if`20(New_file)`20`7B X`20`20`20`20control`20=`20`26text_create; X`20`20`7D X`20`20else`20`7B X`20`20`20`20control`20=`20`26text_resume; X`20`20`7D X X`20`20result`20=`20sys$faol(control,`20`26outlen,`20`26message_des,`20prmlst); V X`20`20if`20((result`20`26`201)`20!=`201)`20`7B X`20`20`20`20lib$stop(result); X`20`20`7D X X`20`20message_des.dsc$w_length`20=`20outlen; X X`20`20while`20(1)`20`7B X`20`20`20`20char`20*cp; X`20`20`20`20int`20error`20=`200; X X`20`20`20`20result`20=`20lib$get_command(`26reply_des,`20`26message_des,`20`26 Vreplen); X`20`20`20`20if`20((result`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20lib$stop(result); X`20`20`20`20`7D X X`20`20`20`20reply`5Breplen`5D`20=`20'`5C0'; X`20`20`20`20for`20(cp`20=`20reply;`20(*cp)`20`26`26`20(!error);`20cp++)`20`7B V X`20`20`20`20`20`20switch`20(*cp)`20`7B X`20`20`20`20`20`20`20`20case`20'A': X`20`20`20`20`20`20`20`20case`20'a': X`20`20`20`20`20`20`20`20`20`20return`20OK_ALL; X`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20'Q': X`20`20`20`20`20`20`20`20case`20'q': X`20`20`20`20`20`20`20`20`20`20return`20OK_QUIT; X`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20'N': X`20`20`20`20`20`20`20`20case`20'n': X`20`20`20`20`20`20`20`20`20`20return`20OK_NO; X`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20'Y': X`20`20`20`20`20`20`20`20case`20'y': X`20`20`20`20`20`20`20`20`20`20return`20OK_YES; X`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20'`20': X`20`20`20`20`20`20`20`20case`20'`5Ct': X`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20default: X`20`20`20`20`20`20`20`20`20`20error`20=`201; X`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X`7D X X/* X`20*`20Function`20to`20create`20DCL`20symbol`20with`20given`20numeric`20value. V X`20*/ Xstatic Xvoid Xcreate_symbol`20(struct`20dsc$descriptor_s`20*symbol_des,`20int`20value) X`7B X`20`20$DESCRIPTOR(value_des,`20"0000000000"); X X`20`20sprintf(value_des.dsc$a_pointer,`20"%d",`20value); X`20`20value_des.dsc$w_length`20=`20strlen(value_des.dsc$a_pointer); X`20`20lib$set_symbol(symbol_des,`20`26value_des,`20`26SYMBOL_TABLE); X`7D X X/* X`20*`20Routine`20to`20copy`20a`20field`20of`20a`20file`20specification,`20for V`20build_filename(). X`20*`20This`20could`20also`20be`20done`20with`20a`20#define. X`20*/ Xstatic Xvoid Xcopy_dn_field`20(unsigned`20char`20*offset,`20char`20*target, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20unsigned`20char`20size,`20char`20 V*field) X`7B X`20`20memcpy(`26target`5B*offset`5D,`20field,`20size); X`20`20*offset`20+=`20size; X`7D X X/* X`20*`20Function`20to`20build`20a`20filename`20string`20from`20resultant`20stri Vng`20components. X`20*`20This`20is`20useful`20after`20the`20RS`20(and`20associated`20element`20f Vields)`20has`20been X`20*`20`20constructed`20by`20an`20RMS`20routine.`20We`20can`20then`20manipulat Ve`20element`20fields X`20*`20`20(eg`20by`20setting`20them`20to`20zero`20length)`20and`20call`20this V`20routine`20to`20build`20an X`20*`20`20appropriate`20default`20field. X`20*/ Xstatic Xvoid Xbuild_filename`20(unsigned`20char`20*offset,`20char`20*target,`20struct`20NAM V`20*nam) X`7B X`20`20*offset`20=`200; X X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_node,`20nam->nam$l_node); X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_dev,`20nam->nam$l_dev); X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_dir,`20nam->nam$l_dir); X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_name,`20nam->nam$l_name); X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_type,`20nam->nam$l_type); X`20`20copy_dn_field(offset,`20target,`20nam->nam$b_ver,`20nam->nam$l_ver); X`7D X X/* X`20*`20Function`20to`20copy`20one`20file.`20Return`201`20if`20the`20user`20qui Vts`20the`20program. X`20*`20On`20input,`20filenum`20is`20the`20number`20within`20the`20input`20wild Vcard. X`20*/ Xstatic Xint Xcopy_one_file`20(int`20filenum,`20struct`20FAB`20*input_fabptr, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20struct`20FAB`20*output_fabptr,`20 Vint`20output_dir_wild) X`7B X`20`20int`20start_block; X`20`20int`20end_block; X`20`20int`20blocks_per_io; X`20`20int`20blocksize; X`20`20int`20file_allocation; X X`20`20static`20struct`20RAB`20input_rab; X`20`20static`20struct`20RAB`20output_rab; X X`20`20char`20file_buffer`20`5BMAX_BUFFER`5D; X X`20`20struct`20RAB`20*input_rabptr`20=`20`26input_rab; X`20`20struct`20NAM`20*input_namptr`20=`20input_fabptr->fab$l_nam; X`20`20struct`20XABFHC`20*input_xabfhcptr`20=`20input_fabptr->fab$l_xab; X`20`20struct`20RAB`20*output_rabptr`20=`20`26output_rab; X`20`20struct`20NAM`20*output_namptr`20=`20output_fabptr->fab$l_nam; X`20`20struct`20XABFHC`20*output_xabfhcptr`20=`20output_fabptr->fab$l_xab; X X`20`20input_rabptr->rab$b_bid`20=`20RAB$C_BID; X`20`20input_rabptr->rab$b_bln`20=`20RAB$C_BLN; X`20`20input_rabptr->rab$l_fab`20=`20input_fabptr; X`20`20input_rabptr->rab$l_bkt`20=`20First_block; X`20`20input_rabptr->rab$l_ubf`20=`20file_buffer; X`20`20input_rabptr->rab$l_xab`20=`200; X`20`20input_rabptr->rab$l_rop`20=`200; X X`20`20output_rabptr->rab$b_bid`20=`20RAB$C_BID; X`20`20output_rabptr->rab$b_bln`20=`20RAB$C_BLN; X`20`20output_rabptr->rab$l_fab`20=`20output_fabptr; X`20`20output_rabptr->rab$l_rbf`20=`20file_buffer; X`20`20output_rabptr->rab$l_xab`20=`200; X`20`20output_rabptr->rab$l_rop`20=`200; X X/* X`20*`20If`20the`20input`20or`20output`20file`20name`20contains`20a`20node`20na Vme,`20remove`20the X`20*`20`20node`20name,`20device,`20directory,`20and`20version`20number`20from V`20the`20resultant`20input X`20*`20`20file`20name`20before`20applying`20it`20as`20a`20default. X`20*`20Otherwise,`20use`20the`20resultant`20input`20file`20specification. X`20*`20Exception:`20if`20we`20had`20a`20wildcard`20in`20our`20DCL`20output`20f Vile`20directory`20spec, X`20*`20`20use`20the`20input`20directory`20as`20a`20default. X`20*/ X`20`20if`20(`20`20`20`20(input_namptr->nam$l_fnb`20`26`20NAM$M_NODE) X`20`20`20`20`20`20`20`7C`7C`20(output_namptr->nam$l_fnb`20`26`20NAM$M_NODE) X`20`20`20`20`20)`20`7B X`20`20`20`20input_namptr->nam$b_node`20=`200; X`20`20`20`20input_namptr->nam$b_dev`20=`200; X`20`20`20`20if`20(!output_dir_wild)`20`7B X`20`20`20`20`20`20input_namptr->nam$b_dir`20=`200; X`20`20`20`20`7D X`20`20`20`20input_namptr->nam$b_ver`20=`200; X`20`20`7D X X`20`20build_filename(`26output_fabptr->fab$b_dns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_dna V,`20input_namptr); X X/* X`20*`20Find`20the`20definitive`20target`20filename. X`20*/ X`20`20output_namptr->nam$b_nop`20=`200; X X`20`20sys$parse(output_fabptr,`200,`200); X`20`20if`20((output_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_parseout; X`20`20`20`20lib$stop(xcopy_parseout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_esl,`20output_namp Vtr->nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_sts); X`20`20`7D X X/* X`20*`20If`20necessary,`20get`20user`20confirmation`20of`20copy. X`20*/ X`20`20if`20(Confirm)`20`7B X`20`20`20`20int`20ok`20=`20ok_to_copy( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_rsl,`20input_ Vnamptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_esl,`20outpu Vt_namptr->nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20First_block); X X`20`20`20`20if`20(ok`20==`20OK_NO)`20`7B X`20`20`20`20`20`20return`200; X`20`20`20`20`7D X`20`20`20`20else`20if`20(ok`20==`20OK_ALL)`20`7B X`20`20`20`20`20`20Confirm`20=`200; X`20`20`20`20`7D X`20`20`20`20else`20if`20(ok`20==`20OK_QUIT)`20`7B X`20`20`20`20`20`20return`201; X`20`20`20`20`7D X`20`20`7D X X`20`20sys$open(input_fabptr,`200,`200); X`20`20if`20((input_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_openin; X`20`20`20`20lib$stop(xcopy_openin,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_esl,`20input_namptr V->nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_sts); X`20`20`7D X X`20`20blocks_per_io`20=`20Rms_iosize; X`20`20blocksize`20=`20DISK_BLOCKSIZE; X X`20`20input_rabptr->rab$w_usz`20=`20blocksize`20*`20blocks_per_io; X X`20`20sys$connect(input_rabptr,`200,`200); X`20`20if`20((input_rabptr->rab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_miscerr; X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_rabptr->rab$l_stv, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_rabptr->rab$l_sts); X`20`20`7D X X/* X`20*`20Actual`20last`20block`20of`20input`20file`20is`20now`20in`20the`20XAB. V X`20*/ X`20`20file_allocation`20=`20input_xabfhcptr->xab$l_ebk; X`20`20if`20(!Last_block_seen)`20`7B X`20`20`20`20Last_block`20=`20file_allocation; X`20`20`7D X X/* X`20*`20If`20we`20have`20not`20explicitly`20specified`20a`20trace`20interval, V`20use`2010%`20of`20the`20file. X`20*/ X`20`20if`20((Trace)`20`26`26`20(!Interval_seen))`20`7B X`20`20`20`20Interval`20=`20(file_allocation`20+`20NTRACES`20-`201)`20/`20NTRAC VES; X`20`20`7D X X/* X`20*`20Interval`20(explicit`20or`20implicit)`20must`20be`20multiple`20of`20RMS V`20transfer`20size. X`20*/ X`20`20if`20((Interval`20%`20blocks_per_io)`20!=`200)`20`7B X`20`20`20`20Interval`20=`20((Interval`20/`20blocks_per_io)`20+`201)`20*`20bloc Vks_per_io; X`20`20`7D X X/* X`20*`20Open`20a`20new`20output`20file,`20or`20append`20to`20an`20old`20one. X`20*/ X`20`20if`20(New_file)`20`7B X`20`20`20`20output_fabptr->fab$l_alq`20=`20file_allocation; X`20`20`20`20output_fabptr->fab$b_bks`20=`20input_fabptr->fab$b_bks; X`20`20`20`20output_fabptr->fab$w_deq`20=`20input_fabptr->fab$w_deq; X`20`20`20`20output_fabptr->fab$l_fop`20=`20input_fabptr->fab$l_fop`20`7C`20FAB V$M_TEF`20`7C`20FAB$M_CBT; X`20`20`20`20output_fabptr->fab$b_fsz`20=`20input_fabptr->fab$b_fsz; X`20`20`20`20output_fabptr->fab$w_gbc`20=`20input_fabptr->fab$w_gbc; X`20`20`20`20output_fabptr->fab$l_mrn`20=`20input_fabptr->fab$l_mrn; X`20`20`20`20output_fabptr->fab$w_mrs`20=`20input_fabptr->fab$w_mrs; X`20`20`20`20output_fabptr->fab$b_org`20=`20input_fabptr->fab$b_org; X`20`20`20`20output_fabptr->fab$b_rat`20=`20input_fabptr->fab$b_rat; X`20`20`20`20output_fabptr->fab$b_rfm`20=`20input_fabptr->fab$b_rfm; X X`20`20`20`20output_xabfhcptr->xab$w_lrl`20=`20input_xabfhcptr->xab$w_lrl; X X`20`20`20`20sys$create(output_fabptr,`200,`200); X`20`20`20`20output_rabptr->rab$l_bkt`20=`200; X`20`20`7D X`20`20else`20`7B X`20`20`20`20sys$open(output_fabptr,`200,`200); X`20`20`20`20output_rabptr->rab$l_bkt`20=`20First_block; X`20`20`7D X X`20`20if`20((output_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_openout; X`20`20`20`20lib$stop(xcopy_openout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_esl,`20output_namp Vtr->nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_sts); X`20`20`7D X X`20`20sys$connect(output_rabptr,`200,`200); X`20`20if`20((output_rabptr->rab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_miscerr; X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_rabptr->rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_rabptr->rab$l_stv); X`20`20`7D X X`20`20if`20(Trace)`20`7B X`20`20`20`20if`20(New_file)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_starting; X`20`20`20`20`20`20lib$signal(xcopy_starting,`204, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_rsl,`20 Vinput_namptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_rsl, V`20output_namptr->nam$l_rsa); X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_resuming; X`20`20`20`20`20`20lib$signal(xcopy_resuming,`205, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_rsl,`20 Vinput_namptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_rsl, V`20output_namptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20First_block); X`20`20`20`20`7D X`20`20`7D X X/* X`20*`20Copy`20each`20block`20in`20turn.`20This`20might`20fail`20after`20each V`20read`20or`20write;`20if`20it X`20*`20`20does,`20output`20a`20message`20saying`20how`20far`20we`20got`20befor Ve`20the`20failure. X`20*/ X`20`20end_block`20=`20First_block`20-`201; X`20`20while`20(end_block`20<`20Last_block)`20`7B X`20`20`20`20start_block`20=`20end_block`20+`201; X X`20`20`20`20if`20(sys$read(input_rabptr,`200,`200)`20==`20RMS$_EOF)`20`7B X`20`20`20`20`20`20break;`20`20`20`20`20/*`20we`20shouldn't`20hit`20this.`20*/ V X`20`20`20`20`7D X X`20`20`20`20create_symbol(`26block_symbol_des,`20start_block); X X`20`20`20`20if`20((input_rabptr->rab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_readfail; X`20`20`20`20`20`20lib$stop(xcopy_readfail,`203, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20start_block, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_rsl,`20input_ Vnamptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_rabptr->rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_rabptr->rab$l_stv); X`20`20`20`20`7D X X/* X`20*`20Actual`20end`20block`20depends`20on`20how`20many`20(partial)`20blocks V`20we`20were`20able`20to`20read. X`20*/ X`20`20`20`20end_block`20=`20start_block`20+`20((input_rabptr->rab$w_rsz`20-`20 V1)`20/`20blocksize); X X/* X`20*`20Next`20time,`20read`20the`20next`20bucket,`20wherever`20the`20first`20o Vne`20was. X`20*/ X`20`20`20`20input_rabptr->rab$l_bkt`20=`200; X X/* X`20*`20Write`20as`20many`20bytes`20as`20we`20read. X`20*/ X`20`20`20`20output_rabptr->rab$w_rsz`20=`20input_rabptr->rab$w_rsz; X`20`20`20`20sys$write(output_rabptr,`200,`200); X X`20`20`20`20if`20((output_rabptr->rab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_writefail; X`20`20`20`20`20`20lib$stop(xcopy_writefail,`203, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20start_block, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_rsl,`20outpu Vt_namptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_rabptr->rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_rabptr->rab$l_stv); X`20`20`20`20`7D X X`20`20`20`20output_rabptr->rab$l_bkt`20=`200; X X/* X`20*`20If`20we`20have`20just`20processed`20the`20appropriate`20number`20of`20b Vlocks,`20output X`20*`20`20a`20trace`20message`20(if`20required). X`20*/ X`20`20`20`20if`20(`20`20`20`20(Trace) X`20`20`20`20`20`20`20`20`20`26`26`20(Interval) X`20`20`20`20`20`20`20`20`20`26`26`20(((end_block`20-`20(First_block`20-`201)) V`20%`20Interval)`20==`200) X`20`20`20`20`20`20`20)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_trace; X`20`20`20`20`20`20lib$signal(xcopy_trace,`201,`20end_block); X`20`20`20`20`7D X`20`20`7D X X`20`20sys$close(output_fabptr,`200,`200); X`20`20if`20((output_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_miscerr; X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_stv); X`20`20`7D X X`20`20sys$close(input_fabptr,`200,`200); X`20`20if`20((input_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20EXTERNAL`20xcopy_miscerr; X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_stv); X`20`20`7D X X`20`20if`20(Log`20`7C`7C`20Trace)`20`7B X`20`20`20`20EXTERNAL`20xcopy_copied; X`20`20`20`20lib$signal(xcopy_copied,`205, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_rsl,`20input_ Vnamptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_namptr->nam$b_rsl,`20outpu Vt_namptr->nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20end_block); X`20`20`7D X X`20`20return`200; X`7D X X/* X`20*`20Function`20to`20call`20cli$get_value`20with`20valid`20descriptor`20para Vmeters. X`20*/ Xstatic Xint Xmy_get_value`20(char`20*qualifier,`20char`20*value) X`7B X`20`20$DESCRIPTOR(qualifier_des,`20""); X`20`20$DESCRIPTOR(value_des,`20""); X`20`20int`20result; X`20`20short`20retlen; X X`20`20qualifier_des.dsc$a_pointer`20=`20qualifier; X`20`20qualifier_des.dsc$w_length`20=`20strlen(qualifier); X`20`20value_des.dsc$a_pointer`20=`20value; X`20`20value_des.dsc$w_length`20=`20255; X X`20`20result`20=`20cli$get_value(`26qualifier_des,`20`26value_des,`20`26retlen V); X`20`20if`20(result`20`26`201)`20`7B X`20`20`20`20value`5Bretlen`5D`20=`20'`5C0'; X`20`20`7D X X`20`20return`20result; X`7D X X/* X`20*`20Function`20to`20call`20cli$present`20with`20a`20valid`20descriptor`20pa Vrameter. X`20*/ Xstatic Xint Xmy_present`20(char`20*qualifier) X`7B X`20`20$DESCRIPTOR(qualifier_des,`20""); X`20`20int`20result; X X`20`20qualifier_des.dsc$a_pointer`20=`20qualifier; X`20`20qualifier_des.dsc$w_length`20=`20strlen(qualifier); X`20`20result`20=`20cli$present(`26qualifier_des); X X`20`20return`20result; X`7D X X/* X`20*`20Main`20program. X`20*/ Xmain`20(int`20argc,`20char`20*argv`5B`5D) X`7B X`20`20static`20struct`20FAB`20input_fab; X`20`20static`20struct`20NAM`20input_nam; X`20`20static`20struct`20XABFHC`20input_xabfhc; X`20`20static`20struct`20FAB`20output_fab; X`20`20static`20struct`20NAM`20output_nam; X`20`20static`20struct`20XABFHC`20output_xabfhc; X X`20`20struct`20FAB`20*input_fabptr`20=`20`26input_fab; X`20`20struct`20NAM`20*input_namptr`20=`20`26input_nam; X`20`20struct`20XABFHC`20*input_xabfhcptr`20=`20`26input_xabfhc; X`20`20struct`20FAB`20*output_fabptr`20=`20`26output_fab; X`20`20struct`20NAM`20*output_namptr`20=`20`26output_nam; X`20`20struct`20XABFHC`20*output_xabfhcptr`20=`20`26output_xabfhc; X X`20`20char`20input_expname`20`5B255`5D; X`20`20char`20input_resname`20`5B255`5D; X`20`20char`20input_defname`20`5B255`5D; X`20`20char`20input_filename`20`5B255`5D; X`20`20char`20output_expname`20`5B255`5D; X`20`20char`20output_resname`20`5B255`5D; X`20`20char`20output_defname`20`5B255`5D; X`20`20char`20output_filename`20`5B255`5D; X`20`20char`20value`20`5B255`5D; X`20`20char`20infile`20`5B255`5D; X`20`20char`20outfile`20`5B255`5D; X`20`20int`20start_filenum; X`20`20int`20actual_filenum; X`20`20int`20first_filespec; X`20`20int`20quit; X`20`20int`20output_dir_wild; X X/* X`20*`20Get`20the`20command`20line`20parameters. X`20*/ X`20`20if`20(my_present("P1")`20==`20CLI$_ABSENT)`20`7B X`20`20`20`20panic("get_args:`20no`20parameter`20P1"); X`20`20`7D X X`20`20if`20(my_present("P2")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20if`20(my_get_value("P2",`20outfile)`20==`20CLI$_ABSENT)`20`7B X`20`20`20`20`20`20panic("get_args:`20problem`20with`20P2"); X`20`20`20`20`7D X`20`20`7D X`20`20else`20`7B X`20`20`20`20panic("get_args:`20no`20parameter`20P2"); X`20`20`7D X X`20`20First_block`20=`200; X`20`20if`20(my_present("FIRST_BLOCK")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20if`20(my_get_value("FIRST_BLOCK",`20value)`20!=`20SS$_NORMAL)`20 V`7B X`20`20`20`20`20`20panic("get_args:`20problem`20with`20/FIRST_BLOCK"); X`20`20`20`20`7D X`20`20`20`20sscanf(value,`20"%d",`20`26First_block); X`20`20`7D X X`20`20New_file`20=`20(First_block`20==`200); X`20`20if`20(New_file)`20`7B X`20`20`20`20First_block`20=`201; X`20`20`7D X X`20`20Last_block_seen`20=`200; X`20`20Last_block`20=`200x7fffffff; X`20`20if`20(my_present("LAST_BLOCK")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20if`20(my_get_value("LAST_BLOCK",`20value)`20!=`20SS$_NORMAL)`20`7B V X`20`20`20`20`20`20panic("get_args:`20problem`20with`20/LAST_BLOCK"); X`20`20`20`20`7D X`20`20`20`20sscanf(value,`20"%d",`20`26Last_block); X`20`20`20`20Last_block_seen`20=`201; X`20`20`7D X X`20`20start_filenum`20=`201; X`20`20if`20(my_present("WILD_FILE")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20if`20(my_get_value("WILD_FILE",`20value)`20!=`20SS$_NORMAL)`20`7B V X`20`20`20`20`20`20panic("get_args:`20problem`20with`20/WILD_FILE"); X`20`20`20`20`7D X`20`20`20`20sscanf(value,`20"%d",`20`26start_filenum); X`20`20`7D X X`20`20Log`20=`200; X`20`20if`20(my_present("LOG")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20Log`20=`201; X`20`20`7D X X`20`20Confirm`20=`200; X`20`20if`20(my_present("CONFIRM")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20Confirm`20=`201; X`20`20`7D X X`20`20Trace`20=`200; X`20`20Interval_seen`20=`200; X`20`20if`20(my_present("TRACE")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20Log`20=`201; X`20`20`20`20Trace`20=`201; X`20`20`20`20if`20(my_get_value("TRACE",`20value)`20==`20SS$_NORMAL)`20`7B X`20`20`20`20`20`20sscanf(value,`20"%d",`20`26Interval); X`20`20`20`20`20`20Interval_seen`20=`201; X`20`20`20`20`7D X`20`20`7D X X`20`20Rms_iosize`20=`20RMS_IOSIZE_DEFAULT; X`20`20if`20(my_present("RMS_IOSIZE")`20==`20CLI$_PRESENT)`20`7B X`20`20`20`20if`20(my_get_value("RMS_IOSIZE",`20value)`20!=`20SS$_NORMAL)`20`7B V X`20`20`20`20`20`20panic("get_args:`20problem`20with`20/RMS_IOSIZE"); X`20`20`20`20`7D X`20`20`20`20sscanf(value,`20"%d",`20`26Rms_iosize); X`20`20`7D X X`20`20if`20(Rms_iosize`20<`20RMS_IOSIZE_MIN)`20`7B X`20`20`20`20Rms_iosize`20=`20RMS_IOSIZE_MIN; X`20`20`7D X X`20`20if`20(Rms_iosize`20>`20RMS_IOSIZE_MAX)`20`7B X`20`20`20`20Rms_iosize`20=`20RMS_IOSIZE_MAX; X`20`20`7D X X/* X`20*`20Set`20up`20the`20FABs`20and`20related`20blocks. X`20*`20We`20assume`20that`20fields`20that`20must`20be`20zero`20already`20are V`20zero`20(since`20the X`20*`20`20blocks`20will`20be`20allocated`20in`20demand`20zero`20pages). X`20*`20I`20wrote`20this`20program`20before`20I`20found`20out`20about`20cc$rms_ Vfab,`20etc`20! X`20*/ X`20`20input_fabptr->fab$b_bid`20=`20FAB$C_BID; X`20`20input_fabptr->fab$b_bln`20=`20FAB$C_BLN; X`20`20input_fabptr->fab$b_fac`20=`20FAB$M_BIO`20`7C`20FAB$M_GET; X`20`20input_fabptr->fab$b_shr`20=`20FAB$M_UPI; X`20`20input_fabptr->fab$w_ifi`20=`200; X`20`20input_fabptr->fab$l_fna`20=`20input_filename; X`20`20input_fabptr->fab$l_fop`20=`20FAB$M_NAM; X`20`20input_fabptr->fab$l_nam`20=`20input_namptr; X`20`20input_fabptr->fab$l_xab`20=`20input_xabfhcptr; X`20`20input_fabptr->fab$l_dna`20=`20input_defname; X`20`20input_fabptr->fab$b_dns`20=`200; X`20`20input_fabptr->fab$b_acmodes`20=`200; X X`20`20input_namptr->nam$b_bid`20=`20NAM$C_BID; X`20`20input_namptr->nam$b_bln`20=`20NAM$C_BLN; X`20`20input_namptr->nam$l_esa`20=`20input_expname; X`20`20input_namptr->nam$b_ess`20=`20sizeof(input_expname); X`20`20input_namptr->nam$l_rsa`20=`20input_resname; X`20`20input_namptr->nam$b_rss`20=`20sizeof(input_resname); X`20`20input_namptr->nam$l_rlf`20=`200; X X`20`20input_xabfhcptr->xab$b_bln`20=`20XAB$C_FHCLEN; X`20`20input_xabfhcptr->xab$b_cod`20=`20XAB$C_FHC; X`20`20input_xabfhcptr->xab$l_nxt`20=`200; X X`20`20output_fabptr->fab$b_bid`20=`20FAB$C_BID; X`20`20output_fabptr->fab$b_bln`20=`20FAB$C_BLN; X`20`20output_fabptr->fab$b_fac`20=`20FAB$M_BIO`20`7C`20FAB$M_PUT; X`20`20output_fabptr->fab$b_shr`20=`20FAB$M_NIL; X`20`20output_fabptr->fab$w_ifi`20=`200; X`20`20output_fabptr->fab$l_fna`20=`20output_filename; X`20`20output_fabptr->fab$l_fop`20=`200; X`20`20output_fabptr->fab$l_nam`20=`20output_namptr; X`20`20output_fabptr->fab$l_xab`20=`20output_xabfhcptr; X`20`20output_fabptr->fab$l_dna`20=`20output_defname; X`20`20output_fabptr->fab$b_acmodes`20=`200; X X`20`20output_xabfhcptr->xab$b_bln`20=`20XAB$C_FHCLEN; X`20`20output_xabfhcptr->xab$b_cod`20=`20XAB$C_FHC; X`20`20output_xabfhcptr->xab$l_nxt`20=`200; X X`20`20output_namptr->nam$b_bid`20=`20NAM$C_BID; X`20`20output_namptr->nam$b_bln`20=`20NAM$C_BLN; X`20`20output_namptr->nam$l_esa`20=`20output_expname; X`20`20output_namptr->nam$b_ess`20=`20sizeof(output_expname); X`20`20output_namptr->nam$l_rsa`20=`20output_resname; X`20`20output_namptr->nam$b_rss`20=`20sizeof(output_resname); X`20`20output_namptr->nam$l_rlf`20=`200; X X`20`20first_filespec`20=`201; X`20`20quit`20=`200; X`20`20while`20((my_get_value("P1",`20infile)`20!=`20CLI$_ABSENT)`20`26`26`20(! Vquit))`20`7B X`20`20`20`20struct`20NAM`20old_input_nam; X`20`20`20`20struct`20NAM`20*old_input_namptr`20=`20`26old_input_nam; X X`20`20`20`20strcpy(input_fabptr->fab$l_fna,`20infile); X`20`20`20`20input_fabptr->fab$b_fns`20=`20strlen(input_fabptr->fab$l_fna); X X/* X`20*`20Split`20out`20the`20fields`20of`20the`20input`20filename. X`20*/ X`20`20`20`20input_namptr->nam$b_nop`20=`20NAM$M_SYNCHK; X X`20`20`20`20sys$parse(input_fabptr,`200,`200); X`20`20`20`20if`20((input_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_parsein; X`20`20`20`20`20`20lib$stop(xcopy_parsein,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$b_fns,`20input_ Vfabptr->fab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_sts); X`20`20`20`20`7D X X/* X`20*`20If`20this`20is`20the`20second`20or`20subsequent`20filespec,`20apply`20d Vefaults`20from`20before. X`20*/ X`20`20`20`20if`20(!first_filespec)`20`7B X`20`20`20`20`20`20if`20(input_namptr->nam$b_node`20==`200)`20`7B X`20`20`20`20`20`20`20`20memcpy(input_namptr->nam$l_node,`20old_input_namptr->n Vam$l_node, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(input_namptr->nam$b_node`20=`20o Vld_input_namptr->nam$b_node)); X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(input_namptr->nam$b_dev`20==`200)`20`7B X`20`20`20`20`20`20`20`20memcpy(input_namptr->nam$l_dev,`20old_input_namptr->na Vm$l_dev, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(input_namptr->nam$b_dev`20=`20ol Vd_input_namptr->nam$b_dev)); X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(input_namptr->nam$b_dir`20==`200)`20`7B X`20`20`20`20`20`20`20`20memcpy(input_namptr->nam$l_dir,`20old_input_namptr->na Vm$l_dir, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(input_namptr->nam$b_dir`20=`20ol Vd_input_namptr->nam$b_dir)); X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(input_namptr->nam$b_name`20==`200)`20`7B X`20`20`20`20`20`20`20`20memcpy(input_namptr->nam$l_name,`20old_input_namptr->n Vam$l_name, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(input_namptr->nam$b_name`20=`20o Vld_input_namptr->nam$b_name)); X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(input_namptr->nam$b_type`20==`200)`20`7B X`20`20`20`20`20`20`20`20memcpy(input_namptr->nam$l_type,`20old_input_namptr->n Vam$l_type, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(input_namptr->nam$b_type`20=`20o Vld_input_namptr->nam$b_type)); X`20`20`20`20`20`20`7D X`20`20`20`20`7D X X/* X`20*`20Remember`20the`20defaults`20for`20next`20time`20round. X`20*/ X`20`20`20`20memcpy(old_input_namptr,`20input_namptr,`20sizeof(struct`20NAM)); V X X/* X`20*`20Now`20rebuild`20the`20input`20filename`20using`20the`20previous`20defau Vlts. X`20*/ X`20`20`20`20build_filename(`26input_fabptr->fab$b_dns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$ Vl_dna,`20input_namptr); X X`20`20`20`20input_namptr->nam$b_nop`20=`200; X X`20`20`20`20sys$parse(input_fabptr,`200,`200); X`20`20`20`20if`20((input_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_parsein; X`20`20`20`20`20`20lib$stop(xcopy_parsein,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$b_fns,`20input_ Vfabptr->fab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_sts); X`20`20`20`20`7D X X/* X`20*`20Split`20out`20the`20fields`20of`20the`20output`20filename,`20using`20a V`20simple`20default. X`20*/ X`20`20`20`20strcpy(output_fabptr->fab$l_fna,`20outfile); X`20`20`20`20output_fabptr->fab$b_fns`20=`20strlen(output_fabptr->fab$l_fna); X X`20`20`20`20strcpy(output_fabptr->fab$l_dna,`20HERE); X`20`20`20`20output_fabptr->fab$b_dns`20=`20strlen(output_fabptr->fab$l_dna); X`20`20`20`20output_namptr->nam$b_nop`20=`20NAM$M_SYNCHK; X X`20`20`20`20sys$parse(output_fabptr,`200,`200); X`20`20`20`20if`20((output_fabptr->fab$l_sts`20`26`201)`20!=`201)`20`7B X`20`20`20`20`20`20EXTERNAL`20xcopy_parseout; X`20`20`20`20`20`20lib$stop(xcopy_parseout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$b_fns,`20outpu Vt_fabptr->fab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab$l_sts); X`20`20`20`20`7D X X/* X`20*`20Remove`20wildcards`20from`20output`20filespec`20(we`20use`20input`20fil Vespec`20as`20default). X`20*/ X`20`20`20`20output_dir_wild`20=`200; X`20`20`20`20if`20(output_namptr->nam$l_fnb`20`26`20NAM$M_WILD_DIR)`20`7B X`20`20`20`20`20`20output_namptr->nam$b_dir`20=`200; X`20`20`20`20`20`20output_dir_wild`20=`201; X`20`20`20`20`7D X X`20`20`20`20if`20(output_namptr->nam$l_fnb`20`26`20NAM$M_WILD_NAME)`20`7B X`20`20`20`20`20`20output_namptr->nam$b_name`20=`200; X`20`20`20`20`7D X X`20`20`20`20if`20(output_namptr->nam$l_fnb`20`26`20NAM$M_WILD_TYPE)`20`7B X`20`20`20`20`20`20output_namptr->nam$b_type`20=`200; X`20`20`20`20`7D X X`20`20`20`20if`20(output_namptr->nam$l_fnb`20`26`20NAM$M_WILD_VER)`20`7B X`20`20`20`20`20`20output_namptr->nam$b_ver`20=`200; X`20`20`20`20`7D X X`20`20`20`20build_filename(`26output_fabptr->fab$b_fns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fabptr->fab V$l_fna,`20output_namptr); X X`20`20`20`20actual_filenum`20=`200; X X`20`20`20`20while`20(1)`20`7B X`20`20`20`20`20`20sys$search(input_fabptr,`200,`200); X`20`20`20`20`20`20if`20(input_fabptr->fab$l_sts`20==`20RMS$_NMF)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20if`20((input_fabptr->fab$l_sts`20`26`201)`20!=`201) V`20`7B X`20`20`20`20`20`20`20`20EXTERNAL`20xcopy_openin; X`20`20`20`20`20`20`20`20lib$stop(xcopy_openin,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_namptr->nam$b_esl,`20 Vinput_namptr->nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fabptr->fab$l_sts); X`20`20`20`20`20`20`7D X X/* X`20*`20If`20necessary,`20skip`20the`20first`20few`20files`20of`20the`20input V`20specification. X`20*/ X`20`20`20`20`20`20if`20(++actual_filenum`20<`20start_filenum)`20`7B X`20`20`20`20`20`20`20`20continue; X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20create_symbol(`26file_symbol_des,`20actual_filenum); X`20`20`20`20`20`20create_symbol(`26block_symbol_des,`20(New_file`20?`200`20: V`20First_block)); X X`20`20`20`20`20`20if`20(quit`20=`20copy_one_file(actual_filenum,`20input_fabpt Vr, 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`20 V`20`20`20`20`20output_fabptr,`20output_dir_wild))`20`7B X`20`20`20`20`20`20`20`20--actual_filenum; X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20create_symbol(`26file_symbol_des,`20actual_filenum`20+`201); V X`20`20`20`20`20`20create_symbol(`26block_symbol_des,`200); X`20`20`20`20`20`20First_block`20=`201; X`20`20`20`20`20`20New_file`20=`201; X`20`20`20`20`7D X/* X`20*`20End`20of`20processing`20for`20one`20filespec. X`20*/ X`20`20`20`20first_filespec`20=`200; X`20`20`7D X X`20`20create_symbol(`26file_symbol_des,`20actual_filenum`20+`201); X`20`20create_symbol(`26block_symbol_des,`200); X`7D X $ call unpack XCOPY.C;1 913674743 "" 46 1 7 $! $ create 'f' XDEFINE`20VERB`20XCOPY X`20`20`20`20`20`20`20`20IMAGE`20"XCOPY" X`20`20`20`20`20`20`20`20PARAMETER`20P1 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PROMPT="Input`20file" X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$FILE,`20LIST, V`20REQUIRED) X`20`20`20`20`20`20`20`20PARAMETER`20P2 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PROMPT="Output`20file" X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$FILE,`20REQUIRE VD) X`20`20`20`20`20`20`20`20QUALIFIER`20FIRST_BLOCK X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NONNEGATABLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$NUMBER,`20REQUI VRED) X`20`20`20`20`20`20`20`20QUALIFIER`20LAST_BLOCK X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NONNEGATABLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$NUMBER,`20REQUI VRED) X`20`20`20`20`20`20`20`20QUALIFIER`20WILD_FILE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NONNEGATABLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$NUMBER,`20REQUI VRED) X`20`20`20`20`20`20`20`20QUALIFIER`20LOG X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NEGATABLE X`20`20`20`20`20`20`20`20QUALIFIER`20CONFIRM X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NEGATABLE X`20`20`20`20`20`20`20`20QUALIFIER`20TRACE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NEGATABLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$NUMBER) X`20`20`20`20`20`20`20`20QUALIFIER`20RMS_IOSIZE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NONNEGATABLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20VALUE`20(TYPE=$NUMBER,`20REQUI VRED) $ call unpack XCOPY.CLD;1 1297109260 "" 2 2 7 $! $ create 'f' X1`20XCOPY X`20`20A`20program`20to`20copy`20files,`20with`20one`20major`20improvement`20on V`20VMS`20COPY. X X`20`20Should`20the`20copy`20fail`20(for`20example,`20because`20one`20file`20is V`20on`20a`20remote X`20`20node,`20and`20the`20connection`20is`20lost),`20XCOPY`20returns`20(to`20S VYS$OUTPUT,`20and X`20`20DCL`20via`20symbols)`20sufficient`20information`20about`20the`20failure V`20to`20enable X`20`20the`20copy`20to`20be`20restarted`20from`20the`20point`20of`20failure.`20 V`20Only`20disk-to-disk X`20`20transfers`20are`20supported. X X`20`20Format: X X`20`20$`20XCOPY`20infile`20`5B,infile...`5D`20outfile`20`5B/qualifiers`5D X2`20More_about_XCOPY X`20`20I`20wrote`20XCOPY`20after`20spending`20two`20days`20trying`20to`20send V`20a`20number`20of X`20`20300-block`20files`20over`20a`201200`20baud`20dial-up`20DECnet`20connecti Von,`20which`20had X`20`20a`20mean`20uptime`20of`20about`20five`20minutes.`20`20XCOPY`20allows`20y Vou`20to`20restart`20any X`20`20failed`20transfer,`20even`20halfway`20through`20a`20wildcard,`20from`20t Vhe`20block`20at X`20`20which`20it`20failed. X X`20`20You`20should`20have`20received`20both`20C`20and`20Pascal`20source`20vers Vions`20of`20XCOPY. X`20`20The`20Pascal`20version`20is`20for`20demonstration`20purposes`20only;`20a Vll`20distributed X`20`20object`20versions`20are`20compiled`20from`20the`20C`20version`20(I`20no V`20longer`20have X`20`20access`20to`20a`20Pascal`20compiler).`20`20If`20you`20have`20access`20to V`20VAX`20C`20(or`20if`20you X`20`20have`20access`20to`20VAX`20Pascal`20and`20are`20an`20optimist),`20you`20 Vare`20encouraged`20to X`20`20review`20the`20program`20and`20compile`20it`20yourself`20before`20using V`20it,`20not`20because X`20`20I`20think`20that`20the`20software`20is`20so`20wonderful`20that`20you`20m Vust`20read`20it`20(1000+ X`20`20lines`20in`20one`20module`20does`20not`20constitute`20wonderful`20coding V`20practice,`20for X`20`20a`20start),`20but`20because`20this`20is`20a`20good`20way`20to`20protect V`20yourself`20against X`20`20some`20of`20the`20bad`20guys`20out`20there. X X`20`20XCOPY`20requires`20no`20privileges`20to`20run`20(obviously,`20NETMBX`20i Vs`20needed`20for X`20`20remote`20operations).`20`20Do`20not`20install`20it`20with`20privileges V`20! X X`20`20To`20build`20and`20install`20XCOPY: X`20`20$`20MESSAGE`20XCOPY_MSG X`20`20$`20LINK`20XCOPY/OPT X`20`20$!`20Now`20either`20copy`20XCOPY.EXE`20to`20SYS$SYSTEM,`20or`20define`20 Vthe`20logical`20XCOPY`20to X`20`20`20`20`20point`20to`20the`20executable. X`20`20$!`20To`20use`20from`20your`20current`20process`20only: X`20`20$`20SET`20COMMAND`20XCOPY.CLD X`20`20$!`20To`20make`20available`20system-wide: X`20`20$`20DEFINE`20DC`20SYS$COMMON:`5BSYSLIB`5DDCLTABLES.EXE X`20`20$`20SET`20COMMAND`20XCOPY.CLD`20/TABLE=DC`20/OUTPUT=DC X`20`20$`20INSTALL`20REPLACE`20DC X X`20`20Naturally,`20since`20this`20is`20free`20software,`20I`20accept`20no`20re Vsponsibility X`20`20for`20any`20loss`20or`20damage`20to`20any`20data.`20`20Nor`20do`20I`20of Vfer`20any`20warranty`20that X`20`20this`20software`20works`20as`20described`20under`20any`20particular`20ci Vrcumstances. X`20`20In`20other`20words,`20no`20price,`20no`20guarantee. X X`20`20If`20you`20have`20any`20questions,`20comments,`20or`20bugs`20to`20report V,`20please X`20`20contact: X X`20`20`20`20`20`20`20`20Nick`20Brown X`20`20`20`20`20`20`20`2010,`20rue`20de`20Molsheim X`20`20`20`20`20`20`20`2067310`20TRAENHEIM X`20`20`20`20`20`20`20`20France X X`20`20`20`20`20`20`20`20CIS:`20100113,2107 X`20`20`20`20`20`20`20`20Internet:`20Nick.Brown@dct.coe.fr X2`20Parameters XInfile X X`20`20The`20file,`20or`20list`20of`20files,`20to`20be`20copied.`20`20Wildcards V`20are`20supported X`20`20and`20(are`20intended`20to)`20work`20similarly`20to`20VMS`20COPY.`20`20E Vxact`20compatibility X`20`20is`20certainly`20NOT`20provided;`20for`20example,`20any`20error`20(such V`20as`20a`20missing X`20`20target`20directory)`20causes`20XCOPY`20to`20stop,`20whereas`20VMS`20COPY V`20would`20process X`20`20the`20remaining`20input`20files. X XOutfile X X`20`20The`20name`20of`20the`20output`20file`20to`20be`20created.`20`20Missing V`20or`20wildcarded X`20`20parts`20of`20the`20filespec`20default`20to`20the`20same`20as`20the`20inp Vut`20file,`20in X`20`20(approximately)`20the`20same`20way`20as`20VMS`20COPY.`20`20If`20/FIRST_B VLOCK`20(see X`20`20Qualifiers)`20is`20greater`20than`200,`20the`20program`20will`20attempt V`20to`20open`20an X`20`20existing`20output`20file. X2`20Qualifiers X X/CONFIRM X`20/CONFIRM X`20/NOCONFIRM`20(default) X X`20`20Specifies`20that`20the`20user`20be`20prompted`20for`20confirmation`20of V`20each`20file X`20`20copy.`20Possible`20responses`20are`20YES,`20NO,`20ALL,`20or`20QUIT.`20 V`20ALL`20causes`20all X`20`20subsequent`20copies`20to`20be`20done`20without`20confirmation;`20QUIT`20 Vterminates X`20`20XCOPY`20immediately. X X/FIRST_BLOCK X`20/FIRST_BLOCK=n X X`20`20Specifies`20the`20first`20block`20of`20the`20file`20to`20be`20copied.`20 V`20The`20default`20is`200, X`20`20which`20implies`20that`20the`20whole`20file`20will`20be`20copied.`20`20( VA`20value`20of`201`20also X`20`20causes`20the`20whole`20file`20to`20be`20copied,`20but`20in`20this`20case V`20XCOPY`20assumes X`20`20that`20the`20file`20already`20exists;`20for`20example,`20after`20a`20pre Vvious`20XCOPY X`20`20failed`20writing`20the`20first`20block`20of`20a`20file). X X`20`20When`20more`20than`20one`20input`20file`20is`20specified,`20this`20quali Vfier`20only X`20`20applies`20to`20the`20first`20file`20copied`20(also`20determined`20by`20/ VWILD_FILE). X`20`20Subsequent`20files`20are`20created`20as`20if`20they`20were`20copied`20wi Vth X`20`20/FIRST_BLOCK=0. X X/LAST_BLOCK X`20/LAST_BLOCK=n X X`20`20Specifies`20the`20last`20block`20of`20the`20file`20to`20be`20copied.`20 V`20The`20default`20is X`20`20the`20end`20of`20file`20block.`20`20This`20qualifier`20is`20principally V`20intended`20for`20use X`20`20in`20XCOPY`20program`20development`20and/or`20testing,`20to`20allow`20XC VOPY`20to`20simulate X`20`20a`20break`20in`20communications. X X/LOG X`20/LOG X`20/NOLOG`20(default) X X`20`20Specified`20that`20a`20success`20message`20be`20produced`20after`20the V`20file`20is`20copied. X X/RMS_IOSIZE X`20/RMS_IOSIZE=n X X`20`20Specified`20the`20number`20of`20blocks`20to`20be`20copied`20by`20RMS`20i Vn`20a`20single X`20`20operation.`20A`20higher`20value`20will`20generally`20increase`20the`20pe Vrformance`20of X`20`20XCOPY`20over`20faster`20transmission`20media`20(such`20as`20Ethernet), V`20while`20a`20lower X`20`20value`20will`20minimise`20the`20amount`20of`20data`20that`20needs`20to V`20be`20retransmitted X`20`20if`20the`20operation`20needs`20to`20be`20restarted. X X`20`20The`20default`20value`20is`204`20blocks,`20the`20minimum`20is`201,`20and V`20the`20maximum`20is X`20`20127.`20Disk`20blocks`20are`20512`20bytes`20in`20size. X X/TRACE X`20/TRACE`5B=n`5D X`20/NOTRACE`20(default) X X`20`20Specifies`20that`20a`20message`20will`20be`20output`20every`20N`20blocks V,`20confirming X`20`20the`20progress`20of`20the`20copy.`20`20If`20N`20is`20omitted,`20a`20mess Vage`20will`20be`20output X`20`20after`20approximately`20every`2010`20percent`20of`20the`20file`20has`20b Veen`20copied.`20`20If X`20`20/NOTRACE`20is`20specified,`20or`20if`20the`20/TRACE`20qualifier`20is`20o Vmitted,`20no`20such X`20`20message`20will`20be`20produced. X X`20`20The`20value`20of`20N`20is`20rounded`20up`20to`20the`20nearest`20multiple V`20of`20the`20value`20of X`20`20the`20qualifier`20/RMS_IOSIZE. X X`20`20/TRACE`20also`20implies`20/LOG. X X/WILD_FILE X`20/WILD_FILE=n X X`20`20Specifies`20the`20first`20file`20within`20the`20input`20wildcard`20list V`20to`20be X`20`20specified.`20This`20qualifier`20is`20used`20when`20restarting`20a`20fail Ved`20wildcard`20or X`20`20filename-list`20copy.`20`20In`20practical`20terms`20it`20means`20"skip V`20n-1`20files" X`20`20before`20selecting`20the`20first`20one`20to`20copy. X X`20`20Note`20that`20if`20the`20expansion`20of`20the`20input`20filespec`20has V`20changed`20since`20the X`20`20previous`20time`20XCOPY`20was`20run`20(for`20example,`20because`20one`20 Vof`20the`20files`20has X`20`20been`20deleted`20in`20the`20meantime),`20the`20effects`20of`20restarting V`20are X`20`20unpredictable. X X2`20DCL_symbols X X`20`20In`20the`20event`20of`20failure,`20the`20DCL`20symbol`20XCOPY_FAILED_BLO VCK`20contains X`20`20(as`20a`20decimal`20string)`20the`20number`20of`20the`20failed`20block, V`20and X`20`20XCOPY_FAILED_FILE`20contains`20the`20file`20number`20(relative`20to`20th Ve`20input X`20`20filespec)`20of`20the`20file`20containing`20the`20failed`20block.`20`20XC VOPY`20can`20then`20be X`20`20restarted`20with`20the`20qualifiers`20/FIRST_BLOCK='XCOPY_FAILED_BLOCK' V`20and X`20`20/WILD_FILE='XCOPY_FAILED_FILE'. X X`20`20If`20the`20copy`20succeeds,`20XCOPY_FAILED_BLOCK`20is`20set`20to`200,`20 Vand X`20`20XCOPY_FAILED_FILE`20to`20the`20number`20of`20files`20in`20the`20input`20 Vfile X`20`20specification`20list,`20plus`20one.`20`20Restarting`20XCOPY`20with`20the Vse`20values`20will X`20`20not`20copy`20anything. X X2`20Examples X X`20`201.`20`20`20$`20XCOPY`20BIGFILE.DAT`20REMOTE::DUA0:`5BDIR`5D X`20`20`20`20`20`20`20%XCOPY-F-WRITEFAIL,`20failed`20writing`20block`20246`20of V X`20`20`20`20`20`20`20`20REMOTE::DUA0:`5BDIR`5DBIGFILE.DAT;1 X`20`20`20`20`20`20`20$`20XCOPY`20BIGFILE.DAT`20REMOTE::DUA0:`5BDIR`5D`20/FIRST V=246 X X`20`20`20`20`20`20`20The`20copy`20is`20restarted`20from`20the`20first`20untran Vsmitted`20block. X X`20`202.`20`20`20$`20XCOPY`20SMALLFILE.DAT`20REMOTE::DUA0:`5BDIR`5D`20/TRACE=2 V0 X`20`20`20`20`20`20`20%XCOPY-S-COPYING,`20starting`20copy`20of`20DUA1:`5BEXAMPL VE`5DSMALLFILE.DAT;1 X`20`20`20`20`20`20`20to`20REMOTE::DUA0:`5BDIR`5DSMALLFILE.DAT X`20`20`20`20`20`20`20%XCOPY-I-TRACE,`20successfully`20copied`20block`2020 X`20`20`20`20`20`20`20%XCOPY-I-TRACE,`20successfully`20copied`20block`2040 X`20`20`20`20`20`20`20%XCOPY-S-COPIED,`20DUA1:`5BEXAMPLE`5DSMALLFILE.DAT;1`20co Vpied`20to X`20`20`20`20`20`20`20`20REMOTE::DUA0:`5BDIR`5DSMALLFILE.DAT;1`20(47`20blocks) V X X`20`20`20`20`20`20`20This`20shows`20the`20successful`20copy`20of`20a`20file. X X`20`203.`20`20`20$`20XCOPY_FAILED_BLOCK`20=`200 X`20`20`20`20`20`20`20$`20XCOPY_FAILED_FILE`20=`200 X`20`20`20`20`20`20`20$`20loop: X`20`20`20`20`20`20`20$`20on`20error`20then`20goto`20loop X`20`20`20`20`20`20`20$`20XCOPY`20'P1'`20'P2'`20/TRACE`20/FIRST_BLOCK='XCOPY_FA VILED_BLOCK'`20- 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`20 V`20`20`20`20`20`20/WILD_FILE='XCOPY_FAILED_FILE' X X`20`20`20`20`20`20`20This`20DCL`20procedure`20fragment`20shows,`20in`20element Vary`20form,`20how`20to X`20`20`20`20`20`20`20write`20a`20procedure`20which`20will`20copy`20files`20and V`20retry`20until X`20`20`20`20`20`20`20successful.`20`20This`20example`20does`20not`20handle`20s Vuch`20things`20as`20retry X`20`20`20`20`20`20`20counts,`20restart`20delays,`20etc,`20which`20would`20be V`20required`20in`20a X`20`20`20`20`20`20`20practical`20situation. $ call unpack XCOPY.HLP;1 1697979879 "" 15 3 7 $! $ create 'f' X!`20Linker`20options`20file`20to`20build`20C`20version`20of`20XCOPY. X!`20Command`20line:`20LINK`20/NOTRACE`20XCOPY`20/OPT X! Xxcopy Xxcopymsg Xsys$library:vaxcrtl/share $ call unpack XCOPY.OPT;1 1414942543 "" 1 4 7 $! $ create 'f' X`7B`20XCOPY.PAS`20-`20copy`20files`20block`20by`20block.`20`7D X`7B`20Copyright`20(C)`20Nick`20Brown`201989-1993.`20All`20rights`20reserved. V`20`7D X X`5B`20INHERIT`20('SYS$LIBRARY:STARLET')`20`5D X XPROGRAM`20xcopy`20(OUTPUT); X XCONST X`20`20slen`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20=`20255; X`20`20NTRACES`20`20`20`20`20`20`20`20`20`20`20`20=`2010; X`20`20TABLE`20`20`20`20`20`20`20`20`20`20`20`20`20`20=`201; X`20`20block_symbol_name`20`20=`20'XCOPY_FAILED_BLOCK'; X`20`20file_symbol_name`20`20`20=`20'XCOPY_FAILED_FILE'; X X`7B`20RMS`20parameters.`20`7D X`20`20DISK_BLOCKSIZE`20`20`20`20`20=`20512; X`20`20RMS_IOSIZE_MIN`20`20`20`20`20=`201; X`20`20RMS_IOSIZE_DEFAULT`20=`204; X`20`20RMS_IOSIZE_MAX`20`20`20`20`20=`20127; X`20`20MAX_BUFFER`20`20`20`20`20`20`20`20`20=`2065535; X X`7B`20A`20default`20filespec.`20`7D X`20`20HERE`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20=`20'SYS$DISK:`5B`5D*.* V'; X XTYPE X`20`20string`20=`20VARYING`20`5Bslen`5D`20OF`20CHAR; X`20`20chars`20`20=`20PACKED`20ARRAY`20`5B1..slen`5D`20OF`20CHAR; X`20`20$UBYTE`20=`20`5BBYTE`5D`200..255; X`20`20$UWORD`20=`20`5BWORD`5D`200..65535; X X`7B`20Replies`20to`20confirmation`20prompt.`20`7D X`20`20OK_type`20=`20(OK_NO,`20OK_YES,`20OK_ALL,`20OK_QUIT); X X`7B`20Global`20variables`20for`20CLI`20parameters,`20used`20throughout`20the V`20program.`20`7D X`7B`20These`20are`20recognisable`20by`20their`20capitalised`20first`20letter. V`20`7D XVAR X`20`20First_block`20`20`20`20`20:`20INTEGER; X`20`20Last_block`20`20`20`20`20`20:`20INTEGER; X`20`20Last_block_seen`20:`20BOOLEAN; X`20`20New_file`20`20`20`20`20`20`20`20:`20BOOLEAN; X`20`20Rms_iosize`20`20`20`20`20`20:`20INTEGER; X`20`20Trace`20`20`20`20`20`20`20`20`20`20`20:`20BOOLEAN; X`20`20Interval`20`20`20`20`20`20`20`20:`20INTEGER; X`20`20Interval_seen`20`20`20:`20BOOLEAN; X`20`20Log`20`20`20`20`20`20`20`20`20`20`20`20`20:`20BOOLEAN; X`20`20Confirm`20`20`20`20`20`20`20`20`20:`20BOOLEAN; X X`7B-`20externals`20-`7D XPROCEDURE`20lib$movc3`20(`20%REF`20p1`20:`20$UWORD; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20%IMMED`20p2 V`20:`20UNSIGNED; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20%IMMED`20p3 V`20:`20UNSIGNED`20); XEXTERN`20; X XPROCEDURE`20lib$stop`20(`20`20`20`20condition`20:`20UNSIGNED; 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%IMMED V`20p2`20:`20INTEGER`20:=`200; 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%IMMED V`20p3`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p4`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p5`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p6`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p7`20:`20UNSIGNED`20:=`200`20); XEXTERN`20; X XPROCEDURE`20lib$signal`20(`20`20condition`20:`20UNSIGNED; 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%IMMED V`20p2`20:`20INTEGER`20:=`200; 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%IMMED V`20p3`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p4`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p5`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p6`20:`20UNSIGNED`20:=`200; 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%IMMED V`20p7`20:`20UNSIGNED`20:=`200`20); XEXTERN`20; X XPROCEDURE`20lib$set_symbol`20(`20%DESCR`20s1`20:`20string; 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`20 V`20%DESCR`20s2`20:`20string; 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`20 V`20%REF`20tbl`20`20:`20INTEGER`20:=`201`20); XEXTERN`20; X XFUNCTION`20lib$get_command`20(`20%DESCR`20s1`20:`20chars; 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`20 V`20%DESCR`20s2`20:`20string; 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`20 V`20%REF`20`20`20rl`20:`20$UWORD`20)`20:`20INTEGER; XEXTERN`20; X XFUNCTION`20cli$get_value`20(`20%DESCR`20s1`20:`20string; 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%DE VSCR`20s2`20:`20string; 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%RE VF`20`20`20rl`20:`20UNSIGNED`20)`20:`20INTEGER; XEXTERN`20; X XFUNCTION`20cli$present`20(`20%DESCR`20s1`20:`20string`20)`20:`20INTEGER; XEXTERN`20; X X`7B-`20panic`20-`7D X XPROCEDURE`20panic`20(`20s`20:`20string`20); X XVAR X`20`20xcopy_panic`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X XBEGIN X`20`20lib$stop(xcopy_panic,`202,`20LENGTH(s),`20IADDRESS(s)); XEND; X X`7B-`20create_symbol`20-`7D X XPROCEDURE`20create_symbol`20(`20symbol`20:`20string; 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`20 Vvalue`20`20:`20INTEGER`20); X XVAR X`20`20svalue`20:`20string; X XBEGIN X`20`20WRITEV(svalue,`20value`20:`200); X`20`20lib$set_symbol(symbol,`20svalue,`20TABLE); XEND; X X`7B-`20memcpy`20-`7D X XPROCEDURE`20memcpy`20(`20target`20:`20UNSIGNED; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20source`20:`20UNSIGNED V; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20count`20`20:`20$UBYTE V`20); X XVAR X`20`20wcount`20:`20$UWORD; X XBEGIN X`20`20wcount`20:=`20count; X`20`20lib$movc3(wcount,`20source,`20target); XEND; X X`7B-`20ok_to_copy`20-`7D X XFUNCTION`20ok_to_copy`20(`20input_len`20:`20INTEGER; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_name V`20:`20UNSIGNED; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_len V`20:`20INTEGER; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_name V`20:`20UNSIGNED; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20first_block V`20:`20INTEGER`20)`20:`20OK_type; XVAR X`20`20message`20:`20string; X`20`20reply`20`20`20:`20string; X`20`20control`20:`20string; X`20`20prmlst`20`20:`20ARRAY`20`5B0..4`5D`20OF`20UNSIGNED; X`20`20result`20`20:`20UNSIGNED; X`20`20outlen`20`20:`20$UWORD; X`20`20replen`20`20:`20$UWORD; X`20`20i`20`20`20`20`20`20`20:`20INTEGER; X`20`20error`20`20`20:`20BOOLEAN; X XLABEL X`20`20ok_to_copy_return; X XBEGIN X`20`20prmlst`5B0`5D`20:=`20input_len; X`20`20prmlst`5B1`5D`20:=`20input_name; X`20`20prmlst`5B2`5D`20:=`20output_len; X`20`20prmlst`5B3`5D`20:=`20output_name; X`20`20prmlst`5B4`5D`20:=`20first_block; X X`20`20IF`20(New_file)`20THEN X`20`20BEGIN X`20`20`20`20control`20:=`20'Copy`20!AD`20to`20!AD`20(Y,N,A,Q):`20'; X`20`20END X`20`20ELSE X`20`20BEGIN X`20`20`20`20control`20:=`20'Resume`20copy`20of`20!AD`20to`20!AD`20at`20block V`20!UL`20(Y,N,A,Q):`20'; X`20`20END; X X`20`20result`20:=`20$faol(control,`20message.LENGTH,`20message.BODY,`20prmlst) V; X`20`20IF`20(NOT`20ODD`20(result))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(result); X`20`20END; X X`20`20WHILE`20(TRUE)`20DO X`20`20BEGIN X`20`20`20`20error`20:=`20FALSE; X X`20`20`20`20result`20:=`20lib$get_command(reply.BODY,`20message,`20LENGTH(repl Vy)); X`20`20`20`20IF`20(NOT`20ODD`20(result))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(result); X`20`20`20`20END; X X`20`20`20`20i`20:=`201; X`20`20`20`20WHILE`20((i`20<=`20LENGTH(reply))`20AND`20(NOT`20error))`20DO X`20`20`20`20BEGIN X`20`20`20`20`20`20IF`20((reply`5Bi`5D`20=`20'A')`20OR`20(reply`5Bi`5D`20=`20'a V'))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20ok_to_copy`20:=`20OK_ALL; X`20`20`20`20`20`20`20`20GOTO`20ok_to_copy_return; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE`20IF`20((reply`5Bi`5D`20=`20'Q')`20OR`20(reply`5Bi`5D V`20=`20'q'))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20ok_to_copy`20:=`20OK_QUIT; X`20`20`20`20`20`20`20`20GOTO`20ok_to_copy_return; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE`20IF`20((reply`5Bi`5D`20=`20'N')`20OR`20(reply`5Bi`5D V`20=`20'n'))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20ok_to_copy`20:=`20OK_NO; X`20`20`20`20`20`20`20`20GOTO`20ok_to_copy_return; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE`20IF`20((reply`5Bi`5D`20=`20'Y')`20OR`20(reply`5Bi`5D V`20=`20'y'))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20ok_to_copy`20:=`20OK_YES; X`20`20`20`20`20`20`20`20GOTO`20ok_to_copy_return; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE`20IF`20((reply`5Bi`5D`20=`20'`20')`20OR`20(ORD(reply`5B Vi`5D)`20=`209))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20error`20:=`20TRUE; X`20`20`20`20`20`20END; X X`20`20`20`20`20`20i`20:=`20i`20+`201; X`20`20`20`20END; X`20`20END; X X`20`20ok_to_copy_return: XEND; X X`7B-`20copy_dn_field`20-`7D X XPROCEDURE`20copy_dn_field`20(`20VAR`20offset`20:`20$UBYTE; 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`20 V`20`20`20`20target`20:`20UNSIGNED; 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`20 V`20`20`20`20size`20`20`20:`20$UBYTE; 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`20 V`20`20`20`20field`20`20:`20UNSIGNED`20); XBEGIN X`20`20memcpy(target`20+`20offset,`20field,`20size); X`20`20offset`20:=`20offset`20+`20size; XEND; X X`7B-`20build_filename`20-`7D X XPROCEDURE`20build_filename`20(`20VAR`20offset`20:`20$UBYTE; 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`20 V`20`20`20`20`20target`20:`20UNSIGNED; 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`20 V`20VAR`20nam`20`20`20`20:`20NAM$TYPE`20); XVAR X`20`20hack`20:`20string; X XBEGIN X`20`20offset`20:=`200; X X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_node,`20nam.nam$l_node); X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_dev,`20nam.nam$l_dev); X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_dir,`20nam.nam$l_dir); X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_name,`20nam.nam$l_name); X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_type,`20nam.nam$l_type); X`20`20copy_dn_field(offset,`20target,`20nam.nam$b_ver,`20nam.nam$l_ver); XEND; X X`7B-`20copy_one_file`20-`7D X XFUNCTION`20copy_one_file`20(`20`20`20`20`20`20`20`20`20`20`20`20`20fileno`20 V`20:`20INTEGER; 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`20VAR V`20input_fab`20`20`20`20`20`20`20:`20FAB$TYPE; 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`20VAR V`20output_fab`20`20`20`20`20`20:`20FAB$TYPE; 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`20 V`20`20`20output_dir_wild`20:`20BOOLEAN`20)`20:`20BOOLEAN; X XTYPE X`20`20block`20`20=`20PACKED`20ARRAY`20`5B1..MAX_BUFFER`5D`20OF`20CHAR; X`20`20NAMptr`20=`20`5ENAM$TYPE; X`20`20XABptr`20=`20`5EXAB$TYPE; X XVAR X`20`20start_block`20`20`20`20`20:`20INTEGER; X`20`20end_block`20`20`20`20`20`20`20:`20INTEGER; X`20`20input_nam`20`20`20`20`20`20`20:`20NAMptr; X`20`20input_xabfhc`20`20`20`20:`20XABptr; X`20`20input_rab`20`20`20`20`20`20`20:`20RAB$TYPE; X`20`20output_nam`20`20`20`20`20`20:`20NAMptr; X`20`20output_rab`20`20`20`20`20`20:`20RAB$TYPE; X`20`20output_xabfhc`20`20`20:`20XABptr; X`20`20file_buffer`20`20`20`20`20:`20block; X`20`20ok`20`20`20`20`20`20`20`20`20`20`20`20`20`20:`20OK_type; X`20`20blocks_per_io`20`20`20:`20INTEGER; X`20`20blocksize`20`20`20`20`20`20`20:`20INTEGER; X`20`20file_allocation`20:`20INTEGER; X X`20`20xcopy_trace`20`20`20`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_copied`20`20`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_miscerr`20`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_openin`20`20`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_openout`20`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_parseout`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_readfail`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_writefail`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_starting`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_resuming`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X XLABEL X`20`20copy_one_file_return, X`20`20break_read_write_loop; X XBEGIN X`20`20input_nam`20:=`20input_fab.fab$l_nam::NAMptr; X`20`20input_xabfhc`20:=`20input_fab.fab$l_xab::XABptr; X`20`20output_nam`20:=`20output_fab.fab$l_nam::NAMptr; X`20`20output_xabfhc`20:=`20output_fab.fab$l_xab::XABptr; X X`7B`20Set`20up`20the`20RABs.`20`7D X X`20`20input_rab.rab$b_bid`20:=`20RAB$C_BID; X`20`20input_rab.rab$b_bln`20:=`20RAB$C_BLN; X`20`20input_rab.rab$l_fab`20:=`20IADDRESS(input_fab); X`20`20input_rab.rab$l_bkt`20:=`20first_block; X`20`20input_rab.rab$l_ubf`20:=`20IADDRESS(file_buffer); X`20`20input_rab.rab$l_xab`20:=`200; X`20`20input_rab.rab$l_rop`20:=`200; X X`20`20output_rab.rab$b_bid`20:=`20RAB$C_BID; X`20`20output_rab.rab$b_bln`20:=`20RAB$C_BLN; X`20`20output_rab.rab$l_fab`20:=`20IADDRESS(output_fab); X`20`20output_rab.rab$l_rbf`20:=`20IADDRESS(file_buffer); X`20`20output_rab.rab$l_xab`20:=`200; X`20`20output_rab.rab$l_rop`20:=`200; X X`7B`20If`20the`20input`20or`20output`20file`20name`20contains`20a`20node`20nam Ve,`20remove`20the`20`7D X`7B`20`20node`20name,`20device,`20directory,`20and`20version`20number`20from V`20the`20resultant`20input`20`7D X`7B`20`20file`20name`20before`20applying`20it`20as`20a`20default.`20`7D X`7B`20Otherwise,`20use`20the`20extended`20input`20file`20specification.`20`7D V X`7B`20Exception:`20if`20we`20had`20a`20wildcard`20in`20our`20DCL`20output`20fi Vle`20directory`20spec,`20`7D X`7B`20`20use`20the`20input`20directory`20as`20a`20default.`20`7D X X`20`20IF`20(`20`20`20`20(UAND(input_nam`5E.nam$l_fnb,`20NAM$M_NODE)`20<>`200) V X`20`20`20`20`20`20`20OR`20(UAND(output_nam`5E.nam$l_fnb,`20NAM$M_NODE)`20<>`20 V0) X`20`20`20`20`20)`20THEN X`20`20BEGIN X`20`20`20`20input_nam`5E.nam$b_node`20:=`200; X`20`20`20`20input_nam`5E.nam$b_dev`20:=`200; X`20`20`20`20IF`20(NOT`20output_dir_wild)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20input_nam`5E.nam$b_dir`20:=`200; X`20`20`20`20END; X`20`20`20`20input_nam`5E.nam$b_ver`20:=`200; X`20`20END; X X`20`20build_filename(output_fab.fab$b_dns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_dna,`20inp Vut_nam`5E); X X`7B`20Find`20the`20definitive`20target`20filename.`20`7D X X`20`20output_nam`5E.nam$b_nop`20:=`200; X X`20`20$parse(output_fab,`20,`20); X`20`20IF`20(NOT`20ODD`20(output_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_parseout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_esl,`20output_nam V`5E.nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_sts); X`20`20END; X X`7B`20If`20necessary,`20get`20user`20confirmation`20of`20copy.`20`7D X X`20`20IF`20(Confirm)`20THEN X`20`20BEGIN X`20`20`20`20ok`20:=`20ok_to_copy( X`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_rsl,`20input_nam`5E.nam$l_ Vrsa, X`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_esl,`20output_nam`5E.nam$ Vl_esa, X`20`20`20`20`20`20`20`20`20`20`20First_block); X`20`20`20`20IF`20(ok`20=`20OK_NO)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20copy_one_file`20:=`20TRUE; X`20`20`20`20`20`20GOTO`20copy_one_file_return; X`20`20`20`20END X`20`20`20`20ELSE`20IF`20(ok`20=`20OK_ALL)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20Confirm`20:=`20FALSE; X`20`20`20`20END X`20`20`20`20ELSE`20IF`20(ok`20=`20OK_QUIT)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20copy_one_file`20:=`20FALSE; X`20`20`20`20`20`20GOTO`20copy_one_file_return; X`20`20`20`20END; X`20`20END; X X`20`20$open(input_fab,`20,`20); X`20`20IF`20(NOT`20ODD`20(input_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_openin,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_esl,`20input_nam`5E. Vnam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_sts); X`20`20END; X X`20`20blocks_per_io`20:=`20Rms_iosize; X`20`20blocksize`20:=`20DISK_BLOCKSIZE; X X`20`20input_rab.rab$w_usz`20:=`20blocksize`20*`20blocks_per_io; X X`20`20$connect(input_rab,`20,`20); X`20`20IF`20(NOT`20ODD`20(input_rab.rab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_rab.rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_rab.rab$l_stv); X`20`20END; X X`7B`20Actual`20last`20block`20of`20input`20file`20is`20now`20in`20the`20XAB. V`20`7D X X`20`20file_allocation`20:=`20input_xabfhc`5E.xab$l_ebk::INTEGER; X`20`20IF`20(NOT`20Last_block_seen)`20THEN X`20`20BEGIN X`20`20`20`20Last_block`20:=`20file_allocation; X`20`20END; X X`7B`20If`20we`20have`20not`20explicitly`20specified`20a`20trace`20interval,`20 Vuse`2010%`20of`20the`20file.`20`7D X X`20`20IF`20((trace)`20AND`20(NOT`20Interval_seen))`20THEN X`20`20BEGIN X`20`20`20`20Interval`20:=`20(file_allocation`20+`20NTRACES`20-`201)`20DIV`20NT VRACES; X`20`20END; X X`7B`20Interval`20(explicit`20or`20implicit)`20must`20be`20multiple`20of`20RMS V`20transfer`20size.`20`7D X X`20`20IF`20((Interval`20MOD`20blocks_per_io)`20>`200)`20THEN X`20`20BEGIN X`20`20`20`20Interval`20:=`20((Interval`20DIV`20blocks_per_io)`20+`201)`20*`20b Vlocks_per_io; X`20`20END; X X`20`20$parse(output_fab,`20,`20); X`20`20IF`20(NOT`20ODD`20(output_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_parseout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_esl,`20output_nam V`5E.nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_sts); X`20`20END; X X`7B`20Open`20a`20new`20output`20file,`20or`20append`20to`20an`20old`20one.`20 V`7D X X`20`20IF`20(New_file)`20THEN X`20`20BEGIN X`20`20`20`20output_fab.fab$l_alq`20:=`20file_allocation; X`20`20`20`20output_fab.fab$b_bks`20:=`20input_fab.fab$b_bks; X`20`20`20`20output_fab.fab$w_deq`20:=`20input_fab.fab$w_deq; X X`20`20`20`20output_fab.fab$l_fop`20:=`20input_fab.fab$l_fop; X`20`20`20`20output_fab.fab$l_fop`20:=`20UOR(output_fab.fab$l_fop,`20FAB$M_TEF) V; X`20`20`20`20output_fab.fab$l_fop`20:=`20UOR(output_fab.fab$l_fop,`20FAB$M_CBT) V; X X`20`20`20`20output_fab.fab$b_fsz`20:=`20input_fab.fab$b_fsz; X`20`20`20`20output_fab.fab$w_gbc`20:=`20input_fab.fab$w_gbc; X`20`20`20`20output_fab.fab$l_mrn`20:=`20input_fab.fab$l_mrn; X`20`20`20`20output_fab.fab$w_mrs`20:=`20input_fab.fab$w_mrs; X`20`20`20`20output_fab.fab$b_org`20:=`20input_fab.fab$b_org; X`20`20`20`20output_fab.fab$b_rat`20:=`20input_fab.fab$b_rat; X`20`20`20`20output_fab.fab$b_rfm`20:=`20input_fab.fab$b_rfm; X X`20`20`20`20output_xabfhc`5E.xab$w_lrl`20:=`20input_xabfhc`5E.xab$w_lrl; X`20`20`20`20$create(output_fab,`20,`20); X`20`20`20`20output_rab.rab$l_bkt`20:=`200; X`20`20END X`20`20ELSE X`20`20BEGIN X`20`20`20`20$open(output_fab,`20,`20); X`20`20`20`20output_rab.rab$l_bkt`20:=`20First_block; X`20`20END; X X`20`20IF`20(NOT`20ODD`20(output_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_openout,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_esl,`20output_nam V`5E.nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_sts); X`20`20END; X X`20`20$connect(output_rab,`20,`20); X`20`20IF`20(NOT`20ODD`20(output_rab.rab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_rab.rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_rab.rab$l_stv); X`20`20END; X X`20`20IF`20(Trace)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(New_file)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$signal(xcopy_starting,`204, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_rsl,`20i Vnput_nam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_rsl,`20 Voutput_nam`5E.nam$l_rsa); X`20`20`20`20END X`20`20`20`20ELSE X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$signal(xcopy_resuming,`205, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_rsl,`20i Vnput_nam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_rsl,`20 Voutput_nam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20First_block); X`20`20`20`20END; X`20`20END; X X`7B`20Copy`20each`20block`20in`20turn.`20This`20might`20fail`20after`20each`20 Vread`20or`20write;`20if`20it`20`7D X`7B`20`20does,`20output`20a`20message`20saying`20how`20far`20we`20got`20before V`20the`20failure.`20`7D X X`20`20end_block`20:=`20First_block`20-`201; X`20`20WHILE`20(end_block`20<`20Last_block)`20DO X`20`20BEGIN X`20`20`20`20start_block`20:=`20end_block`20+`201; X X`20`20`20`20IF`20($read(input_rab,`20,`20)`20=`20RMS$_EOF)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20`7B`20we`20shouldn't`20hit`20this.`20`7D X`20`20`20`20`20`20`7BBREAK`7D`20GOTO`20break_read_write_loop; X`20`20`20`20END; X X`20`20`20`20create_symbol(block_symbol_name,`20start_block); X X`20`20`20`20IF`20(NOT`20ODD`20(input_rab.rab$l_sts))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(xcopy_readfail,`203, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20start_block, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_rsl,`20input_n Vam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_rab.rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_rab.rab$l_stv); X`20`20`20`20END; X X`7B`20Actual`20end`20block`20depends`20on`20how`20many`20(partial)`20blocks`20 Vwe`20were`20able`20to`20read.`20`7D X X`20`20`20`20end_block`20:=`20start_block`20+`20((input_rab.rab$w_rsz`20-`201) V`20DIV`20blocksize); X X`7B`20Next`20time,`20read`20the`20NEXT`20bucket,`20regardless`20of`20what`20we V`20read`20the`20first`20time.`20`7D X X`20`20`20`20input_rab.rab$l_bkt`20:=`200; X X`7B`20Write`20as`20many`20bytes`20as`20we`20read.`20`7D X X`20`20`20`20output_rab.rab$w_rsz`20:=`20input_rab.rab$w_rsz; X`20`20`20`20$write(output_rab,`20,`20); X X`20`20`20`20IF`20(NOT`20ODD`20(output_rab.rab$l_sts))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(xcopy_writefail,`203, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20start_block, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_rsl,`20output V_nam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_rab.rab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_rab.rab$l_stv); X`20`20`20`20END; X X`20`20`20`20output_rab.rab$l_bkt`20:=`200; X X`7B`20If`20we`20have`20just`20processed`20the`20appropriate`20number`20of`20bl Vocks,`20output`20`7D X`7B`20`20a`20trace`20message`20(if`20required).`20`7D X X`20`20`20`20IF`20(`20`20`20`20`20(Trace) X`20`20`20`20`20`20`20`20`20AND`20(Interval`20>`200) X`20`20`20`20`20`20`20`20`20AND`20(((end_block`20-`20(First_block`20-`201))`20M VOD`20Interval)`20=`200) X`20`20`20`20`20`20`20)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$signal(xcopy_trace,`201,`20end_block); X`20`20`20`20END; X`20`20END; X X`20`20`7BBREAK`7D`20break_read_write_loop: X X`20`20$close(output_fab,`20,`20); X`20`20IF`20(NOT`20ODD`20(output_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_stv); X`20`20END; X X`20`20$close(input_fab,`20,`20); X`20`20IF`20(NOT`20ODD`20(input_fab.fab$l_sts))`20THEN X`20`20BEGIN X`20`20`20`20lib$stop(xcopy_miscerr,`201, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_sts, X`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_stv); X`20`20END; X X`20`20IF`20((log)`20OR`20(trace))`20THEN X`20`20BEGIN X`20`20`20`20lib$signal(xcopy_copied,`205, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam`5E.nam$b_rsl,`20input_n Vam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_nam`5E.nam$b_rsl,`20output V_nam`5E.nam$l_rsa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20end_block); X`20`20END; X X`20`20copy_one_file`20:=`20TRUE; X X`20`20copy_one_file_return: XEND; X X`7B-`20main`20-`7D X XPROCEDURE`20main; X XCONST X`20`20CLI$_ABSENT`20`20=`20%X'000381F0'; X`20`20CLI$_PRESENT`20=`20%X'0003FD19'; X XVAR X`20`20input_fab`20`20`20`20`20`20`20:`20FAB$TYPE; X`20`20input_nam`20`20`20`20`20`20`20:`20NAM$TYPE; X`20`20old_input_nam`20`20`20:`20NAM$TYPE; X`20`20input_xabfhc`20`20`20`20:`20XAB$TYPE; X`20`20output_fab`20`20`20`20`20`20:`20FAB$TYPE; X`20`20output_nam`20`20`20`20`20`20:`20NAM$TYPE; X`20`20output_xabfhc`20`20`20:`20XAB$TYPE; X X`20`20input_expname`20`20`20:`20chars; X`20`20input_resname`20`20`20:`20chars; X`20`20input_defname`20`20`20:`20chars; X`20`20input_filename`20`20:`20chars; X`20`20output_expname`20`20:`20chars; X`20`20output_resname`20`20:`20chars; X`20`20output_defname`20`20:`20chars; X`20`20output_filename`20:`20chars; X X`20`20infile`20`20`20`20`20`20`20`20`20`20:`20string; X`20`20outfile`20`20`20`20`20`20`20`20`20:`20string; X`20`20value`20`20`20`20`20`20`20`20`20`20`20:`20string; X`20`20retlen`20`20`20`20`20`20`20`20`20`20:`20UNSIGNED; X`20`20start_fileno`20`20`20`20:`20INTEGER; X`20`20actual_fileno`20`20`20:`20INTEGER; X`20`20tblock`20`20`20`20`20`20`20`20`20`20:`20INTEGER; X`20`20first_filespec`20`20:`20BOOLEAN; X`20`20len`20`20`20`20`20`20`20`20`20`20`20`20`20:`20INTEGER; X`20`20output_dir_wild`20:`20BOOLEAN; X`20`20defspec`20`20`20`20`20`20`20`20`20:`20string; X X`20`20xcopy_openin`20`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_parsein`20`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X`20`20xcopy_parseout`20`20:`20`5BEXTERNAL`5D`20UNSIGNED; X XLABEL X`20`20break_search_loop, X`20`20break_filespec_loop; X XBEGIN X X`7B`20Get`20the`20command`20line`20parameters.`20`7D X X`20`20IF`20(cli$present('P1')`20=`20CLI$_ABSENT)`20THEN X`20`20BEGIN X`20`20`20`20panic('get_args:`20no`20parameter`20P1'); X`20`20END; X X`20`20IF`20(cli$present('P1')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(cli$get_value('P2',`20outfile,`20retlen)`20=`20CLI$_ABSENT) V`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20panic('get_args:`20problem`20with`20P2'); X`20`20`20`20END; X`20`20END X`20`20ELSE X`20`20BEGIN X`20`20`20`20panic('get_args:`20no`20parameter`20P2'); X`20`20END; X X`20`20First_block`20:=`200; X`20`20IF`20(cli$present('FIRST_BLOCK')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(cli$get_value('FIRST_BLOCK',`20value,`20retlen)`20<>`20SS$_N VORMAL)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20panic('get_args:`20problem`20with`20/FIRST_BLOCK'); X`20`20`20`20END; X`20`20`20`20READV(value,`20First_block); X`20`20END; X X`20`20New_file`20:=`20(First_block`20=`200); X`20`20IF`20(New_file)`20THEN X`20`20BEGIN X`20`20`20`20First_block`20:=`201; X`20`20END; X X`20`20Last_block`20:=`20%X'7FFFFFFF'; X`20`20Last_block_seen`20:=`20FALSE; X`20`20IF`20(cli$present('LAST_BLOCK')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(cli$get_value('LAST_BLOCK',`20value,`20retlen)`20<>`20SS$_NO VRMAL)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20panic('get_args:`20problem`20with`20/LAST_BLOCK'); X`20`20`20`20END; X`20`20`20`20READV(value,`20Last_block); X`20`20`20`20Last_block_seen`20:=`20TRUE; X`20`20END; X X`20`20Start_fileno`20:=`201; X`20`20IF`20(cli$present('WILD_FILE')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(cli$get_value('WILD_FILE',`20value,`20retlen)`20<>`20SS$_NOR VMAL)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20panic('get_args:`20problem`20with`20/WILD_FILE'); X`20`20`20`20END; X`20`20`20`20READV(value,`20Start_fileno); X`20`20END; X X`20`20Log`20:=`20FALSE; X`20`20IF`20(cli$present('LOG')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20Log`20:=`20TRUE; X`20`20END; X X`20`20Confirm`20:=`20FALSE; X`20`20IF`20(cli$present('CONFIRM')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20Confirm`20:=`20TRUE; X`20`20END; X X`20`20Trace`20:=`20FALSE; X`20`20Interval_seen`20:=`20FALSE; X`20`20IF`20(cli$present('TRACE')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20Trace`20:=`20TRUE; X`20`20`20`20IF`20(cli$get_value('TRACE',`20value,`20retlen)`20=`20SS$_NORMAL) V`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20READV(value,`20Interval); X`20`20`20`20`20`20Interval_seen`20:=`20TRUE; X`20`20`20`20END; X`20`20END; X X`20`20Rms_iosize`20:=`20RMS_IOSIZE_DEFAULT; X`20`20IF`20(cli$present('RMS_IOSIZE')`20=`20CLI$_PRESENT)`20THEN X`20`20BEGIN X`20`20`20`20IF`20(cli$get_value('RMS_IOSIZE',`20value,`20retlen)`20<>`20SS$_NO VRMAL)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20panic('get_args:`20problem`20with`20RMS_IOSIZE'); X`20`20`20`20END; X`20`20`20`20READV(value,`20Rms_iosize); X`20`20END; X X`20`20IF`20(Rms_iosize`20<`20RMS_IOSIZE_MIN)`20THEN X`20`20BEGIN X`20`20`20`20Rms_iosize`20:=`20RMS_IOSIZE_MIN; X`20`20END; X X`20`20IF`20(Rms_iosize`20>`20RMS_IOSIZE_MAX)`20THEN X`20`20BEGIN X`20`20`20`20Rms_iosize`20:=`20RMS_IOSIZE_MAX; X`20`20END; X X`7B`20Set`20up`20the`20FABs`20and`20related`20blocks.`20`7D X X`20`20input_fab.fab$b_bid`20:=`20FAB$C_BID; X`20`20input_fab.fab$b_bln`20:=`20FAB$C_BLN; X`20`20input_fab.fab$b_fac`20:=`20(UOR(FAB$M_BIO,`20FAB$M_GET))::$UBYTE; X`20`20input_fab.fab$b_shr`20:=`20FAB$M_UPI; X`20`20input_fab.fab$l_fna`20:=`20IADDRESS(input_filename); X`20`20input_fab.fab$l_fop`20:=`20FAB$M_NAM; X`20`20input_fab.fab$l_nam`20:=`20IADDRESS(input_nam); X`20`20input_fab.fab$l_xab`20:=`20IADDRESS(input_xabfhc); X`20`20input_fab.fab$w_ifi`20:=`200; X`20`20input_fab.fab$l_dna`20:=`20IADDRESS(input_defname); X`20`20input_fab.fab$b_dns`20:=`200; X`20`20input_fab.fab$v_lnm_mode`20:=`200; X X`20`20input_nam.nam$b_bid`20:=`20NAM$C_BID; X`20`20input_nam.nam$b_bln`20:=`20NAM$C_BLN; X`20`20input_nam.nam$l_esa`20:=`20IADDRESS(input_expname); X`20`20input_nam.nam$b_ess`20:=`20slen; X`20`20input_nam.nam$l_rsa`20:=`20IADDRESS(input_resname); X`20`20input_nam.nam$b_rss`20:=`20slen; X`20`20input_nam.nam$l_rlf`20:=`200; X X`20`20input_xabfhc.xab$b_bln`20:=`20XAB$C_FHCLEN; X`20`20input_xabfhc.xab$b_cod`20:=`20XAB$C_FHC; X`20`20input_xabfhc.xab$l_nxt`20:=`200; X X`20`20output_fab.fab$b_bid`20:=`20FAB$C_BID; X`20`20output_fab.fab$b_bln`20:=`20FAB$C_BLN; X`20`20output_fab.fab$b_fac`20:=`20(UOR(FAB$M_BIO,`20FAB$M_PUT))::$UBYTE; X`20`20output_fab.fab$b_shr`20:=`20FAB$M_NIL; X`20`20output_fab.fab$w_ifi`20:=`200; X`20`20output_fab.fab$l_fna`20:=`20IADDRESS(output_filename); X`20`20output_fab.fab$l_xab`20:=`20IADDRESS(output_xabfhc); X`20`20output_fab.fab$l_fop`20:=`20FAB$M_NAM; X`20`20output_fab.fab$l_nam`20:=`20IADDRESS(output_nam); X`20`20output_fab.fab$l_dna`20:=`20IADDRESS(output_defname); X`20`20output_fab.fab$v_lnm_mode`20:=`200; X X`20`20output_nam.nam$b_bid`20:=`20NAM$C_BID; X`20`20output_nam.nam$b_bln`20:=`20NAM$C_BLN; X`20`20output_nam.nam$l_esa`20:=`20IADDRESS(output_expname); X`20`20output_nam.nam$b_ess`20:=`20slen; X`20`20output_nam.nam$l_rsa`20:=`20IADDRESS(output_resname); X`20`20output_nam.nam$b_rss`20:=`20slen; X`20`20output_nam.nam$l_rlf`20:=`200; X X`20`20output_xabfhc.xab$b_bln`20:=`20XAB$C_FHCLEN; X`20`20output_xabfhc.xab$b_cod`20:=`20XAB$C_FHC; X`20`20output_xabfhc.xab$l_nxt`20:=`200; X X`20`20defspec`20:=`20HERE; X X`20`20first_filespec`20:=`20TRUE; X`20`20WHILE`20(cli$get_value('P1',`20infile,`20retlen)`20<>`20CLI$_ABSENT)`20D VO X`20`20BEGIN X`20`20`20`20memcpy(input_fab.fab$l_fna,`20IADDRESS(infile.BODY),`20LENGTH(infi Vle)); X`20`20`20`20input_fab.fab$b_fns`20:=`20LENGTH(infile); X X`7B`20Split`20out`20the`20fields`20of`20the`20input`20filename.`20`7D X X`20`20`20`20input_nam.nam$b_nop`20:=`20NAM$M_SYNCHK; X X`20`20`20`20$parse(input_fab,`20,`20); X`20`20`20`20IF`20(NOT`20ODD`20(input_fab.fab$l_sts))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(xcopy_parsein,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$b_fns,`20input_fab. Vfab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_sts); X`20`20`20`20END; X X`7B`20If`20this`20is`20the`20second`20or`20subsequent`20filespec,`20apply`20de Vfaults`20from`20before.`20`7D X X`20`20`20`20IF`20(NOT`20first_filespec)`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20IF`20(input_nam.nam$b_node`20=`200)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20input_nam.nam$b_node`20:=`20old_input_nam.nam$b_node; V X`20`20`20`20`20`20`20`20memcpy(input_nam.nam$l_node,`20old_input_nam.nam$l_nod Ve, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_node); X`20`20`20`20`20`20END; X X`20`20`20`20`20`20IF`20(input_nam.nam$b_dev`20=`200)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20input_nam.nam$b_dev`20:=`20old_input_nam.nam$b_dev; X`20`20`20`20`20`20`20`20memcpy(input_nam.nam$l_dev,`20old_input_nam.nam$l_dev, V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_dev); X`20`20`20`20`20`20END; X X`20`20`20`20`20`20IF`20(input_nam.nam$b_dir`20=`200)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20input_nam.nam$b_dir`20:=`20old_input_nam.nam$b_dir; X`20`20`20`20`20`20`20`20memcpy(input_nam.nam$l_dir,`20old_input_nam.nam$l_dir, V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_dir); X`20`20`20`20`20`20END; X X`20`20`20`20`20`20IF`20(input_nam.nam$b_name`20=`200)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20input_nam.nam$b_name`20:=`20old_input_nam.nam$b_name; V X`20`20`20`20`20`20`20`20memcpy(input_nam.nam$l_name,`20old_input_nam.nam$l_nam Ve, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_name); X`20`20`20`20`20`20END; X X`20`20`20`20`20`20IF`20(input_nam.nam$b_type`20=`200)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20input_nam.nam$b_type`20:=`20old_input_nam.nam$b_type; V X`20`20`20`20`20`20`20`20memcpy(input_nam.nam$l_type,`20old_input_nam.nam$l_typ Ve, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_type); X`20`20`20`20`20`20END; X`20`20`20`20END; X X`7B`20Remember`20the`20defaults`20for`20next`20time`20round.`20`7D X X`20`20`20`20old_input_nam`20:=`20input_nam; X X`7B`20Now`20rebuild`20the`20filename`20using`20the`20previous`20defaults.`20 V`7D X X`20`20`20`20build_filename(input_fab.fab$b_dns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_dna, V`20input_nam); X X`20`20`20`20input_nam.nam$b_nop`20:=`200; X X`20`20`20`20$parse(input_fab,`20,`20); X`20`20`20`20IF`20(NOT`20ODD`20(input_fab.fab$l_sts))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(xcopy_parsein,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$b_fns,`20input_fab. Vfab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_sts); X`20`20`20`20END; X X`7B`20Split`20out`20the`20fields`20of`20the`20output`20filename,`20using`20a V`20simple`20default.`20`7D X X`20`20`20`20memcpy(output_fab.fab$l_fna,`20IADDRESS(outfile.BODY),`20LENGTH(ou Vtfile)); X`20`20`20`20output_fab.fab$b_fns`20:=`20LENGTH(outfile); X X`20`20`20`20memcpy(output_fab.fab$l_dna,`20IADDRESS(defspec.BODY),`20LENGTH(de Vfspec)); X`20`20`20`20output_fab.fab$b_dns`20:=`20LENGTH(defspec); X`20`20`20`20output_nam.nam$b_nop`20:=`20NAM$M_SYNCHK; X X`20`20`20`20$parse(output_fab,`20,`20); X`20`20`20`20IF`20(NOT`20ODD`20(output_fab.fab$l_sts))`20THEN X`20`20`20`20BEGIN X`20`20`20`20`20`20lib$stop(xcopy_parseout,`202,`20output_fab.fab$b_fns,`20outp Vut_fab.fab$l_fna, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_sts); X`20`20`20`20END; X X`7B`20Remove`20wildcards`20from`20output`20filespec`20(we`20use`20input`20file Vspec`20as`20default.`20`7D X X`20`20`20`20output_dir_wild`20:=`20FALSE; X`20`20`20`20IF`20(UAND(output_nam.nam$l_fnb,`20NAM$M_WILD_DIR)`20<>`200)`20THE VN X`20`20`20`20BEGIN X`20`20`20`20`20`20output_nam.nam$b_dir`20:=`200; X`20`20`20`20`20`20output_dir_wild`20:=`20TRUE; X`20`20`20`20END; X X`20`20`20`20IF`20(UAND(output_nam.nam$l_fnb,`20NAM$M_WILD_NAME)`20<>`200)`20TH VEN X`20`20`20`20BEGIN X`20`20`20`20`20`20output_nam.nam$b_name`20:=`200; X`20`20`20`20END; X X`20`20`20`20IF`20(UAND(output_nam.nam$l_fnb,`20NAM$M_WILD_TYPE)`20<>`200)`20TH VEN X`20`20`20`20BEGIN X`20`20`20`20`20`20output_nam.nam$b_type`20:=`200; X`20`20`20`20END; X X`20`20`20`20IF`20(UAND(output_nam.nam$l_fnb,`20NAM$M_WILD_VER)`20<>`200)`20THE VN X`20`20`20`20BEGIN X`20`20`20`20`20`20output_nam.nam$b_ver`20:=`200; X`20`20`20`20END; X X`20`20`20`20build_filename(output_fab.fab$b_fns, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output_fab.fab$l_fna, V`20output_nam); X X`20`20`20`20actual_fileno`20:=`200; X X`20`20`20`20WHILE`20(TRUE)`20DO X`20`20`20`20BEGIN X`20`20`20`20`20`20$search(input_fab,`20,`20); X`20`20`20`20`20`20IF`20(input_fab.fab$l_sts`20=`20RMS$_NMF)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20`7BBREAK`7D`20GOTO`20break_search_loop; X`20`20`20`20`20`20END X`20`20`20`20`20`20ELSE`20IF`20(NOT`20ODD`20(input_fab.fab$l_sts))`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20lib$stop(xcopy_openin,`202, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_nam.nam$b_esl,`20inpu Vt_nam.nam$l_esa, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20input_fab.fab$l_sts); X`20`20`20`20`20`20END; X`20`20`20`20`20`20actual_fileno`20:=`20actual_fileno`20+`201; X`20`20`20`20`20`20IF`20(actual_fileno`20>=`20start_fileno)`20THEN X`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20create_symbol(file_symbol_name,`20actual_fileno); X`20`20`20`20`20`20`20`20IF`20(New_file)`20THEN X`20`20`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20`20`20tblock`20:=`200; X`20`20`20`20`20`20`20`20END X`20`20`20`20`20`20`20`20ELSE X`20`20`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20`20`20tblock`20:=`20First_block; X`20`20`20`20`20`20`20`20END; X`20`20`20`20`20`20`20`20create_symbol(block_symbol_name,`20tblock); X X`20`20`20`20`20`20`20`20IF`20(NOT`20copy_one_file(actual_fileno,`20input_fab, V`20output_fab, 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`20 V`20`20`20`20output_dir_wild))`20THEN X`20`20`20`20`20`20`20`20BEGIN X`20`20`20`20`20`20`20`20`20`20`7BBREAK`7D`20GOTO`20break_filespec_loop; X`20`20`20`20`20`20`20`20END; X X`20`20`20`20`20`20`20`20create_symbol(file_symbol_name,`20actual_fileno`20+`20 V1); X`20`20`20`20`20`20`20`20create_symbol(block_symbol_name,`200);`20`20`20`20`20 V`20`20`20First_block`20:=`201; X`20`20`20`20`20`20`20`20New_file`20:=`20TRUE; X`20`20`20`20`20`20END; X`20`20`20`20END; X X`20`20`20`20`7BBREAK`7D`20break_search_loop: X X`7B`20End`20of`20processing`20for`20one`20filespec.`20`7D X X`20`20`20`20first_filespec`20:=`20FALSE; X`20`20END; X X`20`20`7BBREAK`7D`20break_filespec_loop: X X`7B`20Finished`20processing`20all`20input`20filespecs.`20`7D X X`20`20create_symbol(file_symbol_name,`20actual_fileno`20+`201); X`20`20create_symbol(block_symbol_name,`200); XEND; X X`7B-`20main`20program`20-`7D X XBEGIN X`20`20main; XEND. $ call unpack XCOPY.PAS;1 1761740044 "" 50 5 7 $! $ create 'f' X$`20cc`20xcopy X$`20message`20xcopymsg X$`20link`20/notrace`20xcopy`20/opt $ call unpack XCOPYBLD.COM;1 185620914 "" 1 6 7 $! $ create 'f' X.facility`20`20`20`20`20`20`20xcopy,`201 X X.severity`09success XCOPIED`20`20`20`20`20`20`20`20`20`20/FAO=3 X X.severity`09informational XTRACE`20`20`20`20`20`20`20`20`20`20`20/FA VO=1 XSTARTING`20`20`20`20`20`20`20`20/FAO=2 V XRESUMING`20`20`20`20`20`20`20`20/FAO=3 X X.severity`20`20`20`20`20`20`20error XPARSEIN`20`20`20`20`20`20`20`20`20/F VAO=1 XOPENIN`20`20`20`20`20`20`20`20`20`20/FAO=1 V XOPENOUT`20`20`20`20`20`20`20`20`20/FAO=1 V XPARSEOUT`20`20`20`20`20`20`20`20/FAO=1 XMISCERR`20`20`20`20`20`20`20`20`20/ VFAO=1 XREADFAIL`20`20`20`20`20`20`20`20/FA VO=2 XWRITEFAIL`20`20`20`20`20`20`20/FAO= V2 X X.severity`09fatal XPANIC`20`20`20`20`20`20`20`20`20`20`20/FAO=1 X X.end $ call unpack XCOPYMSG.MSG;1 85472855 "" 2 7 7 $ v=f$verify(v) $ exit