2525<ServerOnly >1</ServerOnly >
2626<Implementation ><![CDATA[
2727 try {
28+ // Проверяем существование нужных файлы
2829 if (('$data(CNAPath)) || ('##class(%File).Exists(CNAPath))) {
2930 return $$$ERROR("CNA file doesn't exists")
3031 }
4142 return $$$ERROR(".dic file doesn't exists")
4243 }
4344
45+ // Создаем объекты класса CNA.CNA и загружаем туда библиотеки
4446 set ..CNA = ##class(CNA.CNA).%New(CNAPath)
4547 set ..LibC = ##class(CNA.CNA).%New(CNAPath)
46-
4748 do ..CNA.LoadLibrary(hunspellPath)
4849 do ..LibC.LoadLibrary(libcPath)
4950
51+ // Конвертируем строки в указатели, что бы передать их в CNA
5052 set aff = ..CNA.ConvertStringToPointer(affPath)
5153 set dic = ..CNA.ConvertStringToPointer(dicPath)
5254
55+ // Создаем объект hunspell, передаем туда файлы словарей
5356 set argTypes = $lb(..CNA.#POINTER, ..CNA.#POINTER)
54-
5557 set ..Hunspell = ..CNA.CallFunction("Hunspell_create", ..CNA.#POINTER, argTypes, aff, dic)
5658 } catch ex {
5759 do ex.Log()
6870<ServerOnly >1</ServerOnly >
6971<Implementation ><![CDATA[
7072 try {
73+
74+ // Удаляем объект hunspell и выгружаем бибилиотеки
7175 set argTypes = $lb(..CNA.#POINTER)
7276 do ..CNA.CallFunction("Hunspell_destroy", ..CNA.#VOID, argTypes, ..Hunspell)
7377 do ..CNA.FreeLibrary()
@@ -86,6 +90,11 @@ True - correct word, false - incorrect word</Description>
8690<FormalSpec >word:%String</FormalSpec >
8791<ReturnType >%Boolean</ReturnType >
8892<Implementation ><![CDATA[
93+
94+ // Вызываем функцию проверки слова
95+ // Прототип - int Hunspell_spell(Hunhandle *pHunspell, const char *);
96+ // Передаем в качестве аргументов указатель на объект hunspell и указатель на проверяемую строку
97+
8998 set pWord = ..CNA.ConvertStringToPointer(word)
9099 set argTypes = $lb(..CNA.#POINTER, ..CNA.#POINTER)
91100 set res = ..CNA.CallFunction("Hunspell_spell", ..CNA.#INT, argTypes, ..Hunspell, pWord)
@@ -99,23 +108,33 @@ True - correct word, false - incorrect word</Description>
99108<Implementation ><![CDATA[
100109 set pWord = ..CNA.ConvertStringToPointer(word)
101110
111+ // Выделяем память под буфер, куда будем записывать варианты
102112 set argTypes = $lb(..CNA.#SIZET)
103113 set pArray = ..LibC.CallFunction("malloc", ..LibC.#POINTER, argTypes, 8)
104114
115+
116+ // Вызываем функцию Hunspell_suggest, которая предлагает варианты правильного написания
117+ // Прототип - int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word);
118+ // slst - указатель на переменную типа char **, куда Hunspell запишет массив строк с предложениям написания
119+ // Функция возвращает общее число предложений
120+
105121 set argTypes = $lb(..CNA.#POINTER, ..CNA.#POINTER, ..CNA.#POINTER)
106122 set numberOfSuggestions = ..CNA.CallFunction("Hunspell_suggest", ..CNA.#INT, argTypes, ..Hunspell, pArray, pWord)
107123
108124 set suggestions = ""
125+
126+ // Разыменовавыаем указатель - получаем массив строк
109127 set array = ..CNA.PointerGetAt(pArray, ..CNA.#POINTER, 0)
110128
129+ // Проходим по всему массиву и конвертируем массив строк C в список из строк Cache
111130 for i=1:1:numberOfSuggestions {
112131 set elem = ..CNA.PointerGetAt(array, ..CNA.#POINTER, i - 1)
113132 set $li(suggestions, *+1) = ..CNA.ConvertPointerToString(elem)
114133 }
115134
135+ // Освобождаем выделенную память и возвращаем список предложений
116136 set argTypes = $lb(..CNA.#POINTER)
117137 do ..LibC.CallFunction("free", ..LibC.#VOID, argTypes, pArray)
118-
119138 return suggestions
120139]]> </Implementation >
121140</Method >
0 commit comments