diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 15fa3e8f6..fa490a9e1 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -557,7 +557,7 @@ private: }; bool needsEscaping(const rdcstr &name); -rdcstr escapeString(rdcstr str); +rdcstr escapeString(const rdcstr &str); rdcstr escapeStringIfNeeded(const rdcstr &name); }; // namespace DXIL diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 4f2e13fdf..71290c5b6 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -32,29 +32,30 @@ namespace DXIL bool needsEscaping(const rdcstr &name) { return name.find_first_not_of( - "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$._0123456789") >= 0; + "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789") >= 0; } -rdcstr escapeString(rdcstr str) +rdcstr escapeString(const rdcstr &str) { + rdcstr ret; + ret.push_back('"'); + for(size_t i = 0; i < str.size(); i++) { - if(str[i] == '\'' || str[i] == '\\') + if(str[i] == '\r' || str[i] == '\n' || str[i] == '\t' || str[i] == '"' || str[i] == '\\' || + !isprint(str[i])) { - str.insert(i, "\\", 1); - i++; - } - else if(str[i] == '\r' || str[i] == '\n' || str[i] == '\t' || !isprint(str[i])) - { - str.insert(i + 1, StringFormat::Fmt("%02X", str[i])); - str[i] = '\\'; + ret.push_back('\\'); + ret.append(StringFormat::Fmt("%02X", (unsigned char)str[i])); + continue; } + + ret.push_back(str[i]); } - str.push_back('"'); - str.insert(0, '"'); + ret.push_back('"'); - return str; + return ret; } rdcstr escapeStringIfNeeded(const rdcstr &name)