1 #if !defined( OBJECT_INCLUDED ) /* Include this file only once */ 2 #define OBJECT_INCLUDED 3 /* 4 *++ 5 * Name: 6 * object.h 7 8 * Type: 9 * C include file. 10 11 * Purpose: 12 * Define the interface to the Object class. 13 14 * Invocation: 15 * #include "object.h" 16 17 * Description: 18 * This include file defines the interface to the Object class and 19 * provides the type definitions, function prototypes and macros, 20 * etc. needed to use this class. 21 22 * The Object class is the base class from which all other classes 23 * in the AST library are derived. This class provides all the 24 * basic Object behaviour and Object manipulation facilities 25 * required throughout the library. There is no Object constructor, 26 * however, as Objects on their own are not of much use. 27 28 * Inheritance: 29 * The Object base class does not inherit from any other class. 30 31 * Attributes Over-Ridden: 32 * None. 33 34 * New Attributes Defined: 35 * Class (string) 36 * This is a read-only attribute containing the name of the 37 * class to which an Object belongs. 38 * ID (string) 39 * An identification string which may be used to identify the 40 * Object (e.g.) in debugging output, or when stored in an 41 * external medium such as a data file. There is no restriction 42 * on the string's contents. The default is an empty string. 43 * Ident (string) 44 * Like ID, this is an identification string which may be used 45 * to identify the Object. Unlike ID, Ident is transferred when an 46 * Object is copied. 47 * UseDefs (int) 48 * Should default values be used for unset attributes? 49 * Nobject (integer) 50 * This is a read-only attribute which gives the total number of 51 * Objects currently in existence in the same class as the 52 * Object given. It does not include Objects which belong to 53 * derived (more specialised) classes. This value is mainly 54 * intended for debugging, as it can be used to show whether 55 * Objects which should have been deleted have, in fact, been 56 * deleted. 57 * ObjSize (int) 58 * The in-memory size of the Object in bytes. 59 * RefCount (integer) 60 * This is a read-only Attribute which gives the "reference 61 * count" (the number of active pointers) associated with an 62 * Object. It is modified whenever pointers are created or 63 * annulled (by astClone or astAnnul/astEnd for example) and 64 * includes the initial pointer issued when the Object was 65 * created. If the reference count for an Object falls to zero 66 * as the result of annulling a pointer to it, then the Object 67 * will be deleted. 68 69 * Methods Over-Ridden: 70 * None. 71 72 * New Methods Defined: 73 * Public: 74 * astAnnul 75 * Annul a pointer to an Object. 76 * astClear 77 * Clear attribute values for an Object. 78 * astClone 79 * Clone a pointer to an Object. 80 * astCopy 81 * Copy an Object. 82 * astDelete 83 * Delete an Object. 84 * astExempt 85 * Exempt an Object pointer from AST context handling 86 * astExport 87 * Export an Object pointer to an outer context. 88 * astGet<X>, where <X> = C, D, F, I, L 89 * Get an attribute value for an Object. 90 * astImport 91 * Import an Object pointer into the current context. 92 * astSame 93 * Return true if two pointers refer to the same object. 94 * astSet 95 * Set attribute values for an Object. 96 * astSet<X>, where <X> = C, D, F, I, L 97 * Set an attribute value for an Object. 98 * astShow 99 * Display a textual representation of an Object on standard output. 100 * astTest 101 * Test if an attribute value is set for an Object. 102 * astTune 103 * Get or set the value of a global AST tuning parameter. 104 * 105 * Protected: 106 * astAnnulId 107 * Annul an external ID for an Object (for use from protected code 108 * which must handle external IDs). 109 * astClearAttrib 110 * Clear the value of a specified attribute for an Object. 111 * astClearID 112 * Clear the value of the ID attribute for an Object. 113 * astClearIdent 114 * Clear the value of the Ident attribute for an Object. 115 * astCast 116 * Return a deep copy of an object, cast into an instance of a 117 * parent class. 118 * astDump 119 * Write an Object to a Channel. 120 * astEqual 121 * Are two Objects equivalent? 122 * astGetAttrib 123 * Get the value of a specified attribute for an Object. 124 * astGetClass (deprecated synonym astClass) 125 * Obtain the value of the Class attribute for an Object. 126 * astGetID 127 * Obtain the value of the ID attribute for an Object. 128 * astGetIdent 129 * Obtain the value of the Ident attribute for an Object. 130 * astGetNobject 131 * Obtain the value of the Nobject attribute for an Object. 132 * astGetRefCount 133 * Obtain the value of the RefCount attribute for an Object. 134 * astSetAttrib 135 * Set the value of a specified attribute for an Object. 136 * astSetCopy 137 * Declare a copy constructor for an Object. 138 * astSetDelete 139 * Declare a destructor for an Object. 140 * astSetDump 141 * Declare a dump function for an Object. 142 * astSetVtab 143 * Chaneg the virtual function table associated with an Object. 144 * astSetID 145 * Set the value of the ID attribute for an Object. 146 * astSetIdent 147 * Set the value of the Ident attribute for an Object. 148 * astTestAttrib 149 * Test if a specified attribute value is set for an Object. 150 * astTestID 151 * Test whether the ID attribute for an Object is set. 152 * astTestIdent 153 * Test whether the Ident attribute for an Object is set. 154 * astVSet 155 * Set values for an Object's attributes. 156 157 * Other Class Functions: 158 * Public: 159 * astBegin 160 * Begin a new AST context. 161 * astEnd 162 * End an AST context. 163 * astIsAObject 164 * Test class membership. 165 * astVersion 166 * Returns the AST library version number. 167 * astEscapes 168 * Remove escape sequences from returned text strings? 169 * astP2I 170 * Retrieve an int from a pointer. 171 * astI2P 172 * Pack an int into a pointer. 173 * 174 * Protected: 175 * astCheckObject 176 * Validate class membership. 177 * astInitObject 178 * Initialise an Object. 179 * astInitObjectVtab 180 * Initialise the virtual function table for the Object class. 181 * astLoadObject 182 * Load an Object. 183 * astMakeId 184 * Issue an identifier for an Object. 185 * astMakePointer 186 * Obtain a true C pointer from an Object identifier. 187 188 * Macros: 189 * Public: 190 * AST__NULL 191 * Null Object pointer value. 192 * AST__VMAJOR 193 * The AST library major version number. 194 * AST__VMINOR 195 * The AST library minor version number. 196 * AST__RELEASE 197 * The AST library release number. 198 * 199 * Protected: 200 * astEQUAL 201 * Compare two doubles for equality. 202 * astMAX 203 * Return maximum of two values. 204 * astMIN 205 * Return minimum of two values. 206 * astMAKE_CHECK 207 * Implement the astCheck<Class>_ function for a class. 208 * astMAKE_CLEAR 209 * Implement a method to clear an attribute value for a class. 210 * astMAKE_GET 211 * Implement a method to get an attribute value for a class. 212 * astMAKE_ISA 213 * Implement the astIsA<Class>_ function for a class. 214 * astMAKE_SET 215 * Implement a method to set an attribute value for a class. 216 * astMAKE_TEST 217 * Implement a method to test if an attribute has been set for a 218 * class. 219 * astMEMBER 220 * Locate a member function. 221 222 * Type Definitions: 223 * Public: 224 * AstObject 225 * Object type. 226 * 227 * Protected: 228 * AstObjectVtab 229 * Object virtual function table type. 230 231 * Feature Test Macros: 232 * AST_CHECK_CLASS 233 * If the AST_CHECK_CLASS macro is defined, then Object class 234 * checking is enabled for all internal function invocations 235 * within the AST library. Otherwise, this checking is 236 * omitted. This macro should normally be defined as a compiler 237 * option during library development and debugging, but left 238 * undefined for software releases, so as to improve 239 * peformance. Class checking by the AST public interface is not 240 * affected by this macro. 241 * astCLASS 242 * If the astCLASS macro is undefined, only public symbols are 243 * made available, otherwise protected symbols (for use in other 244 * class implementations) are defined. This macro also affects 245 * the reporting of error context information, which is only 246 * provided for external calls to the AST library. 247 * astFORTRAN77 248 * If the astFORTRAN77 macro is defined, reporting of error 249 * context information is suppressed. This is necessary when 250 * implementing foreign language interfaces to the AST library, as 251 * otherwise the file names and line numbers given would refer 252 * to the interface implementation rather than the user's own 253 * code. 254 255 * Copyright: 256 * Copyright (C) 1997-2006 Council for the Central Laboratory of the 257 * Research Councils 258 * Copyright (C) 2010 Science & Technology Facilities Council. 259 * All Rights Reserved. 260 261 * Licence: 262 * This program is free software: you can redistribute it and/or 263 * modify it under the terms of the GNU Lesser General Public 264 * License as published by the Free Software Foundation, either 265 * version 3 of the License, or (at your option) any later 266 * version. 267 * 268 * This program is distributed in the hope that it will be useful, 269 * but WITHOUT ANY WARRANTY; without even the implied warranty of 270 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 271 * GNU Lesser General Public License for more details. 272 * 273 * You should have received a copy of the GNU Lesser General 274 * License along with this program. If not, see 275 * <http://www.gnu.org/licenses/>. 276 277 * Authors: 278 * RFWS: R.F. Warren-Smith (Starlink) 279 * DSB: David S. Berry (Starlink) 280 281 * History: 282 * 30-JAN-1996 (RFWS): 283 * Original version. 284 * 19-APR-1996 (RFWS): 285 * Added macros for implementing attribute access methods. 286 * 3-JUL-1996 (RFWS): 287 * Added new definitions to support the external interface. 288 * 10-SEP-1996 (RFWS): 289 * Added loader and related facilities. 290 * 30-MAY-1997 (RFWS): 291 * Add the ID attribute. 292 * 14-JUL-1997 (RFWS): 293 * Add astExempt function. 294 * 20-JAN-1998 (RFWS): 295 * Make the astClear and astVSet methods virtual. 296 * 15-SEP-1999 (RFWS): 297 * Made the astAnnulId function accessible to protected code. 298 * 3-APR-2001 (DSB): 299 * Added Ident attribute. 300 * 8-JAN-2003 (DSB): 301 * Added protected astInitObjectVtab method. 302 * 30-APR-2003 (DSB): 303 * Added macros AST__VMAJOR, AST__VMINOR and AST__RELEASE. 304 * Added astVersion function. 305 * 7-FEB-2004 (DSB): 306 * Added astEscapes function. 307 * 11-MAR-2005 (DSB): 308 * Added UseDefs attribute. 309 * 7-FEB-2006 (DSB): 310 * Added astTune function. 311 * 14-FEB-2006 (DSB): 312 * Added ObjSize attribute. 313 * 23-FEB-2006 (DSB): 314 * Moved AST__TUNULL from this file to memory.h. 315 * 10-MAY-2006 (DSB): 316 * Added astEQUAL, astMAX and astMIN. 317 * 26-MAY-2006 (DSB): 318 * Make all system includes unconditional, so that makeh is not 319 * confused when creating ast.h. 320 * 22-JUN-2007 (DSB): 321 * - Make astVSet return a pointer to dynamic memory holding the 322 * expanded setting string. 323 * - Add ast astSetVtab and astCast. 324 * 22-APR-2008 (DSB): 325 * Added astSame. 326 * 7-APR-2010 (DSB): 327 * Added astHasAttribute. 328 *-- 329 */ 330 331 /* Include files. */ 332 /* ============== */ 333 /* Configuration results. */ 334 /* ---------------------- */ 335 #if HAVE_CONFIG_H 336 #include <config.h> 337 #endif 338 339 /* Interface definitions. */ 340 /* ---------------------- */ 341 #include "error.h" /* Error reporting facilities */ 342 #include "version.h" /* Version number macros */ 343 344 /* C header files. */ 345 /* --------------- */ 346 #include <stddef.h> 347 #include <stdarg.h> 348 #include <float.h> 349 #include <stdio.h> 350 351 #if defined(THREAD_SAFE) 352 #include <pthread.h> 353 #endif 354 355 /* Macros. */ 356 /* ======= */ 357 #if defined(astCLASS) || defined(astFORTRAN77) 358 #define STATUS_PTR status 359 #else 360 #define STATUS_PTR astGetStatusPtr 361 #endif 362 363 /* Define a dummy __attribute__ macro for use on non-GNU compilers. */ 364 #ifndef __GNUC__ 365 # define __attribute__(x) /*NOTHING*/ 366 #endif 367 368 /* Set to "1" (yes) or "0" (no) to indicate if AST was build with threads 369 support. */ 370 #define AST__THREADSAFE 1 371 372 #if defined(astCLASS ) 373 #define AST__GETATTRIB_BUFF_LEN 50 /* Length of string returned by GetAttrib. */ 374 #define AST__ASTGETC_MAX_STRINGS 50 /* Number of string values to buffer within astGetC */ 375 376 /* Values supplied to astManageLock */ 377 #define AST__LOCK 1 /* Lock the object */ 378 #define AST__UNLOCK 2 /* Unlock the object */ 379 #define AST__CHECKLOCK 3 /* Check if the object is locked */ 380 381 /* Values returned by astThread */ 382 #define AST__UNLOCKED 1 /* Object is unlocked */ 383 #define AST__RUNNING 2 /* Object is locked by the running thread */ 384 #define AST__OTHER 3 /* Object is locked by another thread */ 385 386 #endif 387 388 /* Value that indicates that two classes are not in direct line from each 389 other. */ 390 #if defined(astCLASS ) 391 #define AST__COUSIN -1000000 392 #endif 393 394 /* 395 *+ 396 * Name: 397 * astINVOKE 398 399 * Type: 400 * Protected macro. 401 402 * Purpose: 403 * Invoke an AST function. 404 405 * Synopsis: 406 * #include "object.h" 407 * astINVOKE(rettype,function) 408 409 * Class Membership: 410 * Defined by the Object class. 411 412 * Description: 413 * This macro expands to an invocation of an AST function, together 414 * with any additional actions required to support it. The actual 415 * expansion depends on whether the macro is expanded in internal 416 * code (astCLASS defined) or external code (astCLASS undefined) 417 * and it therefore hides the differences between these two 418 * interfaces. 419 420 * Parameters: 421 * rettype 422 * A character to indicate the type of result returned by the function: 423 * 424 * V 425 * The function returns a value (including void or a pointer 426 * value, but excluding an Object pointer). astINVOKE will 427 * return the value unchanged. 428 * O 429 * The function returns an Object pointer. astINVOKE will 430 * convert it to an Object identifier if necessary. 431 * F 432 * The function returns a function pointer. astINVOKE will 433 * return it unchanged. This is typically used when the 434 * function has a variable argument list. In this case the 435 * function name is passed to astINVOKE without its argument 436 * list and a pointer to the function is returned which can 437 * then be supplied with an argument list. This avoids the 438 * need to define a macro with a variable number of arguments 439 * (which isn't allowed). 440 * function 441 * A normal invocation of the function returning the required 442 * result. In the case of a variable argument list, the 443 * argument list should be omitted so that the function is not 444 * invoked but a function pointer is returned that may then be 445 * used to invoke it. 446 447 * Examples: 448 * #define astGetNobject(this) \ 449 * astINVOKE(V,astGetNobject_(astCheckObject(this))) 450 * Defines a macro to invoke the astGetNobject_ function which 451 * returns an int. 452 * #define astClone(this) \ 453 * astINVOKE(O,astClone_(astCheckObject(this))) 454 * Defines a macro to invoke the astClone_ function which 455 * returns an Object pointer. 456 * #define astSet astINVOKE(F,astSet_) 457 * Defines a macro to invoke the astSet_ function which has a 458 * variable argument list and returns void. The macro result is 459 * a pointer to the astSet_ function. This function must perform 460 * its own argument validation, as (e.g) astCheckObject cannot 461 * be invoked on its arguments via a macro. 462 463 * Notes: 464 * - To avoid problems with some compilers, you should not leave 465 * any white space around the macro arguments. 466 *- 467 */ 468 469 /* Define astINVOKE, which records the current file and line number 470 (in case of error) using astAt, and then invokes the function 471 supplied as an argument of the astRetV_, astRetO_ or astRetF_ 472 macro. 473 474 Suppress reporting of the file and line number from internal code 475 and from foreign language interfaces by not using astAt in these 476 cases. */ 477 #if defined(astCLASS) || defined(astFORTRAN77) 478 #define astINVOKE(rettype,function) astRet##rettype##_(function) 479 #else 480 #define astINVOKE(rettype,function) \ 481 astERROR_INVOKE(astRet##rettype##_(function)) 482 #endif 483 484 /* astRetF_ and astRetV_ currently do nothing. */ 485 #define astRetF_(x) (x) 486 #define astRetV_(x) (x) 487 488 /* However, astRetO_ converts a pointer to an ID if necessary. */ 489 #if defined(astCLASS) 490 #define astRetO_(x) ((void *)(x)) 491 #else 492 #define astRetO_(x) ((void *)astMakeId_((AstObject *)(x),STATUS_PTR)) 493 #endif 494 495 /* 496 *+ 497 * Name: 498 * astINVOKE_CHECK 499 * astINVOKE_ISA 500 501 * Type: 502 * Protected macros. 503 504 * Purpose: 505 * Invoke the astCheck<Class>_ and astIsA<Class>_ functions. 506 507 * Synopsis: 508 * #include "object.h" 509 * astINVOKE_CHECK(class,this,force) 510 * astINVOKE_ISA(class,this) 511 512 * Class Membership: 513 * Defined by the Object class. 514 515 * Description: 516 * These macros expand to invocations of the standard 517 * astCheck<Class>_ and astIsA<Class>_ functions for a class. 518 519 * Parameters: 520 * class 521 * The name (not the type) of the class for which the function 522 * is to be invoked. 523 * this 524 * The "this" argument (the Object pointer) to be passed to the 525 * function. 526 * force 527 * Type checking takes time, and so can be disabled within the 528 * protected context in order to save time. Setting "force" to 529 * zero causes the astINVOKE_CHECK macro to skip the class check 530 * in a protected context (it assumes that AST "knows what it is 531 * doing"). Setting "force" to a non-zero value forces the class 532 * check even in a protected context. 533 534 * Notes: 535 * - To avoid problems with some compilers, you should not leave 536 * any white space around the macro arguments. 537 *- 538 */ 539 540 /* For the public interface (and also internally if AST_CHECK_CLASS is 541 defined), define astINVOKE_CHECK to invoke the astCheck<Class> 542 function. */ 543 #if !defined(astCLASS) || defined(AST_CHECK_CLASS) 544 #define astINVOKE_CHECK(class,this,force) \ 545 astCheck##class##_((Ast##class *)astEnsurePointer_(this),astGetStatusPtr) 546 547 /* For the internal interface, astINVOKE_CHECK omits the 548 astCheck<class> function (unless AST_CHECK_CLASS is defined). */ 549 #else 550 551 #define astINVOKE_CHECK(class,this,force) ( (force) ? \ 552 ( astCheck##class##_((Ast##class *)astEnsurePointer_(this),astGetStatusPtr) ) : \ 553 ( (Ast##class *) astEnsurePointer_(this) ) ) 554 555 #endif 556 557 /* Define astINVOKE_ISA to invoke the astIsA<Class> function. */ 558 #if defined(astCLASS) /* Protected */ 559 #define astINVOKE_ISA(class,this) \ 560 astIsA##class##_((const Ast##class *)(this),status) 561 #else /* Public */ 562 #define astINVOKE_ISA(class,this) \ 563 astINVOKE(V,astIsA##class##_((const Ast##class *)astEnsurePointer_(this),astGetStatusPtr)) 564 #endif 565 566 /* The astEnsurePointer_ macro ensures a true C pointer, converting 567 from an ID if necessary. */ 568 #if defined(astCLASS) /* Protected */ 569 #define astEnsurePointer_(x) ((void *)(x)) 570 #else /* Public */ 571 #define astEnsurePointer_(x) ((void *)astCheckLock_(astMakePointer_((AstObject *)(x),STATUS_PTR),STATUS_PTR)) 572 #endif 573 574 #if defined(astCLASS) /* Protected */ 575 /* 576 *+ 577 * Name: 578 * astMAKE_CHECK 579 580 * Type: 581 * Protected macro. 582 583 * Purpose: 584 * Implement the astCheck<Class>_ function for a class. 585 586 * Synopsis: 587 * #include "object.h" 588 * astMAKE_CHECK(class) 589 590 * Class Membership: 591 * Defined by the Object class. 592 593 * Description: 594 * This macro expands to an implementation of the public astCheck<Class>_ 595 * function (q.v.) which validates membership of a specified class. 596 597 * Parameters: 598 * class 599 * The name (not the type) of the class whose membership is to be 600 * validated. 601 602 * Notes: 603 * - This macro is provided so that class definitions can easiy 604 * implement the astCheck<Class>_ function, which is essentially the same 605 * for each class apart for a change of name. 606 * - To avoid problems with some compilers, you should not leave any white 607 * space around the macro arguments. 608 *- 609 */ 610 611 #ifndef MEM_DEBUG 612 613 /* Define the macro. */ 614 #define astMAKE_CHECK(class) \ 615 \ 616 /* Declare the function (see the object.c file for a prologue). */ \ 617 Ast##class *astCheck##class##_( Ast##class *this, int *status ) { \ 618 \ 619 /* Check the inherited error status. */ \ 620 if ( !astOK ) return this; \ 621 \ 622 /* Check if the object is a class member. */ \ 623 if ( !astIsA##class( this ) ) { \ 624 \ 625 /* If not, but the pointer was valid (which means it identifies an Object \ 626 of some sort), then report more information about why this Object is \ 627 unsuitable. */ \ 628 if ( astOK ) { \ 629 astError( AST__OBJIN, "Pointer to " #class " required, but pointer " \ 630 "to %s given.", status, astGetClass( this ) ); \ 631 } \ 632 } \ 633 \ 634 /* Return the pointer value supplied. */ \ 635 return this; \ 636 } 637 638 /* Define the macro with memory debugging facilities. */ 639 #else 640 641 #define astMAKE_CHECK(class) \ 642 \ 643 /* Declare the function (see the object.c file for a prologue). */ \ 644 Ast##class *astCheck##class##_( Ast##class *this, int *status ) { \ 645 \ 646 char buf[100]; \ 647 \ 648 /* Check the inherited error status. */ \ 649 if ( !astOK ) return this; \ 650 \ 651 /* Check if the object is a class member. */ \ 652 if ( !astIsA##class( this ) ) { \ 653 \ 654 /* If not, but the pointer was valid (which means it identifies an Object \ 655 of some sort), then report more information about why this Object is \ 656 unsuitable. */ \ 657 if ( astOK ) { \ 658 astError( AST__OBJIN, "Pointer to " #class " required, but pointer " \ 659 "to %s given.", status, astGetClass( this ) ); \ 660 }\ 661 \ 662 } else { \ 663 \ 664 /* Call the astMemoryUse function to report it if the memory block is \ 665 being watched. */ \ 666 sprintf( buf, "checked (refcnt: %d)", astGetRefCount_( (AstObject *) this, status ) ); \ 667 astMemoryUse( this, buf ); \ 668 } \ 669 \ 670 /* Return the pointer value supplied. */ \ 671 return this; \ 672 } 673 #endif 674 #endif 675 676 #if defined(astCLASS) /* Protected */ 677 /* 678 *+ 679 * Name: 680 * astMAKE_CLEAR 681 682 * Purpose: 683 * Implement a method to clear an attribute value for a class. 684 685 * Type: 686 * Protected macro. 687 688 * Synopsis: 689 * #include "object.h" 690 * astMAKE_CLEAR(class,attribute,component,assign) 691 692 * Class Membership: 693 * Defined by the Object class. 694 695 * Description: 696 * This macro expands to an implementation of a private member function of 697 * the form: 698 * 699 * static void Clear<Attribute>( Ast<Class> *this ) 700 * 701 * and an external interface function of the form: 702 * 703 * void astClear<Attribute>_( Ast<Class> *this ) 704 * 705 * which implement a method for clearing a specified attribute value for 706 * a class. 707 708 * Parameters: 709 * class 710 * The name (not the type) of the class to which the attribute belongs. 711 * attribute 712 * The name of the attribute to be cleared, as it appears in the function 713 * name (e.g. Label in "astClearLabel"). 714 * component 715 * The name of the class structure component that holds the attribute 716 * value. 717 * assign 718 * An expression that evaluates to the value to assign to the component 719 * to clear its value. 720 721 * Examples: 722 * astMAKE_CLEAR(MyStuff,Flag,flag,-1) 723 * Implements the astClearFlag method for the MyStuff class which 724 * operates by setting the "flag" structure component to -1 to indicate 725 * that it has no value. 726 727 * Notes: 728 * - To avoid problems with some compilers, you should not leave any white 729 * space around the macro arguments. 730 *- 731 */ 732 733 /* Define the macro. */ 734 #define astMAKE_CLEAR(class,attribute,component,assign) \ 735 \ 736 /* Private member function. */ \ 737 /* ------------------------ */ \ 738 static void Clear##attribute( Ast##class *this, int *status ) { \ 739 \ 740 /* Check the inherited error status. */ \ 741 if ( !astOK ) return; \ 742 \ 743 /* Assign the "clear" value. */ \ 744 this->component = (assign); \ 745 } \ 746 \ 747 /* External interface. */ \ 748 /* ------------------- */ \ 749 void astClear##attribute##_( Ast##class *this, int *status ) { \ 750 \ 751 /* Check the inherited error status. */ \ 752 if ( !astOK ) return; \ 753 \ 754 /* Invoke the required method via the virtual function table. */ \ 755 (**astMEMBER(this,class,Clear##attribute))( this, status ); \ 756 } 757 #endif 758 759 #if defined(astCLASS) /* Protected */ 760 /* 761 *+ 762 * Name: 763 * astMAKE_GET 764 765 * Purpose: 766 * Implement a method to get an attribute value for a class. 767 768 * Type: 769 * Protected macro. 770 771 * Synopsis: 772 * #include "object.h" 773 * astMAKE_GET(class,attribute,type,bad_value,assign) 774 775 * Class Membership: 776 * Defined by the Object class. 777 778 * Description: 779 * This macro expands to an implementation of a private member function of 780 * the form: 781 * 782 * static <Type> Get<Attribute>( Ast<Class> *this ) 783 * 784 * and an external interface function of the form: 785 * 786 * <Type> astGet<Attribute>_( Ast<Class> *this ) 787 * 788 * which implement a method for getting a specified attribute value for a 789 * class. 790 791 * Parameters: 792 * class 793 * The name (not the type) of the class to which the attribute belongs. 794 * attribute 795 * The name of the attribute whose value is to be obtained, as it 796 * appears in the function name (e.g. Label in "astGetLabel"). 797 * type 798 * The C type of the attribute. 799 * bad_value 800 * A constant value to return if the inherited error status is set, or if 801 * the function fails. 802 * assign 803 * An expression that evaluates to the value to be returned. 804 805 * Examples: 806 * astMAKE_GET(MyStuff,Flag,int,0,( this->flag == 1 )) 807 * Implements the astGetFlag method for the MyStuff class which operates 808 * by examining the integer "flag" structure component and comparing it 809 * with the value 1 to see if it is set. A value of 0 is returned if the 810 * method fails to complete successfully. 811 812 * Notes: 813 * - To avoid problems with some compilers, you should not leave any white 814 * space around the macro arguments. 815 *- 816 */ 817 818 /* Define the macro. */ 819 #define astMAKE_GET(class,attribute,type,bad_value,assign) \ 820 \ 821 /* Private member function. */ \ 822 /* ------------------------ */ \ 823 static type Get##attribute( Ast##class *this, int *status ) { \ 824 type result; /* Result to be returned */ \ 825 \ 826 /* Check the inherited error status. */ \ 827 if ( !astOK ) return (bad_value); \ 828 \ 829 /* Assign the result value. */ \ 830 result = (assign); \ 831 \ 832 /* Check for errors and clear the result if necessary. */ \ 833 if ( !astOK ) result = (bad_value); \ 834 \ 835 /* Return the result. */ \ 836 return result; \ 837 } \ 838 /* External interface. */ \ 839 /* ------------------- */ \ 840 type astGet##attribute##_( Ast##class *this, int *status ) { \ 841 \ 842 /* Check the inherited error status. */ \ 843 if ( !astOK ) return (bad_value); \ 844 \ 845 /* Invoke the required method via the virtual function table. */ \ 846 return (**astMEMBER(this,class,Get##attribute))( this, status ); \ 847 } 848 #endif 849 850 #if defined(astCLASS) /* Protected */ 851 /* 852 *+ 853 * Name: 854 * astMAKE_ISA 855 856 * Type: 857 * Protected macro. 858 859 * Purpose: 860 * Implement the astIsA<Class>_ function for a class. 861 862 * Synopsis: 863 * #include "object.h" 864 * astMAKE_ISA(class,parent) 865 866 * Class Membership: 867 * Defined by the Object class. 868 869 * Description: 870 * This macro expands to an implementation of the public 871 * astIsA<Class>_ function (q.v.) which checks membership of a 872 * specified class. 873 874 * Parameters: 875 * class 876 * The name (not the type) of the class whose membership is to be 877 * tested. 878 * parent 879 * The name of the parent class. 880 881 * Notes: 882 * - This macro is provided so that class definitions can easiy 883 * implement the astIsA<Class>_ function, which is essentially the 884 * same for each class apart for a change of name. 885 * - To avoid problems with some compilers, you should not leave 886 * any white space around the macro arguments. 887 *- 888 */ 889 890 /* Define the macro. */ 891 #define astMAKE_ISA(class,parent) \ 892 \ 893 /* Declare the function (see the object.c file for a prologue). */ \ 894 int astIsA##class##_( const Ast##class *this, int *status ) { \ 895 \ 896 /* Local Variables: */ \ 897 int isa = 0; /* Is object a member? */ \ 898 \ 899 /* To test if the object is correctly constructed, we first test if it is a \ 900 member of the parent class. This improves the security of the test by \ 901 checking the object structure from the base Object class downwards \ 902 (without this, the "magic numbers" that identify classes might be \ 903 encountered by accident or we might address parts of the Object which \ 904 don't exist). */ \ 905 if ( astIsA##parent( this ) ) { \ 906 \ 907 /* Obtain the Object's size and check it is adequate for an object of the \ 908 proposed type (this avoids any attempt to access derived class data that \ 909 doesn't exist and therefore lies outside the memory allocated for the \ 910 object). */ \ 911 if ( ( (AstObject *) this )->size >= sizeof( Ast##class ) ) { \ 912 \ 913 /* If OK, see whether the check component in the object's virtual function \ 914 table matches the expected "magic" value. */ \ 915 isa = ( *astMEMBER(this,class,id.check) == &class_check ); \ 916 } \ 917 } \ 918 \ 919 /* Return the result. */ \ 920 return isa; \ 921 } 922 #endif 923 924 #if defined(astCLASS) /* Protected */ 925 /* 926 *+ 927 * Name: 928 * astMAKE_SET 929 930 * Purpose: 931 * Implement a method to set an attribute value for a class. 932 933 * Type: 934 * Protected macro. 935 936 * Synopsis: 937 * #include "object.h" 938 * astMAKE_SET(class,attribute,type,component,assign) 939 940 * Class Membership: 941 * Defined by the Object class. 942 943 * Description: 944 * This macro expands to an implementation of a private member function of 945 * the form: 946 * 947 * static void Set<Attribute>( Ast<Class> *this, <Type> value ) 948 * 949 * and an external interface function of the form: 950 * 951 * void astSet<Attribute>_( Ast<Class> *this, <Type> value ) 952 * 953 * which implement a method for setting a specified attribute value for a 954 * class. 955 956 * Parameters: 957 * class 958 * The name (not the type) of the class to which the attribute belongs. 959 * attribute 960 * The name of the attribute to be set, as it appears in the function 961 * name (e.g. Label in "astSetLabel"). 962 * type 963 * The C type of the attribute. 964 * component 965 * The name of the class structure component that holds the attribute 966 * value. 967 * assign 968 * An expression that evaluates to the value to be assigned to the 969 * component. 970 971 * Examples: 972 * astMAKE_SET(MyStuff,Flag,int,flag,( value != 0 )) 973 * Implements the astSetFlag method for the MyStuff class which operates 974 * by setting the "flag" structure component to 0 or 1 depending on 975 * whether the "value" parameter is non-zero or not. 976 977 * Notes: 978 * - To avoid problems with some compilers, you should not leave 979 * any white space around the macro arguments. 980 *- 981 */ 982 983 /* Define the macro. */ 984 #define astMAKE_SET(class,attribute,type,component,assign) \ 985 \ 986 /* Private member function. */ \ 987 /* ------------------------ */ \ 988 static void Set##attribute( Ast##class *this, type value, int *status ) { \ 989 \ 990 /* Check the inherited error status. */ \ 991 if ( !astOK ) return; \ 992 \ 993 /* Store the new value in the structure component. */ \ 994 this->component = (assign); \ 995 } \ 996 \ 997 /* External interface. */ \ 998 /* ------------------- */ \ 999 void astSet##attribute##_( Ast##class *this, type value, int *status ) { \ 1000 \ 1001 /* Check the inherited error status. */ \ 1002 if ( !astOK ) return; \ 1003 \ 1004 /* Invoke the required method via the virtual function table. */ \ 1005 (**astMEMBER(this,class,Set##attribute))( this, value, status ); \ 1006 } 1007 #endif 1008 1009 #if defined(astCLASS) /* Protected */ 1010 /* 1011 *+ 1012 * Name: 1013 * astMAKE_TEST 1014 1015 * Purpose: 1016 * Implement a method to test if an attribute has been set for a class. 1017 1018 * Type: 1019 * Protected macro. 1020 1021 * Synopsis: 1022 * #include "object.h" 1023 * astMAKE_TEST(class,attribute,assign) 1024 1025 * Class Membership: 1026 * Defined by the Object class. 1027 1028 * Description: 1029 * This macro expands to an implementation of a private member function of 1030 * the form: 1031 * 1032 * static int Test<Attribute>( Ast<Class> *this ) 1033 * 1034 * and an external interface function of the form: 1035 * 1036 * int astTest<Attribute>_( Ast<Class> *this ) 1037 * 1038 * which implement a method for testing if a specified attribute has been 1039 * set for a class. 1040 1041 * Parameters: 1042 * class 1043 * The name (not the type) of the class to which the attribute belongs. 1044 * attribute 1045 * The name of the attribute to be tested, as it appears in the function 1046 * name (e.g. Label in "astTestLabel"). 1047 * assign 1048 * An expression that evaluates to 0 or 1, to be used as the returned 1049 * value. 1050 1051 * Examples: 1052 * astMAKE_TEST(MyStuff,Flag,( this->flag != -1 )) 1053 * Implements the astTestFlag method for the MyStuff class which operates 1054 * by testing the "flag" structure component to see if it is set to a 1055 * value other than -1. 1056 1057 * Notes: 1058 * - To avoid problems with some compilers, you should not leave any white 1059 * space around the macro arguments. 1060 *- 1061 */ 1062 1063 /* Define the macro. */ 1064 #define astMAKE_TEST(class,attribute,assign) \ 1065 \ 1066 /* Private member function. */ \ 1067 /* ------------------------ */ \ 1068 static int Test##attribute( Ast##class *this, int *status ) { \ 1069 int result; /* Value to return */ \ 1070 \ 1071 /* Check the inherited error status. */ \ 1072 if ( !astOK ) return 0; \ 1073 \ 1074 /* Assign the result value. */ \ 1075 result = (assign); \ 1076 \ 1077 /* Check for errors and clear the result if necessary. */ \ 1078 if ( !astOK ) result = 0; \ 1079 \ 1080 /* Return the result. */ \ 1081 return result; \ 1082 } \ 1083 /* External interface. */ \ 1084 /* ------------------- */ \ 1085 int astTest##attribute##_( Ast##class *this, int *status ) { \ 1086 \ 1087 /* Check the inherited error status. */ \ 1088 if ( !astOK ) return 0; \ 1089 \ 1090 /* Invoke the required method via the virtual function table. */ \ 1091 return (**astMEMBER(this,class,Test##attribute))( this, status ); \ 1092 } 1093 #endif 1094 1095 #if defined(astCLASS) /* Protected */ 1096 /* 1097 *+ 1098 * Name: 1099 * astMEMBER 1100 1101 * Purpose: 1102 * Locate a member function. 1103 1104 * Type: 1105 * Protected macro. 1106 1107 * Synopsis: 1108 * #include "object.h" 1109 * astMEMBER(this,class,method) 1110 1111 * Class Membership: 1112 * Defined by the Object class. 1113 1114 * Description: 1115 * This macro evaluates to the address where the pointer to a 1116 * specified Object member function is stored. Typically, this will 1117 * be used to obtain a pointer to the member function so that it 1118 * can be invoked. It may also be used to assign a new function 1119 * pointer so that a derived class can re-define a virtual function 1120 * and hence over-ride an inherited method. 1121 1122 * Parameters: 1123 * this 1124 * Pointer to an Object belonging to the class for which the 1125 * virtual function is required. This must either be the class 1126 * that originally defined the method, or one derived from it. 1127 * class 1128 * Name of the class that originally defined the method. This 1129 * may differ from (i.e. be an ancestor of) the class to which 1130 * "this" belongs. 1131 * method 1132 * Name of the method whose member function is to be located. 1133 1134 * Returned Value: 1135 * The address where the member function pointer is stored (the 1136 * type of the result is determined by the type of the member 1137 * function itself). 1138 1139 * Examples: 1140 * astMEMBER(this,Gnome,astFish) 1141 * Returns the address where the pointer to the function that 1142 * implements the astFish method for the "this" object is 1143 * stored. The Gnome class should be where the astFish method 1144 * was first defined (i.e. from where it was inherited by 1145 * "this"). 1146 * (**astMEMBER(this,Gnome,astFish))( this, arg1, arg2 ); 1147 * Invokes the virtual function that implements the astFish 1148 * method for object "this" and passes it additional arguments 1149 * "arg2" and "arg2". Again, Gnome should be the class that 1150 * originally defined the astFish method. 1151 * *astMEMBER(this,Gnome,astFish) = myFish; 1152 * Stores a pointer to the myFish function so that it replaces 1153 * the virtual function that previously implemented the astFish 1154 * method for the "this" object. Note that all objects in the 1155 * same class as "this" are affected, but objects in class 1156 * "class" are not affected (unless it happens to be the class 1157 * to which "this" belongs). 1158 1159 * Notes: 1160 * - To avoid problems with some compilers, you should not leave 1161 * any white space around the macro arguments. 1162 *- 1163 */ 1164 1165 /* A subsiduary macro that returns a pointer to the vtab of an object, 1166 cast to an AstObjectVtab. */ 1167 #define astVTAB(this) (((AstObject*)(this))->vtab) 1168 1169 /* Define the macro. This functions by (a) casting the Object pointer 1170 to type (AstObject *) and locating the Object's virtual function 1171 table (b) casting the table pointer to the correct type 1172 (AstClassVtab *) for the class in which the method pointer resides, 1173 (c) locating the component holding the member function pointer, and 1174 (d) taking its address. */ 1175 #define astMEMBER(this,class,method) \ 1176 (&((Ast##class##Vtab*)astVTAB(this))->method) 1177 1178 #endif 1179 1180 /* 1181 *+ 1182 * Name: 1183 * astPROTO_CHECK 1184 * astPROTO_ISA 1185 1186 * Type: 1187 * Protected macros. 1188 1189 * Purpose: 1190 * Prototype the astCheck<Class>_ and astIsA<Class>_ functions. 1191 1192 * Synopsis: 1193 * #include "object.h" 1194 * astPROTO_CHECK(class) 1195 * astPROTO_ISA(class) 1196 1197 * Class Membership: 1198 * Defined by the Object class. 1199 1200 * Description: 1201 * These macros expands to function prototypes for the 1202 * astCheck<Class>_ and astIsA<Class>_ functions (q.v.) which 1203 * validate and test for membership of a specified class. 1204 1205 * Parameters: 1206 * class 1207 * The name (not the type) of the class whose membership is to 1208 * be validated. 1209 1210 * Notes: 1211 * - To avoid problems with some compilers, you should not leave 1212 * any white space around the macro arguments. 1213 *- 1214 */ 1215 1216 /* Define the macros. */ 1217 #define astPROTO_CHECK(class) Ast##class *astCheck##class##_( Ast##class *, int * ); 1218 #define astPROTO_ISA(class) int astIsA##class##_( const Ast##class *, int * ); 1219 1220 /* Macros which return the maximum and minimum of two values. */ 1221 #define astMAX(aa,bb) ((aa)>(bb)?(aa):(bb)) 1222 #define astMIN(aa,bb) ((aa)<(bb)?(aa):(bb)) 1223 1224 /* Check for equality of floating point values. We cannot compare bad values 1225 directly because of the danger of floating point exceptions, so bad 1226 values are dealt with explicitly. */ 1227 #define astEQUAL(aa,bb) (((aa)==AST__BAD)?(((bb)==AST__BAD)?1:0):(((bb)==AST__BAD)?0:(fabs((aa)-(bb))<=1.0E5*astMAX((fabs(aa)+fabs(bb))*DBL_EPSILON,DBL_MIN)))) 1228 1229 /* AST__NULL. */ 1230 /* ---------- */ 1231 /* Define the AST__NULL macro, which evaluates to a null Object 1232 pointer. */ 1233 #define AST__NULL (astI2P(0)) 1234 1235 1236 #if defined(astCLASS) /* Protected */ 1237 1238 /* Test the validy of an attribute value */ 1239 /* ------------------------------------- */ 1240 /* If the set attribute value is invalid, clear it. These macros should 1241 be used in a context in which error reporting has been deferred by 1242 calling astReporting( 0 ). */ 1243 1244 #define astCLEAN_ATTRIB(attr) \ 1245 if( astTest##attr(this) ) { \ 1246 astSet##attr( this, astGet##attr( this ) ); \ 1247 if( !astOK ) { \ 1248 astClearStatus; \ 1249 astClear##attr( this ); \ 1250 } \ 1251 } 1252 1253 #define astCLEAN_INDEXED_ATTRIB(attr,index) \ 1254 if( astTest##attr(this,index) ) { \ 1255 astSet##attr( this, index, astGet##attr( this, index ) ); \ 1256 if( !astOK ) { \ 1257 astClearStatus; \ 1258 astClear##attr( this, index ); \ 1259 } \ 1260 } 1261 1262 #endif 1263 1264 1265 #if defined(astCLASS) /* Protected */ 1266 #define astSetVtabClassIdentifier(vtab,id_ptr) \ 1267 ((AstObjectVtab *)(vtab))->top_id = (id_ptr) 1268 #endif 1269 1270 /* Type Definitions. */ 1271 /* ================= */ 1272 1273 /* Object structure. */ 1274 /* ----------------- */ 1275 /* This structure contains all information that is unique to each object in 1276 the class (e.g. its instance variables). */ 1277 typedef struct AstObject { 1278 1279 /* Attributes specific to objects in this class. */ 1280 unsigned long check; /* Check value to identify Objects */ 1281 size_t size; /* Amount of memory used by Object */ 1282 struct AstObjectVtab *vtab; /* Pointer to virtual function table */ 1283 char dynamic; /* Memory allocated dynamically? */ 1284 int ref_count; /* Number of active pointers to the Object */ 1285 char *id; /* Pointer to ID string */ 1286 char *ident; /* Pointer to Ident string */ 1287 char usedefs; /* Use default attribute values? */ 1288 int iref; /* Object index (unique within class) */ 1289 void *proxy; /* A pointer to an external object that 1290 acts as a foreign language proxy for the 1291 AST object */ 1292 #if defined(THREAD_SAFE) 1293 int locker; /* Thread that has locked this Object */ 1294 pthread_mutex_t mutex1; /* Guards access to all elements of the 1295 Object except for the "locker" and 1296 "ref_count" components */ 1297 pthread_mutex_t mutex2; /* Guards access to the "locker" and 1298 "ref_count" components */ 1299 struct AstGlobals *globals; /* Pointer to thread-specific global data */ 1300 #endif 1301 1302 } AstObject; 1303 1304 /* Class identifier structure */ 1305 typedef struct AstClassIdentifier { 1306 int *check; 1307 struct AstClassIdentifier *parent; 1308 } AstClassIdentifier; 1309 1310 /* Virtual function table. */ 1311 /* ----------------------- */ 1312 /* The virtual function table makes a forward reference to the 1313 AstChannel structure which is not defined until "channel.h" is 1314 included (below). Hence make a preliminary definition available 1315 now. */ 1316 struct AstChannel; 1317 1318 /* This table contains all information that is the same for all 1319 objects in the class (e.g. pointers to its virtual functions). */ 1320 #if defined(astCLASS) /* Protected */ 1321 typedef struct AstObjectVtab { 1322 1323 /* A unique identifier for this class. */ 1324 AstClassIdentifier id; 1325 1326 /* Pointer to the structure that identifies the top-level class described 1327 by the whole vtab (of which the AstObjectVtab is just the first, 1328 lowest-level, component). */ 1329 AstClassIdentifier *top_id; 1330 1331 /* Pointer to a dynamically allocated string holding the default 1332 attribute values to use when creating new objects. These are read from 1333 environment variables of the form "<CLASSNAME>_OPTIONS". */ 1334 const char *defaults; 1335 1336 /* Properties specific to this class. */ 1337 void ( *CleanAttribs )( AstObject *, int * ); 1338 AstObject *( *Cast )( AstObject *, AstObject *, int * ); 1339 const char *( *GetID )( AstObject *, int * ); 1340 const char *( *GetIdent )( AstObject *, int * ); 1341 const char *(* GetAttrib)( AstObject *, const char *, int * ); 1342 int (* TestAttrib)( AstObject *, const char *, int * ); 1343 int (* TestID)( AstObject *, int * ); 1344 int (* Same)( AstObject *, AstObject *, int * ); 1345 int (* HasAttribute)( AstObject *, const char *, int * ); 1346 int (* TestIdent)( AstObject *, int * ); 1347 void (* Clear)( AstObject *, const char *, int * ); 1348 void (* ClearAttrib)( AstObject *, const char *, int * ); 1349 void (* ClearID)( AstObject *, int * ); 1350 void (* ClearIdent)( AstObject *, int * ); 1351 void (* Dump)( AstObject *, struct AstChannel *, int * ); 1352 int (* Equal)( AstObject *, AstObject *, int * ); 1353 void (* SetAttrib)( AstObject *, const char *, int * ); 1354 void (* SetID)( AstObject *, const char *, int * ); 1355 void (* SetIdent)( AstObject *, const char *, int * ); 1356 void (* Show)( AstObject *, int * ); 1357 void (* VSet)( AstObject *, const char *, char **, va_list, int * ); 1358 void (* EnvSet)( AstObject *, int * ); 1359 1360 void *(* GetProxy)( AstObject *, int * ); 1361 void (* SetProxy)( AstObject *, void *, int * ); 1362 1363 int (* GetObjSize)( AstObject *, int * ); 1364 1365 int (* TestUseDefs)( AstObject *, int * ); 1366 int (* GetUseDefs)( AstObject *, int * ); 1367 void (* SetUseDefs)( AstObject *, int, int * ); 1368 void (* ClearUseDefs)( AstObject *, int * ); 1369 1370 const char *class; /* Pointer to class name string */ 1371 void (** delete)( AstObject *, int * ); /* Pointer to array of destructors */ 1372 void (** copy)( const AstObject *, AstObject *, int * ); /* Copy constructors */ 1373 void (** dump)( AstObject *, struct AstChannel *, int * ); /* Dump functions */ 1374 const char **dump_class; /* Dump function class string pointers */ 1375 const char **dump_comment; /* Dump function comment string pointers */ 1376 int ndelete; /* Number of destructors */ 1377 int ncopy; /* Number of copy constructors */ 1378 int ndump; /* Number of dump functions */ 1379 int nobject; /* Number of active objects in the class */ 1380 int nfree; /* No. of entries in "free_list" */ 1381 AstObject **free_list; /* List of pointers for freed Objects */ 1382 1383 #if defined(THREAD_SAFE) 1384 int (* ManageLock)( AstObject *, int, int, AstObject **, int * ); 1385 #endif 1386 1387 } AstObjectVtab; 1388 #endif 1389 1390 #if defined(THREAD_SAFE) && defined(astCLASS) 1391 1392 /* Define a structure holding all data items that are global within the 1393 object.c file. */ 1394 1395 typedef struct AstObjectGlobals { 1396 AstObjectVtab Class_Vtab; 1397 int Class_Init; 1398 int Retain_Esc; 1399 int Context_Level; 1400 int *Active_Handles; 1401 char GetAttrib_Buff[ AST__GETATTRIB_BUFF_LEN + 1 ]; 1402 char *AstGetC_Strings[ AST__ASTGETC_MAX_STRINGS ]; 1403 int AstGetC_Istr; 1404 int AstGetC_Init; 1405 int Nvtab; 1406 AstObjectVtab **Known_Vtabs; 1407 } AstObjectGlobals; 1408 1409 #endif 1410 1411 /* More include files. */ 1412 /* =================== */ 1413 /* The interface to the Channel class must be included here (after the 1414 type definitions for the Object class) because "channel.h" itself 1415 includes this file ("object.h"), although "object.h" refers to the 1416 AstChannel structure above. This seems a little strange at first, 1417 but is simply analogous to making a forward reference to a 1418 structure type when recursively defining a normal C structure 1419 (except that here the definitions happen to be in separate include 1420 files). */ 1421 #include "channel.h" 1422 1423 /* Function prototypes. */ 1424 /* ==================== */ 1425 /* Prototypes for standard class functions. */ 1426 /* ---------------------------------------- */ 1427 astPROTO_CHECK(Object) /* Validate class membership */ 1428 astPROTO_ISA(Object) /* Test class membership */ 1429 1430 /* NB. There is no constructor function for this class. */ 1431 1432 #if defined(astCLASS) /* Protected */ 1433 1434 /* Initialiser. */ 1435 AstObject *astInitObject_( void *, size_t, int, AstObjectVtab *, 1436 const char *, int * ); 1437 1438 /* Vtab Initialiser. */ 1439 void astInitObjectVtab_( AstObjectVtab *, const char *, int * ); 1440 1441 /* Loader. */ 1442 AstObject *astLoadObject_( void *, size_t, AstObjectVtab *, 1443 const char *, AstChannel *channel, int * ); 1444 1445 #if defined(THREAD_SAFE) 1446 void astInitObjectGlobals_( AstObjectGlobals * ); 1447 #endif 1448 1449 #endif 1450 1451 /* Prototypes for other class functions. */ 1452 /* ------------------------------------- */ 1453 #if !defined(astCLASS) /* Public */ 1454 void astBegin_( void ); 1455 void astEnd_( int * ); 1456 #endif 1457 1458 AstObject *astI2P_( int, int * ); 1459 AstObject *astMakeId_( AstObject *, int * ); 1460 AstObject *astMakePointer_( AstObject *, int * ); 1461 AstObject *astMakePointer_NoLockCheck_( AstObject *, int * ); 1462 int astP2I_( AstObject *, int * ); 1463 int astVersion_( int * ); 1464 int astEscapes_( int, int * ); 1465 int astTune_( const char *, int, int * ); 1466 void astTuneC_( const char *, const char *, char *, int, int * ); 1467 1468 /* Prototypes for member functions. */ 1469 /* -------------------------------- */ 1470 #if defined(astCLASS) /* Protected */ 1471 AstObject *astAnnul_( AstObject *, int * ); 1472 AstObject *astDelete_( AstObject *, int * ); 1473 void astSet_( void *, const char *, int *, ... ); 1474 1475 #else /* Public */ 1476 AstObject *astDeleteId_( AstObject *, int * ); 1477 int astThreadId_( AstObject *, int, int * ); 1478 void astExportId_( AstObject *, int * ); 1479 void astImportId_( AstObject *, int * ); 1480 void astSetId_( void *, const char *, ... )__attribute__((format(printf,2,3))); 1481 #endif 1482 1483 AstObject *astAnnulId_( AstObject *, int * ); 1484 AstObject *astCheckLock_( AstObject *, int * ); 1485 AstObject *astClone_( AstObject *, int * ); 1486 AstObject *astCopy_( const AstObject *, int * ); 1487 AstObject *astFromString_( const char *, int * ); 1488 char *astToString_( AstObject *, int * ); 1489 const char *astGetC_( AstObject *, const char *, int * ); 1490 double astGetD_( AstObject *, const char *, int * ); 1491 float astGetF_( AstObject *, const char *, int * ); 1492 int astEqual_( AstObject *, AstObject *, int * ); 1493 int astGetI_( AstObject *, const char *, int * ); 1494 int astHasAttribute_( AstObject *, const char *, int * ); 1495 int astSame_( AstObject *, AstObject *, int * ); 1496 int astTest_( AstObject *, const char *, int * ); 1497 long astGetL_( AstObject *, const char *, int * ); 1498 void *astGetProxy_( AstObject *, int * ); 1499 void astClear_( AstObject *, const char *, int * ); 1500 void astExemptId_( AstObject *, int * ); 1501 void astLockId_( AstObject *, int, int * ); 1502 void astSetC_( AstObject *, const char *, const char *, int * ); 1503 void astSetD_( AstObject *, const char *, double, int * ); 1504 void astSetF_( AstObject *, const char *, float, int * ); 1505 void astSetI_( AstObject *, const char *, int, int * ); 1506 void astSetL_( AstObject *, const char *, long, int * ); 1507 void astSetProxy_( AstObject *, void *, int * ); 1508 void astShow_( AstObject *, int * ); 1509 void astUnlockId_( AstObject *, int, int * ); 1510 1511 #if defined(astCLASS) /* Protected */ 1512 1513 void astCleanAttribs_( AstObject *, int * ); 1514 AstObject *astCast_( AstObject *, AstObject *, int * ); 1515 AstObject *astCastCopy_( AstObject *, AstObject *, int * ); 1516 1517 #if defined(THREAD_SAFE) 1518 int astManageLock_( AstObject *, int, int, AstObject **, int * ); 1519 #endif 1520 1521 int astGetObjSize_( AstObject *, int * ); 1522 1523 int astTestUseDefs_( AstObject *, int * ); 1524 int astGetUseDefs_( AstObject *, int * ); 1525 void astSetUseDefs_( AstObject *, int, int * ); 1526 void astClearUseDefs_( AstObject *, int * ); 1527 1528 const char *astGetAttrib_( AstObject *, const char *, int * ); 1529 const char *astGetClass_( const AstObject *, int * ); 1530 const char *astGetID_( AstObject *, int * ); 1531 const char *astGetIdent_( AstObject *, int * ); 1532 int astClassCompare_( AstObjectVtab *, AstObjectVtab *, int * ); 1533 int astGetNobject_( const AstObject *, int * ); 1534 int astGetRefCount_( AstObject *, int * ); 1535 int astTestAttrib_( AstObject *, const char *, int * ); 1536 int astTestID_( AstObject *, int * ); 1537 int astTestIdent_( AstObject *, int * ); 1538 void astClearAttrib_( AstObject *, const char *, int * ); 1539 void astClearID_( AstObject *, int * ); 1540 void astClearIdent_( AstObject *, int * ); 1541 void astDump_( AstObject *, AstChannel *, int * ); 1542 void astSetAttrib_( AstObject *, const char *, int * ); 1543 void astSetCopy_( AstObjectVtab *, void (*)( const AstObject *, AstObject *, int * ), int * ); 1544 void astSetDelete_( AstObjectVtab *, void (*)( AstObject *, int * ), int * ); 1545 void astSetDump_( AstObjectVtab *, void (*)( AstObject *, AstChannel *, int * ), const char *, const char *, int * ); 1546 void astSetVtab_( AstObject *, AstObjectVtab *, int * ); 1547 void astSetID_( AstObject *, const char *, int * ); 1548 void astSetIdent_( AstObject *, const char *, int * ); 1549 void astEnvSet_( AstObject *, int * ); 1550 void astVSet_( AstObject *, const char *, char **, va_list, int * ); 1551 1552 #endif 1553 1554 1555 /* Function interfaces. */ 1556 /* ==================== */ 1557 /* These macros are wrap-ups for the functions defined by this class 1558 to make them easier to invoke (e.g. to avoid type mis-matches when 1559 passing pointers to objects from derived classes). */ 1560 1561 /* Interfaces to standard class functions. */ 1562 /* --------------------------------------- */ 1563 /* Check class membership. */ 1564 #define astCheckObject(this) astINVOKE_CHECK(Object,this,0) 1565 #define astVerifyObject(this) astINVOKE_CHECK(Object,this,1) 1566 1567 /* Test class membership. */ 1568 #define astIsAObject(this) astINVOKE_ISA(Object,this) 1569 1570 /* NB. There is no constructor function for this class. */ 1571 1572 #if defined(astCLASS) /* Protected */ 1573 1574 /* Initialiser. */ 1575 #define astInitObject(mem,size,init,vtab,name) \ 1576 astINVOKE(O,astInitObject_(mem,size,init,vtab,name,STATUS_PTR)) 1577 1578 /* Vtab Initialiser. */ 1579 #define astInitObjectVtab(vtab,name) astINVOKE(V,astInitObjectVtab_(vtab,name,STATUS_PTR)) 1580 1581 /* Loader. */ 1582 #define astLoadObject(mem,size,vtab,name,channel) \ 1583 astINVOKE(O,astLoadObject_(mem,size,vtab,name,astCheckChannel(channel),STATUS_PTR)) 1584 #endif 1585 1586 /* Interfaces to other class functions. */ 1587 /* ------------------------------------ */ 1588 #if !defined(astCLASS) /* Public */ 1589 #define astBegin astBegin_() 1590 #define astEnd astINVOKE(V,astEnd_(STATUS_PTR)) 1591 #else /* Protected */ 1592 #define astMakePointer_NoLockCheck(id) ((void *)astMakePointer_NoLockCheck_((AstObject *)(id),STATUS_PTR)) 1593 #endif 1594 1595 #define astVersion astVersion_(STATUS_PTR) 1596 #define astEscapes(int) astEscapes_(int,STATUS_PTR) 1597 #define astTune(name,val) astTune_(name,val,STATUS_PTR) 1598 #define astTuneC(name,value,buff,bufflen) astTuneC_(name,value,buff,bufflen,STATUS_PTR) 1599 #define astI2P(integer) ((void *)astI2P_(integer,STATUS_PTR)) 1600 #define astMakeId(pointer) ((void *)astMakeId_((AstObject *)(pointer),STATUS_PTR)) 1601 #define astP2I(pointer) astP2I_((AstObject *)(pointer),STATUS_PTR) 1602 #define astMakePointer(id) ((void *)astCheckLock_(astMakePointer_((AstObject *)(id),STATUS_PTR),STATUS_PTR)) 1603 #define astToString(this) astINVOKE(V,astToString_(astCheckObject(this),STATUS_PTR)) 1604 #define astFromString(string) astINVOKE(O,astFromString_(string,STATUS_PTR)) 1605 1606 /* Interfaces to member functions. */ 1607 /* ------------------------------- */ 1608 /* Here we make use of astCheckObject (et al.) to validate Object 1609 pointers before use. This provides a contextual error report if a 1610 pointer to the wrong sort of object is supplied. In the case of an 1611 external caller, it also performs the required conversion from an 1612 Object identifier to a true C pointer. */ 1613 1614 /* These functions require special treatment for external use because 1615 they handle Object identifiers and their resources explicitly, and 1616 must therefore be passed identifier values without conversion to C 1617 pointers. */ 1618 1619 #if defined(astCLASS) || defined(astFORTRAN77) /* Protected or Fotran interface */ 1620 #define astAnnulId(this) astINVOKE(O,astAnnulId_((AstObject *)(this),STATUS_PTR)) 1621 #endif 1622 1623 #if defined(astCLASS) /* Protected only */ 1624 #define astAnnul(this) astINVOKE(O,astAnnul_(astCheckObject(this),STATUS_PTR)) 1625 #define astDelete(this) astINVOKE(O,astDelete_(astCheckObject(this),STATUS_PTR)) 1626 #define astSet astINVOKE(F,astSet_) 1627 1628 #else /* Public only */ 1629 #define astAnnul(this) astINVOKE(O,astAnnulId_((AstObject *)(this),STATUS_PTR)) 1630 #define astDelete(this) astINVOKE(O,astDeleteId_((AstObject *)(this),STATUS_PTR)) 1631 #define astExport(this) astINVOKE(V,astExportId_((AstObject *)(this),STATUS_PTR)) 1632 #define astImport(this) astINVOKE(V,astImportId_((AstObject *)(this),STATUS_PTR)) 1633 #define astSet astINVOKE(F,astSetId_) 1634 #define astThread(this,ptr) astINVOKE(V,astThreadId_((AstObject *)(this),ptr,STATUS_PTR)) 1635 #endif 1636 1637 /* Both.... */ 1638 #define astLock(this,wait) astINVOKE(V,astLockId_((AstObject *)(this),wait,STATUS_PTR)) 1639 #define astUnlock(this,report) astINVOKE(V,astUnlockId_((AstObject *)(this),report,STATUS_PTR)) 1640 #define astEqual(this,that) astINVOKE(V,(((AstObject*)this==(AstObject*)that)||astEqual_(astCheckObject(this),astCheckObject(that),STATUS_PTR))) 1641 #define astExempt(this) astINVOKE(V,astExemptId_((AstObject *)(this),STATUS_PTR)) 1642 #define astClear(this,attrib) astINVOKE(V,astClear_(astCheckObject(this),attrib,STATUS_PTR)) 1643 #define astClone(this) astINVOKE(O,astClone_(astCheckObject(this),STATUS_PTR)) 1644 #define astCopy(this) astINVOKE(O,astCopy_(astCheckObject(this),STATUS_PTR)) 1645 #define astGetC(this,attrib) astINVOKE(V,astGetC_(astCheckObject(this),attrib,STATUS_PTR)) 1646 #define astGetD(this,attrib) astINVOKE(V,astGetD_(astCheckObject(this),attrib,STATUS_PTR)) 1647 #define astGetF(this,attrib) astINVOKE(V,astGetF_(astCheckObject(this),attrib,STATUS_PTR)) 1648 #define astGetI(this,attrib) \ 1649 astINVOKE(V,astGetI_(astCheckObject(this),attrib,STATUS_PTR)) 1650 #define astGetL(this,attrib) \ 1651 astINVOKE(V,astGetL_(astCheckObject(this),attrib,STATUS_PTR)) 1652 #define astSetC(this,attrib,value) \ 1653 astINVOKE(V,astSetC_(astCheckObject(this),attrib,value,STATUS_PTR)) 1654 #define astSetD(this,attrib,value) \ 1655 astINVOKE(V,astSetD_(astCheckObject(this),attrib,value,STATUS_PTR)) 1656 #define astSetF(this,attrib,value) \ 1657 astINVOKE(V,astSetF_(astCheckObject(this),attrib,value,STATUS_PTR)) 1658 #define astSetI(this,attrib,value) \ 1659 astINVOKE(V,astSetI_(astCheckObject(this),attrib,value,STATUS_PTR)) 1660 #define astSetL(this,attrib,value) \ 1661 astINVOKE(V,astSetL_(astCheckObject(this),attrib,value,STATUS_PTR)) 1662 #define astShow(this) \ 1663 astINVOKE(V,astShow_(astCheckObject(this),STATUS_PTR)) 1664 #define astTest(this,attrib) \ 1665 astINVOKE(V,astTest_(astCheckObject(this),attrib,STATUS_PTR)) 1666 #define astSame(this,that) \ 1667 astINVOKE(V,astSame_(astCheckObject(this),astCheckObject(that),STATUS_PTR)) 1668 #define astHasAttribute(this,attrib) \ 1669 astINVOKE(V,astHasAttribute_(astCheckObject(this),attrib,STATUS_PTR)) 1670 #define astGetProxy(this) \ 1671 astINVOKE(V,astGetProxy_(astCheckObject(this),STATUS_PTR)) 1672 #define astSetProxy(this,proxy) \ 1673 astINVOKE(V,astSetProxy_(astCheckObject(this),proxy,STATUS_PTR)) 1674 1675 1676 #if defined(astCLASS) /* Protected */ 1677 1678 #if defined(THREAD_SAFE) 1679 #define astManageLock(this,mode,extra,fail) \ 1680 astINVOKE(V,astManageLock_(astCheckObject(this),mode, extra,fail,STATUS_PTR)) 1681 #else 1682 #define astManageLock(this,mode,extra,fail) 1683 #endif 1684 1685 #define astCleanAttribs(this) astINVOKE(V,astCleanAttribs_(astCheckObject(this),STATUS_PTR)) 1686 #define astGetObjSize(this) astINVOKE(V,astGetObjSize_(astCheckObject(this),STATUS_PTR)) 1687 #define astCast(this,obj) astINVOKE(O,astCast_(astCheckObject(this),astCheckObject(obj),STATUS_PTR)) 1688 #define astCastCopy(this,obj) astCastCopy_((AstObject*)this,(AstObject*)obj,STATUS_PTR) 1689 1690 #define astClearUseDefs(this) astINVOKE(V,astClearUseDefs_(astCheckObject(this),STATUS_PTR)) 1691 #define astTestUseDefs(this) astINVOKE(V,astTestUseDefs_(astCheckObject(this),STATUS_PTR)) 1692 #define astGetUseDefs(this) astINVOKE(V,astGetUseDefs_(astCheckObject(this),STATUS_PTR)) 1693 #define astSetUseDefs(this,val) astINVOKE(V,astSetUseDefs_(astCheckObject(this),val,STATUS_PTR)) 1694 1695 #define astClearAttrib(this,attrib) \ 1696 astINVOKE(V,astClearAttrib_(astCheckObject(this),attrib,STATUS_PTR)) 1697 #define astClearID(this) astINVOKE(V,astClearID_(astCheckObject(this),STATUS_PTR)) 1698 #define astClearIdent(this) astINVOKE(V,astClearIdent_(astCheckObject(this),STATUS_PTR)) 1699 #define astDump(this,channel) \ 1700 astINVOKE(V,astDump_(astCheckObject(this),astCheckChannel(channel),STATUS_PTR)) 1701 1702 #define astGetAttrib(this,attrib) \ 1703 astINVOKE(V,astGetAttrib_(astCheckObject(this),attrib,STATUS_PTR)) 1704 #define astGetClass(this) astINVOKE(V,astGetClass_((const AstObject *)(this),STATUS_PTR)) 1705 #define astGetID(this) astINVOKE(V,astGetID_(astCheckObject(this),STATUS_PTR)) 1706 #define astGetIdent(this) astINVOKE(V,astGetIdent_(astCheckObject(this),STATUS_PTR)) 1707 #define astGetNobject(this) astINVOKE(V,astGetNobject_(astCheckObject(this),STATUS_PTR)) 1708 #define astClassCompare(class1,class2) astClassCompare_(class1,class2,STATUS_PTR) 1709 #define astGetRefCount(this) astINVOKE(V,astGetRefCount_(astCheckObject(this),STATUS_PTR)) 1710 #define astSetAttrib(this,setting) \ 1711 astINVOKE(V,astSetAttrib_(astCheckObject(this),setting,STATUS_PTR)) 1712 #define astSetCopy(vtab,copy) \ 1713 astINVOKE(V,astSetCopy_((AstObjectVtab *)(vtab),copy,STATUS_PTR)) 1714 #define astSetDelete(vtab,delete) \ 1715 astINVOKE(V,astSetDelete_((AstObjectVtab *)(vtab),delete,STATUS_PTR)) 1716 #define astSetDump(vtab,dump,class,comment) \ 1717 astINVOKE(V,astSetDump_((AstObjectVtab *)(vtab),dump,class,comment,STATUS_PTR)) 1718 #define astSetVtab(object,vtab) \ 1719 astINVOKE(V,astSetVtab_((AstObject *)object,(AstObjectVtab *)(vtab),STATUS_PTR)) 1720 #define astSetID(this,id) astINVOKE(V,astSetID_(astCheckObject(this),id,STATUS_PTR)) 1721 #define astSetIdent(this,id) astINVOKE(V,astSetIdent_(astCheckObject(this),id,STATUS_PTR)) 1722 #define astVSet(this,settings,text,args) \ 1723 astINVOKE(V,astVSet_(astCheckObject(this),settings,text,args,STATUS_PTR)) 1724 #define astEnvSet(this) \ 1725 astINVOKE(V,astEnvSet_(astCheckObject(this),STATUS_PTR)) 1726 #define astTestAttrib(this,attrib) \ 1727 astINVOKE(V,astTestAttrib_(astCheckObject(this),attrib,STATUS_PTR)) 1728 #define astTestID(this) astINVOKE(V,astTestID_(astCheckObject(this),STATUS_PTR)) 1729 #define astTestIdent(this) astINVOKE(V,astTestIdent_(astCheckObject(this),STATUS_PTR)) 1730 1731 /* Deprecated synonym. */ 1732 #define astClass(this) astGetClass(this) 1733 #endif 1734 1735 /* Extra stuff for debuging probnlems with object handles and memory usage */ 1736 #ifdef MEM_DEBUG 1737 1738 void astWatchHandle_( int ); 1739 void astHandleUse_( int, const char *, ... ); 1740 void astHandleAlarm_( const char *, va_list ); 1741 1742 #define astWatchHandle astWatchHandle_ 1743 #define astHandleUse astHandleUse_ 1744 #define astHandleAlarm astHandleAlarm_ 1745 1746 #else 1747 1748 #define astWatchHandle 1749 #define astHandleUse 1750 #define astHandleAlarm 1751 1752 #endif 1753 1754 #endif 1755 1756