| OLD | NEW |
| (Empty) |
| 1 #include "license.hunspell" | |
| 2 #include "license.myspell" | |
| 3 | |
| 4 #include <stdlib.h> | |
| 5 #include <string.h> | |
| 6 #include <stdio.h> | |
| 7 | |
| 8 #include "replist.hxx" | |
| 9 #include "csutil.hxx" | |
| 10 | |
| 11 RepList::RepList(int n) { | |
| 12 dat = (replentry **) malloc(sizeof(replentry *) * n); | |
| 13 if (dat == 0) size = 0; else size = n; | |
| 14 pos = 0; | |
| 15 } | |
| 16 | |
| 17 RepList::~RepList() | |
| 18 { | |
| 19 for (int i = 0; i < pos; i++) { | |
| 20 free(dat[i]->pattern); | |
| 21 free(dat[i]->pattern2); | |
| 22 free(dat[i]); | |
| 23 } | |
| 24 free(dat); | |
| 25 } | |
| 26 | |
| 27 int RepList::get_pos() { | |
| 28 return pos; | |
| 29 } | |
| 30 | |
| 31 replentry * RepList::item(int n) { | |
| 32 return dat[n]; | |
| 33 } | |
| 34 | |
| 35 int RepList::near(const char * word) { | |
| 36 int p1 = 0; | |
| 37 int p2 = pos; | |
| 38 while ((p2 - p1) > 1) { | |
| 39 int m = (p1 + p2) / 2; | |
| 40 int c = strcmp(word, dat[m]->pattern); | |
| 41 if (c <= 0) { | |
| 42 if (c < 0) p2 = m; else p1 = p2 = m; | |
| 43 } else p1 = m; | |
| 44 } | |
| 45 return p1; | |
| 46 } | |
| 47 | |
| 48 int RepList::match(const char * word, int n) { | |
| 49 if (strncmp(word, dat[n]->pattern, strlen(dat[n]->pattern)) == 0) return str
len(dat[n]->pattern); | |
| 50 return 0; | |
| 51 } | |
| 52 | |
| 53 int RepList::add(char * pat1, char * pat2) { | |
| 54 if (pos >= size || pat1 == NULL || pat2 == NULL) return 1; | |
| 55 replentry * r = (replentry *) malloc(sizeof(replentry)); | |
| 56 if (r == NULL) return 1; | |
| 57 r->pattern = mystrrep(pat1, "_", " "); | |
| 58 r->pattern2 = mystrrep(pat2, "_", " "); | |
| 59 r->start = false; | |
| 60 r->end = false; | |
| 61 dat[pos++] = r; | |
| 62 for (int i = pos - 1; i > 0; i--) { | |
| 63 r = dat[i]; | |
| 64 if (strcmp(r->pattern, dat[i - 1]->pattern) < 0) { | |
| 65 dat[i] = dat[i - 1]; | |
| 66 dat[i - 1] = r; | |
| 67 } else break; | |
| 68 } | |
| 69 return 0; | |
| 70 } | |
| 71 | |
| 72 int RepList::conv(const char * word, char * dest) { | |
| 73 int stl = 0; | |
| 74 int change = 0; | |
| 75 for (size_t i = 0; i < strlen(word); i++) { | |
| 76 int n = near(word + i); | |
| 77 int l = match(word + i, n); | |
| 78 if (l) { | |
| 79 strcpy(dest + stl, dat[n]->pattern2); | |
| 80 stl += strlen(dat[n]->pattern2); | |
| 81 i += l - 1; | |
| 82 change = 1; | |
| 83 } else dest[stl++] = word[i]; | |
| 84 } | |
| 85 dest[stl] = '\0'; | |
| 86 return change; | |
| 87 } | |
| OLD | NEW |