summaryrefslogtreecommitdiffstats
path: root/ast/stc.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2017-12-08 18:57:06 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2017-12-08 18:57:06 (GMT)
commit90a861b642f765d5657ab827aedabe3920ff9333 (patch)
tree88b93d468ca1feed91ef2958f46f3f74f1418aac /ast/stc.c
parentfba23129f50db253ed3fbbaa23d6e342bf86068e (diff)
downloadblt-90a861b642f765d5657ab827aedabe3920ff9333.zip
blt-90a861b642f765d5657ab827aedabe3920ff9333.tar.gz
blt-90a861b642f765d5657ab827aedabe3920ff9333.tar.bz2
upgrade AST
Diffstat (limited to 'ast/stc.c')
-rw-r--r--ast/stc.c3703
1 files changed, 0 insertions, 3703 deletions
diff --git a/ast/stc.c b/ast/stc.c
deleted file mode 100644
index 08e4392..0000000
--- a/ast/stc.c
+++ /dev/null
@@ -1,3703 +0,0 @@
-/*
-*class++
-* Name:
-* Stc
-
-* Purpose:
-* Represents an instance of the IVOA STC class.
-
-* Constructor Function:
-c astStc
-f AST_STC
-
-* Description:
-* The Stc class is an implementation of the IVOA STC class which forms
-* part of the IVOA Space-Time Coordinate Metadata system. See:
-*
-* http://hea-www.harvard.edu/~arots/nvometa/STC.html
-*
-* The Stc class does not have a constructor function of its own, as it
-* is simply a container class for a family of specialised sub-classes
-* including StcCatalogEntryLocation, StcResourceProfile, StcSearchLocation
-* and StcObsDataLocation.
-
-* Inheritance:
-* The Stc class inherits from the Region class.
-
-* Attributes:
-* In addition to those attributes common to all Regions, every
-* Stc also has the following attributes:
-*
-* - RegionClass: The class name of the encapsulated Region.
-
-* Functions:
-c In addition to those functions applicable to all Regions, the
-c following functions may also be applied to all Stc's:
-f In addition to those routines applicable to all Regions, the
-f following routines may also be applied to all Stc's:
-*
-c - astGetStcRegion: Get a pointer to the encapsulated Region
-f - AST_GETSTCREGION: Get a pointer to the encapsulated Region
-c - astGetStcCoord: Get information about an AstroCoords element
-f - AST_GETSTCCOORD: Get information about an AstroCoords element
-c - astGetStcNCoord: Returns the number of AstroCoords elements in an Stc
-f - AST_GETSTCNCOORD: Returns the number of AstroCoords elements in an Stc
-
-* Copyright:
-* Copyright (C) 1997-2006 Council for the Central Laboratory of the
-* Research Councils
-* Copyright (C) 2008 Science & Technology Facilities Council.
-* All Rights Reserved.
-
-* Licence:
-* This program 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 3 of the License, or (at your option) any later
-* version.
-*
-* This program 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
-* License along with this program. If not, see
-* <http://www.gnu.org/licenses/>.
-
-* Authors:
-* DSB: David S. Berry (Starlink)
-
-* History:
-* 23-NOV-2004 (DSB):
-* Original version.
-* 14-FEB-2006 (DSB):
-* Override astGetObjSize.
-* 13-MAR-2009 (DSB):
-* Over-ride astRegBasePick.
-*class--
-*/
-
-/* Module Macros. */
-/* ============== */
-/* Set the name of the class we are implementing. This indicates to
- the header files that define class interfaces that they should make
- "protected" symbols available. */
-#define astCLASS Stc
-
-/* The number of components in an AstroCoords element which are described
- using a Region within a KeyMap. */
-#define NREG 5
-
-/* Include files. */
-/* ============== */
-/* Interface definitions. */
-/* ---------------------- */
-
-#include "globals.h" /* Thread-safe global data access */
-#include "error.h" /* Error reporting facilities */
-#include "memory.h" /* Memory allocation facilities */
-#include "object.h" /* Base Object class */
-#include "unitmap.h" /* Unit Mappings */
-#include "region.h" /* Regions (parent class) */
-#include "channel.h" /* I/O channels */
-#include "stc.h" /* Interface definition for this class */
-#include "keymap.h" /* Lists of value/key pairs */
-#include "pointlist.h" /* Individual points in a Frame */
-#include "ellipse.h" /* Ellipses within a Frame */
-#include "interval.h" /* Axis intervals within a Frame */
-#include "prism.h" /* Extrusions into higher dimensions */
-
-/* Error code definitions. */
-/* ----------------------- */
-#include "ast_err.h" /* AST error codes */
-
-/* C header files. */
-/* --------------- */
-#include <stdarg.h>
-#include <stddef.h>
-#include <string.h>
-#include <stdio.h>
-
-/* Module Variables. */
-/* ================= */
-
-/* Address of this static variable is used as a unique identifier for
- member of this class. */
-static int class_check;
-
-/* Pointers to parent class methods which are extended by this class. */
-static AstMapping *(* parent_simplify)( AstMapping *, int * );
-static AstPointSet *(* parent_transform)( AstMapping *, AstPointSet *, int, AstPointSet *, int * );
-static AstRegion *(* parent_getdefunc)( AstRegion *, int * );
-static const char *(* parent_getattrib)( AstObject *, const char *, int * );
-static int (* parent_equal)( AstObject *, AstObject *, int * );
-static int (* parent_getobjsize)( AstObject *, int * );
-static int (* parent_getusedefs)( AstObject *, int * );
-static int (* parent_testattrib)( AstObject *, const char *, int * );
-static void (* parent_clearattrib)( AstObject *, const char *, int * );
-static void (* parent_setattrib)( AstObject *, const char *, int * );
-static void (* parent_setregfs)( AstRegion *, AstFrame *, int * );
-static void (*parent_regclearattrib)( AstRegion *, const char *, char **, int * );
-static void (*parent_regsetattrib)( AstRegion *, const char *, char **, int * );
-
-static void (* parent_clearnegated)( AstRegion *, int * );
-static void (* parent_clearclosed)( AstRegion *, int * );
-static void (* parent_clearfillfactor)( AstRegion *, int * );
-static void (* parent_clearmeshsize)( AstRegion *, int * );
-
-static void (* parent_setclosed)( AstRegion *, int, int * );
-static void (* parent_setfillfactor)( AstRegion *, double, int * );
-static void (* parent_setmeshsize)( AstRegion *, int, int * );
-static void (* parent_setnegated)( AstRegion *, int, int * );
-
-#if defined(THREAD_SAFE)
-static int (* parent_managelock)( AstObject *, int, int, AstObject **, int * );
-#endif
-
-/* The keys associated with each component of an AstroCoords element
- within KeyMap */
-static const char *regkey[ NREG ] = { AST__STCERROR,
- AST__STCRES,
- AST__STCSIZE,
- AST__STCPIXSZ,
- AST__STCVALUE };
-
-/* The comments associated with each component of an AstroCoords element
- within KeyMap */
-static const char *regcom[ NREG ] = { "AstroCoords error region",
- "AstroCoords resolution region",
- "AstroCoords size region",
- "AstroCoords pixel size region",
- "AstroCoords value region" };
-
-
-#ifdef THREAD_SAFE
-/* Define how to initialise thread-specific globals. */
-#define GLOBAL_inits \
- globals->Class_Init = 0;
-
-/* Create the function that initialises global data for this module. */
-astMAKE_INITGLOBALS(Stc)
-
-/* Define macros for accessing each item of thread specific global data. */
-#define class_init astGLOBAL(Stc,Class_Init)
-#define class_vtab astGLOBAL(Stc,Class_Vtab)
-
-
-#include <pthread.h>
-
-
-#else
-
-
-/* Define the class virtual function table and its initialisation flag
- as static variables. */
-static AstStcVtab class_vtab; /* Virtual function table */
-static int class_init = 0; /* Virtual function table initialised? */
-
-#endif
-
-/* External Interface Function Prototypes. */
-/* ======================================= */
-
-/* Prototypes for Private Member Functions. */
-/* ======================================== */
-static AstKeyMap *GetStcCoord( AstStc *, int, int * );
-static AstKeyMap *MakeAstroCoordsKeyMap( AstRegion *, AstKeyMap *, const char *, int * );
-static AstMapping *Simplify( AstMapping *, int * );
-static AstPointSet *RegBaseMesh( AstRegion *, int * );
-static AstPointSet *Transform( AstMapping *, AstPointSet *, int, AstPointSet *, int * );
-static AstRegion *GetDefUnc( AstRegion *, int * );
-static AstRegion *GetStcRegion( AstStc *, int * );
-static AstRegion *RegBasePick( AstRegion *this, int, const int *, int * );
-static const char *GetRegionClass( AstStc *, int * );
-static int Equal( AstObject *, AstObject *, int * );
-static int GetBounded( AstRegion *, int * );
-static int GetObjSize( AstObject *, int * );
-static int GetStcNCoord( AstStc *, int * );
-static int GetUseDefs( AstObject *, int * );
-static int Overlap( AstRegion *, AstRegion *, int * );
-static int OverlapX( AstRegion *, AstRegion *, int * );
-static int RegPins( AstRegion *, AstPointSet *, AstRegion *, int **, int * );
-static void Copy( const AstObject *, AstObject *, int * );
-static void Delete( AstObject *, int * );
-static void Dump( AstObject *, AstChannel *, int * );
-static void GetRegion( AstStc *, AstRegion **, int *, int * );
-static void RegBaseBox( AstRegion *, double *, double *, int * );
-static void RegClearAttrib( AstRegion *, const char *, char **, int * );
-static void RegSetAttrib( AstRegion *, const char *, char **, int * );
-static void SetRegFS( AstRegion *, AstFrame *, int * );
-
-static void ClearAttrib( AstObject *, const char *, int * );
-static const char *GetAttrib( AstObject *, const char *, int * );
-static void SetAttrib( AstObject *, const char *, int * );
-static int TestAttrib( AstObject *, const char *, int * );
-
-static void ClearClosed( AstRegion *, int * );
-static int GetClosed( AstRegion *, int * );
-static void SetClosed( AstRegion *, int, int * );
-static int TestClosed( AstRegion *, int * );
-
-static void ClearMeshSize( AstRegion *, int * );
-static int GetMeshSize( AstRegion *, int * );
-static void SetMeshSize( AstRegion *, int, int * );
-static int TestMeshSize( AstRegion *, int * );
-
-static void ClearFillFactor( AstRegion *, int * );
-static double GetFillFactor( AstRegion *, int * );
-static void SetFillFactor( AstRegion *, double, int * );
-static int TestFillFactor( AstRegion *, int * );
-
-static void ClearNegated( AstRegion *, int * );
-static int GetNegated( AstRegion *, int * );
-static void SetNegated( AstRegion *, int, int * );
-static int TestNegated( AstRegion *, int * );
-
-#if defined(THREAD_SAFE)
-static int ManageLock( AstObject *, int, int, AstObject **, int * );
-#endif
-
-/* Member functions. */
-/* ================= */
-static void ClearAttrib( AstObject *this_object, const char *attrib, int *status ) {
-/*
-* Name:
-* ClearAttrib
-
-* Purpose:
-* Clear an attribute value for a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* void ClearAttrib( AstObject *this, const char *attrib, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astClearAttrib protected
-* method inherited from the Region class).
-
-* Description:
-* This function clears the value of a specified attribute for a
-* Stc, so that the default value will subsequently be used.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* attrib
-* Pointer to a null terminated string specifying the attribute
-* name. This should be in lower case with no surrounding white
-* space.
-* status
-* Pointer to the inherited status variable.
-
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- int len; /* Length of attrib string */
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Obtain the length of the "attrib" string. */
- len = strlen( attrib );
-
-/* Check the attribute name and clear the appropriate attribute. */
-
-/* (none as yet) */
-/* ------------- */
-
-/* Read-only attributes. */
-/* --------------------- */
-/* Test if the attribute name matches any of the read-only attributes
- of this class. If it does, then report an error. */
- if ( !strcmp( attrib, "regionclass" ) ) {
- astError( AST__NOWRT, "astClear: Invalid attempt to clear the \"%s\" "
- "value for a %s.", status, attrib, astGetClass( this ) );
- astError( AST__NOWRT, "This is a read-only attribute." , status);
-
-/* Not recognised. */
-/* --------------- */
-/* If the attribute is still not recognised, pass it on to the parent
- method for further interpretation. */
- } else {
- (*parent_clearattrib)( this_object, attrib, status );
- }
-}
-
-static int Equal( AstObject *this_object, AstObject *that_object, int *status ) {
-/*
-* Name:
-* Equal
-
-* Purpose:
-* Test if two Objects are equivalent.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int Equal( AstObject *this_object, AstObject *that_object, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astEqual protected
-* method inherited from the Region class).
-
-* Description:
-* This function returns a boolean result (0 or 1) to indicate whether
-* two Stcs are equivalent.
-
-* Parameters:
-* this
-* Pointer to the first Stc.
-* that
-* Pointer to the second Stc.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* One if the Stcs are equivalent, zero otherwise.
-
-* Notes:
-* - The Stcs are equivalent if their encapsulated Region are
-* equivalent, and if they have the same boolean operation, negation
-* and closed flags.
-* - A value of zero will be returned if this function is invoked
-* with the global status set, or if it should fail for any reason.
-*/
-
-/* Local Variables: */
- AstStc *that;
- AstStc *this;
- int result;
-
-/* Initialise. */
- result = 0;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Invoke the Equal method inherited from the parent Region class. This checks
- that the Objects are both of the same class, and have the same Negated
- and Closed flags (amongst other things). */
- if( (*parent_equal)( this_object, that_object, status ) ) {
-
-/* Obtain pointers to the two Stc structures. */
- this = (AstStc *) this_object;
- that = (AstStc *) that_object;
-
-/* Test their encapsulated Region for equality. */
- result = astEqual( this->region, that->region );
- }
-
-/* If an error occurred, clear the result value. */
- if ( !astOK ) result = 0;
-
-/* Return the result, */
- return result;
-}
-
-/*
-* Name:
-* MAKE_SET
-
-* Purpose:
-* Define a function to set an attribute value for a Stc.
-
-* Type:
-* Private macro.
-
-* Synopsis:
-* #include "stc.h"
-* MAKE_SET(attribute,lattribute,type)
-
-* Class Membership:
-* Defined by the Stc class.
-
-* Description:
-* This macro expands to an implementation of a private member function
-* of the form:
-*
-* static void Set<Attribute>( AstRegion *this, <Type> value )
-*
-* that sets the value of a specified Region attribute in the parent
-* Region structure and also in the encapsulated Region.
-
-* Parameters:
-* attribute
-* Name of the attribute, as it appears in the function name.
-* lattribute
-* Name of the attribute, all in lower case.
-* type
-* The C type of the attribute.
-*/
-
-/* Define the macro. */
-#define MAKE_SET(attribute,lattribute,type) \
-static void Set##attribute( AstRegion *this_region, type value, int *status ) { \
-\
-/* Local Variables: */ \
- AstStc *this; /* Pointer to the Stc structure */ \
-\
-/* Check the global error status. */ \
- if ( !astOK ) return; \
-\
-/* Use the parent method to set the value in the parent Region structure. */ \
- (*parent_set##lattribute)( this_region, value, status ); \
-\
-/* Also set the value in the encapsulated Region. */ \
- this = (AstStc *) this_region; \
- astSet##attribute( this->region, value ); \
-}
-
-/* Use the above macro to create accessors for the MeshSize, Closed and
- FillFactor attributes. */
-MAKE_SET(FillFactor,fillfactor,double)
-MAKE_SET(MeshSize,meshsize,int)
-MAKE_SET(Closed,closed,int)
-MAKE_SET(Negated,negated,int)
-
-/* Undefine the macro. */
-#undef MAKE_SET
-
-/*
-* Name:
-* MAKE_CLEAR
-
-* Purpose:
-* Define a function to clear an attribute value for a Stc.
-
-* Type:
-* Private macro.
-
-* Synopsis:
-* #include "stc.h"
-* MAKE_CLEAR(attribute,lattribute)
-
-* Class Membership:
-* Defined by the Stc class.
-
-* Description:
-* This macro expands to an implementation of a private member function
-* of the form:
-*
-* static void Clear<Attribute>( AstRegion *this )
-*
-* that sets the value of a specified Region attribute in the parent
-* Region structure and also in the encapsulated Region.
-
-* Parameters:
-* attribute
-* Name of the attribute, as it appears in the function name.
-* lattribute
-* Name of the attribute, all in lower case.
-*/
-
-/* Define the macro. */
-#define MAKE_CLEAR(attribute,lattribute) \
-static void Clear##attribute( AstRegion *this_region, int *status ) { \
-\
-/* Local Variables: */ \
- AstStc *this; /* Pointer to the Stc structure */ \
-\
-/* Check the global error status. */ \
- if ( !astOK ) return; \
-\
-/* Use the parent method to clear the value in the parent Region structure. */ \
- (*parent_clear##lattribute)( this_region, status ); \
-\
-/* Also clear the value in the encapsulated Region. */ \
- this = (AstStc *) this_region; \
- astClear##attribute( this->region ); \
-}
-
-/* Use the above macro to create accessors for the MeshSize, Closed and
- FillFactor attributes. */
-MAKE_CLEAR(FillFactor,fillfactor)
-MAKE_CLEAR(MeshSize,meshsize)
-MAKE_CLEAR(Closed,closed)
-MAKE_CLEAR(Negated,negated)
-
-/* Undefine the macro. */
-#undef MAKE_CLEAR
-
-
-/*
-* Name:
-* MAKE_GET
-
-* Purpose:
-* Define a function to get an attribute value for a Stc.
-
-* Type:
-* Private macro.
-
-* Synopsis:
-* #include "stc.h"
-* MAKE_GET(attribute,type,bad)
-
-* Class Membership:
-* Defined by the Stc class.
-
-* Description:
-* This macro expands to an implementation of a private member function
-* of the form:
-*
-* static <Type> Get<Attribute>( AstRegion *this )
-*
-* that gets the value of a specified Region attribute from the encapsulated
-* Region.
-
-* Parameters:
-* attribute
-* Name of the attribute, as it appears in the function name.
-* type
-* The C type of the attribute.
-* bad
-* Value to return in caseof error.
-*/
-
-/* Define the macro. */
-#define MAKE_GET(attribute,type,bad) \
-static type Get##attribute( AstRegion *this_region, int *status ) { \
-\
-/* Local Variables: */ \
- AstStc *this; /* Pointer to the Stc structure */ \
-\
-/* Check the global error status. */ \
- if ( !astOK ) return (bad); \
-\
-/* Get the value from the encapsulated Region. */ \
- this = (AstStc *) this_region; \
- return astGet##attribute( this->region ); \
-}
-
-/* Use the above macro to create accessors for the MeshSize, Closed and
- FillFactor attributes. */
-MAKE_GET(FillFactor,double,AST__BAD)
-MAKE_GET(MeshSize,int,100)
-MAKE_GET(Closed,int,1)
-MAKE_GET(Negated,int,0)
-
-/* Undefine the macro. */
-#undef MAKE_GET
-
-/*
-* Name:
-* MAKE_TEST
-
-* Purpose:
-* Define a function to test an attribute value for a Stc.
-
-* Type:
-* Private macro.
-
-* Synopsis:
-* #include "stc.h"
-* MAKE_TEST(attribute)
-
-* Class Membership:
-* Defined by the Stc class.
-
-* Description:
-* This macro expands to an implementation of a private member function
-* of the form:
-*
-* static int Test<Attribute>( AstRegion *this )
-*
-* that test the value of a specified Region attribute from the encapsulated
-* Region.
-
-* Parameters:
-* attribute
-* Name of the attribute, as it appears in the function name.
-* type
-* The C type of the attribute.
-*/
-
-/* Define the macro. */
-#define MAKE_TEST(attribute) \
-static int Test##attribute( AstRegion *this_region, int *status ) { \
-\
-/* Local Variables: */ \
- AstStc *this; /* Pointer to the Stc structure */ \
-\
-/* Check the global error status. */ \
- if ( !astOK ) return 0; \
-\
-/* Test the value from the encapsulated Region. */ \
- this = (AstStc *) this_region; \
- return astTest##attribute( this->region ); \
-}
-
-/* Use the above macro to create accessors for the MeshSize, Closed and
- FillFactor attributes. */
-MAKE_TEST(FillFactor)
-MAKE_TEST(MeshSize)
-MAKE_TEST(Closed)
-MAKE_TEST(Negated)
-
-/* Undefine the macro. */
-#undef MAKE_TEST
-
-
-
-
-static int GetObjSize( AstObject *this_object, int *status ) {
-/*
-* Name:
-* GetObjSize
-
-* Purpose:
-* Return the in-memory size of an Object.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int GetObjSize( AstObject *this, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astGetObjSize protected
-* method inherited from the parent class).
-
-* Description:
-* This function returns the in-memory size of the supplied Stc,
-* in bytes.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* The Object size, in bytes.
-
-* Notes:
-* - A value of zero will be returned if this function is invoked
-* with the global status set, or if it should fail for any reason.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to Stc structure */
- int result; /* Result value to return */
- int i; /* AstroCoords index */
-
-/* Initialise. */
- result = 0;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Obtain a pointers to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Invoke the GetObjSize method inherited from the parent class, and then
- add on any components of the class structure defined by thsi class
- which are stored in dynamically allocated memory. */
- result = (*parent_getobjsize)( this_object, status );
- result += astGetObjSize( this->region );
-
- if( this->coord ) {
- for( i = 0; i < this->ncoord; i++ ) {
- result += astGetObjSize( this->coord[ i ] );
- }
- result += astTSizeOf( this->coord );
- }
-
-/* If an error occurred, clear the result value. */
- if ( !astOK ) result = 0;
-
-/* Return the result, */
- return result;
-}
-
-static const char *GetAttrib( AstObject *this_object, const char *attrib, int *status ) {
-/*
-* Name:
-* GetAttrib
-
-* Purpose:
-* Get the value of a specified attribute for a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* const char *GetAttrib( AstObject *this, const char *attrib, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the protected astGetAttrib
-* method inherited from the Region class).
-
-* Description:
-* This function returns a pointer to the value of a specified
-* attribute for a Stc, formatted as a character string.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* attrib
-* Pointer to a null-terminated string containing the name of
-* the attribute whose value is required. This name should be in
-* lower case, with all white space removed.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* - Pointer to a null-terminated string containing the attribute
-* value.
-
-* Notes:
-* - The returned string pointer may point at memory allocated
-* within the Stc, or at static memory. The contents of the
-* string may be over-written or the pointer may become invalid
-* following a further invocation of the same function or any
-* modification of the Stc. A copy of the string should
-* therefore be made if necessary.
-* - A NULL pointer will be returned if this function is invoked
-* with the global error status set, or if it should fail for any
-* reason.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- const char *result; /* Pointer value to return */
- int len; /* Length of attrib string */
-
-/* Initialise. */
- result = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Obtain the length of the attrib string. */
- len = strlen( attrib );
-
-/* Compare "attrib" with each recognised attribute name in turn,
- obtaining the value of the required attribute. If necessary, write
- the value into "buff" as a null-terminated string in an appropriate
- format. Set "result" to point at the result string. */
-
-/* RegionClass. */
-/* ------------ */
- if ( !strcmp( attrib, "regionclass" ) ) {
- result = astGetClass( this->region );
-
-/* Not recognised. */
-/* --------------- */
-/* If the attribute name was not recognised, pass it on to the parent
- method for further interpretation. */
- } else {
- result = (*parent_getattrib)( this_object, attrib, status );
- }
-
-/* Return the result. */
- return result;
-}
-
-static int GetBounded( AstRegion *this_region, int *status ) {
-/*
-* Name:
-* GetBounded
-
-* Purpose:
-* Is the Region bounded?
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int GetBounded( AstRegion *this, int *status )
-
-* Class Membership:
-* Stc method (over-rides the astGetBounded method inherited from
-* the Region class).
-
-* Description:
-* This function returns a flag indicating if the Region is bounded.
-* The implementation provided by the base Region class is suitable
-* for Region sub-classes representing the inside of a single closed
-* curve (e.g. Circle, Ellipse, Box, etc). Other sub-classes (such as
-* Stc, PointList, etc ) may need to provide their own implementations.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* Non-zero if the Region is bounded. Zero otherwise.
-
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to Stc structure */
- AstRegion *reg; /* Pointer to the encapsulated Region */
- int neg; /* Negated flag to use */
- int neg_old; /* Original Negated flag */
- int result; /* Returned result */
-
-/* Initialise */
- result = 0;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Get a pointer to the Stc structure. */
- this = (AstStc *) this_region;
-
-/* Get the encapsulated Region, and the Negated value which should be used
- with it. The returned values take account of whether the supplied Stc has
- itself been Negated or not. The returned Region represent a region within
- the base Frame of the FrameSet encapsulated by the parent Region
- structure. */
- GetRegion( this, &reg, &neg, status );
-
-/* Temporarily set the Negated attribute to the required value.*/
- neg_old = astGetNegated( reg );
- astSetNegated( reg, neg );
-
-/* See if the encapsulated Region is bounded. */
- result = astGetBounded( reg );
-
-/* Re-instate the original value for the Negated attribute of the
- encapsulated Region. */
- if( reg ) astSetNegated( reg, neg_old );
-
-/* Free resources. */
- reg = astAnnul( reg );
-
-/* Return zero if an error occurred. */
- if( !astOK ) result = 0;
-
-/* Return the required pointer. */
- return result;
-}
-
-static AstRegion *GetDefUnc( AstRegion *this_region, int *status ) {
-/*
-* Name:
-* GetDefUnc
-
-* Purpose:
-* Obtain a pointer to the default uncertainty Region for a given Region.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* AstRegion *GetDefUnc( AstRegion *this )
-
-* Class Membership:
-* Stc method (over-rides the astGetDefUnc method inherited from
-* the Region class).
-
-* This function returns a pointer to a Region which represents the
-* default uncertainty associated with a position on the boundary of the
-* given Region. The returned Region refers to the base Frame within the
-* FrameSet encapsulated by the supplied Region.
-
-* Parameters:
-* this
-* Pointer to the Region.
-
-* Returned Value:
-* A pointer to the Region. This should be annulled (using astAnnul)
-* when no longer needed.
-
-* Notes:
-* - A NULL pointer will be returned if this function is invoked
-* with the global error status set, or if it should fail for any
-* reason.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- AstRegion *result; /* Returned pointer */
-
-/* Initialise */
- result = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Get a pointer to the Stc structure. */
- this = (AstStc *) this_region;
-
-/* If the encapsulated region has non-default uncertainty, use it as
- the default uncertainty for the Cmpregion. Note, the current Frame of
- an uncertainty Region is assumed to be the same as the base Frame in the
- Stc. */
- if( astTestUnc( this->region ) ) {
- result = astGetUncFrm( this->region, AST__CURRENT );
-
-/* Otherwise, use the parent method to determine the default uncertainty. */
- } else {
- result = (* parent_getdefunc)( this_region, status );
- }
-
-/* Return NULL if an error occurred. */
- if( !astOK ) result = astAnnul( result );
-
-/* Return the required pointer. */
- return result;
-}
-
-static void GetRegion( AstStc *this, AstRegion **reg, int *neg, int *status ) {
-/*
-*
-* Name:
-* GetRegion
-
-* Purpose:
-* Get the encapsulated Region of a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "region.h"
-* void GetRegion( AstStc *this, AstRegion **reg, int *neg, int *status )
-
-* Class Membership:
-* Stc member function
-
-* Description:
-* This function returns a pointer to a Region which is equivalent to
-* the supplied Stc. If the Stc has been negated, then the returned
-* "negated" flag will be set such that it represents the negated Stc.
-*
-* The current Frames in returned encapsulated Region will be equivalent
-* to the base Frame in the FrameSet encapsulated by the parent Region
-* structure.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* reg
-* Address of a location to receive a pointer to the encapsulated
-* Region. The current Frame in this region will be equivalent to
-* the base Frame in the FrameSet
-* neg
-* The value of the Negated attribute to be used with reg.
-* status
-* Pointer to the inherited status variable.
-
-* Notes:
-* - Any changes made to the encapsulated Region using the returned
-* pointer will be reflected in the supplied Stc.
-
-*/
-
-/* Initialise */
- if( reg ) *reg = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Return the component Region pointers. */
- if( reg ) *reg = astClone( this->region );
-
-/* Initialise the other returned items. Note, the Stc initialiser stored a
- deep copy of the supplied encapsulated Region, and so we do not
- need to worry about attributes of the Region having been changed
- after the creation of the Stc. This is different to the CmpMap
- class which merely clones its supplied component pointers and so has
- to save copies of the original Invert settings within the CmpMap
- structure. */
- if( neg ) *neg = astGetNegated( this->region );
-
-/* If the Stc has been inverted, we modify the boolean operator and
- negation flags so that they reflect the inverted Stc. */
- if( astGetNegated( this ) && neg ) *neg = *neg ? 0 : 1;
-}
-
-static const char *GetRegionClass( AstStc *this, int *status ){
-/*
-*+
-* Name:
-* astGetRegionClass
-
-* Purpose:
-* Get the value of a RegionClass attribute for a Stc.
-
-* Type:
-* Protected function.
-
-* Synopsis:
-* #include "stc.h"
-* const char *astGetRegionClass( AstStc *this )
-
-* Class Membership:
-* Stc virtual function
-
-* Description:
-* This function returns a pointer to the value of the RegionClass
-* attribute for a Stc.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-
-* Returned Value:
-* - Pointer to a null-terminated string containing the attribute
-* value.
-
-* Notes:
-* - The returned string pointer may point at memory allocated
-* within the Stc, or at static memory. The contents of the
-* string may be over-written or the pointer may become invalid
-* following a further invocation of the same function or any
-* modification of the Stc. A copy of the string should
-* therefore be made if necessary.
-* - A NULL pointer will be returned if this function is invoked
-* with the global error status set, or if it should fail for any
-* reason.
-*-
-*/
-
-/* Check the global error status. */
- if ( !astOK ) return NULL;
-
-/* Obtain and return the class of the encapsulated Region. */
- return astGetClass( ((AstStc *) this)->region );
-}
-
-
-static AstKeyMap *GetStcCoord( AstStc *this, int icoord, int *status ){
-/*
-*++
-* Name:
-c astGetStcCoord
-f AST_GETSTCCOORD
-
-* Purpose:
-* Return information about an AstroCoords element stored in an Stc.
-
-* Type:
-* Public virtual function.
-
-* Synopsis:
-c #include "specframe.h"
-c AstKeyMap *astGetStcCoord( AstStc *this, int icoord )
-f RESULT = AST_GETSTCCOORD( THIS, ICOORD, STATUS )
-
-* Class Membership:
-* Stc method.
-
-* Description:
-* When any sub-class of Stc is created, the constructor function
-* allows one or more AstroCoords elements to be stored within the Stc.
-* This function allows any one of these AstroCoords elements to be
-* retrieved. The format of the returned information is the same as
-* that used to pass the original information to the Stc constructor.
-* That is, the information is returned in a KeyMap structure
-* containing elements with one or more of the keys given by symbolic
-* constants AST__STCNAME, AST__STCVALUE, AST__STCERROR, AST__STCRES,
-* AST__STCSIZE and AST__STCPIXSZ.
-*
-* If the coordinate system represented by the Stc has been changed
-* since it was created (for instance, by changing its System
-* attribute), then the sizes and positions in the returned KeyMap
-* will reflect the change in coordinate system.
-
-* Parameters:
-c this
-f THIS = INTEGER (Given)
-* Pointer to the Stc.
-c icoord
-f ICOORD = INTEGER (Given)
-* The index of the AstroCoords element required. The first has index
-* one. The number of AstroCoords elements in the Stc can be found using
-c function astGetStcNcoord.
-f function AST_GETSTCNCOORD.
-f STATUS = INTEGER (Given and Returned)
-f The global status.
-
-* Returned Value:
-c astGetStcCoord()
-f AST_GETSTCCOORD = INTEGER
-* A pointer to a new KeyMap containing the required information.
-
-* Notes:
-* - A null Object pointer (AST__NULL) will be returned if this
-c function is invoked with the AST error status set, or if it
-f function is invoked with STATUS set to an error value, or if it
-* should fail for any reason.
-*--
-*/
-
-/* Local Variables: */
- AstFrame *frm;
- AstKeyMap *result;
- AstMapping *map;
- AstMapping *smap;
- AstObject *obj;
- AstRegion *reg;
- AstRegion *rereg;
- AstRegion *srereg;
- int ikey;
- int nc;
-
-/* Initialise. */
- result = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Validate the supplied index. */
- nc = astGetStcNCoord( this );
- if( icoord < 1 || icoord > nc ) {
- astError( AST__STCIND, "astGetStcCoord(%s): Supplied AstroCoords "
- "index (%d) is invalid.", status, astGetClass( this ), icoord );
-
- if( icoord < 1 ) {
- astError( AST__STCIND, "The index of the first AstroCoord "
- "element is one, not zero." , status);
- } else if( nc == 0 ) {
- astError( AST__STCIND, "There are no AstroCoords elements in "
- "the supplied %s.", status, astGetClass( this ) );
- } else if( nc == 1 ) {
- astError( AST__STCIND, "There is 1 AstroCoords element in "
- "the supplied %s.", status, astGetClass( this ) );
- } else {
- astError( AST__STCIND, "There are %d AstroCoords elements in "
- "the supplied %s.", status, nc, astGetClass( this ) );
- }
-
-/* If the index is OK, initialise the returned KeyMap to be a copy of the
- KeyMap holding information about the required AstroCoords element.*/
- } else {
- result = astCopy( this->coord[ icoord - 1 ] );
-
-/* The Regions stored within this KeyMap describe regions within the base
- Frame of the parent Region structure. If the Mapping from base to current
- Frame in the parent Region structure is not a UnitMap, we need to
- change these to represent regions within the current Frame of the
- parent Region structure. */
- map = astGetMapping( ((AstRegion *)this)->frameset,
- AST__BASE, AST__CURRENT );
- smap = astSimplify( map );
- frm = astGetFrame( ((AstRegion *)this)->frameset, AST__CURRENT );
-
-/* If the Frame represented by the Region has changed, erase the Names
- element since they may no longer be correct. */
- if( !astIsAUnitMap( smap ) ) astMapRemove( result, AST__STCNAME );
-
-/* Loop round keys for which a Region may be stored in the KeyMap. */
- for( ikey = 0; ikey < NREG; ikey++ ) {
-
-/* If the KeyMap contains a Region for this key, get a pointer to it. */
- if( astMapGet0A( result, regkey[ ikey ], &obj ) ){
- reg = (AstRegion *) obj;
-
-/* Sets its RegionFS attribute so that the encapsulated FrameSet will be
- included in any dump of the Region. This is needed since the returned
- Region pointer will have no parent Region from which the FrameSet can
- be determined. */
- astSetRegionFS( reg, 1 );
-
-/* If necessary, remap the Region into the current Frame, and simplify. */
- if( !astIsAUnitMap( smap ) ) {
- rereg = astMapRegion( reg, smap, frm );
- srereg = astSimplify( rereg );
- rereg = astAnnul( rereg );
- } else {
- srereg = astClone( reg );
- }
-
-/* Replace the Region in the KeyMap with the remapped Region. */
- astMapPut0A( result, regkey[ ikey ], srereg, NULL );
-
-/* Free resources */
- reg = astAnnul( reg );
- srereg = astAnnul( srereg );
- }
- }
-
- frm = astAnnul( frm );
- map = astAnnul( map );
- smap = astAnnul( smap );
-
-/* Annul the returned KeyMap if an error has occurred. */
- if( !astOK ) result = astAnnul( result );
- }
-
-/* Return the pointer */
- return result;
-
-}
-
-static int GetStcNCoord( AstStc *this, int *status ){
-/*
-*++
-* Name:
-c astGetStcNCoord
-f AST_GETSTCNCOORD
-
-* Purpose:
-* Return the number of AstroCoords elements stored in an Stc.
-
-* Type:
-* Public virtual function.
-
-* Synopsis:
-c #include "stc.h"
-c int astGetStcNCoord( AstStc *this )
-f RESULT = AST_GETSTCNCOORD( THIS, STATUS )
-
-* Class Membership:
-* Stc method.
-
-* Description:
-* This function returns the number of AstroCoords elements stored in
-* an Stc.
-
-* Parameters:
-c this
-f THIS = INTEGER (Given)
-* Pointer to the Stc.
-f STATUS = INTEGER (Given and Returned)
-f The global status.
-
-* Returned Value:
-c astGetStcNCoord()
-f AST_GETSTCNCOORD = INTEGER
-* The number of AstroCoords elements stored in the Stc.
-
-* Notes:
-* - Zero will be returned if this
-c function is invoked with the AST error status set, or if it
-f function is invoked with STATUS set to an error value, or if it
-* should fail for any reason.
-*--
-*/
-
-/* Return the required value. */
- return astOK ? this->ncoord : 0;
-
-}
-
-static AstRegion *GetStcRegion( AstStc *this, int *status ) {
-/*
-*++
-* Name:
-c astGetStcRegion
-f AST_GETSTCREGION
-
-* Purpose:
-* Obtain a copy of the encapsulated Region within a Stc.
-
-* Type:
-* Public virtual function.
-
-* Synopsis:
-c #include "stc.h"
-c AstRegion *astGetStcRegion( AstStc *this )
-f RESULT = AST_GETSTCREGION( THIS, STATUS )
-
-* Class Membership:
-* Region method.
-
-* Description:
-* This function returns a pointer to a deep copy of the Region
-* supplied when the Stc was created.
-
-* Parameters:
-c this
-f THIS = INTEGER (Given)
-* Pointer to the Stc.
-f STATUS = INTEGER (Given and Returned)
-f The global status.
-
-* Returned Value:
-c astGetStcRegion()
-f AST_GETSTCREGION = INTEGER
-* A pointer to a deep copy of the Region encapsulated within the
-* supplied Stc.
-
-* Notes:
-* - A null Object pointer (AST__NULL) will be returned if this
-c function is invoked with the AST error status set, or if it
-f function is invoked with STATUS set to an error value, or if it
-* should fail for any reason.
-*--
-*/
-
-/* Check the global error status. */
- if ( !astOK ) return NULL;
-
-/* Return a pointer to a copy of the encapsulated Region. */
- return astCopy( this->region );
-}
-
-static int GetUseDefs( AstObject *this_object, int *status ) {
-/*
-* Name:
-* GetUseDefs
-
-* Purpose:
-* Get the value of the UseDefs attribute for a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int GetUseDefs( AstObject *this_object, int *status ) {
-
-* Class Membership:
-* Stc member function (over-rides the protected astGetUseDefs
-* method inherited from the Region class).
-
-* Description:
-* This function returns the value of the UseDefs attribute for a
-* Stc, supplying a suitable default.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* - The USeDefs value.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- int result; /* Value to return */
-
-/* Initialise. */
- result = 0;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* If the UseDefs value for the Stc has been set explicitly, use the
- Get method inherited from the parent Region class to get its value. */
- if( astTestUseDefs( this ) ) {
- result = (*parent_getusedefs)( this_object, status );
-
-/* Otherwise, supply a default value equal to the UseDefs value of the
- encapsulated Region. */
- } else {
- result = astGetUseDefs( this->region );
- }
-
-/* Return the result. */
- return result;
-}
-
-void astInitStcVtab_( AstStcVtab *vtab, const char *name, int *status ) {
-/*
-*+
-* Name:
-* astInitStcVtab
-
-* Purpose:
-* Initialise a virtual function table for a Stc.
-
-* Type:
-* Protected function.
-
-* Synopsis:
-* #include "stc.h"
-* void astInitStcVtab( AstStcVtab *vtab, const char *name )
-
-* Class Membership:
-* Stc vtab initialiser.
-
-* Description:
-* This function initialises the component of a virtual function
-* table which is used by the Stc class.
-
-* Parameters:
-* vtab
-* Pointer to the virtual function table. The components used by
-* all ancestral classes will be initialised if they have not already
-* been initialised.
-* name
-* Pointer to a constant null-terminated character string which contains
-* the name of the class to which the virtual function table belongs (it
-* is this pointer value that will subsequently be returned by the Object
-* astClass function).
-*-
-*/
-
-/* Local Variables: */
- astDECLARE_GLOBALS /* Pointer to thread-specific global data */
- AstObjectVtab *object; /* Pointer to Object component of Vtab */
- AstMappingVtab *mapping; /* Pointer to Mapping component of Vtab */
- AstRegionVtab *region; /* Pointer to Region component of Vtab */
-
-/* Check the local error status. */
- if ( !astOK ) return;
-
-/* Get a pointer to the thread specific global data structure. */
- astGET_GLOBALS(NULL);
-
-/* Initialize the component of the virtual function table used by the
- parent class. */
- astInitRegionVtab( (AstRegionVtab *) vtab, name );
-
-/* Store a unique "magic" value in the virtual function table. This
- will be used (by astIsAStc) to determine if an object belongs to
- this class. We can conveniently use the address of the (static)
- class_check variable to generate this unique value. */
- vtab->id.check = &class_check;
- vtab->id.parent = &(((AstRegionVtab *) vtab)->id);
-
-/* Initialise member function pointers. */
-/* ------------------------------------ */
-/* Store pointers to the member functions (implemented here) that
- provide virtual methods for this class. */
-
- vtab->GetRegionClass = GetRegionClass;
- vtab->GetStcRegion = GetStcRegion;
- vtab->GetStcCoord = GetStcCoord;
- vtab->GetStcNCoord = GetStcNCoord;
-
-/* Save the inherited pointers to methods that will be extended, and
- replace them with pointers to the new member functions. */
- object = (AstObjectVtab *) vtab;
- mapping = (AstMappingVtab *) vtab;
- region = (AstRegionVtab *) vtab;
-
- parent_getobjsize = object->GetObjSize;
- object->GetObjSize = GetObjSize;
-
-#if defined(THREAD_SAFE)
- parent_managelock = object->ManageLock;
- object->ManageLock = ManageLock;
-#endif
-
- parent_clearattrib = object->ClearAttrib;
- object->ClearAttrib = ClearAttrib;
-
- parent_getattrib = object->GetAttrib;
- object->GetAttrib = GetAttrib;
-
- parent_setattrib = object->SetAttrib;
- object->SetAttrib = SetAttrib;
-
- parent_testattrib = object->TestAttrib;
- object->TestAttrib = TestAttrib;
-
- parent_transform = mapping->Transform;
- mapping->Transform = Transform;
-
- parent_simplify = mapping->Simplify;
- mapping->Simplify = Simplify;
-
- parent_setregfs = region->SetRegFS;
- region->SetRegFS = SetRegFS;
-
- parent_equal = object->Equal;
- object->Equal = Equal;
-
- parent_clearclosed = region->ClearClosed;
- region->ClearClosed = ClearClosed;
-
- parent_setclosed = region->SetClosed;
- region->SetClosed = SetClosed;
-
- region->TestClosed = TestClosed;
- region->GetClosed = GetClosed;
-
- parent_regsetattrib = region->RegSetAttrib;
- region->RegSetAttrib = RegSetAttrib;
-
- parent_regclearattrib = region->RegClearAttrib;
- region->RegClearAttrib = RegClearAttrib;
-
- parent_clearnegated = region->ClearNegated;
- region->ClearNegated = ClearNegated;
-
- parent_setnegated = region->SetNegated;
- region->SetNegated = SetNegated;
-
- region->TestNegated = TestNegated;
- region->GetNegated = GetNegated;
-
- parent_setmeshsize = region->SetMeshSize;
- region->SetMeshSize = SetMeshSize;
-
- parent_clearmeshsize = region->ClearMeshSize;
- region->ClearMeshSize = ClearMeshSize;
-
- region->TestMeshSize = TestMeshSize;
- region->GetMeshSize = GetMeshSize;
-
- parent_setfillfactor = region->SetFillFactor;
- region->SetFillFactor = SetFillFactor;
-
- parent_clearfillfactor = region->ClearFillFactor;
- region->ClearFillFactor = ClearFillFactor;
-
- region->TestFillFactor = TestFillFactor;
- region->GetFillFactor = GetFillFactor;
-
- parent_getusedefs = object->GetUseDefs;
- object->GetUseDefs = GetUseDefs;
-
- parent_getdefunc = region->GetDefUnc;
- region->GetDefUnc = GetDefUnc;
-
-/* Store replacement pointers for methods which will be over-ridden by
- new member functions implemented here. */
- region->Overlap = Overlap;
- region->OverlapX = OverlapX;
- region->RegBaseBox = RegBaseBox;
- region->RegBaseMesh = RegBaseMesh;
- region->RegBasePick = RegBasePick;
- region->RegPins = RegPins;
- region->GetBounded = GetBounded;
-
-/* Declare the copy constructor, destructor and class dump function. */
- astSetCopy( vtab, Copy );
- astSetDelete( vtab, Delete );
- astSetDump( vtab, Dump, "Stc", "An IVOA Space-Time-Coords object" );
-
-/* If we have just initialised the vtab for the current class, indicate
- that the vtab is now initialised, and store a pointer to the class
- identifier in the base "object" level of the vtab. */
- if( vtab == &class_vtab ) {
- class_init = 1;
- astSetVtabClassIdentifier( vtab, &(vtab->id) );
- }
-}
-
-static AstKeyMap *MakeAstroCoordsKeyMap( AstRegion *reg, AstKeyMap *coord,
- const char *class, int *status ){
-/*
-* Name:
-* MakeAstroCoordsKeyMap
-
-* Purpose:
-* Create a new KeyMap holding Regions describing a supplied
-* AstroCoords element.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* AstKeyMap *MakeAstroCoordsKeyMap( AstRegion *reg, AstKeyMap *coord,
-* const char *class, int *status )
-
-* Class Membership:
-* Stc member function
-
-* Description:
-* This function returns a pointer to a new KeyMap containing elements
-* which correspond to the components of an STC AstroCoords element.
-* The element with key AST__STCNAME holds a vector of character
-* strings containing the names associated with each of the axies.
-* The other elements of the returned KeyMap such as AST__STCERROR,
-* AST__STCRES, etc, hold pointers to Regions describing the error
-* box, resolution, etc, in the Frame of the supplied Region "reg".
-
-* Parameters:
-* reg
-* Pointer to the Region in which the AstroCoords is defined.
-* coordId
-* An ID (not a pointer) to a KeyMap defining a single <AstroCoords>
-* element, having elements with keys given by constants AST__STCNAME,
-* AST__STCVALUE, AST__STCERROR, AST__STCRES, AST__STCSIZE,
-* AST__STCPIXSZ. Any of these elements may be omitted, but no other
-* elements should be included. If supplied, the AST__STCNAME element
-* should be a vector of character string pointers holding the "Name"
-* item for each axis. Any other supplied elements should be scalar
-* elements, each holding a pointer to a Region describing the
-* associated item of ancillary information (error, resolution, size,
-* pixel size or value). These Regions should refer to the coordinate
-* system represented by "region".
-* class
-* Pointer to a string holding the STC class name.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* - Pointer to the new KeyMap.
-
-* Notes:
-* - A NULL pointer will be returned if this function is invoked
-* with the global error status set, or if it should fail for any
-* reason.
-*/
-
-/* Local Variables: */
- AstFrame *frm; /* Pointer to current Frame */
- AstFrameSet *fs; /* Pointer to conversion FrameSet */
- AstKeyMap *result; /* Pointer value to return */
- AstMapping *map; /* Pointer to conversion Mapping */
- AstObject *obj; /* Pointer to Object stored in supplied KeyMap */
- AstRegion *areg; /* Pointer to remapped Region */
- AstRegion *sareg; /* Pointer to simplified remapped Region */
- const char *key; /* Current key */
- int j; /* Index of key within KeyMap */
- int naxes; /* Number of axes in region */
- int nkey; /* Number of keys in supplied KeyMap */
- int nv; /* Number of values in KeyMap element */
- int type; /* Data type of entry */
-
-/* Initialise. */
- result = NULL;
-
-/* Check the global error status. */
- if( !astOK ) return result;
-
-/* Confirm it is a genuine KeyMap pointer. */
- if( !astIsAKeyMap( coord ) && astOK ) {
- astError( AST__STCKEY, "astInitStc(%s): Supplied pointer is for "
- "a %s, not a KeyMap.", status, class, astGetClass( coord ) );
- }
-
-/* Initialise the new KeyMap to be a copy of the supplied KeyMap. */
- result = astCopy( coord );
-
-/* Check the supplied KeyMap is usable. */
- naxes = astGetNaxes( reg );
- nkey = astMapSize( result );
- for( j = 0; j < nkey; j++ ) {
- key = astMapKey( result, j );
- if( key ) {
- nv = astMapLength( result, key );
- type = astMapType( result, key );
-
-/* Check no unknown keys are present in the KeyMap. */
- if( strcmp( key, AST__STCNAME ) &&
- strcmp( key, AST__STCVALUE ) &&
- strcmp( key, AST__STCERROR ) &&
- strcmp( key, AST__STCRES ) &&
- strcmp( key, AST__STCSIZE ) &&
- strcmp( key, AST__STCPIXSZ ) ) {
- astError( AST__STCKEY, "astInitStc(%s): Unknown key "
- "\"%s\" supplied in an AstroCoords list.", status,
- class, key );
- break;
-
-/* Check that the "Name" element is a vector of "naxes" strings. */
- } else if( !strcmp( key, AST__STCNAME ) ) {
- if( nv != naxes ) {
- astError( AST__STCKEY, "astInitStc(%s): %d \"%s\" "
- "values supplied in an AstroCoords list, but "
- "the Stc has %d axes. ", status, class, nv, key,
- naxes );
- break;
-
- } else if( type != AST__STRINGTYPE ) {
- astError( AST__STCKEY, "astInitStc(%s): The \"%s\" "
- "values supplied in an AstroCoords list are "
- "not character strings. ", status, class, key );
- break;
- }
-
-/* Check that all other elements are scalar. */
- } else if( nv != 1 ) {
- astError( AST__STCKEY, "astInitStc(%s): %d \"%s\" "
- "values supplied in an AstroCoords list, but "
- "only one is allowed. ", status, class, nv, key );
- break;
-
-/* Check that all other elements are AST Object pointers. */
- } else if( type != AST__OBJECTTYPE ) {
- astError( AST__STCKEY, "astInitStc(%s): The \"%s\" "
- "value supplied in an AstroCoords list is "
- "not an AST Object pointer. ", status, class, key );
- break;
-
-/* Check that the Object pointers are not NULL. */
- } else {
- astMapGet0A( result, key, &obj );
- if( astOK ) {
- if( !obj ) {
- astError( AST__STCKEY, "astInitStc(%s): The \"%s\" "
- "value supplied in an AstroCoords list is "
- "a NULL pointer. ", status, class, key );
- break;
-
-/* Check that the Object pointers are Region pointers. */
- } else if( !astIsARegion( obj ) ){
- astError( AST__STCKEY, "astInitStc(%s): The \"%s\" "
- "value supplied in an AstroCoords list is "
- "a %s, not a Region. ", status, class, key,
- astGetClass(obj) );
- obj = astAnnul( obj );
- break;
-
-/* Check that the Region pointers can be converted to the coordinate
- system represented by the supplied Region. */
- } else {
- fs = astConvert( obj, reg, "" );
- if( !fs ) {
- obj = astAnnul( obj );
- astError( AST__STCKEY, "astInitStc(%s): The \"%s\" "
- "value supplied in an AstroCoords list "
- "cannot be converted to the coordinate "
- "system of its parent Stc object.", status, class,
- key );
- break;
-
-/* If necessary, map the Region into the same frame as the supplied
- Region, and replace the Region in the returned KeyMap with the
- remapped Region. Also set the RegionFS attribute to indicate that the
- FrameSet in the Region does not need to be dumped if it contains a
- UnitMap. */
- } else {
- map = astGetMapping( fs, AST__BASE, AST__CURRENT );
- if( !astIsAUnitMap( map ) ) {
- frm = astGetFrame( fs, AST__CURRENT );
- areg = astMapRegion( (AstRegion *) obj, map, frm );
- sareg = astSimplify( areg );
- astSetRegionFS( sareg, 0 );
- astMapPut0A( result, key, sareg, NULL );
- areg = astAnnul( areg );
- sareg = astAnnul( sareg );
- frm = astAnnul( frm );
- } else {
- astSetRegionFS( (AstRegion *) obj, 0 );
- }
- map = astAnnul( map );
- fs = astAnnul( fs );
-
- }
- obj = astAnnul( obj );
- }
- }
- }
- }
- }
-
-/* Free the returned KeyMap if an error has occurred. */
- if( !astOK ) result = astAnnul( result );
-
-/* Return the result */
- return result;
-
-}
-
-#if defined(THREAD_SAFE)
-static int ManageLock( AstObject *this_object, int mode, int extra,
- AstObject **fail, int *status ) {
-/*
-* Name:
-* ManageLock
-
-* Purpose:
-* Manage the thread lock on an Object.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "object.h"
-* AstObject *ManageLock( AstObject *this, int mode, int extra,
-* AstObject **fail, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astManageLock protected
-* method inherited from the parent class).
-
-* Description:
-* This function manages the thread lock on the supplied Object. The
-* lock can be locked, unlocked or checked by this function as
-* deteremined by parameter "mode". See astLock for details of the way
-* these locks are used.
-
-* Parameters:
-* this
-* Pointer to the Object.
-* mode
-* An integer flag indicating what the function should do:
-*
-* AST__LOCK: Lock the Object for exclusive use by the calling
-* thread. The "extra" value indicates what should be done if the
-* Object is already locked (wait or report an error - see astLock).
-*
-* AST__UNLOCK: Unlock the Object for use by other threads.
-*
-* AST__CHECKLOCK: Check that the object is locked for use by the
-* calling thread (report an error if not).
-* extra
-* Extra mode-specific information.
-* fail
-* If a non-zero function value is returned, a pointer to the
-* Object that caused the failure is returned at "*fail". This may
-* be "this" or it may be an Object contained within "this". Note,
-* the Object's reference count is not incremented, and so the
-* returned pointer should not be annulled. A NULL pointer is
-* returned if this function returns a value of zero.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* A local status value:
-* 0 - Success
-* 1 - Could not lock or unlock the object because it was already
-* locked by another thread.
-* 2 - Failed to lock a POSIX mutex
-* 3 - Failed to unlock a POSIX mutex
-* 4 - Bad "mode" value supplied.
-
-* Notes:
-* - This function attempts to execute even if an error has already
-* occurred.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to STC structure */
- int i; /* Loop count */
- int result; /* Returned status value */
-
-/* Initialise */
- result = 0;
-
-/* Check the supplied pointer is not NULL. */
- if( !this_object ) return result;
-
-/* Obtain a pointers to the STC structure. */
- this = (AstStc *) this_object;
-
-/* Invoke the ManageLock method inherited from the parent class. */
- if( !result ) result = (*parent_managelock)( this_object, mode, extra,
- fail, status );
-
-/* Invoke the astManageLock method on any Objects contained within
- the supplied Object. */
- if( !result ) result = astManageLock( this->region, mode, extra, fail );
- for( i = 0; i < this->ncoord; i++ ) {
- if( !result ) result = astManageLock( this->coord[ i ], mode,
- extra, fail );
- }
-
- return result;
-
-}
-#endif
-
-static int Overlap( AstRegion *this, AstRegion *that, int *status ){
-/*
-* Name:
-* Overlap
-
-* Purpose:
-* Test if two regions overlap each other.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int Overlap( AstRegion *this, AstRegion *that, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astOverlap method inherited
-* from the Region class).
-
-* Description:
-* This function returns an integer value indicating if the two
-* supplied Regions overlap. The two Regions are converted to a commnon
-* coordinate system before performing the check. If this conversion is
-* not possible (for instance because the two Regions represent areas in
-* different domains), then the check cannot be performed and a zero value
-* is returned to indicate this.
-
-* Parameters:
-* this
-* Pointer to the first Region.
-* that
-* Pointer to the second Region.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* astOverlap()
-* A value indicating if there is any overlap between the two Regions.
-* Possible values are:
-*
-* 0 - The check could not be performed because the second Region
-* could not be mapped into the coordinate system of the first
-* Region.
-*
-* 1 - There is no overlap between the two Regions.
-*
-* 2 - The first Region is completely inside the second Region.
-*
-* 3 - The second Region is completely inside the first Region.
-*
-* 4 - There is partial overlap between the two Regions.
-*
-* 5 - The Regions are identical.
-*
-* 6 - The second Region is the negation of the first Region.
-
-* Notes:
-* - The returned values 5 and 6 do not check the value of the Closed
-* attribute in the two Regions.
-* - A value of zero will be returned if this function is invoked with the
-* AST error status set, or if it should fail for any reason.
-
-*/
-
-/* Check the inherited status. */
- if ( !astOK ) return 0;
-
-/* Invoke the "astOverlap" method on the encapsulated Region. */
- return astOverlap( ((AstStc *)this)->region, that );
-}
-
-static int OverlapX( AstRegion *that, AstRegion *this, int *status ){
-/*
-* Name:
-* OverlapX
-
-* Purpose:
-* Test if two regions overlap each other.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int OverlapX( AstRegion *that, AstRegion *this )
-
-* Class Membership:
-* Stc member function (over-rides the astOverlapX method inherited
-* from the Region class).
-
-* Description:
-* This function performs the processing for the public astOverlap
-* method and has exactly the same interface except that the order
-* of the two arguments is swapped. This is a trick to allow
-* the astOverlap method to be over-ridden by derived classes on
-* the basis of the class of either of its two arguments.
-*
-* See the astOverlap method for details of the interface.
-
-*/
-
-/* Local Variables: */
- int result;
-
-/* Check the inherited status. */
- if ( !astOK ) return 0;
-
-/* Invoke the "astOverlapX" method on the encapsulated Region. */
- result = astOverlap( ((AstStc *)that)->region, this );
-
-/* Swap the returned values 2 and 3 to take account of the swapping of
- the regions.*/
- if( result == 2 ) {
- result = 3;
- } else if( result == 3 ) {
- result = 2;
- }
-
-/* Return the result. */
- return result;
-}
-
-static void RegBaseBox( AstRegion *this, double *lbnd, double *ubnd, int *status ){
-/*
-* Name:
-* RegBaseBox
-
-* Purpose:
-* Returns the bounding box of an un-negated Region in the base Frame of
-* the encapsulated FrameSet.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* void RegBaseBox( AstRegion *this, double *lbnd, double *ubnd, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astRegBaseBox protected
-* method inherited from the Region class).
-
-* Description:
-* This function returns the upper and lower axis bounds of a Region in
-* the base Frame of the encapsulated FrameSet, assuming the Region
-* has not been negated. That is, the value of the Negated attribute
-* is ignored.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* lbnd
-* Pointer to an array in which to return the lower axis bounds
-* covered by the Region in the base Frame of the encapsulated
-* FrameSet. It should have at least as many elements as there are
-* axes in the base Frame.
-* ubnd
-* Pointer to an array in which to return the upper axis bounds
-* covered by the Region in the base Frame of the encapsulated
-* FrameSet. It should have at least as many elements as there are
-* axes in the base Frame.
-* status
-* Pointer to the inherited status variable.
-
-*/
-
-/* Check the global error status. */
- if( !astOK ) return;
-
-/* Invoke the method on the encapsulated Region. */
- astRegBaseBox( ((AstStc *)this)->region, lbnd, ubnd );
-}
-
-static AstPointSet *RegBaseMesh( AstRegion *this, int *status ){
-/*
-* Name:
-* RegBaseMesh
-
-* Purpose:
-* Create a new PointSet containing a mesh of points on the boundary of a
-* Region in its base Frame.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* AstPointSet *astRegBaseMesh( AstRegion *this, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astRegBaseMesh protected
-* method inherited from the Region class).
-
-* Description:
-* This function creates a new PointSet containing a mesh of points on the
-* boundary of the Region. The points refer to the base Frame of
-* the encapsulated FrameSet.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* Pointer to the PointSet. Annul the pointer using astAnnul when it
-* is no longer needed.
-
-* Notes:
-* - A NULL pointer is returned if an error has already occurred, or if
-* this function should fail for any reason.
-
-*/
-
-/* Check the global error status. */
- if( !astOK ) return NULL;
-
-/* Invoke the astRegMesh method on the encapsulated Region. This returns
- a mesh in the current Frame of the encapsulated Region which is the same
- as the base Frame of the Stc Region. */
- return astRegMesh( ((AstStc *)this)->region );
-}
-
-static AstRegion *RegBasePick( AstRegion *this_region, int naxes,
- const int *axes, int *status ){
-/*
-* Name:
-* RegBasePick
-
-* Purpose:
-* Return a Region formed by picking selected base Frame axes from the
-* supplied Region.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* AstRegion *RegBasePick( AstRegion *this, int naxes, const int *axes,
-* int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astRegBasePick protected
-* method inherited from the Region class).
-
-* Description:
-* This function attempts to return a Region that is spanned by selected
-* axes from the base Frame of the encapsulated FrameSet of the supplied
-* Region. This may or may not be possible, depending on the class of
-* Region. If it is not possible a NULL pointer is returned.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* naxes
-* The number of base Frame axes to select.
-* axes
-* An array holding the zero-based indices of the base Frame axes
-* that are to be selected.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* Pointer to the Region, or NULL if no region can be formed.
-
-* Notes:
-* - A NULL pointer is returned if an error has already occurred, or if
-* this function should fail for any reason.
-*/
-
-/* Check the global error status. */
- if ( !astOK ) return NULL;
-
-/* Invoke the astRegBaePick method on the encapsulated Region. */
- return astRegBasePick( ((AstStc *)this_region)->region, naxes, axes );
-}
-
-static void RegClearAttrib( AstRegion *this_region, const char *attrib,
- char **base_attrib, int *status ) {
-/*
-* Name:
-* RegClearAttrib
-
-* Purpose:
-* Clear an attribute value for a Region.
-
-* Type:
-* Protected function.
-
-* Synopsis:
-* #include "stc.h"
-* void RegClearAttrib( AstRegion *this, const char *attrib,
-* char **base_attrib, int *status )
-
-* Class Membership:
-* Stc method (over-rides the astRegClearAttrib method inherited from
-* the Region class).
-
-* Description:
-* This function clears the value of an attribute in both the base and
-* current Frame in the FrameSet encapsulated within a Region, without
-* remapping either Frame.
-*
-* No error is reported if the attribute is not recognised by the base
-* Frame.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* attrib
-* Pointer to a null terminated string containing an attribute name.
-* NOTE, IT SHOULD BE ENTIRELY LOWER CASE.
-* base_attrib
-* Address of a location at which to return a pointer to the null
-* terminated string holding the name of the attribute which was
-* cleared in the base Frame of the encapsulated FrameSet. This may
-* differ from the supplied name if the supplied name contains an axis
-* index and the current->base Mapping in the FrameSet produces an
-* axis permutation. The returned pointer should be freed using
-* astFree when no longer needed. A NULL pointer may be supplied in
-* which case no pointer is returned.
-* status
-* Pointer to the inherited status variable.
-
-*/
-
-/* Local Variables: */
- AstStc *this;
- char *batt;
- int rep;
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Get a pointer to the Stc structure. */
- this = (AstStc *) this_region;
-
-/* Use the RegClearAttrib method inherited from the parent class to clear
- the attribute in the current and base Frames in the FrameSet encapsulated
- by the parent Region structure. */
- (*parent_regclearattrib)( this_region, attrib, &batt, status );
-
-/* Now clear the base Frame attribute in the encapsulated Region (the current
- Frame within the encapsulated Region is equivalent to the base Frame in the
- parent Region structure). Annul any "attribute unknown" error that results
- from attempting to do this. */
- if( astOK ) {
- rep = astReporting( 0 );
- astRegClearAttrib( this->region, batt, NULL );
- if( astStatus == AST__BADAT ) astClearStatus;
- astReporting( rep );
- }
-
-/* If required, return the base Frame attribute name, otherwise free it. */
- if( base_attrib ) {
- *base_attrib = batt;
- } else {
- batt = astFree( batt );
- }
-}
-
-static int RegPins( AstRegion *this, AstPointSet *pset, AstRegion *unc,
- int **mask, int *status ){
-/*
-* Name:
-* RegPins
-
-* Purpose:
-* Check if a set of points fall on the boundary of a given Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int RegPins( AstRegion *this, AstPointSet *pset, AstRegion *unc,
-* int **mask, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astRegPins protected
-* method inherited from the Region class).
-
-* Description:
-* This function returns a flag indicating if the supplied set of
-* points all fall on the boundary of the given Stc.
-*
-* Some tolerance is allowed, as specified by the uncertainty Region
-* stored in the supplied Stc "this", and the supplied uncertainty
-* Region "unc" which describes the uncertainty of the supplied points.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* pset
-* Pointer to the PointSet. The points are assumed to refer to the
-* base Frame of the FrameSet encapsulated by "this".
-* unc
-* Pointer to a Region representing the uncertainties in the points
-* given by "pset". The Region is assumed to represent the base Frame
-* of the FrameSet encapsulated by "this". Zero uncertainity is assumed
-* if NULL is supplied.
-* mask
-* Pointer to location at which to return a pointer to a newly
-* allocated dynamic array of ints. The number of elements in this
-* array is equal to the value of the Npoint attribute of "pset".
-* Each element in the returned array is set to 1 if the
-* corresponding position in "pset" is on the boundary of the Region
-* and is set to zero otherwise. A NULL value may be supplied
-* in which case no array is created. If created, the array should
-* be freed using astFree when no longer needed.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* Non-zero if the points all fall on the boundary of the given
-* Region, to within the tolerance specified. Zero otherwise.
-
-*/
-
-/* Check the global error status. */
- if( !astOK ) return 0;
-
-/* Invoke the method on the encapsulated Region. */
- return astRegPins( ((AstStc *)this)->region, pset, unc, mask );
-}
-
-static void RegSetAttrib( AstRegion *this_region, const char *setting,
- char **base_setting, int *status ) {
-/*
-* Name:
-* RegSetAttrib
-
-* Purpose:
-* Set an attribute value for a Region.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* void RegSetAttrib( AstRegion *this, const char *setting,
-* char **base_setting, int *status )
-
-* Class Membership:
-* Stc method (over-rides the astRegSetAttrib method inherited from
-* the Region class).
-
-* Description:
-* This function assigns an attribute value to both the base and
-* current Frame in the FrameSet encapsulated within a Region, without
-* remapping either Frame.
-*
-* No error is reported if the attribute is not recognised by the base
-* Frame.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* setting
-* Pointer to a null terminated attribute setting string. NOTE, IT
-* SHOULD BE ENTIRELY LOWER CASE. The supplied string will be
-* interpreted using the public interpretation implemented by
-* astSetAttrib. This can be different to the interpretation of the
-* protected accessor functions. For instance, the public
-* interpretation of an unqualified floating point value for the
-* Epoch attribute is to interpet the value as a gregorian year,
-* but the protected interpretation is to interpret the value as an
-* MJD.
-* base_setting
-* Address of a location at which to return a pointer to the null
-* terminated attribute setting string which was applied to the
-* base Frame of the encapsulated FrameSet. This may differ from
-* the supplied setting if the supplied setting contains an axis
-* index and the current->base Mapping in the FrameSet produces an
-* axis permutation. The returned pointer should be freed using
-* astFree when no longer needed. A NULL pointer may be supplied in
-* which case no pointer is returned.
-* status
-* Pointer to the inherited status variable.
-
-*/
-
-/* Local Variables: */
- AstKeyMap *keymap;
- AstObject *obj;
- AstRegion *reg;
- AstStc *this;
- char *bset;
- int i;
- int ikey;
- int rep;
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Get a pointer to the Stc structure. */
- this = (AstStc *) this_region;
-
-/* Use the RegSetAttrib method inherited from the parent class to apply the
- setting to the current and base Frames in the FrameSet encapsulated by the
- parent Region structure. */
- (*parent_regsetattrib)( this_region, setting, &bset, status );
-
-/* Now apply the base Frame setting to the encapsulated Region (the current
- Frame within the encapsulated Region is equivalent to the base Frame in the
- parent Region structure). Annul any "attribute unknown" error that results
- from attempting to do this. Also do any AstroCoords in the Stc. */
- if( astOK ) {
- rep = astReporting( 0 );
- astRegSetAttrib( this->region, bset, NULL );
- if( astStatus == AST__BADAT ) astClearStatus;
-
-/* Loop round all AstroCoords elements. */
- for( i = 0; i < this->ncoord; i++ ) {
-
-/* Get a pointer to the KeyMap holding a description of the current
- AstroCoords element. */
- keymap = this->coord[ i ];
-
-/* Loop round all the elements of this KeyMap which may hold a Region
- pointer. */
- for( ikey = 0; ikey < NREG; ikey++ ) {
-
-/* If the KeyMap contains a Region for this key, get a pointer to it. */
- if( astMapGet0A( keymap, regkey[ ikey ], &obj ) ){
- reg = (AstRegion *) obj;
-
-/* Modify it by applying the attribute setting. */
- astRegSetAttrib( reg, bset, NULL );
- if( astStatus == AST__BADAT ) astClearStatus;
-
-/* Annul the pointer. */
- reg = astAnnul( reg );
- }
- }
- }
-
- astReporting( rep );
- }
-
-/* If required, return the base Frame setting string, otherwise free it. */
- if( base_setting ) {
- *base_setting = bset;
- } else {
- bset = astFree( bset );
- }
-}
-
-static void SetAttrib( AstObject *this_object, const char *setting, int *status ) {
-/*
-* Name:
-* SetAttrib
-
-* Purpose:
-* Set an attribute value for a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* void SetAttrib( AstObject *this, const char *setting, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astSetAttrib method inherited
-* from the Region class).
-
-* Description:
-* This function assigns an attribute value for a Stc, the
-* attribute and its value being specified by means of a string of
-* the form:
-*
-* "attribute= value "
-*
-* Here, "attribute" specifies the attribute name and should be in
-* lower case with no white space present. The value to the right
-* of the "=" should be a suitable textual representation of the
-* value to be assigned and this will be interpreted according to
-* the attribute's data type. White space surrounding the value is
-* only significant for string attributes.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* setting
-* Pointer to a null terminated string specifying the new attribute
-* value.
-* status
-* Pointer to the inherited status variable.
-
-* Notes:
-* - This function uses one-based axis numbering so that it is
-* suitable for external (public) use.
-*/
-
-/* Local Vaiables: */
- AstStc *this; /* Pointer to the Stc structure */
- int len; /* Length of setting string */
- int nc; /* Number of characters read by astSscanf */
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Obtain the length of the setting string. */
- len = strlen( setting );
-
-/* Test for each recognised attribute in turn, using "astSscanf" to parse the
- setting string and extract the attribute value (or an offset to it in the
- case of string values). In each case, use the value set in "nc" to check
- that the entire string was matched. Once a value has been obtained, use the
- appropriate method to set it. */
-
-/* (none as yet) */
-
-/* Read-only attributes. */
-/* --------------------- */
-/* Define a macro to see if the setting string matches any of the
- read-only attributes of this class. */
-#define MATCH(attrib) \
- ( nc = 0, ( 0 == astSscanf( setting, attrib "=%*[^\n]%n", &nc ) ) && \
- ( nc >= len ) )
-
-/* Use this macro to report an error if a read-only attribute has been
- specified. */
- if ( MATCH( "regionclass" ) ) {
- astError( AST__NOWRT, "astSet: The setting \"%s\" is invalid for a %s.", status,
- setting, astGetClass( this ) );
- astError( AST__NOWRT, "This is a read-only attribute." , status);
-
-/* Not recognised. */
-/* --------------- */
-/* If the attribute is still not recognised, pass it on to the parent
- method for further interpretation. */
- } else {
- (*parent_setattrib)( this_object, setting, status );
- }
-
-/* Undefine macros local to this function. */
-#undef MATCH
-}
-
-static void SetRegFS( AstRegion *this_region, AstFrame *frm, int *status ) {
-/*
-* Name:
-* SetRegFS
-
-* Purpose:
-* Stores a new FrameSet in a Region
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* void SetRegFS( AstRegion *this_region, AstFrame *frm, int *status )
-
-* Class Membership:
-* Stc method (over-rides the astSetRegFS method inherited from
-* the Region class).
-
-* Description:
-* This function creates a new FrameSet and stores it in the supplied
-* Region. The new FrameSet contains two copies of the supplied
-* Frame, connected by a UnitMap.
-
-* Parameters:
-* this
-* Pointer to the Region.
-* frm
-* The Frame to use.
-* status
-* Pointer to the inherited status variable.
-
-*/
-
-/* Local Variables: */
- AstRegion *creg; /* Pointer to encapsulated Region structure */
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Invoke the parent method to store the FrameSet in the parent Region
- structure. */
- (* parent_setregfs)( this_region, frm, status );
-
-/* If the encapsulated Region has a dummy FrameSet use this method
- recursively to give it the same FrameSet. */
- creg = ((AstStc *) this_region )->region;
- if( creg && !astGetRegionFS( creg ) ) astSetRegFS( creg, frm );
-
-}
-
-static AstMapping *Simplify( AstMapping *this_mapping, int *status ) {
-/*
-* Name:
-* Simplify
-
-* Purpose:
-* Simplify a Region.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "region.h"
-* AstMapping *Simplify( AstMapping *this, int *status )
-
-* Class Membership:
-* Stc method (over-rides the astSimplify method inherited from
-* the Region class).
-
-* Description:
-* This function simplifies a Stc to eliminate redundant
-* computational steps, or to merge separate steps which can be
-* performed more efficiently in a single operation.
-
-* Parameters:
-* this
-* Pointer to the original Region.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* A new pointer to the (possibly simplified) Region.
-
-* Notes:
-* - A NULL pointer value will be returned if this function is
-* invoked with the AST error status set, or if it should fail for
-* any reason.
-*/
-
-/* Local Variables: */
- AstFrame *frm; /* Current Frame */
- AstKeyMap *keymap; /* KeyMap holding stroCoords element */
- AstMapping *map; /* Base->current Mapping */
- AstObject *obj; /* Pointer to object retrieved from keymap */
- AstRegion *newreg; /* New encapsulated Region */
- AstRegion *reg; /* AstroCoords Region pointer */
- AstRegion *treg; /* Temporary Region pointer */
- AstStc *stc; /* Returned Stc Structure. */
- AstStc *temp; /* Temporary Stc pointer */
- int i; /* Index of current AstroCoords element */
- int ikey; /* Index of key to be tested */
-
-/* Check the global error status. */
- if ( !astOK ) return NULL;
-
-/* Invoke the Simplify method of the parent Region class. This simplifies
- the FrameSet and uncertainty Region in the parent Region structure. */
- stc = (AstStc *) (AstRegion *) (* parent_simplify)( this_mapping, status );
-
-/* If the Stc is negated, we can perform a simplication by transferring
- the negated state from the Stc itself to the encapsulated Region. */
- if( astGetNegated( stc ) ) {
-
-/* Ensure that modifying "stc" will not modify the supplied Stc, by
- creating a copy of the supplied Stc, if this has not already been done. */
- if( stc == (AstStc *) this_mapping ) {
- temp = (AstStc *) astCopy( stc );
- (void) astAnnul( stc );
- stc = temp;
- }
-
-/* Modify "temp" by negating both the Stc structure and its encapsulated
- Region. */
- astNegate( stc );
- astNegate( stc->region );
-
- }
-
-/* Get the base->current Mapping from the parent Region structure, and
- the current Frame. */
- map = astGetMapping( ((AstRegion *) stc)->frameset, AST__BASE, AST__CURRENT );
- frm = astGetFrame( ((AstRegion *) stc)->frameset, AST__CURRENT );
-
-/* We may be able to perform some more simplication on the encapsulated
- Region itself. If the above mapping is not a unit map, remap the
- encapsulated Region into the current Frame of the parent Region structure
- and simplify it. This transfers complication from the Mapping in the
- parent Region structure to the encapsulated Region. */
- if( !astIsAUnitMap( map ) ) {
- treg = astMapRegion( stc->region, map, frm );
- newreg = astSimplify( treg );
- treg = astAnnul( treg );
-
-/* If the base->current Mapping in the parent Region structure is a unit
- map, simplification of the whole Stc is possible if the encapsulated
- Region (without any remapping) can be simplied. */
- } else {
- newreg = astSimplify( stc->region );
- }
-
-/* If the encapsulated Region has been changed, store it in the returned
- Stc. */
- if( newreg != stc->region ) {
-
-/* Ensure that modifying "stc" will not modify the supplied Stc, by
- creating a copy of the supplied Stc, if this has not already been done. */
- if( stc == (AstStc *) this_mapping ) {
- temp = (AstStc *) astCopy( stc );
- (void) astAnnul( stc );
- stc = temp;
- }
-
-/* Store the new region in "stc", annulling the existing Region. */
- if( stc ) {
- (void) astAnnul( stc->region );
- stc->region = astClone( newreg );
- }
-
-/* The encapsulated Region now represents an area in the current Frame
- represented by the supplied Stc. Since the encapsulated Region is
- defined as being in the base Frame of the FrameSet in the parent
- Region structure, the parent FrameSet should just be a UnitMap. Modify
- it appropriately (if it not already a UnitMap). */
- if( !astIsAUnitMap( map ) ) astSetRegFS( stc, frm );
- }
-
-/* Free resources */
- newreg = astAnnul( newreg );
-
-/* Now we do a similar process on any Regions held within an AstroCoords
- elements. Loop round all AstroCoords elements. */
- if( stc ) {
- for( i = 0; i < stc->ncoord; i++ ) {
-
-/* Get a pointewr to the KeyMap holding a description of the current
- AstroCoords element. */
- keymap = stc->coord[ i ];
-
-/* Loop round all the elements of this KeyMap which may hold a Region
- pointer. */
- for( ikey = 0; ikey < NREG; ikey++ ) {
-
-/* If the KeyMap contains a Region for this key, get a pointer to it. */
- if( astMapGet0A( keymap, regkey[ ikey ], &obj ) ){
- reg = (AstRegion *) obj;
-
-/* We have two tasks now, firstly to ensure that this AstroCoords Region
- describes an area in the base Frame of the FrameSet in the parent
- Region structure (which may have been changed by the earlier
- simplications performed by this function), and secondly, to attempt to
- simplify the Region.
-
- The Stc structure addressed by the "stc" pointer will have a current
- Frame given by "frm". This will also be its base Frame, and the
- base->current Mapping will consequently be a UnitMap. The Mapping from
- the original base Frame to the new base Frame is given by "map". Unless
- this is a UnitMap, we need to remap the Region.*/
- if( !astIsAUnitMap( map ) ) {
- treg = astMapRegion( reg, map, frm );
- } else {
- treg = astClone( reg );
- }
-
-/* Now attempt to simplify the Region.*/
- newreg = astSimplify( treg );
-
-/* If the Region has been changed by either of these steps, we need to
- store the modified Region back in the "stc" structure which is being
- returned. But we need to be careful we do not modify the supplied Stc
- structure. */
- if( newreg != reg ) {
-
- if( stc == (AstStc *) this_mapping ) {
- temp = astCopy( stc );
- (void) astAnnul( stc );
- stc = temp;
- keymap = temp->coord[ i ];
- }
-
- astMapPut0A( keymap, regkey[ ikey ], newreg, regcom[ ikey ] );
-
- }
-
-/* Free resources */
- reg = astAnnul( reg );
- treg = astAnnul( treg );
- newreg = astAnnul( newreg );
-
- }
- }
- }
- }
-
-/* Free resources */
- map = astAnnul( map );
- frm = astAnnul( frm );
-
-/* If an error occurred, annul the returned Mapping. */
- if ( !astOK ) stc = astAnnul( stc );
-
-/* Return the result. */
- return (AstMapping *) stc;
-}
-
-static int TestAttrib( AstObject *this_object, const char *attrib, int *status ) {
-/*
-* Name:
-* TestAttrib
-
-* Purpose:
-* Test if a specified attribute value is set for a Stc.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* int TestAttrib( AstObject *this, const char *attrib, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astTestAttrib protected
-* method inherited from the Region class).
-
-* Description:
-* This function returns a boolean result (0 or 1) to indicate whether
-* a value has been set for one of a Stc's attributes.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* attrib
-* Pointer to a null terminated string specifying the attribute
-* name. This should be in lower case with no surrounding white
-* space.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* One if a value has been set, otherwise zero.
-
-* Notes:
-* - This function uses one-based axis numbering so that it is
-* suitable for external (public) use.
-* - A value of zero will be returned if this function is invoked
-* with the global status set, or if it should fail for any reason.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- int len; /* Length of attrib string */
- int result; /* Result value to return */
-
-/* Initialise. */
- result = 0;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Obtain the length of the attrib string. */
- len = strlen( attrib );
-
-/* Check the attribute name and test the appropriate attribute. */
-
-/* Read-only attributes. */
-/* --------------------- */
-/* Test if the attribute name matches any of the read-only attributes
- of this class. If it does, then return zero. */
- if ( !strcmp( attrib, "regionclass" ) ) {
- result = 0;
-
-/* Not recognised. */
-/* --------------- */
-/* If the attribute is still not recognised, pass it on to the parent
- method for further interpretation. */
- } else {
- result = (*parent_testattrib)( this_object, attrib, status );
- }
-
-/* Return the result, */
- return result;
-}
-
-static AstPointSet *Transform( AstMapping *this_mapping, AstPointSet *in,
- int forward, AstPointSet *out, int *status ) {
-/*
-* Name:
-* Transform
-
-* Purpose:
-* Apply a Stc to transform a set of points.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* #include "stc.h"
-* AstPointSet *Transform( AstMapping *this, AstPointSet *in,
-* int forward, AstPointSet *out, int *status )
-
-* Class Membership:
-* Stc member function (over-rides the astTransform method inherited
-* from the Region class).
-
-* Description:
-* This function takes a Stc and a set of points encapsulated in a
-* PointSet and transforms the points so as to apply the required Region.
-* This implies applying each of the Stc's encapsulated Region in turn,
-* either in series or in parallel.
-
-* Parameters:
-* this
-* Pointer to the Stc.
-* in
-* Pointer to the PointSet associated with the input coordinate values.
-* forward
-* A non-zero value indicates that the forward coordinate transformation
-* should be applied, while a zero value requests the inverse
-* transformation.
-* out
-* Pointer to a PointSet which will hold the transformed (output)
-* coordinate values. A NULL value may also be given, in which case a
-* new PointSet will be created by this function.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* Pointer to the output (possibly new) PointSet.
-
-* Notes:
-* - A null pointer will be returned if this function is invoked with the
-* global error status set, or if it should fail for any reason.
-* - The number of coordinate values per point in the input PointSet must
-* match the number of coordinates for the Stc being applied.
-* - If an output PointSet is supplied, it must have space for sufficient
-* number of points and coordinate values per point to accommodate the
-* result. Any excess space will be ignored.
-*/
-
-/* Local Variables: */
- AstPointSet *ps; /* Pointer to PointSet */
- AstPointSet *pset_tmp; /* Pointer to PointSet holding base Frame positions*/
- AstPointSet *result; /* Pointer to output PointSet */
- AstRegion *reg; /* Pointer to encapsulated Region */
- AstStc *this; /* Pointer to the Stc structure */
- double **ptr; /* Pointer to axis values */
- double **ptr_out; /* Pointer to output coordinate data */
- int coord; /* Zero-based index for coordinates */
- int good; /* Is the point inside the Stc? */
- int ncoord_out; /* No. of coordinates per output point */
- int ncoord_tmp; /* No. of coordinates per base Frame point */
- int neg; /* Negated value for encapsulated Region */
- int neg_old; /* Original Negated flag */
- int npoint; /* No. of points */
- int point; /* Loop counter for points */
- int rep; /* Original error reporting status */
- int status_value; /* AST status value */
-
-/* Initialise. */
- result = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return result;
-
-/* Get a Pointer to the Stc structure */
- this = (AstStc *) this_mapping;
-
-/* Get the encapsulated Region, and the Negated value which should be used
- with it. The returned values take account of whether the supplied Stc has
- itself been Negated or not. The returned Region represent a region within
- the base Frame of the FrameSet encapsulated by the parent Region
- structure. */
- GetRegion( this, &reg, &neg, status );
-
-/* Temporarily set the Negated attribute to the required value.*/
- neg_old = astGetNegated( reg );
- astSetNegated( reg, neg );
-
-/* Apply the parent mapping using the stored pointer to the Transform member
- function inherited from the parent Region class. This function validates
- all arguments and generates an output PointSet if necessary, containing
- a copy of the input PointSet. */
- result = (*parent_transform)( this_mapping, in, forward, out, status );
-
-/* We will now extend the parent astTransform method by performing the
- calculations needed to generate the output coordinate values. */
-
-/* First use the encapsulated FrameSet in the parent Region structure to
- transform the supplied positions from the current Frame in the
- encapsulated FrameSet (the Frame represented by the Stc), to the
- base Frame (the Frame in which the encapsulated Region are defined). Note,
- the returned pointer may be a clone of the "in" pointer, and so we
- must be carefull not to modify the contents of the returned PointSet. */
- pset_tmp = astRegTransform( this, in, 0, NULL, NULL );
-
-/* Now transform this PointSet using the encapsulated Region. */
- ps = astTransform( reg, pset_tmp, 0, NULL );
-
-/* Determine the numbers of points and coordinates per point for these base
- Frame PointSets and obtain pointers for accessing the base Frame and output
- coordinate values. */
- npoint = astGetNpoint( pset_tmp );
- ncoord_tmp = astGetNcoord( pset_tmp );
- ptr = astGetPoints( ps );
- ncoord_out = astGetNcoord( result );
- ptr_out = astGetPoints( result );
-
-/* Perform coordinate arithmetic. */
-/* ------------------------------ */
- if ( astOK ) {
-
- for ( point = 0; point < npoint; point++ ) {
- good = 0;
-
- for ( coord = 0; coord < ncoord_tmp; coord++ ) {
- if( ptr[ coord ][ point ] != AST__BAD ) {
- good = 1;
- break;
- }
- }
-
- if( !good ) {
- for ( coord = 0; coord < ncoord_out; coord++ ) {
- ptr_out[ coord ][ point ] = AST__BAD;
- }
- }
- }
- }
-
-/* Re-instate the original value for the Negated attribute of the
- encapsulated Region. Do this even if an error has occurred. */
- status_value = astStatus;
- astClearStatus;
- rep = astReporting( 0 );
- if( reg ) astSetNegated( reg, neg_old );
- astReporting( rep );
- astSetStatus( status_value );
-
-/* Free resources. */
- reg = astAnnul( reg );
- ps = astAnnul( ps );
- pset_tmp = astAnnul( pset_tmp );
-
-/* If an error occurred, clean up by deleting the output PointSet (if
- allocated by this function) and setting a NULL result pointer. */
- if ( !astOK ) {
- if ( !out ) result = astDelete( result );
- result = NULL;
- }
-
-/* Return a pointer to the output PointSet. */
- return result;
-}
-
-
-/* Stc Attributes: */
-/* =============== */
-
-/*
-*att++
-* Name:
-* RegionClass
-
-* Purpose:
-* The AST class name of the Region encapsulated within an Stc
-
-* Type:
-* Public attribute.
-
-* Synopsis:
-* String, read-only.
-
-* Description:
-* This is a read-only attribute giving the AST class name of the
-* Region encapsulated within an Stc (that is, the class of the Region
-* which was supplied when the Stc was created).
-
-* Applicability:
-* Stc
-* All Stc objects this attribute.
-*att--
-*/
-
-/* Copy constructor. */
-/* ----------------- */
-static void Copy( const AstObject *objin, AstObject *objout, int *status ) {
-/*
-* Name:
-* Copy
-
-* Purpose:
-* Copy constructor for Stc objects.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* void Copy( const AstObject *objin, AstObject *objout, int *status )
-
-* Description:
-* This function implements the copy constructor for Stc objects.
-
-* Parameters:
-* objin
-* Pointer to the object to be copied.
-* objout
-* Pointer to the object being constructed.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* void
-
-* Notes:
-* - This constructor makes a deep copy, including a copy of the component
-* Regions within the Stc.
-*/
-
-/* Local Variables: */
- AstStc *in; /* Pointer to input Stc */
- AstStc *out; /* Pointer to output Stc */
- int i; /* AstroCoords index */
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Obtain pointers to the input and output Stcs. */
- in = (AstStc *) objin;
- out = (AstStc *) objout;
-
-/* For safety, start by clearing any references to the input component
- Regions, etc, from the output Stc. */
- out->region = NULL;
- out->coord = NULL;
- out->ncoord = 0;
-
-/* Make a copy of the Region and store a pointer to it in the output Stc
- structure. */
- out->region = astCopy( in->region );
-
-/* Copy any memory holding AstroCoords values */
- if( in->coord && in->ncoord ) {
- out->ncoord = in->ncoord;
- out->coord = astMalloc( sizeof(AstKeyMap *) * (size_t)in->ncoord );
- if( out->coord ) {
- for( i = 0; i < in->ncoord; i++ ) {
- out->coord[ i ] = astCopy( in->coord[ i ] );
- }
- }
- }
-}
-
-/* Destructor. */
-/* ----------- */
-static void Delete( AstObject *obj, int *status ) {
-/*
-* Name:
-* Delete
-
-* Purpose:
-* Destructor for Stc objects.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* void Delete( AstObject *obj, int *status )
-
-* Description:
-* This function implements the destructor for Stc objects.
-
-* Parameters:
-* obj
-* Pointer to the object to be deleted.
-* status
-* Pointer to the inherited status variable.
-
-* Returned Value:
-* void
-
-* Notes:
-* This function attempts to execute even if the global error status is
-* set.
-*/
-
-/* Local Variables: */
- AstStc *this; /* Pointer to Stc */
- int i; /* AstroCoords index */
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) obj;
-
-/* Annul the pointer to the encapsulated Region. */
- this->region = astAnnul( this->region );
-
-/* Free any memory holding AstroCoords values */
- if( this->coord ) {
- for( i = 0; i < this->ncoord; i++ ) {
- this->coord[ i ] = astAnnul( this->coord[ i ] );
- }
- this->coord = astFree( this->coord );
- }
-}
-
-/* Dump function. */
-/* -------------- */
-static void Dump( AstObject *this_object, AstChannel *channel, int *status ) {
-/*
-* Name:
-* Dump
-
-* Purpose:
-* Dump function for Stc objects.
-
-* Type:
-* Private function.
-
-* Synopsis:
-* void Dump( AstObject *this, AstChannel *channel, int *status )
-
-* Description:
-* This function implements the Dump function which writes out data
-* for the Stc class to an output Channel.
-
-* Parameters:
-* this
-* Pointer to the Stc whose data are being written.
-* channel
-* Pointer to the Channel to which the data are being written.
-* status
-* Pointer to the inherited status variable.
-*/
-
-/* Local Constants: */
-#define COMMENT_LEN 150 /* Maximum length of a comment string */
-#define KEY_LEN 50 /* Maximum length of a keyword */
-
-/* Local Variables: */
- AstStc *this; /* Pointer to the Stc structure */
- char comment[ COMMENT_LEN + 1 ]; /* Buffer for comment string */
- char key[ KEY_LEN + 1 ]; /* Buffer for keyword string */
- int ico; /* Loop counter for KeyMaps */
-
-/* Check the global error status. */
- if ( !astOK ) return;
-
-/* Obtain a pointer to the Stc structure. */
- this = (AstStc *) this_object;
-
-/* Write out values representing the instance variables for the Stc
- class. Accompany these with appropriate comment strings, possibly
- depending on the values being written.*/
-
-/* In the case of attributes, we first use the appropriate (private)
- Test... member function to see if they are set. If so, we then use
- the (private) Get... function to obtain the value to be written
- out.
-
- For attributes which are not set, we use the astGet... method to
- obtain the value instead. This will supply a default value
- (possibly provided by a derived class which over-rides this method)
- which is more useful to a human reader as it corresponds to the
- actual default attribute value. Since "set" will be zero, these
- values are for information only and will not be read back. */
-
-/* Encapsulated Region. */
-/* -------------------- */
- astWriteObject( channel, "Region", 1, 1, this->region,
- "STC Region" );
-
-/* AstroCoords info */
-/* ---------------- */
- astWriteInt( channel, "Ncoord", ( this->ncoord != 0 ), 0, this->ncoord,
- "Number of AstroCoords elements" );
-
- for ( ico = 1; ico <= this->ncoord; ico++ ) {
- (void) sprintf( key, "Coord%d", ico );
- (void) sprintf( comment, "AstroCoords number %d", ico );
- astWriteObject( channel, key, 1, 1, this->coord[ ico - 1 ],
- comment );
- }
-
-/* Undefine macros local to this function. */
-#undef COMMENT_LEN
-#undef KEY_LEN
-}
-
-/* Standard class functions. */
-/* ========================= */
-/* Implement the astIsAStc and astCheckStc functions using the
- macros defined for this purpose in the "object.h" header file. */
-astMAKE_ISA(Stc,Region)
-astMAKE_CHECK(Stc)
-
-AstStc *astInitStc_( void *mem, size_t size, int init, AstStcVtab *vtab,
- const char *name, AstRegion *region, int ncoords,
- AstKeyMap **coords, int *status ) {
-/*
-*+
-* Name:
-* astInitStc
-
-* Purpose:
-* Initialise a Stc.
-
-* Type:
-* Protected function.
-
-* Synopsis:
-* #include "stc.h"
-* AstStc *astInitStc( void *mem, size_t size, int init, AstStcVtab *vtab,
-* const char *name, AstRegion *region, int ncoords,
-* AstKeyMap **coords )
-
-* Class Membership:
-* Stc initialiser.
-
-* Description:
-* This function is provided for use by class implementations to initialise
-* a new Stc object. It allocates memory (if necessary) to
-* accommodate the Stc plus any additional data associated with the
-* derived class. It then initialises a Stc structure at the start
-* of this memory. If the "init" flag is set, it also initialises the
-* contents of a virtual function table for a Stc at the start of
-* the memory passed via the "vtab" parameter.
-
-* Parameters:
-* mem
-* A pointer to the memory in which the Stc is to be initialised.
-* This must be of sufficient size to accommodate the Stc data
-* (sizeof(Stc)) plus any data used by the derived class. If a
-* value of NULL is given, this function will allocate the memory itself
-* using the "size" parameter to determine its size.
-* size
-* The amount of memory used by the Stc (plus derived class
-* data). This will be used to allocate memory if a value of NULL is
-* given for the "mem" parameter. This value is also stored in the
-* Stc structure, so a valid value must be supplied even if not
-* required for allocating memory.
-* init
-* A logical flag indicating if the Stc's virtual function table
-* is to be initialised. If this value is non-zero, the virtual function
-* table will be initialised by this function.
-* vtab
-* Pointer to the start of the virtual function table to be associated
-* with the new Stc.
-* name
-* Pointer to a constant null-terminated character string which contains
-* the name of the class to which the new object belongs (it is this
-* pointer value that will subsequently be returned by the Object
-* astClass function).
-* region
-* Pointer to the Region represented by the Stc.
-* ncoords
-* Number of KeyMap pointers supplied in "coords". Can be zero.
-* Ignored if "coords" is NULL.
-* coords
-* Pointer to an array of "ncoords" KeyMap pointers, or NULL if
-* "ncoords" is zero. Each KeyMap defines defines a single <AstroCoords>
-* element, and should have elements with keys given by constants
-* AST__STCNAME, AST__STCVALUE, AST__STCERROR, AST__STCRES, AST__STCSIZE,
-* AST__STCPIXSZ. Any of these elements may be omitted, but no other
-* elements should be included. If supplied, the AST__STCNAME element
-* should be a vector of character string pointers holding the "Name"
-* item for each axis. Any other supplied elements should be scalar
-* elements, each holding a pointer to a Region describing the
-* associated item of ancillary information (error, resolution, size,
-* pixel size or value). These Regions should describe a volume within
-* the coordinate system represented by "region".
-
-* Returned Value:
-* A pointer to the new Stc.
-
-* Notes:
-* - A null pointer will be returned if this function is invoked with the
-* global error status set, or if it should fail for any reason.
-*-
-*/
-
-/* Local Variables: */
- AstMapping *frm; /* Current Frame in supplied Stc */
- AstMapping *map; /* Base -> Current Mapping in supplied Stc */
- AstRegion *reg; /* Copy of supplied Region */
- AstStc *new; /* Pointer to new Stc */
- int i; /* AstroCoords index */
-
-/* Check the global status. */
- if ( !astOK ) return NULL;
-
-/* If necessary, initialise the virtual function table. */
- if ( init ) astInitStcVtab( vtab, name );
-
-/* Initialise. */
- new = NULL;
-
-/* If the supplied Region is an Stc, create a new Region by mapping the
- encapsulated Region within the supplied Stc into the current Frame of the
- Stc. */
- if( astIsAStc( region ) ) {
- map = astGetMapping( region->frameset, AST__BASE, AST__CURRENT );
- frm = astGetFrame( region->frameset, AST__CURRENT );
- reg = astMapRegion( ((AstStc *) region)->region, map, frm );
- frm = astAnnul( frm );
- map = astAnnul( map );
-
-/* Otherwise, just take a copy of the supplied Region. */
- } else {
- reg = astCopy( region );
- }
-
-/* Initialise a Region structure (the parent class) as the first component
- within the Stc structure, allocating memory if necessary. A NULL
- PointSet is suppled as the encapsulated Region will perform the function
- of defining the Region shape. The base Frame of the FrameSet in the
- parent Region structure will be the same as the current Frames of the
- FrameSets in the two encapsulated Region. */
- if ( astOK ) {
- new = (AstStc *) astInitRegion( mem, size, 0, (AstRegionVtab *) vtab,
- name, reg, NULL, NULL );
-
-/* Initialise the Stc data. */
-/* --------------------------- */
-/* Store a pointer to the encapsulated Region. */
- new->region = astClone( reg );
-
-/* No AstroCoords info as yet. */
- new->ncoord = 0;
- new->coord = NULL;
-
-/* Transfer attributes from the encapsulated region to the parent region. */
- astRegOverlay( new, reg, 1 );
- if( astTestIdent( reg ) ) astSetIdent( new, astGetIdent( reg ) );
-
-/* If the base->current Mapping in the FrameSet within the encapsulated Region
- is a UnitMap, then the FrameSet does not need to be included in the
- Dump of the new Stc. Set the RegionFS attribute of the encapsulated
- Region to zero to flag this. Note, we do this after the previous class
- to astRegOverlay because we do not want this zero value for RegionFS to
- be copied into the new Stc object. */
- astSetRegionFS( reg, 0 );
-
-/* For each supplied AstroCoords, create a new KeyMap holding Regions
- representing the various elements of the AstroCoords, and store the
- new KeyMap in the Stc structure. */
- if( coords && ncoords > 0 ) {
- new->ncoord = ncoords;
- new->coord = astMalloc( sizeof( AstKeyMap *)*(size_t) ncoords );
- if( new->coord ) {
- for( i = 0; i < ncoords; i++ ) {
- new->coord[ i ] = MakeAstroCoordsKeyMap( reg, coords[ i ],
- name, status );
- }
- }
- }
-
-/* If an error occurred, clean up deleting the new object. */
- if ( !astOK ) new = astDelete( new );
- }
-
-/* Free resources */
- reg = astAnnul( reg );
-
-/* Return a pointer to the new object. */
- return new;
-}
-
-AstStc *astLoadStc_( void *mem, size_t size, AstStcVtab *vtab,
- const char *name, AstChannel *channel, int *status ) {
-/*
-*+
-* Name:
-* astLoadStc
-
-* Purpose:
-* Load a Stc.
-
-* Type:
-* Protected function.
-
-* Synopsis:
-* #include "stc.h"
-* AstStc *astLoadStc( void *mem, size_t size, AstStcVtab *vtab,
-* const char *name, AstChannel *channel )
-
-* Class Membership:
-* Stc loader.
-
-* Description:
-* This function is provided to load a new Stc using data read
-* from a Channel. It first loads the data used by the parent class
-* (which allocates memory if necessary) and then initialises a
-* Stc structure in this memory, using data read from the input
-* Channel.
-*
-* If the "init" flag is set, it also initialises the contents of a
-* virtual function table for a Stc at the start of the memory
-* passed via the "vtab" parameter.
-
-* Parameters:
-* mem
-* A pointer to the memory into which the Stc is to be
-* loaded. This must be of sufficient size to accommodate the
-* Stc data (sizeof(Stc)) plus any data used by derived
-* classes. If a value of NULL is given, this function will
-* allocate the memory itself using the "size" parameter to
-* determine its size.
-* size
-* The amount of memory used by the Stc (plus derived class
-* data). This will be used to allocate memory if a value of
-* NULL is given for the "mem" parameter. This value is also
-* stored in the Stc structure, so a valid value must be
-* supplied even if not required for allocating memory.
-*
-* If the "vtab" parameter is NULL, the "size" value is ignored
-* and sizeof(AstStc) is used instead.
-* vtab
-* Pointer to the start of the virtual function table to be
-* associated with the new Stc. If this is NULL, a pointer to
-* the (static) virtual function table for the Stc class is
-* used instead.
-* name
-* Pointer to a constant null-terminated character string which
-* contains the name of the class to which the new object
-* belongs (it is this pointer value that will subsequently be
-* returned by the astGetClass method).
-*
-* If the "vtab" parameter is NULL, the "name" value is ignored
-* and a pointer to the string "Stc" is used instead.
-
-* Returned Value:
-* A pointer to the new Stc.
-
-* Notes:
-* - A null pointer will be returned if this function is invoked
-* with the global error status set, or if it should fail for any
-* reason.
-*-
-*/
-
-
-/* Local Constants: */
- astDECLARE_GLOBALS /* Pointer to thread-specific global data */
-#define KEY_LEN 50 /* Maximum length of a keyword */
-
-/* Local Variables: */
- AstFrame *f1; /* Base Frame in parent Region */
- AstObject *obj; /* Pointer to Object retrieved from KeyMap */
- AstRegion *creg; /* Pointer to encapsulated Region */
- AstStc *new; /* Pointer to the new Stc */
- char key[ KEY_LEN + 1 ]; /* Buffer for keyword string */
- int ico; /* Loop counter for AstroCoords */
- int ikey; /* Index of KeyMap */
-
-/* Get a pointer to the thread specific global data structure. */
- astGET_GLOBALS(channel);
-
-/* Initialise. */
- new = NULL;
-
-/* Check the global error status. */
- if ( !astOK ) return new;
-
-/* If a NULL virtual function table has been supplied, then this is
- the first loader to be invoked for this Stc. In this case the
- Stc belongs to this class, so supply appropriate values to be
- passed to the parent class loader (and its parent, etc.). */
- if ( !vtab ) {
- size = sizeof( AstStc );
- vtab = &class_vtab;
- name = "Stc";
-
-/* If required, initialise the virtual function table for this class. */
- if ( !class_init ) {
- astInitStcVtab( vtab, name );
- class_init = 1;
- }
- }
-
-/* Invoke the parent class loader to load data for all the ancestral
- classes of the current one, returning a pointer to the resulting
- partly-built Stc. */
- new = astLoadRegion( mem, size, (AstRegionVtab *) vtab, name,
- channel );
-
- if ( astOK ) {
-
-/* Read input data. */
-/* ================ */
-/* Request the input Channel to read all the input data appropriate to
- this class into the internal "values list". */
- astReadClassData( channel, "Stc" );
-
-/* Now read each individual data item from this list and use it to
- initialise the appropriate instance variable(s) for this class. */
-
-/* In the case of attributes, we first read the "raw" input value,
- supplying the "unset" value as the default. If a "set" value is
- obtained, we then use the appropriate (private) Set... member
- function to validate and set the value properly. */
-
-/* Encapsulated Region. */
-/* -------------------- */
- new->region = astReadObject( channel, "region", NULL );
-
-/* Get a pointer to the base Frame in the FrameSet encapsulated by the
- parent Region structure. */
- f1 = astGetFrame( ((AstRegion *) new)->frameset, AST__BASE );
-
-/* If the encapsulated Region has a dummy FrameSet rather than the correct
- FrameSet, the correct FrameSet will have copies of the base Frame of the
- new Stc as both its current and base Frames, connected by a UnitMap (this
- is equivalent to a FrameSet containing a single Frame). However if the new
- Stc being loaded has itself got a dummy FrameSet, then we do not do this
- since we do not yet know what the correct FrameSet is. In this case we
- wait until the parent Region invokes the astSetRegFS method on the new
- Stc. */
- if( !astRegDummyFS( new ) ) {
- creg = new->region;
- if( astRegDummyFS( creg ) ) astSetRegFS( creg, f1 );
- }
-
-/* AstroCoords info */
-/* ---------------- */
-/* The number of AstroCoords described in the new Stc. */
- new->ncoord = astReadInt( channel, "ncoord", 0 );
- if( new->ncoord < 0 ) new->ncoord = 0;
-
-/* Read back each KeyMap describing these AstroCoords. */
- new->coord = astMalloc( sizeof( AstKeyMap *) * (size_t) new->ncoord );
- for( ico = 1; ico <= new->ncoord; ico++ ) {
- (void) sprintf( key, "coord%d", ico );
- new->coord[ ico - 1 ] = astReadObject( channel, key, NULL );
-
-/* Ensure the Regions within the KeyMap do not have dummy FrameSets. */
- if( new->coord[ ico - 1 ] && !astRegDummyFS( new ) ) {
- for( ikey = 0; ikey < NREG; ikey++ ) {
- if( astMapGet0A( new->coord[ ico - 1 ], regkey[ ikey ], &obj ) ){
- creg = (AstRegion *) obj;
- if( astRegDummyFS( creg ) ) {
- astSetRegFS( creg, f1 );
- astMapPut0A( new->coord[ ico - 1 ], regkey[ ikey ], creg,
- regcom[ ikey ] );
- }
- creg = astAnnul( creg );
- }
- }
- }
- }
-
-/* Free resources */
- f1 = astAnnul( f1 );
-
-/* If an error occurred, clean up by deleting the new Stc. */
- if ( !astOK ) new = astDelete( new );
- }
-
-/* Return the new Stc pointer. */
- return new;
-
-/* Undefine macros local to this function. */
-#undef KEY_LEN
-}
-
-/* Virtual function interfaces. */
-/* ============================ */
-/* These provide the external interface to the virtual functions defined by
- this class. Each simply checks the global error status and then locates and
- executes the appropriate member function, using the function pointer stored
- in the object's virtual function table (this pointer is located using the
- astMEMBER macro defined in "object.h").
-
- Note that the member function may not be the one defined here, as it may
- have been over-ridden by a derived class. However, it should still have the
- same interface. */
-
-const char *astGetRegionClass_( AstStc *this, int *status ){
- if ( !astOK ) return NULL;
- return (**astMEMBER(this,Stc,GetRegionClass))( this, status );
-}
-
-AstRegion *astGetStcRegion_( AstStc *this, int *status ){
- if ( !astOK ) return NULL;
- return (**astMEMBER(this,Stc,GetStcRegion))( this, status );
-}
-
-AstKeyMap *astGetStcCoord_( AstStc *this, int icoord, int *status ){
- if ( !astOK ) return NULL;
- return (**astMEMBER(this,Stc,GetStcCoord))( this, icoord, status );
-}
-
-int astGetStcNCoord_( AstStc *this, int *status ){
- if ( !astOK ) return 0;
- return (**astMEMBER(this,Stc,GetStcNCoord))( this, status );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-