Annotation of researchv10no/cmd/dict/odefine.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: 
                      4: #define DICT "/s5/oed/conv.raw"
                      5: 
                      6: char *filename = DICT;
                      7: extern char *ggets(), *fgets(), *strchr();
                      8: FILE *dfile;
                      9: 
                     10: int exact;
                     11: int iflag;
                     12: int acomp();
                     13: int (*compare)() = acomp;
                     14: int tab = 0374;
                     15: char entry[250];
                     16: char word[250];
                     17: char key[50];
                     18: 
                     19: main(argc,argv)
                     20: char **argv;
                     21: {
                     22:        char *arg;
                     23:        while(argc>=2 && *argv[1]=='-') {
                     24:                for(arg=argv[1];;arg++) {
                     25:                        switch(arg[1]) {
                     26:                        case 'i': 
                     27:                                iflag++;
                     28:                                continue;
                     29:                        case 'x':
                     30:                                exact++;
                     31:                                continue;
                     32:                        case 0:
                     33:                                break;
                     34:                        default:
                     35:                                fprintf(stderr,"look: bad option %s\n",arg);
                     36:                                return(2);
                     37:                        }
                     38:                        break;
                     39:                }
                     40:                argc --;
                     41:                argv++;
                     42:        }
                     43:        if(!iflag) {
                     44:                if(argc<2)
                     45:                        iflag++;
                     46:                else {
                     47:                        canon(argv[1],key);
                     48:                        argv++;
                     49:                        argc--;
                     50:                }
                     51:        }
                     52:        if(argc>=2)
                     53:                filename = argv[1];
                     54:        dfile = fopen(filename,"r");
                     55:        if(dfile==NULL) {
                     56:                fprintf(stderr,"look: can't open %s\n",filename);
                     57:                return(2);
                     58:        }
                     59:        if(!iflag) {
                     60:                if(locate(key,entry)==0)
                     61:                        return(1);
                     62:        }
                     63:        do {
                     64:                if(iflag) {
                     65:                        if(ggets(entry,sizeof entry,stdin)==0)
                     66:                                return(0);
                     67:                        canon(entry,key);
                     68:                        if(locate(key,entry)==0)
                     69:                                continue;
                     70:                }
                     71:                put(entry,dfile,stdout);
                     72:                while(getword(entry)) {
                     73:                        canon(entry,word);
                     74:                        switch((*compare)(key,word)) {
                     75:                        case -1:
                     76:                                if(exact)
                     77:                                        break;
                     78:                        case 0:
                     79:                                put(entry,dfile,stdout);
                     80:                                continue;
                     81:                        }
                     82:                        break;
                     83:                }
                     84:        } while(iflag);
                     85:        return(0);
                     86: 
                     87: }
                     88: 
                     89: locate(key,entry)
                     90: char *key;
                     91: {
                     92:        long top,bot,mid;
                     93:        register c;
                     94:        bot = 0;
                     95:        fseek(dfile,0L,2);
                     96:        top = ftell(dfile);
                     97:        for(;;) {
                     98:                mid = (top+bot)/2;
                     99:                fseek(dfile,mid,0);
                    100:                do {
                    101:                        c = getc(dfile);
                    102:                        mid++;
                    103:                } while(c!=EOF && c!='\n');
                    104:                if(!getword(entry))
                    105:                        break;
                    106:                canon(entry,word);
                    107:                switch((*compare)(key,word)) {
                    108:                case -2:
                    109:                case -1:
                    110:                case 0:
                    111:                        if(top<=mid)
                    112:                                break;
                    113:                        top = mid;
                    114:                        continue;
                    115:                case 1:
                    116:                case 2:
                    117:                        bot = mid;
                    118:                        continue;
                    119:                }
                    120:                break;
                    121:        }
                    122:        fseek(dfile,bot,0);
                    123:        while(getword(entry)) {
                    124:                canon(entry,word);
                    125:                switch((*compare)(key,word)) {
                    126:                case -2:
                    127:                        return(0);
                    128:                case -1:
                    129:                        if(exact)
                    130:                                return(0);
                    131:                case 0:
                    132:                        return(1);
                    133:                case 1:
                    134:                case 2:
                    135:                        while((c=getc(dfile))!='\n' && c!=EOF)
                    136:                                continue;
                    137:                }
                    138:        }
                    139:        return(0);
                    140: }
                    141: 
                    142: /* acomp(s,t) returns -2 if s strictly precedes t
                    143:                      -1 if s is a prefix of t
                    144:                      0 if s is the same as t
                    145:                      1 if t is a prefix of s
                    146:                      2 if t strictly precedes s
                    147: */
                    148: 
                    149: acomp(s,t)
                    150: register char *s,*t;
                    151: {
                    152:        for(;*s==*t;s++,t++)
                    153:                if(*s==0)
                    154:                        return(0);
                    155:        return(*s==0? -1:
                    156:                *t==0? 1:
                    157:                *s<*t? -2:
                    158:                2);
                    159: }
                    160: 
                    161: getword(w)
                    162: char *w;
                    163: {
                    164:        register c;
                    165:        for(;;) {
                    166:                c = getc(dfile);
                    167:                if(c==EOF)
                    168:                        return(0);
                    169:                if(c==tab)
                    170:                        break;
                    171:                *w++ = c;
                    172:        }
                    173:        *w = 0;
                    174:        return(1);
                    175: }
                    176: 
                    177: put(entry, ifile, ofile)
                    178: char *entry;
                    179: FILE *ofile, *ifile;
                    180: {
                    181:        fputs(entry, ofile);
                    182:        while( putc(getc(ifile), ofile) != '\n')
                    183:                continue;
                    184:        fflush(ofile);
                    185: }
                    186: 
                    187: canon(old,new)
                    188: unsigned char *old,*new;
                    189: {
                    190:        register c;
                    191:        unsigned char *savo = old, *savn = new;
                    192:        for(;;) {
                    193:                *new = c = *old++;
                    194:                if(c==0||c==tab||c==',') {
                    195:                        *new = 0;
                    196:                        break;
                    197:                }
                    198:                if(c=='+') {
                    199:                        if(old[0]=='9')
                    200:                                old++;
                    201:                        if(old[0]=='2') {
                    202:                                if(old[1]=='3')
                    203:                                        *new++ = 'a', *new++ = 'e';
                    204:                                else if(old[1]=='4')
                    205:                                        *new++ = 'o', *new++ = 'e';
                    206:                        }
                    207:                        for(;; old++) {
                    208:                                c = *old;
                    209:                                if(c==' ' || c=='|' || c==tab)
                    210:                                        break;
                    211:                        }
                    212:                }
                    213:                if(!isalpha(c))
                    214:                        continue;
                    215:                if(isupper(c))
                    216:                        *new += 'a' - 'A';
                    217:                new++;
                    218:        }
                    219:        /* printf(">%s %s\n",savo,savn); */ 
                    220: }
                    221: 
                    222: char *
                    223: ggets(s,n,f)
                    224: char *s;
                    225: FILE *f;
                    226: {
                    227:        char *p = fgets(s,n,f);
                    228:        char *q;
                    229:        if(p && (q=strchr(s,'\n')))
                    230:                *q = 0;
                    231:        return p;
                    232: }

unix.superglobalmegacorp.com

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