Revert "builtin string: push_back \n chars rather than append strings"

This reverts commit 3739c53bcf.

It misses the point of e69be38235 and reintroduces a lot of write calls.

See #9229
This commit is contained in:
Fabian Boehm
2022-11-07 22:37:53 +01:00
parent 3739c53bcf
commit 311e1aa968

View File

@@ -711,11 +711,12 @@ static int string_escape(parser_t &parser, io_streams_t &streams, int argc, cons
flags |= ESCAPE_NO_QUOTED; flags |= ESCAPE_NO_QUOTED;
} }
int nesc; int nesc = 0;
arg_iterator_t aiter(argv, optind, streams); arg_iterator_t aiter(argv, optind, streams);
for (nesc = 0; const wcstring *arg = aiter.nextstr(); nesc++) { while (const wcstring *arg = aiter.nextstr()) {
streams.out.append(escape_string(*arg, flags, opts.escape_style)); wcstring sep = aiter.want_newline() ? L"\n" : L"";
if (aiter.want_newline()) streams.out.push_back(L'\n'); streams.out.append(escape_string(*arg, flags, opts.escape_style) + sep);
nesc++;
} }
return nesc > 0 ? STATUS_CMD_OK : STATUS_CMD_ERROR; return nesc > 0 ? STATUS_CMD_OK : STATUS_CMD_ERROR;
@@ -737,9 +738,9 @@ static int string_unescape(parser_t &parser, io_streams_t &streams, int argc,
arg_iterator_t aiter(argv, optind, streams); arg_iterator_t aiter(argv, optind, streams);
while (const wcstring *arg = aiter.nextstr()) { while (const wcstring *arg = aiter.nextstr()) {
wcstring result; wcstring result;
wcstring sep = aiter.want_newline() ? L"\n" : L"";
if (unescape_string(*arg, &result, flags, opts.escape_style)) { if (unescape_string(*arg, &result, flags, opts.escape_style)) {
streams.out.append(result); streams.out.append(result + sep);
if (aiter.want_newline()) streams.out.push_back(L'\n');
nesc++; nesc++;
} }
} }
@@ -817,8 +818,7 @@ static int string_length(parser_t &parser, io_streams_t &streams, int argc, cons
nnonempty++; nnonempty++;
} }
if (!opts.quiet) { if (!opts.quiet) {
streams.out.append(to_string(max)); streams.out.append(to_string(max) + L"\n");
streams.out.push_back(L'\n');
} else if (nnonempty > 0) { } else if (nnonempty > 0) {
return STATUS_CMD_OK; return STATUS_CMD_OK;
} }
@@ -829,8 +829,7 @@ static int string_length(parser_t &parser, io_streams_t &streams, int argc, cons
nnonempty++; nnonempty++;
} }
if (!opts.quiet) { if (!opts.quiet) {
streams.out.append(to_string(n)); streams.out.append(to_string(n) + L"\n");
streams.out.push_back(L'\n');
} else if (nnonempty > 0) { } else if (nnonempty > 0) {
return STATUS_CMD_OK; return STATUS_CMD_OK;
} }
@@ -896,8 +895,7 @@ class wildcard_matcher_t final : public string_matcher_t {
if (opts.index) { if (opts.index) {
streams.out.append_format(L"1 %lu\n", arg.length()); streams.out.append_format(L"1 %lu\n", arg.length());
} else { } else {
streams.out.append(arg); streams.out.append(arg + L"\n");
streams.out.push_back(L'\n');
} }
} }
} }
@@ -978,11 +976,10 @@ class regex_matcher_t final : public string_matcher_t {
if (!mrange.has_value()) { if (!mrange.has_value()) {
if (opts.invert_match && !opts.quiet) { if (opts.invert_match && !opts.quiet) {
if (opts.index) { if (opts.index) {
streams.out.append_format(L"1 %lu", arg.length()); streams.out.append_format(L"1 %lu\n", arg.length());
} else { } else {
streams.out.append(arg); streams.out.append(arg + L"\n");
} }
streams.out.push_back(L'\n');
} }
return opts.invert_match ? match_result_t::match : match_result_t::no_match; return opts.invert_match ? match_result_t::match : match_result_t::no_match;
@@ -991,8 +988,7 @@ class regex_matcher_t final : public string_matcher_t {
} }
if (opts.entire && !opts.quiet) { if (opts.entire && !opts.quiet) {
streams.out.append(arg); streams.out.append(arg + L"\n");
streams.out.push_back(L'\n');
} }
// If we have groups-only, we skip the first match, which is the full one. // If we have groups-only, we skip the first match, which is the full one.
@@ -1001,11 +997,10 @@ class regex_matcher_t final : public string_matcher_t {
maybe_t<match_range_t> cg = this->regex_.group(match_data_, j); maybe_t<match_range_t> cg = this->regex_.group(match_data_, j);
if (cg.has_value() && !opts.quiet) { if (cg.has_value() && !opts.quiet) {
if (opts.index) { if (opts.index) {
streams.out.append_format(L"%lu %lu", cg->begin + 1, cg->end - cg->begin); streams.out.append_format(L"%lu %lu\n", cg->begin + 1, cg->end - cg->begin);
} else { } else {
streams.out.append(arg.substr(cg->begin, cg->end - cg->begin)); streams.out.append(arg.substr(cg->begin, cg->end - cg->begin) + L"\n");
} }
streams.out.push_back(L'\n');
} }
} }
@@ -1173,8 +1168,10 @@ static int string_pad(parser_t &parser, io_streams_t &streams, int argc, const w
padded.append(pad, opts.char_to_pad); padded.append(pad, opts.char_to_pad);
} }
} }
if (aiter_width.want_newline()) {
padded.push_back(L'\n');
}
streams.out.append(padded); streams.out.append(padded);
if (aiter_width.want_newline()) streams.out.push_back(L'\n');
} }
return STATUS_CMD_OK; return STATUS_CMD_OK;
@@ -1281,8 +1278,8 @@ bool literal_replacer_t::replace_matches(const wcstring &arg, bool want_newline)
} }
if (!opts.quiet && (!opts.filter || replacement_occurred)) { if (!opts.quiet && (!opts.filter || replacement_occurred)) {
streams.out.append(result); wcstring sep = want_newline ? L"\n" : L"";
if (want_newline) streams.out.push_back(L'\n'); streams.out.append(result + sep);
} }
return true; return true;
@@ -1309,8 +1306,8 @@ bool regex_replacer_t::replace_matches(const wcstring &arg, bool want_newline) {
} else { } else {
bool replacement_occurred = repl_count > 0; bool replacement_occurred = repl_count > 0;
if (!opts.quiet && (!opts.filter || replacement_occurred)) { if (!opts.quiet && (!opts.filter || replacement_occurred)) {
streams.out.append(*result); wcstring sep = want_newline ? L"\n" : L"";
if (want_newline) streams.out.push_back(L'\n'); streams.out.append(*result + sep);
} }
total_replaced += repl_count; total_replaced += repl_count;
} }
@@ -1518,7 +1515,7 @@ static int string_repeat(parser_t &parser, io_streams_t &streams, int argc, cons
} }
if (!first && !opts.quiet) { if (!first && !opts.quiet) {
streams.out.push_back(L'\n'); streams.out.append(L'\n');
} }
first = false; first = false;
@@ -1577,7 +1574,7 @@ static int string_repeat(parser_t &parser, io_streams_t &streams, int argc, cons
// Historical behavior is to never append a newline if all strings were empty. // Historical behavior is to never append a newline if all strings were empty.
if (!opts.quiet && !opts.no_newline && !all_empty && aiter.want_newline()) { if (!opts.quiet && !opts.no_newline && !all_empty && aiter.want_newline()) {
streams.out.push_back(L'\n'); streams.out.append(L'\n');
} }
return all_empty ? STATUS_CMD_ERROR : STATUS_CMD_OK; return all_empty ? STATUS_CMD_ERROR : STATUS_CMD_OK;
@@ -1608,6 +1605,7 @@ static int string_sub(parser_t &parser, io_streams_t &streams, int argc, const w
using size_type = wcstring::size_type; using size_type = wcstring::size_type;
size_type pos = 0; size_type pos = 0;
size_type count = wcstring::npos; size_type count = wcstring::npos;
wcstring sep = aiter.want_newline() ? L"\n" : L"";
if (opts.start > 0) { if (opts.start > 0) {
pos = static_cast<size_type>(opts.start - 1); pos = static_cast<size_type>(opts.start - 1);
@@ -1637,8 +1635,7 @@ static int string_sub(parser_t &parser, io_streams_t &streams, int argc, const w
// Note that std::string permits count to extend past end of string. // Note that std::string permits count to extend past end of string.
if (!opts.quiet) { if (!opts.quiet) {
streams.out.append(s->substr(pos, count)); streams.out.append(s->substr(pos, count) + sep);
if (aiter.want_newline()) streams.out.push_back(L'\n');
} }
nsub++; nsub++;
if (opts.quiet) return STATUS_CMD_OK; if (opts.quiet) return STATUS_CMD_OK;
@@ -1679,8 +1676,7 @@ static int string_shorten(parser_t &parser, io_streams_t &streams, int argc, con
// echo whatever // echo whatever
// end // end
while (const wcstring *arg = aiter_width.nextstr()) { while (const wcstring *arg = aiter_width.nextstr()) {
streams.out.append(*arg); streams.out.append(*arg + L"\n");
streams.out.push_back(L'\n');
} }
return STATUS_CMD_ERROR; return STATUS_CMD_ERROR;
} }
@@ -1765,14 +1761,12 @@ static int string_shorten(parser_t &parser, io_streams_t &streams, int argc, con
} }
if (pos == 0) { if (pos == 0) {
streams.out.append(line); streams.out.append(line + L"\n");
streams.out.push_back(L'\n');
} else { } else {
// We have an ellipsis, construct our string and print it. // We have an ellipsis, construct our string and print it.
nsub++; nsub++;
out = ell + out; out = ell + out + L'\n';
streams.out.append(out); streams.out.append(out);
streams.out.push_back(L'\n');
} }
continue; continue;
} else { } else {
@@ -1810,12 +1804,13 @@ static int string_shorten(parser_t &parser, io_streams_t &streams, int argc, con
} }
if (pos == line.size()) { if (pos == line.size()) {
streams.out.append(line); streams.out.append(line + L"\n");
streams.out.push_back(L'\n');
} else { } else {
nsub++; nsub++;
streams.out.append(wcstring(line.substr(0, pos) + ell)); wcstring newl = line.substr(0, pos);
streams.out.push_back(L'\n'); newl.append(ell);
newl.push_back(L'\n');
streams.out.append(newl);
} }
} }
@@ -1842,6 +1837,7 @@ static int string_trim(parser_t &parser, io_streams_t &streams, int argc, const
arg_iterator_t aiter(argv, optind, streams); arg_iterator_t aiter(argv, optind, streams);
while (const wcstring *arg = aiter.nextstr()) { while (const wcstring *arg = aiter.nextstr()) {
wcstring sep = aiter.want_newline() ? L"\n" : L"";
// Begin and end are respectively the first character to keep on the left, and first // Begin and end are respectively the first character to keep on the left, and first
// character to trim on the right. The length is thus end - start. // character to trim on the right. The length is thus end - start.
size_t begin = 0, end = arg->size(); size_t begin = 0, end = arg->size();
@@ -1856,8 +1852,7 @@ static int string_trim(parser_t &parser, io_streams_t &streams, int argc, const
assert(begin <= end && end <= arg->size()); assert(begin <= end && end <= arg->size());
ntrim += arg->size() - (end - begin); ntrim += arg->size() - (end - begin);
if (!opts.quiet) { if (!opts.quiet) {
streams.out.append(wcstring(*arg, begin, end - begin)); streams.out.append(wcstring(*arg, begin, end - begin) + sep);
if (aiter.want_newline()) streams.out.push_back(L'\n');
} else if (ntrim > 0) { } else if (ntrim > 0) {
return STATUS_CMD_OK; return STATUS_CMD_OK;
} }
@@ -1882,8 +1877,8 @@ static int string_transform(parser_t &parser, io_streams_t &streams, int argc, c
std::transform(transformed.begin(), transformed.end(), transformed.begin(), func); std::transform(transformed.begin(), transformed.end(), transformed.begin(), func);
if (transformed != *arg) n_transformed++; if (transformed != *arg) n_transformed++;
if (!opts.quiet) { if (!opts.quiet) {
streams.out.append(transformed); wcstring sep = aiter.want_newline() ? L"\n" : L"";
if (aiter.want_newline()) streams.out.push_back(L'\n'); streams.out.append(transformed + sep);
} else if (n_transformed > 0) { } else if (n_transformed > 0) {
return STATUS_CMD_OK; return STATUS_CMD_OK;
} }