Mercurial > pidgin.yaz
annotate plugins/spellchk.c @ 106:e05e6373ea5a
[gaim-migrate @ 116]
Modified spellchk.c so now it uses a more customizable dictionary and added
filectl.c to allow remote-control of gaim.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Wed, 12 Apr 2000 06:51:37 +0000 |
parents | c5a1a1b05c26 |
children | d927bb34e2c6 |
rev | line source |
---|---|
103 | 1 #define GAIM_PLUGINS |
2 #include "gaim.h" | |
3 | |
4 #include <string.h> | |
5 #include <ctype.h> | |
6 #include <stdlib.h> | |
7 | |
8 struct replace_words { | |
9 char *bad; | |
10 char *good; | |
11 }; | |
12 | |
13 GList *words = NULL; | |
14 | |
15 int num_words(char *); | |
16 int get_word(char *, int); | |
17 char *have_word(char *, int); | |
18 void substitute(char **, int, int, char *); | |
19 | |
20 void spell_check(char *who, char **message, void *m) { | |
21 int i, l; | |
22 int word; | |
23 GList *w; | |
24 char *tmp; | |
25 | |
26 if (message == NULL || *message == NULL) | |
27 return; | |
28 | |
29 l = num_words(*message); | |
30 for (i = 0; i < l; i++) { | |
31 word = get_word(*message, i); | |
32 w = words; | |
33 while (w) { | |
34 struct replace_words *r; | |
35 r = (struct replace_words *)(w->data); | |
36 tmp = have_word(*message, word); | |
37 if (!strcmp(have_word(*message, word), r->bad)) | |
38 substitute(message, word, strlen(r->bad), | |
39 r->good); | |
40 free(tmp); | |
41 w = w->next; | |
42 } | |
43 } | |
44 } | |
45 | |
46 void gaim_plugin_init(void *handle) { | |
47 struct replace_words *p; | |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
48 FILE *file; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
49 char buffer[256]; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
50 char *good; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
51 char *bad; |
103 | 52 |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
53 sprintf(buffer, "%s/.gaim/dict", getenv("HOME")); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
54 file = fopen(buffer, "r"); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
55 while (fgets(buffer, sizeof buffer, file)) { |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
56 buffer[strlen(buffer) - 1] = 0; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
57 p = malloc(sizeof *p); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
58 good = strdup(strpbrk(strpbrk(buffer, " \t\r\f\n"), |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
59 "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM")); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
60 bad = strpbrk(buffer, " \t\r\f\n"); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
61 bad[0] = 0; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
62 bad = strdup(buffer); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
63 p->bad = bad; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
64 p->good = good; |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
65 words = g_list_append(words, p); |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
66 } |
103 | 67 |
68 gaim_signal_connect(handle, event_im_send, spell_check, NULL); | |
69 } | |
70 | |
71 char *name() { | |
72 return "IM Spell Check"; | |
73 } | |
74 | |
75 char *description() { | |
76 return "Watches outgoing IM text and corrects common spelling errors."; | |
77 } | |
78 | |
79 int num_words(char *m) { | |
80 int count = 0; | |
81 int pos; | |
82 int state = 0; | |
83 | |
84 for (pos = 0; pos < strlen(m); pos++) { | |
85 switch (state) { | |
86 case 0: /* expecting word */ | |
87 if (isalnum(m[pos])) { | |
88 count++; | |
89 state = 1; | |
90 } else if (m[pos] == '<') | |
91 state = 2; | |
92 break; | |
93 case 1: /* inside word */ | |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
94 if (isspace(m[pos]) || m[pos] == '\'' || m[pos] == '.') |
103 | 95 state = 0; |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
96 else if (m[pos] == '<') |
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
97 state = 2; |
103 | 98 break; |
99 case 2: /* inside HTML tag */ | |
100 if (m[pos] == '>') | |
101 state = 0; | |
102 break; | |
103 } | |
104 } | |
105 return count; | |
106 } | |
107 | |
108 int get_word(char *m, int word) { | |
109 int count = 0; | |
110 int pos = 0; | |
111 int state = 0; | |
112 | |
113 for (pos = 0; pos < strlen(m) && count <= word; pos++) { | |
114 switch (state) { | |
115 case 0: | |
116 if (isalnum(m[pos])) { | |
117 count++; | |
118 state = 1; | |
119 } else if (m[pos] == '<') | |
120 state = 2; | |
121 break; | |
122 case 1: | |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
123 if (isspace(m[pos]) || m[pos] == '\'' || m[pos] == '.') |
103 | 124 state = 0; |
125 break; | |
126 case 2: | |
127 if (m[pos] == '>') | |
128 state = 0; | |
129 break; | |
130 } | |
131 } | |
132 return pos - 1; | |
133 } | |
134 | |
135 char *have_word(char *m, int pos) { | |
106
e05e6373ea5a
[gaim-migrate @ 116]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
103
diff
changeset
|
136 char *tmp = strpbrk(&m[pos], "' \t\f\r\n."); |
103 | 137 int len = (int)(tmp - &m[pos]); |
138 | |
139 if (tmp == NULL) { | |
140 tmp = strdup(&m[pos]); | |
141 return tmp; | |
142 } | |
143 | |
144 tmp = malloc(len + 1); | |
145 tmp[0] = 0; | |
146 strncat(tmp, &m[pos], len); | |
147 | |
148 return tmp; | |
149 } | |
150 | |
151 void substitute(char **mes, int pos, int m, char *text) { | |
152 char *new = malloc(strlen(*mes) + strlen(text) + 1); | |
153 char *tmp; | |
154 new[0] = 0; | |
155 | |
156 strncat(new, *mes, pos); | |
157 strcat(new, text); | |
158 | |
159 strcat(new, &(*mes)[pos + m]); | |
160 tmp = *mes; | |
161 *mes = new; | |
162 free(tmp); | |
163 } |