/usr/include/ITK-4.12/itksys/FStream.hxx is in libinsighttoolkit4-dev 4.12.2-dfsg1-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
#ifndef itksys_FStream_hxx
#define itksys_FStream_hxx
#include <itksys/Configure.hxx>
#include <itksys/Encoding.hxx>
#include <fstream>
#if defined(_WIN32)
#if !defined(_MSC_VER) && itksys_CXX_HAS_EXT_STDIO_FILEBUF_H
#include <ext/stdio_filebuf.h>
#endif
#endif
namespace itksys {
#if defined(_WIN32) && \
(defined(_MSC_VER) || itksys_CXX_HAS_EXT_STDIO_FILEBUF_H)
#if defined(_NOEXCEPT)
#define itksys_FStream_NOEXCEPT _NOEXCEPT
#else
#define itksys_FStream_NOEXCEPT
#endif
#if defined(_MSC_VER)
template <typename CharType, typename Traits>
class basic_filebuf : public std::basic_filebuf<CharType, Traits>
{
#if _MSC_VER >= 1400
public:
typedef std::basic_filebuf<CharType, Traits> my_base_type;
basic_filebuf* open(char const* s, std::ios_base::openmode mode)
{
const std::wstring wstr = Encoding::ToWindowsExtendedPath(s);
return static_cast<basic_filebuf*>(my_base_type::open(wstr.c_str(), mode));
}
#endif
};
#else
inline std::wstring getcmode(const std::ios_base::openmode mode)
{
std::wstring cmode;
bool plus = false;
if (mode & std::ios_base::app) {
cmode += L"a";
plus = mode & std::ios_base::in ? true : false;
} else if (mode & std::ios_base::trunc ||
(mode & std::ios_base::out && (mode & std::ios_base::in) == 0)) {
cmode += L"w";
plus = mode & std::ios_base::in ? true : false;
} else {
cmode += L"r";
plus = mode & std::ios_base::out ? true : false;
}
if (plus) {
cmode += L"+";
}
if (mode & std::ios_base::binary) {
cmode += L"b";
} else {
cmode += L"t";
}
return cmode;
};
#endif
template <typename CharType, typename Traits = std::char_traits<CharType> >
class basic_efilebuf
{
public:
#if defined(_MSC_VER)
typedef basic_filebuf<CharType, Traits> internal_buffer_type;
#else
typedef __gnu_cxx::stdio_filebuf<CharType, Traits> internal_buffer_type;
#endif
basic_efilebuf()
: file_(0)
{
buf_ = 0;
}
bool _open(char const* file_name, std::ios_base::openmode mode)
{
if (is_open() || file_) {
return false;
}
#if defined(_MSC_VER)
const bool success = buf_->open(file_name, mode) != 0;
#else
const std::wstring wstr = Encoding::ToWindowsExtendedPath(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);
success = true;
}
#endif
return success;
}
bool is_open()
{
if (!buf_) {
return false;
}
return buf_->is_open();
}
bool is_open() const
{
if (!buf_) {
return false;
}
return buf_->is_open();
}
bool _close()
{
bool success = false;
if (buf_) {
success = buf_->close() != 0;
#if !defined(_MSC_VER)
if (file_) {
success = fclose(file_) == 0 ? success : false;
file_ = 0;
}
#endif
}
return success;
}
static void _set_state(bool success, std::basic_ios<CharType, Traits>* ios,
basic_efilebuf* efilebuf)
{
#if !defined(_MSC_VER)
ios->rdbuf(efilebuf->buf_);
#else
static_cast<void>(efilebuf);
#endif
if (!success) {
ios->setstate(std::ios_base::failbit);
} else {
ios->clear();
}
}
~basic_efilebuf()
{
if (buf_) {
delete buf_;
}
}
protected:
internal_buffer_type* buf_;
FILE* file_;
};
template <typename CharType, typename Traits = std::char_traits<CharType> >
class basic_ifstream : public std::basic_istream<CharType, Traits>,
public basic_efilebuf<CharType, Traits>
{
public:
typedef typename basic_efilebuf<CharType, Traits>::internal_buffer_type
internal_buffer_type;
typedef std::basic_istream<CharType, Traits> internal_stream_type;
basic_ifstream()
: internal_stream_type(new internal_buffer_type())
{
this->buf_ =
static_cast<internal_buffer_type*>(internal_stream_type::rdbuf());
}
explicit basic_ifstream(char const* file_name,
std::ios_base::openmode mode = std::ios_base::in)
: internal_stream_type(new internal_buffer_type())
{
this->buf_ =
static_cast<internal_buffer_type*>(internal_stream_type::rdbuf());
open(file_name, mode);
}
void open(char const* file_name,
std::ios_base::openmode mode = std::ios_base::in)
{
mode = mode | std::ios_base::in;
this->_set_state(this->_open(file_name, mode), this, this);
}
void close() { this->_set_state(this->_close(), this, this); }
using basic_efilebuf<CharType, Traits>::is_open;
internal_buffer_type* rdbuf() const { return this->buf_; }
~basic_ifstream() itksys_FStream_NOEXCEPT { close(); }
};
template <typename CharType, typename Traits = std::char_traits<CharType> >
class basic_ofstream : public std::basic_ostream<CharType, Traits>,
public basic_efilebuf<CharType, Traits>
{
using basic_efilebuf<CharType, Traits>::is_open;
public:
typedef typename basic_efilebuf<CharType, Traits>::internal_buffer_type
internal_buffer_type;
typedef std::basic_ostream<CharType, Traits> internal_stream_type;
basic_ofstream()
: internal_stream_type(new internal_buffer_type())
{
this->buf_ =
static_cast<internal_buffer_type*>(internal_stream_type::rdbuf());
}
explicit basic_ofstream(char const* file_name,
std::ios_base::openmode mode = std::ios_base::out)
: internal_stream_type(new internal_buffer_type())
{
this->buf_ =
static_cast<internal_buffer_type*>(internal_stream_type::rdbuf());
open(file_name, mode);
}
void open(char const* file_name,
std::ios_base::openmode mode = std::ios_base::out)
{
mode = mode | std::ios_base::out;
this->_set_state(this->_open(file_name, mode), this, this);
}
void close() { this->_set_state(this->_close(), this, this); }
internal_buffer_type* rdbuf() const { return this->buf_; }
~basic_ofstream() itksys_FStream_NOEXCEPT { close(); }
};
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
#undef itksys_FStream_NOEXCEPT
#else
using std::ofstream;
using std::ifstream;
#endif
namespace FStream {
enum BOM
{
BOM_None,
BOM_UTF8,
BOM_UTF16BE,
BOM_UTF16LE,
BOM_UTF32BE,
BOM_UTF32LE
};
// Read a BOM, if one exists.
// If a BOM exists, the stream is advanced to after the BOM.
// This function requires a seekable stream (but not a relative
// seekable stream).
itksys_EXPORT BOM ReadBOM(std::istream& in);
}
}
#endif
|