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