V10/cmd/dict/odefine.c
#include <stdio.h>
#include <ctype.h>
#define DICT "/s5/oed/conv.raw"
char *filename = DICT;
extern char *ggets(), *fgets(), *strchr();
FILE *dfile;
int exact;
int iflag;
int acomp();
int (*compare)() = acomp;
int tab = 0374;
char entry[250];
char word[250];
char key[50];
main(argc,argv)
char **argv;
{
char *arg;
while(argc>=2 && *argv[1]=='-') {
for(arg=argv[1];;arg++) {
switch(arg[1]) {
case 'i':
iflag++;
continue;
case 'x':
exact++;
continue;
case 0:
break;
default:
fprintf(stderr,"look: bad option %s\n",arg);
return(2);
}
break;
}
argc --;
argv++;
}
if(!iflag) {
if(argc<2)
iflag++;
else {
canon(argv[1],key);
argv++;
argc--;
}
}
if(argc>=2)
filename = argv[1];
dfile = fopen(filename,"r");
if(dfile==NULL) {
fprintf(stderr,"look: can't open %s\n",filename);
return(2);
}
if(!iflag) {
if(locate(key,entry)==0)
return(1);
}
do {
if(iflag) {
if(ggets(entry,sizeof entry,stdin)==0)
return(0);
canon(entry,key);
if(locate(key,entry)==0)
continue;
}
put(entry,dfile,stdout);
while(getword(entry)) {
canon(entry,word);
switch((*compare)(key,word)) {
case -1:
if(exact)
break;
case 0:
put(entry,dfile,stdout);
continue;
}
break;
}
} while(iflag);
return(0);
}
locate(key,entry)
char *key;
{
long top,bot,mid;
register c;
bot = 0;
fseek(dfile,0L,2);
top = ftell(dfile);
for(;;) {
mid = (top+bot)/2;
fseek(dfile,mid,0);
do {
c = getc(dfile);
mid++;
} while(c!=EOF && c!='\n');
if(!getword(entry))
break;
canon(entry,word);
switch((*compare)(key,word)) {
case -2:
case -1:
case 0:
if(top<=mid)
break;
top = mid;
continue;
case 1:
case 2:
bot = mid;
continue;
}
break;
}
fseek(dfile,bot,0);
while(getword(entry)) {
canon(entry,word);
switch((*compare)(key,word)) {
case -2:
return(0);
case -1:
if(exact)
return(0);
case 0:
return(1);
case 1:
case 2:
while((c=getc(dfile))!='\n' && c!=EOF)
continue;
}
}
return(0);
}
/* acomp(s,t) returns -2 if s strictly precedes t
-1 if s is a prefix of t
0 if s is the same as t
1 if t is a prefix of s
2 if t strictly precedes s
*/
acomp(s,t)
register char *s,*t;
{
for(;*s==*t;s++,t++)
if(*s==0)
return(0);
return(*s==0? -1:
*t==0? 1:
*s<*t? -2:
2);
}
getword(w)
char *w;
{
register c;
for(;;) {
c = getc(dfile);
if(c==EOF)
return(0);
if(c==tab)
break;
*w++ = c;
}
*w = 0;
return(1);
}
put(entry, ifile, ofile)
char *entry;
FILE *ofile, *ifile;
{
fputs(entry, ofile);
while( putc(getc(ifile), ofile) != '\n')
continue;
fflush(ofile);
}
canon(old,new)
unsigned char *old,*new;
{
register c;
unsigned char *savo = old, *savn = new;
for(;;) {
*new = c = *old++;
if(c==0||c==tab||c==',') {
*new = 0;
break;
}
if(c=='+') {
if(old[0]=='9')
old++;
if(old[0]=='2') {
if(old[1]=='3')
*new++ = 'a', *new++ = 'e';
else if(old[1]=='4')
*new++ = 'o', *new++ = 'e';
}
for(;; old++) {
c = *old;
if(c==' ' || c=='|' || c==tab)
break;
}
}
if(!isalpha(c))
continue;
if(isupper(c))
*new += 'a' - 'A';
new++;
}
/* printf(">%s %s\n",savo,savn); */
}
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;
}