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