/usr/include/codeblocks/CharDistribution.h is in codeblocks-dev 16.01+dfsg-2.1.
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 | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef CharDistribution_h__
#define CharDistribution_h__
#include "nscore.h"
#define ENOUGH_DATA_THRESHOLD 1024
#define MINIMUM_DATA_THRESHOLD 4
class CharDistributionAnalysis
{
public:
CharDistributionAnalysis() {Reset(false);}
//feed a block of data and do distribution analysis
void HandleData(const char* aBuf, uint32_t aLen) {}
//Feed a character with known length
void HandleOneChar(const char* aStr, uint32_t aCharLen)
{
int32_t order;
//we only care about 2-bytes character in our distribution analysis
order = (aCharLen == 2) ? GetOrder(aStr) : -1;
if (order >= 0)
{
mTotalChars++;
//order is valid
if ((uint32_t)order < mTableSize)
{
if (512 > mCharToFreqOrder[order])
mFreqChars++;
}
}
}
//return confidence base on existing data
float GetConfidence(void);
//Reset analyser, clear any state
void Reset(bool aIsPreferredLanguage)
{
mDone = false;
mTotalChars = 0;
mFreqChars = 0;
mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD;
}
//It is not necessary to receive all data to draw conclusion. For charset detection,
// certain amount of data is enough
bool GotEnoughData() {return mTotalChars > ENOUGH_DATA_THRESHOLD;}
protected:
//we do not handle character base on its original encoding string, but
//convert this encoding string to a number, here called order.
//This allow multiple encoding of a language to share one frequency table
virtual int32_t GetOrder(const char* str) {return -1;}
//If this flag is set to true, detection is done and conclusion has been made
bool mDone;
//The number of characters whose frequency order is less than 512
uint32_t mFreqChars;
//Total character encounted.
uint32_t mTotalChars;
//Number of hi-byte characters needed to trigger detection
uint32_t mDataThreshold;
//Mapping table to get frequency order from char order (get from GetOrder())
const int16_t *mCharToFreqOrder;
//Size of above table
uint32_t mTableSize;
//This is a constant value varies from language to language, it is used in
//calculating confidence. See my paper for further detail.
float mTypicalDistributionRatio;
};
class EUCTWDistributionAnalysis: public CharDistributionAnalysis
{
public:
EUCTWDistributionAnalysis();
protected:
//for euc-TW encoding, we are interested
// first byte range: 0xc4 -- 0xfe
// second byte range: 0xa1 -- 0xfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{ if ((unsigned char)*str >= (unsigned char)0xc4)
return 94*((unsigned char)str[0]-(unsigned char)0xc4) + (unsigned char)str[1] - (unsigned char)0xa1;
else
return -1;
}
};
class EUCKRDistributionAnalysis : public CharDistributionAnalysis
{
public:
EUCKRDistributionAnalysis();
protected:
//for euc-KR encoding, we are interested
// first byte range: 0xb0 -- 0xfe
// second byte range: 0xa1 -- 0xfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{ if ((unsigned char)*str >= (unsigned char)0xb0)
return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1;
else
return -1;
}
};
class GB2312DistributionAnalysis : public CharDistributionAnalysis
{
public:
GB2312DistributionAnalysis();
protected:
//for GB2312 encoding, we are interested
// first byte range: 0xb0 -- 0xfe
// second byte range: 0xa1 -- 0xfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{ if ((unsigned char)*str >= (unsigned char)0xb0 && (unsigned char)str[1] >= (unsigned char)0xa1)
return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1;
else
return -1;
}
};
class Big5DistributionAnalysis : public CharDistributionAnalysis
{
public:
Big5DistributionAnalysis();
protected:
//for big5 encoding, we are interested
// first byte range: 0xa4 -- 0xfe
// second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{ if ((unsigned char)*str >= (unsigned char)0xa4)
if ((unsigned char)str[1] >= (unsigned char)0xa1)
return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0xa1 +63;
else
return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0x40;
else
return -1;
}
};
class SJISDistributionAnalysis : public CharDistributionAnalysis
{
public:
SJISDistributionAnalysis();
protected:
//for sjis encoding, we are interested
// first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
// second byte range: 0x40 -- 0x7e, 0x81 -- oxfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{
int32_t order;
if ((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f)
order = 188 * ((unsigned char)str[0]-(unsigned char)0x81);
else if ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xef)
order = 188 * ((unsigned char)str[0]-(unsigned char)0xe0 + 31);
else
return -1;
order += (unsigned char)*(str+1) - 0x40;
if ((unsigned char)str[1] > (unsigned char)0x7f)
order--;
return order;
}
};
class EUCJPDistributionAnalysis : public CharDistributionAnalysis
{
public:
EUCJPDistributionAnalysis();
protected:
//for euc-JP encoding, we are interested
// first byte range: 0xa0 -- 0xfe
// second byte range: 0xa1 -- 0xfe
//no validation needed here. State machine has done that
int32_t GetOrder(const char* str)
{ if ((unsigned char)*str >= (unsigned char)0xa0)
return 94*((unsigned char)str[0]-(unsigned char)0xa1) + (unsigned char)str[1] - (unsigned char)0xa1;
else
return -1;
}
};
#endif //CharDistribution_h__
|