[GIT] ppl/ppl(master): Bug fix: ostringstream.str() returns a temporary.

Module: ppl/ppl Branch: master Commit: 0b1464817aa9d7c28687d32705cb4fb157b06efe URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=0b1464817aa9d...
Author: Abramo Bagnara abramo.bagnara@gmail.com Date: Mon Mar 23 19:42:46 2009 +0100
Bug fix: ostringstream.str() returns a temporary.
---
src/c_stream.cc | 32 +++++++++++++++++--------------- src/c_stream.h | 2 +- src/c_streambuf_format.cc | 7 +++++-- 3 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/src/c_stream.cc b/src/c_stream.cc index ab2d8aa..0c25bbb 100644 --- a/src/c_stream.cc +++ b/src/c_stream.cc @@ -1,4 +1,5 @@ #include <cstdio> +#include <cstring> #include <iostream> #include <sstream> #include "stdiobuf.defs.hh" @@ -33,18 +34,18 @@ ppl_io_format_settings ppl_io_format_default_settings = { 0, // bottom { // length, left, right, alignment, fill_char - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FIRST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FIRSTLAST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // NEXT - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LAST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FORCED_FIRST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FORCED_NEXT - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_FIRST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_FIRSTLAST - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_NEXT - { 80, "", "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_LAST - { 80, "", "", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // UNTERMINATED_FIRST - { 80, "", "", PPL_IO_FORMAT_ALIGN_LEFT, 0 } // UNTERMINATED_NEXT + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FIRST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FIRSTLAST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // NEXT + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LAST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FORCED_FIRST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // FORCED_NEXT + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_FIRST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_FIRSTLAST + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_NEXT + { 80, 0, "\n", PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // LONGER_LAST + { 80, 0, 0, PPL_IO_FORMAT_ALIGN_LEFT, 0 }, // UNTERMINATED_FIRST + { 80, 0, 0, PPL_IO_FORMAT_ALIGN_LEFT, 0 } // UNTERMINATED_NEXT } };
@@ -78,10 +79,11 @@ void ppl_io_ostream_format_replace_settings(ppl_io_ostream* stream, ppl_io_forma static_cast<c_streambuf_format*>(stream->sbuf)->replace_settings(settings); }
-size_t ppl_io_ostream_buffer_get(struct ppl_io_ostream* s, const char **buf) { +size_t ppl_io_ostream_buffer_get(struct ppl_io_ostream* s, char **buf) { std::ostringstream* ss = static_caststd::ostringstream*(s->stream); - *buf = ss->str().c_str(); - return ss->str().size(); + std::string str = ss->str(); + *buf = strdup(str.c_str()); + return str.size(); }
void ppl_io_ostream_buffer_clear(struct ppl_io_ostream* s) { diff --git a/src/c_stream.h b/src/c_stream.h index b0bb5eb..d54d532 100644 --- a/src/c_stream.h +++ b/src/c_stream.h @@ -60,7 +60,7 @@ struct ppl_io_ostream* ppl_io_ostream_format_new(struct ppl_io_ostream* stream, void ppl_io_ostream_format_replace_settings(struct ppl_io_ostream* stream, struct ppl_io_format_settings* settings);
void ppl_io_ostream_delete(struct ppl_io_ostream* stream); -size_t ppl_io_ostream_buffer_get(struct ppl_io_ostream* stream, const char** buf); +size_t ppl_io_ostream_buffer_get(struct ppl_io_ostream* stream, char** buf); void ppl_io_ostream_buffer_clear(struct ppl_io_ostream* stream);
int ppl_io_write_endl(struct ppl_io_ostream* s); diff --git a/src/c_streambuf_format.cc b/src/c_streambuf_format.cc index 3325dff..96b9a64 100644 --- a/src/c_streambuf_format.cc +++ b/src/c_streambuf_format.cc @@ -124,6 +124,7 @@ int c_streambuf_format::cb_flush() { if (n > 0) { if (!output_line(str.c_str(), n, first ? PPL_IO_FORMAT_LINE_UNTERMINATED_FIRST : PPL_IO_FORMAT_LINE_UNTERMINATED_NEXT)) return -1; + str.clear(); } return 0; } @@ -142,7 +143,8 @@ bool c_streambuf_format::output_line(const char *s, unsigned int n, ppl_io_forma default: break; } - stream << settings->lines[type].left; + if (settings->lines[type].left) + stream << settings->lines[type].left; if (settings->lines[type].fill_char && n < settings->lines[type].length) { unsigned int left = 0; unsigned int right = 0; @@ -158,7 +160,8 @@ bool c_streambuf_format::output_line(const char *s, unsigned int n, ppl_io_forma } else stream.write(s, n); - stream << settings->lines[type].right; + if (settings->lines[type].right) + stream << settings->lines[type].right; switch (type) { case PPL_IO_FORMAT_LINE_FIRSTLAST: case PPL_IO_FORMAT_LINE_LAST:
participants (1)
-
Abramo Bagnara