From 003482a7b710e3925952165fe9e453021f59370c Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Sat, 13 May 2017 19:34:00 +0100 Subject: [PATCH] MetaChar: use std::stringstream for incremental escaped-string construction This avoids the use of lower-level snprintf. --- src/ansi-c/c_misc.cpp | 49 ++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/ansi-c/c_misc.cpp b/src/ansi-c/c_misc.cpp index 5b1913bdf05..242bf616a4e 100644 --- a/src/ansi-c/c_misc.cpp +++ b/src/ansi-c/c_misc.cpp @@ -11,81 +11,72 @@ Author: Daniel Kroening, kroening@kroening.com #include "c_misc.h" -#include +#include -#ifdef _WIN32 -#ifndef __MINGW32__ -#define snprintf sprintf_s -#endif -#endif - -static void MetaChar(std::string &out, char c, bool inString) +static void MetaChar(std::ostringstream &out, char c, bool inString) { switch(c) { case '\'': if(inString) - out+="'"; + out << "'"; else - out+="\\'"; + out << "\\'"; break; case '"': if(inString) - out+="\\\""; + out << "\\\""; else - out+="\""; + out << "\""; break; case '\0': - out+="\\0"; + out << "\\0"; break; case '\\': - out+="\\\\"; + out << "\\\\"; break; case '\n': - out+="\\n"; + out << "\\n"; break; case '\t': - out+="\\t"; + out << "\\t"; break; case '\r': - out+="\\r"; + out << "\\r"; break; case '\f': - out+="\\f"; + out << "\\f"; break; case '\b': - out+="\\b"; + out << "\\b"; break; case '\v': - out+="\\v"; + out << "\\v"; break; case '\a': - out+="\\a"; + out << "\\a"; break; default: // Show low and certain high ascii as octal - if(((unsigned char)c < ' ') || (c == 127)) + if((static_cast(c)<' ') || (c==127)) { - char octbuf[8]; - snprintf(octbuf, sizeof(octbuf), "%03o", (unsigned char) c); - out+="\\"; - out+=octbuf; + out << "\\" << std::oct << static_cast(c); } else { // leave everything else to permit UTF-8 and 8-bit codepages - out+=c; + out << c; } break; @@ -103,10 +94,10 @@ static std::string MetaChar(char c) std::string MetaString(const std::string &in) { - std::string result; + std::ostringstream result; for(const auto &ch : in) MetaChar(result, ch, true); - return result; + return result.str(); }