1169699Skan/* Copyright (C) 1989, 1997, 1998, 1999, 2000, 2002, 2004
2169699Skan   Free Software Foundation, Inc.
390292Sobrien
4132727SkanThis file is part of GCC.
590292Sobrien
6132727SkanGCC is free software; you can redistribute it and/or modify
790292Sobrienit under the terms of the GNU General Public License as published by
890292Sobrienthe Free Software Foundation; either version 2, or (at your option)
990292Sobrienany later version.
1090292Sobrien
11132727SkanGCC is distributed in the hope that it will be useful,
1290292Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1390292SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1490292SobrienGNU General Public License for more details.
1590292Sobrien
1690292SobrienYou should have received a copy of the GNU General Public License
17132727Skanalong with GCC; see the file COPYING.  If not, write to
18169699Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
19169699SkanBoston, MA 02110-1301, USA.  */
2090292Sobrien
2190292Sobrien/* As a special exception, if you include this header file into source
2290292Sobrien   files compiled by GCC, this header file does not by itself cause
2390292Sobrien   the resulting executable to be covered by the GNU General Public
2490292Sobrien   License.  This exception does not however invalidate any other
2590292Sobrien   reasons why the executable file might be covered by the GNU General
2690292Sobrien   Public License.  */
2790292Sobrien
2890292Sobrien/*
2990292Sobrien * ISO C Standard:  7.17  Common definitions  <stddef.h>
3090292Sobrien */
3152212Sobrien#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \
3252212Sobrien     && !defined(__STDDEF_H__)) \
3352212Sobrien    || defined(__need_wchar_t) || defined(__need_size_t) \
3452212Sobrien    || defined(__need_ptrdiff_t) || defined(__need_NULL) \
3552212Sobrien    || defined(__need_wint_t)
3652212Sobrien
3718334Speter/* Any one of these symbols __need_* means that GNU libc
3818334Speter   wants us just to define one data type.  So don't define
3918334Speter   the symbols that indicate this file's entire job has been done.  */
4018334Speter#if (!defined(__need_wchar_t) && !defined(__need_size_t)	\
4152212Sobrien     && !defined(__need_ptrdiff_t) && !defined(__need_NULL)	\
4252212Sobrien     && !defined(__need_wint_t))
4318334Speter#define _STDDEF_H
4418334Speter#define _STDDEF_H_
4518334Speter/* snaroff@next.com says the NeXT needs this.  */
4618334Speter#define _ANSI_STDDEF_H
4718334Speter/* Irix 5.1 needs this.  */
4818334Speter#define __STDDEF_H__
4918334Speter#endif
5018334Speter
5118334Speter#ifndef __sys_stdtypes_h
5218334Speter/* This avoids lossage on SunOS but only if stdtypes.h comes first.
5318334Speter   There's no way to win with the other order!  Sun lossage.  */
5418334Speter
5518334Speter/* On 4.3bsd-net2, make sure ansi.h is included, so we have
5618334Speter   one less case to deal with in the following.  */
57110621Skan#if defined (__BSD_NET2__) || defined (____386BSD____) || (defined (__FreeBSD__) && (__FreeBSD__ < 5)) || defined(__NetBSD__)
5818334Speter#include <machine/ansi.h>
5918334Speter#endif
60110621Skan/* On FreeBSD 5, machine/ansi.h does not exist anymore... */
61110621Skan#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
62110621Skan#include <sys/_types.h>
63110621Skan#endif
6418334Speter
6518334Speter/* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are
6618334Speter   defined if the corresponding type is *not* defined.
6718334Speter   FreeBSD-2.1 defines _MACHINE_ANSI_H_ instead of _ANSI_H_ */
6818334Speter#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_)
6918334Speter#if !defined(_SIZE_T_) && !defined(_BSD_SIZE_T_)
7018334Speter#define _SIZE_T
7118334Speter#endif
7218334Speter#if !defined(_PTRDIFF_T_) && !defined(_BSD_PTRDIFF_T_)
7318334Speter#define _PTRDIFF_T
7418334Speter#endif
7518334Speter/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_
7618334Speter   instead of _WCHAR_T_. */
7718334Speter#if !defined(_WCHAR_T_) && !defined(_BSD_WCHAR_T_)
7818334Speter#ifndef _BSD_WCHAR_T_
7918334Speter#define _WCHAR_T
8018334Speter#endif
8118334Speter#endif
8218334Speter/* Undef _FOO_T_ if we are supposed to define foo_t.  */
8318334Speter#if defined (__need_ptrdiff_t) || defined (_STDDEF_H_)
8418334Speter#undef _PTRDIFF_T_
8518334Speter#undef _BSD_PTRDIFF_T_
8618334Speter#endif
8718334Speter#if defined (__need_size_t) || defined (_STDDEF_H_)
8818334Speter#undef _SIZE_T_
8918334Speter#undef _BSD_SIZE_T_
9018334Speter#endif
9118334Speter#if defined (__need_wchar_t) || defined (_STDDEF_H_)
9218334Speter#undef _WCHAR_T_
9318334Speter#undef _BSD_WCHAR_T_
9418334Speter#endif
9518334Speter#endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) */
9618334Speter
9718334Speter/* Sequent's header files use _PTRDIFF_T_ in some conflicting way.
9818334Speter   Just ignore it.  */
9918334Speter#if defined (__sequent__) && defined (_PTRDIFF_T_)
10018334Speter#undef _PTRDIFF_T_
10118334Speter#endif
10218334Speter
10318334Speter/* On VxWorks, <type/vxTypesBase.h> may have defined macros like
10418334Speter   _TYPE_size_t which will typedef size_t.  fixincludes patched the
10518334Speter   vxTypesBase.h so that this macro is only defined if _GCC_SIZE_T is
10618334Speter   not defined, and so that defining this macro defines _GCC_SIZE_T.
10718334Speter   If we find that the macros are still defined at this point, we must
10818334Speter   invoke them so that the type is defined as expected.  */
10952212Sobrien#if defined (_TYPE_ptrdiff_t) && (defined (__need_ptrdiff_t) || defined (_STDDEF_H_))
11018334Speter_TYPE_ptrdiff_t;
11118334Speter#undef _TYPE_ptrdiff_t
11218334Speter#endif
11318334Speter#if defined (_TYPE_size_t) && (defined (__need_size_t) || defined (_STDDEF_H_))
11418334Speter_TYPE_size_t;
11518334Speter#undef _TYPE_size_t
11618334Speter#endif
11718334Speter#if defined (_TYPE_wchar_t) && (defined (__need_wchar_t) || defined (_STDDEF_H_))
11818334Speter_TYPE_wchar_t;
11918334Speter#undef _TYPE_wchar_t
12018334Speter#endif
12118334Speter
12218334Speter/* In case nobody has defined these types, but we aren't running under
12390292Sobrien   GCC 2.00, make sure that __PTRDIFF_TYPE__, __SIZE_TYPE__, and
12418334Speter   __WCHAR_TYPE__ have reasonable values.  This can happen if the
12518334Speter   parts of GCC is compiled by an older compiler, that actually
12618334Speter   include gstddef.h, such as collect2.  */
12718334Speter
12818334Speter/* Signed type of difference of two pointers.  */
12918334Speter
13018334Speter/* Define this type if we are doing the whole job,
13118334Speter   or if we want this type in particular.  */
13218334Speter#if defined (_STDDEF_H) || defined (__need_ptrdiff_t)
13318334Speter#ifndef _PTRDIFF_T	/* in case <sys/types.h> has defined it. */
13418334Speter#ifndef _T_PTRDIFF_
13518334Speter#ifndef _T_PTRDIFF
13618334Speter#ifndef __PTRDIFF_T
13718334Speter#ifndef _PTRDIFF_T_
13818334Speter#ifndef _BSD_PTRDIFF_T_
13918334Speter#ifndef ___int_ptrdiff_t_h
14018334Speter#ifndef _GCC_PTRDIFF_T
14118334Speter#define _PTRDIFF_T
14218334Speter#define _T_PTRDIFF_
14318334Speter#define _T_PTRDIFF
14418334Speter#define __PTRDIFF_T
14518334Speter#define _PTRDIFF_T_
14618334Speter#define _BSD_PTRDIFF_T_
14718334Speter#define ___int_ptrdiff_t_h
14818334Speter#define _GCC_PTRDIFF_T
14918334Speter#ifndef __PTRDIFF_TYPE__
15018334Speter#define __PTRDIFF_TYPE__ long int
15118334Speter#endif
15218334Spetertypedef __PTRDIFF_TYPE__ ptrdiff_t;
15318334Speter#endif /* _GCC_PTRDIFF_T */
15418334Speter#endif /* ___int_ptrdiff_t_h */
15518334Speter#endif /* _BSD_PTRDIFF_T_ */
15618334Speter#endif /* _PTRDIFF_T_ */
15718334Speter#endif /* __PTRDIFF_T */
15818334Speter#endif /* _T_PTRDIFF */
15918334Speter#endif /* _T_PTRDIFF_ */
16018334Speter#endif /* _PTRDIFF_T */
16118334Speter
16218334Speter/* If this symbol has done its job, get rid of it.  */
16318334Speter#undef	__need_ptrdiff_t
16418334Speter
16518334Speter#endif /* _STDDEF_H or __need_ptrdiff_t.  */
16618334Speter
16718334Speter/* Unsigned type of `sizeof' something.  */
16818334Speter
16918334Speter/* Define this type if we are doing the whole job,
17018334Speter   or if we want this type in particular.  */
17118334Speter#if defined (_STDDEF_H) || defined (__need_size_t)
17252212Sobrien#ifndef __size_t__	/* BeOS */
17390292Sobrien#ifndef __SIZE_T__	/* Cray Unicos/Mk */
17418334Speter#ifndef _SIZE_T	/* in case <sys/types.h> has defined it. */
17518334Speter#ifndef _SYS_SIZE_T_H
17618334Speter#ifndef _T_SIZE_
17718334Speter#ifndef _T_SIZE
17818334Speter#ifndef __SIZE_T
17918334Speter#ifndef _SIZE_T_
18018334Speter#ifndef _BSD_SIZE_T_
18118334Speter#ifndef _SIZE_T_DEFINED_
18218334Speter#ifndef _SIZE_T_DEFINED
183110621Skan#ifndef _BSD_SIZE_T_DEFINED_	/* Darwin */
184110621Skan#ifndef _SIZE_T_DECLARED	/* FreeBSD 5 */
18518334Speter#ifndef ___int_size_t_h
18618334Speter#ifndef _GCC_SIZE_T
18718334Speter#ifndef _SIZET_
18818334Speter#ifndef __size_t
18952212Sobrien#define __size_t__	/* BeOS */
19090292Sobrien#define __SIZE_T__	/* Cray Unicos/Mk */
19118334Speter#define _SIZE_T
19218334Speter#define _SYS_SIZE_T_H
19318334Speter#define _T_SIZE_
19418334Speter#define _T_SIZE
19518334Speter#define __SIZE_T
19618334Speter#define _SIZE_T_
19718334Speter#define _BSD_SIZE_T_
19818334Speter#define _SIZE_T_DEFINED_
19918334Speter#define _SIZE_T_DEFINED
200110621Skan#define _BSD_SIZE_T_DEFINED_	/* Darwin */
201110621Skan#define _SIZE_T_DECLARED	/* FreeBSD 5 */
20218334Speter#define ___int_size_t_h
20318334Speter#define _GCC_SIZE_T
20418334Speter#define _SIZET_
205110621Skan#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
206110621Skan/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
207110621Skan#else
20818334Speter#define __size_t
209110621Skan#endif
21018334Speter#ifndef __SIZE_TYPE__
21118334Speter#define __SIZE_TYPE__ long unsigned int
21218334Speter#endif
21318334Speter#if !(defined (__GNUG__) && defined (size_t))
21418334Spetertypedef __SIZE_TYPE__ size_t;
21552212Sobrien#ifdef __BEOS__
21652212Sobrientypedef long ssize_t;
21752212Sobrien#endif /* __BEOS__ */
21818334Speter#endif /* !(defined (__GNUG__) && defined (size_t)) */
21918334Speter#endif /* __size_t */
22018334Speter#endif /* _SIZET_ */
22118334Speter#endif /* _GCC_SIZE_T */
22218334Speter#endif /* ___int_size_t_h */
223110621Skan#endif /* _SIZE_T_DECLARED */
224110621Skan#endif /* _BSD_SIZE_T_DEFINED_ */
22518334Speter#endif /* _SIZE_T_DEFINED */
22618334Speter#endif /* _SIZE_T_DEFINED_ */
22718334Speter#endif /* _BSD_SIZE_T_ */
22818334Speter#endif /* _SIZE_T_ */
22918334Speter#endif /* __SIZE_T */
23018334Speter#endif /* _T_SIZE */
23118334Speter#endif /* _T_SIZE_ */
23218334Speter#endif /* _SYS_SIZE_T_H */
23318334Speter#endif /* _SIZE_T */
23490292Sobrien#endif /* __SIZE_T__ */
23552212Sobrien#endif /* __size_t__ */
23618334Speter#undef	__need_size_t
23718334Speter#endif /* _STDDEF_H or __need_size_t.  */
23818334Speter
23918334Speter
24018334Speter/* Wide character type.
24118334Speter   Locale-writers should change this as necessary to
24218334Speter   be big enough to hold unique values not between 0 and 127,
24318334Speter   and not (wchar_t) -1, for each defined multibyte character.  */
24418334Speter
24518334Speter/* Define this type if we are doing the whole job,
24618334Speter   or if we want this type in particular.  */
24718334Speter#if defined (_STDDEF_H) || defined (__need_wchar_t)
24852212Sobrien#ifndef __wchar_t__	/* BeOS */
24990292Sobrien#ifndef __WCHAR_T__	/* Cray Unicos/Mk */
25018334Speter#ifndef _WCHAR_T
25118334Speter#ifndef _T_WCHAR_
25218334Speter#ifndef _T_WCHAR
25318334Speter#ifndef __WCHAR_T
25418334Speter#ifndef _WCHAR_T_
25518334Speter#ifndef _BSD_WCHAR_T_
25690292Sobrien#ifndef _BSD_WCHAR_T_DEFINED_    /* Darwin */
257110621Skan#ifndef _BSD_RUNE_T_DEFINED_	/* Darwin */
258110621Skan#ifndef _WCHAR_T_DECLARED /* FreeBSD 5 */
25918334Speter#ifndef _WCHAR_T_DEFINED_
26018334Speter#ifndef _WCHAR_T_DEFINED
26118334Speter#ifndef _WCHAR_T_H
26218334Speter#ifndef ___int_wchar_t_h
26318334Speter#ifndef __INT_WCHAR_T_H
26418334Speter#ifndef _GCC_WCHAR_T
26552212Sobrien#define __wchar_t__	/* BeOS */
26690292Sobrien#define __WCHAR_T__	/* Cray Unicos/Mk */
26718334Speter#define _WCHAR_T
26818334Speter#define _T_WCHAR_
26918334Speter#define _T_WCHAR
27018334Speter#define __WCHAR_T
27118334Speter#define _WCHAR_T_
27218334Speter#define _BSD_WCHAR_T_
27318334Speter#define _WCHAR_T_DEFINED_
27418334Speter#define _WCHAR_T_DEFINED
27518334Speter#define _WCHAR_T_H
27618334Speter#define ___int_wchar_t_h
27718334Speter#define __INT_WCHAR_T_H
27818334Speter#define _GCC_WCHAR_T
279110621Skan#define _WCHAR_T_DECLARED
28018334Speter
28118334Speter/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_
28218334Speter   instead of _WCHAR_T_, and _BSD_RUNE_T_ (which, unlike the other
28318334Speter   symbols in the _FOO_T_ family, stays defined even after its
28418334Speter   corresponding type is defined).  If we define wchar_t, then we
28518334Speter   must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if
28618334Speter   we undef _WCHAR_T_, then we must also define rune_t, since
28718334Speter   headers like runetype.h assume that if machine/ansi.h is included,
28818334Speter   and _BSD_WCHAR_T_ is not defined, then rune_t is available.
28918334Speter   machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of
29018334Speter   the same type." */
29118334Speter#ifdef _BSD_WCHAR_T_
29218334Speter#undef _BSD_WCHAR_T_
29318334Speter#ifdef _BSD_RUNE_T_
29418334Speter#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE)
29518334Spetertypedef _BSD_RUNE_T_ rune_t;
29690292Sobrien#define _BSD_WCHAR_T_DEFINED_
297110621Skan#define _BSD_RUNE_T_DEFINED_	/* Darwin */
298110621Skan#if defined (__FreeBSD__) && (__FreeBSD__ < 5)
299169699Skan/* Why is this file so hard to maintain properly?  In contrast to
30090292Sobrien   the comment above regarding BSD/386 1.1, on FreeBSD for as long
30190292Sobrien   as the symbol has existed, _BSD_RUNE_T_ must not stay defined or
30290292Sobrien   redundant typedefs will occur when stdlib.h is included after this file. */
30390292Sobrien#undef _BSD_RUNE_T_
30418334Speter#endif
30518334Speter#endif
30618334Speter#endif
30790292Sobrien#endif
308110621Skan/* FreeBSD 5 can't be handled well using "traditional" logic above
309110621Skan   since it no longer defines _BSD_RUNE_T_ yet still desires to export
310110621Skan   rune_t in some cases... */
311110621Skan#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
312110621Skan#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE)
313110621Skan#if __BSD_VISIBLE
314110621Skan#ifndef _RUNE_T_DECLARED
315110621Skantypedef __rune_t        rune_t;
316110621Skan#define _RUNE_T_DECLARED
317110621Skan#endif
318110621Skan#endif
319110621Skan#endif
320110621Skan#endif
32118334Speter
32218334Speter#ifndef __WCHAR_TYPE__
32318334Speter#define __WCHAR_TYPE__ int
32418334Speter#endif
32518334Speter#ifndef __cplusplus
32618334Spetertypedef __WCHAR_TYPE__ wchar_t;
32718334Speter#endif
32818334Speter#endif
32918334Speter#endif
33018334Speter#endif
33118334Speter#endif
33218334Speter#endif
33318334Speter#endif
334110621Skan#endif /* _WCHAR_T_DECLARED */
335110621Skan#endif /* _BSD_RUNE_T_DEFINED_ */
33618334Speter#endif
33718334Speter#endif
33818334Speter#endif
33918334Speter#endif
34018334Speter#endif
34118334Speter#endif
34290292Sobrien#endif
34390292Sobrien#endif /* __WCHAR_T__ */
34452212Sobrien#endif /* __wchar_t__ */
34518334Speter#undef	__need_wchar_t
34618334Speter#endif /* _STDDEF_H or __need_wchar_t.  */
34718334Speter
34890292Sobrien#if defined (__need_wint_t)
34952212Sobrien#ifndef _WINT_T
35052212Sobrien#define _WINT_T
35152212Sobrien
35252212Sobrien#ifndef __WINT_TYPE__
35352212Sobrien#define __WINT_TYPE__ unsigned int
35452212Sobrien#endif
35552212Sobrientypedef __WINT_TYPE__ wint_t;
35652212Sobrien#endif
35752212Sobrien#undef __need_wint_t
35852212Sobrien#endif
35952212Sobrien
36018334Speter/*  In 4.3bsd-net2, leave these undefined to indicate that size_t, etc.
36118334Speter    are already defined.  */
36290292Sobrien/*  BSD/OS 3.1 and FreeBSD [23].x require the MACHINE_ANSI_H check here.  */
36390292Sobrien#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_)
36418334Speter/*  The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_
36518334Speter    are probably typos and should be removed before 2.8 is released.  */
36618334Speter#ifdef _GCC_PTRDIFF_T_
36718334Speter#undef _PTRDIFF_T_
36818334Speter#undef _BSD_PTRDIFF_T_
36918334Speter#endif
37018334Speter#ifdef _GCC_SIZE_T_
37118334Speter#undef _SIZE_T_
37218334Speter#undef _BSD_SIZE_T_
37318334Speter#endif
37418334Speter#ifdef _GCC_WCHAR_T_
37518334Speter#undef _WCHAR_T_
37618334Speter#undef _BSD_WCHAR_T_
37718334Speter#endif
37818334Speter/*  The following ones are the real ones.  */
37918334Speter#ifdef _GCC_PTRDIFF_T
38018334Speter#undef _PTRDIFF_T_
38118334Speter#undef _BSD_PTRDIFF_T_
38218334Speter#endif
38318334Speter#ifdef _GCC_SIZE_T
38418334Speter#undef _SIZE_T_
38518334Speter#undef _BSD_SIZE_T_
38618334Speter#endif
38718334Speter#ifdef _GCC_WCHAR_T
38818334Speter#undef _WCHAR_T_
38918334Speter#undef _BSD_WCHAR_T_
39018334Speter#endif
39190292Sobrien#endif /* _ANSI_H_ || _MACHINE_ANSI_H_ */
39218334Speter
39318334Speter#endif /* __sys_stdtypes_h */
39418334Speter
39518334Speter/* A null pointer constant.  */
39618334Speter
39718334Speter#if defined (_STDDEF_H) || defined (__need_NULL)
39818334Speter#undef NULL		/* in case <stdio.h> has defined it. */
39952212Sobrien#ifdef __GNUG__
40052212Sobrien#define NULL __null
40152212Sobrien#else   /* G++ */
40290292Sobrien#ifndef __cplusplus
40318334Speter#define NULL ((void *)0)
40490292Sobrien#else   /* C++ */
40590292Sobrien#define NULL 0
40690292Sobrien#endif  /* C++ */
40752212Sobrien#endif  /* G++ */
40818334Speter#endif	/* NULL not defined and <stddef.h> or need NULL.  */
40918334Speter#undef	__need_NULL
41018334Speter
41118334Speter#ifdef _STDDEF_H
41218334Speter
413132727Skan/* Offset of member MEMBER in a struct of type TYPE. */
414169699Skan#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
415169699Skan
41618334Speter#endif /* _STDDEF_H was defined this time */
41718334Speter
41852212Sobrien#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__
41952212Sobrien	  || __need_XXX was not defined before */
420