aboutsummaryrefslogtreecommitdiff
path: root/pkg/tbtables/tbyscp.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /pkg/tbtables/tbyscp.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/tbtables/tbyscp.x')
-rw-r--r--pkg/tbtables/tbyscp.x91
1 files changed, 91 insertions, 0 deletions
diff --git a/pkg/tbtables/tbyscp.x b/pkg/tbtables/tbyscp.x
new file mode 100644
index 00000000..1572ce67
--- /dev/null
+++ b/pkg/tbtables/tbyscp.x
@@ -0,0 +1,91 @@
+include "tbtables.h"
+
+# tbyscp -- Y copy to change size
+# This routine copies the contents of one table to another for the purpose
+# of changing the size of the user-parameter space, the space for column
+# descriptors, and/or the row or column length of the table itself.
+# Old_maxpar, etc describe the characteristics of the input file,
+# while TB_MAXPAR(tp), etc describe the output file.
+# This is called by tbysiz.
+
+procedure tbyscp (tp, oldfd, newfd, old_maxpar,
+ old_maxcols, old_ncols, old_allrows)
+
+pointer tp # Pointer to table descriptor
+int oldfd, newfd # Channel numbers for input & output tables
+int old_maxpar # Previous maximum number of user parameters
+int old_maxcols # Previous value for maximum number of columns
+int old_ncols # Previous number of columns
+int old_allrows # Previous number of allocated rows
+
+pointer cp # pointer to a column descriptor
+pointer sp
+pointer sbuf # size info buffer
+pointer dbuf # buffer for copying table (data buffer)
+pointer extrabuf # buffer for filling out rest of column
+long oldoff, newoff # offsets from start of old & new files
+int new_allrows # = TB_ALLROWS(tp)
+int sbufsiz # size of buffer pointed to by sbuf
+int dbufsiz # size of buffer pointed to by dbuf
+int extrasiz # size of buffer pointer to by extrabuf
+int j, k # loop indexes
+int dlen # number of char in an element
+int stat
+pointer tbcnum()
+long tbtbod()
+int read()
+errchk seek, read, write
+
+begin
+ new_allrows = TB_ALLROWS(tp)
+
+ # Create buffers for I/O
+ call smark (sp)
+ sbufsiz = LEN_SIZINFO # unit = SZ_INT32
+ dbufsiz = min (new_allrows, old_allrows) # unit = SZ_CHAR
+ extrasiz = new_allrows - old_allrows
+ call salloc (sbuf, sbufsiz, TY_INT)
+ call salloc (dbuf, dbufsiz, TY_CHAR)
+ if (new_allrows > old_allrows)
+ call salloc (extrabuf, extrasiz, TY_CHAR)
+
+ # Write dummy size info record.
+ call amovki (0, Memi[sbuf], LEN_SIZINFO)
+ newoff = 1
+ call seek (newfd, newoff)
+ if (SZ_INT != SZ_INT32)
+ call ipak32 (Memi[sbuf], Memi[sbuf], SZ_SIZINFO)
+ call write (newfd, Memi[sbuf], SZ_SIZINFO)
+
+ # Copy each user parameter to the temporary file.
+ call tbtscu (tp, oldfd, newfd, old_maxpar)
+
+ # Copy each column descriptor to the temporary file.
+ call tbtscd (tp, oldfd, newfd, old_maxpar, old_ncols)
+
+ # Copy each column of the table to the temporary file.
+ oldoff = tbtbod (old_maxpar, old_maxcols)
+ newoff = tbtbod (TB_MAXPAR(tp), TB_MAXCOLS(tp))
+ do k = 1, old_ncols {
+ cp = tbcnum (tp, k)
+ dlen = COL_LEN(cp)
+ do j = 1, dlen {
+ call seek (oldfd, oldoff)
+ call seek (newfd, newoff)
+ stat = read (oldfd, Memc[dbuf], dbufsiz)
+ call write (newfd, Memc[dbuf], dbufsiz)
+ oldoff = oldoff + dbufsiz
+ newoff = newoff + dbufsiz
+ }
+ # Fill out the rest of the current column with dummy values.
+ if (new_allrows > old_allrows) {
+ do j = 1, dlen {
+ call seek (newfd, newoff)
+ call write (newfd, Memc[extrabuf], extrasiz)
+ newoff = newoff + extrasiz
+ }
+ }
+ }
+
+ call sfree (sp)
+end