Mercurial > pidgin
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 } |
