Skip to content

Instantly share code, notes, and snippets.

@serjepatoff
Last active March 9, 2017 13:10
Show Gist options
  • Save serjepatoff/8df39717d3e7d16fc183e194e165e195 to your computer and use it in GitHub Desktop.
Save serjepatoff/8df39717d3e7d16fc183e194e165e195 to your computer and use it in GitHub Desktop.
Word frequency counter
//
// word_freq.cpp
//
// Created by Serj Epatov on 3/7/17.
// Copyright © 2017 Serj Epatov. All rights reserved.
//
// This small piece of code counts case–insensitive word frequency from UTF8 input file.
// It is locale-agnostic.
// It performs lowercase conversion for Latin, Eastern & Western European with díâçrïtìćš, Greek, Cyrillic and Armenian scripts.
// Since all external dependencies are prohibited, I have created conversion table manually.
// So did I for UTF8 vari-length rune iteration.
//Tested on macOS Sierra with clang-800.0.42.1 and Windows with VS2013
#include <stdint.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#define swap32(x) ((((x) & 0xff)<<24) | (((x) & 0xff00)<<8) | (((x) & 0xff0000)>>8) | (((x) & 0xff000000)>>24))
using std::ifstream;
using std::ofstream;
using std::istreambuf_iterator;
using std::string;
using std::vector;
using std::map;
using std::pair;
class wfreq_t {
public:
wfreq_t() : toLowerMap_(generateUTF8ToLowerTable()) {}
void process(const string &filenameIn, const string &filenameOut);
void printUsage(int argc, char *argv[]);
private:
uint32_t runeToLower(uint32_t rune, int length) {
if (length == 1) {
if (rune >= 0x41 && rune <= 0x5A) { //Latin A..Z
return rune + 0x20;
}
}
else { //Western European, Eastern European, Cyrillic, Greek, Armenian scripts
if (toLowerMap_.count(rune)) {
rune = toLowerMap_.at(rune);
}
}
return rune;
}
map<uint32_t, uint32_t> generateUTF8ToLowerTable();
vector<string> split(const string &str);
map<string, int> countWords(const vector<string> &vs);
private:
map<uint32_t, uint32_t> toLowerMap_;
};
int main(int argc, char * argv[]) {
wfreq_t wf;
if (argc == 3) {
try {
wf.process(argv[1], argv[2]);
}
catch (...) {
wf.printUsage(argc, argv);
}
}
else {
wf.printUsage(argc, argv);
}
return 0;
}
void wfreq_t::process(const string &filenameIn, const string &filenameOut) {
ifstream in(filenameIn);
if (!in.good()) throw 1;
ofstream out(filenameOut);
if (!out.good()) throw 2;
std::string content((istreambuf_iterator<char>(in)), istreambuf_iterator<char>());
map<string, int> fmap = countWords(split(content));
vector<pair<string, int> > pairs;
for (auto itr = fmap.begin(); itr != fmap.end(); ++itr) {
pairs.push_back(*itr);
}
sort(pairs.begin(), pairs.end(), [](const pair<string, int> & a, const pair<string, int> & b) -> bool {
if (a.second > b.second) {
return true;
}
else if (a.second == b.second) {
return a.first < b.first;
}
else {
return false;
}
});
std::for_each(pairs.begin(), pairs.end(), [&](const std::pair<string, int>& x) {
out << x.second << " " << x.first << std::endl;
});
}
vector<string> wfreq_t::split(const string &str) {
const char *iter = str.c_str();
int runeWidth = 0;
uint32_t rune = 0;
string acc;
vector<string> result;
while (iter) {
char ch = *iter;
rune = *(uint32_t *)iter;
if ((ch & 0x80) == 0) {
runeWidth = 1;
rune &= 0xFF;
}
else if ((ch & 0xE0) == 0xC0) {
runeWidth = 2;
rune &= 0xFFFF;
}
else if ((ch & 0xF0) == 0xE0) {
runeWidth = 3;
rune &= 0xFFFFFF;
}
else if ((ch & 0xF8) == 0xF0) {
runeWidth = 4;
}
rune = runeToLower(rune, runeWidth);
if (runeWidth == 1 && (isspace(ch) || ispunct(ch) || iscntrl(ch) || ch == 0)) {
if (acc.length()) {
result.push_back(acc);
acc.clear();
}
}
else {
acc.append((const char *)&rune, runeWidth);
}
if (ch == 0) {
break;
}
iter += runeWidth;
}
return result;
}
map<string, int> wfreq_t::countWords(const vector<string> &vs) {
map<string, int> result;
for (const string &s : vs) {
result[s]++;
}
return result;
}
void wfreq_t::printUsage(int argc, char *argv[]) {
if (argc) {
std::cout << "Usage: " << argv[0] << " filename_in filename_out" << std::endl;
}
}
//Most of the time was spent in digging through UTF-8 spec, learning about unicameral and bicameral scripts, and toLower table generation.
//This is not an elegant solution, but I don't know anything better in the absence of boost and libiconv.
map<uint32_t, uint32_t> wfreq_t::generateUTF8ToLowerTable() {
const uint32_t toLowerTable[] = {
0xC380, 0xC3A0, 0xC381, 0xC3A1, 0xC382, 0xC3A2, 0xC383, 0xC3A3, 0xC384, 0xC3A4, 0xC385, 0xC3A5, 0xC386, 0xC3A6, 0xC387, 0xC3A7, 0xC388,
0xC3A8, 0xC389, 0xC3A9, 0xC38A, 0xC3AA, 0xC38B, 0xC3AB, 0xC38C, 0xC3AC, 0xC38D, 0xC3AD, 0xC38E, 0xC3AE, 0xC38F, 0xC3AF, 0xC390, 0xC3B0,
0xC391, 0xC3B1, 0xC392, 0xC3B2, 0xC393, 0xC3B3, 0xC394, 0xC3B4, 0xC395, 0xC3B5, 0xC396, 0xC3B6, 0xC398, 0xC3B8, 0xC399, 0xC3B9, 0xC39A,
0xC3BA, 0xC39B, 0xC3BB, 0xC39C, 0xC3BC, 0xC39D, 0xC3BD, 0xC39E, 0xC3BE,
0xC480, 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490,
0xC491, 0xC492, 0xC493, 0xC494, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B, 0xC49C, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1,
0xC4A2, 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0x69CC87, 0xC4B2,
0xC4B3, 0xC4B4, 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BC, 0xC4BD, 0xC4BE, 0xC4BF, 0xC580,
0xC581, 0xC582, 0xC583, 0xC584, 0xC585, 0xC586, 0xC587, 0xC588, 0xC58A, 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591, 0xC592,
0xC593, 0xC594, 0xC595, 0xC596, 0xC597, 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, 0xC59F, 0xC5A0, 0xC5A1, 0xC5A2, 0xC5A3,
0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5A9, 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3, 0xC5B4,
0xC5B5, 0xC5B6, 0xC5B7, 0xC5B8, 0xC3BF, 0xC5B9, 0xC5BA, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE,
0xC681, 0xC993, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, 0xC994, 0xC687, 0xC688, 0xC689, 0xC996, 0xC68A, 0xC997, 0xC68B, 0xC68C, 0xC68E,
0xC79D, 0xC68F, 0xC999, 0xC690, 0xC99B, 0xC691, 0xC692, 0xC693, 0xC9A0, 0xC694, 0xC9A3, 0xC696, 0xC9A9, 0xC697, 0xC9A8, 0xC698, 0xC699,
0xC69C, 0xC9AF, 0xC69D, 0xC9B2, 0xC69F, 0xC9B5, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3, 0xC6A4, 0xC6A5, 0xC6A6, 0xCA80, 0xC6A7, 0xC6A8, 0xC6A9,
0xCA83, 0xC6AC, 0xC6AD, 0xC6AE, 0xCA88, 0xC6AF, 0xC6B0, 0xC6B1, 0xCA8A, 0xC6B2, 0xCA8B, 0xC6B3, 0xC6B4, 0xC6B5, 0xC6B6, 0xC6B7, 0xCA92,
0xC6B8, 0xC6B9, 0xC6BC, 0xC6BD,
0xC784, 0xC786, 0xC785, 0xC786, 0xC787, 0xC789, 0xC788, 0xC789, 0xC78A, 0xC78C, 0xC78B, 0xC78C, 0xC78D, 0xC78E, 0xC78F, 0xC790, 0xC791,
0xC792, 0xC793, 0xC794, 0xC795, 0xC796, 0xC797, 0xC798, 0xC799, 0xC79A, 0xC79B, 0xC79C, 0xC79E, 0xC79F, 0xC7A0, 0xC7A1, 0xC7A2, 0xC7A3,
0xC7A4, 0xC7A5, 0xC7A6, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AC, 0xC7AD, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B3, 0xC7B2, 0xC7B3, 0xC7B4,
0xC7B5, 0xC7B6, 0xC695, 0xC7B7, 0xC6BF, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BC, 0xC7BD, 0xC7BE, 0xC7BF,
0xC880, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885, 0xC886, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0xC88C, 0xC88D, 0xC88E, 0xC88F, 0xC890,
0xC891, 0xC892, 0xC893, 0xC894, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C, 0xC89D, 0xC89E, 0xC89F, 0xC8A0, 0xC69E,
0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7, 0xC8A8, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0, 0xC8B1, 0xC8B2,
0xC8B3, 0xC8BA, 0xE2B1A5, 0xC8BB, 0xC8BC, 0xC8BD, 0xC69A, 0xC8BE, 0xE2B1A6,
0xC981, 0xC982, 0xC983, 0xC680, 0xC984, 0xCA89, 0xC985, 0xCA8C, 0xC986, 0xC987, 0xC988, 0xC989, 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC98E, 0xC98F,
0xCDB0, 0xCDB1, 0xCDB2, 0xCDB3, 0xCDB6, 0xCDB7, 0xCDBF, 0xCFB3,
0xCE86, 0xCEAC, 0xCE88, 0xCEAD, 0xCE89, 0xCEAE, 0xCE8A, 0xCEAF, 0xCE8C, 0xCF8C, 0xCE8E, 0xCF8D, 0xCE8F, 0xCF8E, 0xCE91, 0xCEB1, 0xCE92,
0xCEB2, 0xCE93, 0xCEB3, 0xCE94, 0xCEB4, 0xCE95, 0xCEB5, 0xCE96, 0xCEB6, 0xCE97, 0xCEB7, 0xCE98, 0xCEB8, 0xCE99, 0xCEB9, 0xCE9A, 0xCEBA,
0xCE9B, 0xCEBB, 0xCE9C, 0xCEBC, 0xCE9D, 0xCEBD, 0xCE9E, 0xCEBE, 0xCE9F, 0xCEBF, 0xCEA0, 0xCF80, 0xCEA1, 0xCF81, 0xCEA3, 0xCF83, 0xCEA4,
0xCF84, 0xCEA5, 0xCF85, 0xCEA6, 0xCF86, 0xCEA7, 0xCF87, 0xCEA8, 0xCF88, 0xCEA9, 0xCF89, 0xCEAA, 0xCF8A, 0xCEAB, 0xCF8B,
0xCF8F, 0xCF97, 0xCF98, 0xCF99, 0xCF9A, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA1, 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, 0xCFA6,
0xCFA7, 0xCFA8, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB4, 0xCEB8, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFB2, 0xCFBA, 0xCFBB,
0xCFBD, 0xCDBB, 0xCFBE, 0xCDBC, 0xCFBF, 0xCDBD,
0xD080, 0xD190, 0xD081, 0xD191, 0xD082, 0xD192, 0xD083, 0xD193, 0xD084, 0xD194, 0xD085, 0xD195, 0xD086, 0xD196, 0xD087, 0xD197, 0xD088,
0xD198, 0xD089, 0xD199, 0xD08A, 0xD19A, 0xD08B, 0xD19B, 0xD08C, 0xD19C, 0xD08D, 0xD19D, 0xD08E, 0xD19E, 0xD08F, 0xD19F, 0xD090, 0xD0B0,
0xD091, 0xD0B1, 0xD092, 0xD0B2, 0xD093, 0xD0B3, 0xD094, 0xD0B4, 0xD095, 0xD0B5, 0xD096, 0xD0B6, 0xD097, 0xD0B7, 0xD098, 0xD0B8, 0xD099,
0xD0B9, 0xD09A, 0xD0BA, 0xD09B, 0xD0BB, 0xD09C, 0xD0BC, 0xD09D, 0xD0BD, 0xD09E, 0xD0BE, 0xD09F, 0xD0BF, 0xD0A0, 0xD180, 0xD0A1, 0xD181,
0xD0A2, 0xD182, 0xD0A3, 0xD183, 0xD0A4, 0xD184, 0xD0A5, 0xD185, 0xD0A6, 0xD186, 0xD0A7, 0xD187, 0xD0A8, 0xD188, 0xD0A9, 0xD189, 0xD0AA,
0xD18A, 0xD0AB, 0xD18B, 0xD0AC, 0xD18C, 0xD0AD, 0xD18D, 0xD0AE, 0xD18E, 0xD0AF, 0xD18F,
0xD1A0, 0xD1A1, 0xD1A2, 0xD1A3, 0xD1A4, 0xD1A5, 0xD1A6, 0xD1A7, 0xD1A8, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, 0xD1B0,
0xD1B1, 0xD1B2, 0xD1B3, 0xD1B4, 0xD1B5, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BA, 0xD1BB, 0xD1BC, 0xD1BD, 0xD1BE, 0xD1BF,
0xD280, 0xD281, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD290, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295, 0xD296, 0xD297, 0xD298,
0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, 0xD29E, 0xD29F, 0xD2A0, 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A4, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,
0xD2AA, 0xD2AB, 0xD2AC, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B1, 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2B8, 0xD2B9, 0xD2BA,
0xD2BB, 0xD2BC, 0xD2BD, 0xD2BE, 0xD2BF,
0xD380, 0xD38F, 0xD381, 0xD382, 0xD383, 0xD384, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38C, 0xD38D, 0xD38E, 0xD390,
0xD391, 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A, 0xD39B, 0xD39C, 0xD39D, 0xD39E, 0xD39F, 0xD3A0, 0xD3A1,
0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, 0xD3A7, 0xD3A8, 0xD3A9, 0xD3AA, 0xD3AB, 0xD3AC, 0xD3AD, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2,
0xD3B3, 0xD3B4, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B8, 0xD3B9, 0xD3BA, 0xD3BB, 0xD3BC, 0xD3BD, 0xD3BE, 0xD3BF,
0xD480, 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD488, 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D, 0xD48E, 0xD48F, 0xD490,
0xD491, 0xD492, 0xD493, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0, 0xD4A1,
0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8, 0xD4A9, 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B1, 0xD5A1, 0xD4B2,
0xD5A2, 0xD4B3, 0xD5A3, 0xD4B4, 0xD5A4, 0xD4B5, 0xD5A5, 0xD4B6, 0xD5A6, 0xD4B7, 0xD5A7, 0xD4B8, 0xD5A8, 0xD4B9, 0xD5A9, 0xD4BA, 0xD5AA,
0xD4BB, 0xD5AB, 0xD4BC, 0xD5AC, 0xD4BD, 0xD5AD, 0xD4BE, 0xD5AE, 0xD4BF, 0xD5AF,
0xD580, 0xD5B0, 0xD581, 0xD5B1, 0xD582, 0xD5B2, 0xD583, 0xD5B3, 0xD584, 0xD5B4, 0xD585, 0xD5B5, 0xD586, 0xD5B6, 0xD587, 0xD5B7, 0xD588,
0xD5B8, 0xD589, 0xD5B9, 0xD58A, 0xD5BA, 0xD58B, 0xD5BB, 0xD58C, 0xD5BC, 0xD58D, 0xD5BD, 0xD58E, 0xD5BE, 0xD58F, 0xD5BF, 0xD590, 0xD680,
0xD591, 0xD681, 0xD592, 0xD682, 0xD593, 0xD683, 0xD594, 0xD684, 0xD595, 0xD685, 0xD596, 0xD686,
0xE182A0, 0xE2B480, 0xE182A1, 0xE2B481, 0xE182A2, 0xE2B482, 0xE182A3, 0xE2B483, 0xE182A4, 0xE2B484, 0xE182A5, 0xE2B485, 0xE182A6,
0xE2B486, 0xE182A7, 0xE2B487, 0xE182A8, 0xE2B488, 0xE182A9, 0xE2B489, 0xE182AA, 0xE2B48A, 0xE182AB, 0xE2B48B, 0xE182AC, 0xE2B48C,
0xE182AD, 0xE2B48D, 0xE182AE, 0xE2B48E, 0xE182AF, 0xE2B48F, 0xE182B0, 0xE2B490, 0xE182B1, 0xE2B491, 0xE182B2, 0xE2B492, 0xE182B3,
0xE2B493, 0xE182B4, 0xE2B494, 0xE182B5, 0xE2B495, 0xE182B6, 0xE2B496, 0xE182B7, 0xE2B497, 0xE182B8, 0xE2B498, 0xE182B9, 0xE2B499,
0xE182BA, 0xE2B49A, 0xE182BB, 0xE2B49B, 0xE182BC, 0xE2B49C, 0xE182BD, 0xE2B49D, 0xE182BE, 0xE2B49E, 0xE182BF, 0xE2B49F,
0xE18380, 0xE2B4A0, 0xE18381, 0xE2B4A1, 0xE18382, 0xE2B4A2, 0xE18383, 0xE2B4A3, 0xE18384, 0xE2B4A4, 0xE18385, 0xE2B4A5, 0xE18387,
0xE2B4A7, 0xE1838D, 0xE2B4AD,
0xE18EA0, 0xEAADB0, 0xE18EA1, 0xEAADB1, 0xE18EA2, 0xEAADB2, 0xE18EA3, 0xEAADB3, 0xE18EA4, 0xEAADB4, 0xE18EA5, 0xEAADB5, 0xE18EA6,
0xEAADB6, 0xE18EA7, 0xEAADB7, 0xE18EA8, 0xEAADB8, 0xE18EA9, 0xEAADB9, 0xE18EAA, 0xEAADBA, 0xE18EAB, 0xEAADBB, 0xE18EAC, 0xEAADBC,
0xE18EAD, 0xEAADBD, 0xE18EAE, 0xEAADBE, 0xE18EAF, 0xEAADBF, 0xE18EB0, 0xEAAE80, 0xE18EB1, 0xEAAE81, 0xE18EB2, 0xEAAE82, 0xE18EB3,
0xEAAE83, 0xE18EB4, 0xEAAE84, 0xE18EB5, 0xEAAE85, 0xE18EB6, 0xEAAE86, 0xE18EB7, 0xEAAE87, 0xE18EB8, 0xEAAE88, 0xE18EB9, 0xEAAE89,
0xE18EBA, 0xEAAE8A, 0xE18EBB, 0xEAAE8B, 0xE18EBC, 0xEAAE8C, 0xE18EBD, 0xEAAE8D, 0xE18EBE, 0xEAAE8E, 0xE18EBF, 0xEAAE8F,
0xE18F80, 0xEAAE90, 0xE18F81, 0xEAAE91, 0xE18F82, 0xEAAE92, 0xE18F83, 0xEAAE93, 0xE18F84, 0xEAAE94, 0xE18F85, 0xEAAE95, 0xE18F86,
0xEAAE96, 0xE18F87, 0xEAAE97, 0xE18F88, 0xEAAE98, 0xE18F89, 0xEAAE99, 0xE18F8A, 0xEAAE9A, 0xE18F8B, 0xEAAE9B, 0xE18F8C, 0xEAAE9C,
0xE18F8D, 0xEAAE9D, 0xE18F8E, 0xEAAE9E, 0xE18F8F, 0xEAAE9F, 0xE18F90, 0xEAAEA0, 0xE18F91, 0xEAAEA1, 0xE18F92, 0xEAAEA2, 0xE18F93,
0xEAAEA3, 0xE18F94, 0xEAAEA4, 0xE18F95, 0xEAAEA5, 0xE18F96, 0xEAAEA6, 0xE18F97, 0xEAAEA7, 0xE18F98, 0xEAAEA8, 0xE18F99, 0xEAAEA9,
0xE18F9A, 0xEAAEAA, 0xE18F9B, 0xEAAEAB, 0xE18F9C, 0xEAAEAC, 0xE18F9D, 0xEAAEAD, 0xE18F9E, 0xEAAEAE, 0xE18F9F, 0xEAAEAF, 0xE18FA0,
0xEAAEB0, 0xE18FA1, 0xEAAEB1, 0xE18FA2, 0xEAAEB2, 0xE18FA3, 0xEAAEB3, 0xE18FA4, 0xEAAEB4, 0xE18FA5, 0xEAAEB5, 0xE18FA6, 0xEAAEB6,
0xE18FA7, 0xEAAEB7, 0xE18FA8, 0xEAAEB8, 0xE18FA9, 0xEAAEB9, 0xE18FAA, 0xEAAEBA, 0xE18FAB, 0xEAAEBB, 0xE18FAC, 0xEAAEBC, 0xE18FAD,
0xEAAEBD, 0xE18FAE, 0xEAAEBE, 0xE18FAF, 0xEAAEBF, 0xE18FB0, 0xE18FB8, 0xE18FB1, 0xE18FB9, 0xE18FB2, 0xE18FBA, 0xE18FB3, 0xE18FBB,
0xE18FB4, 0xE18FBC, 0xE18FB5, 0xE18FBD,
0xE1B880, 0xE1B881, 0xE1B882, 0xE1B883, 0xE1B884, 0xE1B885, 0xE1B886, 0xE1B887, 0xE1B888, 0xE1B889, 0xE1B88A, 0xE1B88B, 0xE1B88C,
0xE1B88D, 0xE1B88E, 0xE1B88F, 0xE1B890, 0xE1B891, 0xE1B892, 0xE1B893, 0xE1B894, 0xE1B895, 0xE1B896, 0xE1B897, 0xE1B898, 0xE1B899,
0xE1B89A, 0xE1B89B, 0xE1B89C, 0xE1B89D, 0xE1B89E, 0xE1B89F, 0xE1B8A0, 0xE1B8A1, 0xE1B8A2, 0xE1B8A3, 0xE1B8A4, 0xE1B8A5, 0xE1B8A6,
0xE1B8A7, 0xE1B8A8, 0xE1B8A9, 0xE1B8AA, 0xE1B8AB, 0xE1B8AC, 0xE1B8AD, 0xE1B8AE, 0xE1B8AF, 0xE1B8B0, 0xE1B8B1, 0xE1B8B2, 0xE1B8B3,
0xE1B8B4, 0xE1B8B5, 0xE1B8B6, 0xE1B8B7, 0xE1B8B8, 0xE1B8B9, 0xE1B8BA, 0xE1B8BB, 0xE1B8BC, 0xE1B8BD, 0xE1B8BE, 0xE1B8BF,
0xE1B980, 0xE1B981, 0xE1B982, 0xE1B983, 0xE1B984, 0xE1B985, 0xE1B986, 0xE1B987, 0xE1B988, 0xE1B989, 0xE1B98A, 0xE1B98B, 0xE1B98C,
0xE1B98D, 0xE1B98E, 0xE1B98F, 0xE1B990, 0xE1B991, 0xE1B992, 0xE1B993, 0xE1B994, 0xE1B995, 0xE1B996, 0xE1B997, 0xE1B998, 0xE1B999,
0xE1B99A, 0xE1B99B, 0xE1B99C, 0xE1B99D, 0xE1B99E, 0xE1B99F, 0xE1B9A0, 0xE1B9A1, 0xE1B9A2, 0xE1B9A3, 0xE1B9A4, 0xE1B9A5, 0xE1B9A6,
0xE1B9A7, 0xE1B9A8, 0xE1B9A9, 0xE1B9AA, 0xE1B9AB, 0xE1B9AC, 0xE1B9AD, 0xE1B9AE, 0xE1B9AF, 0xE1B9B0, 0xE1B9B1, 0xE1B9B2, 0xE1B9B3,
0xE1B9B4, 0xE1B9B5, 0xE1B9B6, 0xE1B9B7, 0xE1B9B8, 0xE1B9B9, 0xE1B9BA, 0xE1B9BB, 0xE1B9BC, 0xE1B9BD, 0xE1B9BE, 0xE1B9BF,
0xE1BA80, 0xE1BA81, 0xE1BA82, 0xE1BA83, 0xE1BA84, 0xE1BA85, 0xE1BA86, 0xE1BA87, 0xE1BA88, 0xE1BA89, 0xE1BA8A, 0xE1BA8B, 0xE1BA8C,
0xE1BA8D, 0xE1BA8E, 0xE1BA8F, 0xE1BA90, 0xE1BA91, 0xE1BA92, 0xE1BA93, 0xE1BA94, 0xE1BA95, 0xE1BA9E, 0xC39F, 0xE1BAA0, 0xE1BAA1,
0xE1BAA2, 0xE1BAA3, 0xE1BAA4, 0xE1BAA5, 0xE1BAA6, 0xE1BAA7, 0xE1BAA8, 0xE1BAA9, 0xE1BAAA, 0xE1BAAB, 0xE1BAAC, 0xE1BAAD, 0xE1BAAE,
0xE1BAAF, 0xE1BAB0, 0xE1BAB1, 0xE1BAB2, 0xE1BAB3, 0xE1BAB4, 0xE1BAB5, 0xE1BAB6, 0xE1BAB7, 0xE1BAB8, 0xE1BAB9, 0xE1BABA, 0xE1BABB,
0xE1BABC, 0xE1BABD, 0xE1BABE, 0xE1BABF,
0xE1BB80, 0xE1BB81, 0xE1BB82, 0xE1BB83, 0xE1BB84, 0xE1BB85, 0xE1BB86, 0xE1BB87, 0xE1BB88, 0xE1BB89, 0xE1BB8A, 0xE1BB8B, 0xE1BB8C,
0xE1BB8D, 0xE1BB8E, 0xE1BB8F, 0xE1BB90, 0xE1BB91, 0xE1BB92, 0xE1BB93, 0xE1BB94, 0xE1BB95, 0xE1BB96, 0xE1BB97, 0xE1BB98, 0xE1BB99,
0xE1BB9A, 0xE1BB9B, 0xE1BB9C, 0xE1BB9D, 0xE1BB9E, 0xE1BB9F, 0xE1BBA0, 0xE1BBA1, 0xE1BBA2, 0xE1BBA3, 0xE1BBA4, 0xE1BBA5, 0xE1BBA6,
0xE1BBA7, 0xE1BBA8, 0xE1BBA9, 0xE1BBAA, 0xE1BBAB, 0xE1BBAC, 0xE1BBAD, 0xE1BBAE, 0xE1BBAF, 0xE1BBB0, 0xE1BBB1, 0xE1BBB2, 0xE1BBB3,
0xE1BBB4, 0xE1BBB5, 0xE1BBB6, 0xE1BBB7, 0xE1BBB8, 0xE1BBB9, 0xE1BBBA, 0xE1BBBB, 0xE1BBBC, 0xE1BBBD, 0xE1BBBE, 0xE1BBBF,
0xE1BC88, 0xE1BC80, 0xE1BC89, 0xE1BC81, 0xE1BC8A, 0xE1BC82, 0xE1BC8B, 0xE1BC83, 0xE1BC8C, 0xE1BC84, 0xE1BC8D, 0xE1BC85, 0xE1BC8E,
0xE1BC86, 0xE1BC8F, 0xE1BC87, 0xE1BC98, 0xE1BC90, 0xE1BC99, 0xE1BC91, 0xE1BC9A, 0xE1BC92, 0xE1BC9B, 0xE1BC93, 0xE1BC9C, 0xE1BC94,
0xE1BC9D, 0xE1BC95, 0xE1BCA8, 0xE1BCA0, 0xE1BCA9, 0xE1BCA1, 0xE1BCAA, 0xE1BCA2, 0xE1BCAB, 0xE1BCA3, 0xE1BCAC, 0xE1BCA4, 0xE1BCAD,
0xE1BCA5, 0xE1BCAE, 0xE1BCA6, 0xE1BCAF, 0xE1BCA7, 0xE1BCB8, 0xE1BCB0, 0xE1BCB9, 0xE1BCB1, 0xE1BCBA, 0xE1BCB2, 0xE1BCBB, 0xE1BCB3,
0xE1BCBC, 0xE1BCB4, 0xE1BCBD, 0xE1BCB5, 0xE1BCBE, 0xE1BCB6, 0xE1BCBF, 0xE1BCB7,
0xE1BD88, 0xE1BD80, 0xE1BD89, 0xE1BD81, 0xE1BD8A, 0xE1BD82, 0xE1BD8B, 0xE1BD83, 0xE1BD8C, 0xE1BD84, 0xE1BD8D, 0xE1BD85, 0xE1BD99,
0xE1BD91, 0xE1BD9B, 0xE1BD93, 0xE1BD9D, 0xE1BD95, 0xE1BD9F, 0xE1BD97, 0xE1BDA8, 0xE1BDA0, 0xE1BDA9, 0xE1BDA1, 0xE1BDAA, 0xE1BDA2,
0xE1BDAB, 0xE1BDA3, 0xE1BDAC, 0xE1BDA4, 0xE1BDAD, 0xE1BDA5, 0xE1BDAE, 0xE1BDA6, 0xE1BDAF, 0xE1BDA7,
0xE1BE88, 0xE1BE80, 0xE1BE89, 0xE1BE81, 0xE1BE8A, 0xE1BE82, 0xE1BE8B, 0xE1BE83, 0xE1BE8C, 0xE1BE84, 0xE1BE8D, 0xE1BE85, 0xE1BE8E,
0xE1BE86, 0xE1BE8F, 0xE1BE87, 0xE1BE98, 0xE1BE90, 0xE1BE99, 0xE1BE91, 0xE1BE9A, 0xE1BE92, 0xE1BE9B, 0xE1BE93, 0xE1BE9C, 0xE1BE94,
0xE1BE9D, 0xE1BE95, 0xE1BE9E, 0xE1BE96, 0xE1BE9F, 0xE1BE97, 0xE1BEA8, 0xE1BEA0, 0xE1BEA9, 0xE1BEA1, 0xE1BEAA, 0xE1BEA2, 0xE1BEAB,
0xE1BEA3, 0xE1BEAC, 0xE1BEA4, 0xE1BEAD, 0xE1BEA5, 0xE1BEAE, 0xE1BEA6, 0xE1BEAF, 0xE1BEA7, 0xE1BEB8, 0xE1BEB0, 0xE1BEB9, 0xE1BEB1,
0xE1BEBA, 0xE1BDB0, 0xE1BEBB, 0xE1BDB1, 0xE1BEBC, 0xE1BEB3,
0xE1BF88, 0xE1BDB2, 0xE1BF89, 0xE1BDB3, 0xE1BF8A, 0xE1BDB4, 0xE1BF8B, 0xE1BDB5, 0xE1BF8C, 0xE1BF83, 0xE1BF98, 0xE1BF90, 0xE1BF99,
0xE1BF91, 0xE1BF9A, 0xE1BDB6, 0xE1BF9B, 0xE1BDB7, 0xE1BFA8, 0xE1BFA0, 0xE1BFA9, 0xE1BFA1, 0xE1BFAA, 0xE1BDBA, 0xE1BFAB, 0xE1BDBB,
0xE1BFAC, 0xE1BFA5, 0xE1BFB8, 0xE1BDB8, 0xE1BFB9, 0xE1BDB9, 0xE1BFBA, 0xE1BDBC, 0xE1BFBB, 0xE1BDBD, 0xE1BFBC, 0xE1BFB3,
0xE284A6, 0xCF89, 0xE284AA, 0x6B, 0xE284AB, 0xC3A5, 0xE284B2, 0xE2858E,
0xE285A0, 0xE285B0, 0xE285A1, 0xE285B1, 0xE285A2, 0xE285B2, 0xE285A3, 0xE285B3, 0xE285A4, 0xE285B4, 0xE285A5, 0xE285B5, 0xE285A6,
0xE285B6, 0xE285A7, 0xE285B7, 0xE285A8, 0xE285B8, 0xE285A9, 0xE285B9, 0xE285AA, 0xE285BA, 0xE285AB, 0xE285BB, 0xE285AC, 0xE285BC,
0xE285AD, 0xE285BD, 0xE285AE, 0xE285BE, 0xE285AF, 0xE285BF,
0xE28683, 0xE28684,
0xE292B6, 0xE29390, 0xE292B7, 0xE29391, 0xE292B8, 0xE29392, 0xE292B9, 0xE29393, 0xE292BA, 0xE29394, 0xE292BB, 0xE29395, 0xE292BC,
0xE29396, 0xE292BD, 0xE29397, 0xE292BE, 0xE29398, 0xE292BF, 0xE29399,
0xE29380, 0xE2939A, 0xE29381, 0xE2939B, 0xE29382, 0xE2939C, 0xE29383, 0xE2939D, 0xE29384, 0xE2939E, 0xE29385, 0xE2939F, 0xE29386,
0xE293A0, 0xE29387, 0xE293A1, 0xE29388, 0xE293A2, 0xE29389, 0xE293A3, 0xE2938A, 0xE293A4, 0xE2938B, 0xE293A5, 0xE2938C, 0xE293A6,
0xE2938D, 0xE293A7, 0xE2938E, 0xE293A8, 0xE2938F, 0xE293A9,
0xE2B080, 0xE2B0B0, 0xE2B081, 0xE2B0B1, 0xE2B082, 0xE2B0B2, 0xE2B083, 0xE2B0B3, 0xE2B084, 0xE2B0B4, 0xE2B085, 0xE2B0B5, 0xE2B086,
0xE2B0B6, 0xE2B087, 0xE2B0B7, 0xE2B088, 0xE2B0B8, 0xE2B089, 0xE2B0B9, 0xE2B08A, 0xE2B0BA, 0xE2B08B, 0xE2B0BB, 0xE2B08C, 0xE2B0BC,
0xE2B08D, 0xE2B0BD, 0xE2B08E, 0xE2B0BE, 0xE2B08F, 0xE2B0BF, 0xE2B090, 0xE2B180, 0xE2B091, 0xE2B181, 0xE2B092, 0xE2B182, 0xE2B093,
0xE2B183, 0xE2B094, 0xE2B184, 0xE2B095, 0xE2B185, 0xE2B096, 0xE2B186, 0xE2B097, 0xE2B187, 0xE2B098, 0xE2B188, 0xE2B099, 0xE2B189,
0xE2B09A, 0xE2B18A, 0xE2B09B, 0xE2B18B, 0xE2B09C, 0xE2B18C, 0xE2B09D, 0xE2B18D, 0xE2B09E, 0xE2B18E, 0xE2B09F, 0xE2B18F, 0xE2B0A0,
0xE2B190, 0xE2B0A1, 0xE2B191, 0xE2B0A2, 0xE2B192, 0xE2B0A3, 0xE2B193, 0xE2B0A4, 0xE2B194, 0xE2B0A5, 0xE2B195, 0xE2B0A6, 0xE2B196,
0xE2B0A7, 0xE2B197, 0xE2B0A8, 0xE2B198, 0xE2B0A9, 0xE2B199, 0xE2B0AA, 0xE2B19A, 0xE2B0AB, 0xE2B19B, 0xE2B0AC, 0xE2B19C, 0xE2B0AD,
0xE2B19D, 0xE2B0AE, 0xE2B19E,
0xE2B1A0, 0xE2B1A1, 0xE2B1A2, 0xC9AB, 0xE2B1A3, 0xE1B5BD, 0xE2B1A4, 0xC9BD, 0xE2B1A7, 0xE2B1A8, 0xE2B1A9, 0xE2B1AA, 0xE2B1AB,
0xE2B1AC, 0xE2B1AD, 0xC991, 0xE2B1AE, 0xC9B1, 0xE2B1AF, 0xC990, 0xE2B1B0, 0xC992, 0xE2B1B2, 0xE2B1B3, 0xE2B1B5, 0xE2B1B6,
0xE2B1BE, 0xC8BF, 0xE2B1BF, 0xC980,
0xE2B280, 0xE2B281, 0xE2B282, 0xE2B283, 0xE2B284, 0xE2B285, 0xE2B286, 0xE2B287, 0xE2B288, 0xE2B289, 0xE2B28A, 0xE2B28B, 0xE2B28C,
0xE2B28D, 0xE2B28E, 0xE2B28F, 0xE2B290, 0xE2B291, 0xE2B292, 0xE2B293, 0xE2B294, 0xE2B295, 0xE2B296, 0xE2B297, 0xE2B298, 0xE2B299,
0xE2B29A, 0xE2B29B, 0xE2B29C, 0xE2B29D, 0xE2B29E, 0xE2B29F, 0xE2B2A0, 0xE2B2A1, 0xE2B2A2, 0xE2B2A3, 0xE2B2A4, 0xE2B2A5, 0xE2B2A6,
0xE2B2A7, 0xE2B2A8, 0xE2B2A9, 0xE2B2AA, 0xE2B2AB, 0xE2B2AC, 0xE2B2AD, 0xE2B2AE, 0xE2B2AF, 0xE2B2B0, 0xE2B2B1, 0xE2B2B2, 0xE2B2B3,
0xE2B2B4, 0xE2B2B5, 0xE2B2B6, 0xE2B2B7, 0xE2B2B8, 0xE2B2B9, 0xE2B2BA, 0xE2B2BB, 0xE2B2BC, 0xE2B2BD, 0xE2B2BE, 0xE2B2BF,
0xE2B380, 0xE2B381, 0xE2B382, 0xE2B383, 0xE2B384, 0xE2B385, 0xE2B386, 0xE2B387, 0xE2B388, 0xE2B389, 0xE2B38A, 0xE2B38B, 0xE2B38C,
0xE2B38D, 0xE2B38E, 0xE2B38F, 0xE2B390, 0xE2B391, 0xE2B392, 0xE2B393, 0xE2B394, 0xE2B395, 0xE2B396, 0xE2B397, 0xE2B398, 0xE2B399,
0xE2B39A, 0xE2B39B, 0xE2B39C, 0xE2B39D, 0xE2B39E, 0xE2B39F, 0xE2B3A0, 0xE2B3A1, 0xE2B3A2, 0xE2B3A3, 0xE2B3AB, 0xE2B3AC, 0xE2B3AD,
0xE2B3AE, 0xE2B3B2, 0xE2B3B3,
0xEA9980, 0xEA9981, 0xEA9982, 0xEA9983, 0xEA9984, 0xEA9985, 0xEA9986, 0xEA9987, 0xEA9988, 0xEA9989, 0xEA998A, 0xEA998B, 0xEA998C,
0xEA998D, 0xEA998E, 0xEA998F, 0xEA9990, 0xEA9991, 0xEA9992, 0xEA9993, 0xEA9994, 0xEA9995, 0xEA9996, 0xEA9997, 0xEA9998, 0xEA9999,
0xEA999A, 0xEA999B, 0xEA999C, 0xEA999D, 0xEA999E, 0xEA999F, 0xEA99A0, 0xEA99A1, 0xEA99A2, 0xEA99A3, 0xEA99A4, 0xEA99A5, 0xEA99A6,
0xEA99A7, 0xEA99A8, 0xEA99A9, 0xEA99AA, 0xEA99AB, 0xEA99AC, 0xEA99AD,
0xEA9A80, 0xEA9A81, 0xEA9A82, 0xEA9A83, 0xEA9A84, 0xEA9A85, 0xEA9A86, 0xEA9A87, 0xEA9A88, 0xEA9A89, 0xEA9A8A, 0xEA9A8B, 0xEA9A8C,
0xEA9A8D, 0xEA9A8E, 0xEA9A8F, 0xEA9A90, 0xEA9A91, 0xEA9A92, 0xEA9A93, 0xEA9A94, 0xEA9A95, 0xEA9A96, 0xEA9A97, 0xEA9A98, 0xEA9A99,
0xEA9A9A, 0xEA9A9B,
0xEA9CA2, 0xEA9CA3, 0xEA9CA4, 0xEA9CA5, 0xEA9CA6, 0xEA9CA7, 0xEA9CA8, 0xEA9CA9, 0xEA9CAA, 0xEA9CAB, 0xEA9CAC, 0xEA9CAD, 0xEA9CAE,
0xEA9CAF, 0xEA9CB2, 0xEA9CB3, 0xEA9CB4, 0xEA9CB5, 0xEA9CB6, 0xEA9CB7, 0xEA9CB8, 0xEA9CB9, 0xEA9CBA, 0xEA9CBB, 0xEA9CBC, 0xEA9CBD,
0xEA9CBE, 0xEA9CBF,
0xEA9D80, 0xEA9D81, 0xEA9D82, 0xEA9D83, 0xEA9D84, 0xEA9D85, 0xEA9D86, 0xEA9D87, 0xEA9D88, 0xEA9D89, 0xEA9D8A, 0xEA9D8B, 0xEA9D8C,
0xEA9D8D, 0xEA9D8E, 0xEA9D8F, 0xEA9D90, 0xEA9D91, 0xEA9D92, 0xEA9D93, 0xEA9D94, 0xEA9D95, 0xEA9D96, 0xEA9D97, 0xEA9D98, 0xEA9D99,
0xEA9D9A, 0xEA9D9B, 0xEA9D9C, 0xEA9D9D, 0xEA9D9E, 0xEA9D9F, 0xEA9DA0, 0xEA9DA1, 0xEA9DA2, 0xEA9DA3, 0xEA9DA4, 0xEA9DA5, 0xEA9DA6,
0xEA9DA7, 0xEA9DA8, 0xEA9DA9, 0xEA9DAA, 0xEA9DAB, 0xEA9DAC, 0xEA9DAD, 0xEA9DAE, 0xEA9DAF, 0xEA9DB9, 0xEA9DBA, 0xEA9DBB, 0xEA9DBC,
0xEA9DBD, 0xE1B5B9, 0xEA9DBE, 0xEA9DBF,
0xEA9E80, 0xEA9E81, 0xEA9E82, 0xEA9E83, 0xEA9E84, 0xEA9E85, 0xEA9E86, 0xEA9E87, 0xEA9E8B, 0xEA9E8C, 0xEA9E8D, 0xC9A5, 0xEA9E90,
0xEA9E91, 0xEA9E92, 0xEA9E93, 0xEA9E96, 0xEA9E97, 0xEA9E98, 0xEA9E99, 0xEA9E9A, 0xEA9E9B, 0xEA9E9C, 0xEA9E9D, 0xEA9E9E, 0xEA9E9F,
0xEA9EA0, 0xEA9EA1, 0xEA9EA2, 0xEA9EA3, 0xEA9EA4, 0xEA9EA5, 0xEA9EA6, 0xEA9EA7, 0xEA9EA8, 0xEA9EA9, 0xEA9EAA, 0xC9A6, 0xEA9EAB,
0xC99C, 0xEA9EAC, 0xC9A1, 0xEA9EAD, 0xC9AC, 0xEA9EB0, 0xCA9E, 0xEA9EB1, 0xCA87, 0xEA9EB2, 0xCA9D, 0xEA9EB3, 0xEAAD93, 0xEA9EB4,
0xEA9EB5, 0xEA9EB6, 0xEA9EB7,
0xEFBCA1, 0xEFBD81, 0xEFBCA2, 0xEFBD82, 0xEFBCA3, 0xEFBD83, 0xEFBCA4, 0xEFBD84, 0xEFBCA5, 0xEFBD85, 0xEFBCA6, 0xEFBD86, 0xEFBCA7,
0xEFBD87, 0xEFBCA8, 0xEFBD88, 0xEFBCA9, 0xEFBD89, 0xEFBCAA, 0xEFBD8A, 0xEFBCAB, 0xEFBD8B, 0xEFBCAC, 0xEFBD8C, 0xEFBCAD, 0xEFBD8D,
0xEFBCAE, 0xEFBD8E, 0xEFBCAF, 0xEFBD8F, 0xEFBCB0, 0xEFBD90, 0xEFBCB1, 0xEFBD91, 0xEFBCB2, 0xEFBD92, 0xEFBCB3, 0xEFBD93, 0xEFBCB4,
0xEFBD94, 0xEFBCB5, 0xEFBD95, 0xEFBCB6, 0xEFBD96, 0xEFBCB7, 0xEFBD97, 0xEFBCB8, 0xEFBD98, 0xEFBCB9, 0xEFBD99, 0xEFBCBA, 0xEFBD9A};
map <uint32_t, uint32_t> result;
for (int i = 0; i < sizeof(toLowerTable) / sizeof(toLowerTable[0]); ++i) {
if (i % 2) {
uint32_t key = toLowerTable[i-1];
uint32_t val = toLowerTable[i];
key = swap32(key);
val = swap32(val);
while (!(key & 0xFF)) key = key >> 8;
while (!(val & 0xFF)) val = val >> 8;
result[key] = val;
}
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment