source: icGREP/icgrep-devel/icgrep/utf8_encoder.cpp @ 6173

Last change on this file since 6173 was 5924, checked in by cameron, 16 months ago

Various cleanups

File size: 2.5 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include <utf8_encoder.h>
8#include <assert.h>
9#include <algorithm>
10#include <stdexcept>
11#include <string>
12
13using namespace UCD;
14
15namespace cc {
16
17bool UTF8_Encoder::isPrefix(const codepoint_t cp) {
18    return (cp >= 0xC2) && (cp <= 0xF4);
19}
20
21codepoint_t UTF8_Encoder::encodingByte(const codepoint_t cp, const unsigned n) {
22    codepoint_t retVal = 0;
23    const unsigned len = length(cp);
24    if (n == 1) {
25        switch (len) {
26            case 1: retVal = cp; break;
27            case 2: retVal = 0xC0 | (cp >> 6); break;
28            case 3: retVal = 0xE0 | (cp >> 12); break;
29            case 4: retVal = 0xF0 | (cp >> 18); break;
30        }
31    }
32    else {
33        retVal = 0x80 | ((cp >> (6 * (len - n))) & 0x3F);
34    }
35    return retVal;
36}
37
38unsigned UTF8_Encoder::length(const codepoint_t cp) {
39    if (cp <= 0x7F) {
40        return 1;
41    }
42    else if (cp <= 0x7FF) {
43        return 2;
44    }
45    else if (cp <= 0xFFFF) {
46        return 3;
47    }
48    else {
49        return 4;
50    }
51}
52
53codepoint_t UTF8_Encoder::maxCodePoint(const unsigned length) {
54    if (length == 1) {
55        return 0x7F;
56    }
57    else if (length == 2) {
58        return 0x7FF;
59    }
60    else if (length == 3) {
61        return 0xFFFF;
62    }
63    else if (length == 4) {
64        return 0x10FFFF;
65    }
66    throw std::runtime_error("Unexpected UTF8 Length: " + std::to_string(length));
67}
68
69bool UTF8_Encoder::isLowCodePointAfterByte(const codepoint_t cp, const unsigned n) {
70    const auto l = length(cp);
71    for (auto i = n; i != l; ++i) {
72        if (encodingByte(cp, i + 1) != 0x80) {
73            return false;
74        }
75    }
76    return true;
77}
78
79bool UTF8_Encoder::isHighCodePointAfterByte(const codepoint_t cp, const unsigned n) {
80    const auto l = length(cp);
81    for (auto i = n; i != l; ++i) {
82        if (encodingByte(cp, i + 1) != 0xBF) {
83            return false;
84        }
85    }
86    return true;
87}
88
89codepoint_t UTF8_Encoder::minCodePointWithCommonBytes(const UCD::codepoint_t cp, const unsigned n) {
90    const auto len = length(cp);
91    const auto mask = (static_cast<codepoint_t>(1) << (len - n) * 6) - 1;
92    const auto lo_cp = cp &~ mask;
93    return (lo_cp == 0) ? mask + 1 : lo_cp;
94}
95
96codepoint_t UTF8_Encoder::maxCodePointWithCommonBytes(const UCD::codepoint_t cp, const unsigned n) {
97    const auto len = length(cp);
98    const auto mask = (static_cast<codepoint_t>(1) << (len - n) * 6) - 1;
99    return cp | mask;
100}
101
102}
Note: See TracBrowser for help on using the repository browser.