Tor 0.4.9.0-alpha-dev
torint.h
Go to the documentation of this file.
1/* Copyright (c) 2003, Roger Dingledine
2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
4/* See LICENSE for licensing information */
5
6/**
7 * \file torint.h
8 *
9 * \brief Integer definitions used throughout Tor.
10 **/
11
12#ifndef TOR_TORINT_H
13#define TOR_TORINT_H
14
15#include "orconfig.h"
16
17#include <stdint.h>
18#include <stdbool.h>
19#include <limits.h>
20
21#ifdef HAVE_SYS_TYPES_H
22#include <sys/types.h>
23#endif
24#ifdef HAVE_SYS_LIMITS_H
25#include <sys/limits.h>
26#endif
27
28#ifndef SIZE_MAX
29#if SIZEOF_SIZE_T == 8
30#define SIZE_MAX UINT64_MAX
31#elif SIZEOF_SIZE_T == 4
32#define SIZE_MAX UINT32_MAX
33#else
34#error "Can't define SIZE_MAX"
35#endif /* SIZEOF_SIZE_T == 8 || ... */
36#endif /* !defined(SIZE_MAX) */
37
38#ifndef HAVE_SSIZE_T
39#if SIZEOF_SIZE_T == 8
40typedef int64_t ssize_t;
41#elif SIZEOF_SIZE_T == 4
42typedef int32_t ssize_t;
43#else
44#error "Can't define ssize_t."
45#endif /* SIZEOF_SIZE_T == 8 || ... */
46#endif /* !defined(HAVE_SSIZE_T) */
47
48/* This assumes a sane (2's-complement) representation. But if you
49 * aren't 2's complement, and you don't define LONG_MAX, then you're so
50 * bizarre that I want nothing to do with you. */
51#ifndef USING_TWOS_COMPLEMENT
52#error "Your platform doesn't use 2's complement arithmetic."
53#endif
54
55#ifndef TIME_MAX
56
57#if (SIZEOF_TIME_T == SIZEOF_INT)
58#define TIME_MAX ((time_t)INT_MAX)
59#elif (SIZEOF_TIME_T == SIZEOF_LONG)
60#define TIME_MAX ((time_t)LONG_MAX)
61#elif (SIZEOF_TIME_T == 8)
62#define TIME_MAX ((time_t)INT64_MAX)
63#else
64#error "Can't define TIME_MAX"
65#endif /* (SIZEOF_TIME_T == SIZEOF_INT) || ... */
66
67#endif /* !defined(TIME_MAX) */
68
69#ifndef TIME_MIN
70
71#if (SIZEOF_TIME_T == SIZEOF_INT)
72#define TIME_MIN ((time_t)INT_MIN)
73#elif (SIZEOF_TIME_T == SIZEOF_LONG)
74#define TIME_MIN ((time_t)LONG_MIN)
75#elif (SIZEOF_TIME_T == 8)
76#define TIME_MIN ((time_t)INT64_MIN)
77#else
78#error "Can't define TIME_MIN"
79#endif /* (SIZEOF_TIME_T == SIZEOF_INT) || ... */
80
81#endif /* !defined(TIME_MIN) */
82
83#ifndef SIZE_MAX
84#if (SIZEOF_SIZE_T == 4)
85#define SIZE_MAX UINT32_MAX
86#elif (SIZEOF_SIZE_T == 8)
87#define SIZE_MAX UINT64_MAX
88#else
89#error "Can't define SIZE_MAX"
90#endif /* (SIZEOF_SIZE_T == 4) || ... */
91#endif /* !defined(SIZE_MAX) */
92
93#ifdef _WIN32
94# ifdef _WIN64
95# define TOR_PRIuSZ PRIu64
96# else
97# define TOR_PRIuSZ PRIu32
98# endif
99#else /* !defined(_WIN32) */
100# define TOR_PRIuSZ "zu"
101#endif /* defined(_WIN32) */
102
103#ifdef _WIN32
104# ifdef _WIN64
105# define TOR_PRIdSZ PRId64
106# else
107# define TOR_PRIdSZ PRId32
108# endif
109#else /* !defined(_WIN32) */
110# define TOR_PRIdSZ "zd"
111#endif /* defined(_WIN32) */
112
113#ifndef SSIZE_MAX
114#if (SIZEOF_SIZE_T == 4)
115#define SSIZE_MAX INT32_MAX
116#elif (SIZEOF_SIZE_T == 8)
117#define SSIZE_MAX INT64_MAX
118#else
119#error "Can't define SSIZE_MAX"
120#endif /* (SIZEOF_SIZE_T == 4) || ... */
121#endif /* !defined(SSIZE_MAX) */
122
123/** Any ssize_t larger than this amount is likely to be an underflow. */
124#define SSIZE_T_CEILING ((ssize_t)(SSIZE_MAX-16))
125/** Any size_t larger than this amount is likely to be an underflow. */
126#define SIZE_T_CEILING ((size_t)(SSIZE_MAX-16))
127
128#if SIZEOF_INT > SIZEOF_VOID_P
129#error "sizeof(int) > sizeof(void *) - Can't build Tor here."
130#endif
131
132#if SIZEOF_UNSIGNED_INT > SIZEOF_VOID_P
133#error "sizeof(unsigned int) > sizeof(void *) - Can't build Tor here."
134#endif
135
136#endif /* !defined(TOR_TORINT_H) */