Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: src/hunspell/suggestmgr.cxx

Issue 12328121: Use up to 8 affixes in Hunspell spellcheck suggestions (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/hunspell.git@master
Patch Set: Address comments Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « google.patch ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "license.hunspell" 1 #include "license.hunspell"
2 #include "license.myspell" 2 #include "license.myspell"
3 3
4 #include <stdlib.h> 4 #include <stdlib.h>
5 #include <string.h> 5 #include <string.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <ctype.h> 7 #include <ctype.h>
8 8
9 #include "suggestmgr.hxx" 9 #include "suggestmgr.hxx"
10 #include "htypes.hxx" 10 #include "htypes.hxx"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 hentry* CreateScopedHashEntry(int index, const hentry* source); 47 hentry* CreateScopedHashEntry(int index, const hentry* source);
48 48
49 private: 49 private:
50 // A struct which encapsulates the new hentry struct introduced in hunspell 50 // A struct which encapsulates the new hentry struct introduced in hunspell
51 // 1.2.8. For a pointer to an hentry struct 'h', hunspell 1.2.8 stores a word 51 // 1.2.8. For a pointer to an hentry struct 'h', hunspell 1.2.8 stores a word
52 // (including a NUL character) into 'h->word[0]',...,'h->word[h->blen]' even 52 // (including a NUL character) into 'h->word[0]',...,'h->word[h->blen]' even
53 // though arraysize(h->word[]) is 1. Also, it changed 'astr' to a pointer so 53 // though arraysize(h->word[]) is 1. Also, it changed 'astr' to a pointer so
54 // it can store affix flags into 'h->astr[0]',...,'h->astr[alen-1]'. To handle 54 // it can store affix flags into 'h->astr[0]',...,'h->astr[alen-1]'. To handle
55 // this new hentry struct, we define a struct which combines three values: an 55 // this new hentry struct, we define a struct which combines three values: an
56 // hentry struct 'hentry'; a char array 'word[kMaxWordLen]', and; an unsigned 56 // hentry struct 'hentry'; a char array 'word[kMaxWordLen]', and; an unsigned
57 // short value 'astr' so a hentry struct 'h' returned from 57 // short array 'astr' so a hentry struct 'h' returned from
58 // CreateScopedHashEntry() satisfies the following equations: 58 // CreateScopedHashEntry() satisfies the following equations:
59 // hentry* h = factory.CreateScopedHashEntry(0, source); 59 // hentry* h = factory.CreateScopedHashEntry(0, source);
60 // h->word[0] == ((HashEntryItem*)h)->entry.word[0]. 60 // h->word[0] == ((HashEntryItem*)h)->entry.word[0].
61 // h->word[1] == ((HashEntryItem*)h)->word[0]. 61 // h->word[1] == ((HashEntryItem*)h)->word[0].
62 // ... 62 // ...
63 // h->word[h->blen] == ((HashEntryItem*)h)->word[h->blen-1]. 63 // h->word[h->blen] == ((HashEntryItem*)h)->word[h->blen-1].
64 // h->astr[0] == ((HashEntryItem*)h)->astr. 64 // h->astr[0] == ((HashEntryItem*)h)->astr[0].
65 // Our BDICT does not use affix flags longer than one for now since they are 65 // h->astr[1] == ((HashEntryItem*)h)->astr[1].
66 // discarded by convert_dict, i.e. 'h->astr' is always <= 1. Therefore, this 66 // ...
67 // struct does not use an array for 'astr'. 67 // h->astr[h->alen-1] == ((HashEntryItem*)h)->astr[h->alen-1].
68 enum { 68 enum {
69 kMaxWordLen = 128, 69 kMaxWordLen = 128,
70 kMaxAffixLen = 8,
70 }; 71 };
71 struct HashEntryItem { 72 struct HashEntryItem {
72 hentry entry; 73 hentry entry;
73 char word[kMaxWordLen]; 74 char word[kMaxWordLen];
74 unsigned short astr; 75 unsigned short astr[kMaxAffixLen];
75 }; 76 };
76 77
77 HashEntryItem hash_items_[MAX_ROOTS]; 78 HashEntryItem hash_items_[MAX_ROOTS];
78 }; 79 };
79 80
80 ScopedHashEntryFactory::ScopedHashEntryFactory() { 81 ScopedHashEntryFactory::ScopedHashEntryFactory() {
81 memset(&hash_items_[0], 0, sizeof(hash_items_)); 82 memset(&hash_items_[0], 0, sizeof(hash_items_));
82 } 83 }
83 84
84 ScopedHashEntryFactory::~ScopedHashEntryFactory() { 85 ScopedHashEntryFactory::~ScopedHashEntryFactory() {
85 } 86 }
86 87
87 hentry* ScopedHashEntryFactory::CreateScopedHashEntry(int index, 88 hentry* ScopedHashEntryFactory::CreateScopedHashEntry(int index,
88 const hentry* source) { 89 const hentry* source) {
89 if (index >= MAX_ROOTS || source->blen >= kMaxWordLen || source->alen > 1) 90 if (index >= MAX_ROOTS || source->blen >= kMaxWordLen)
90 return NULL; 91 return NULL;
91 92
92 // Retrieve a HashEntryItem struct from our spool, initialize it, and 93 // Retrieve a HashEntryItem struct from our spool, initialize it, and
93 // returns the address of its 'hentry' member. 94 // returns the address of its 'hentry' member.
94 size_t source_size = sizeof(hentry) + source->blen + 1; 95 size_t source_size = sizeof(hentry) + source->blen + 1;
95 HashEntryItem* hash_item = &hash_items_[index]; 96 HashEntryItem* hash_item = &hash_items_[index];
96 memcpy(&hash_item->entry, source, source_size); 97 memcpy(&hash_item->entry, source, source_size);
97 if (source->astr) { 98 if (source->astr) {
98 hash_item->astr = *source->astr; 99 hash_item->entry.alen = source->alen;
99 hash_item->entry.astr = &hash_item->astr; 100 if (hash_item->entry.alen > kMaxAffixLen)
101 hash_item->entry.alen = kMaxAffixLen;
102 memcpy(hash_item->astr, source->astr, hash_item->entry.alen * sizeof(hash_it em->astr[0]));
103 hash_item->entry.astr = &hash_item->astr[0];
100 } 104 }
101 return &hash_item->entry; 105 return &hash_item->entry;
102 } 106 }
103 107
104 } // namespace 108 } // namespace
105 #endif 109 #endif
106 110
107 111
108 #ifdef HUNSPELL_CHROME_CLIENT 112 #ifdef HUNSPELL_CHROME_CLIENT
109 SuggestMgr::SuggestMgr(hunspell::BDictReader* reader, 113 SuggestMgr::SuggestMgr(hunspell::BDictReader* reader,
(...skipping 2041 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 len++; 2155 len++;
2152 i--; 2156 i--;
2153 j--; 2157 j--;
2154 } else if (result[i*(n+1) + j] == LCS_UP) { 2158 } else if (result[i*(n+1) + j] == LCS_UP) {
2155 i--; 2159 i--;
2156 } else j--; 2160 } else j--;
2157 } 2161 }
2158 free(result); 2162 free(result);
2159 return len; 2163 return len;
2160 } 2164 }
OLDNEW
« no previous file with comments | « google.patch ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698