22package kiwi
33
44/*
5- #cgo LDFLAGS: -l kiwi
5+ #cgo CFLAGS: -I/usr/local/include
6+ #cgo LDFLAGS: -Wl,-rpath,/usr/local/lib
7+
68#include <stdlib.h>
79#include <string.h>
810#include <stdint.h> // for uintptr_t
@@ -14,6 +16,7 @@ extern int KiwiReaderBridge(int lineNumber, char *buffer, void *userData);
1416import "C"
1517
1618import (
19+ "fmt"
1720 "io"
1821 "runtime/cgo"
1922 "unsafe"
@@ -91,17 +94,36 @@ type TokenResult struct {
9194
9295// Analyze returns the result of the analysis.
9396func (k * Kiwi ) Analyze (text string , topN int , options AnalyzeOption ) ([]TokenResult , error ) {
94- kiwiResH := C .kiwi_analyze (k .handler , C .CString (text ), C .int (topN ), C .int (options ))
97+ var (
98+ blocklist C.kiwi_morphset_h
99+ pretokenized C.kiwi_pretokenized_h
100+ cText = C .CString (text )
101+ )
102+
103+ defer C .free (unsafe .Pointer (cText ))
95104
105+ kiwiResH := C .kiwi_analyze (k .handler , cText , C .int (topN ), C .int (options ), blocklist , pretokenized )
106+ if kiwiResH == nil {
107+ return nil , fmt .Errorf ("failed to analyze text" )
108+ }
96109 defer C .kiwi_res_close (kiwiResH )
97110
98111 resSize := int (C .kiwi_res_size (kiwiResH ))
112+ if resSize < 0 {
113+ return nil , fmt .Errorf ("invalid result size: %d" , resSize )
114+ }
115+
99116 res := make ([]TokenResult , resSize )
100117
101118 for i := 0 ; i < resSize ; i ++ {
102- tokens := make ([]TokenInfo , int (C .kiwi_res_word_num (kiwiResH , C .int (i ))))
119+ wordNum := int (C .kiwi_res_word_num (kiwiResH , C .int (i )))
120+ if wordNum < 0 {
121+ return nil , fmt .Errorf ("invalid word number: %d" , wordNum )
122+ }
103123
104- for j := 0 ; j < len (tokens ); j ++ {
124+ tokens := make ([]TokenInfo , wordNum )
125+
126+ for j := 0 ; j < wordNum ; j ++ {
105127 pos , err := ParsePOSType (C .GoString (C .kiwi_res_tag (kiwiResH , C .int (i ), C .int (j ))))
106128 if err != nil {
107129 return nil , err
@@ -131,15 +153,30 @@ type SplitResult struct {
131153
132154// SplitSentence returns the line of sentences.
133155func (k * Kiwi ) SplitSentence (text string , options AnalyzeOption ) ([]SplitResult , error ) {
134- kiwiSsH := C .kiwi_split_into_sents (k .handler , C .CString (text ), C .int (options ), nil )
156+ var cText = C .CString (text )
157+ defer C .free (unsafe .Pointer (cText ))
158+
159+ kiwiSsH := C .kiwi_split_into_sents (k .handler , cText , C .int (options ), nil )
160+ if kiwiSsH == nil {
161+ return nil , fmt .Errorf ("failed to split sentences" )
162+ }
135163 defer C .kiwi_ss_close (kiwiSsH )
136164
137165 resSize := int (C .kiwi_ss_size (kiwiSsH ))
166+ if resSize < 0 {
167+ return nil , fmt .Errorf ("invalid result size: %d" , resSize )
168+ }
169+
138170 res := make ([]SplitResult , resSize )
139171
140172 for i := 0 ; i < resSize ; i ++ {
141173 begin := int (C .kiwi_ss_begin_position (kiwiSsH , C .int (i )))
142174 end := int (C .kiwi_ss_end_position (kiwiSsH , C .int (i )))
175+
176+ if begin < 0 || end < begin || end > len (text ) {
177+ return nil , fmt .Errorf ("invalid position range: begin=%d, end=%d" , begin , end )
178+ }
179+
143180 res [i ] = SplitResult {
144181 Text : text [begin :end ],
145182 Begin : begin ,
@@ -188,7 +225,12 @@ func (kb *KiwiBuilder) LoadDict(dictPath string) int {
188225
189226// Build creates kiwi instance with user word etc.
190227func (kb * KiwiBuilder ) Build () * Kiwi {
191- h := C .kiwi_builder_build (kb .handler )
228+ var (
229+ typos C.kiwi_typo_h
230+ typoCostThreshold = C .float (1.0 )
231+ )
232+
233+ h := C .kiwi_builder_build (kb .handler , typos , typoCostThreshold )
192234 defer kb .Close ()
193235 return & Kiwi {
194236 handler : h ,
0 commit comments