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.
@@ -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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mkmf'
3
+ $CFLAGS << " -Wall -Ofast"
4
+
5
+ create_makefile 'levenshtein'
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ require "string_dot_levenshtein/version"
2
+ require 'levenshtein'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StringDotLevenshtein
4
+ VERSION = "0.1.0"
5
+ end
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: []