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