V10/cmd/dict/wdefine.c
# 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;
}