/*** File libwcs/wcscat.h
 *** February 15, 2013
 *** By Jessica Mink, jmink@cfa.harvard.edu
 *** Copyright (C) 1998-2013
 *** Smithsonian Astrophysical Observatory, Cambridge, MA, USA

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Correspondence concerning WCSTools should be addressed as follows:
           Internet email: jmink@cfa.harvard.edu
           Postal address: Jessica Mink
                           Smithsonian Astrophysical Observatory
                           60 Garden St.
                           Cambridge, MA 02138 USA
 */

#ifndef _wcscat_h_
#define _wcscat_h_
#define MAXNMAG	20

/* Data structure for SAO TDC ASCII and binary star catalog entries */
struct Star {
    float rdum;
    float xno;		/* Catalog number */
    double ra;		/* Right Ascension (degrees) */
    double dec;		/* Declination (degrees) */
    double errra;	/* Right Ascension (degrees) */
    double errdec;	/* Declination (degrees) */
    char isp[24];	/* Spectral type or other 2-char identifier */
    short mag[MAXNMAG+1]; /* Up to MAXNMAG Magnitudes * 100 */
    double rapm;	/* RA proper motion (degrees per year) */
    double decpm;	/* Dec proper motion (degrees per year) */
    double errpmr;	/* RA proper motion error (degrees per year) */
    double errpmd;	/* Dec proper motion error (degrees per year) */
    double xmag[MAXNMAG+1]; /* Up to MAXNMAG Magnitudes */
    double num;		/* Actual star number */
    int coorsys;	/* Coordinate system (WCS_J2000, WCS_B1950,...) */
    double equinox;	/* Equinox of coordinate system as fractional year */
    double epoch;	/* Epoch of position as fractional year */
    double parallax;	/* Parallax in arcseconds */
    double pxerror;	/* Parallax error in arcseconds */
    double radvel;	/* Radial velocity in km/sec, positive away */
    double dist;	/* Distance from search center in arcseconds */
    double size;	/* Semi-major axis in arcseconds */
    int nimage;		/* Number of images for catalog position */
    int ncat;		/* Number of catalogs for catalog proper motion */
    char *entry;	/* Line copied from input catalog */
    char objname[80];	/* Object name */
    char datapath[80];	/* File pathname to data */
    int peak;		/* Peak flux per pixel in star image */
};

/* Catalog proper motion units */
#define PM_MASYR		1	/* milliarcseconds per year */
#define PM_ARCSECYR		2	/* arcseconds per year */
#define PM_DEGYR		3	/* degrees per year */
#define PM_RADYR		4	/* radians per year */
#define PM_TSECYR		5	/* seconds of time (RA) per century */
#define PM_ARCSECCEN		6	/* arcseconds per year */
#define PM_TSECCEN		7	/* seconds of time (RA) per century */
#define PM_MTSYR		8	/* milliseconds of time (RA) per year */
#define PM_ARCSECHR		9	/* arcseconds per hour (solar system) */

/* Data structure for SAO TDC ASCII and binary star catalogs */
struct StarCat {
    int star0;		/* Subtract from star number for file sequence number */
    int star1;		/* First star number in file */
    int nstars;		/* Number of stars in file */
    int stnum;		/* Star number format in catalog file:
			  <0: -stnum-character name at end instead of number
			   0:  no star i.d. numbers
			   1: Real*4 star i.d. numbers
			   2: Integer*4 <region><nnnn>
			   3: Integer*4 <region><nnnnn>
			   4: Integer*4 <nnnnnnnnn>
			   5: Character ID instead of number in ASCII files */
    int mprop;		/* 1 if proper motion is included */
			/* 2 if radial velocity is included */
    int nmag;		/* Number of magnitudes present
			   Negative for J2000 catalog */
    int nbent;		/* Number of bytes per star entry */
    int	rasorted;	/* 1 if RA-sorted, else 0 */
    int	ignore;		/* 1 if ignoring info after position and magnitude */
    FILE *ifcat;	/* File descriptor for catalog file */
    char isfil[24];	/* Star catalog file name */
    char isname[64];	/* Star catalog description */
    int  byteswapped;	/* 1 if catalog is byte-reversed from CPU */
    int  refcat;	/* Code for type of catalog (TXTCAT, BINCAT, etc.) */
    int  coorsys;	/* Coordinate system
			   B1950 J2000 Galactic Ecliptic */
    double epoch;	/* Epoch of catalog coordinates in years */
    double equinox;	/* Equinox of catalog coordinates in years */
    char inform;	/* Coordinate format
			   (B>inary D>egrees H>MS T>able U>SNO) */
    char incdir[128];	/* Catalog directory pathname */
    char incfile[32];	/* Catalog file name */
    int ncobj;		/* Length of object name in binary star entry */
    int nnfld;		/* Length of star number  */
    int nndec;		/* Number of decimal places in star number */
    int nepoch;		/* 1 if epoch of coordinates is present */
    int sptype;		/* 1 if spectral type is present in catalog */
    int plate;		/* 1 if plate or field number is present in catalog */
    char *catbuff;	/* Pointer to start of catalog */
    char *catdata;	/* Pointer to first entry in catalog */
    char *catline;	/* Pointer to current entry in catalog */
    char *catlast;	/* Pointer to one past end of last entry in catalog */
    int  istar;		/* Number of current catalog entry */
    struct TabTable *startab;	/* Structure for tab table catalog */
    int entid;		/* Entry number for ID */
    int entra;		/* Entry number for right ascension */
    int entdec;		/* Entry number for declination */
    int entmag[MAXNMAG+1]; /* Entry numbers for up to MAXNMAG magnitudes */
    int entpeak;	/* Entry number for peak counts */
    int entepoch;	/* Entry number for epoch of observation */
    int entdate;	/* Entry number for FITS-format date of observation */
    int entname;	/* Entry number for object name */
    int entadd;		/* Entry number for additional keyword */
    int entrpm;		/* Entry number for proper motion in right ascension */
    int entdpm;		/* Entry number for proper motion in declination */
    int entpx;		/* Entry number for parallax */
    int entpxe;		/* Entry number for parallax error */
    int entrv;		/* Entry number for radial velocity */
    int enttype;	/* Entry number for spectral type */
    int entsize;	/* Entry number for size of object */
    int entpath;	/* Entry number for object data pathname */
    int rpmunit;	/* Units for RA proper motion (PM_x) */
    int dpmunit;	/* Units for DEC proper motion (PM_x) */
    char *caturl;	/* set if web search, else NULL */
    char keyid[16];	/* Entry name for ID */
    char keyra[16];	/* Entry name for right ascension */
    char keydec[16];	/* Entry name for declination */
    char keymag[MAXNMAG+1][16]; /* Entry name for up to MAXNMAG magnitudes */
    char keyrpm[16];	/* Entry name for right ascension proper motion */
    char keydpm[16];	/* Entry name for declination proper motion */
    char keypeak[16];	/* Entry name for integer code */
    char keytype[16];	/* Entry name for spectral type */
    char keyrv[16];	/* Entry name for radial velocity */
    char keyadd[16];	/* Entry name for additional keyword */
    char keyepoch[16];	/* Entry name for epoch */
};

/* Data structure for tab table files */
struct TabTable {
    char *filename;	/* Name of tab table file */
    int nlines;		/* Number of entries in table */
    char *tabname;	/* Name of this table or NULL */
    char *tabbuff;	/* Pointer to start of saved tab table in memory */
    char *tabheader;	/* Pointer to start of line containing table header */
    char *tabhead;	/* Pointer to start of line containing column heading */
    char *tabdash;	/* Pointer to start of line with dashes after column headings */
    char *tabdata;	/* Pointer to start of first line of table data */
    int lhead;		/* Number of bytes before first data line */
    int iline;		/* Number of current line (1=first) */
    int lline;		/* Length in bytes of line buffer */
    char *tabline;	/* Pointer to start of current line */
    FILE *tcat;		/* File descriptor for tab table file */
    int ncols;		/* Number of columns per table entry */
    char **colname;	/* Column names */
    int *lcol;		/* Lengths of column header names */
    int *lcfld;		/* Number of columns in field (hyphens) */
    int lbuff;		/* Number of bytes in entire tab table */
};

/* Source catalog flags and subroutines */

/* Source catalog flags returned from CatCode */
#define GSC		1	/* HST Guide Star Catalog */
#define UJC		2	/* USNO UJ Star Catalog */
#define UAC		3	/* USNO A Star Catalog */
#define USAC		4	/* USNO SA Star Catalog */
#define SAO		5	/* SAO Star Catalog */
#define IRAS		6	/* IRAS Point Source Catalog */
#define PPM		7	/* PPM Star Catalog */
#define TYCHO		8	/* Tycho Star Catalog */
#define UA1		9	/* USNO A-1.0 Star Catalog */
#define UA2		10	/* USNO A-2.0 Star Catalog */
#define USA1		11	/* USNO SA-1.0 Star Catalog */
#define USA2		12	/* USNO SA-2.0 Star Catalog */
#define HIP		13	/* Hipparcos Star Catalog */
#define ACT		14	/* USNO ACT Star Catalog */
#define BSC		15	/* Yale Bright Star Catalog */
#define TYCHO2		16	/* Tycho-2 Star Catalog */
#define USNO		17	/* USNO-format plate catalog */
#define TMPSC		18	/* 2MASS All-Sky Point Source Catalog */
#define GSCACT		19	/* GSC-ACT revised Guide Star Catalog */
#define GSC2		20	/* GSC II version 2.2 */
#define UB1		21	/* USNO B-1.0 Star Catalog */
#define UCAC1		22	/* USNO CCD Astrograph Catalog 1.0 */
#define UCAC2		23	/* USNO CCD Astrograph Catalog 2.0 */
#define TMIDR2		24	/* 2MASS IDR2 Point Source Catalog */
#define YB6		25	/* USNO YB6 Catalog */
#define SDSS		26	/* Sloan Digital Sky Survey Catalog */
#define TMXSC		27	/* 2MASS Extended Source Catalog */
#define TMPSCE		28	/* 2MASS Point Source Catalog with mag errors */
#define TYCHO2E		29	/* Tycho-2 Star Catalog with magnitude errors */
#define SKY2K		30	/* SKY2000 Master Catalog */
#define SKYBOT		31	/* SKYBOT Solar System Objects */
#define UCAC3		32	/* USNO CCD Astrograph Catalog 3.0 (2009) */
#define UCAC4		33	/* USNO CCD Astrograph Catalog 4.0 (2013) */
#define TABCAT		-1	/* StarBase tab table catalog */
#define BINCAT		-2	/* TDC binary catalog */
#define TXTCAT		-3	/* TDC ASCII catalog */
#define WEBCAT		-4	/* Tab catalog via the web */
#define NUMCAT		33	/* Number of predefined catalogs */

#define EP_EP   1	/* Output epoch as fractional year */
#define EP_JD   2	/* Output epoch as Julian Date */
#define EP_MJD  3	/* Ouput epoch as Modified Julian Date */
#define EP_FD   4	/* Output epoch in FITS format (yyyy-mm-dd) */
#define EP_ISO  5	/* Output epoch in ISO format (yyyy-mm-ddThh:mm:ss) */

/* Structure for dealing with ranges */
#define MAXRANGE 20
struct Range {
    double first;	/* Current minimum value */
    double last;	/* Current maximum value */
    double step;	/* Current step in value */
    double value;	/* Current value */
    double valmin;	/* Minimum value in all ranges */
    double valmax;	/* Maximum value in all ranges */
    double ranges[MAXRANGE*3];	/* nranges sets of first, last, step */
    int nvalues;	/* Total number of values in all ranges */
    int nranges;	/* Number of ranges */
    int irange;		/* Index of current range */
};

/* Flags for sorting catalog search results */
#define SORT_UNSET	-1	/* Catalog sort flag not set yet */
#define SORT_NONE	0	/* Do not sort catalog output */
#define SORT_MAG	1	/* Sort output by magnitude */
#define SORT_DIST	2	/* Sort output by distance from center */
#define SORT_RA		3	/* Sort output by right ascension */
#define SORT_DEC	4	/* Sort output by declination */
#define SORT_X		5	/* Sort output by image X coordinate */
#define SORT_Y		6	/* Sort output by image Y coordinate */
#define SORT_ID		7	/* Merge close catalog objects */
#define SORT_MERGE	8	/* Merge close catalog objects */

/* Shapes for SAOimage region file output */
#define WCS_CIRCLE 1	/* circle shape for SAOimage plotting */
#define WCS_SQUARE 2	/* square shape for SAOimage plotting */
#define WCS_DIAMOND 3	/* diamond shape for SAOimage plotting */
#define WCS_CROSS 4	/* cross shape for SAOimage plotting */
#define WCS_EX 5	/* x shape for SAOimage plotting */
#define WCS_VAR 6	/* variable (+ and x) shape for HSTGSC plotting */
#define WCS_PCIRCLE 11	/* pixel circle shape for SAOimage plotting */
#define WCS_PSQUARE 12	/* pixel square shape for SAOimage plotting */
#define WCS_PDIAMOND 13	/* pixel diamond shape for SAOimage plotting */
#define WCS_PCROSS 14	/* pixel cross shape for SAOimage plotting */
#define WCS_PEX 15	/* pixel ex shape for SAOimage plotting */
#define WCS_PVAR 16	/* pixel variable (+ and x) shape for HSTGSC plotting */

/* Subroutines for extracting sources from catalogs */

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __STDC__   /* Full ANSI prototypes */

/* Subroutines for reading any catalogs, including TDC ASCII catalogs */

    int ctgread(	/* Read sources by sky region from any catalog */
	char *catfile,	/* Name of reference star catalog file */
	int refcat,	/* Catalog code from wcscat.h */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nsmax,	/* Maximum number of stars to be returned */
	struct StarCat **starcat, /* Catalog data structure */
	double *tnum,	/* Array of ID numbers (returned) */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D array of magnitudes (returned) */
	int *tc,	/* Array of fluxes (returned) */
	char **tobj,	/* Array of object names (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ctgrnum(	/* Read sources by number from any catalog */
	char *catfile,	/* Name of reference star catalog file */
	int refcat,	/* Catalog code from wcscat.h */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	int match,	/* 1 to match star number exactly, else sequence num */
	struct StarCat **starcat, /* Star catalog data structure */
	double *tnum,	/* Array of source numbers to look for */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D Array of magnitudes (returned) */
	int *tpeak,	/* Array of peak counts (returned) */
	char **tkey,	/* Array of values of additional keyword */
	char **tpath,	/* Array of values of data pathnames */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ctgrdate(	/* Read sources by date from SAO TDC ASCII format catalog */
	char *catfile,	/* Name of reference star catalog file */
	int refcat,	/* Catalog code from wcscat.h */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	struct StarCat **starcat, /* Star catalog data structure */
	double date1,	/* Start time as Modified Julian Date or Julian Date */
	double date2,	/* End time as Modified Julian Date or Julian Date */
	int nmax,	/* Maximum number of stars to look for */
	double *tnum,	/* Array of source numbers (returned) */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D Array of magnitudes (returned) */
	int *tc,	/* Array of fluxes (returned) */
	char **tobj,	/* Array of object names (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ctgbin(		/* Bin sources from SAO TDC ASCII format catalog */
	char *catfile,	/* Name of reference star catalog file */
	int refcat,	/* Catalog code from wcscat.h */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude by which to sort (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ctgstar(		/* Read one star entry from ASCII catalog, 0 if OK */
	int istar,	/* Star sequence number in ASCII catalog */
	struct StarCat *sc, /* Star catalog data structure */
	struct Star *st); /* Star data structure, updated on return */
    int isacat(		/* Return 1 if string is name of ASCII catalog file */
	char *catpath);	/* Path to file to check */
    struct StarCat *ctgopen( /* Open a Starbase, TDC ASCII, or TDC binary catalog */
	char *catfile,	/* Name of reference star catalog file */
	int refcat);	/* Catalog code from wcscat.h */
    void ctgclose(	/* Close Starbase, TDC ASCII, or TDC binary catalog
			 * and free data structures */
	struct StarCat *sc); /* Star catalog data structure */

/* Subroutines for extracting sources from HST Guide Star Catalog */
    int gscread(	/* Read sources by sky region from HST Guide Star Catalog */
	int refcat,	/* Catalog code from wcscat.h (GSC or GSCACT) */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int gscrnum(	/* Read sources by ID number from HST Guide Star Catalog */
	int refcat,	/* Catalog code from wcscat.h (GSC or GSCACT) */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *gnum,	/* Array of source numbers to look for */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if >1, number of sources per log line */
    int gscbin(		/* Bin sources from HST Guide Star Catalog */
	int refcat,	/* Catalog code from wcscat.h (GSC or GSCACT) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if >1, number of sources per log line */
    void setgsclass(	/* Set GSC object class to return (<0=all) */
	int class);	/* Class of objects to return */

/* Subroutine to read GSC II catalog over the web */
    int gsc2read(	/* Read sources by sky region from GSC II Catalog */
	char *refcatname, /* Name of catalog (GSC2 for 2.2; GSC2.3 for 2.3) */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned) */
	char **gobj,	/* Array of object IDs (mixed letters and numbers) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if >1, number of sources per log line */
    char *gsc2c2t(	/* Convert GSC2 buffer from comma- to tab-separated */
	char *csvbuff);	/* Input comma-separated table */
    char *gsc2t2t(	/* Clean up GSC2 tab-separated buffer */
	char *tsvbuff);	/* Input tab-separated table */

/* Subroutine to read SDSS catalog over the web */
    int sdssread(	/* Read sources by sky region from SDSS Catalog */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned from tabread) */
	char **gobj,	/* Array of object IDs (too long for integer*4) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if >1, number of sources per log line */
    char *sdssc2t(	/* Convert SDSS buffer from comma- to tab-separated */
	char *csvbuff);	/* Input comma-separated table */

/* Subroutines to read local copy of 2MASS Point Source Catalog */
    int tmcread(	/* Read sources by sky region from 2MASS Point Source Catalog */
	int refcat,	/* Catalog code from wcscat.h (TMPSC or TMXSC or TMPSCE) */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of catalog numbers (returned) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tmcrnum(	/* Read sources by ID number from 2MASS Point Source Catalog */
	int refcat,	/* Catalog code from wcscat.h (TMPSC or TMXSC or TMPSCE) */
	int nstars,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *gnum,	/* Array of source numbers to look for */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tmcbin(		/* Bin sources from 2MASS Point Source Catalog */
	int refcat,	/* Catalog code from wcscat.h (TMPSC or TMXSC or TMPSCE) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

/* Subroutines to read local copies of USNO catalogs */
    int uacread(	/* Read sources by sky region from USNO A or SA Catalog */
	char *refcatname, /* Name of catalog (UAC, USAC, UAC2, USAC2) */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *unum,	/* Array of catalog numbers (returned) */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *uplate,	/* Array of plate numbers (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int uacrnum(	/* Read sources by ID number from USNO A or SA Catalog */
	char *refcatname, /* Name of catalog (UAC, USAC, UAC2, USAC2) */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *unum,	/* Array of source numbers to look for */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *uplate,	/* Array of plate numbers (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int uacbin(		/* Bin sources from USNO A or SA Catalog */
	char *refcatname, /* Name of catalog (UAC, USAC, UAC2, USAC2) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    void setuplate(	/* Set USNO catalog plate number to search */
	int xplate);	/* If nonzero, use objects only from this plate */
    int getuplate(void); /* Get USNO catalog plate number to search */

    int ubcread(	/* Read sources by sky region from USNO B Catalog */
	char *refcatname, /* Name of catalog (UB1 only for now) */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *unum,	/* Array of ID numbers (returned) */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double *upra,	/* Array of right ascension proper motions (returned) */
	double *updec,	/* Array of declination proper motions (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *upmni,	/* Array of number of ids and pm quality (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ubcrnum(	/* Read sources by ID number from USNO B Catalog */
	char *refcatname, /* Name of catalog (UB1 only for now) */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *unum,	/* Array of source numbers to look for */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double *upra,	/* Array of right ascension proper motions (returned) */
	double *updec,	/* Array of declination proper motions (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *upmni,	/* Array of number of ids and pm quality (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ubcbin(		/* Bin sources from USNO B Catalog */
	char *refcatname, /* Name of catalog (UB1 only for now) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

    int ucacread(	/* Read sources by sky region from USNO UCAC 1 Catalog */
	char *refcatname, /* Name of catalog (UCAC1 or UCAC2) */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ucacrnum(	/* Read sources by ID number from USNO UCAC 1 Catalog */
	char *refcatname, /* Name of catalog (UCAC1 or UCAC2) */
	int nstars,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *gnum,	/* Array of source numbers to look for */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ucacbin(	/* Bin sources from USNO UCAC 1 Catalog */
	char *refcatname, /* Name of catalog (UCAC1 or UCAC2) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

    int ujcread(	/* Read sources by sky region from USNO J Catalog */
	char *refcatname, /* Name of catalog (UJC, xxxxx.usno) */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *unum,	/* Array of catalog numbers (returned) */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *uplate,	/* Array of plate numbers (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ujcrnum(	/* Read sources by ID number from USNO J Catalog */
	char *refcatname, /* Name of catalog (UJC, xxxxx.usno) */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *unum,	/* Array of source numbers to look for */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *uplate,	/* Array of plate numbers (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ujcbin(		/* Bin sources from USNO J Catalog */
	char *refcatname, /* Name of catalog (UJC, xxxxx.usno) */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

/* Subroutines to read a local copy of the Tycho-2 catalog */
    int ty2read(	/* Read sources by sky region from Tycho 2 Catalog */
	int refcat,	/* Catalog code from wcscat.h (TYCHO2 or TYCHO2E */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ty2rnum(	/* Read sources by ID number from Tycho 2 Catalog */
	int refcat,	/* Catalog code from wcscat.h (TYCHO2 or TYCHO2E */
	int nstars,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *gnum,	/* Array of source numbers to look for */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int ty2bin(		/* Bin sources from Tycho 2 Catalog */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

/* Subroutines to read a local copy of the ACT catalog */
    int actread(	/* Read sources by sky region from USNO ACT Catalog */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int distsort,	/* 1 to sort stars by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of ID numbers (returned) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int actrnum(	/* Read sources by ID number from USNO ACT Catalog */
	int nstars,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double *gnum,	/* Array of source numbers to look for */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension proper motions (returned) */
	double *gpdec,	/* Array of declination proper motions (returned) */
	double **gmag,	/* 2-D array of magnitudes (returned) */
	int *gtype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int actbin(		/* Bin sources from USNO ACT Catalog */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

    int skybotread (	/* Find solar system objects from SkyBot */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	int distsort,	/* 1 to sort asteroids by distance from center */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Julian date for positions (current time if zero) */
	double mag1,	/* Lower limiting magnitude (none if equal to mag2) */
	double mag2,	/* Upper limiting magnitude (none if equal to mag1) */
	int sortmag,	/* Magnitude by which to sort (1 to nmag) */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *gnum,	/* Array of asteroid numbers (returned) */
	char **gobj,	/* Array of object IDs (too long for integer*4) */
	double *gra,	/* Array of right ascensions (returned) */
	double *gdec,	/* Array of declinations (returned) */
	double *gpra,	/* Array of right ascension motions (returned) */
	double *gpdec,	/* Array of declination motions (returned) */
	double **gmag,	/* 2-D array of magnitudes and other info (returned) */
	int *gtype,	/* Array of object classes (returned) */
	int nlog);	/* 1 for diagnostics */

    char *skybot2tab(	/* Convert SkyBot buffer from space- to tab-separated */
	char *csvbuff);	/* Input comma-separated table */

/* Subroutines to read SAO-TDC binary format catalogs */
    int binread(	/* Read from sky region from SAO TDC binary format catalog */
	char *bincat,	/* Name of reference star catalog file */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	struct StarCat **starcat, /* Star catalog data structure */
	double *tnum,	/* Array of ID numbers (returned) */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D array of magnitudes (returned) */
	int *tpeak,	/* Array of encoded spectral types (returned) */
	char **tobj,	/* Array of object names (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int binrnum(	/* Read sources by ID number from SAO TDC binary format catalog */
	char *bincat,	/* Name of reference star catalog file */
	int nstars,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	int match,	/* If 1, match number exactly, else number is sequence*/
	double *tnum,	/* Array of source numbers to look for */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D array of magnitudes (returned) */
	int *tpeak,	/* Array of encoded spectral types (returned) */
	char **tobj,	/* Array of object names (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int binbin(		/* Bin sources from SAO TDC binary format catalog */
	char *bincat,	/* Name of reference star catalog file */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude to use (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */

    int binstar(	/* Read one star entry from binary catalog, 0 if OK */
	struct StarCat *sc, /* Star catalog descriptor */
	struct Star *st, /* Current star entry (returned) */
	int istar);	/* Star sequence number in binary catalog */
    struct StarCat *binopen( /* Open binary catalog, returning number of entries */
	char *bincat);	/* Name of reference star catalog file */
    void binclose(	/* Close binary catalog */
	struct StarCat *sc); /* Star catalog descriptor */
    int isbin(		/* Return 1 if TDC binary catalog file, else 0 */
	char *filename); /* Name of file to check */

/* Subroutines for extracting tab table information (in tabread.c) */
    int tabread(	/* Read sources from tab table catalog */
	char *tabcatname, /* Name of reference star catalog file */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude by which to sort (1 to nmag) */
	int nstarmax,	/* Maximum number of stars to be returned */
	struct StarCat **starcat, /* Star catalog data structure */
	double *tnum,	/* Array of source numbers (returned) */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D Array of magnitudes (returned) */
	int *tpeak,	/* Array of peak counts (returned) */
	char **tkey,	/* Array of values of additional keyword */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tabrnum(	/* Read sources from tab table catalog */
	char *tabcatname, /* Name of reference star catalog file */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	struct StarCat **starcat, /* Star catalog data structure */
	int match,	/* 1 to match star number exactly, else sequence num */
	double *tnum,	/* Array of source numbers to look for */
	double *tra,	/* Array of right ascensions (returned) */
	double *tdec,	/* Array of declinations (returned) */
	double *tpra,	/* Array of right ascension proper motions (returned) */
	double *tpdec,	/* Array of declination proper motions (returned) */
	double **tmag,	/* 2-D Array of magnitudes (returned) */
	int *tpeak,	/* Array of peak counts (returned) */
	char **tkey,	/* Array of values of additional keyword */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tabbin(		/* Read sources from tab table catalog */
	char *tabcatname, /* Name of reference star catalog file */
	struct WorldCoor *wcs, /* World coordinate system for image */
	char *header,	/* FITS header for output image */
	char *image,	/* Output FITS image */
	double mag1,	/* Minimum (brightest) magnitude (no limits if equal) */
	double mag2,	/* Maximum (faintest) magnitude (no limits if equal) */
	int sortmag,	/* Magnitude by which to sort (1 to nmag) */
	double magscale, /* Scaling factor for magnitude to pixel flux
			 * (image of number of catalog objects per bin if 0) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tabxyread(	/* Read x, y, and magnitude from tab table star list */
	char *tabcatname, /* Name of reference star catalog file */
	double **xa,	/* Array of x coordinates (returned) */
	double **ya,	/* Array of y coordinates (returned) */
	double **ba,	/* Array of magnitudes (returned) */
	int **pa,	/* Array of fluxes (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int tabrkey(		/* Keyword values from tab table catalogs */
	char *tabcatname, /* Name of reference star catalog file */
	struct StarCat **starcat, /* Star catalog data structure */
	int nnum,	/* Number of stars to look for */
	double *tnum,	/* Array of source numbers to look for */
	char *keyword,	/* Keyword for which to return values */
	char **tval);	/* Returned values for specified keyword */
    struct StarCat *tabcatopen(	/* Open tab table catalog */
	char *tabpath,	/* Tab table catalog file pathname */
	struct TabTable *tabtable, /* Tab table data structure */
	int nbbuff);	/* Number of bytes in buffer; 0=read whole file */
    void tabcatclose(	/* Close tab table catalog */
	struct StarCat *sc);	/* Source catalog data structure */
    int tabstar(	/* Read one star entry from tab table catalog, 0 if OK */
	int istar,		/* Source sequence number in tab table catalog */
	struct StarCat *sc,	/* Source catalog data structure */
	struct Star *st,	/* Star data structure, updated on return */
	int verbose);		/* 1 to print error messages */
    struct TabTable *tabopen(	/* Open tab table file */
	char *tabfile,	/* Tab table catalog file name */
	int nbbuff);	/* Number of bytes in buffer; 0=read whole file */
    void tabclose(	/* Free all arrays left open by tab table structure */
	struct TabTable *tabtable); /* Tab table data structure */
    char *gettabline(	/* Find a specified line in a tab table */
	struct TabTable *tabtable, /* Tab table data structure */
	int iline);	/* Line sequence number in tab table */
    double tabgetra(	/* Return right ascension in degrees from tab table*/
	struct Tokens *tabtok,  /* Line token structure */
	int ientry);	/* sequence of entry on line */
    double tabgetdec(	/* Return declination in degrees from tab table*/
	struct Tokens *tabtok,  /* Line token structure */
	int ientry);	/* sequence of entry on line */
    double tabgetr8(	/* Return double number from tab table line */
	struct Tokens *tabtok,  /* Line token structure */
	int ientry);	/* sequence of entry on line */
    int tabgeti4(	/* Return 4-byte integer from tab table line */
	struct Tokens *tabtok,  /* Line token structure */
	int ientry);	/* sequence of entry on line */
    void settabkey(	/* Set tab table keyword to read for object */
	char *keyword);	/* column header of desired value */
    int tabgetk(	/* Get tab table entries for named column */
	struct TabTable *tabtable, /* Tab table data structure */
	struct Tokens *tabtok,  /* Line token structure */
	char *keyword,	/* column header of desired value */
	char *string,	/* character string (returned) */
	int maxchar);	/* Maximum number of characters in returned string */
    int tabgetc(	/* Get tab table entry for named column */
	struct Tokens *tabtok,  /* Line token structure */
	int ientry,	/* sequence of entry on line */
	char *string,	/* character string (returned) */
	int maxchar);	/* Maximum number of characters in returned string */
    int tabparse(		/* Aeturn column names and positions in tabtable */
	struct TabTable *tabtable); /* Tab table data structure */
    int tabcol(		/* Find column for name (case-sensitive) */
	struct TabTable *tabtable, /* Tab table data structure */
	char *keyword);	/* column header of desired value */
    int tabccol(	/* Find column for name  (case-insensitive) */
	struct TabTable *tabtable, /* Tab table data structure */
	char *keyword);	/* column header of desired value */
    int istab(		/* Return 1 if tab table file, else 0 */
	char *filename); /* Name of file to check */
    char *gettaberr();	/* Return most recent tab table error message */
    int gettabndec();	/* Return number of decimal places in tab catalog ids */

/* Subroutines to read catalogs over the web, from SCAT, HST, ESO, or SDSS servers */
    int webread(	/* Read sources by sky region from WWW catalog */
	char *caturl,	/* URL of search engine */
	char *refcatname, /* Name of catalog */
	int distsort,	/* 1 to sort stars by distance from center */
	double cra,	/* Search center J2000 right ascension in degrees */
	double cdec,	/* Search center J2000 declination in degrees */
	double dra,	/* Search half width in right ascension in degrees */
	double ddec,	/* Search half-width in declination in degrees */
	double drad,	/* Limiting separation in degrees (ignore if 0) */
	double dradi,	/* Inner edge of annulus in degrees (ignore if 0) */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	double mag1,	/* Limiting magnitudes (none if equal) */
	double mag2,	/* Limiting magnitudes (none if equal) */
	int sortmag,	/* Number of magnitude by which to limit and sort */
	int nstarmax,	/* Maximum number of stars to be returned */
	double *unum,	/* Array of ID numbers (returned) */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double *upra,	/* Array of right ascension proper motions (returned) */
	double *updec,	/* Array of declination proper motions (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *utype,	/* Array of integer catalog values (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    int webrnum(	/* Read sources by ID number from WWW catalog */
	char *caturl,	/* URL of search engine */
	char *refcatname, /* Name of catalog */
	int nnum,	/* Number of stars to look for */
	int sysout,	/* Search coordinate system */
	double eqout,	/* Search coordinate equinox */
	double epout,	/* Proper motion epoch (0.0 for no proper motion) */
	int match,	/* 1 to match star number exactly, else sequence num */
	double *unum,	/* Array of source numbers to look for */
	double *ura,	/* Array of right ascensions (returned) */
	double *udec,	/* Array of declinations (returned) */
	double *upra,	/* Array of right ascension proper motions (returned) */
	double *updec,	/* Array of declination proper motions (returned) */
	double **umag,	/* 2-D array of magnitudes (returned) */
	int *utype,	/* Array of object types (returned) */
	int nlog);	/* Verbose mode if > 1, number of sources per log line */
    char *webbuff(	/* Read URL into buffer across the web */
	char *url,	/* URL to read */
	int diag,	/* 1 to print diagnostic messages */
	int *lbuff);	/* Length of buffer (returned) */
    struct TabTable *webopen(	/* Open tab table across the web */
	char *caturl,	/* URL of search engine */
	char *srchpar,	/* Search engine parameters to append */
	int nlog);	/* 1 to print diagnostic messages */

/* Subroutines to read DAOPHOT-style catalogs of sources found in an image */
    int daoread(	/* Read image source positions from x y mag file */
	char *daocat,	/* Name of DAOFIND catalog file */
	double **xa,	/* X and Y coordinates of stars, array returned */
	double **ya,	/* X and Y coordinates of stars, array returned */
	double **ba,	/* Instrumental magnitudes of stars, array returned */
	int **pa,	/* Peak counts of stars in counts, array returned */
	int nlog);	/* 1 to print each star's position */
    int daoopen(	/* Open image source position x y mag file */
	char *daofile);	/* DAOFIND catalog file name */
    char *daoline(	/* Read line from image source position x y mag file */
	int iline,	/* Star sequence number in DAOFIND catalog */
	char *line);	/* Pointer to iline'th entry (returned updated) */

/* Subroutines for sorting tables of star positions and magnitudes from sortstar.c */
    void FluxSortStars(	/* Sort image stars by decreasing flux */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double *sb,	/* Brighness in counts */
	int *sc,	/* Other 4-byte information */
	int ns);	/* Number of stars to sort */
    void MagSortStars(	/* Sort image stars by increasing magnitude */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm,		/* Number of magnitudes per star */
	int ms);	/* Magnitude by which to sort (1 to nmag) */
    void IDSortStars(	/* Sort image stars by increasing ID Number value */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm);	/* Number of magnitudes per star */
    void RASortStars(	/* Sort image stars by increasing right ascension */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm);	/* Number of magnitudes per star */
    void DecSortStars(	/* Sort image stars by increasing declination */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm);	/* Number of magnitudes per star */
    void XSortStars(	/* Sort image stars by increasing image X value */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm);	/* Number of magnitudes per star */
    void YSortStars(	/* Sort image stars by increasing image Y value */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm);	/* Number of magnitudes per star */
    int MergeStars(	/* Merge multiple entries within given radius
			 * return mean ra, dec, proper motion, and magnitude(s) */
	double *sn,	/* Identifying number */
	double *sra,	/* Right Ascension */
	double *sdec,	/* Declination */
	double *spra,	/* Right Ascension proper motion */
	double *spdec,	/* Declination proper motion */
	double *sx,	/* Image X coordinate */
	double *sy,	/* Image Y coordinate */
	double **sm,	/* Magnitudes */
	int *sc,	/* Other 4-byte information */
	char **sobj,	/* Object name */
	int ns,		/* Number of stars to sort */
	int nm,		/* Number of magnitudes per star */
	double rad,	/* Maximum separation in arcseconds to merge */
	int log);	/* If >0, log progress every time mod number written */

/* Catalog utility subroutines from catutil.c */

/* Subroutines for dealing with catalogs */
    int RefCat(		/* Return catalog type code, title, coord. system */
	char *refcatname, /* Name of reference catalog */
	char *title,	/* Description of catalog (returned) */
	int *syscat,	/* Catalog coordinate system (returned) */
	double *eqcat,	/* Equinox of catalog (returned) */
	double *epcat,	/* Epoch of catalog (returned) */
	int *catprop,	/* 1 if proper motion in catalog (returned) */
	int *nmag);	/* Number of magnitudes in catalog (returned) */
    int CatCode(	/* Return catalog type code */
	char *refcatname); /* Name of reference catalog */
    char *CatName(	/* Return catalog name given catalog type code */
	int refcat,	/* Catalog code */
	char *refcatname); /* Name of reference catalog */
    char *CatSource(	/* Return catalog source description given catalog type code */
	int refcat,	/* Catalog code */
	char *refcatname); /* Name of reference catalog */
    void CatID(		/* Return catalog ID keyword given catalog type code */
	char *catid,	/* Catalog ID (returned) */
	int refcat);	/* Catalog code */
    double CatRad(	/* Return default search radius for given catalog */
	int refcat);	/* Catalog code */
    char *ProgName(	/* Return program name given program path used */
	char *progpath0); /* Pathname by which program is invoked */
    char *ProgCat(	/* Return catalog name given program name used */
	char *progname); /* Program name which might contain catalog code */
    void CatNum(	/* Return formatted source number */
	int refcat,	/* Catalog code */
	int nnfld,	/* Number of characters in number (from CatNumLen)
			 * Print leading zeroes if negative */
	int nndec,	/* Number of decimal places ( >= 0)
			 * Omit leading spaces if negative */
	double dnum,	/* Catalog number of source */
	char *numstr);	/* Formatted number (returned) */
    int CatNumLen(	/* Return length of source numbers */
	int refcat,	/* Catalog code */
	double maxnum,	/* Maximum ID number
			 * (Ignored for standard catalogs) */
	int nndec);	/* Number of decimal places ( >= 0) */
    int CatNdec(	/* Return number of decimal places in source numbers */
	int refcat);	/* Catalog code */
    void CatMagName(	/* Return name of specified magnitude */
	int imag,	/* Sequence number of magnitude */
	int refcat,	/* Catalog code */
	char *magname); /* Name of magnitude, returned */
    int CatMagNum(	/* Returns number of magnitude specified by letter as int */
	int imag,	/* int of magnitude letter */
	int refcat);	/* Catalog code */
    void CatTabHead (	/* Print heading for catalog search result table */
	int refcat,	/* Catalog being searched */
	int sysout,	/* Output coordinate system */
	int nnfld,	/* Number of characters in ID column */
	int mprop,	/* 1 if proper motion in catalog */
	int nmag,	/* Number of magnitudes */
	char *ranges,	/* Catalog numbers to print */
	char *keyword,	/* Column to add to tab table output */
	int gcset,	/* 1 if there are any values in gc[] */
	int tabout,	/* 1 if output is tab-delimited */
	int classd,	/* GSC object class to accept (-1=all) */
	int printxy,	/* 1 if X and Y included in output */
	char **gobj1,	/* Pointer to array of object names; NULL if none */
	FILE *fd);	/* Output file descriptor; none if NULL */
    int StrNdec(	/* Return number of decimal places in numeric string */
	char *string);	/* Numeric string */
    int NumNdec(	/* Return number of decimal places in a number */
	double number); /* Floating point number */
    void setdateform (	/* Set date format code */
	int dateform0);	/* Date format code */
    char *DateString(	/* Return string with epoch of position in desired format */
	double epoch,	/* Date as fraction of a year */
	int tabout);	/* 1 for tab-preceded output string, else space-preceded */
    void setlimdeg(	/* Limit output in degrees (1) or hh:mm:ss dd:mm:ss (0) */
	int degout);	/* 1 for fractional degrees, else sexagesimal hours, degrees */

    void SearchLim(	/* Compute limiting RA and Dec */
	double cra,	/* Longitude/Right Ascension of Center of search area in degrees */
	double cdec,	/* Latitude/Declination of search area in degrees */
	double dra,	/* Horizontal half-width in degrees */
	double ddec,	/* Vertical half-width in degrees */
	int syscoor,	/* Coordinate system */
	double *ra1,	/* Lower right ascension limit in degrees (returned) */
	double *ra2,	/* Upper right ascension limit in degrees (returned) */
	double *dec1,	/* Lower declination limit in degrees (returned) */
	double *dec2,	/* Upper declination limit in degrees (returned) */
	int verbose);	/* 1 to print limits, else 0 */
    void RefLim(	/* Compute limiting RA and Dec in new system */
	double cra,	/* Longitude/Right Ascension of Center of search area in degrees */
	double cdec,	/* Latitude/Declination of search area in degrees */
	double dra,	/* Horizontal half-width in degrees */
	double ddec,	/* Vertical half-width in degrees */
	int sysc,	/* System of search coordinates */
	int sysr,	/* System of reference catalog coordinates */
	double eqc,	/* Equinox of search coordinates in years */
	double eqr,	/* Equinox of reference catalog in years */
	double epc,	/* Epoch of search coordinates in years */
	double epr,	/* Epoch of reference catalog coordinates in years */
	double secmarg,	/* Margin in arcsec/century to catch moving stars */
	double *ramin,	/* Lower right ascension limit in degrees (returned) */
	double *ramax,	/* Upper right ascension limit in degrees (returned) */
	double *decmin,	/* Lower declination limit in degrees (returned) */
	double *decmax,	/* Upper declination limit in degrees (returned) */
	int *wrap,	/* 1 if search passes through 0:00:00 RA */
	int verbose);	/* 1 to print limits, else 0 */
    void movebuff (	/* Copy nbytes bytes from source+offs to dest+offd */
	char *source,	/* Pointer to source */
	char *dest,	/* Pointer to destination */
	int nbytes,	/* Number of bytes to move */
	int offs,	/* Offset in bytes in source from which to start copying */
	int offd);	/* Offset in bytes in destination to which to start copying */

/* Subroutines for dealing with ranges */
    struct Range *RangeInit(	/* Initialize range structure from string */
	char *string,	/* String containing numbers separated by , and - */
	int ndef);	/* Maximum allowable range value */
    int isrange(	/* Return 1 if string is a range of numbers, else 0 */
	char *string);	/* String which might be a range of numbers */
    void rstart(	/* Restart range */
	struct Range *range); /* Range structure */
    int rgetn(		/* Return number of values in all ranges */
	struct Range *range); /* Range structure */
    int rgeti4(		/* Return next number in range as integer */
	struct Range *range); /* Range structure */
    double rgetr8(	/* Return next number in range as double */
	struct Range *range); /* Range structure */

/* Subroutines for read values from keyword=value in blocks of text */
    int ageti4(		/* Extract int value from keyword= value in string */
	char *string,	/* character string containing <keyword>= <value> */
	char *keyword,	/* character string containing the name of the keyword
			 * the value of which is returned.  hget searches for a
			 * line beginning with this string.  if "[n]" or ",n" is
			 * present, the n'th token in the value is returned. */
	int *ival);	/* Integer value, returned */
    int agetr8(		/* Extract double value from keyword= value in string */
	char *string,	/* character string containing <keyword>= <value> */
	char *keyword,	/* character string containing the name of the keyword */
	double *dval);	/* Double value, returned */
    int agets(		/* Extract value from keyword= value in string */
	char *string,	/* character string containing <keyword>= <value> */
	char *keyword,	/* character string containing the name of the keyword */
	int lval,	/* Size of value in characters
			 * If negative, value ends at end of line */
	int fillblank,	/* If 0, leave blanks, strip trailing blanks
			   if non-zero, replace blanks with underscores */
	char *value);	/* String (returned) */

    int tmcid(		/* Return 1 if string is 2MASS ID, else 0 */
	char *string,	/* Character string to check */
	double *ra,	/* Right ascension (returned) */
	double *dec);	/* Declination (returned) */

/* Subroutines for VOTable output */
    int vothead(	/* Print heading for VOTable SCAT output */
	int refcat,	/* Catalog code */
	char *refcatname, /* Name of catalog */
	int mprop,	/* Proper motion flag */
	int typecol,	/* Flag for spectral type */
	int ns,		/* Number of sources found in catalog */
	double cra,	/* Search center right ascension */
	double cdec,	/* Search center declination */
	double drad);	/* Radius to search in degrees */
    void vottail();	/* Terminate VOTable SCAT output */

/* Subroutines for version/date string */
    void setrevmsg(	/* Set version/date string */
	char *revmsg);	/* Version/date string */
    char *getrevmsg(void); /* Return version/date string */

/* Subroutines for fitting and evaluating polynomials */
    void polfit(	/* Fit polynomial coefficients */
	double *x,	/* Array of independent variable points */
	double *y,	/* Array of dependent variable points */
	double x0,	/* Offset to independent variable */
	int npts,	/* Number of data points to fit */
	int nterms,	/* Number of parameters to fit */
	double *a,	/* Vector containing current fit values */
	double *stdev);	/* Standard deviation of fit (returned) */
    double polcomp(	/* Evaluate polynomial from polfit coefficients */
	double xi,	/* Independent variable */
	double x0,	/* Offset to independent variable */
	int norder,	/* Number of coefficients */
	double *a);	/* Vector containing coeffiecients */

#else /* K&R prototypes */

/* Subroutines for reading TDC ASCII catalogs (ctgread.c) */
int ctgread();		/* Read sources by sky region from SAO TDC ASCII format catalog */
int ctgrnum();		/* Read sources by number from SAO TDC ASCII format catalog */
int ctgrdate();		/* Read sources by date range from SAO TDC ASCII format catalog */
int ctgbin();		/* Bin sources from SAO TDC ASCII format catalog */
int ctgstar();		/* Read one star entry from ASCII catalog, 0 if OK */
int isacat();		/* Return 1 if string is name of ASCII catalog file */
struct StarCat *ctgopen();
void ctgclose();

/* Subroutines for extracting sources from HST Guide Star Catalog */
int gscread();		/* Read sources by sky region from HST Guide Star Catalog */
int gscrnum();		/* Read sources by ID number from HST Guide Star Catalog */
int gscbin();		/* Bin sources from HST Guide Star Catalog */
void setgsclass();	/* Set GSC object class */

/* Subroutine to read GSC II catalog over the web (gsc2read.c) */
int gsc2read();		/* Read sources by sky region from GSC II Catalog */
char *gsc2c2t();	/* Convert GSC2 buffer from comma- to tab-separated */
char *gsc2t2t();	/* Clean up GSC2 tab-separated buffer */

/* Subroutine to read SDSS catalog over the web (sdssread.c) */
int sdssread();		/* Read sources by sky region from SDSS Catalog */
char *sdssc2t();	/* Convert SDSS buffer from comma- to tab-separated */

/* Subroutines to read local copy of 2MASS Point Source Catalog (tmcread.c) */
int tmcread();		/* Read sources by sky region from 2MASS Point Source Catalog */
int tmcrnum();		/* Read sources by ID number from 2MASS Point Source Catalog */
int tmcbin();		/* Bin sources from 2MASS Point Source Catalog */

/* Subroutines to read local copies of USNO A and SA catalogs (uacread.c) */
int uacread();		/* Read sources by sky region from USNO A or SA Catalog */
int uacrnum();		/* Read sources by ID number from USNO A or SA Catalog */
int uacbin();		/* Bin sources from USNO A or SA Catalog */
void setuplate();	/* Set USNO catalog plate number to search */
int getuplate();	/* Get USNO catalog plate number to search */

/* Subroutines to read local copies of USNO B catalogs (ubcread.c) */
int ubcread();		/* Read sources by sky region from USNO B Catalog */
int ubcrnum();		/* Read sources by ID number from USNO B Catalog */
int ubcbin();		/* Bin sources from USNO B Catalog */

/* Subroutines to read local copies of USNO UCAC catalogs (ucacread.c) */
int ucacread();		/* Read sources by sky region from USNO UCAC 1 Catalog */
int ucacrnum();		/* Read sources by ID number from USNO UCAC 1 Catalog */
int ucacbin();		/* Bin sources from USNO UCAC 1 Catalog */

/* Subroutines to read local copies of USNO UJ catalog (ucacread.c) */
int ujcread();		/* Read sources by sky region from USNO J Catalog */
int ujcrnum();		/* Read sources by ID number from USNO J Catalog */
int ujcbin();		/* Bin sources from USNO J Catalog */

/* Subroutines to read a local copy of the Tycho-2 catalog (ty2read.c) */
int ty2read();		/* Read sources by sky region from Tycho 2 Catalog */
int ty2rnum();		/* Read sources by ID number from Tycho 2 Catalog */
int ty2bin();		/* Bin sources from Tycho 2 Catalog */

/* Subroutines to read a local copy of the ACT catalog (actread.c) */
int actread();		/* Read sources by sky region from USNO ACT Catalog */
int actrnum();		/* Read sources by ID number from USNO ACT Catalog */
int actbin();		/* Bin sources from USNO ACT Catalog */

/* Subroutines to retrieve solar system objects over the web from SkyBot */
int skybotread();	/* Find solar system objects from SkyBot */
char *skybot2tab();	/* Convert SkyBot returned data to Starbase table */
void setobs();		/* Set observatory using IAU code */
void setobsname();	/* Set IAU code from observatory name */

/* Subroutines to read SAO-TDC binary format catalogs (binread.c) */
int binread();		/* Read sources by sky region from SAO TDC binary format catalog */
int binrnum();		/* Read sources by ID number from SAO TDC binary format catalog */
int binbin();		/* Bin sources from SAO TDC binary format catalog */
int binstar();		/* Read one star entry from binary catalog, 0 if OK */
int isbin();
struct StarCat *binopen();
void binclose();

/* Subroutines for extracting tab table information (tabread.c) */
int tabread();		/* Read sources from tab table catalog */
int tabrnum();		/* Read sources from tab table catalog */
int tabbin();		/* Read sources from tab table catalog */
struct TabTable *tabopen();	/* Open tab table file */
struct StarCat *tabcatopen();	/* Open tab table catalog */
void tabcatclose();	/* Close tab table catalog */
int tabxyread();	/* Read x, y, and magnitude from tab table star list */
void settabkey();	/* Set tab table keyword to read for object */
char *gettabline();	/* Find a specified line in a tab table */
int tabrkey();		/* Keyword values from tab table catalogs */
int tabcol();		/* Find column for name (case-sensitive) */
int tabccol();		/* Find column for name (case-insensitive) */
int tabgetk();		/* Get tab table entries for named column */
int tabgetc();		/* Get tab table entry for named column */
int tabgeti4();		/* Return 4-byte integer from tab table line */
int tabparse();		/* Aeturn column names and positions in tabtable */
double tabgetra();	/* Return right ascension in degrees from tab table*/
double tabgetdec();	/* Return declination in degrees from tab table*/
double tabgetr8();	/* Return double number from tab table line */
void tabclose();	/* Free all arrays left open by tab table structure */
char *gettaberr();	/* Return most recent tab table error message */
int istab();		/* Return 1 if tab table file, else 0 */
int gettabndec();	/* Return number of decimal places in tab catalog ids */

/* Subroutines to read catalogs over the web, from SCAT, HST, ESO, or SDSS servers */
int webread();		/* Read sources by sky region from catalog on the World Wide Web */
int webrnum();		/* Read sources by ID number from catalog on the World Wide Web */
char *webbuff();	/* Read URL into buffer across the web */
struct TabTable *webopen();	/* Open tab table across the web */

/* Subroutines to read DAOPHOT-style catalogs of sources found in an image */
int daoread();		/* Read image source positions from x y mag file */
int daoopen();		/* Open image source position x y mag file */
char *daoline();	/* Read line from image source position x y mag file */

/* Subroutines for sorting tables of star positions and magnitudes from sortstar.c */
void FluxSortStars();	/* Sort image stars by decreasing flux */
void MagSortStars();	/* Sort image stars by increasing magnitude */
void IDSortStars();	/* Sort image stars by increasing ID Number value */
void RASortStars();	/* Sort image stars by increasing right ascension */
void DecSortStars();	/* Sort image stars by increasing declination */
void XSortStars();	/* Sort image stars by increasing image X value */
void YSortStars();	/* Sort image stars by increasing image Y value */
int MergeStars();	/* Merge multiple entries within given radius */

/* Catalog utility subroutines from catutil.c */

/* Subroutines for dealing with catalogs */
int CatCode();		/* Return catalog type code */
int RefCat();		/* Return catalog type code, title, coord. system */
char *CatName();	/* Return catalog name given catalog type code */
char *CatSource();	/* Return catalog source description given catalog type code */
char *ProgCat();	/* Return catalog name given program name used */
char *ProgName();	/* Return program name given program path used */
char *CatName();	/* Return catalog name given catalog type code */
void CatID();		/* Return catalog ID keyword given catalog type code */
void CatNum();		/* Return formatted source number */
int CatNumLen();	/* Return length of source numbers */
int CatNdec();		/* Return number of decimal places in source numbers */
void CatMagName();	/* Return name of specified magnitude */
int CatMagNum();	/* Returns number of magnitude specified by letter as int */
double CatRad();	/* Return default search radius for given catalog */
int tmcid();		/* Return 1 if string is 2MASS ID, else 0 */

int NumNdec();		/* Return number of decimal places in a number */
int StrNdec();		/* Return number of decimal places in numeric string */
void setdateform();	/* Set date format code */
void setlimdeg();	/* Limit output in degrees (1) or hh:mm:ss dd:mm:ss (0) */
char *DateString();		/* Convert epoch to output format */
void SearchLim();	/* Compute limiting RA and Dec */
void RefLim();		/* Compute limiting RA and Dec in new system */
int ageti4();		/* Extract int value from keyword= value in string */
int agetr8();		/* Extract double value from keyword= value in string */
int agets();		/* Extract value from keyword= value in string */
void bv2sp();		/* Approximate main sequence spectral type from B - V */
void moveb();		/* Copy nbytes bytes from source+offs to dest+offd */

/* Subroutines for dealing with ranges */
struct Range *RangeInit();	/* Initialize range structure from string */
int isrange();		/* Return 1 if string is a range of numbers, else 0 */
int rgetn();		/* Return number of values in all ranges */
int rgeti4();		/* Return next number in range as integer */
double rgetr8();	/* Return next number in range as double */
void rstart();		/* Restart range */

/* Subroutines for VOTable output */
int vothead();		/* Print heading for VOTable SCAT output */
void vottail();		/* Terminate VOTable SCAT output */

/* Subroutines for version/date string */
void setrevmsg();	/* Set version/date string */
char *getrevmsg();	/* Return version/date string */

/* Subroutines for fitting and evaluating polynomials */
void polfit();		/* Fit polynomial coefficients */
double polcomp();	/* Evaluate polynomial from polfit coefficients */

#endif  /* __STDC__ */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif  /* _wcscat_h_ */

/* Sep 22 1998  New header file (star.h)
 * Oct 16 1998  Add more options for ASCII catalogs
 * Oct 20 1998  Add object name to binary files
 * Oct 21 1998	New file (wcscat.h)
 * Oct 26 1998	Combined wcscat.h and star.h
 * Oct 27 1998	Add SAOimage region shapes
 * Nov  9 1998	Add rasorted flag to catalog structure
 * Nov 20 1998	Add support for USNO A-2.0 and SA-2.0 catalogs
 * Dec  8 1998	Add support for the Hipparcos and ACT catalogs
 *
 * Jan 25 1999	Add declarations for tab table access
 * Jan 25 1999	Add declarations for dealing with ranges of numbers
 * Feb  2 1999	Add number of decimal places in star number to StarCat
 * Feb 11 1999	Add coordinate system info to star structure
 * Feb 11 1999	Change starcat.insys to starcat.coorsys for consistency
 * May 14 1999	Update Star and StarCat structure to cover tab tables
 * May 19 1999	Update StarCat structure to include epoch from catalog
 * June 4 1999	Add CatNumLen()
 * Jun 14 1999	Add SearchLim()
 * Jun 30 1999	Add isrange()
 * Jul  1 1999	Add declarations for date/time conversions in dateutil.c
 * Jul  2 1999	Add rstart()
 * Jul 26 1999	Add Yale Bright Star Catalog
 * Aug 16 1999	Add RefLim() to get converted search coordinates right
 * Aug 25 1999	Add ACT catalog
 * Sep 10 1999	Move special case setting from argument list to subroutines
 * Sep 13 1999	Add subroutines to access data structure for single stars
 * Oct  1 1999	Add structure and subroutines for tokenized strings
 * Oct 22 1999	Change cat*() to ctg*() to avoid system conflict
 * Oct 29 1999	Add tabget() subroutines
 * Nov  1 1999	Increase maximum number of tokens on a line from 20 to 100
 * Nov  2 1999	Move date utilities to fitsfile.h
 *
 * Jan 10 2000	Add column names to catalog data structure
 * Jan 11 2000	Add gettabndec()
 * Feb  9 2000	Add proper motion entry information to star data structure
 * Feb 16 2000	Add gettaberr() to return tab table error message
 * Mar  1 2000	Add isfile() and agets() to help with ASCII files
 * Mar  8 2000	Add ProgCat() to return catalog name from program name used
 * Mar  8 2000	Add ProgName() to extract program name from path used
 * Mar 10 2000	Add PropCat() to tell whether a catalog has proper motions
 * Mar 27 2000	Add tabxyread()
 * Apr  3 2000	Add option in catalog structure to ignore extra info
 * May 22 2000	Add Tycho 2 support, bv2sp()
 * May 26 2000	Add separate pointer to header in tab table structure
 * May 26 2000	Add separate pointer to table name in tab table structure
 * Jul 12 2000	Add catalog type code to ctalog data structure
 * Sep 20 2000	Add isacat() to detect ASCII catalog files
 * Sep 25 2000	Add starcat.sptype to flag spectral type in catalog
 * Oct 23 2000	Add USNO plate catalog to catalog type table
 * Oct 26 2000	Add proper motion flags for seconds and arcseconds per century
 * Oct 31 2000	Add proper motion flags for milliseconds per year
 * Nov  2 2000	Add parallax and radial velocity to star structure
 * Nov 21 2000	Add WEBCAT catalog type for tab ctalogs returned from the Web
 * Nov 22 2000	Add webread() and webrnum()
 * Nov 28 2000	Add tabparse()
 * Nov 30 2000	Add spectral type to catalog header; make star->isp 4 char.
 * Dec 13 2000	Add StrNdec() to get number of decimal places in number strings
 * Dec 15 2000	Add CatNdec() to get number of decimal places in source numbers
 * Dec 18 2000	Drop PropCat(), a cludgy proper motion flag
 *
 * Mar 22 2001	Add web search flag in catalog data structure
 * Mar 27 2001	Add shapes in pixels to SAOimage region options
 * May 14 2001	Add 2MASS Point Source Catalog flags
 * May 22 2001	Add declination sorting
 * May 24 2001	Add 2MASS Point Source Catalog subroutines
 * May 29 2001	Add length of star number to catalog structure
 * May 30 2001	Add third magnitude for tab tables to catalog structure
 * Jun 15 2001	Add CatName() and CatID()
 * Jun 19 2001	Add parallax error to catalog and star structures
 * Jun 20 2001	Add webopen(), GSC2, fourth magnitude to star and starcat
 * Jul 12 2001	Add separate web access subroutine, webbuff()
 * Jul 23 2001	Add ageti4() and agetr8()
 * Jul 24 2001	Add polfit() and polcomp()
 * Aug  8 2001	Add keyrv and option to set mprop to 2 to include rv/cz
 * Sep 10 2001	Add entry line and distance from search center to Star
 * Sep 13 2001	Add YSortStars() and SORT_Y
 * Sep 14 2001	Add lbuff to TabTable structure
 * Sep 20 2001	Add CatMagName()
 * Sep 25 2001	Move isfile() to fitsfile.h
 * Oct 16 2001	Add tabdash pointer to tabtable data structure
 *
 * Apr  9 2002	Fix typo in gettaberr() declaration
 * Apr 10 2002	Add CatMagNum()
 * May  6 2002	Increase object name length from 31 to 79 characters
 * May 13 2002	Add NumNdec(), gsc2read(), and gsc2rnum()
 * Aug  6 2002	Make magnitude entries and positions vectors of 10
 * Oct 30 2002	Add epoch keyword and FITS date to StarCat data structure
 *
 * Jan 16 2003	Add USNO-B1.0 catalog
 * Mar 24 2003	Add CatCde() to get only catalog code
 * Apr  3 2003	Add ubcread(), ubcrnum(), and FluxSortStars()
 * Apr  3 2003	Drop gsc2rnum()
 * Apr 14 2003	Add setrevmsg() and getrevmsg()
 * Apr 24 2003	Add UCAC1 and UCAC2, ucacread() and ucacrnum()
 * May 20 2003	Add TMIDR2 for 2MASS PSC Interim Data Release 2
 * Sep 16 2003	Add SORT_MERGE for scat
 * Sep 25 2003	Add *bin() subroutines for catalog binning
 * Dec  3 2003	Add USNO YB6 catalog
 *
 * Jan  5 2004	Add SDSS catalog
 * Jan 12 2004	Add 2MASS Extended Source catalog and size to star structure
 * Jan 14 2004	Add CatSource() subroutine to simplify help message creation
 * Jan 22 2004	Add setlimdeg() to print limit coordinates in degrees
 * Mar 16 2004	Add MergeStars()
 * Apr 23 2004	Add ctgrdate()
 * Aug 31 2004	Increase MAXTOKENS from 100 to 200
 * Sep  2 2004	Increase MAXTOKENS from 200 to 1000
 *
 * Jul 27 2005	Add date format codes and DateString()
 * Aug  5 2005	Add Tycho-2 and 2MASS PSC with magnitude errors
 *
 * Jan  6 2006	Add CatRad() subroutine
 * Mar 17 2006	Make vothead() int as it now returns the number of fields
 * Apr  3 2006	Add tmcid() to check for 2MASS identifiers
 * Apr  3 2006	Add setdateform() to set output date format
 * Apr 12 2006	Add SORT_ID for scat to sort catalog entries by ID number
 * Jun 20 2006	Add IDSortStars()
 *
 * Jan 10 2006	Add ANSI C function prototypes
 * Jan 11 2007	Move token access subroutines to fileutil.c/fitsfile.h
 * Mar 13 2007	Add gsc2c2t() to convert CSV GSC2 buffer to TSV table
 * Mar 13 2007	Add gobj object name to gsc2read()
 * Jul  5 2007	Add SKYBOT=31 to catalog list
 * Jul 13 2007	Add skybotread() and skybot2tab()
 * Jul 18 2007	Add tabccol() and PM_ARCSECHR for SkyBot
 * Nov 28 2007	Add moveb() which used to be local to binread()
 *
 * Oct 24 2008	Add gsct2t() to clean up tab-separated table from STScI CASB
 *
 * Sep 25 2009	Rename moveb() to movebuff()
 * Sep 25 2009	Add UCAC3 as catalog code 32
 * Oct 30 2009	Add position and proper motion error to star structure
 * Nov  2 2009	Add numbers of images and catalogs to star structure
 * Nov  3 2009	Parameterize as MAXNMAG the maximum number of magnitudes
 *
 * Apr 06 2010	Add fillblank argument to agets()
 *
 * May 16 2012	Add valmin and valmax to Range data structure
 *
 * Feb 15 2013	Add UCAC4 to list of catalog codes
 */
