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

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: 
                      4: #define DICT "/usr/dict/words"
                      5: extern char *ggets(), *fgets(), *strchr();
                      6: #define WORDSIZ BUFSIZ
                      7: 
                      8: char *filename = DICT;
                      9: FILE *dfile;
                     10: 
                     11: int fold;
                     12: int direc;
                     13: int exact;
                     14: int iflag;
                     15: int rev = 1;   /*-1 for reverse-ordered file, not implemented*/
                     16: int acomp();
                     17: int ncomp();
                     18: int (*compare)() = acomp;
                     19: int tab;
                     20: char entry[WORDSIZ];
                     21: char word[WORDSIZ];
                     22: char key[50];
                     23: 
                     24: main(argc,argv)
                     25: char **argv;
                     26: {
                     27:        char *arg;
                     28:        while(argc>=2 && *argv[1]=='-') {
                     29:                for(arg=argv[1];;arg++) {
                     30:                        switch(arg[1]) {
                     31:                        case 'd':
                     32:                                direc++;
                     33:                                continue;
                     34:                        case 'f':
                     35:                                fold++;
                     36:                                continue;
                     37:                        case 'i': 
                     38:                                iflag++;
                     39:                                continue;
                     40:                        case 'n':
                     41:                                compare = ncomp;
                     42:                                continue;
                     43:                        case 't':
                     44:                                tab = arg[2];
                     45:                                if(tab)
                     46:                                        ++arg;
                     47:                                continue;
                     48:                        case 'x':
                     49:                                exact++;
                     50:                                continue;
                     51:                        case 0:
                     52:                                break;
                     53:                        default:
                     54:                                fprintf(stderr,"look: bad option %s\n",arg);
                     55:                                return(2);
                     56:                        }
                     57:                        break;
                     58:                }
                     59:                argc --;
                     60:                argv++;
                     61:        }
                     62:        if(!iflag) {
                     63:                if(argc<2)
                     64:                        iflag++;
                     65:                else {
                     66:                        canon(argv[1],key);
                     67:                        argv++;
                     68:                        argc--;
                     69:                }
                     70:        }
                     71:        if(argc>=2)
                     72:                filename = argv[1];
                     73:        else {
                     74:                direc++;
                     75:                fold++;
                     76:                canon(key,key);
                     77:        }
                     78:        dfile = fopen(filename,"r");
                     79:        if(dfile==NULL) {
                     80:                fprintf(stderr,"look: can't open %s\n",filename);
                     81:                return(2);
                     82:        }
                     83:        if(!iflag) {
                     84:                if(locate(key,entry)==0)
                     85:                        return(1);
                     86:        }
                     87:        do {
                     88:                if(iflag) {
                     89:                        if(ggets(entry,sizeof entry,stdin)==0)
                     90:                                return(0);
                     91:                        canon(entry,key);
                     92:                        if(locate(key,entry)==0)
                     93:                                continue;
                     94:                }
                     95:                puts(entry,stdout);
                     96:                while(getword(entry,WORDSIZ)) {
                     97:                        canon(entry+3,word);
                     98:                        switch((*compare)(key,word)) {
                     99:                        case -1:
                    100:                                if(exact)
                    101:                                        break;
                    102:                        case 0:
                    103:                                puts(entry,stdout);
                    104:                                continue;
                    105:                        }
                    106:                        break;
                    107:                }
                    108:                fflush(stdout);
                    109:        } while(iflag);
                    110:        return(0);
                    111: 
                    112: }
                    113: 
                    114: locate(key,entry)
                    115: char *key;
                    116: {
                    117:        long top,bot,mid;
                    118:        register c;
                    119:        bot = 0;
                    120:        fseek(dfile,0L,2);
                    121:        top = ftell(dfile);
                    122:        for(;;) {
                    123:                mid = (top+bot)/2;
                    124:                fseek(dfile,mid,0);
                    125:                do {
                    126:                        c = getc(dfile);
                    127:                        mid++;
                    128:                        if(c==EOF)
                    129:                                break;
                    130:                        if(c!='\n')
                    131:                                continue;
                    132:                        c = getc(dfile);
                    133:                        mid++;
                    134:                } while(c!=EOF && c!='\n');
                    135:                if(!getword(entry,WORDSIZ))
                    136:                        break;
                    137:                canon(entry+3,word);
                    138:                switch((*compare)(key,word)) {
                    139:                case -2:
                    140:                case -1:
                    141:                case 0:
                    142:                        if(top<=mid)
                    143:                                break;
                    144:                        top = mid;
                    145:                        continue;
                    146:                case 1:
                    147:                case 2:
                    148:                        bot = mid;
                    149:                        continue;
                    150:                }
                    151:                break;
                    152:        }
                    153:        fseek(dfile,bot,0);
                    154:        while(getword(entry,WORDSIZ)) {
                    155:                canon(entry+3,word);
                    156:                switch((*compare)(key,word)) {
                    157:                case -2:
                    158:                        return(0);
                    159:                case -1:
                    160:                        if(exact)
                    161:                                return(0);
                    162:                case 0:
                    163:                        return(1);
                    164:                case 1:
                    165:                case 2:
                    166:                        continue;
                    167:                }
                    168:        }
                    169:        return(0);
                    170: }
                    171: 
                    172: /* acomp(s,t) returns -2 if s strictly precedes t
                    173:                      -1 if s is a prefix of t
                    174:                      0 if s is the same as t
                    175:                      1 if t is a prefix of s
                    176:                      2 if t strictly precedes s
                    177: */
                    178: 
                    179: acomp(s,t)
                    180: register char *s,*t;
                    181: {
                    182: /*     printf(":%s:%s:\n",s,t); fflush(stdout); */
                    183:        for(;*s==*t;s++,t++)
                    184:                if(*s==0)
                    185:                        return(0);
                    186:        return(*s==0? -1:
                    187:                *t==0? 1:
                    188:                *s<*t? -2:
                    189:                2);
                    190: }
                    191: 
                    192: getword(w,n)
                    193: char *w;
                    194: {
                    195:        register c;
                    196:        while(--n>0) {
                    197:                c = getc(dfile);
                    198:                if(c==EOF)
                    199:                        return(0);
                    200:                *w++ = c;
                    201:                if(c!='\n')
                    202:                        continue;
                    203:                c = getc(dfile);
                    204:                if(c==EOF)
                    205:                        return 0;
                    206:                if(c=='\n') {
                    207:                        *w = 0;
                    208:                        return 1;
                    209:                }
                    210:                *w++ = c;
                    211:        }
                    212:        fprintf(stderr,"look: line too long\n");
                    213:        return(0);
                    214: }
                    215: 
                    216: canon(old,new)
                    217: char *old,*new;
                    218: {
                    219:        register c;
                    220:        char *savenew = new;
                    221: /*     printf("<%s\n",old); fflush(stdout); */
                    222:        for(;;) {
                    223:                *new = c = *old++;
                    224:                if(c==0||c=='\n'||c=='*') {
                    225:                        *new = 0;
                    226:                        break;
                    227:                }
                    228:                if(direc) {
                    229:                        if(!(isalnum(c)||c==' '||c=='\t'))
                    230:                                continue;
                    231:                }
                    232:                if(fold) {
                    233:                        if(isupper(c))
                    234:                                *new += 'a' - 'A';
                    235:                }
                    236:                new++;
                    237:        }
                    238: /*     printf(">%s\n",savenew); fflush(stdout);*/
                    239: }
                    240: 
                    241: ncomp(s,t)
                    242: register char *s, *t;
                    243: {
                    244:        char *is, *it, *js, *jt;
                    245:        int a, b;
                    246:        int ssgn, tsgn;
                    247:        while(isspace(*s))
                    248:                s++;
                    249:        while(isspace(*t))
                    250:                t++;
                    251:        ssgn = tsgn = -2*rev;
                    252:        if(*s == '-') {
                    253:                s++;
                    254:                ssgn = -ssgn;
                    255:        }
                    256:        if(*t == '-') {
                    257:                t++;
                    258:                tsgn = -tsgn;
                    259:        }
                    260:        for(is = s; isdigit(*is); is++) ;
                    261:        for(it = t; isdigit(*it); it++) ;
                    262:        js = is;
                    263:        jt = it;
                    264:        a = 0;
                    265:        if(ssgn==tsgn)
                    266:                while(it>t && is>s)
                    267:                        if(b = *--it - *--is)
                    268:                                a = b;
                    269:        while(is > s)
                    270:                if(*--is != '0')
                    271:                        return(-ssgn);
                    272:        while(it > t)
                    273:                if(*--it != '0')
                    274:                        return(tsgn);
                    275:        if(a) return(sgn(a)*ssgn);
                    276:        if(*(s=js) == '.')
                    277:                s++;
                    278:        if(*(t=jt) == '.')
                    279:                t++;
                    280:        if(ssgn==tsgn)
                    281:                while(isdigit(*s) && isdigit(*t))
                    282:                        if(a = *t++ - *s++)
                    283:                                return(sgn(a)*ssgn);
                    284:        while(isdigit(*s))
                    285:                if(*s++ != '0')
                    286:                        return(-ssgn);
                    287:        while(isdigit(*t))
                    288:                if(*t++ != '0')
                    289:                        return(tsgn);
                    290:        return(0);
                    291: }
                    292: sgn(x)
                    293: {
                    294:        return x>0?1:x<0?-1:0;
                    295: }
                    296: 
                    297: char *
                    298: ggets(s,n,f)
                    299: char *s;
                    300: FILE *f;
                    301: {
                    302:        char *p = fgets(s,n,f);
                    303:        char *q;
                    304:        if(p && (q=strchr(s,'\n')))
                    305:                *q = 0;
                    306:        return p;
                    307: }

unix.superglobalmegacorp.com

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