15 #include "kmime_charfreq.h"
19 CharFreq::CharFreq( const TQByteArray & buf )
33 count( buf.data(), buf.size() );
36 CharFreq::CharFreq( const char * buf, size_t len )
53 static inline bool isWS( char ch ) { return ( ch == '\t' || ch == ' ' ); }
55 void CharFreq::count( const char * it, size_t len ) {
57 const char * end = it + len;
58 uint currentLineLength = 0;
62 char prevPrevChar = 0;
64 for ( ; it != end ; ++it ) {
67 case '\0': ++NUL; break;
68 case '\r': ++CR; break;
70 if ( prevChar == '\r' ) { --currentLineLength; ++CRLF; }
71 if ( currentLineLength >= lineMax ) lineMax = currentLineLength-1;
72 if ( currentLineLength <= lineMin ) lineMin = currentLineLength-1;
74 if ( isWS( prevChar ) || ( prevChar == '\r' && isWS( prevPrevChar ) ) )
76 currentLineLength = 0;
80 if ( prevChar == '\n' && end - it >= 5 && !tqstrncmp( "From ", it, 5 ) )
87 if ( (c == '\t') || ((c >= ' ') && (c <= '~')) )
89 else if ( (c == 127) || (c < ' ') )
95 prevPrevChar = prevChar;
100 if ( currentLineLength >= lineMax ) lineMax = currentLineLength;
101 if ( currentLineLength <= lineMin ) lineMin = currentLineLength;
104 if ( isWS( prevChar ) )
110 bool CharFreq::isEightBitData() const {
111 return type() == EightBitData;
114 bool CharFreq::isEightBitText() const {
115 return type() == EightBitText;
118 bool CharFreq::isSevenBitData() const {
119 return type() == SevenBitData;
122 bool CharFreq::isSevenBitText() const {
123 return type() == SevenBitText;
126 bool CharFreq::hasTrailingWhitespace() const {
130 bool CharFreq::hasLeadingFrom() const {
134 CharFreq::Type CharFreq::type() const {
136 tqDebug( "Total: %d; NUL: %d; CTL: %d;\n"
137 "CR: %d; LF: %d; CRLF: %d;\n"
138 "lineMin: %d; lineMax: %d;\n"
139 "printable: %d; eightBit: %d;\n"
140 "trailing whitespace: %s;\n"
141 "leading 'From ': %s;\n",
142 total, NUL, CTL, CR, LF, CRLF, lineMin, lineMax,
144 mTrailingWS ? "yes" : "no" , mLeadingFrom ? "yes" : "no" );
151 if ( lineMax > 988 ) return EightBitData;
152 if ( CR != CRLF || controlCodesRatio() > 0.2 ) return EightBitData;
157 if ( lineMax > 988 ) return SevenBitData;
158 if ( CR != CRLF || controlCodesRatio() > 0.2 ) return SevenBitData;
164 float CharFreq::printableRatio() const {
165 if ( total ) return float(printable) / float(total);
169 float CharFreq::controlCodesRatio() const {
170 if ( total ) return float(CTL) / float(total);
|