home *** CD-ROM | disk | FTP | other *** search
/ vis-ftp.cs.umass.edu / vis-ftp.cs.umass.edu.tar / vis-ftp.cs.umass.edu / pub / Software / ASCENDER / ascendMar8.tar / UMass / Triangulate / include / cvar.h < prev    next >
C/C++ Source or Header  |  1995-04-13  |  5KB  |  144 lines

  1. /* @(#)cvar.h    1.5 4/28/93 */
  2. /* Defines macros for the external definitions */
  3. #ifndef CVAR_H
  4. #define CVAR_H
  5.  
  6. /* LINTLIBRARY */
  7.  
  8. /*    @(#)c_varieties.h 1.4 89/09/18 SMI    */
  9.  
  10. /*
  11.  *    Copyright (c) 1988,1989,1990 by Sun Microsystems
  12.  */
  13.  
  14. /*
  15.  *    This file defines some macros that are used to make code
  16.  *    portable between the major C dialects currently in use at
  17.  *    Sun.  As of 12/90, these include Sun C (a lot like K&R C),
  18.  *    ANSI C, and C++.
  19.  *
  20.  * external functions:
  21.  *    To declare an external function, invoke the EXTERN_C_FUNCTION
  22.  *    macro; the macro's first parameter should be the function's
  23.  *    return type and function name, and the second macro parameter
  24.  *    should be the parenthesized list of function arguments (or an
  25.  *    ellipsis - DOTDOTDOT macro should be used to indicate the 
  26.  *      ellipsis as explained later in this file - if the arguments are 
  27.  *      unspecified or of varying number or type, or the uppercase word 
  28.  *      "_VOID_" if the function takes no arguments).  Some examples:
  29.  *
  30.  *        EXTERN_C_FUNCTION( void printf, (char *, DOTDOTDOT) );
  31.  *        EXTERN_C_FUNCTION( int fread, (char*, int, int, FILE*) );
  32.  *        EXTERN_C_FUNCTION( int getpid, (_VOID_) );
  33.  *
  34.  *    Note that to be ANSI-C conformant, one should put "," at the end
  35.  *    first argument of printf() declaration.
  36.  *
  37.  * structure tags:
  38.  *    In order to handle cases where a structure tag has the same name
  39.  *    as a type, the STRUCT_TAG macro makes the tag disappear in C++.
  40.  *    An example (from <sys/types.h>):
  41.  *
  42.  *        typedef struct STRUCT_TAG(fd_set) { ... } fd_set;
  43.  *
  44.  * enum bitfields:
  45.  *    In K&R C as interpreted at UCB, bitfields may be declared to
  46.  *    be of an enumerated type.  Neither ANSI C nor C++ permit this,
  47.  *    so the ENUM_BITFIELD macro replaces the enum declaration with
  48.  *    "unsigned".   An example (from C++'s <sunwindow/attr.h>):
  49.  *
  50.  *        struct {
  51.  *        ENUM_BITFIELD( Attr_pkg )    pkg        : 8;
  52.  *        unsigned            ordinal        : 8;
  53.  *        ENUM_BITFIELD( Attr_list_type )    list_type    : 8;
  54.  *        ...
  55.  *        };
  56.  *
  57.  * enum type specifier:
  58.  *    In K&R C, it is OK to use "enum xyz" as return type but in C++,
  59.  *     one should use "xyz".  ENUM_TYPE macro is used to handle this.
  60.  *
  61.  *        ENUM_TYPE(enum, xyz) (*func) (char *, DOTDOTDOT);
  62.  *
  63.  * Pointers to functions declared as struct members or function arguments:
  64.  *    Ideally, all pointers to function types should be declared with
  65.  *    the exact function argument types for C++ and ANSI-C, as in
  66.  *
  67.  *        struct xp_ops {
  68.  *        #if defined(__cplusplus) || defined(__STDC__)
  69.  *               bool_t      (*xp_recv)(SVCXPRT *, struct rpc_msg *);
  70.  *            ....
  71.  *          #else
  72.  *        bool_t      (*xp_recv)();
  73.  *            ....
  74.  *        };
  75.  *
  76.  *        EXTERN_C_FUNCTION(int foo, (char*, int (*func) (int, char)));
  77.  *
  78.  *    In the event when the argument types of the function pointer may
  79.  *     vary depending on the situation, one can use DOTDOTDOT to tell
  80.  *    C++ not to be so uptight.  Using this method may require pointer
  81.  *    casting when actual assignments or function calls take place,
  82.  *    because ellipses "..." in function pointers does not work as
  83.  *    a wildcard.  It is meant to match only those pointers to functions
  84.  *    that are defined specifically to take variable arguments.
  85.  *    Note that for ANSI-C, at least one argument has to be provided 
  86.  *    before the ellipses.
  87.  *
  88.  *        struct foo {
  89.  *            int    (*f)( int, DOTDOTDOT );
  90.  *            . . .
  91.  *        };
  92.  *
  93.  */
  94.  
  95. typedef void (*_PFV_)();
  96. typedef int (*_PFI_)();
  97.  
  98. /* Which type of C/C++ compiler are we using? */
  99.  
  100. #if defined(__cplusplus)
  101.     /*
  102.      * Definitions for C++ 2.0 and later require extern "C" { decl; }
  103.      */
  104. #   define EXTERN_C_FUNCTION( rtn, args ) extern "C" { rtn args; }
  105. #   define FUNCTION_DECL( rtn, args ) rtn args
  106. #   define FUNCTION_DEF( rtn, args ) rtn args
  107. #   define STRUCT_TAG( tag_name ) /* the tag disappears */
  108. #   define ENUM_BITFIELD( enum_type ) unsigned
  109. #   define ENUM_TYPE( enum_sp, enum_ty ) enum_ty
  110. #   define DOTDOTDOT ...
  111. #   define _VOID_ void
  112.  
  113. #elif defined(__STDC__)
  114.     /*
  115.      * Definitions for ANSI C
  116.      */
  117. #   define EXTERN_C_FUNCTION( rtn, args ) rtn args
  118. #   define FUNCTION_DECL( rtn, args ) rtn args
  119. #   define FUNCTION_DEF( rtn, args ) rtn args
  120. #   define STRUCT_TAG( tag_name ) tag_name
  121. #   define ENUM_BITFIELD( enum_type ) unsigned
  122. #   define ENUM_TYPE( enum_sp, enum_ty ) enum_sp enum_ty
  123. #   define DOTDOTDOT ...
  124. #   define _VOID_ void
  125.  
  126. #else
  127.     /*
  128.      * Definitions for Sun/K&R C -- ignore function prototypes,
  129.      * but preserve tag names and enum bitfield declarations.
  130.      */
  131. #   define EXTERN_C_FUNCTION( rtn, args ) rtn()
  132. #   define FUNCTION_DECL( rtn, args ) rtn()
  133. #   define FUNCTION_DEF( rtn, args ) rtn args /* This will probably not work */
  134. #   define STRUCT_TAG( tag_name ) tag_name
  135. #   define ENUM_BITFIELD( enum_type ) enum_type
  136. #   define ENUM_TYPE( enum_sp, enum_ty ) enum_sp enum_ty
  137. #   define DOTDOTDOT
  138. #   define _VOID_
  139.     /* VOID is only used where it disappears anyway */
  140.  
  141. #endif /* Which type of C/C++ compiler are we using? */
  142.  
  143. #endif
  144.