X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ftermlists.c;h=0b870bb1aab4bf8371203d313759562065fd704b;hb=75c525dda08ff50e17f262f58a44dbda873fa6a5;hp=b40e5b026cf413e0edab895be20b731e282bebbb;hpb=ba5951a80fdd0da1d28c318852b69a1178cd6bfa;p=pazpar2-moved-to-github.git diff --git a/src/termlists.c b/src/termlists.c index b40e5b0..0b870bb 100644 --- a/src/termlists.c +++ b/src/termlists.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2010 Index Data + Copyright (C) 2006-2011 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -107,15 +107,16 @@ static void update_highscore(struct termlist *tl, struct termlist_score *t) } } -void termlist_insert(struct termlist *tl, const char *term) +void termlist_insert(struct termlist *tl, const char *display_term, + const char *norm_term, int freq) { unsigned int bucket; struct termlist_bucket **p; char buf[256], *cp; - if (strlen(term) > 255) + if (strlen(norm_term) > 255) return; - strcpy(buf, term); + strcpy(buf, norm_term); /* chop right */ for (cp = buf + strlen(buf); cp != buf && strchr(",. -", cp[-1]); cp--) cp[-1] = '\0'; @@ -123,9 +124,9 @@ void termlist_insert(struct termlist *tl, const char *term) bucket = jenkins_hash((unsigned char *)buf) % tl->hash_size; for (p = &tl->hashtable[bucket]; *p; p = &(*p)->next) { - if (!strcmp(buf, (*p)->term.term)) + if (!strcmp(buf, (*p)->term.norm_term)) { - (*p)->term.frequency++; + (*p)->term.frequency += freq; update_highscore(tl, &((*p)->term)); break; } @@ -134,8 +135,10 @@ void termlist_insert(struct termlist *tl, const char *term) { struct termlist_bucket *new = nmem_malloc(tl->nmem, sizeof(struct termlist_bucket)); - new->term.term = nmem_strdup(tl->nmem, buf); - new->term.frequency = 1; + new->term.norm_term = nmem_strdup(tl->nmem, buf); + new->term.display_term = *display_term ? + nmem_strdup(tl->nmem, display_term) : new->term.norm_term; + new->term.frequency = freq; new->next = 0; *p = new; update_highscore(tl, &new->term); @@ -144,8 +147,12 @@ void termlist_insert(struct termlist *tl, const char *term) static int compare(const void *s1, const void *s2) { - struct termlist_score **p1 = (struct termlist_score**) s1, **p2 = (struct termlist_score **) s2; - return (*p2)->frequency - (*p1)->frequency; + struct termlist_score **p1 = (struct termlist_score **) s1; + struct termlist_score **p2 = (struct termlist_score **) s2; + int d = (*p2)->frequency - (*p1)->frequency; + if (d) + return d; + return strcmp((*p1)->display_term, (*p2)->display_term); } struct termlist_score **termlist_highscore(struct termlist *tl, int *len)