diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/fmio/fmlfcopy.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'sys/fmio/fmlfcopy.x')
-rw-r--r-- | sys/fmio/fmlfcopy.x | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/sys/fmio/fmlfcopy.x b/sys/fmio/fmlfcopy.x new file mode 100644 index 00000000..db937a7b --- /dev/null +++ b/sys/fmio/fmlfcopy.x @@ -0,0 +1,118 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <syserr.h> +include <mach.h> +include "fmio.h" + +# FM_LFCOPY -- Copy an lfile, either to another lfile within the same +# datafile, or to another datafile. + +procedure fm_lfcopy (old, o_lfile, new, n_lfile) + +pointer old, new #I FMIO descriptors of source and destination +int o_lfile, n_lfile #I lfile numbers of source and dest. lfiles + +long offset +int n_szbpage +pointer sp, o_ft, n_ft, o_lf, n_lf, o_lfname, n_lfname, buf +int maxpages, maxbytes, nbytes, type, nleft, status + +errchk fmio_errchk, fmio_bind, syserrs +define olderr_ 91 +define newerr_ 92 + +begin + # Verify input. + if (o_lfile < 0 || o_lfile > FM_NLFILES(old)) + goto olderr_ + if (n_lfile < 0 || n_lfile > FM_NLFILES(new)) + goto newerr_ + + # Compute some useful values. + o_ft = FM_FTABLE(old) + n_ft = FM_FTABLE(new) + n_szbpage = FM_SZBPAGE(new) + maxpages = FM_MAXBUFSIZE(new) / n_szbpage + if (maxpages <= 0) + maxpages = DEF_BIGBUFNP + maxbytes = n_szbpage * maxpages + + # Copy the lfile. + o_lf = o_ft + o_lfile * LEN_FTE + n_lf = n_ft + n_lfile * LEN_FTE + + # Skip empty or deleted lfiles. + LF_FLAGS(n_lf) = and (LF_FLAGS(o_lf), not(LFF_DELETED)) + if (LF_FSIZE(o_lf) <= 0 || and(LF_FLAGS(o_lf),LFF_DELETED) != 0) + return + + # Get lfile type. + type = BINARY_FILE + if (and(LF_FLAGS(o_lf),LFF_TEXTFILE) != 0) + type = TEXT_FILE + + # Allocate buffers. + call smark (sp) + call salloc (o_lfname, SZ_FNAME, TY_CHAR) + call salloc (n_lfname, SZ_FNAME, TY_CHAR) + call salloc (buf, maxbytes / SZB_CHAR, TY_CHAR) + + # Open old lfile. + call fm_lfname (old, o_lfile, type, Memc[o_lfname], SZ_FNAME) + call strpak (Memc[o_lfname], Memc[o_lfname], SZ_FNAME) + call fm_lfopen (Memc[o_lfname], READ_ONLY, o_lf) + if (o_lf == ERR) + goto olderr_ + + # Open new lfile. + call fm_lfname (new, n_lfile, type, Memc[n_lfname], SZ_FNAME) + call strpak (Memc[n_lfname], Memc[n_lfname], SZ_FNAME) + call fm_lfopen (Memc[n_lfname], NEW_FILE, n_lf) + if (n_lf == ERR) + goto newerr_ + + # Copy the lfile data (as a binary file to avoid needless + # character unpack/pack). + + nleft = LF_FSIZE(o_lf) + for (offset=1; nleft > 0; offset=offset+nbytes) { + # Read a block of data. + call fm_lfbinread (o_lf, Memc[buf], maxbytes, offset) + call fm_lfbinwait (o_lf, nbytes) + if (nbytes == ERR) + goto olderr_ + else if (nbytes == 0) + break + + # Write to the new datafile. + call fm_lfbinwait (n_lf, status) + if (status == ERR) + goto newerr_ + call fm_lfbinwrite (n_lf, Memc[buf], nbytes, offset) + nleft = nleft - nbytes + } + + # Wait for the last write to terminate. + call fm_lfbinwait (n_lf, status) + if (status == ERR) + goto newerr_ + + # Close the lfiles. + call fm_lfclose (o_lf, status) + if (status == ERR) + goto olderr_ + call fm_lfclose (n_lf, status) + if (status == ERR) + goto newerr_ + + call fmio_errchk (old) + call fmio_errchk (new) + + call sfree (sp) + return + +olderr_ + call syserrs (SYS_FMLFCOPY, FM_DFNAME(old)) +newerr_ + call syserrs (SYS_FMLFCOPY, FM_DFNAME(new)) +end |