jkorous-apple added a comment. I am sorry I wasn't really clear. What I meant was to do something like this (pseudo-code, dealing only with newlines):
if( Str.size() == 0) return; // Calculate all the extra space needed first. typename T::size_type extra_space = 0; bool previous_char_was_endline = false; for(const auto ch : Str) { if( ch == '\n' || ch == '\r' ) { if( !previous_char_was_endline ) ++extra_space; previous_char_was_endline = true; } else { previous_char_was_endline = false; } } if (extra_space == 0) return; // Resize the string. const typename T::size_type original_size = Str.size(); Str.resize(original_size + extra_space); // Iterate backwards and move characters as needed. bool is_in_block_of_endlines = false; for(typename T::size_type i = original_size - 1; i > 0; --i) { if( Str[i] == '\n' || Str[i] == '\r' ) { if (!is_in_block_of_endlines) { Str[i + extra_space - 1] = '\\'; Str[i + extra_space] = 'n'; --extra_space; if(extra_space == 0) return; // early exit - no more characters need to be moved } is_in_block_of_endlines = true; } else { Str[i + extra_space] = Str[i]; is_in_block_of_endlines = false; } } This is just a suggestion, it is a bit more complicated but should be O(lenght_of_string) whereas your solution is a bit more straightforward but is more like O(length_of_string * number_of_endlines_in_string). I leave it up to you what is better here. If you decide to go this way, please assume my pseudocode is buggy and don't rely on it. https://reviews.llvm.org/D39279 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits