KDECore
nsCharSetProber.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "nsCharSetProber.h"
00027
00028 #include <stdlib.h>
00029
00030 namespace kencodingprober {
00031
00032 bool nsCharSetProber::FilterWithoutEnglishLetters(const char* aBuf, unsigned int aLen, char** newBuf, unsigned int& newLen)
00033 {
00034 char *newptr;
00035 char *prevPtr, *curPtr;
00036
00037 bool meetMSB = false;
00038 newptr = *newBuf = (char*)malloc(aLen);
00039 if (!newptr)
00040 return false;
00041
00042 for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; ++curPtr)
00043 {
00044 if (*curPtr & 0x80)
00045 {
00046 meetMSB = true;
00047 }
00048 else if (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z')
00049 {
00050
00051 if (meetMSB && curPtr > prevPtr)
00052
00053 {
00054 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
00055 prevPtr++;
00056 *newptr++ = ' ';
00057 meetMSB = false;
00058 }
00059 else
00060 prevPtr = curPtr+1;
00061 }
00062 }
00063 if (meetMSB && curPtr > prevPtr)
00064 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
00065
00066 newLen = newptr - *newBuf;
00067
00068 return true;
00069 }
00070
00071
00072 bool nsCharSetProber::FilterWithEnglishLetters(const char* aBuf, unsigned int aLen, char** newBuf, unsigned int& newLen)
00073 {
00074
00075 char *newptr;
00076 char *prevPtr, *curPtr;
00077 bool isInTag = false;
00078
00079 newptr = *newBuf = (char*)malloc(aLen);
00080 if (!newptr)
00081 return false;
00082
00083 for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; ++curPtr)
00084 {
00085 if (*curPtr == '>')
00086 isInTag = false;
00087 else if (*curPtr == '<')
00088 isInTag = true;
00089
00090 if (!(*curPtr & 0x80) &&
00091 (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') )
00092 {
00093 if (curPtr > prevPtr && !isInTag)
00094
00095 {
00096 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
00097 prevPtr++;
00098 *newptr++ = ' ';
00099 }
00100 else
00101 prevPtr = curPtr+1;
00102 }
00103 }
00104
00105
00106
00107 if (!isInTag)
00108 while (prevPtr < curPtr)
00109 *newptr++ = *prevPtr++;
00110
00111 newLen = newptr - *newBuf;
00112
00113 return true;
00114 }
00115 }
00116
00117