X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ftermlists.c;h=619fe3c8cf44409d79040b819031176d8562437a;hb=3d99aecedf9d6e6ebeadcedbee081049b03dbbf8;hp=7f32e3d9c6f650b031b676ffdda57aa91ce93f72;hpb=fe3383c0559a453df1e5076fc6faac6d1a11685c;p=pazpar2-moved-to-github.git diff --git a/src/termlists.c b/src/termlists.c index 7f32e3d..619fe3c 100644 --- a/src/termlists.c +++ b/src/termlists.c @@ -1,6 +1,25 @@ -/* - * $Id: termlists.c,v 1.1 2006-12-20 20:47:16 quinn Exp $ - */ +/* This file is part of Pazpar2. + Copyright (C) 2006-2009 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 +Software Foundation; either version 2, or (at your option) any later +version. + +Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -65,7 +84,7 @@ struct termlist *termlist_create(NMEM nmem, int numterms, int highscore_size) hashsize <<= 1; res = nmem_malloc(nmem, sizeof(struct termlist)); res->hashtable = nmem_malloc(nmem, hashsize * sizeof(struct termlist_bucket*)); - bzero(res->hashtable, hashsize * sizeof(struct termlist_bucket*)); + memset(res->hashtable, 0, hashsize * sizeof(struct termlist_bucket*)); res->hashtable_size = hashsize; res->nmem = nmem; res->hashmask = hashsize - 1; // Creates a bitmask @@ -84,7 +103,7 @@ static void update_highscore(struct termlist *tl, struct termlist_score *t) int smallest; int me = -1; - if (t->frequency < tl->highscore_min) + if (tl->highscore_num > tl->highscore_size && t->frequency < tl->highscore_min) return; smallest = 0; @@ -97,6 +116,8 @@ static void update_highscore(struct termlist *tl, struct termlist_score *t) } if (tl->highscore_num) tl->highscore_min = tl->highscore[smallest]->frequency; + if (t->frequency < tl->highscore_min) + tl->highscore_min = t->frequency; if (me >= 0) return; if (tl->highscore_num < tl->highscore_size) @@ -118,11 +139,19 @@ void termlist_insert(struct termlist *tl, const char *term) { unsigned int bucket; struct termlist_bucket **p; + char buf[256], *cp; - bucket = hash((unsigned char *)term) & tl->hashmask; + if (strlen(term) > 255) + return; + strcpy(buf, term); + /* chop right */ + for (cp = buf + strlen(buf); cp != buf && strchr(",. -", cp[-1]); cp--) + cp[-1] = '\0'; + + bucket = hash((unsigned char *)buf) & tl->hashmask; for (p = &tl->hashtable[bucket]; *p; p = &(*p)->next) { - if (!strcmp(term, (*p)->term.term)) + if (!strcmp(buf, (*p)->term.term)) { (*p)->term.frequency++; update_highscore(tl, &((*p)->term)); @@ -133,7 +162,7 @@ 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, term); + new->term.term = nmem_strdup(tl->nmem, buf); new->term.frequency = 1; new->next = 0; *p = new; @@ -157,7 +186,9 @@ struct termlist_score **termlist_highscore(struct termlist *tl, int *len) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +