aboutsummaryrefslogtreecommitdiff
path: root/sys/fmio/fmlfcopy.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fmio/fmlfcopy.x')
-rw-r--r--sys/fmio/fmlfcopy.x118
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