File:  [Research Unix] / researchv10no / cmd / ap / apnews / apnews4.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

# include "stdio.h"
# include "cbt.h"
# include "assert.h"
# include "ctype.h"
# include "time.h"
# include "sys/types.h"
# include "sys/stat.h"
extern int day, yesterday;
# define NST 200
extern int stc, inolim;
extern char storylist[NST][12];
extern char nowfile[];
extern char *storydir;
extern char names[20][14];
extern char heads[20][50];
char *index();
extern int inodes[NST+5];

getkeys(firsen)
{
# define NWS 50
char lb[200], *srchvec[NWS+1], *v[40], *s, *sufstr();
char wb[NWS+1][15];
int i, n, ng;
FILE *f;
f = fopen(nowfile, "r");
n=0;
if (f==NULL) return;
while (fgets(lb, 200, f))
	{
	if (lb[0]=='^') continue;
	trimnl(lb);
	ng = getargs(lb, v);
	for(i=0; i<ng; i++)
		{
		if (common(v[i])) continue;
		s = sufstr(v[i]);
		if (strlen(s)>= 14) s[14]=0;
		strcpy(srchvec[n]=wb[n], s);
		if (n++ >NWS) break;
		}
	if (n>NWS) break;
	}
fclose(f);
if (n<=0) return;
lkkeys( srchvec, n);
}
wdsearch(s, firsen)
	char *s;
{
char *srchvec[50];
int n;
n=mksrch (s, srchvec);
lkkeys( srchvec, n);
if (firsen) printf("----\n");
}
mksrch (s, v)
	char *s, *v[];
{
char *g[20];
int i, n, ng;
static char wb[20][20];
lcase(s);
ng = getargs(s, g);
for (n=i=0; i<ng; i++)
	{
	if (common(g[i])) continue;
	strcpy(v[n] = wb[n], sufstr(g[i]));
	n++;
	}
return(n);
}
bfile *bf=NULL;
bfile *bfy=NULL;
long ytim = 0L;
# define ND 50
struct dst {
	char dn[6];
	int dc;
	};
struct dst docs[ND];
struct dst *pnd = docs;
lkkeys (srchvec, n)
	char *srchvec[];
{
mbuf key, rkey, rrec;
char ka[100], kb[100], kc[100], *dn;
int i;
key.mdata =ka; rkey.mdata=kb; rrec.mdata=kc;
if (bf==NULL)
	{
	sprintf(ka, "%s/.I%d", storydir, day);
	bf = bopen(ka, 0);
	if (bf==NULL) return;
	}
if (bfy==NULL)
	{
	sprintf(ka, "%s/.I%d", storydir, yesterday);
	bfy = bopen(ka,0);
	strcat(ka, ".T");
	ytim = filtim(ka);
	}
pnd = docs;
for(i=0; i<n; i++)
	{
	sprintf(key.mdata, "%s.", srchvec[i]);
	key.mlen = strlen(key.mdata);
	bseek (bf, key);
	while (bread(bf, &rkey, &rrec)==NULL)
		{
		rkey.mdata[rkey.mlen]=0;
		if (strncmp(rkey.mdata, key.mdata, key.mlen)!=0)
			break;
		docfnd(index(rkey.mdata, '.'));
		}
	if (bfy==NULL) continue;
	bseek(bfy, key);
	while (bread(bfy, &rkey, &rrec)==NULL)
		{
		rkey.mdata [rkey.mlen]=0;
		if (strncmp(rkey.mdata, key.mdata, key.mlen)!=0)
			break;
		dn = index(rkey.mdata, '.');
		/* check that dn has not been overwritten */
		if (dn && filtim(dn+1) <= ytim)
			docfnd(dn);
		}
	}
docsrt();
n = pnd-docs;
if (n>20) n=20;
for(i=0; i<n; i++)
	strcpy(names[i], docs[i].dn);
for (; i<20; i++)
	names[i][0]=0;
for(i=0; i<20; i++)
	heads[i][0]=0;
disprint();
}
docfnd(s)
	char *s;
{
int i;
struct dst *p;
if (s==NULL) return;
s++;
assert(strlen(s)<=5);
for(p=docs; p<pnd; p++)
	{
	if (strcmp(s, p->dn)==0)
		break;
	}
if (p<pnd)
	p->dc++;
else
	{
	if (pnd>=docs+ND) return;
	strcpy(pnd->dn, s);
	pnd->dc=1;
	pnd++;
	}
}
docsrt()
{
int dcmp();
struct dst *p;
qsort( docs, pnd-docs, sizeof(*pnd), dcmp);
}
dcmp(p1, p2)
	struct dst *p1, *p2;
{
return (p2->dc - p1->dc);
}
menu(lc)
{
char *m;
tpos(10,0);
if (lc==1)
	m="titles";
else if (lc==0)
	m="of this story";
else if (lc==2)
	m="first sentences";
printf("CR: more %s; t: top titles; m: more titles; t>N: top, rated >= N;\n", m);
printf("s: search words; y: search story; c: copy; q: exit\n");
}
extend(n)
{
/* make sure we have n stories */
int i, ino;
FILE *f;
char line[20];
struct stat stbuff;
if (stc>=n) return;
for (i=inolim; i<stc; i++)
	{
	stat (storylist[i], &stbuff);
	inodes[i]= stbuff.st_ino;
	}
if (access("..slist", 04)!=0 || (stc==0 &&
	filtim(".") > filtim("..slist")))
		{
		if (fork()==0)
			{
			close(1);
			assert( creat("..slist", 0666) == 1);
			chmod("..slist", 0666);
			execl("/usr/bin/ls", "ls", "-t", 0);
			execl("/bin/ls", "ls", "-t", 0);
			assert(0);
			}
		wait(0);
		}
f = fopen("..slist", "r");
assert(f!=NULL);
while (fgets(line, 20, f))
	{
	trimnl(line);
	/* acceptable lines are a9999 or mondy.a9999 */
	if (strlen(line)==5 && line[0]=='a')
		;
	else
	if (strlen(line)==11 && line[6]=='a')
		;
	else
		continue;
	i=stat (line, &stbuff);
	if (i!=0) continue;
	ino = stbuff.st_ino;
	for(i=0; i<stc; i++)
		if (ino == inodes[i])
			break;
	if (i<stc)
		continue;
	inodes[inolim=stc]=ino;
	strcpy(storylist[stc++], line);
	if (stc>=100) break;
	}
fclose(f);
return;
}
long
filtim( f)
	char *f;
{
struct stat stbuff;
int k;
k = stat (f, &stbuff);
if (k!=0) return(0L);
return(stbuff.st_mtime);
}
/* the next routine picks out longest word */
pickbig (wv, nw)
	char **wv;
{
int mlen, mat, i, k, c;
for(mlen=mat=i=0; i<nw; i++)
	{
	k = strlen(wv[i]);
	if (k>mlen)
		{
		mlen=k;
		mat=i;
		}
	}
c = wv[mat][0];
if (islower(c)) wv[mat][0]=toupper(c);
return(mat);
}
lcase(s)
	char *s;
{
for ( ; *s; s++)
	{
	if (isupper(*s))
		*s = tolower(*s);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.