diff options
Diffstat (limited to 'i18npool')
-rw-r--r-- | i18npool/source/search/levdis.cxx | 91 | ||||
-rw-r--r-- | i18npool/source/search/levdis.hxx | 4 |
2 files changed, 49 insertions, 46 deletions
diff --git a/i18npool/source/search/levdis.cxx b/i18npool/source/search/levdis.cxx index 9af44307a99b..d23a27826307 100644 --- a/i18npool/source/search/levdis.cxx +++ b/i18npool/source/search/levdis.cxx @@ -68,7 +68,7 @@ #endif #define LEVDISBIG (nLimit + 1) // Return value if distance > nLimit -#define LEVDISDOUBLEBUF 2048 // dadrueber wird nicht mehr gedoppelt +#define LEVDISDOUBLEBUF 2048 // no doubling atop this border static sal_Int32 Impl_WLD_StringLen( const sal_Unicode* pStr ) { @@ -84,19 +84,18 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) int nSPMin = 0; // penalty point Minimum int nRepS = 0; // for SplitCount - // Laengendifferenz von Pattern und String + // length difference between pattern and string int nLenDiff = nPatternLen - nStars - nStringLen; - // mehr Einfuegungen oder Loeschungen noetig als Limit? => raus hier + // more insertions or deletions necessary as the limit? Then leave if ( (nLenDiff * nInsQ0 > nLimit) || ((nStars == 0) && (nLenDiff * nDelR0 < -nLimit)) ) return(LEVDISBIG); - // wenn der zu vergleichende String groesser ist als das bisherige Array - // muss dieses angepasst werden + // comparative String greater than instantaneous array + // -> adapt array size if ( nStringLen >= nArrayLen ) { - // gib ihm moeglichst mehr, damit nicht gleich naechstesmal - // wieder realloziert werden muss + // increase size much more to avoid reallocation if ( nStringLen < LEVDISDOUBLEBUF ) nArrayLen = 2 * nStringLen; else @@ -104,18 +103,18 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) npDistance = aDisMem.NewMem( nArrayLen ); } - // Anfangswerte der zweiten Spalte (erstes Pattern-Zeichen) berechnen - // die erste Spalte (0-Len Pattern) ist immer 0 .. nStringLen * nInsQ0, - // deren Minimum also 0 + // calculate start values of the second column(first Pattern-value) + // first column (0-Len Pattern) is always zero .. nStringLen * nInsQ0, + // therefore the minimum is 0 if ( nPatternLen == 0 ) { - // Anzahl der Loeschungen, um auf Pattern zu kommen + // Count of deletions, to determine the Pattern for ( sal_Int32 i=0; i <= nStringLen; i++ ) npDistance[i] = i * nDelR0; } else if ( cpPattern[0] == '*' && bpPatIsWild[0] ) { - // statt einem '*' ist alles einsetzbar + // instead of a '*' you can fit in anything for ( sal_Int32 i=0; i <= nStringLen; i++ ) npDistance[i] = 0; } @@ -125,11 +124,11 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) int nP; c = cpPattern[0]; if ( c == '?' && bpPatIsWild[0] ) - nP = 0; // ein '?' kann jedes Zeichen sein + nP = 0; // a '?' could be any character. else - // Minimum von Ersetzen und Loeschen+Einfuegen Gewichtung + // Minimum replace and delete +insert weighting nP = Min3( nRepP0, nRepP0, nDelR0 + nInsQ0 ); - npDistance[0] = nInsQ0; // mit einfachem Einfuegen geht's los + npDistance[0] = nInsQ0; // start with simple insert npDistance[1] = nInsQ0; npDistance[2] = nInsQ0; int nReplacePos = -1; // tristate flag @@ -137,22 +136,22 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) for ( sal_Int32 i=1; i <= nStringLen; i++, nDelCnt += nDelR0 ) { if ( cString[i-1] == c ) - nP = 0; // Replace ab dieser Stelle ist 0 - // Loeschungen um auf Pattern zu kommen + Replace + nP = 0; // Replace from this postion with 0 + // Deletion to determine the Pattern + Replace npDistance[i] = nDelCnt + nP; if ( bSplitCount ) { if ( nReplacePos < 0 && nP ) - { // diese Stelle wird ersetzt + { // this Postion will be replaced nRepS++; nReplacePos = i; } else if ( nReplacePos > 0 && !nP ) { - // gleiche Anzahl c + // same count c int nBalance = levdisbalance( 0, i-1, c, cString, nStringLen ); if ( !nBalance ) - { // einer wurde ersetzt, der ein Insert war + { // an insert was replaced nRepS--; nReplacePos = 0; } @@ -162,8 +161,8 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) nSPMin = Min3( npDistance[0], npDistance[1], npDistance[2] ); } - // Distanzmatrix berechnen - sal_Int32 j = 0; // fuer alle Spalten des Pattern, solange nicht Limit + // calculate distance matrix + sal_Int32 j = 0; //for all columns of the pattern, till limit is not reached while ( (j < nPatternLen-1) && nSPMin <= (bSplitCount ? 2 * nLimit : nLimit) ) { @@ -172,26 +171,26 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) j++; c = cpPattern[j]; - if ( bpPatIsWild[j] ) // '*' oder '?' nicht escaped - nP = 0; // kann ohne Strafpunkte ersetzt werden + if ( bpPatIsWild[j] ) // '*' or '?' not escaped + nP = 0; // could be replaced without penalty else nP = nRepP0; if ( c == '*' && bpPatIsWild[j] ) { - nQ = 0; // Einfuegen und Loeschen ohne Strafpunkte + nQ = 0; // instertion/deletion without penalty nR = 0; } else { - nQ = nInsQ0; // normale Gewichtung + nQ = nInsQ0; //usual weighting nR = nDelR0; } d2 = npDistance[0]; - // Anzahl Einfuegungen um von Null-String auf Pattern zu kommen erhoehen + // increase insert count to get from null sting to pattern npDistance[0] = npDistance[0] + nQ; nSPMin = npDistance[0]; int nReplacePos = -1; // tristate Flag - // fuer jede Patternspalte den String durchgehen + // for each pattern column run though the string for ( sal_Int32 i=1; i <= nStringLen; i++ ) { d1 = d2; // WLD( X(i-1), Y(j-1) ) @@ -204,7 +203,7 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) // same quantity c int nBalance = levdisbalance( j, i-1, c, cString, nStringLen ); if ( !nBalance ) - nReplacePos = 0; // keine Ersetzung mehr + nReplacePos = 0; // no replacement } } else @@ -223,17 +222,21 @@ int WLevDistance::WLD( const sal_Unicode* cString, sal_Int32 nStringLen ) nReplacePos = i; } else if ( nReplacePos > 0 && !nPij ) - { // Zeichen in String und Pattern gleich. - // wenn ab hier die gleiche Anzahl dieses Zeichens - // sowohl in Pattern als auch in String ist, und vor - // dieser Stelle das Zeichen gleich oft vorkommt, war das - // Replace keins. Buchstabendreher werden hier erfasst - // und der ReplaceS zurueckgenommen, wodurch das doppelte - // Limit zum Tragen kommt. - // same quantity c + { + // character is equal in string and pattern + // + //If from this point: + //* pattern and string have the same count of this character + //* and character count is the same before this position + //the replace was none. + // + //Scrambled letters are recognized and the replace is withdrawed. + //Whereby the double limit comes to fuition. + // + //Same quantity c int nBalance = levdisbalance( j, i-1, c, cString, nStringLen ); if ( !nBalance ) - { // einer wurde ersetzt, der ein Insert war + { // insert was replaced nRepS--; nReplacePos = 0; } @@ -284,8 +287,8 @@ int WLevDistance::CalcLPQR( int nX, int nY, int nZ, bool bRelaxed ) return( nLimit ); } -// Groesster Gemeinsamer Teiler nach Euklid (Kettendivision) -// Sonderfall: 0 und irgendwas geben 1 +// greatest common divisior according to Euklid (chaindivision) +// special case: 0 plus anything produces 1 int WLevDistance::GGT( int a, int b ) { if ( !a || !b ) @@ -302,10 +305,10 @@ int WLevDistance::GGT( int a, int b ) return( a ? a : b); } -// Kleinstes Gemeinsames Vielfaches: a * b / GGT(a,b) +// least common multiple : a * b / GGT(a,b) int WLevDistance::KGV( int a, int b ) { - if ( a > b ) // Ueberlauf unwahrscheinlicher machen + if ( a > b ) // decrease owerflow chance return( (a / GGT(a,b)) * b ); else return( (b / GGT(a,b)) * a ); @@ -341,7 +344,7 @@ int WLevDistance::Max3( int x, int y, int z ) return( y > z ? y : z ); } -// Daten aus CTor initialisieren +// initialize data from CTOR void WLevDistance::InitData( const sal_Unicode* cPattern ) { cpPattern = aPatMem.GetcPtr(); @@ -366,7 +369,7 @@ void WLevDistance::InitData( const sal_Unicode* cPattern ) else if ( *cp1 == '*' || *cp1 == '?' ) // Joker { if ( *cp1 == '*' ) - nStars++; // Sternchenzaehler erhoehen + nStars++; *bp++ = true; } else diff --git a/i18npool/source/search/levdis.hxx b/i18npool/source/search/levdis.hxx index 7a477ea17550..74d4678838dc 100644 --- a/i18npool/source/search/levdis.hxx +++ b/i18npool/source/search/levdis.hxx @@ -132,8 +132,8 @@ class WLevDistance inline int Min3( int x, int y, int z ); // inline wegen Schleife int Mid3( int x, int y, int z ); int Max3( int x, int y, int z ); - int GGT( int a, int b ); // Groesster Gemeinsamer Teiler - int KGV( int a, int b ); // Kleinstes Gemeinsames Vielfaches + int GGT( int a, int b ); // Groesster Gemeinsamer Teiler + int KGV( int a, int b ); // Kleinstes Gemeinsames Vielfaches public: // CToren mit Userangaben, danach mit GetLimit() Limit holen |