21#include "kmime_charfreq_p.h"
22#include "kmime_debug.h"
42static inline bool isWS(
char ch)
44 return (ch ==
'\t' || ch ==
' ');
47void CharFreq::count(
const char *it,
size_t len)
49 const char *
end = it + len;
50 uint currentLineLength = 0;
54 char prevPrevChar = 0;
56 for (; it !=
end ; ++it) {
59 case '\0': ++mNUL;
break;
60 case '\r': ++mCR;
break;
62 if (prevChar ==
'\r') {
63 --currentLineLength; ++mCRLF;
65 if (currentLineLength >= mLineMax) {
66 mLineMax = currentLineLength - 1;
68 if (currentLineLength <= mLineMin) {
69 mLineMin = currentLineLength - 1;
73 (prevChar ==
'\r' && isWS(prevPrevChar))) {
77 currentLineLength = 0;
81 if (prevChar ==
'\n' && end - it >= 5 &&
82 !qstrncmp(
"From ", it, 5)) {
90 if (c ==
'\t' || (c >=
' ' && c <=
'~')) {
92 }
else if (c == 127 || c <
' ') {
99 prevPrevChar = prevChar;
104 if (currentLineLength >= mLineMax) {
105 mLineMax = currentLineLength;
107 if (currentLineLength <= mLineMin) {
108 mLineMin = currentLineLength;
112 if (isWS(prevChar)) {
119bool CharFreq::isEightBitData()
const
121 return type() == EightBitData;
124bool CharFreq::isEightBitText()
const
126 return type() == EightBitText;
129bool CharFreq::isSevenBitData()
const
131 return type() == SevenBitData;
134bool CharFreq::isSevenBitText()
const
136 return type() == SevenBitText;
139bool CharFreq::hasTrailingWhitespace()
const
144bool CharFreq::hasLeadingFrom()
const
149CharFreq::Type CharFreq::type()
const
152 qCDebug(KMIME_LOG)(
"Total: %d; NUL: %d; CTL: %d;\n"
153 "CR: %d; LF: %d; CRLF: %d;\n"
154 "lineMin: %d; lineMax: %d;\n"
155 "printable: %d; eightBit: %d;\n"
156 "trailing whitespace: %s;\n"
157 "leading 'From ': %s;\n",
158 total, NUL, CTL, CR, LF, CRLF, lineMin, lineMax,
160 mTrailingWS ?
"yes" :
"no" , mLeadingFrom ?
"yes" :
"no");
168 if (mLineMax > 988) {
171 if ((mLF != mCRLF && mCRLF > 0) || mCR != mCRLF || controlCodesRatio() > 0.2) {
178 if (mLineMax > 988) {
181 if ((mLF != mCRLF && mCRLF > 0) || mCR != mCRLF || controlCodesRatio() > 0.2) {
189float CharFreq::printableRatio()
const
192 return float(mPrintable) / float(mTotal);
198float CharFreq::controlCodesRatio()
const
201 return float(mCTL) / float(mTotal);
Type type(const QSqlDatabase &db)
const QList< QKeySequence > & end()
const_pointer data() const const
bool isEmpty() const const
qsizetype size() const const