• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
232 PR_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
242 typedef 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)
254 typedef char PRInt8;
255 #else
256 typedef 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
281 typedef unsigned short PRUint16;
282 typedef 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
306 typedef unsigned int PRUint32;
307 typedef int PRInt32;
308 #define PR_INT32(x)  x
309 #define PR_UINT32(x) x ## U
310 #elif PR_BYTES_PER_LONG == 4
311 typedef unsigned long PRUint32;
312 typedef 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
343 typedef long PRInt64;
344 typedef unsigned long PRUint64;
345 #elif defined(WIN16)
346 typedef __int64 PRInt64;
347 typedef unsigned __int64 PRUint64;
348 #elif defined(WIN32) && !defined(__GNUC__)
349 typedef __int64  PRInt64;
350 typedef unsigned __int64 PRUint64;
351 #else
352 typedef long long PRInt64;
353 typedef unsigned long long PRUint64;
354 #endif /* PR_BYTES_PER_LONG == 8 */
355 #else  /* !HAVE_LONG_LONG */
356 typedef struct {
357 #ifdef IS_LITTLE_ENDIAN
358     PRUint32 lo, hi;
359 #else
360     PRUint32 hi, lo;
361 #endif
362 } PRInt64;
363 typedef 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
376 typedef int PRIntn;
377 typedef 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 ************************************************************************/
387 typedef double          PRFloat64;
388 
389 /************************************************************************
390 ** TYPES:       PRSize
391 ** DESCRIPTION:
392 **  A type for representing the size of objects.
393 ************************************************************************/
394 typedef size_t PRSize;
395 
396 
397 /************************************************************************
398 ** TYPES:       PROffset32, PROffset64
399 ** DESCRIPTION:
400 **  A type for representing byte offsets from some location.
401 ************************************************************************/
402 typedef PRInt32 PROffset32;
403 typedef 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 ************************************************************************/
411 typedef 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 ************************************************************************/
419 typedef 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 ************************************************************************/
429 typedef 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 ************************************************************************/
439 typedef PRUint8 PRPackedBool;
440 
441 /*
442 ** Status code used by some routines that have a single point of failure or
443 ** special status return.
444 */
445 typedef 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)
454 typedef wchar_t PRUnichar;
455 #else
456 typedef 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 */
472 typedef long PRWord;
473 typedef 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 
520 PR_END_EXTERN_C
521 
522 #endif /* prtypes_h___ */
523 
524