|
|
1.1 root 1: /*
2: * Version of spell that uses compressed
3: * dictionary but exhaustive dictionary read.
4: * This version will work in any address space
5: * but is perhaps marginally slower (on short
6: * documents than the hashed version). It has the
7: * virtue that it is guaranteed accurate (no misses).
8: */
9:
10: #include <stdio.h>
11: #include <ctype.h>
12:
13: #define NWORD 50
14:
15: char inword[NWORD];
16: char lowword[NWORD];
17:
18: char *wget();
19: char *getword();
20:
21: main(argc, argv)
22: char *argv[];
23: {
24: FILE *dfp;
25: FILE *hfp = NULL;
26:
27: if (argc == 3) {
28: argc--;
29: hfp = fopen(argv[2], "a");
30: }
31: if (argc != 2)
32: usage();
33: if ((dfp = fopen(argv[1], "r")) == NULL)
34: cerr("cannot open compressed dictionary `%s'", argv[1]);
35: exit(spell(stdin, dfp, hfp));
36: }
37:
38: /*
39: * Called with the input words (sorted)
40: * the the dictionary file pointer.
41: * Returns non-zero if there are any spelling errors.
42: */
43: spell(inf, dfp, hfp)
44: FILE *inf;
45: FILE *dfp;
46: FILE *hfp;
47: {
48: register char *wp = "";
49: register int s;
50: register int stat = 0;
51:
52: for (;;) {
53: if (wget(inword, lowword, inf) == NULL)
54: return (stat);
55: while ((s = strcmp(wp, lowword)) < 0)
56: if ((wp = getword(dfp)) == NULL)
57: return (stat);
58: if (s != 0) {
59: stat = 1;
60: printf("%s\n", inword);
61: if (hfp != NULL)
62: fprintf(hfp, "%s\n", inword);
63: }
64: }
65: }
66:
67: char *
68: wget(b1, b2, io)
69: char *b1, *b2;
70: FILE *io;
71: {
72: register int c;
73: register int lim;
74: register char *s1;
75: register char *s2;
76:
77: again:
78: s1 = b1;
79: s2 = b2;
80: lim = NWORD;
81: while (--lim>0 && (c = getc(io))!=EOF) {
82: if (c == '\n')
83: break;
84: *s1++ = c;
85: *s2++ = isalpha(c) ? tolower(c) : c;
86: }
87: *s1 = '\0';
88: *s2 = '\0';
89: if (c == EOF)
90: return (NULL);
91: while (c != '\n')
92: c = getc(io);
93: if (s2 == b2)
94: goto again;
95: return (b1);
96: }
97:
98: usage()
99: {
100: fprintf(stderr, "Usage: spell dict [history]\n");
101: exit(1);
102: }
103:
104: /* VARARGS */
105: cerr(x)
106: {
107: fprintf(stderr, "spell: %r\n", &x);
108: exit(1);
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.