]>
Commit | Line | Data |
---|---|---|
832b75ed GG |
1 | /* |
2 | * int64.h | |
3 | * | |
4 | * Home page of code is: http://smartmontools.sourceforge.net | |
5 | * | |
34ad0c5f GG |
6 | * Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net> |
7 | * Copyright (C) 2004-8 Christian Franke | |
832b75ed GG |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; either version 2, or (at your option) | |
12 | * any later version. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * (for example COPYING); if not, write to the Free | |
16 | * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
17 | * | |
18 | */ | |
19 | ||
20 | #ifndef INT64_H_ | |
21 | #define INT64_H_ | |
22 | ||
34ad0c5f | 23 | #define INT64_H_CVSID "$Id: int64.h,v 1.17 2008/03/04 22:09:47 ballen4705 Exp $\n" |
832b75ed | 24 | |
ba59cff1 | 25 | // 64 bit integer typedefs and format strings |
832b75ed GG |
26 | |
27 | #ifdef HAVE_INTTYPES_H | |
ba59cff1 GG |
28 | // The ISO C99 standard specifies that in C++ implementations the PRI* macros |
29 | // from <inttypes.h> should only be defined if explicitly requested | |
30 | #define __STDC_FORMAT_MACROS 1 | |
31 | #include <inttypes.h> // PRId64, PRIu64, PRIx64 (also includes <stdint.h>) | |
832b75ed GG |
32 | #else |
33 | #ifdef HAVE_STDINT_H | |
ba59cff1 | 34 | #include <stdint.h> // int64_t, uint64_t (usually included above) |
832b75ed GG |
35 | #else |
36 | #ifdef HAVE_SYS_INTTYPES_H | |
37 | #include <sys/inttypes.h> | |
38 | #else | |
39 | #ifdef HAVE_SYS_INT_TYPES_H | |
40 | #include <sys/int_types.h> | |
41 | #else | |
42 | #if defined(_WIN32) && defined(_MSC_VER) | |
43 | // for MSVC 6.0 | |
44 | typedef __int64 int64_t; | |
45 | typedef unsigned __int64 uint64_t; | |
46 | #else | |
47 | // for systems with above includes missing (like ix86-pc-linux-gnulibc1), | |
48 | // default to GCC if types are undefined in types.h | |
49 | #include <sys/types.h> | |
50 | #ifndef HAVE_INT64_T | |
51 | typedef long long int64_t; | |
52 | #endif | |
53 | #ifndef HAVE_UINT64_T | |
54 | typedef unsigned long long uint64_t; | |
55 | #endif | |
56 | #endif // _WIN32 && _MSC_VER | |
57 | #endif // HAVE_SYS_INT_TYPES_H | |
58 | #endif // HAVE_SYS_INTTYPES_H | |
59 | #endif // HAVE_STDINT_H | |
60 | #endif // HAVE_INTTYPES_H | |
61 | ||
ba59cff1 GG |
62 | #ifdef _WIN32 |
63 | // for MSVCRT.DLL (used by both MSVC 6.0 and MinGW) | |
832b75ed GG |
64 | #define PRId64 "I64d" |
65 | #define PRIu64 "I64u" | |
66 | #define PRIx64 "I64x" | |
ba59cff1 | 67 | #endif // _WIN32 |
832b75ed GG |
68 | |
69 | // If macros not defined in inttypes.h, fix here. Default is GCC | |
70 | // style | |
ba59cff1 | 71 | #ifndef PRId64 |
832b75ed GG |
72 | #define PRId64 "lld" |
73 | #endif // ndef PRId64 | |
74 | ||
75 | #ifndef PRIu64 | |
76 | #define PRIu64 "llu" | |
77 | #endif // ndef PRIu64 | |
78 | ||
79 | #ifndef PRIx64 | |
80 | #define PRIx64 "llx" | |
81 | #endif // ndef PRIx64 | |
82 | ||
83 | ||
84 | #if defined(_WIN32) && defined(_MSC_VER) | |
85 | // for MSVC 6.0: "unsigned __int64 -> double" conversion not implemented (why?-) | |
86 | __inline double uint64_to_double(uint64_t ull) { | |
87 | return ((int64_t)ull >= 0 ? (double)(int64_t)ull : | |
88 | ((double)(int64_t)(ull - 9223372036854775808UI64)) + 9223372036854775808.0); | |
89 | } | |
90 | #else | |
91 | #define uint64_to_double(ull) ((double)(ull)) | |
92 | #endif // _WIN32 && _MSC_VER | |
93 | ||
94 | ||
95 | #endif // INT64_H |