@@ -267,14 +267,19 @@ capabilities = ["FileSystem", "Environment", "Process", "Network"]
267267 }
268268}
269269
270- fn levenshtein ( a : & str , b : & str ) -> usize {
271- let mut cache = vec ! [ 0 ; b. len( ) + 1 ] ;
272- for ( i, val) in cache. iter_mut ( ) . enumerate ( ) {
270+ fn levenshtein ( a : & str , b : & str , cache : & mut [ usize ] ) -> usize {
271+ let b_len = b. len ( ) ;
272+
273+ // We only need bytes since commands are ascii
274+ let a_bytes = a. as_bytes ( ) ;
275+ let b_bytes = b. as_bytes ( ) ;
276+
277+ for ( i, val) in cache[ ..=b_len] . iter_mut ( ) . enumerate ( ) {
273278 * val = i;
274279 }
275- for ( i, ca) in a . chars ( ) . enumerate ( ) {
280+ for ( i, & ca) in a_bytes . iter ( ) . enumerate ( ) {
276281 let mut temp = i + 1 ;
277- for ( j, cb) in b . chars ( ) . enumerate ( ) {
282+ for ( j, & cb) in b_bytes . iter ( ) . enumerate ( ) {
278283 let next = if ca == cb {
279284 cache[ j]
280285 } else {
@@ -283,9 +288,9 @@ fn levenshtein(a: &str, b: &str) -> usize {
283288 cache[ j] = temp;
284289 temp = next;
285290 }
286- cache[ b . len ( ) ] = temp;
291+ cache[ b_len ] = temp;
287292 }
288- cache[ b . len ( ) ]
293+ cache[ b_len ]
289294}
290295
291296fn suggest_subcommand ( unknown : & str ) {
@@ -322,9 +327,10 @@ fn suggest_subcommand(unknown: &str) {
322327 "self" ,
323328 ] ;
324329
330+ let mut cache = [ 0 ; 32 ] ;
325331 let mut matches = Vec :: new ( ) ;
326332 for cmd in SUBCOMMANDS {
327- let dist = levenshtein ( unknown, cmd) ;
333+ let dist = levenshtein ( unknown, cmd, & mut cache ) ;
328334 if dist <= 3 {
329335 matches. push ( * cmd) ;
330336 }
0 commit comments