Skip to content

Commit 9ece114

Browse files
committed
Add comments to speller example
1 parent 8caeaf8 commit 9ece114

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

examples/speller.xml

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
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
}
@@ -41,17 +42,18 @@
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()
@@ -68,6 +70,8 @@
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

Comments
 (0)