5 #ifndef YAML_PREFETCH_SIZE 6 #define YAML_PREFETCH_SIZE 2048 9 #define S_ARRAY_SIZE( A ) (sizeof(A)/sizeof(*(A))) 10 #define S_ARRAY_END( A ) ((A) + S_ARRAY_SIZE(A)) 12 #define CP_REPLACEMENT_CHARACTER (0xFFFD) 96 {0, 1, 1, 0, 0, 0, 0, 1},
97 {0, 2, 2, 2, 2, 2, 2, 2},
98 {3, 3, 3, 3, 0, 3, 3, 3},
99 {4, 4, 4, 4, 4, 0, 4, 4},
100 {1, 1, 1, 1, 1, 1, 1, 1},
101 {1, 1, 1, 1, 1, 1, 1, 1},
102 {2, 2, 2, 2, 2, 0, 2, 2},
103 {2, 2, 2, 2, 0, 2, 2, 2},
104 {0, 1, 1, 1, 1, 1, 1, 1},
105 {0, 2, 2, 2, 2, 2, 2, 2},
106 {1, 1, 1, 1, 1, 1, 1, 1},
107 {1, 1, 1, 1, 1, 1, 1, 1},
108 {0, 2, 2, 2, 2, 2, 2, 2},
109 {0, 3, 3, 3, 3, 3, 3, 3},
110 {4, 4, 4, 4, 4, 4, 4, 4},
111 {2, 0, 2, 2, 2, 2, 2, 2},
112 {3, 3, 0, 3, 3, 3, 3, 3},
113 {1, 1, 1, 1, 1, 1, 1, 1},
118 if (std::istream::traits_type::eof() == ch) {
131 if ((ch > 0) && (ch < 0xFF)) {
138 inline char Utf8Adjust(
unsigned long ch,
unsigned char lead_bits,
unsigned char rshift)
140 const unsigned char header = ((1 << lead_bits) - 1) << (8 - lead_bits);
141 const unsigned char mask = (0xFF >> (lead_bits + 1));
142 return static_cast<char>(
static_cast<unsigned char>(
143 header | ((ch >> rshift) & mask)
151 if (static_cast<unsigned long>(
Stream::eof()) == ch)
165 else if (ch < 0x10000)
183 m_nPrefetchedAvailable(0), m_nPrefetchedUsed(0)
185 typedef std::istream::traits_type char_traits;
192 char_traits::int_type intro[4];
195 for(; !s_introFinalState[state]; ) {
196 std::istream::int_type ch = input.get();
197 intro[nIntroUsed++] = ch;
199 UtfIntroState newState = s_introTransitions[state][charType];
200 int nUngets = s_introUngetCount[state][charType];
203 for(; nUngets > 0; --nUngets) {
204 if(char_traits::eof() != intro[--nIntroUsed])
205 input.putback(char_traits::to_char_type(intro[nIntroUsed]));
238 Stream::operator bool()
const 321 unsigned long ch = 0;
322 unsigned char bytes[2];
331 ch = (
static_cast<unsigned long>(bytes[nBigEnd]) << 8) |
332 static_cast<unsigned long>(bytes[1 ^ nBigEnd]);
334 if (ch >= 0xDC00 && ch < 0xE000)
340 else if (ch >= 0xD800 && ch < 0xDC00)
356 unsigned long chLow = (
static_cast<unsigned long>(bytes[nBigEnd]) << 8) |
357 static_cast<unsigned long>(bytes[1 ^ nBigEnd]);
358 if (chLow < 0xDC00 || ch >= 0xE000)
364 if (chLow < 0xD800 || ch >= 0xE000)
383 ch |= (chLow & 0x3FF);
395 return reinterpret_cast<char*
>(pBuffer);
402 std::streambuf *pBuf =
m_input.rdbuf();
408 m_input.setstate(std::ios_base::eofbit);
422 static int indexes[2][4] = {
427 unsigned long ch = 0;
428 unsigned char bytes[4];
440 for (
int i = 0; i < 4; ++i)
443 ch |= bytes[pIndexes[i]];
unsigned char *const m_pPrefetched
bool ReadAheadTo(size_t i) const
void StreamInUtf8() const
std::deque< char > m_readahead
unsigned char GetNextByte() const
bool _ReadAheadTo(size_t i) const
char Utf8Adjust(unsigned long ch, unsigned char lead_bits, unsigned char rshift)
static UtfIntroState s_introTransitions[][uictMax]
static bool s_introFinalState[]
char * ReadBuffer(unsigned char *pBuffer)
size_t m_nPrefetchedAvailable
Stream(std::istream &input)
#define YAML_PREFETCH_SIZE
static char s_introUngetCount[][uictMax]
#define CP_REPLACEMENT_CHARACTER
UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch)
void StreamInUtf16() const
void StreamInUtf32() const
void QueueUnicodeCodepoint(std::deque< char > &q, unsigned long ch)