STScI Logo


include <tbset.h>
define	SYNTAX		1

# TSORT -- Sort a table on several columns at once
# This task sorts an SDAS format table. The column or columns to sort on are
# given by the parameter columns, which is a list of column names or column
# name patterns separated by commas. The most significant column name is the
# first in the list, subsequent columns are used to break ties. There are two
# flags, ascend and casesens. If ascend is true, the first row in the output
# table holds the smallest value if the sorted column is numeric or the first
# string in alpahabetic order if the sorted column is a character string. If
# casesens is true, upper case characters precede lower case charaters in sort
# order. Otherwise, case is not significant in determining the sort order.
# B.Simon	25-Sep-87	First Code
# B.Simon	15-Jul-88	Set buffer size to max
# Phil Hodge	 7-Sep-88	Change parameter name for table.
# Phil Hodge	14-Nov-88	Set advice to sequential instead of
#					setting buffer size.
# B.Simon	05-Feb-90	Use new internal sort routine
# B.Simon	21-Feb-91	Use external sort routine
# Phil Hodge	 4-Oct-95	Use table name template routines tbnopenp, etc.

procedure t_tsort()

pointer	table			# Names of the tables to be sorted
pointer	columns			# Column name template
int	maxrow			# Maximum number of rows to sort internally
bool	ascend			# Ascending sort flag
bool	casesens		# Case sensitivity flag
int	numcol, nrow, numptr
pointer sp, tp, colptr, list

bool	clgetb()
int	tbnget()
pointer tbnopenp()
int	tbpsta()
int	tbl_maxrow()
pointer	tbtopn()

	# Allocate stack memory for strings

	call smark (sp)
	call salloc (table, SZ_FNAME, TY_CHAR)
	call salloc (columns, SZ_LINE, TY_CHAR)

	# Read the task parameters

	list = tbnopenp ("table")
	call clgstr ("columns", Memc[columns], SZ_LINE)
	ascend = clgetb ("ascend")
	casesens = clgetb ("casesens")

	# Loop over all table names in the file name template

	while (tbnget (list, Memc[table], SZ_FNAME) != EOF) {

	    # Open the table

	    tp = tbtopn (Memc[table], READ_WRITE, NULL)

	    # Set buffer size to a larger value.

	    call tbpset (tp, TBL_ADVICE, SEQUENTIAL)

	    # Create an array of column pointers from the column template

	    numcol = tbpsta (tp, TBL_NCOLS)
	    nrow = tbpsta (tp, TBL_NROWS)

	    call malloc (colptr, numcol, TY_INT)
	    call tctexp (tp, Memc[columns], numcol, numptr, Memi[colptr])

	    if (numptr == 0)
		call error (SYNTAX, "Column(s) not found in table")

	    # Choose between the internal and external sort routines
	    # Table is closed by sort routine

	    maxrow = tbl_maxrow (tp)
	    if (nrow <= maxrow)
		call tbl_intsort (tp, numptr, Memi[colptr], casesens, ascend)
		call tbl_extsort (tp, numptr, Memi[colptr], maxrow, 
				  casesens, ascend)

	    call mfree (colptr, TY_INT)


	# Close the filename template list

	call tbnclose (list)
	call sfree (sp)

Source Code · Search Form · STSDAS