Home | History | Annotate | Download | only in nspr
      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* ***** BEGIN LICENSE BLOCK *****
      3  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
      4  *
      5  * The contents of this file are subject to the Mozilla Public License Version
      6  * 1.1 (the "License"); you may not use this file except in compliance with
      7  * the License. You may obtain a copy of the License at
      8  * http://www.mozilla.org/MPL/
      9  *
     10  * Software distributed under the License is distributed on an "AS IS" basis,
     11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
     12  * for the specific language governing rights and limitations under the
     13  * License.
     14  *
     15  * The Original Code is the Netscape Portable Runtime (NSPR).
     16  *
     17  * The Initial Developer of the Original Code is
     18  * Netscape Communications Corporation.
     19  * Portions created by the Initial Developer are Copyright (C) 1998-2000
     20  * the Initial Developer. All Rights Reserved.
     21  *
     22  * Contributor(s):
     23  *
     24  * Alternatively, the contents of this file may be used under the terms of
     25  * either the GNU General Public License Version 2 or later (the "GPL"), or
     26  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
     27  * in which case the provisions of the GPL or the LGPL are applicable instead
     28  * of those above. If you wish to allow use of your version of this file only
     29  * under the terms of either the GPL or the LGPL, and not to allow others to
     30  * use your version of this file under the terms of the MPL, indicate your
     31  * decision by deleting the provisions above and replace them with the notice
     32  * and other provisions required by the GPL or the LGPL. If you do not delete
     33  * the provisions above, a recipient may use your version of this file under
     34  * the terms of any one of the MPL, the GPL or the LGPL.
     35  *
     36  * ***** END LICENSE BLOCK ***** */
     37 
     38 /*
     39 ** File:                prtypes.h
     40 ** Description: Definitions of NSPR's basic types
     41 **
     42 ** Prototypes and macros used to make up for deficiencies that we have found
     43 ** in ANSI environments.
     44 **
     45 ** Since we do not wrap <stdlib.h> and all the other standard headers, authors
     46 ** of portable code will not know in general that they need these definitions.
     47 ** Instead of requiring these authors to find the dependent uses in their code
     48 ** and take the following steps only in those C files, we take steps once here
     49 ** for all C files.
     50 **/
     51 
     52 #ifndef prtypes_h___
     53 #define prtypes_h___
     54 
     55 #ifdef MDCPUCFG
     56 #include MDCPUCFG
     57 #else
     58 #include "base/third_party/nspr/prcpucfg.h"
     59 #endif
     60 
     61 #include <stddef.h>
     62 
     63 /***********************************************************************
     64 ** MACROS:      PR_EXTERN
     65 **              PR_IMPLEMENT
     66 ** DESCRIPTION:
     67 **      These are only for externally visible routines and globals.  For
     68 **      internal routines, just use "extern" for type checking and that
     69 **      will not export internal cross-file or forward-declared symbols.
     70 **      Define a macro for declaring procedures return types. We use this to
     71 **      deal with windoze specific type hackery for DLL definitions. Use
     72 **      PR_EXTERN when the prototype for the method is declared. Use
     73 **      PR_IMPLEMENT for the implementation of the method.
     74 **
     75 ** Example:
     76 **   in dowhim.h
     77 **     PR_EXTERN( void ) DoWhatIMean( void );
     78 **   in dowhim.c
     79 **     PR_IMPLEMENT( void ) DoWhatIMean( void ) { return; }
     80 **
     81 **
     82 ***********************************************************************/
     83 #if 1
     84 
     85 /*
     86 ** Local change: the portions of NSPR used by the base module are
     87 ** implementation details.  NSPR symbols do not need to be exported beyond
     88 ** the base module.  For all platforms, avoid decorating functions with
     89 ** specific visibility and access keywords.
     90 */
     91 
     92 #define PR_EXPORT(__type) extern __type
     93 #define PR_EXPORT_DATA(__type) extern __type
     94 #define PR_IMPORT(__type) extern __type
     95 #define PR_IMPORT_DATA(__type) extern __type
     96 
     97 #define PR_EXTERN(__type) extern __type
     98 #define PR_IMPLEMENT(__type) __type
     99 #define PR_EXTERN_DATA(__type) extern __type
    100 #define PR_IMPLEMENT_DATA(__type) __type
    101 
    102 #define PR_CALLBACK
    103 #define PR_CALLBACK_DECL
    104 #define PR_STATIC_CALLBACK(__x) static __x
    105 
    106 #elif defined(WIN32)
    107 
    108 #define PR_EXPORT(__type) extern __declspec(dllexport) __type
    109 #define PR_EXPORT_DATA(__type) extern __declspec(dllexport) __type
    110 #define PR_IMPORT(__type) __declspec(dllimport) __type
    111 #define PR_IMPORT_DATA(__type) __declspec(dllimport) __type
    112 
    113 #define PR_EXTERN(__type) extern __declspec(dllexport) __type
    114 #define PR_IMPLEMENT(__type) __declspec(dllexport) __type
    115 #define PR_EXTERN_DATA(__type) extern __declspec(dllexport) __type
    116 #define PR_IMPLEMENT_DATA(__type) __declspec(dllexport) __type
    117 
    118 #define PR_CALLBACK
    119 #define PR_CALLBACK_DECL
    120 #define PR_STATIC_CALLBACK(__x) static __x
    121 
    122 #elif defined(XP_BEOS)
    123 
    124 #define PR_EXPORT(__type) extern __declspec(dllexport) __type
    125 #define PR_EXPORT_DATA(__type) extern __declspec(dllexport) __type
    126 #define PR_IMPORT(__type) extern __declspec(dllexport) __type
    127 #define PR_IMPORT_DATA(__type) extern __declspec(dllexport) __type
    128 
    129 #define PR_EXTERN(__type) extern __declspec(dllexport) __type
    130 #define PR_IMPLEMENT(__type) __declspec(dllexport) __type
    131 #define PR_EXTERN_DATA(__type) extern __declspec(dllexport) __type
    132 #define PR_IMPLEMENT_DATA(__type) __declspec(dllexport) __type
    133 
    134 #define PR_CALLBACK
    135 #define PR_CALLBACK_DECL
    136 #define PR_STATIC_CALLBACK(__x) static __x
    137 
    138 #elif defined(WIN16)
    139 
    140 #define PR_CALLBACK_DECL        __cdecl
    141 
    142 #if defined(_WINDLL)
    143 #define PR_EXPORT(__type) extern __type _cdecl _export _loadds
    144 #define PR_IMPORT(__type) extern __type _cdecl _export _loadds
    145 #define PR_EXPORT_DATA(__type) extern __type _export
    146 #define PR_IMPORT_DATA(__type) extern __type _export
    147 
    148 #define PR_EXTERN(__type) extern __type _cdecl _export _loadds
    149 #define PR_IMPLEMENT(__type) __type _cdecl _export _loadds
    150 #define PR_EXTERN_DATA(__type) extern __type _export
    151 #define PR_IMPLEMENT_DATA(__type) __type _export
    152 
    153 #define PR_CALLBACK             __cdecl __loadds
    154 #define PR_STATIC_CALLBACK(__x) static __x PR_CALLBACK
    155 
    156 #else /* this must be .EXE */
    157 #define PR_EXPORT(__type) extern __type _cdecl _export
    158 #define PR_IMPORT(__type) extern __type _cdecl _export
    159 #define PR_EXPORT_DATA(__type) extern __type _export
    160 #define PR_IMPORT_DATA(__type) extern __type _export
    161 
    162 #define PR_EXTERN(__type) extern __type _cdecl _export
    163 #define PR_IMPLEMENT(__type) __type _cdecl _export
    164 #define PR_EXTERN_DATA(__type) extern __type _export
    165 #define PR_IMPLEMENT_DATA(__type) __type _export
    166 
    167 #define PR_CALLBACK             __cdecl __loadds
    168 #define PR_STATIC_CALLBACK(__x) __x PR_CALLBACK
    169 #endif /* _WINDLL */
    170 
    171 #elif defined(XP_MAC)
    172 
    173 #define PR_EXPORT(__type) extern __declspec(export) __type
    174 #define PR_EXPORT_DATA(__type) extern __declspec(export) __type
    175 #define PR_IMPORT(__type) extern __declspec(export) __type
    176 #define PR_IMPORT_DATA(__type) extern __declspec(export) __type
    177 
    178 #define PR_EXTERN(__type) extern __declspec(export) __type
    179 #define PR_IMPLEMENT(__type) __declspec(export) __type
    180 #define PR_EXTERN_DATA(__type) extern __declspec(export) __type
    181 #define PR_IMPLEMENT_DATA(__type) __declspec(export) __type
    182 
    183 #define PR_CALLBACK
    184 #define PR_CALLBACK_DECL
    185 #define PR_STATIC_CALLBACK(__x) static __x
    186 
    187 #elif defined(XP_OS2) && defined(__declspec)
    188 
    189 #define PR_EXPORT(__type) extern __declspec(dllexport) __type
    190 #define PR_EXPORT_DATA(__type) extern __declspec(dllexport) __type
    191 #define PR_IMPORT(__type) extern  __declspec(dllimport) __type
    192 #define PR_IMPORT_DATA(__type) extern __declspec(dllimport) __type
    193 
    194 #define PR_EXTERN(__type) extern __declspec(dllexport) __type
    195 #define PR_IMPLEMENT(__type) __declspec(dllexport) __type
    196 #define PR_EXTERN_DATA(__type) extern __declspec(dllexport) __type
    197 #define PR_IMPLEMENT_DATA(__type) __declspec(dllexport) __type
    198 
    199 #define PR_CALLBACK
    200 #define PR_CALLBACK_DECL
    201 #define PR_STATIC_CALLBACK(__x) static __x
    202 
    203 #elif defined(XP_OS2_VACPP)
    204 
    205 #define PR_EXPORT(__type) extern __type
    206 #define PR_EXPORT_DATA(__type) extern __type
    207 #define PR_IMPORT(__type) extern __type
    208 #define PR_IMPORT_DATA(__type) extern __type
    209 
    210 #define PR_EXTERN(__type) extern __type
    211 #define PR_IMPLEMENT(__type) __type
    212 #define PR_EXTERN_DATA(__type) extern __type
    213 #define PR_IMPLEMENT_DATA(__type) __type
    214 #define PR_CALLBACK _Optlink
    215 #define PR_CALLBACK_DECL
    216 #define PR_STATIC_CALLBACK(__x) static __x PR_CALLBACK
    217 
    218 #else /* Unix */
    219 
    220 /* GCC 3.3 and later support the visibility attribute. */
    221 #if (__GNUC__ >= 4) || \
    222     (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
    223 #define PR_VISIBILITY_DEFAULT __attribute__((visibility("default")))
    224 #else
    225 #define PR_VISIBILITY_DEFAULT
    226 #endif
    227 
    228 #define PR_EXPORT(__type) extern PR_VISIBILITY_DEFAULT __type
    229 #define PR_EXPORT_DATA(__type) extern PR_VISIBILITY_DEFAULT __type
    230 #define PR_IMPORT(__type) extern PR_VISIBILITY_DEFAULT __type
    231 #define PR_IMPORT_DATA(__type) extern PR_VISIBILITY_DEFAULT __type
    232 
    233 #define PR_EXTERN(__type) extern PR_VISIBILITY_DEFAULT __type
    234 #define PR_IMPLEMENT(__type) PR_VISIBILITY_DEFAULT __type
    235 #define PR_EXTERN_DATA(__type) extern PR_VISIBILITY_DEFAULT __type
    236 #define PR_IMPLEMENT_DATA(__type) PR_VISIBILITY_DEFAULT __type
    237 #define PR_CALLBACK
    238 #define PR_CALLBACK_DECL
    239 #define PR_STATIC_CALLBACK(__x) static __x
    240 
    241 #endif
    242 
    243 #if defined(_NSPR_BUILD_)
    244 #define NSPR_API(__type) PR_EXPORT(__type)
    245 #define NSPR_DATA_API(__type) PR_EXPORT_DATA(__type)
    246 #else
    247 #define NSPR_API(__type) PR_IMPORT(__type)
    248 #define NSPR_DATA_API(__type) PR_IMPORT_DATA(__type)
    249 #endif
    250 
    251 /***********************************************************************
    252 ** MACROS:      PR_BEGIN_MACRO
    253 **              PR_END_MACRO
    254 ** DESCRIPTION:
    255 **      Macro body brackets so that macros with compound statement definitions
    256 **      behave syntactically more like functions when called.
    257 ***********************************************************************/
    258 #define PR_BEGIN_MACRO  do {
    259 #define PR_END_MACRO    } while (0)
    260 
    261 /***********************************************************************
    262 ** MACROS:      PR_BEGIN_EXTERN_C
    263 **              PR_END_EXTERN_C
    264 ** DESCRIPTION:
    265 **      Macro shorthands for conditional C++ extern block delimiters.
    266 ***********************************************************************/
    267 #ifdef __cplusplus
    268 #define PR_BEGIN_EXTERN_C       extern "C" {
    269 #define PR_END_EXTERN_C         }
    270 #else
    271 #define PR_BEGIN_EXTERN_C
    272 #define PR_END_EXTERN_C
    273 #endif
    274 
    275 /***********************************************************************
    276 ** MACROS:      PR_BIT
    277 **              PR_BITMASK
    278 ** DESCRIPTION:
    279 ** Bit masking macros.  XXX n must be <= 31 to be portable
    280 ***********************************************************************/
    281 #define PR_BIT(n)       ((PRUint32)1 << (n))
    282 #define PR_BITMASK(n)   (PR_BIT(n) - 1)
    283 
    284 /***********************************************************************
    285 ** MACROS:      PR_ROUNDUP
    286 **              PR_MIN
    287 **              PR_MAX
    288 **              PR_ABS
    289 ** DESCRIPTION:
    290 **      Commonly used macros for operations on compatible types.
    291 ***********************************************************************/
    292 #define PR_ROUNDUP(x,y) ((((x)+((y)-1))/(y))*(y))
    293 #define PR_MIN(x,y)     ((x)<(y)?(x):(y))
    294 #define PR_MAX(x,y)     ((x)>(y)?(x):(y))
    295 #define PR_ABS(x)       ((x)<0?-(x):(x))
    296 
    297 PR_BEGIN_EXTERN_C
    298 
    299 /************************************************************************
    300 ** TYPES:       PRUint8
    301 **              PRInt8
    302 ** DESCRIPTION:
    303 **  The int8 types are known to be 8 bits each. There is no type that
    304 **      is equivalent to a plain "char".
    305 ************************************************************************/
    306 #if PR_BYTES_PER_BYTE == 1
    307 typedef unsigned char PRUint8;
    308 /*
    309 ** Some cfront-based C++ compilers do not like 'signed char' and
    310 ** issue the warning message:
    311 **     warning: "signed" not implemented (ignored)
    312 ** For these compilers, we have to define PRInt8 as plain 'char'.
    313 ** Make sure that plain 'char' is indeed signed under these compilers.
    314 */
    315 #if (defined(HPUX) && defined(__cplusplus) \
    316         && !defined(__GNUC__) && __cplusplus < 199707L) \
    317     || (defined(SCO) && defined(__cplusplus) \
    318         && !defined(__GNUC__) && __cplusplus == 1L)
    319 typedef char PRInt8;
    320 #else
    321 typedef signed char PRInt8;
    322 #endif
    323 #else
    324 #error No suitable type for PRInt8/PRUint8
    325 #endif
    326 
    327 /************************************************************************
    328  * MACROS:      PR_INT8_MAX
    329  *              PR_INT8_MIN
    330  *              PR_UINT8_MAX
    331  * DESCRIPTION:
    332  *  The maximum and minimum values of a PRInt8 or PRUint8.
    333 ************************************************************************/
    334 
    335 #define PR_INT8_MAX 127
    336 #define PR_INT8_MIN (-128)
    337 #define PR_UINT8_MAX 255U
    338 
    339 /************************************************************************
    340 ** TYPES:       PRUint16
    341 **              PRInt16
    342 ** DESCRIPTION:
    343 **  The int16 types are known to be 16 bits each.
    344 ************************************************************************/
    345 #if PR_BYTES_PER_SHORT == 2
    346 typedef unsigned short PRUint16;
    347 typedef short PRInt16;
    348 #else
    349 #error No suitable type for PRInt16/PRUint16
    350 #endif
    351 
    352 /************************************************************************
    353  * MACROS:      PR_INT16_MAX
    354  *              PR_INT16_MIN
    355  *              PR_UINT16_MAX
    356  * DESCRIPTION:
    357  *  The maximum and minimum values of a PRInt16 or PRUint16.
    358 ************************************************************************/
    359 
    360 #define PR_INT16_MAX 32767
    361 #define PR_INT16_MIN (-32768)
    362 #define PR_UINT16_MAX 65535U
    363 
    364 /************************************************************************
    365 ** TYPES:       PRUint32
    366 **              PRInt32
    367 ** DESCRIPTION:
    368 **  The int32 types are known to be 32 bits each.
    369 ************************************************************************/
    370 #if PR_BYTES_PER_INT == 4
    371 typedef unsigned int PRUint32;
    372 typedef int PRInt32;
    373 #define PR_INT32(x)  x
    374 #define PR_UINT32(x) x ## U
    375 #elif PR_BYTES_PER_LONG == 4
    376 typedef unsigned long PRUint32;
    377 typedef long PRInt32;
    378 #define PR_INT32(x)  x ## L
    379 #define PR_UINT32(x) x ## UL
    380 #else
    381 #error No suitable type for PRInt32/PRUint32
    382 #endif
    383 
    384 /************************************************************************
    385  * MACROS:      PR_INT32_MAX
    386  *              PR_INT32_MIN
    387  *              PR_UINT32_MAX
    388  * DESCRIPTION:
    389  *  The maximum and minimum values of a PRInt32 or PRUint32.
    390 ************************************************************************/
    391 
    392 #define PR_INT32_MAX PR_INT32(2147483647)
    393 #define PR_INT32_MIN (-PR_INT32_MAX - 1)
    394 #define PR_UINT32_MAX PR_UINT32(4294967295)
    395 
    396 /************************************************************************
    397 ** TYPES:       PRUint64
    398 **              PRInt64
    399 ** DESCRIPTION:
    400 **  The int64 types are known to be 64 bits each. Care must be used when
    401 **      declaring variables of type PRUint64 or PRInt64. Different hardware
    402 **      architectures and even different compilers have varying support for
    403 **      64 bit values. The only guaranteed portability requires the use of
    404 **      the LL_ macros (see prlong.h).
    405 ************************************************************************/
    406 #ifdef HAVE_LONG_LONG
    407 #if PR_BYTES_PER_LONG == 8
    408 typedef long PRInt64;
    409 typedef unsigned long PRUint64;
    410 #elif defined(WIN16)
    411 typedef __int64 PRInt64;
    412 typedef unsigned __int64 PRUint64;
    413 #elif defined(WIN32) && !defined(__GNUC__)
    414 typedef __int64  PRInt64;
    415 typedef unsigned __int64 PRUint64;
    416 #else
    417 typedef long long PRInt64;
    418 typedef unsigned long long PRUint64;
    419 #endif /* PR_BYTES_PER_LONG == 8 */
    420 #else  /* !HAVE_LONG_LONG */
    421 typedef struct {
    422 #ifdef IS_LITTLE_ENDIAN
    423     PRUint32 lo, hi;
    424 #else
    425     PRUint32 hi, lo;
    426 #endif
    427 } PRInt64;
    428 typedef PRInt64 PRUint64;
    429 #endif /* !HAVE_LONG_LONG */
    430 
    431 /************************************************************************
    432 ** TYPES:       PRUintn
    433 **              PRIntn
    434 ** DESCRIPTION:
    435 **  The PRIntn types are most appropriate for automatic variables. They are
    436 **      guaranteed to be at least 16 bits, though various architectures may
    437 **      define them to be wider (e.g., 32 or even 64 bits). These types are
    438 **      never valid for fields of a structure.
    439 ************************************************************************/
    440 #if PR_BYTES_PER_INT >= 2
    441 typedef int PRIntn;
    442 typedef unsigned int PRUintn;
    443 #else
    444 #error 'sizeof(int)' not sufficient for platform use
    445 #endif
    446 
    447 /************************************************************************
    448 ** TYPES:       PRFloat64
    449 ** DESCRIPTION:
    450 **  NSPR's floating point type is always 64 bits.
    451 ************************************************************************/
    452 typedef double          PRFloat64;
    453 
    454 /************************************************************************
    455 ** TYPES:       PRSize
    456 ** DESCRIPTION:
    457 **  A type for representing the size of objects.
    458 ************************************************************************/
    459 typedef size_t PRSize;
    460 
    461 
    462 /************************************************************************
    463 ** TYPES:       PROffset32, PROffset64
    464 ** DESCRIPTION:
    465 **  A type for representing byte offsets from some location.
    466 ************************************************************************/
    467 typedef PRInt32 PROffset32;
    468 typedef PRInt64 PROffset64;
    469 
    470 /************************************************************************
    471 ** TYPES:       PRPtrDiff
    472 ** DESCRIPTION:
    473 **  A type for pointer difference. Variables of this type are suitable
    474 **      for storing a pointer or pointer subtraction.
    475 ************************************************************************/
    476 typedef ptrdiff_t PRPtrdiff;
    477 
    478 /************************************************************************
    479 ** TYPES:       PRUptrdiff
    480 ** DESCRIPTION:
    481 **  A type for pointer difference. Variables of this type are suitable
    482 **      for storing a pointer or pointer sutraction.
    483 ************************************************************************/
    484 #ifdef _WIN64
    485 typedef unsigned __int64 PRUptrdiff;
    486 #else
    487 typedef unsigned long PRUptrdiff;
    488 #endif
    489 
    490 /************************************************************************
    491 ** TYPES:       PRBool
    492 ** DESCRIPTION:
    493 **  Use PRBool for variables and parameter types. Use PR_FALSE and PR_TRUE
    494 **      for clarity of target type in assignments and actual arguments. Use
    495 **      'if (bool)', 'while (!bool)', '(bool) ? x : y' etc., to test booleans
    496 **      just as you would C int-valued conditions.
    497 ************************************************************************/
    498 typedef PRIntn PRBool;
    499 #define PR_TRUE 1
    500 #define PR_FALSE 0
    501 
    502 /************************************************************************
    503 ** TYPES:       PRPackedBool
    504 ** DESCRIPTION:
    505 **  Use PRPackedBool within structs where bitfields are not desirable
    506 **      but minimum and consistant overhead matters.
    507 ************************************************************************/
    508 typedef PRUint8 PRPackedBool;
    509 
    510 /*
    511 ** Status code used by some routines that have a single point of failure or
    512 ** special status return.
    513 */
    514 typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus;
    515 
    516 #ifndef __PRUNICHAR__
    517 #define __PRUNICHAR__
    518 #if defined(WIN32) || defined(XP_MAC)
    519 typedef wchar_t PRUnichar;
    520 #else
    521 typedef PRUint16 PRUnichar;
    522 #endif
    523 #endif
    524 
    525 /*
    526 ** WARNING: The undocumented data types PRWord and PRUword are
    527 ** only used in the garbage collection and arena code.  Do not
    528 ** use PRWord and PRUword in new code.
    529 **
    530 ** A PRWord is an integer that is the same size as a void*.
    531 ** It implements the notion of a "word" in the Java Virtual
    532 ** Machine.  (See Sec. 3.4 "Words", The Java Virtual Machine
    533 ** Specification, Addison-Wesley, September 1996.
    534 ** http://java.sun.com/docs/books/vmspec/index.html.)
    535 */
    536 #ifdef _WIN64
    537 typedef __int64 PRWord;
    538 typedef unsigned __int64 PRUword;
    539 #else
    540 typedef long PRWord;
    541 typedef unsigned long PRUword;
    542 #endif
    543 
    544 #if defined(NO_NSPR_10_SUPPORT)
    545 #else
    546 /********* ???????????????? FIX ME       ??????????????????????????? *****/
    547 /********************** Some old definitions until pr=>ds transition is done ***/
    548 /********************** Also, we are still using NSPR 1.0. GC ******************/
    549 /*
    550 ** Fundamental NSPR macros, used nearly everywhere.
    551 */
    552 
    553 #define PR_PUBLIC_API		PR_IMPLEMENT
    554 
    555 /*
    556 ** Macro body brackets so that macros with compound statement definitions
    557 ** behave syntactically more like functions when called.
    558 */
    559 #define NSPR_BEGIN_MACRO        do {
    560 #define NSPR_END_MACRO          } while (0)
    561 
    562 /*
    563 ** Macro shorthands for conditional C++ extern block delimiters.
    564 */
    565 #ifdef NSPR_BEGIN_EXTERN_C
    566 #undef NSPR_BEGIN_EXTERN_C
    567 #endif
    568 #ifdef NSPR_END_EXTERN_C
    569 #undef NSPR_END_EXTERN_C
    570 #endif
    571 
    572 #ifdef __cplusplus
    573 #define NSPR_BEGIN_EXTERN_C     extern "C" {
    574 #define NSPR_END_EXTERN_C       }
    575 #else
    576 #define NSPR_BEGIN_EXTERN_C
    577 #define NSPR_END_EXTERN_C
    578 #endif
    579 
    580 /********* ????????????? End Fix me ?????????????????????????????? *****/
    581 #endif /* NO_NSPR_10_SUPPORT */
    582 
    583 PR_END_EXTERN_C
    584 
    585 #if !defined(NO_NSPR_10_SUPPORT)
    586 #include "base/basictypes.h"
    587 #endif
    588 
    589 #endif /* prtypes_h___ */
    590 
    591