string_dot_levenshtein 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/extconf.rb +5 -0
- data/ext/levenshtein.c +58 -0
- data/lib/string_dot_levenshtein.rb +2 -0
- data/lib/string_dot_levenshtein/version.rb +5 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ebf492bfc439da80775756a8c32d9dc50d546248a2859e651f74c0d024ca2c0b
|
4
|
+
data.tar.gz: f111154a86488819a0b58ff0b7a3d8b46815d3667bcd4ef7cb6eb192a5e2859c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10ab844295dab8863872ada520dabd16a9bf0adb863259186ec4e1008b6fb237c3ebd2ffa9e5cf87ad723181d95e47cecf43912ac5b8f58384fba42008aee502
|
7
|
+
data.tar.gz: 72792ae436b0dd8f33e853000765baa5014ec57fcf683f0d3920f5f8ab603d136ce844fc260a2a58fe1014ee7697a85ec0e07e6c62daa47ce60d6694d030dd30
|
data/ext/extconf.rb
ADDED
data/ext/levenshtein.c
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#include <string.h>
|
2
|
+
#include <inttypes.h>
|
3
|
+
#include "ruby.h"
|
4
|
+
|
5
|
+
VALUE levenshtein(VALUE obj, VALUE arg) {
|
6
|
+
char *a = StringValuePtr(obj), *b = StringValuePtr(arg) ;
|
7
|
+
char b_i_1 ;
|
8
|
+
|
9
|
+
if (strcmp(a, b) == 0) return INT2FIX(0) ;
|
10
|
+
if (strcmp(a, "") == 0) return INT2FIX(strlen(b)) ;
|
11
|
+
if (strcmp(b, "") == 0) return INT2FIX(strlen(a)) ;
|
12
|
+
|
13
|
+
uint64_t a_len = strlen(a) + 1 ;
|
14
|
+
uint64_t b_len = strlen(b) + 1 ;
|
15
|
+
|
16
|
+
if (a_len > 4096 || b_len > 4096)
|
17
|
+
rb_raise(rb_eRuntimeError, "More than 4096 characters were given") ;
|
18
|
+
|
19
|
+
uint16_t ary[b_len][a_len], *ary_i, *ary_i_1 ;
|
20
|
+
uint16_t i, i_1 ;
|
21
|
+
uint16_t j, j_1 ;
|
22
|
+
uint16_t diag, up, left, min ;
|
23
|
+
|
24
|
+
for(i = 0 ; i < a_len ; ++i) ary[0][i] = i ;
|
25
|
+
for(i = 0 ; i < b_len ; ++i) ary[i][0] = i ;
|
26
|
+
|
27
|
+
for(i = 1 ; i < b_len ; ++i) {
|
28
|
+
i_1 = i - 1 ;
|
29
|
+
ary_i = ary[i] ;
|
30
|
+
ary_i_1 = ary[i_1] ;
|
31
|
+
b_i_1 = b[i_1] ;
|
32
|
+
|
33
|
+
for(j = 1 ; j < a_len ; ++j) {
|
34
|
+
j_1 = j - 1 ;
|
35
|
+
diag = ary_i_1[j_1] ;
|
36
|
+
|
37
|
+
if (a[j_1] == b_i_1) {
|
38
|
+
ary_i[j] = diag ;
|
39
|
+
} else {
|
40
|
+
up = ary_i_1[j] ;
|
41
|
+
left = ary_i[j_1] ;
|
42
|
+
|
43
|
+
min = diag ;
|
44
|
+
if (up < diag) min = up ;
|
45
|
+
if (left < diag) min = left ;
|
46
|
+
|
47
|
+
ary_i[j] = min + 1 ;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
return INT2FIX(ary[b_len - 1][a_len - 1]) ;
|
53
|
+
}
|
54
|
+
|
55
|
+
void Init_levenshtein() {
|
56
|
+
VALUE _rb_string = rb_define_class("String", rb_cObject) ;
|
57
|
+
rb_define_method(_rb_string, "levenshtein", levenshtein, 1) ;
|
58
|
+
}
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: string_dot_levenshtein
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sourav Goswami
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: An efficient Wagner Fischer levenshtein edit distance calculation in
|
14
|
+
C Ruby
|
15
|
+
email:
|
16
|
+
- souravgoswami@protonmail.com
|
17
|
+
executables: []
|
18
|
+
extensions:
|
19
|
+
- ext/extconf.rb
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- ext/extconf.rb
|
23
|
+
- ext/levenshtein.c
|
24
|
+
- lib/string_dot_levenshtein.rb
|
25
|
+
- lib/string_dot_levenshtein/version.rb
|
26
|
+
homepage: https://github.com/Souravgoswami/string_dot_levenshtein
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 2.5.0
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubygems_version: 3.1.4
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: An efficient Wagner Fischer levenshtein edit distance calculation in C Ruby
|
49
|
+
test_files: []
|