init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
This commit is contained in:
112
Telegram/lib_base/base/crash_report_header.cpp
Normal file
112
Telegram/lib_base/base/crash_report_header.cpp
Normal file
@@ -0,0 +1,112 @@
|
||||
// This file is part of Desktop App Toolkit,
|
||||
// a set of libraries for developing nice desktop applications.
|
||||
//
|
||||
// For license and copyright information please follow this link:
|
||||
// https://github.com/desktop-app/legal/blob/master/LEGAL
|
||||
//
|
||||
#include "base/crash_report_header.h"
|
||||
|
||||
namespace base::details {
|
||||
namespace {
|
||||
|
||||
std::array<char, kReportHeaderSizeLimit> Bytes;
|
||||
int Length = 0;
|
||||
|
||||
void SafeWriteChar(char ch) {
|
||||
if (Length < kReportHeaderSizeLimit) {
|
||||
Bytes[Length++] = ch;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Type>
|
||||
void SafeWriteNumber(Type number) {
|
||||
if constexpr (Type(-1) < Type(0)) {
|
||||
if (number < 0) {
|
||||
SafeWriteChar('-');
|
||||
number = -number;
|
||||
}
|
||||
}
|
||||
Type upper = 1, prev = number / 10;
|
||||
while (prev >= upper) {
|
||||
upper *= 10;
|
||||
}
|
||||
while (upper > 0) {
|
||||
int digit = (number / upper);
|
||||
SafeWriteChar('0' + digit);
|
||||
number -= digit * upper;
|
||||
upper /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, const char *str) {
|
||||
if (str) {
|
||||
while (const auto ch = *str++) {
|
||||
SafeWriteChar(ch);
|
||||
}
|
||||
}
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, const wchar_t *str) {
|
||||
for (int i = 0, l = wcslen(str); i < l; ++i) {
|
||||
if (
|
||||
#if !defined(__WCHAR_UNSIGNED__)
|
||||
str[i] >= 0 &&
|
||||
#endif
|
||||
str[i] < 128) {
|
||||
SafeWriteChar(char(str[i]));
|
||||
} else {
|
||||
SafeWriteChar('?');
|
||||
}
|
||||
}
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, int num) {
|
||||
SafeWriteNumber(num);
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned int num) {
|
||||
SafeWriteNumber(num);
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned long num) {
|
||||
SafeWriteNumber(num);
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned long long num) {
|
||||
SafeWriteNumber(num);
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
ReportHeaderWriter operator<<(ReportHeaderWriter, double num) {
|
||||
if (num < 0) {
|
||||
SafeWriteChar('-');
|
||||
num = -num;
|
||||
}
|
||||
SafeWriteNumber(uint64(floor(num)));
|
||||
SafeWriteChar('.');
|
||||
num -= floor(num);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
num *= 10;
|
||||
int digit = int(floor(num));
|
||||
SafeWriteChar('0' + digit);
|
||||
num -= digit;
|
||||
}
|
||||
return ReportHeaderWriter();
|
||||
}
|
||||
|
||||
const char *ReportHeaderBytes() {
|
||||
return Bytes.data();
|
||||
}
|
||||
|
||||
int ReportHeaderLength() {
|
||||
return Length;
|
||||
}
|
||||
|
||||
} // namespace base::details
|
||||
Reference in New Issue
Block a user