i/copyb

Home Manual Packages Global Index Keywords Quick Reference |
    /*
       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;
    }