V10/cmd/dict/wdefine.c

Compare this file to the similar file:
Show the results in this format:

# include <stdio.h>
# include <ctype.h>
# include <assert.h>
char *dictdir = "/usr/dict/w7full";
extern char *ggets(), *fgets(), *strchr(), *getenv();
int debug=0;

main(argc,argv)
char *argv[];
{
	char ln[100];
	char *dict = getenv("W7DIR");
	if(dict==0)
		dict = dictdir;
	assert( chdir(dict) == NULL);
	argc--; argv++;
	while (argc>0 && argv[0][0]=='-') {
		switch (argv[0][1])
			{
			case 'd': debug++; break;
			}
		argc--; argv++;
	}
	if (argc<=0) {
		while (ggets(ln,sizeof ln,stdin))
			lookup(ln);
	}
	while (argc-- >0)
		lookup(*argv++);
}

lcase (s)
char *s;
{
	for (; *s; s++)
		if (isupper(*s))
			*s = tolower(*s);
}

FILE *desc[26];

lookup (wd)
char *wd;
{
	int ilet, yet, ks;
	char fn[10], dbuff[300], wdb[50], xbuff[300];
	FILE *fd;
	while(*wd && isascii(*wd) && isspace(*wd))
		wd++;
	if(*wd == 0)
		return;
	scnobl(wdb, wd); wd=wdb;
	lcase(wd);
	ccut(wd);
	ilet = *wd;
	assert (ilet>='a' && ilet <= 'z');
	sprintf(fn, "D%c", ilet);
	if (desc[ilet-'a']==0)
		desc[ilet-'a'] = fd = fopen(fn, "r");
	else
		fd = desc[ilet-'a'];
	if (fd==NULL) {
		fprintf(stderr, "Too many files open: %s\n", wd);
		return;
	}
	binpos (fd, wd);
	yet=0;
	while (fgets(dbuff, 300, fd)) {
		if (dbuff[0]=='F' && dbuff[1]==';') {
			scnobl(xbuff, dbuff+2);
			lcase(xbuff);
			ccut(xbuff);
			ks = scomp(xbuff, wd);
			if(debug)fprintf(stderr, "xbuff %s wd %s ks %d\n",xbuff,wd,ks);
			if (ks>0)
				break;
			if (ks==0) yet=1;
		}
		if (yet>0) dump(dbuff);
	}
}

dump(s)
char *s;
{
	char *p;
	if (isupper(s[0]) && s[1]==';')
		s++;
	for(p=s; *p; p++)
		if (*p==';')
			*p=' ';
	fputs(s,stdout);
}

scomp( dl, wd)
char *dl, *wd;
{
	int n, k;
	char t1[100], t2[100];
	scnobl(t1, dl);
	dl=t1;
	scnobl(t2, wd);
	wd=t2;
	n = strlen(wd);
	k = strncmp(dl, wd,n);
	if (k==0 && (dl[n]==0 || dl[n]==';'))
		return(0);
	return(k==0? 1: k);
}

scnobl(s, t)
char *s, *t;
{
	while (*t) {
		if (*t!=' ')
			*s++ = *t;
		t++;
	}
	*s=0;
}

binpos(f, word)
char *word;
FILE *f;
{
	long top, bot, mid;
	int k, c, oc, ooc;
	char line[100];
	bot=0;
	fseek(f, 0L, 2);
	top = ftell(f);
	for (;;) {
		mid = (top+bot)/2;
		fseek(f, mid, 0);
		oc=getc(f);
		c=getc(f);
		mid+=2;
		do {
			ooc=oc;
			oc=c;
			c = getc(f);
			mid++;
		} while (c!=EOF && ( c!='F' || oc!='\n' || ooc=='#'));
		if (fgets(line, 50, f)==NULL)
			break;
		lcase(line);
		if (debug) fprintf(stderr, " bot %ld mid %ld top %ld line %s", bot,mid,top,line);
		ccut(line+1);
		k = scomp(word, line+1);
		if(debug) fprintf(stderr, "  k %d\n",k);
		if (k<=0) {
			if (top<=mid)
				break;
			top = mid;
			continue;
		} else {
			bot= mid;
			continue;
		}
	}
	fseek(f, bot, 0);
	if (bot!=0)
	while ( (c=getc(f)) != '\n' && c!= EOF);
}

ccut(s)
char *s;
{
	char x[100], *p, *y;
	y=s;
	for(p=x; *s &&  *s!=';'; s++)
		if (!strchr("-'^`{}:,.~", *s))
			*p++ = *s;
	*p=0;
	strcpy(y, x);
}

char *
ggets(s,n,f)
char *s;
FILE *f;
{
	char *p = fgets(s,n,f);
	char *q;
	if(p && (q=strchr(s,'\n')))
		*q = 0;
	return p;
}