/*
   COPYB.I
   Utility to copy binary files.

   $Id: copyb.i,v 1.1 1993/08/27 18:50:06 munro Exp $
 */
/*    Copyright (c) 1994.  The Regents of the University of California.
                    All rights reserved.  */

func copyb(src, dst, size=)
/* DOCUMENT copyb, src, dst
         or copyb, openb(src_name), createb(dst_name)
     Copy binary file SRC to binary file DST.
     Check for "obsolete/" subdirectory of Yorick home directory for
     extensions of the openb function to old file formats.
     Use the size= keyword to specify a non-default (4 Mbyte) size for
     the members of the output file family.
     If you habitually include basfix.i, you may want to use the
     basfix_openb function to open the src file.
   SEE ALSO: openb, createb, open102, close102
 */
{
  vars= get_vars(src);
  /* sort the variables into order of increasing address */
  addrs= get_addrs(src);

  /* declare and copy non-record variables */
  names= *vars(1);
  n= numberof(names);
  if (n) names= names(sort(*addrs(1)));
  for (i=1 ; i<=n ; i++) {
    name= names(i);
    value= get_member(src, name);
    add_variable, dst, -1, name, structof(value), dimsof(value);
    get_member(dst, name)= value;
    value= [];
  }

  names= *vars(2);
  n= numberof(names);
  if (n<1) return;
  names= names(sort(*addrs(2)));

  /* declare record variables */
  add_record, dst;
  if (size) set_filesize, dst, size;
  for (i=1 ; i<=n ; i++) {
    name= names(i);
    add_variable, dst, -1, name, structof(get_member(src, name)), \
      dimsof(get_member(src, name));
  }

  /* copy record variables for each record */
  times= get_times(src);
  ncycs= get_ncycs(src);
  time= ncyc= [];
  r= r0= 1;
  while (jt(src,-)) ++r0;
  while (jt(src)) {
    if (!is_void(times)) time= times(r);
    if (!is_void(ncycs)) ncyc= ncycs(r);
    add_record, dst, time, ncyc, -1;
    for (i=1 ; i<=n ; i++) {
      name= names(i);
      get_member(dst, name)= get_member(src, name);
    }
    r++;
  }
  if (r>1) jr, src, r0;
}
