2016-07-07 1:22 GMT+03:00 Mike Gelfand <mike...@mikedld.com>:
>
> On 07/06/2016 10:12 PM, Dāvis Mosāns wrote:
> > --- a/Source/kwsys/FStream.hxx.in
> > +++ b/Source/kwsys/FStream.hxx.in
> > @@ -14,33 +14,76 @@
> >
> >  #include <@KWSYS_NAMESPACE@/Encoding.hxx>
> >  #include <fstream>
> > +#if defined(_WIN32) && !defined(_MSC_VER)
> > +#include <ext/stdio_filebuf.h>
> > +#endif
> >
> >  namespace @KWSYS_NAMESPACE@
> >  {
> AFAIK, libc++ doesn't have this header, but only libstdc++ does. Not
> sure if Clang on Windows defines _MSC_VER (the one included with recent
> MSVS versions might, but standalone one is another story), might be
> better to check for HAVE_EXT_STDIO_FILEBUF_H macro instead (or in
> addition), to be defined externally on configuration phase. Same goes
> for a few checks down in the same file.
>

I currently don't have other compilers besides MSVC (2015) and MinGW
(GCC 6.1.1) so I tested only on those. I don't know what Clang or Cygwin
would use.

> > @@ -56,7 +99,24 @@ namespace @KWSYS_NAMESPACE@
> >      }
> >      void open(char const *file_name,std::ios_base::openmode mode = 
> > std::ios_base::in)
> >      {
> > -      if(!buf_->open(file_name,mode | std::ios_base::in))
> > +      mode = mode | std::ios_base::in;
> > +#if defined(_MSC_VER)
> > +      const bool success = buf_->open(file_name,mode) != 0;
> > +#else
> > +      const std::wstring wstr = Encoding::ToWide(file_name);
> > +      bool success = false;
> > +      std::wstring cmode = getcmode(mode);
> > +      file_ = _wfopen(wstr.c_str(), cmode.c_str());
> > +      if (file_) {
> > +        if (buf_) {
> > +          delete buf_;
> > +        }
> > +        buf_ = new internal_buffer_type(file_, mode);
> > +        this->set_rdbuf(buf_);
> > +        success = true;
> > +      }
> > +#endif
> > +      if(!success)
> >          {
> >          this->setstate(std::ios_base::failbit);
> >          }
> Looks odd that you check whether `buf_` is set before assigning, but
> don't check if `file_` is. Either one check is missing or another is
> redundant; the former is more probable since per STL documentation (e.g.
> http://www.cplusplus.com/reference/fstream/fstream/open/), "If the
> stream is already associated with a file (i.e., it is already open),
> calling this function fails."

Indeed I forgot about case when stream is already open. Need to return
early from that. And yeah I guess can delete buf_ unconditionally.

>
> > @@ -75,7 +135,14 @@ namespace @KWSYS_NAMESPACE@
> >      }
> >      void close()
> >      {
> > -      if(!buf_->close())
> > +      bool success = buf_->close() != 0;
> > +#if !defined(_MSC_VER)
> > +      if (file_) {
> > +        success = fclose(file_) == 0 ? success : false;
> > +        file_ = 0;
> > +      }
> > +#endif
> > +      if(!success)
> >          {
> >          this->setstate(std::ios_base::failbit);
> >          }
> `success` is overwritten inside newly added condition w/o checking
> previous value; looks odd as well.
>

Look more carefully.

        success = fclose(file_) == 0 ? success : false;

We return success only if both buf_->close() and fclose(file_)
returned success. If any of them failed we return failure.

>
> > @@ -92,19 +159,26 @@ namespace @KWSYS_NAMESPACE@
> > [snip]
> >    private:
> >      internal_buffer_type* buf_;
> > +#if !defined(_MSC_VER)
> > +    FILE *file_ = 0;
> > +#endif
> >  };
> >
> >  template<typename CharType,typename Traits = std::char_traits<CharType> >
> In-place member initialization... As Brad wrote earlier, using C++11 in
> KWSys is not advised.
>

This was already there but only used for _MSC_VER >= 1400
Maybe could just guard this with  __cplusplus >= 201103L and not support
Unicode for older, it would be much easier...
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to