diff options
Diffstat (limited to 'posix/bits/types.h')
-rw-r--r-- | posix/bits/types.h | 204 |
1 files changed, 78 insertions, 126 deletions
diff --git a/posix/bits/types.h b/posix/bits/types.h index 7509faa79c..dc59505840 100644 --- a/posix/bits/types.h +++ b/posix/bits/types.h @@ -27,12 +27,6 @@ #include <bits/wordsize.h> #include <bits/timesize.h> -/* Convenience types. */ -typedef unsigned char __u_char; -typedef unsigned short int __u_short; -typedef unsigned int __u_int; -typedef unsigned long int __u_long; - /* Fixed-size types, underlying types depend on word size and compiler. */ typedef signed char __int8_t; typedef unsigned char __uint8_t; @@ -43,9 +37,11 @@ typedef unsigned int __uint32_t; #if __WORDSIZE == 64 typedef signed long int __int64_t; typedef unsigned long int __uint64_t; -#else +#elif __WORDSIZE == 32 __extension__ typedef signed long long int __int64_t; __extension__ typedef unsigned long long int __uint64_t; +#else +# error "Unsupported value for __WORDSIZE" #endif /* Smallest types with at least a given width. */ @@ -58,24 +54,9 @@ typedef __uint32_t __uint_least32_t; typedef __int64_t __int_least64_t; typedef __uint64_t __uint_least64_t; -/* quad_t is also 64 bits. */ -#if __WORDSIZE == 64 -typedef long int __quad_t; -typedef unsigned long int __u_quad_t; -#else -__extension__ typedef long long int __quad_t; -__extension__ typedef unsigned long long int __u_quad_t; -#endif - /* Largest integral types. */ -#if __WORDSIZE == 64 -typedef long int __intmax_t; -typedef unsigned long int __uintmax_t; -#else -__extension__ typedef long long int __intmax_t; -__extension__ typedef unsigned long long int __uintmax_t; -#endif - +typedef __int64_t __intmax_t; +typedef __uint64_t __uintmax_t; /* The machine-dependent file <bits/typesizes.h> defines __*_T_TYPE macros for each of the OS types we define below. The definitions @@ -87,136 +68,107 @@ __extension__ typedef unsigned long long int __uintmax_t; 32 -- "natural" 32-bit type (always int) 64 -- "natural" 64-bit type (long or long long) LONG32 -- 32-bit type, traditionally long - QUAD -- 64-bit type, traditionally long long WORD -- natural type of __WORDSIZE bits (int or long) LONGWORD -- type of __WORDSIZE bits, traditionally long - We distinguish WORD/LONGWORD, 32/LONG32, and 64/QUAD so that the - conventional uses of `long' or `long long' type modifiers match the - types we define, even when a less-adorned type would be the same size. - This matters for (somewhat) portably writing printf/scanf formats for - these types, where using the appropriate l or ll format modifiers can - make the typedefs and the formats match up across all GNU platforms. If - we used `long' when it's 64 bits where `long long' is expected, then the - compiler would warn about the formats not matching the argument types, - and the programmer changing them to shut up the compiler would break the - program's portability. + We distinguish WORD/LONGWORD and 64/QUAD so that the conventional + uses of `long' or `long long' type modifiers match the types we + define, even when a less-adorned type would be the same size. + This matters for (somewhat) portably writing printf/scanf formats + for these types, where using the appropriate l or ll format + modifiers can make the typedefs and the formats match up across all + GNU platforms. If we used `long' when it's 64 bits where `long + long' is expected, then the compiler would warn about the formats + not matching the argument types, and the programmer changing them + to shut up the compiler would break the program's portability. Here we assume what is presently the case in all the GCC configurations we support: long long is always 64 bits, long is always word/address size, and int is always 32 bits. */ -#define __S16_TYPE short int -#define __U16_TYPE unsigned short int -#define __S32_TYPE int -#define __U32_TYPE unsigned int +#define __S16_TYPE __int16_t +#define __U16_TYPE __uint16_t +#define __S32_TYPE __int32_t +#define __U32_TYPE __uint32_t +#define __S64_TYPE __int64_t +#define __U64_TYPE __uint64_t + #define __SLONGWORD_TYPE long int #define __ULONGWORD_TYPE unsigned long int #if __WORDSIZE == 32 -# define __SQUAD_TYPE __int64_t -# define __UQUAD_TYPE __uint64_t # define __SWORD_TYPE int # define __UWORD_TYPE unsigned int # define __SLONG32_TYPE long int # define __ULONG32_TYPE unsigned long int -# define __S64_TYPE __int64_t -# define __U64_TYPE __uint64_t -/* We want __extension__ before typedef's that use nonstandard base types - such as `long long' in C89 mode. */ -# define __STD_TYPE __extension__ typedef -#elif __WORDSIZE == 64 -# define __SQUAD_TYPE long int -# define __UQUAD_TYPE unsigned long int +#else /* __WORDSIZE == 64 */ # define __SWORD_TYPE long int # define __UWORD_TYPE unsigned long int # define __SLONG32_TYPE int # define __ULONG32_TYPE unsigned int -# define __S64_TYPE long int -# define __U64_TYPE unsigned long int -/* No need to mark the typedef with __extension__. */ -# define __STD_TYPE typedef -#else -# error #endif #include <bits/typesizes.h> /* Defines __*_T_TYPE macros. */ #include <bits/time64.h> /* Defines __TIME*_T_TYPE macros. */ - -__STD_TYPE __DEV_T_TYPE __dev_t; /* Type of device numbers. */ -__STD_TYPE __UID_T_TYPE __uid_t; /* Type of user identifications. */ -__STD_TYPE __GID_T_TYPE __gid_t; /* Type of group identifications. */ -__STD_TYPE __INO_T_TYPE __ino_t; /* Type of file serial numbers. */ -__STD_TYPE __INO64_T_TYPE __ino64_t; /* Type of file serial numbers (LFS).*/ -__STD_TYPE __MODE_T_TYPE __mode_t; /* Type of file attribute bitmasks. */ -__STD_TYPE __NLINK_T_TYPE __nlink_t; /* Type of file link counts. */ -__STD_TYPE __OFF_T_TYPE __off_t; /* Type of file sizes and offsets. */ -__STD_TYPE __OFF64_T_TYPE __off64_t; /* Type of file sizes and offsets (LFS). */ -__STD_TYPE __PID_T_TYPE __pid_t; /* Type of process identifications. */ -__STD_TYPE __FSID_T_TYPE __fsid_t; /* Type of file system IDs. */ -__STD_TYPE __CLOCK_T_TYPE __clock_t; /* Type of CPU usage counts. */ -__STD_TYPE __RLIM_T_TYPE __rlim_t; /* Type for resource measurement. */ -__STD_TYPE __RLIM64_T_TYPE __rlim64_t; /* Type for resource measurement (LFS). */ -__STD_TYPE __ID_T_TYPE __id_t; /* General type for IDs. */ -__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */ -__STD_TYPE __TIME64_T_TYPE __time64_t; /* Seconds since the Epoch (Y2038). */ -__STD_TYPE __USECONDS_T_TYPE __useconds_t; /* Count of microseconds. */ -__STD_TYPE __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds. */ - -__STD_TYPE __KEY_T_TYPE __key_t; /* Type of an IPC key. */ - -/* Clock ID used in clock and timer functions. */ -__STD_TYPE __CLOCKID_T_TYPE __clockid_t; - -/* Timer ID returned by `timer_create'. */ -__STD_TYPE __TIMER_T_TYPE __timer_t; - -/* Type to represent block size. */ -__STD_TYPE __BLKSIZE_T_TYPE __blksize_t; - -/* Types from the Large File Support interface. */ - -/* Type to count number of disk blocks. */ -__STD_TYPE __BLKCNT_T_TYPE __blkcnt_t; -__STD_TYPE __BLKCNT64_T_TYPE __blkcnt64_t; - -/* Type to count file system blocks. */ -__STD_TYPE __FSBLKCNT_T_TYPE __fsblkcnt_t; -__STD_TYPE __FSBLKCNT64_T_TYPE __fsblkcnt64_t; - -/* Type to count file system nodes. */ -__STD_TYPE __FSFILCNT_T_TYPE __fsfilcnt_t; -__STD_TYPE __FSFILCNT64_T_TYPE __fsfilcnt64_t; - -/* Type of miscellaneous file system fields. */ -__STD_TYPE __FSWORD_T_TYPE __fsword_t; - -__STD_TYPE __SSIZE_T_TYPE __ssize_t; /* Type of a byte count, or error. */ - -/* Signed long type used in system calls. */ -__STD_TYPE __SYSCALL_SLONG_TYPE __syscall_slong_t; -/* Unsigned long type used in system calls. */ -__STD_TYPE __SYSCALL_ULONG_TYPE __syscall_ulong_t; +/* Types from core POSIX: */ +typedef __BLKCNT_T_TYPE __blkcnt_t; /* Disk block counts. */ +typedef __CLOCKID_T_TYPE __clockid_t; /* Clock IDs. */ +typedef __DEV_T_TYPE __dev_t; /* Device numbers. */ +typedef __FSBLKCNT_T_TYPE __fsblkcnt_t; /* File system block counts. */ +typedef __FSFILCNT_T_TYPE __fsfilcnt_t; /* File system inode counts. */ +typedef __GID_T_TYPE __gid_t; /* Group IDs. */ +typedef __INO_T_TYPE __ino_t; /* File serial numbers. */ +typedef __MODE_T_TYPE __mode_t; /* File attribute bitmasks. */ +typedef __NLINK_T_TYPE __nlink_t; /* File link counts. */ +typedef __OFF_T_TYPE __off_t; /* File sizes and offsets. */ +typedef __PID_T_TYPE __pid_t; /* Process IDs. */ +typedef __RLIM_T_TYPE __rlim_t; /* Resource measurements. */ +typedef __SSIZE_T_TYPE __ssize_t; /* Byte count, or error. */ +typedef __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */ +typedef __TIMER_T_TYPE __timer_t; /* Timer IDs. */ +typedef __UID_T_TYPE __uid_t; /* Type of user identifications. */ + +/* Types added by LFS: */ +typedef __BLKCNT64_T_TYPE __blkcnt64_t; +typedef __FSBLKCNT64_T_TYPE __fsblkcnt64_t; +typedef __FSFILCNT64_T_TYPE __fsfilcnt64_t; +typedef __INO64_T_TYPE __ino64_t; +typedef __OFF64_T_TYPE __off64_t; +typedef __RLIM64_T_TYPE __rlim64_t; + +/* Types added by Y2038: */ +typedef __TIME64_T_TYPE __time64_t; + +/* Types added by XSI: */ +typedef __BLKSIZE_T_TYPE __blksize_t; /* Size of a disk block. */ +typedef __CLOCK_T_TYPE __clock_t; /* CPU usage counts. */ +typedef __ID_T_TYPE __id_t; /* General IDs. */ +typedef __KEY_T_TYPE __key_t; /* "SysV" IPC keys. */ +typedef __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds. */ +typedef __USECONDS_T_TYPE __useconds_t; /* Count of microseconds. */ + +/* Types added by BSD: */ +typedef __FSID_T_TYPE __fsid_t; /* File system IDs. */ +typedef __REGISTER_T_TYPE __register_t; /* Integer register. */ + +/* Types added by Linux: */ +typedef __FSWORD_T_TYPE __fsword_t; /* Miscellaneous file system fields. */ +typedef __SYSCALL_SLONG_TYPE __syscall_slong_t; +typedef __SYSCALL_ULONG_TYPE __syscall_ulong_t; /* These few don't really vary by system, they always correspond to one of the other defined types. */ -typedef __off64_t __loff_t; /* Type of file sizes and offsets (LFS). */ -typedef char *__caddr_t; /* Type of a memory address (BSD). */ -__STD_TYPE __S32_TYPE __daddr_t; /* Type of a disk address (BSD). */ - -/* Duplicates info from stdint.h but this is used in unistd.h. */ -__STD_TYPE __SWORD_TYPE __intptr_t; - -/* Duplicate info from sys/socket.h. */ -__STD_TYPE __U32_TYPE __socklen_t; -/* C99: An integer type that can be accessed as an atomic entity, - even in the presence of asynchronous interrupts. - It is not currently necessary for this to be machine-specific. */ -typedef int __sig_atomic_t; +/* ISO C: */ +typedef __SWORD_TYPE __intptr_t; /* Signed type that can hold void*. */ +typedef __UWORD_TYPE __uintptr_t; /* Unsigned type that can hold void*. */ +typedef int __sig_atomic_t; /* Atomic access relative to signals. */ -/* BSD: Size of a general-purpose integer register. */ -__STD_TYPE __REGISTER_T_TYPE __register_t; +/* POSIX: */ +typedef __U32_TYPE __socklen_t; /* Size of a socket address. */ -#undef __STD_TYPE +/* BSD: */ +typedef char *__caddr_t; /* Memory address. */ +typedef __S32_TYPE __daddr_t; /* Disk address. */ +typedef __off64_t __loff_t; /* File sizes and offsets. */ #endif /* bits/types.h */ |