+#else
+
+struct word_entry {
+ const char *norm_str;
+ int termno;
+ struct word_entry *next;
+};
+
+static void add_word_entry(NMEM nmem,
+ struct word_entry **entries,
+ const char *norm_str,
+ int term_no)
+{
+ struct word_entry *ne = nmem_malloc(nmem, sizeof(*ne));
+ ne->norm_str = nmem_strdup(nmem, norm_str);
+ ne->termno = term_no;
+
+ ne->next = *entries;
+ *entries = ne;
+}
+
+
+int word_entry_match(struct word_entry *entries, const char *norm_str)
+{
+ for (; entries; entries = entries->next)
+ {
+ if (!strcmp(norm_str, entries->norm_str))
+ return entries->termno;
+ }
+ return 0;
+}
+
+static struct word_entry *build_word_entries(pp2_charset_t pct, NMEM nmem,
+ const char **terms)
+{
+ int termno = 1; /* >0 signals THERE is an entry */
+ struct word_entry *entries = 0;
+ const char **p = terms;
+
+ for (; *p; p++)
+ {
+ pp2_relevance_token_t prt = pp2_relevance_tokenize(pct, *p);
+ const char *norm_str;
+
+ while ((norm_str = pp2_relevance_token_next(prt)))
+ add_word_entry(nmem, &entries, norm_str, termno);
+
+ pp2_relevance_token_destroy(prt);
+
+ termno++;
+ }
+ return entries;
+}
+
+void relevance_countwords(struct relevance *r, struct record_cluster *cluster,
+ const char *words, int multiplier)
+{
+ pp2_relevance_token_t prt = pp2_relevance_tokenize(r->pct, words);
+
+ const char *norm_str;
+
+ while ((norm_str = pp2_relevance_token_next(prt)))
+ {
+ int res = word_entry_match(r->entries, norm_str);
+ if (res)
+ cluster->term_frequency_vec[res] += multiplier;
+ cluster->term_frequency_vec[0]++;
+ }
+ pp2_relevance_token_destroy(prt);
+}
+
+#endif
+
+
+
+struct relevance *relevance_create(pp2_charset_t pct,
+ NMEM nmem, const char **terms, int numrecs)
+{
+ struct relevance *res = nmem_malloc(nmem, sizeof(struct relevance));
+ const char **p;
+ int i;
+
+ for (p = terms, i = 0; *p; p++, i++)
+ ;
+ res->vec_len = ++i;
+ res->doc_frequency_vec = nmem_malloc(nmem, res->vec_len * sizeof(int));
+ memset(res->doc_frequency_vec, 0, res->vec_len * sizeof(int));
+ res->nmem = nmem;
+#if USE_TRIE
+ res->wt = build_word_trie(nmem, terms);
+#else
+ res->entries = build_word_entries(pct, nmem, terms);
+ res->pct = pct;
+#endif
+ return res;
+}
+
+void relevance_newrec(struct relevance *r, struct record_cluster *rec)
+{
+ if (!rec->term_frequency_vec)
+ {
+ rec->term_frequency_vec = nmem_malloc(r->nmem, r->vec_len * sizeof(int));
+ memset(rec->term_frequency_vec, 0, r->vec_len * sizeof(int));
+ }
+}
+
+