source: filezilla/trunk/fuentes/src/interface/buildinfo.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 3 years ago

Update new version: 3.15.02

File size: 5.3 KB
Line 
1#include <filezilla.h>
2#include "buildinfo.h"
3
4wxString CBuildInfo::GetVersion()
5{
6        return wxString(PACKAGE_VERSION, wxConvLocal);
7}
8
9wxString CBuildInfo::GetBuildDateString()
10{
11        // Get build date. Unfortunately it is in the ugly Mmm dd yyyy format.
12        // Make a good yyyy-mm-dd out of it
13        wxString date(__DATE__, wxConvLocal);
14        while (date.Replace(_T("  "), _T(" ")));
15
16        const wxChar months[][4] = { _T("Jan"), _T("Feb"), _T("Mar"),
17                                                                _T("Apr"), _T("May"), _T("Jun"),
18                                                                _T("Jul"), _T("Aug"), _T("Sep"),
19                                                                _T("Oct"), _T("Nov"), _T("Dec") };
20
21        int pos = date.Find(_T(" "));
22        if (pos == -1)
23                return date;
24
25        wxString month = date.Left(pos);
26        int i = 0;
27        for (i = 0; i < 12; ++i) {
28                if (months[i] == month)
29                        break;
30        }
31        if (i == 12)
32                return date;
33
34        wxString tmp = date.Mid(pos + 1);
35        pos = tmp.Find(_T(" "));
36        if (pos == -1)
37                return date;
38
39        long day;
40        if (!tmp.Left(pos).ToLong(&day))
41                return date;
42
43        long year;
44        if (!tmp.Mid(pos + 1).ToLong(&year))
45                return date;
46
47        return wxString::Format(_T("%04d-%02d-%02d"), (int)year, i + 1, (int)day);
48}
49
50wxString CBuildInfo::GetBuildTimeString()
51{
52        return wxString(__TIME__, wxConvLocal);
53}
54
55fz::datetime CBuildInfo::GetBuildDate()
56{
57        fz::datetime date(GetBuildDateString().ToStdWstring(), fz::datetime::utc);
58        return date;
59}
60
61wxString CBuildInfo::GetCompiler()
62{
63#ifdef USED_COMPILER
64        return wxString(USED_COMPILER, wxConvLocal);
65#elif defined __VISUALC__
66        int version = __VISUALC__;
67        return wxString::Format(_T("Visual C++ %d"), version);
68#else
69        return _T("Unknown compiler");
70#endif
71}
72
73wxString CBuildInfo::GetCompilerFlags()
74{
75#ifndef USED_CXXFLAGS
76        return wxString();
77#else
78        wxString flags(USED_CXXFLAGS, wxConvLocal);
79        return flags;
80#endif
81}
82
83wxString CBuildInfo::GetBuildType()
84{
85#ifdef BUILDTYPE
86        wxString buildtype(BUILDTYPE, wxConvLocal);
87        if (buildtype == _T("official") || buildtype == _T("nightly"))
88                return buildtype;
89#endif
90        return wxString();
91}
92
93int64_t CBuildInfo::ConvertToVersionNumber(const wxChar* version)
94{
95        // Crude conversion from version string into number for easy comparison
96        // Supported version formats:
97        // 1.2.4
98        // 11.22.33.44
99        // 1.2.3-rc3
100        // 1.2.3.4-beta5
101        // All numbers can be as large as 1024, with the exception of the release candidate.
102
103        // Only either rc or beta can exist at the same time)
104        //
105        // The version string A.B.C.D-rcE-betaF expands to the following binary representation:
106        // 0000aaaaaaaaaabbbbbbbbbbccccccccccddddddddddxeeeeeeeeeffffffffff
107        //
108        // x will be set to 1 if neither rc nor beta are set. 0 otherwise.
109        //
110        // Example:
111        // 2.2.26-beta3 will be converted into
112        // 0000000010 0000000010 0000011010 0000000000 0000000000 0000000011
113        // which in turn corresponds to the simple 64-bit number 2254026754228227
114        // And these can be compared easily
115
116        if (*version < '0' || *version > '9')
117                return -1;
118
119        int64_t v{};
120        int segment{};
121        int shifts{};
122
123        for (; *version; ++version) {
124                if (*version == '.' || *version == '-' || *version == 'b') {
125                        v += segment;
126                        segment = 0;
127                        v <<= 10;
128                        shifts++;
129                }
130                if (*version == '-' && shifts < 4) {
131                        v <<= (4 - shifts) * 10;
132                        shifts = 4;
133                }
134                else if (*version >= '0' && *version <= '9') {
135                        segment *= 10;
136                        segment += *version - '0';
137                }
138        }
139        v += segment;
140        v <<= (5 - shifts) * 10;
141
142        // Make sure final releases have a higher version number than rc or beta releases
143        if ((v & 0x0FFFFF) == 0)
144                v |= 0x080000;
145
146        return v;
147}
148
149wxString CBuildInfo::GetHostname()
150{
151#ifndef USED_HOST
152        return wxString();
153#else
154        wxString flags(USED_HOST, wxConvLocal);
155        return flags;
156#endif
157}
158
159wxString CBuildInfo::GetBuildSystem()
160{
161#ifndef USED_BUILD
162        return wxString();
163#else
164        wxString flags(USED_BUILD, wxConvLocal);
165        return flags;
166#endif
167}
168
169bool CBuildInfo::IsUnstable()
170{
171        if (GetVersion().Find(_T("beta")) != -1)
172                return true;
173
174        if (GetVersion().Find(_T("rc")) != -1)
175                return true;
176
177        return false;
178}
179
180
181#if defined(__i386__) || defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86)
182#define HAVE_CPUID 1
183#endif
184
185#if HAVE_CPUID
186
187#ifdef _MSC_VER
188namespace {
189        void cpuid(int f, int sub, int reg[4])
190        {
191                __cpuidex(reg, f, sub);
192        }
193}
194#else
195#include <cpuid.h>
196namespace {
197        void cpuid(int f, int sub, int reg[4])
198        {
199                __cpuid_count(f, sub, reg[0], reg[1], reg[2], reg[3]);
200        }
201}
202#endif
203#endif
204
205wxString CBuildInfo::GetCPUCaps(char separator)
206{
207        wxString ret;
208
209#if HAVE_CPUID
210        int reg[4];
211        cpuid(0, 0, reg);
212
213        int const max = reg[0];
214
215        // function (aka leave), subfunction (subleave), register, bit, description
216        std::tuple<int, int, int, int, wxString> const caps[] = {
217                std::make_tuple(1, 0, 3, 25, _T("sse")),
218                std::make_tuple(1, 0, 3, 26, _T("sse2")),
219                std::make_tuple(1, 0, 2, 0,  _T("sse3")),
220                std::make_tuple(1, 0, 2, 9,  _T("ssse3")),
221                std::make_tuple(1, 0, 2, 19, _T("sse4.1")),
222                std::make_tuple(1, 0, 2, 20, _T("sse4.2")),
223                std::make_tuple(1, 0, 2, 28, _T("avx")),
224                std::make_tuple(7, 0, 1, 5,  _T("avx2")),
225                std::make_tuple(1, 0, 2, 25, _T("aes")),
226                std::make_tuple(1, 0, 2, 1,  _T("pclmulqdq")),
227                std::make_tuple(1, 0, 2, 30, _T("rdrnd")),
228                std::make_tuple(7, 0, 1, 3,  _T("bmi2")),
229                std::make_tuple(7, 0, 1, 8,  _T("bmi2")),
230                std::make_tuple(7, 0, 1, 19, _T("adx"))
231        };
232
233        for (auto const& cap : caps) {
234                if (max >= std::get<0>(cap)) {
235                        cpuid(std::get<0>(cap), std::get<1>(cap), reg);
236                        if (reg[std::get<2>(cap)] & (1 << std::get<3>(cap))) {
237                                if (!ret.empty()) {
238                                        ret += separator;
239                                }
240                                ret += std::get<4>(cap);
241                        }
242                }
243        }
244#endif
245
246        return ret;
247}
Note: See TracBrowser for help on using the repository browser.