diff options
Diffstat (limited to 'pkg/tbtables/tbtscd.x')
-rw-r--r-- | pkg/tbtables/tbtscd.x | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/pkg/tbtables/tbtscd.x b/pkg/tbtables/tbtscd.x new file mode 100644 index 00000000..3c57c8ac --- /dev/null +++ b/pkg/tbtables/tbtscd.x @@ -0,0 +1,58 @@ +include <mach.h> +include <tbset.h> +include "tbtables.h" +define SZ_PACKED_REC (SZ_PARREC/SZB_CHAR) # size of packed par record + +# tbtscd -- copy to change size; column descriptors +# This routine copies the column-descriptor portion of one table to another. +# Old_ncols is the number of columns defined in the input table. +# This is called by either tbxscp or tbyscp. +# +# Phil Hodge, 1-Apr-1993 Change cbuf from TY_STRUCT to TY_CHAR. +# Phil Hodge, 14-Apr-1998 Change SZ_COLSTRUCT to SZ_COLDEF. + +procedure tbtscd (tp, oldfd, newfd, old_maxpar, old_ncols) + +pointer tp # i: pointer to table descriptor +int oldfd, newfd # i: channel numbers for input & output tables +int old_maxpar # i: previous maximum number of user parameters +int old_ncols # i: previous number of columns +#-- +pointer sp +pointer cbuf # column-descriptor buffer +long oldoff, newoff # offsets from start of old & new files +int cbufsiz # size of buffer pointed to by cbuf +int k # loop index +int stat +char zero +int read() +errchk seek, read, write + +begin + # Create buffer for I/O + call smark (sp) + cbufsiz = SZ_COLDEF # unit = SZ_CHAR + call salloc (cbuf, cbufsiz, TY_CHAR) + + # Copy each column descriptor to the temporary file. + oldoff = SZ_SIZINFO + old_maxpar * SZ_PACKED_REC + 1 + newoff = SZ_SIZINFO + TB_MAXPAR(tp) * SZ_PACKED_REC + 1 + do k = 1, old_ncols { + call seek (oldfd, oldoff) + call seek (newfd, newoff) + stat = read (oldfd, Memc[cbuf], SZ_COLDEF) + call write (newfd, Memc[cbuf], SZ_COLDEF) + oldoff = oldoff + SZ_COLDEF + newoff = newoff + SZ_COLDEF + } + # Fill out the rest of the space for column descriptors. + zero = 0 + call amovkc (zero, Memc[cbuf], SZ_COLDEF) + do k = old_ncols+1, TB_MAXCOLS(tp) { + call seek (newfd, newoff) + call write (newfd, Memc[cbuf], SZ_COLDEF) + newoff = newoff + SZ_COLDEF + } + + call sfree (sp) +end |