1*13111Srrh #ifndef lint 2*13111Srrh static char sccsid[] = "@(#)makekey.c 1.2 06/14/83"; 3*13111Srrh #endif not lint 412915Sgarrison 512915Sgarrison # include "stdio.h" 612915Sgarrison # include "ctype.h" 712915Sgarrison # include "bib.h" 812915Sgarrison 912915Sgarrison char commlist[MAXCOMM]= /* list of strings of common words */ 1012915Sgarrison ""; 1112915Sgarrison int firsttime = 1; 1212915Sgarrison 1312915Sgarrison /* makekey(p,max_klen,common): compresses *p into a key 1412915Sgarrison folds upper to lower case. ignores non-alphanumeric 1512915Sgarrison drops keys of length <= 1. 1612915Sgarrison drops words in common (name of file of words, one per line) 1712915Sgarrison (first call determines common for all later calls) 1812915Sgarrison */ 1912915Sgarrison makekey(p,max_klen,common) 2012915Sgarrison char *p; 2112915Sgarrison int max_klen; /* max key length */ 2212915Sgarrison char *common; 2312915Sgarrison { register char *from, *to, *stop; 2412915Sgarrison 2512915Sgarrison if (firsttime) {firsttime= 0; load_comm(common); } 2612915Sgarrison 2712915Sgarrison from= p; to= p; stop= max_klen+p; 2812915Sgarrison while (*from != NULL && to < stop) 2912915Sgarrison { if (islower(*from)) *to++ = *from++; 3012915Sgarrison else if (isdigit(*from)) *to++ = *from++; 3112915Sgarrison else if (isupper(*from)) { *to++ = tolower(*from); from++; } 3212915Sgarrison else from++; 3312915Sgarrison } 3412915Sgarrison *to= NULL; 3512915Sgarrison 3612915Sgarrison if (to<=p+1 || 3712915Sgarrison lookup(commlist, p) ) *p= NULL; 3812915Sgarrison } 3912915Sgarrison 4012915Sgarrison /* list is a string of null terminated strings, final string is null. 4112915Sgarrison p is a null terminated string. 4212915Sgarrison return 1 if p is a string in list, 0 ow. 4312915Sgarrison */ 4412915Sgarrison int lookup(list,p) 4512915Sgarrison char *list, *p; 4612915Sgarrison { int len; 4712915Sgarrison len= strlen(list); 4812915Sgarrison while (len!=0 && strcmp(list,p)!=0) 4912915Sgarrison { list += (len+1); 5012915Sgarrison len= strlen(list); 5112915Sgarrison } 5212915Sgarrison return(len!=0); 5312915Sgarrison } 5412915Sgarrison 5512915Sgarrison /* read file common into commlist 5612915Sgarrison */ 5712915Sgarrison load_comm(common) 5812915Sgarrison char *common; 5912915Sgarrison { FILE *commfile; /* stream of common words */ 6012915Sgarrison char *p, *stop; 6112915Sgarrison commfile= fopen(common,"r"); 6212915Sgarrison if (commfile==NULL) fprintf(stderr, "cannot open '%s'\n", common); 6312915Sgarrison else 6412915Sgarrison { /* read commfile into commlist */ 6512915Sgarrison p= commlist; stop= commlist+MAXCOMM-1; 6612915Sgarrison while (p<stop && ((*p= getc(commfile))!=EOF)) 6712915Sgarrison { if (*p=='\n') *p= NULL; 6812915Sgarrison p++; 6912915Sgarrison } 7012915Sgarrison if (*p==EOF) *p= NULL; 7112915Sgarrison else 7212915Sgarrison { fprintf(stderr, "invert: too many common words\n"); 7312915Sgarrison commlist[0]= NULL; 7412915Sgarrison } 7512915Sgarrison fclose(commfile); 7612915Sgarrison } 7712915Sgarrison } 7812915Sgarrison 79