/*
 * Copyright (c) 2013, 2014 Jonas 'Sortie' Termansen.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * sortix/__/types.h
 * Data types.
 */

#ifndef _INCLUDE_SORTIX____TYPES_H
#define _INCLUDE_SORTIX____TYPES_H

#include <sys/cdefs.h>

#include <__/limits.h>
#include <__/stdint.h>
#include <__/wordsize.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef __intmax_t __blkcnt_t;
/*#define __BLKCNT_UNSIGNED*/
#define __BLKCNT_C(c) __INTMAX_C(c)
#define __BLKCNT_MIN __INTMAX_MIN
#define __BLKCNT_MAX __INTMAX_MAX
#define __PRIdBLKCNT __PRIdMAX
#define __PRIiBLKCNT __PRIiMAX
#define __PRIoBLKCNT __PRIoMAX
#define __PRIuBLKCNT __PRIuMAX
#define __PRIxBLKCNT __PRIxMAX
#define __PRIXBLKCNT __PRIXMAX
#define __SCNdBLKCNT __SCNdMAX
#define __SCNiBLKCNT __SCNiMAX
#define __SCNoBLKCNT __SCNoMAX
#define __SCNuBLKCNT __SCNuMAX
#define __SCNxBLKCNT __SCNxMAX

typedef __intmax_t __blksize_t;
/*#define __BLKSIZE_UNSIGNED*/
#define __BLKSIZE_C(c) __INTMAX_C(c)
#define __BLKSIZE_MIN __INTMAX_MIN
#define __BLKSIZE_MAX __INTMAX_MAX
#define __PRIdBLKSIZE __PRIdMAX
#define __PRIiBLKSIZE __PRIiMAX
#define __PRIoBLKSIZE __PRIoMAX
#define __PRIuBLKSIZE __PRIuMAX
#define __PRIxBLKSIZE __PRIxMAX
#define __PRIXBLKSIZE __PRIXMAX
#define __SCNdBLKSIZE __SCNdMAX
#define __SCNiBLKSIZE __SCNiMAX
#define __SCNoBLKSIZE __SCNoMAX
#define __SCNuBLKSIZE __SCNuMAX
#define __SCNxBLKSIZE __SCNxMAX

typedef long __clock_t;
/*#define __CLOCK_UNSIGNED*/
#define __CLOCK_C(c) c ## L
#define __CLOCK_MIN __LONG_MIN
#define __CLOCK_MAX __LONG_MAX
#define __PRIdCLOCK "ld"
#define __PRIiCLOCK "li"
#define __PRIoCLOCK "lo"
#define __PRIuCLOCK "lu"
#define __PRIxCLOCK "lx"
#define __PRIXCLOCK "lX"
#define __SCNdCLOCK "ld"
#define __SCNiCLOCK "li"
#define __SCNoCLOCK "lo"
#define __SCNuCLOCK "lu"
#define __SCNxCLOCK "lx"

typedef int __clockid_t;
/*#define __CLOCKID_UNSIGNED*/
#define __CLOCKID_C(c) c
#define __CLOCKID_MIN __INT_MIN
#define __CLOCKID_MAX __INT_MAX
#define __PRIdCLOCKID "d"
#define __PRIiCLOCKID "i"
#define __PRIoCLOCKID "o"
#define __PRIuCLOCKID "u"
#define __PRIxCLOCKID "x"
#define __PRIXCLOCKID "X"
#define __SCNdCLOCKID "d"
#define __SCNiCLOCKID "i"
#define __SCNoCLOCKID "o"
#define __SCNuCLOCKID "u"
#define __SCNxCLOCKID "x"

typedef __uintptr_t __dev_t;
#define __DEV_UNSIGNED
#define __DEV_C(c) __UINTPTR_C(c)
#define __DEV_MIN 0
#define __DEV_MAX __UINTPTR_MAX
#define __PRIdDEV __PRIdPTR
#define __PRIiDEV __PRIiPTR
#define __PRIoDEV __PRIoPTR
#define __PRIuDEV __PRIuPTR
#define __PRIxDEV __PRIxPTR
#define __PRIXDEV __PRIXPTR
#define __SCNdDEV __SCNdPTR
#define __SCNiDEV __SCNiPTR
#define __SCNoDEV __SCNoPTR
#define __SCNuDEV __SCNuPTR
#define __SCNxDEV __SCNxPTR

typedef __intmax_t __fsblkcnt_t;
/*#define __FSBLKCNT_UNSIGNED*/
#define __FSBLKCNT_C(c) __INTMAX_C(c)
#define __FSBLKCNT_MIN __INTMAX_MIN
#define __FSBLKCNT_MAX __INTMAX_MAX
#define __PRIdFSBLKCNT __PRIdMAX
#define __PRIiFSBLKCNT __PRIiMAX
#define __PRIoFSBLKCNT __PRIoMAX
#define __PRIuFSBLKCNT __PRIuMAX
#define __PRIxFSBLKCNT __PRIxMAX
#define __PRIXFSBLKCNT __PRIXMAX
#define __SCNdFSBLKCNT __SCNdMAX
#define __SCNiFSBLKCNT __SCNiMAX
#define __SCNoFSBLKCNT __SCNoMAX
#define __SCNuFSBLKCNT __SCNuMAX
#define __SCNxFSBLKCNT __SCNxMAX

typedef __intmax_t __fsfilcnt_t;
/*#define __FSFILCNT_UNSIGNED*/
#define __FSFILCNT_C(c) __INTMAX_C(c)
#define __FSFILCNT_MIN __INTMAX_MIN
#define __FSFILCNT_MAX __INTMAX_MAX
#define __PRIdFSFILCNT __PRIdMAX
#define __PRIiFSFILCNT __PRIiMAX
#define __PRIoFSFILCNT __PRIoMAX
#define __PRIuFSFILCNT __PRIuMAX
#define __PRIxFSFILCNT __PRIxMAX
#define __PRIXFSFILCNT __PRIXMAX
#define __SCNdFSFILCNT __SCNdMAX
#define __SCNiFSFILCNT __SCNiMAX
#define __SCNoFSFILCNT __SCNoMAX
#define __SCNuFSFILCNT __SCNuMAX
#define __SCNxFSFILCNT __SCNxMAX

typedef __uint64_t __gid_t;
#define __GID_UNSIGNED
#define __GID_C(c) __UINT64_C(c)
#define __GID_MIN 0
#define __GID_MAX __UINT64_MAX
#define __PRIdGID __PRId64
#define __PRIiGID __PRIi64
#define __PRIoGID __PRIo64
#define __PRIuGID __PRIu64
#define __PRIxGID __PRIx64
#define __PRIXGID __PRIX64
#define __SCNdGID __SCNd64
#define __SCNiGID __SCNi64
#define __SCNoGID __SCNo64
#define __SCNuGID __SCNu64
#define __SCNxGID __SCNx64

typedef __uint64_t __id_t;
#define __ID_UNSIGNED
#define __ID_C(c) __UINT64_C(c)
#define __ID_MIN 0
#define __ID_MAX __UINT64_MAX
#define __PRIdID __PRId64
#define __PRIiID __PRIi64
#define __PRIoID __PRIo64
#define __PRIuID __PRIu64
#define __PRIxID __PRIx64
#define __PRIXID __PRIX64
#define __SCNdID __SCNd64
#define __SCNiID __SCNi64
#define __SCNoID __SCNo64
#define __SCNuID __SCNu64
#define __SCNxID __SCNx64

typedef __uintmax_t __ino_t;
#define __INO_UNSIGNED
#define __INO_C(c) __INTMAX_C(c)
#define __INO_MIN __INTMAX_MIN
#define __INO_MAX __INTMAX_MAX
#define __PRIdINO __PRIdMAX
#define __PRIiINO __PRIiMAX
#define __PRIoINO __PRIoMAX
#define __PRIuINO __PRIuMAX
#define __PRIxINO __PRIxMAX
#define __PRIXINO __PRIXMAX
#define __SCNdINO __SCNdMAX
#define __SCNiINO __SCNiMAX
#define __SCNoINO __SCNoMAX
#define __SCNuINO __SCNuMAX
#define __SCNxINO __SCNxMAX

/* TODO: __key_t */

typedef unsigned int __mode_t;
#define __MODE_UNSIGNED
#define __MODE_C(c) c ## U
#define __MODE_MIN 0
#define __MODE_MAX __UINT_MAX
#define __PRIdMODE "d"
#define __PRIiMODE "i"
#define __PRIoMODE "o"
#define __PRIuMODE "u"
#define __PRIxMODE "x"
#define __PRIXMODE "X"
#define __SCNdMODE "d"
#define __SCNiMODE "i"
#define __SCNoMODE "o"
#define __SCNuMODE "u"
#define __SCNxMODE "x"

typedef unsigned int __nlink_t;
#define __NLINK_UNSIGNED
#define __NLINK_C(c) c ## U
#define __NLINK_MIN 0
#define __NLINK_MAX __UINT_MAX
#define __PRIdNLINK "d"
#define __PRIiNLINK "i"
#define __PRIoNLINK "o"
#define __PRIuNLINK "u"
#define __PRIxNLINK "x"
#define __PRIXNLINK "X"
#define __SCNdNLINK "d"
#define __SCNiNLINK "i"
#define __SCNoNLINK "o"
#define __SCNuNLINK "u"
#define __SCNxNLINK "x"

typedef __intmax_t __off_t;
/*#define __OFF_UNSIGNED*/
#define __OFF_C(c) __INTMAX_C(c)
#define __OFF_MIN __INTMAX_MIN
#define __OFF_MAX __INTMAX_MAX
#define __PRIdOFF __PRIdMAX
#define __PRIiOFF __PRIiMAX
#define __PRIoOFF __PRIoMAX
#define __PRIuOFF __PRIuMAX
#define __PRIxOFF __PRIxMAX
#define __PRIXOFF __PRIXMAX
#define __SCNdOFF __SCNdMAX
#define __SCNiOFF __SCNiMAX
#define __SCNoOFF __SCNoMAX
#define __SCNuOFF __SCNuMAX
#define __SCNxOFF __SCNxMAX

typedef __intptr_t __pid_t;
/*#define __PID_UNSIGNED*/
#define __PID_C(c) __INTPTR_C(c)
#define __PID_MIN __INTPTR_MIN
#define __PID_MAX __INTPTR_MAX
#define __PRIdPID __PRIdPTR
#define __PRIiPID __PRIiPTR
#define __PRIoPID __PRIoPTR
#define __PRIuPID __PRIuPTR
#define __PRIxPID __PRIxPTR
#define __PRIXPID __PRIXPTR
#define __SCNdPID __SCNdPTR
#define __SCNiPID __SCNiPTR
#define __SCNoPID __SCNoPTR
#define __SCNuPID __SCNuPTR
#define __SCNxPID __SCNxPTR

/* TODO: __size_t */

typedef __SIZE_TYPE__ __socklen_t;
#define __SOCKLEN_UNSIGNED
/* TODO: Get this from a __SIZE_C */
#if defined(__i386__)
#define __SOCKLEN_C(c) c ## u
#elif defined(__x86_64__)
#define __SOCKLEN_C(c) c ## ul
#else
#error "You need to provide __SOCKLEN_C for your platform"
#endif
#define __SOCKLEN_MIN 0
#define __SOCKLEN_MAX __SIZE_MAX__
#define __PRIdSOCKLEN "zd"
#define __PRIiSOCKLEN "zi"
#define __PRIoSOCKLEN "zo"
#define __PRIuSOCKLEN "zu"
#define __PRIxSOCKLEN "zx"
#define __PRIXSOCKLEN "zX"
#define __SCNdSOCKLEN "zd"
#define __SCNiSOCKLEN "zi"
#define __SCNoSOCKLEN "zo"
#define __SCNuSOCKLEN "zu"
#define __SCNxSOCKLEN "zx"

typedef __SSIZE_TYPE__ __ssize_t;
/*#define __SSIZE_UNSIGNED*/
/* TODO: Get this from a __SSIZE_C */
#if defined(__i386__)
#define __SSIZE_C(c) c
#elif defined(__x86_64__)
#define __SSIZE_C(c) c ## l
#else
#error "You need to provide __SSIZE_C for your platform"
#endif
#if defined(__i386__)
#define __SSIZE_MIN __INT_MIN
#define __SSIZE_MAX __INT_MAX
#elif defined(__x86_64__)
#define __SSIZE_MIN __LONG_MIN
#define __SSIZE_MAX __LONG_MAX
#else
#error "You need to provide __SSIZE_MIN and __SSIZE_MAX for your platform"
#endif
#define __PRIdSSIZE "zd"
#define __PRIiSSIZE "zi"
#define __PRIoSSIZE "zo"
#define __PRIuSSIZE "zu"
#define __PRIxSSIZE "zx"
#define __PRIXSSIZE "zX"
#define __SCNdSSIZE "zd"
#define __SCNiSSIZE "zi"
#define __SCNoSSIZE "zo"
#define __SCNuSSIZE "zu"
#define __SCNxSSIZE "zx"

typedef long __suseconds_t;
/*#define __SUSECONDS_UNSIGNED*/
#define __SUSECONDS_C(c) c ## L
#define __SUSECONDS_MIN __LONG_MIN
#define __SUSECONDS_MAX __LONG_MAX
#define __PRIdSUSECONDS "ld"
#define __PRIiSUSECONDS "li"
#define __PRIoSUSECONDS "lo"
#define __PRIuSUSECONDS "lu"
#define __PRIxSUSECONDS "lx"
#define __PRIXSUSECONDS "lX"
#define __SCNdSUSECONDS "ld"
#define __SCNiSUSECONDS "li"
#define __SCNoSUSECONDS "lo"
#define __SCNuSUSECONDS "lu"
#define __SCNxSUSECONDS "lx"

typedef __int64_t __time_t;
/*#define __TIME_UNSIGNED*/
#define __TIME_C(c) __INT64_C(c)
#define __TIME_MIN __INT64_MIN
#define __TIME_MAX __INT64_MAX
#define __PRIdTIME __PRId64
#define __PRIiTIME __PRIi64
#define __PRIoTIME __PRIo64
#define __PRIuTIME __PRIu64
#define __PRIxTIME __PRIx64
#define __PRIXTIME __PRIX64
#define __SCNdTIME __SCNd64
#define __SCNiTIME __SCNi64
#define __SCNoTIME __SCNo64
#define __SCNuTIME __SCNu64
#define __SCNxTIME __SCNx64

typedef __uintptr_t __timer_t;
#define __TIMER_UNSIGNED
#define __TIMER_C(c) __UINTPTR_C(c)
#define __TIMER_MIN 0
#define __TIMER_MAX __UINTPTR_MAX
#define __PRIdTIMER __PRIdPTR
#define __PRIiTIMER __PRIiPTR
#define __PRIoTIMER __PRIoPTR
#define __PRIuTIMER __PRIuPTR
#define __PRIxTIMER __PRIxPTR
#define __PRIXTIMER __PRIXPTR
#define __SCNdTIMER __SCNdPTR
#define __SCNiTIMER __SCNiPTR
#define __SCNoTIMER __SCNoPTR
#define __SCNuTIMER __SCNuPTR
#define __SCNxTIMER __SCNxPTR

/* TODO: trace*_t */

typedef __uint64_t __uid_t;
#define __UID_UNSIGNED
#define __UID_C(c) __UINT64_C(c)
#define __UID_MIN 0
#define __UID_MAX __UINT64_MAX
#define __PRIdUID __PRId64
#define __PRIiUID __PRIi64
#define __PRIoUID __PRIo64
#define __PRIuUID __PRIu64
#define __PRIxUID __PRIx64
#define __PRIXUID __PRIX64
#define __SCNdUID __SCNd64
#define __SCNiUID __SCNi64
#define __SCNoUID __SCNo64
#define __SCNuUID __SCNu64
#define __SCNxUID __SCNx64

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
