• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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