UINT32 MeowPinyin::MakeTreeNode(UINT32 _parent, UINT8 * next, UINT8 length, UINT8 depth) { if (length <= 0 || depth <= 0) { return _parent; } if (*next >= 26) { return 0; } // warning: not thread safe, parent become N/A when tree_phrase changed MEOW_PHRASETREE_NODE * parent = &tree_phrase[_parent]; // children should not be 0 because 0 is root if (parent->children == 0) { MEOW_PHRASETREE_NODE cache; cache.children = 0; parent->children = tree_phrase.size(); for (unsigned int i = 0; i < 26; i++) { tree_phrase.push_back(cache); } parent = &tree_phrase[_parent]; } return MakeTreeNode(parent->children + *next, next + 1, length - 1, depth - 1); }
void MeowPinyin::LoadDictBasic() { { HANDLE hfile = CreateFile(L"X:\\Workspaces\\git\\meow\\Tools\\phrase.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DWORD size = GetFileSize(hfile, NULL); blob_phrase = HeapAlloc(GetProcessHeap(), NULL, size); DWORD tmp; ReadFile(hfile, blob_phrase, size, &tmp, NULL); if (tmp != size) { return; } WCHAR * offset = ((WCHAR *)blob_phrase + 1); DWORD length = size / 2 - 1; table_phrase.clear(); table_phrase.reserve(445494); unsigned int index = 0; for (unsigned int i = 0; i < length; i++) { if (offset[i] == L'\n') { offset[i] = L'\0'; MEOW_PHRASE_NODE mpn; mpn.length = i - index; mpn.phrase = offset + index; table_phrase.push_back(mpn); index = i + 1; } } //HeapFree(GetProcessHeap(), NULL, blob_phrase); CloseHandle(hfile); } MEOW_PHRASETREE_NODE root; root.children = 0; tree_phrase.reserve(311073); tree_phrase.push_back(root); UINT32 length = table_phrase.size(); for (unsigned int i = 0; i < length; i++) { UINT8 path[4] = { 0 }; for (unsigned int j = 0; j < 4; j++) { if (j < table_phrase[i].length) { path[j] = GetCharTreeID(table_phrase[i].phrase[j]); } else { break; } } UINT32 node = MakeTreeNode(0, path, table_phrase[i].length, 4); tree_phrase[node].phrases.push_back(i); } length = tree_phrase.size(); UINT32 max = 0; for (unsigned int i = 0; i < length; i++) { UINT32 tmp = tree_phrase[i].phrases.size(); if (tmp > max) { max = tmp; } } }