tchildrencount count() { if(next) return 1 + next->count(); else return 1; }
int cmp(const Lemma * lt) { assert(Type != 0); assert(lt->Type != 0); int strdif = strcmp(Type,lt->Type); if(strdif) return strdif; assert(BaseForm != 0); assert(lt->BaseForm != 0); strdif = strcmp(BaseForm,lt->BaseForm); if(strdif) return strdif; if(S.Offset > lt->S.Offset) return 1; else if(S.Offset < lt->S.Offset) return -1; if(S.frequency > lt->S.frequency) return 1; else if(S.frequency < lt->S.frequency) return -1; if(next) { assert(lt->next); return next->cmp(lt->next); } else return 0; }
int print(FILE * fp) { fprintf(fp,"%d %s %s %d",S.Offset,BaseForm,Type,S.frequency); if(next) { fprintf(fp,","); return 1 + next->print(fp); } return 1; }
tcount strcnt() { tcount ret = 0; if(*Type) ret = 1; if(*BaseForm) ret += 1; if(next) ret += next->strcnt(); return ret; }
void move(tcount pos) { LEMMAS[pos].Type = Type; LEMMAS[pos].BaseForm = BaseForm; LEMMAS[pos].S = S; if(next) { LEMMAS[pos].next = LEMMAS + pos + 1; next->move(pos + 1); } }
bool addFreq(char * lextype,int n,char * bf,bool relaxed,unsigned int offset) { bool added = false; int off = offset - S.Offset; if(!strcmp(lextype,Type) && (!bf || /*S.Offset == offset*/ off >= 0)) { if(relaxed) { assert(bf); char * bfoff = bf + S.Offset; int len = strlen(bfoff); if(!strncmp(BaseForm,bfoff,len) && BaseForm[len] == ',') { S.frequency += n; added = true; //return true; } } else { if(!bf || !strcmp(bf + S.Offset,BaseForm)) { S.frequency += n; added = true; //return true; } } } /*else*/ // Full form may have several (equal or different) base forms // all having the same type! if(next) // TODO Bart 20060829. Shouldn't the next line be // return next->addFreq(lextype,n,bf,relaxed,offset) || added; // ? // Bart 20061114 added || added return next->addFreq(lextype,n,bf,relaxed,offset) || added; else { if(added) { return true; } else { notypematch++; notypematchcnt += n; return false; } } }
tcount Lemma::printLemmas(tcount pos,DictNode * parent,FILE * fp) { if(parent) { fprintf(fp,PERCLD ": ",pos); } fprintf(fp,"%d %s %s %d",S.Offset,BaseForm,Type,S.frequency); if(next) { fprintf(fp,","); return next->printLemmas(pos + 1,NULL,fp); } else return pos + 1; }
bool add(char * lextype,char * baseform,int offset) { if( strcmp(lextype,Type) || strcmp(baseform,BaseForm) || (unsigned int)offset != S.Offset ) { if(next) return next->add(lextype,baseform,offset); else { next = new Lemma(lextype,baseform,offset); return true; } } return false; }
bool addFreq(char * lextype,int n,char * bf,bool relaxed,ptrdiff_t offset)/*20120709 unsigned int -> ptrdiff_t*/ { bool added = false; ptrdiff_t off = offset - S.Offset;/*20120709 int -> ptrdiff_t*/ if(!strcmp(lextype,Type) && (!bf || off >= 0)) { if(relaxed) { assert(bf); char * bfoff = bf + S.Offset; size_t len = strlen(bfoff); if(!strncmp(BaseForm,bfoff,len) && BaseForm[len] == ',') { S.frequency += n; added = true; //return true; } } else { if(!bf || !strcmp(bf + S.Offset,BaseForm)) { S.frequency += n; added = true; //return true; } } } /*else*/ // Full form may have several (equal or different) base forms // all having the same type! if(next) return next->addFreq(lextype,n,bf,relaxed,offset) || added; else { if(added) { return true; } else { notypematch++; notypematchcnt += n; return false; } } }
void getStrings() { if(*Type) pstrings[istrings++] = &Type; else { delete [] Type; Type = nul; } if(*BaseForm) pstrings[istrings++] = &BaseForm; else { delete [] BaseForm; BaseForm = nul; } if(next) next->getStrings(); }
int cmp(const Lemma * lt) { int d = Type - lt->Type; if(d) return d; d = BaseForm - lt->BaseForm; if(d) return d; d = S.Offset - lt->S.Offset; if(d) return d; d = S.frequency - lt->S.frequency; if(d) return d; if(next) { assert(lt->next); return next->cmp(lt->next); } else return 0; }
void Lemmacnt(tcount * nLemmas) { ++*nLemmas; if(next) next->Lemmacnt(nLemmas); }