diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /pkg/utilities/nttools/threed/txtable/txtone.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/utilities/nttools/threed/txtable/txtone.x')
-rw-r--r-- | pkg/utilities/nttools/threed/txtable/txtone.x | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/threed/txtable/txtone.x b/pkg/utilities/nttools/threed/txtable/txtone.x new file mode 100644 index 00000000..d286523d --- /dev/null +++ b/pkg/utilities/nttools/threed/txtable/txtone.x @@ -0,0 +1,227 @@ +include <tbset.h> + +# TXTONE -- Extract 2D tables from a single input 3D table. +# +# +# This code is adapted from B.Simon's 04-Nov-94 version of tcopy. +# +# +# +# Revision history: +# ---------------- +# +# 22-Nov-1996 - Task created (I.Busko) +# 16-Dec-1996 - Add ORIG_ROW keyword (IB). +# 03-Jan-1997 - Revised after code review (IB) +# 17-Mar-1997 - Added selrows call (IB) +# 8-Apr-1999 - Call tbfpri (Phil Hodge) +# 8-Apr-2002 - Remove the call to whatfile (P. Hodge) + + +procedure txtone (input, output, verbose, compact) + +char input[ARB] # i: input table name +char output[ARB] # i: output table name +bool compact # i: put scalars in header ? +bool verbose # i: print operations ? +#-- +int numrow, numcol, numptr, type, irow, nrows +int phu_copied # set by tbfpri and ignored +pointer sp, root, extend, rowselect, colselect, colname, colunits, colfmt +pointer errmsg, itp, otp, colptr, newcol, pcode +pointer newname +bool suffix + +string nosect "Sections not permitted on output table name (%s)" +string nocols "Column names not found (%s)" + +errchk tbfpri, tbtopn, tctexp, tbracket, trsopen, trseval + +bool trseval(), streq() +int tbpsta(), selrows() +pointer tbtopn(), trsopen() + +begin + # Allocate memory for temporary strings. + call smark (sp) + call salloc (root, SZ_FNAME, TY_CHAR) + call salloc (newname, SZ_FNAME, TY_CHAR) + call salloc (extend, SZ_FNAME, TY_CHAR) + call salloc (rowselect, SZ_FNAME, TY_CHAR) + call salloc (colselect, SZ_FNAME, TY_CHAR) + call salloc (colname, SZ_COLNAME, TY_CHAR) + call salloc (colunits, SZ_COLUNITS, TY_CHAR) + call salloc (colfmt, SZ_COLFMT, TY_CHAR) + call salloc (errmsg, SZ_LINE, TY_CHAR) + + # Selectors are forbbiden on output. + call rdselect (output, Memc[root], Memc[rowselect], + Memc[colselect], SZ_FNAME) + if (Memc[rowselect] != EOS || Memc[colselect] != EOS) { + call sprintf (Memc[errmsg], SZ_LINE, nosect) + call pargstr (output) + call error (1, Memc[errmsg]) + } + + # Break input file name into bracketed selectors. + call rdselect (input, Memc[root], Memc[rowselect], + Memc[colselect], SZ_FNAME) + + # Open input table and get some info about it. + itp = tbtopn (Memc[root], READ_ONLY, NULL) + numrow = tbpsta (itp, TBL_NROWS) + numcol = tbpsta (itp, TBL_NCOLS) + + # Find how many rows were requested by row selector. + # If only one, turn off suffixing. Also do it in case + # ASCII output was requested. + nrows = selrows (itp, Memc[rowselect]) + if (nrows == 1) + suffix = false + else + suffix = true + if (streq (output, "STDOUT")) + suffix = false + + # Create array of column pointers from column selector. + call malloc (colptr, numcol, TY_INT) + call malloc (newcol, numcol, TY_INT) + call tcs_open (itp, Memc[colselect], Memi[colptr], numptr, numcol) + + # Take an error exit if no columns were matched. + if (numptr == 0) { + call sprintf (Memc[errmsg], SZ_LINE, nocols) + call pargstr (input) + call error (1, Memc[errmsg]) + } + + # Loop over selected rows on input table, creating + # a 2D output table for each row. + pcode = trsopen (itp, Memc[rowselect]) + do irow = 1, numrow { + if (trseval (itp, irow, pcode)) { + + # Append suffix to output name. + if (suffix) + call txtsuff (output, Memc[newname], irow) + else + call strcpy (output, Memc[newname], SZ_FNAME) + + if (verbose) { + call printf ("%s row=%d -> %s\n") + call pargstr (input) + call pargi (irow) + call pargstr (Memc[newname]) + call flush (STDOUT) + } + + # Open output table and set its type. + call tbfpri (Memc[root], Memc[newname], phu_copied) + otp = tbtopn (Memc[newname], NEW_FILE, NULL) + type = tbpsta (itp, TBL_WHTYPE) + if (streq (output, "STDOUT")) # ASCII output. + type = TBL_TYPE_TEXT + call tbpset (otp, TBL_WHTYPE, type) + + # Copy column information from input to output. + call txtcpyco (otp, colptr, newcol, numptr, colname, + colunits, colfmt, compact) + + # Create table and copy header. + call tbtcre (otp) + call tbhcal (itp, otp) + + # Copy row number into header. + call tbhadi (otp, "ORIG_ROW", irow) + + # Copy scalar columns into header. + if (compact) + call txtcpysc (otp, colptr, newcol, numptr, colname, + colunits, colfmt) + + # Copy number of columns into header. This is used + # by task that reads back 2D tables into 3D format. + if (compact) + call tbhadi (otp, "TCTOTAL", numptr) + + # Copy data to output table. + call txtcpy (itp, otp, irow, Memi[colptr], Memi[newcol], + numptr, compact) + + # Close output. + call tbtclo (otp) + } + } + + # Free arrays associated with columns. + call tcs_close (Memi[colptr], numptr) + call mfree (newcol, TY_INT) + call mfree (colptr, TY_INT) + + # Close row selector structure and input table. + call trsclose (pcode) + call tbtclo (itp) + + call sfree (sp) +end + + + + +# Appends sufix to output file name. + +procedure txtsuff (filename, newname, row) + +char filename[ARB] # i: output table name +char newname[ARB] # o: output table name with suffix +int row # i: row number + +pointer sp, ext, suffix +int dot, i, j + +int strcmp(), strldxs() + +begin + call smark (sp) + call salloc (suffix, SZ_LINE, TY_CHAR) + call salloc (ext, SZ_LINE, TY_CHAR) + + # Get rid of any appendages except the extension. + call imgcluster (filename, newname, SZ_FNAME) + + # Valid extensions are .tab, .fit and .fits + # Everything else is part of the root file name. + + # Detect extension. + Memc[ext] = EOS + dot = strldxs (".", newname) + if (dot != 0) { + i = dot + j = 0 + while (newname[i] != EOS) { + Memc[ext+j] = newname[i] + j = j + 1 + i = i + 1 + } + Memc[ext+j] = EOS + } + + # If valid extension, remove it from name. + if ( (strcmp (Memc[ext], ".tab") == 0) || + (strcmp (Memc[ext], ".fit") == 0) || + (strcmp (Memc[ext], ".fits") == 0) ) + newname[dot] = EOS + else + Memc[ext] = EOS + + # Build suffix. + call sprintf (Memc[suffix], SZ_LINE, "_r%04d") + call pargi (row) + + # Append suffix and extension to root name. + call strcat (Memc[suffix], newname, SZ_FNAME) + call strcat (Memc[ext], newname, SZ_FNAME) + + call sfree (sp) +end + |