diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/logging/backend.cpp | 11 | ||||
| -rw-r--r-- | src/common/logging/backend.h | 14 | ||||
| -rw-r--r-- | src/common/string_util.cpp | 57 | ||||
| -rw-r--r-- | src/common/string_util.h | 33 | ||||
| -rw-r--r-- | src/common/telemetry.h | 4 | 
5 files changed, 29 insertions, 90 deletions
| diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 6d5218465..5753b871a 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -12,7 +12,8 @@  #include <thread>  #include <vector>  #ifdef _WIN32 -#include <share.h> // For _SH_DENYWR +#include <share.h>   // For _SH_DENYWR +#include <windows.h> // For OutputDebugStringA  #else  #define _SH_DENYWR 0  #endif @@ -139,12 +140,18 @@ void FileBackend::Write(const Entry& entry) {      if (!file.IsOpen() || bytes_written > MAX_BYTES_WRITTEN) {          return;      } -    bytes_written += file.WriteString(FormatLogMessage(entry) + '\n'); +    bytes_written += file.WriteString(FormatLogMessage(entry).append(1, '\n'));      if (entry.log_level >= Level::Error) {          file.Flush();      }  } +void DebuggerBackend::Write(const Entry& entry) { +#ifdef _WIN32 +    ::OutputDebugStringA(FormatLogMessage(entry).append(1, '\n').c_str()); +#endif +} +  /// Macro listing all log classes. Code should define CLS and SUB as desired before invoking this.  #define ALL_LOG_CLASSES()                                                                          \      CLS(Log)                                                                                       \ diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h index 11edbf1b6..91bb0c309 100644 --- a/src/common/logging/backend.h +++ b/src/common/logging/backend.h @@ -103,6 +103,20 @@ private:      std::size_t bytes_written;  }; +/** + * Backend that writes to Visual Studio's output window + */ +class DebuggerBackend : public Backend { +public: +    static const char* Name() { +        return "debugger"; +    } +    const char* GetName() const override { +        return Name(); +    } +    void Write(const Entry& entry) override; +}; +  void AddBackend(std::unique_ptr<Backend> backend);  void RemoveBackend(std::string_view backend_name); diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 731d1db34..14f7037d8 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -4,11 +4,10 @@  #include <algorithm>  #include <cctype> -#include <cerrno>  #include <codecvt> -#include <cstdio>  #include <cstdlib> -#include <cstring> +#include <locale> +#include <sstream>  #include "common/common_paths.h"  #include "common/logging/log.h"  #include "common/string_util.h" @@ -33,24 +32,6 @@ std::string ToUpper(std::string str) {      return str;  } -// For Debugging. Read out an u8 array. -std::string ArrayToString(const u8* data, std::size_t size, int line_len, bool spaces) { -    std::ostringstream oss; -    oss << std::setfill('0') << std::hex; - -    for (int line = 0; size; ++data, --size) { -        oss << std::setw(2) << (int)*data; - -        if (line_len == ++line) { -            oss << '\n'; -            line = 0; -        } else if (spaces) -            oss << ' '; -    } - -    return oss.str(); -} -  std::string StringFromBuffer(const std::vector<u8>& data) {      return std::string(data.begin(), std::find(data.begin(), data.end(), '\0'));  } @@ -75,40 +56,6 @@ std::string StripQuotes(const std::string& s) {          return s;  } -bool TryParse(const std::string& str, u32* const output) { -    char* endptr = nullptr; - -    // Reset errno to a value other than ERANGE -    errno = 0; - -    unsigned long value = strtoul(str.c_str(), &endptr, 0); - -    if (!endptr || *endptr) -        return false; - -    if (errno == ERANGE) -        return false; - -#if ULONG_MAX > UINT_MAX -    if (value >= 0x100000000ull && value <= 0xFFFFFFFF00000000ull) -        return false; -#endif - -    *output = static_cast<u32>(value); -    return true; -} - -bool TryParse(const std::string& str, bool* const output) { -    if ("1" == str || "true" == ToLower(str)) -        *output = true; -    else if ("0" == str || "false" == ToLower(str)) -        *output = false; -    else -        return false; - -    return true; -} -  std::string StringFromBool(bool value) {      return value ? "True" : "False";  } diff --git a/src/common/string_util.h b/src/common/string_util.h index 32bf6a19c..08f96533b 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -5,8 +5,6 @@  #pragma once  #include <cstddef> -#include <iomanip> -#include <sstream>  #include <string>  #include <vector>  #include "common/common_types.h" @@ -19,44 +17,13 @@ std::string ToLower(std::string str);  /// Make a string uppercase  std::string ToUpper(std::string str); -std::string ArrayToString(const u8* data, std::size_t size, int line_len = 20, bool spaces = true); -  std::string StringFromBuffer(const std::vector<u8>& data);  std::string StripSpaces(const std::string& s);  std::string StripQuotes(const std::string& s); -// Thousand separator. Turns 12345678 into 12,345,678 -template <typename I> -std::string ThousandSeparate(I value, int spaces = 0) { -    std::ostringstream oss; - -// std::locale("") seems to be broken on many platforms -#if defined _WIN32 || (defined __linux__ && !defined __clang__) -    oss.imbue(std::locale("")); -#endif -    oss << std::setw(spaces) << value; - -    return oss.str(); -} -  std::string StringFromBool(bool value); -bool TryParse(const std::string& str, bool* output); -bool TryParse(const std::string& str, u32* output); - -template <typename N> -static bool TryParse(const std::string& str, N* const output) { -    std::istringstream iss(str); - -    N tmp = 0; -    if (iss >> tmp) { -        *output = tmp; -        return true; -    } else -        return false; -} -  std::string TabsToSpaces(int tab_size, std::string in);  void SplitString(const std::string& str, char delim, std::vector<std::string>& output); diff --git a/src/common/telemetry.h b/src/common/telemetry.h index 8d6ab986b..854a73fae 100644 --- a/src/common/telemetry.h +++ b/src/common/telemetry.h @@ -153,6 +153,7 @@ struct VisitorInterface : NonCopyable {      /// Completion method, called once all fields have been visited      virtual void Complete() = 0; +    virtual bool SubmitTestcase() = 0;  };  /** @@ -178,6 +179,9 @@ struct NullVisitor : public VisitorInterface {      void Visit(const Field<std::chrono::microseconds>& /*field*/) override {}      void Complete() override {} +    bool SubmitTestcase() override { +        return false; +    }  };  /// Appends build-specific information to the given FieldCollection, | 
