1 #ifndef lint
2 static char sccsid[] = "@(#)makekey.c 2.3 05/27/93";
3 #endif not lint
4 #
5
6 # include "stdio.h"
7 # include "ctype.h"
8 # include "bib.h"
9
10 char commlist[MAXCOMM]= /* list of strings of common words */
11 "";
12 int firsttime = 1;
13
14 /* makekey(p,max_klen,common): compresses *p into a key
15 folds upper to lower case. ignores non-alphanumeric
16 drops keys of length <= 1.
17 drops words in common (name of file of words, one per line)
18 (first call determines common for all later calls)
19 */
makekey(p,max_klen,common)20 makekey(p,max_klen,common)
21 char *p;
22 int max_klen; /* max key length */
23 char *common;
24 { register char *from, *to, *stop;
25
26 if (firsttime) {firsttime= 0; load_comm(common); }
27
28 from= p; to= p; stop= max_klen+p;
29 while (*from != NULL && to < stop)
30 { if (islower(*from)) *to++ = *from++;
31 else if (isdigit(*from)) *to++ = *from++;
32 else if (isupper(*from)) { *to++ = tolower(*from); from++; }
33 else from++;
34 }
35 *to= NULL;
36
37 if (to<=p+1 ||
38 lookup(commlist, p) ) *p= NULL;
39 }
40
41 /* list is a string of null terminated strings, final string is null.
42 p is a null terminated string.
43 return 1 if p is a string in list, 0 ow.
44 */
lookup(list,p)45 int lookup(list,p)
46 char *list, *p;
47 { int len;
48 len= strlen(list);
49 while (len!=0 && strcmp(list,p)!=0)
50 { list += (len+1);
51 len= strlen(list);
52 }
53 return(len!=0);
54 }
55
56 /* read file common into commlist
57 */
load_comm(common)58 load_comm(common)
59 char *common;
60 { FILE *commfile; /* stream of common words */
61 char *p, *stop;
62 commfile= fopen(common,"r");
63 if (commfile==NULL) fprintf(stderr,"cannot open '%s'\n", common);
64 else
65 { /* read commfile into commlist */
66 p= commlist; stop= commlist+MAXCOMM-1;
67 while (p<stop && ((*p= getc(commfile))!=EOF))
68 { if (*p=='\n') *p= NULL;
69 p++;
70 }
71 if (*p==EOF) *p= NULL;
72 else
73 { fprintf(stderr,"invert: too many common words\n");
74 commlist[0]= NULL;
75 }
76 fclose(commfile);
77 }
78 }
79
80