77 *
88 *
99 * IDENTIFICATION
10- * $PostgreSQL: pgsql/src/backend/tsearch/spell.c,v 1.9 2008/01/01 19:45:52 momjian Exp $
10+ * $PostgreSQL: pgsql/src/backend/tsearch/spell.c,v 1.10 2008/01/16 13:01:03 teodor Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -1327,8 +1327,7 @@ addToResult(char **forms, char **cur, char *word)
13271327if (forms == cur || strcmp (word ,* (cur - 1 ))!= 0 )
13281328{
13291329* cur = pstrdup (word );
1330- cur ++ ;
1331- * cur = NULL ;
1330+ * (cur + 1 )= NULL ;
13321331return 1 ;
13331332}
13341333
@@ -1448,6 +1447,7 @@ NormalizeSubWord(IspellDict *Conf, char *word, int flag)
14481447typedef struct SplitVar
14491448{
14501449int nstem ;
1450+ int lenstem ;
14511451char * * stem ;
14521452struct SplitVar * next ;
14531453}SplitVar ;
@@ -1495,21 +1495,38 @@ CopyVar(SplitVar *s, int makedup)
14951495{
14961496SplitVar * v = (SplitVar * )palloc (sizeof (SplitVar ));
14971497
1498- v -> stem = (char * * )palloc (sizeof (char * )* (MAX_NORM ));
14991498v -> next = NULL ;
15001499if (s )
15011500{
15021501int i ;
15031502
1503+ v -> lenstem = s -> lenstem ;
1504+ v -> stem = (char * * )palloc (sizeof (char * )* v -> lenstem );
15041505v -> nstem = s -> nstem ;
15051506for (i = 0 ;i < s -> nstem ;i ++ )
15061507v -> stem [i ]= (makedup ) ?pstrdup (s -> stem [i ]) :s -> stem [i ];
15071508}
15081509else
1510+ {
1511+ v -> lenstem = 16 ;
1512+ v -> stem = (char * * )palloc (sizeof (char * )* v -> lenstem );
15091513v -> nstem = 0 ;
1514+ }
15101515return v ;
15111516}
15121517
1518+ static void
1519+ AddStem (SplitVar * v ,char * word )
1520+ {
1521+ if (v -> nstem >=v -> lenstem )
1522+ {
1523+ v -> lenstem *=2 ;
1524+ v -> stem = (char * * )repalloc (v -> stem ,sizeof (char * )* v -> lenstem );
1525+ }
1526+
1527+ v -> stem [v -> nstem ]= word ;
1528+ v -> nstem ++ ;
1529+ }
15131530
15141531static SplitVar *
15151532SplitToVariants (IspellDict * Conf ,SPNode * snode ,SplitVar * orig ,char * word ,int wordlen ,int startpos ,int minpos )
@@ -1550,11 +1567,13 @@ SplitToVariants(IspellDict *Conf, SPNode *snode, SplitVar *orig, char *word, int
15501567if (level + lenaff - 1 <=minpos )
15511568continue ;
15521569
1570+ if (lenaff >=MAXNORMLEN )
1571+ continue ;/* skip too big value */
15531572if (lenaff > 0 )
15541573memcpy (buf ,word + startpos ,lenaff );
15551574buf [lenaff ]= '\0' ;
15561575
1557- if (level == FF_COMPOUNDBEGIN )
1576+ if (level == 0 )
15581577compoundflag = FF_COMPOUNDBEGIN ;
15591578else if (level == wordlen - 1 )
15601579compoundflag = FF_COMPOUNDLAST ;
@@ -1572,8 +1591,7 @@ SplitToVariants(IspellDict *Conf, SPNode *snode, SplitVar *orig, char *word, int
15721591
15731592while (* sptr )
15741593{
1575- new -> stem [new -> nstem ]= * sptr ;
1576- new -> nstem ++ ;
1594+ AddStem (new ,* sptr );
15771595sptr ++ ;
15781596}
15791597pfree (subres );
@@ -1624,8 +1642,7 @@ SplitToVariants(IspellDict *Conf, SPNode *snode, SplitVar *orig, char *word, int
16241642if (wordlen == level + 1 )
16251643{
16261644/* well, it was last word */
1627- var -> stem [var -> nstem ]= pnstrdup (word + startpos ,wordlen - startpos );
1628- var -> nstem ++ ;
1645+ AddStem (var ,pnstrdup (word + startpos ,wordlen - startpos ) );
16291646pfree (notprobed );
16301647return var ;
16311648}
@@ -1639,8 +1656,7 @@ SplitToVariants(IspellDict *Conf, SPNode *snode, SplitVar *orig, char *word, int
16391656ptr -> next = SplitToVariants (Conf ,node ,var ,word ,wordlen ,startpos ,level );
16401657/* we can find next word */
16411658level ++ ;
1642- var -> stem [var -> nstem ]= pnstrdup (word + startpos ,level - startpos );
1643- var -> nstem ++ ;
1659+ AddStem (var ,pnstrdup (word + startpos ,level - startpos ) );
16441660node = Conf -> Dictionary ;
16451661startpos = level ;
16461662continue ;
@@ -1654,12 +1670,26 @@ SplitToVariants(IspellDict *Conf, SPNode *snode, SplitVar *orig, char *word, int
16541670level ++ ;
16551671}
16561672
1657- var -> stem [var -> nstem ]= pnstrdup (word + startpos ,wordlen - startpos );
1658- var -> nstem ++ ;
1673+ AddStem (var ,pnstrdup (word + startpos ,wordlen - startpos ) );
16591674pfree (notprobed );
16601675return var ;
16611676}
16621677
1678+ static void
1679+ addNorm (TSLexeme * * lres ,TSLexeme * * lcur ,char * word ,int flags ,uint16 NVariant )
1680+ {
1681+ if (* lres == NULL )
1682+ * lcur = * lres = (TSLexeme * )palloc (MAX_NORM * sizeof (TSLexeme ));
1683+
1684+ if (* lcur - * lres < MAX_NORM - 1 ) {
1685+ (* lcur )-> lexeme = word ;
1686+ (* lcur )-> flags = flags ;
1687+ (* lcur )-> nvariant = NVariant ;
1688+ (* lcur )++ ;
1689+ (* lcur )-> lexeme = NULL ;
1690+ }
1691+ }
1692+
16631693TSLexeme *
16641694NINormalizeWord (IspellDict * Conf ,char * word )
16651695{
@@ -1674,16 +1704,11 @@ NINormalizeWord(IspellDict *Conf, char *word)
16741704{
16751705char * * ptr = res ;
16761706
1677- lcur = lres = (TSLexeme * )palloc (MAX_NORM * sizeof (TSLexeme ));
1678- while (* ptr )
1707+ while (* ptr && (lcur - lres )< MAX_NORM )
16791708{
1680- lcur -> lexeme = * ptr ;
1681- lcur -> flags = 0 ;
1682- lcur -> nvariant = NVariant ++ ;
1683- lcur ++ ;
1709+ addNorm (& lres ,& lcur ,* ptr ,0 ,NVariant ++ );
16841710ptr ++ ;
16851711}
1686- lcur -> lexeme = NULL ;
16871712pfree (res );
16881713}
16891714
@@ -1704,28 +1729,18 @@ NINormalizeWord(IspellDict *Conf, char *word)
17041729{
17051730char * * subptr = subres ;
17061731
1707- if (!lcur )
1708- lcur = lres = (TSLexeme * )palloc (MAX_NORM * sizeof (TSLexeme ));
1709-
17101732while (* subptr )
17111733{
17121734for (i = 0 ;i < var -> nstem - 1 ;i ++ )
17131735{
1714- lcur -> lexeme = (subptr == subres ) ?var -> stem [i ] :pstrdup (var -> stem [i ]);
1715- lcur -> flags = 0 ;
1716- lcur -> nvariant = NVariant ;
1717- lcur ++ ;
1736+ addNorm (& lres ,& lcur , (subptr == subres ) ?var -> stem [i ] :pstrdup (var -> stem [i ]),0 ,NVariant );
17181737}
17191738
1720- lcur -> lexeme = * subptr ;
1721- lcur -> flags = 0 ;
1722- lcur -> nvariant = NVariant ;
1723- lcur ++ ;
1739+ addNorm (& lres ,& lcur ,* subptr ,0 ,NVariant );
17241740subptr ++ ;
17251741NVariant ++ ;
17261742}
17271743
1728- lcur -> lexeme = NULL ;
17291744pfree (subres );
17301745var -> stem [0 ]= NULL ;
17311746pfree (var -> stem [var -> nstem - 1 ]);