@@ -8,6 +8,7 @@ include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
8
8
use icu_segmenter:: WordSegmenter ;
9
9
#[ cfg( all( not( feature = "windows" ) , feature = "icu_segmenter" ) ) ]
10
10
use itertools:: Itertools ;
11
+ use std:: ffi:: CStr ;
11
12
use std:: os:: raw;
12
13
use std:: ptr;
13
14
#[ cfg( feature = "windows" ) ]
@@ -36,11 +37,11 @@ pub static plugin_is_GPL_compatible: libc::c_int = 1;
36
37
#[ unsafe( no_mangle) ]
37
38
pub unsafe extern "C" fn emacs_module_init ( runtime : * mut emacs_runtime ) -> libc:: c_int {
38
39
unsafe {
39
- let env = ( * runtime) . get_environment . unwrap ( ) ( runtime) ;
40
+ let env = ( * runtime) . get_environment . unwrap_unchecked ( ) ( runtime) ;
40
41
41
- let intern = ( * env) . intern . unwrap ( ) ;
42
- let funcall = ( * env) . funcall . unwrap ( ) ;
43
- let make_function = ( * env) . make_function . unwrap ( ) ;
42
+ let intern = ( * env) . intern . unwrap_unchecked ( ) ;
43
+ let funcall = ( * env) . funcall . unwrap_unchecked ( ) ;
44
+ let make_function = ( * env) . make_function . unwrap_unchecked ( ) ;
44
45
45
46
let Qfset = intern ( env, c"fset" . as_ptr ( ) ) ;
46
47
@@ -89,10 +90,10 @@ unsafe extern "C" fn Femt__do_split_helper(
89
90
data : * mut raw:: c_void ,
90
91
) -> emacs_value {
91
92
unsafe {
92
- let intern = ( * env) . intern . unwrap ( ) ;
93
- let funcall = ( * env) . funcall . unwrap ( ) ;
94
- let make_integer = ( * env) . make_integer . unwrap ( ) ;
95
- let copy_string_contents = ( * env) . copy_string_contents . unwrap ( ) ;
93
+ let intern = ( * env) . intern . unwrap_unchecked ( ) ;
94
+ let funcall = ( * env) . funcall . unwrap_unchecked ( ) ;
95
+ let make_integer = ( * env) . make_integer . unwrap_unchecked ( ) ;
96
+ let copy_string_contents = ( * env) . copy_string_contents . unwrap_unchecked ( ) ;
96
97
97
98
let Qcons = intern ( env, c"cons" . as_ptr ( ) ) ;
98
99
let Qvector = intern ( env, c"vector" . as_ptr ( ) ) ;
@@ -103,9 +104,10 @@ unsafe extern "C" fn Femt__do_split_helper(
103
104
let is_ok =
104
105
copy_string_contents ( env, * args, buf. as_mut_ptr ( ) as * mut raw:: c_char , & mut len) ;
105
106
106
- strip_trailing_zero_bytes ( & mut buf) ;
107
+ let param_u8 =
108
+ std:: str:: from_utf8_unchecked ( CStr :: from_bytes_with_nul_unchecked ( & buf) . to_bytes ( ) ) ;
109
+ // let param_u8 = CStr::from_bytes_with_nul(&buf).unwrap().to_str().unwrap();
107
110
108
- let param_u8 = String :: from_utf8 ( buf) . unwrap ( ) ;
109
111
#[ cfg( feature = "windows" ) ]
110
112
let mut consCell = {
111
113
let param_hstring = HSTRING :: from ( param_u8) ;
@@ -123,7 +125,7 @@ unsafe extern "C" fn Femt__do_split_helper(
123
125
let mut consCell = {
124
126
let segmenter_icu = WordSegmenter :: new_auto ( ) ;
125
127
let segments = segmenter_icu
126
- . segment_str ( & param_u8)
128
+ . segment_str ( param_u8)
127
129
. tuple_windows ( )
128
130
. map ( |( i, j) | & param_u8[ i..j] ) ;
129
131
let ss = segments. map ( |s| s. chars ( ) . count ( ) ) ;
@@ -156,11 +158,11 @@ unsafe extern "C" fn Femt__word_at_point_or_forward(
156
158
data : * mut raw:: c_void ,
157
159
) -> emacs_value {
158
160
unsafe {
159
- let intern = ( * env) . intern . unwrap ( ) ;
160
- let funcall = ( * env) . funcall . unwrap ( ) ;
161
- let make_integer = ( * env) . make_integer . unwrap ( ) ;
162
- let extract_integer = ( * env) . extract_integer . unwrap ( ) ;
163
- let copy_string_contents = ( * env) . copy_string_contents . unwrap ( ) ;
161
+ let intern = ( * env) . intern . unwrap_unchecked ( ) ;
162
+ let funcall = ( * env) . funcall . unwrap_unchecked ( ) ;
163
+ let make_integer = ( * env) . make_integer . unwrap_unchecked ( ) ;
164
+ let extract_integer = ( * env) . extract_integer . unwrap_unchecked ( ) ;
165
+ let copy_string_contents = ( * env) . copy_string_contents . unwrap_unchecked ( ) ;
164
166
165
167
let Qcons = intern ( env, c"cons" . as_ptr ( ) ) ;
166
168
@@ -170,11 +172,12 @@ unsafe extern "C" fn Femt__word_at_point_or_forward(
170
172
let is_ok =
171
173
copy_string_contents ( env, * args, buf. as_mut_ptr ( ) as * mut raw:: c_char , & mut len) ;
172
174
173
- strip_trailing_zero_bytes ( & mut buf) ;
175
+ let param_u8 =
176
+ std:: str:: from_utf8_unchecked ( CStr :: from_bytes_with_nul_unchecked ( & buf) . to_bytes ( ) ) ;
177
+ // let param_u8 = CStr::from_bytes_with_nul(&buf).unwrap().to_str().unwrap();
174
178
175
179
let n = extract_integer ( env, * args. offset ( 1 ) ) ;
176
180
177
- let param_u8 = String :: from_utf8 ( buf) . unwrap ( ) ;
178
181
#[ cfg( feature = "windows" ) ]
179
182
let ( l, r) = {
180
183
let param_hstring = HSTRING :: from ( param_u8) ;
@@ -192,7 +195,7 @@ unsafe extern "C" fn Femt__word_at_point_or_forward(
192
195
// Sadly WordSegmenter does not provide a way to get the nth token
193
196
let segmenter_icu = WordSegmenter :: new_auto ( ) ;
194
197
let segments = segmenter_icu
195
- . segment_str ( & param_u8)
198
+ . segment_str ( param_u8)
196
199
. tuple_windows ( )
197
200
. map ( |( i, j) | & param_u8[ i..j] ) ;
198
201
let mut ss = segments. map ( |s| s. chars ( ) . count ( ) ) ;
@@ -223,13 +226,3 @@ unsafe extern "C" fn Femt__word_at_point_or_forward(
223
226
funcall ( env, Qcons , 2 , [ l, r] . as_mut_ptr ( ) )
224
227
}
225
228
}
226
-
227
- // Thank you,
228
- // https://github.com/ubolonton/emacs-module-rs/blob/126241a79d171e8de43c7db248b277fac7f1a4e8/src/types/string.rs#L103C1-L109C2
229
- fn strip_trailing_zero_bytes ( bytes : & mut Vec < u8 > ) {
230
- let mut len = bytes. len ( ) ;
231
- while len > 0 && bytes[ len - 1 ] == 0 {
232
- bytes. pop ( ) ; // strip trailing 0-byte(s)
233
- len -= 1 ;
234
- }
235
- }
0 commit comments