[hunspell-fi-devel] Yhdyssanat ja CVS:n käyttöönotto
Harri Pitkänen
hatapitk at cc.jyu.fi
Fri Jan 27 11:53:19 EET 2006
On Friday 27 January 2006 01:13, Reijo Tomperi wrote:
> Harri Pitkänen wrote:
> > Ongelma on
> > siinä, että jos yhdyssanojen tunnistuksen ottaa käyttöön ja sitten kutsuu
> > Hunspellin morph-funktiota sellaisella yhdyssanalla, jonka jälkiosa on
> > taivutettu, Hunspell kaatuu.
>
> Kaatumiset on perinteisesti helppoja korjata ilman mitään ymmärrystä
> projektista. Korjaaminen onnistuu muokkaamalla affixmgr.cxx tiedostoa.
> Sieltä etsii kaksi paikkaa joissa on rivi:
> line_uniq(m);
>
> Ja muuttaa rivit:
> line_uniq(m);
> if (strchr(m, '\n')) {
> strcat(*result, "(");
> strcat(*result, line_join(m, '|'));
> strcat(*result, ")");
> } else {
> strcat(*result, m);
> }
> free(m);
>
> Tähän muotoon:
> if( m )
> {
> line_uniq(m);
> if (strchr(m, '\n')) {
> strcat(*result, "(");
> strcat(*result, line_join(m, '|'));
> strcat(*result, ")");
> } else {
> strcat(*result, m);
> }
> free(m);
> }
>
> Eli periaatteessa tarkistaa vain että onko m NULL ennenkuin käyttää
> sitä.Mutta en todellakaan tiedä pitäisikö resultille tehdä jotain siinä
> tapauksessa jos m on NULL. Enkä tiedä sitäkään saisiko m olla tuossa
> paikassa NULL vai onko virhe tapahtunut jo aikaisemmin. Mutta ainakaan
> se ei kaadu (tuohon) jos nuo korjaukset tekee. En raportoinut tästä
> hunspell-projektille. Jos joku pitää tuota hyvänä korjauksena, siitä voi
> minun puolestani kertoa kenelle haluaa.
Saattaahan tuo korjaus riittääkin, mutta mielestäni alkuperäisessä koodissa on
myös jonkinlainen logiikkavirhe jonka haluan ymmärtää ennen kuin alan sitä
korjaamaan. Tiedosto affixmgr.cxx, rivit 2103 - 2108:
char * m = NULL;
if (compoundflag) m = affix_check_morph((word+i),strlen(word+i),
compoundflag);
if ((!m || *m == '\0') && compoundend)
m = affix_check_morph((word+i),strlen(word+i), compoundend);
strcat(*result, presult);
line_uniq(m);
Funktiota affix_check_morph tutkimalla näyttää siltä, että se ei voi palauttaa
nullia. Toisaalta line_uniq edellyttää, että m != NULL. Siispä tuossa on
ajateltu, että jomman kumman if-lauseen ehdon olisi oltava tosi, mutta näin
ei käytännössä näytä olevan.
Pitääkin katsella tuota tarkemmin, ehkä tähän sitenkin ratkaisu löytyy kun
virhe on saatu rajattua.
Harri
More information about the devel
mailing list