Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 6424 for code/trunk


Ignore:
Timestamp:
Dec 27, 2009, 2:28:28 AM (15 years ago)
Author:
rgrieder
Message:

Fixed a bug in removeSlashes: An escape sequence at the third and second to last position was not handled correctly. Example: "
aa" was transformed to "\a" instead of "\aa"
Also almost doubled removeSlashes and removeSlashes performance.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/libraries/util/StringUtils.cc

    r6417 r6424  
    292292    std::string addSlashes(const std::string& str)
    293293    {
    294         std::string output = str;
    295 
    296         for (size_t pos = 0; (pos = output.find('\\', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\\\"); }
    297         for (size_t pos = 0; (pos = output.find('\n', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\n"); }
    298         for (size_t pos = 0; (pos = output.find('\t', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\t"); }
    299         for (size_t pos = 0; (pos = output.find('\v', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\v"); }
    300         for (size_t pos = 0; (pos = output.find('\b', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\b"); }
    301         for (size_t pos = 0; (pos = output.find('\r', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\r"); }
    302         for (size_t pos = 0; (pos = output.find('\f', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\f"); }
    303         for (size_t pos = 0; (pos = output.find('\a', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\a"); }
    304         for (size_t pos = 0; (pos = output.find('"' , pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\\""); }
    305         for (size_t pos = 0; (pos = output.find('\0', pos)) < std::string::npos; pos += 2) { output.replace(pos, 1, "\\0"); }
     294        std::string output(str.size() * 2, ' ');
     295        size_t i = 0;
     296        for (size_t pos = 0; pos < str.size(); ++pos)
     297        {
     298            switch (str[pos])
     299            {
     300            case '\\': output[i] = '\\'; output[i + 1] = '\\'; break;
     301            case '\n': output[i] = '\\'; output[i + 1] =  'n'; break;
     302            case '\t': output[i] = '\\'; output[i + 1] =  't'; break;
     303            case '\v': output[i] = '\\'; output[i + 1] =  'v'; break;
     304            case '\b': output[i] = '\\'; output[i + 1] =  'b'; break;
     305            case '\r': output[i] = '\\'; output[i + 1] =  'r'; break;
     306            case '\f': output[i] = '\\'; output[i + 1] =  'f'; break;
     307            case '\a': output[i] = '\\'; output[i + 1] =  'a'; break;
     308            case  '"': output[i] = '\\'; output[i + 1] =  '"'; break;
     309            case '\0': output[i] = '\\'; output[i + 1] =  '0'; break;
     310            default  : output[i] = str[pos]; ++i; continue;
     311            }
     312            i += 2;
     313        }
     314        output.resize(i);
    306315
    307316        return output;
     
    318327            return str;
    319328
    320         std::string output;
    321         for (size_t pos = 0; pos < str.size() - 1; )
     329        std::string output(str.size(), ' ');
     330        size_t i = 0;
     331        size_t pos = 0;
     332        while (pos < str.size() - 1)
    322333        {
    323334            if (str[pos] == '\\')
    324335            {
    325                 if (str[pos + 1] == '\\') { output += '\\'; pos += 2; continue; }
    326                 else if (str[pos + 1] == 'n') { output += '\n'; pos += 2; continue; }
    327                 else if (str[pos + 1] == 't') { output += '\t'; pos += 2; continue; }
    328                 else if (str[pos + 1] == 'v') { output += '\v'; pos += 2; continue; }
    329                 else if (str[pos + 1] == 'b') { output += '\b'; pos += 2; continue; }
    330                 else if (str[pos + 1] == 'r') { output += '\r'; pos += 2; continue; }
    331                 else if (str[pos + 1] == 'f') { output += '\f'; pos += 2; continue; }
    332                 else if (str[pos + 1] == 'a') { output += '\a'; pos += 2; continue; }
    333                 else if (str[pos + 1] == '"') { output += '"'; pos += 2; continue; }
    334                 else if (str[pos + 1] == '0') { output += '\0'; pos += 2; continue; }
     336                switch (str[pos + 1])
     337                {
     338                case '\\': output[i] = '\\'; break;
     339                case  'n': output[i] = '\n'; break;
     340                case  't': output[i] = '\t'; break;
     341                case  'v': output[i] = '\v'; break;
     342                case  'b': output[i] = '\b'; break;
     343                case  'r': output[i] = '\r'; break;
     344                case  'f': output[i] = '\f'; break;
     345                case  'a': output[i] = '\a'; break;
     346                case  '"': output[i] =  '"'; break;
     347                case  '0': output[i] = '\0'; break;
     348                default: ++pos; continue;
     349                }
     350                pos += 2; ++i;
    335351            }
    336             output += str[pos];
    337             pos++;
    338             if (pos == str.size() - 1)
    339                 output += str[pos];
    340         }
     352            else
     353                output[i++] = str[pos++];
     354        }
     355        if (pos < str.size())
     356            output[i++] = str[pos];
     357        output.resize(i);
    341358
    342359        return output;
Note: See TracChangeset for help on using the changeset viewer.