Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r63099 - in branches/filesystem3: boost/io libs/filesystem/v3/test libs/io/doc
From: bdawes_at_[hidden]
Date: 2010-06-19 09:25:55


Author: bemandawes
Date: 2010-06-19 09:25:55 EDT (Sat, 19 Jun 2010)
New Revision: 63099
URL: http://svn.boost.org/trac/boost/changeset/63099

Log:
Cope with I/O errors or premature eof
Text files modified:
   branches/filesystem3/boost/io/quoted_manip.hpp | 10 +++++++++-
   branches/filesystem3/libs/filesystem/v3/test/quote_string_test.cpp | 9 +++++----
   branches/filesystem3/libs/io/doc/quoted_manip.html | 20 +++++++++++++-------
   3 files changed, 27 insertions(+), 12 deletions(-)

Modified: branches/filesystem3/boost/io/quoted_manip.hpp
==============================================================================
--- branches/filesystem3/boost/io/quoted_manip.hpp (original)
+++ branches/filesystem3/boost/io/quoted_manip.hpp 2010-06-19 09:25:55 EDT (Sat, 19 Jun 2010)
@@ -13,7 +13,9 @@
 #define BOOST_IO_QUOTED_MANIP
 
 #include <iosfwd>
+#include <ios>
 #include <string>
+#include <iterator>
 #include <boost/io/ios_state.hpp>
 
 namespace boost
@@ -130,11 +132,17 @@
         {
           boost::io::ios_flags_saver ifs(is);
           is >> std::noskipws;
- for (;;)
+ for (;;)
           {
             is >> c;
+ if (!is.good()) // cope with I/O errors or end-of-file
+ break;
             if (c == proxy.escape)
+ {
               is >> c;
+ if (!is.good()) // cope with I/O errors or end-of-file
+ break;
+ }
             else if (c == proxy.delim)
               break;
             proxy.string += c;

Modified: branches/filesystem3/libs/filesystem/v3/test/quote_string_test.cpp
==============================================================================
--- branches/filesystem3/libs/filesystem/v3/test/quote_string_test.cpp (original)
+++ branches/filesystem3/libs/filesystem/v3/test/quote_string_test.cpp 2010-06-19 09:25:55 EDT (Sat, 19 Jun 2010)
@@ -9,10 +9,7 @@
 {
 
   std::cout << quoted(std::string("foo\\bar, \" *")) << std::endl;
- std::cout << quoted("foo\\bar, \" *") << std::endl;
- std::cout << quoted("foo & bar, \" *", '&') << std::endl;
- std::cout << quoted("foo & bar, * ", '&', '*') << std::endl;
-
+ std::cout << quoted("'Jack & Jill'", '&', '\'') << '\n'; // outputs: '&'Jack && Jill&''
   std::wcout << "Wide: " << quoted(L"foo$bar, \" *", L'$') << std::endl;
 
   std::string non_const_string("non-const string");
@@ -32,6 +29,10 @@
 
   assert(expected == actual);
 
+ ss << "\"abc"; // note missing end delimiter
+ ss >> quoted(actual);
+ std::cout << '*' << actual << "*\n";
+
   // these should fail to compile because the arguments are non-const:
   // ss >> quoted(expected);
   // ss >> quoted("foo");

Modified: branches/filesystem3/libs/io/doc/quoted_manip.html
==============================================================================
--- branches/filesystem3/libs/io/doc/quoted_manip.html (original)
+++ branches/filesystem3/libs/io/doc/quoted_manip.html 2010-06-19 09:25:55 EDT (Sat, 19 Jun 2010)
@@ -4,7 +4,7 @@
 <html>
 <head>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
- <title>Boost quoted string manipulator</title>
+ <title>Boost &quot;quoted&quot; I/O manipulator</title>
   <meta name="generator" content="Microsoft FrontPage 5.0" />
   <link rel="stylesheet" type="text/css" href="../../../doc/html/minimal.css" />
 </head>
@@ -19,9 +19,9 @@
         src="../../../boost.png" alt="boost.png (6897 bytes)" align="middle"
         width="300" height="86" border="0" /></a></td>
       <td>
- <h1 align="center">Quoted String<br>
- Stream
- I/O Manipulator</h1>
+ <h1 align="center">&quot;Quoted&quot;
+ I/O Manipulator<br>
+ for Strings</h1>
       </td>
     </tr>
   </tbody>
@@ -43,7 +43,7 @@
 
 assert(original == round_trip); // assert will fire</pre>
 </blockquote>
-<p>The Boost quoted string stream I/O manipulator places delimiters, defaulted
+<p>The Boost <code>quoted</code> stream I/O manipulator places delimiters, defaulted
 to the double-quote (<code>&quot;</code>), around strings on output, and strips off
 the delimiters on input. This ensures strings with embedded spaces round-trip as
 desired. For example,</p>
@@ -60,6 +60,11 @@
 
 assert(original == round_trip); // assert will not fire</pre>
 </blockquote>
+<p>If the string contains the delimiter character, on output that character will
+be preceded by an escape character, as will the escape character itself:</p>
+<blockquote>
+ <pre>std::cout &lt;&lt; quoted(&quot;'Jack &amp; Jill'&quot;, '&amp;', '\''); // outputs: '&amp;'Jack &amp;&amp; Jill&amp;''</pre>
+</blockquote>
 <h2>Header &lt;boost/io/quoted_manip.hpp&gt; synopsis</h2>
 <pre>namespace boost
 {
@@ -113,7 +118,8 @@
     <code>operator==</code>, then:<ul>
       <li>Turn off the <code>skipws</code> flag.</li>
       <li><code>string.clear()</code></li>
- <li>Until an unescaped <code>delim</code> character is reached, extract
+ <li>Until an unescaped <code>delim</code> character is reached or <code>
+ is.not_good()</code>, extract
       characters from <code>os</code> and append them to <code>string</code>,
       except that if an <code>escape</code> is reached, ignore it and append the
       next character to <code>string</code>.</li>
@@ -139,7 +145,7 @@
 <p>Distributed under the Boost Software License, Version 1.0. See
 <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->18 June 2010<!--webbot bot="Timestamp" endspan i-checksum="17559" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->19 June 2010<!--webbot bot="Timestamp" endspan i-checksum="17561" --></p>
 
 </body>
 </html>
\ No newline at end of file


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk