crash_report_header.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #include "base/crash_report_header.h"
  8. namespace base::details {
  9. namespace {
  10. std::array<char, kReportHeaderSizeLimit> Bytes;
  11. int Length = 0;
  12. void SafeWriteChar(char ch) {
  13. if (Length < kReportHeaderSizeLimit) {
  14. Bytes[Length++] = ch;
  15. }
  16. }
  17. template <typename Type>
  18. void SafeWriteNumber(Type number) {
  19. if constexpr (Type(-1) < Type(0)) {
  20. if (number < 0) {
  21. SafeWriteChar('-');
  22. number = -number;
  23. }
  24. }
  25. Type upper = 1, prev = number / 10;
  26. while (prev >= upper) {
  27. upper *= 10;
  28. }
  29. while (upper > 0) {
  30. int digit = (number / upper);
  31. SafeWriteChar('0' + digit);
  32. number -= digit * upper;
  33. upper /= 10;
  34. }
  35. }
  36. } // namespace
  37. ReportHeaderWriter operator<<(ReportHeaderWriter, const char *str) {
  38. if (str) {
  39. while (const auto ch = *str++) {
  40. SafeWriteChar(ch);
  41. }
  42. }
  43. return ReportHeaderWriter();
  44. }
  45. ReportHeaderWriter operator<<(ReportHeaderWriter, const wchar_t *str) {
  46. for (int i = 0, l = wcslen(str); i < l; ++i) {
  47. if (
  48. #if !defined(__WCHAR_UNSIGNED__)
  49. str[i] >= 0 &&
  50. #endif
  51. str[i] < 128) {
  52. SafeWriteChar(char(str[i]));
  53. } else {
  54. SafeWriteChar('?');
  55. }
  56. }
  57. return ReportHeaderWriter();
  58. }
  59. ReportHeaderWriter operator<<(ReportHeaderWriter, int num) {
  60. SafeWriteNumber(num);
  61. return ReportHeaderWriter();
  62. }
  63. ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned int num) {
  64. SafeWriteNumber(num);
  65. return ReportHeaderWriter();
  66. }
  67. ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned long num) {
  68. SafeWriteNumber(num);
  69. return ReportHeaderWriter();
  70. }
  71. ReportHeaderWriter operator<<(ReportHeaderWriter, unsigned long long num) {
  72. SafeWriteNumber(num);
  73. return ReportHeaderWriter();
  74. }
  75. ReportHeaderWriter operator<<(ReportHeaderWriter, double num) {
  76. if (num < 0) {
  77. SafeWriteChar('-');
  78. num = -num;
  79. }
  80. SafeWriteNumber(uint64(floor(num)));
  81. SafeWriteChar('.');
  82. num -= floor(num);
  83. for (int i = 0; i < 4; ++i) {
  84. num *= 10;
  85. int digit = int(floor(num));
  86. SafeWriteChar('0' + digit);
  87. num -= digit;
  88. }
  89. return ReportHeaderWriter();
  90. }
  91. const char *ReportHeaderBytes() {
  92. return Bytes.data();
  93. }
  94. int ReportHeaderLength() {
  95. return Length;
  96. }
  97. } // namespace base::details