nsSBCSGroupProber.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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <stdio.h>
00040 #include "prmem.h"
00041
00042 #include "nsSBCharSetProber.h"
00043 #include "nsSBCSGroupProber.h"
00044
00045 #include "nsHebrewProber.h"
00046
00047 nsSBCSGroupProber::nsSBCSGroupProber()
00048 {
00049 mProbers[0] = new nsSingleByteCharSetProber(&Win1251Model);
00050 mProbers[1] = new nsSingleByteCharSetProber(&Koi8rModel);
00051 mProbers[2] = new nsSingleByteCharSetProber(&Latin5Model);
00052 mProbers[3] = new nsSingleByteCharSetProber(&MacCyrillicModel);
00053 mProbers[4] = new nsSingleByteCharSetProber(&Ibm866Model);
00054 mProbers[5] = new nsSingleByteCharSetProber(&Ibm855Model);
00055 mProbers[6] = new nsSingleByteCharSetProber(&Latin7Model);
00056 mProbers[7] = new nsSingleByteCharSetProber(&Win1253Model);
00057 mProbers[8] = new nsSingleByteCharSetProber(&Latin5BulgarianModel);
00058 mProbers[9] = new nsSingleByteCharSetProber(&Win1251BulgarianModel);
00059
00060 nsHebrewProber *hebprober = new nsHebrewProber();
00061
00062
00063 mProbers[10] = hebprober;
00064 mProbers[11] = new nsSingleByteCharSetProber(&Win1255Model, PR_FALSE, hebprober);
00065 mProbers[12] = new nsSingleByteCharSetProber(&Win1255Model, PR_TRUE, hebprober);
00066
00067 if (mProbers[10] && mProbers[11] && mProbers[12])
00068 {
00069 hebprober->SetModelProbers(mProbers[11], mProbers[12]);
00070 }
00071 else
00072 {
00073 for (PRUint32 i = 10; i <= 12; ++i)
00074 {
00075 delete mProbers[i];
00076 mProbers[i] = 0;
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085 Reset();
00086 }
00087
00088 nsSBCSGroupProber::~nsSBCSGroupProber()
00089 {
00090 for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++)
00091 {
00092 delete mProbers[i];
00093 }
00094 }
00095
00096
00097 const char* nsSBCSGroupProber::GetCharSetName()
00098 {
00099
00100 if (mBestGuess == -1)
00101 {
00102 GetConfidence();
00103
00104 if (mBestGuess == -1)
00105
00106 mBestGuess = 0;
00107 }
00108 return mProbers[mBestGuess]->GetCharSetName();
00109 }
00110
00111 void nsSBCSGroupProber::Reset(void)
00112 {
00113 mActiveNum = 0;
00114 for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++)
00115 {
00116 if (mProbers[i])
00117 {
00118 mProbers[i]->Reset();
00119 mIsActive[i] = PR_TRUE;
00120 ++mActiveNum;
00121 }
00122 else
00123 mIsActive[i] = PR_FALSE;
00124 }
00125 mBestGuess = -1;
00126 mState = eDetecting;
00127 }
00128
00129
00130 nsProbingState nsSBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen)
00131 {
00132 nsProbingState st;
00133 PRUint32 i;
00134 char *newBuf1 = 0;
00135 PRUint32 newLen1 = 0;
00136
00137
00138
00139
00140
00141
00142
00143 if (!FilterWithoutEnglishLetters(aBuf, aLen, &newBuf1, newLen1))
00144 goto done;
00145
00146 if (newLen1 == 0)
00147 goto done;
00148
00149 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
00150 {
00151 if (!mIsActive[i])
00152 continue;
00153 st = mProbers[i]->HandleData(newBuf1, newLen1);
00154 if (st == eFoundIt)
00155 {
00156 mBestGuess = i;
00157 mState = eFoundIt;
00158 break;
00159 }
00160 else if (st == eNotMe)
00161 {
00162 mIsActive[i] = PR_FALSE;
00163 mActiveNum--;
00164 if (mActiveNum <= 0)
00165 {
00166 mState = eNotMe;
00167 break;
00168 }
00169 }
00170 }
00171
00172 done:
00173 PR_FREEIF(newBuf1);
00174
00175 return mState;
00176 }
00177
00178 float nsSBCSGroupProber::GetConfidence(void)
00179 {
00180 PRUint32 i;
00181 float bestConf = 0.0, cf;
00182
00183 switch (mState)
00184 {
00185 case eFoundIt:
00186 return (float)0.99;
00187 case eNotMe:
00188 return (float)0.01;
00189 default:
00190 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
00191 {
00192 if (!mIsActive[i])
00193 continue;
00194 cf = mProbers[i]->GetConfidence();
00195 if (bestConf < cf)
00196 {
00197 bestConf = cf;
00198 mBestGuess = i;
00199 }
00200 }
00201 }
00202 return bestConf;
00203 }
00204
00205 #ifdef DEBUG_chardet
00206 void nsSBCSGroupProber::DumpStatus()
00207 {
00208 PRUint32 i;
00209 float cf;
00210
00211 cf = GetConfidence();
00212 printf(" SBCS Group Prober --------begin status \r\n");
00213 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
00214 {
00215 if (!mIsActive[i])
00216 printf(" inactive: [%s] (i.e. confidence is too low).\r\n", mProbers[i]->GetCharSetName());
00217 else
00218 mProbers[i]->DumpStatus();
00219 }
00220 printf(" SBCS Group found best match [%s] confidence %f.\r\n",
00221 mProbers[mBestGuess]->GetCharSetName(), cf);
00222 }
00223 #endif