| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing#kwsys for details. */ |
| #include "kwsysPrivate.h" |
| #include KWSYS_HEADER(FStream.hxx) |
| |
| // Work-around CMake dependency scanning limitation. This must |
| // duplicate the above list of headers. |
| #if 0 |
| #include "FStream.hxx.in" |
| #endif |
| |
| namespace KWSYS_NAMESPACE { |
| namespace FStream { |
| |
| BOM ReadBOM(std::istream& in) |
| { |
| if (!in.good()) { |
| return BOM_None; |
| } |
| unsigned long orig = in.tellg(); |
| unsigned char bom[4]; |
| in.read(reinterpret_cast<char*>(bom), 2); |
| if (!in.good()) { |
| in.clear(); |
| in.seekg(orig); |
| return BOM_None; |
| } |
| if (bom[0] == 0xEF && bom[1] == 0xBB) { |
| in.read(reinterpret_cast<char*>(bom + 2), 1); |
| if (in.good() && bom[2] == 0xBF) { |
| return BOM_UTF8; |
| } |
| } else if (bom[0] == 0xFE && bom[1] == 0xFF) { |
| return BOM_UTF16BE; |
| } else if (bom[0] == 0x00 && bom[1] == 0x00) { |
| in.read(reinterpret_cast<char*>(bom + 2), 2); |
| if (in.good() && bom[2] == 0xFE && bom[3] == 0xFF) { |
| return BOM_UTF32BE; |
| } |
| } else if (bom[0] == 0xFF && bom[1] == 0xFE) { |
| unsigned long p = in.tellg(); |
| in.read(reinterpret_cast<char*>(bom + 2), 2); |
| if (in.good() && bom[2] == 0x00 && bom[3] == 0x00) { |
| return BOM_UTF32LE; |
| } |
| in.seekg(p); |
| return BOM_UTF16LE; |
| } |
| in.clear(); |
| in.seekg(orig); |
| return BOM_None; |
| } |
| |
| } // FStream namespace |
| } // KWSYS_NAMESPACE |