/* This file Copyright 1992 by Clifford A. Adams */
/* sathread.c
*
*/
#include "EXTERN.h"
#include "common.h"
#ifdef SCAN_ART
#include "list.h"
#include "hash.h"
#include "cache.h"
#include "bits.h" /* for absfirst */
#include "head.h" /* hc_setspin() */
#include "ngdata.h"
#include "mempool.h"
#include "scanart.h"
#include "sadesc.h" /* sa_desc_subject() */
#include "samain.h"
#include "samisc.h"
#include "sorder.h"
#include "util.h"
#include "INTERN.h"
#include "sathread.h"
static long sa_num_threads = 0;
static HASHTABLE* sa_thread_hash = 0;
void
sa_init_threads()
{
mp_free(MP_SATHREAD);
sa_num_threads = 0;
if (sa_thread_hash) {
hashdestroy(sa_thread_hash);
sa_thread_hash = 0;
}
}
/* called only if the macro didn't find a value */
/* XXX: dependent on hash feature that data.dat_len is not used in
* the default comparison function, so it can be used for a number.
* later: write a custom comparison function.
*/
long
sa_get_subj_thread(e)
long e; /* entry number */
{
HASHDATUM data;
char* s;
bool old_untrim;
char* p;
old_untrim = untrim_cache;
untrim_cache = TRUE;
s = sa_desc_subject(e);
untrim_cache = old_untrim;
if (!s || !*s)
return -2;
if ((*s == '>') && (s[1] == ' '))
s += 2;
if (!sa_thread_hash) {
sa_thread_hash = hashcreate(401, HASH_DEFCMPFUNC);
}
data = hashfetch(sa_thread_hash,s,strlen(s));
if (data.dat_ptr) {
return (long)(data.dat_len);
}
p = mp_savestr(s,MP_SATHREAD);
data = hashfetch(sa_thread_hash,p,strlen(s));
data.dat_ptr = p;
data.dat_len = (unsigned)(sa_num_threads+1);
hashstorelast(data);
sa_num_threads++;
sa_ents[e].subj_thread_num = sa_num_threads;
return sa_num_threads;
}
int
sa_subj_thread_count(a)
long a;
{
int count;
long b;
count = 1;
b = a;
while ((b = sa_subj_thread_next(b)) != 0)
if (sa_basic_elig(b))
count++;
return count;
}
/* returns basic_elig previous subject thread */
long
sa_subj_thread_prev(a)
long a;
{
int i,j;
i = sa_subj_thread(a);
while ((a = s_prev(a)) != 0) {
if (!sa_basic_elig(a))
continue;
if (!(j = sa_ents[a].subj_thread_num))
j = sa_subj_thread(a);
if (i == j)
return a;
}
return 0L;
}
long
sa_subj_thread_next(a)
long a;
{
int i,j;
i = sa_subj_thread(a);
while ((a = s_next(a)) != 0) {
if (!sa_basic_elig(a))
continue;
if (!(j = sa_ents[a].subj_thread_num))
j = sa_subj_thread(a);
if (i == j)
return a;
}
return 0L;
}
#endif /* SCAN */
syntax highlighted by Code2HTML, v. 0.9.1